From 769d138c743d2cf109e7ae71ec4eb5e32afc7934 Mon Sep 17 00:00:00 2001 From: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:26:57 +0000 Subject: [PATCH] Bump the npm_and_yarn group across 1 directory with 1 update (#278) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * [Snyk] Upgrade @tanstack/react-query from 5.64.2 to 5.90.11 (#125) * fix: upgrade @tanstack/react-query from 5.64.2 to 5.90.11 Snyk has created this PR to upgrade @tanstack/react-query from 5.64.2 to 5.90.11. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * feat: upgrade vite from 5.4.21 to 7.2.4 (#124) Snyk has created this PR to upgrade vite from 5.4.21 to 7.2.4. See this package in npm: vite See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * feat: upgrade wagmi from 0.12.19 to 3.0.2 (#123) Snyk has created this PR to upgrade wagmi from 0.12.19 to 3.0.2. See this package in npm: wagmi See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * feat: upgrade react-dom from 18.3.1 to 19.2.0 (#122) Snyk has created this PR to upgrade react-dom from 18.3.1 to 19.2.0. See this package in npm: react-dom See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#136) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * [Snyk] Upgrade @types/react from 18.3.27 to 19.2.7 (#127) * feat: upgrade @types/react from 18.3.27 to 19.2.7 Snyk has created this PR to upgrade @types/react from 18.3.27 to 19.2.7. See this package in npm: @types/react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/main.tsx Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#116) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) (#135) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * feat: upgrade react from 18.3.1 to 19.2.0 (#121) Snyk has created this PR to upgrade react from 18.3.1 to 19.2.0. See this package in npm: react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * fix: extras/web/package.json to reduce vulnerabilities (#117) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> * Initial project structure and core packages Add initial monorepo structure for wagmi-project, including CLI, connectors, and core packages with source code, tests, configuration, and CI/CD workflows. This sets up the foundation for further development and collaboration. * sequence-core-1.0.0 * Revise README structure and add sponsorship details (#146) * Revise README structure and add sponsorship details Updated README to include new sections and sponsorship information. https://sequence.xyz/ Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update GitHub Actions workflow for tests (#149) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump the npm_and_yarn group across 4 directories with 7 updates (#144) Bumps the npm_and_yarn group with 4 updates in the /wagmi-project directory: [next](https://github.com/vercel/next.js), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk) and [nuxt](https://github.com/nuxt/nuxt/tree/HEAD/packages/nuxt). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/connectors directory: [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/create-wagmi/templates/next directory: [next](https://github.com/vercel/next.js). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/playgrounds/next directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `happy-dom` from 15.10.2 to 18.0.1 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v15.10.2...v18.0.1) Updates `vite` from 5.4.19 to 5.4.21 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `nuxt` from 3.16.0 to 3.19.0 - [Release notes](https://github.com/nuxt/nuxt/releases) - [Commits](https://github.com/nuxt/nuxt/commits/v3.19.0/packages/nuxt) Updates `@nuxt/devtools` from 2.4.1 to 2.7.0 - [Release notes](https://github.com/nuxt/devtools/releases) - [Changelog](https://github.com/nuxt/devtools/blob/main/CHANGELOG.md) - [Commits](https://github.com/nuxt/devtools/commits/v2.7.0/packages/devtools) Updates `devalue` from 5.1.1 to 5.6.1 - [Release notes](https://github.com/sveltejs/devalue/releases) - [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/devalue/compare/v5.1.1...v5.6.1) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `next` from 15.2.4 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 18.0.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 5.4.21 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: nuxt dependency-version: 3.19.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: "@nuxt/devtools" dependency-version: 2.7.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: devalue dependency-version: 5.6.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix Docker Hub credentials comment in config.yml (#148) Updated CircleCI config to reflect correct environment variable settings. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add workflow to publish package distributions (#152) * Add workflow to publish package distributions Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 107: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .github/workflows/Publish-Dists.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .github/workflows/Publish-Dists.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Remove permissions from pnpm-format-label workflow (#151) Removed permissions section from the workflow. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump happy-dom (#150) Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 18.0.1 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v18.0.1...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Anvil fork URL for testing workflow (#154) Build: Switch the Anvil fork URL in the GitHub Actions test workflow to a new mainnet RPC endpoint. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#157) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 - https://snyk.io/vuln/SNYK-JS-TMP-11501554 Co-authored-by: snyk-bot * Proto (#163) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> * Update CNAME to new domain (#164) sequence.app Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump the npm_and_yarn group across 2 directories with 4 updates (#161) Bumps the npm_and_yarn group with 1 update in the / directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /packages/0xsequence directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump happy-dom in the npm_and_yarn group across 1 directory (#167) Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 18.0.1 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v18.0.1...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Potential fix for code scanning alert no. 94: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 95: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Revise security policy for reporting vulnerabilities (#173) * Revise security policy for reporting vulnerabilities Updated contact information for vulnerability reporting. https://github.com/Dargon789/sequence.js/commit/e90b2e6395fb14c6463a02e88f65dc23ce455d6d Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * V2 (#174) * Updating DefaultGuest address * Update tests.yml (#51) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#52) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#55) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#56) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Corban Riley * Create web-sdk.yml (#175) https://github.com/Dargon789/Web3-Onboard/commit/fb66abf9ef6c55706a1dab2198db715f2588f1d1 https://github.com/Dargon789/web-sdk/commit/d26f62241ed85e6108a481f7a74ba7573c6c4c95 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Fix apple auth scope (#950) * Fix apple auth scope * Fix Apple auth scope test * 3.0.0-beta.7 * Update apple auth scope (#951) * 3.0.0-beta.8 * sequence-core-dapp-1.0.0 * Create nextjs.yml (#176) CI: Introduce a Next.js GitHub Actions workflow that detects the package manager, builds the app, caches Next.js artifacts, and deploys the static output to GitHub Pages. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 0xsequence-1.9.19 # 0xsequence-#1.9.19 * Update config.json (#185) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 108: Incomplete regular expression for hostnames (#186) * Potential fix for code scanning alert no. 108: Incomplete regular expression for hostnames Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/run.js Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * 0xsequence 1.9.19 (#179) * 1.9.17 * Update packages/0xsequence/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/account/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/auth/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/multicall/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/provider/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 1.9.19 * Update packages/waas/src/networks.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Squashed commit of the following: commit dafd2eda59d728355ab9028d03b0e10b014f2818 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:30:16 2026 +0700 Create nextjs.yml (#176) CI: Introduce a Next.js GitHub Actions workflow that detects the package manager, builds the app, caches Next.js artifacts, and deploys the static output to GitHub Pages. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit e6efe1f5b8e19fcd47714aa1417a9a01a16343a9 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:06:13 2026 +0700 sequence-core-dapp-1.0.0 commit cd4a860bbe5d27a96fd2a091cb6d074ff1c92331 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Jan 6 01:37:52 2026 +0700 Create web-sdk.yml (#175) https://github.com/Dargon789/Web3-Onboard/commit/fb66abf9ef6c55706a1dab2198db715f2588f1d1 https://github.com/Dargon789/web-sdk/commit/d26f62241ed85e6108a481f7a74ba7573c6c4c95 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit f2fd08bd5c463fc1c154c0fb26d8286bfcde01fa Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 01:11:33 2025 +0700 V2 (#174) * Updating DefaultGuest address * Update tests.yml (#51) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#52) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#55) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#56) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Corban Riley commit e7b277e79c7fe27c3cb129627d9f70e5bea9a25c Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 00:17:52 2025 +0700 Revise security policy for reporting vulnerabilities (#173) * Revise security policy for reporting vulnerabilities Updated contact information for vulnerability reporting. https://github.com/Dargon789/sequence.js/commit/e90b2e6395fb14c6463a02e88f65dc23ce455d6d Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 70208b1b85034bada6c5f8f858cc11bfd1a11241 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:50:23 2025 +0700 Potential fix for code scanning alert no. 95: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4c696d0e57d8ec45057b111bfb551ab497d0f93a Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:47:34 2025 +0700 Potential fix for code scanning alert no. 94: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit c62e5ddc2818a6b0624d63be3089c5ad7d08bd72 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:42:22 2025 +0700 Bump happy-dom in the npm_and_yarn group across 1 directory (#167) Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 18.0.1 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v18.0.1...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit e13fe5a71769b6d325b9cc3185c4a0519205f7b1 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:19:24 2025 +0700 Bump the npm_and_yarn group across 2 directories with 4 updates (#161) Bumps the npm_and_yarn group with 1 update in the / directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /packages/0xsequence directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b9d25688cb184f4b5ec1d0aba07bd36351efc65b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 15:35:25 2025 +0700 Update CNAME to new domain (#164) sequence.app Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4a81a2c4338191c93915c3101f3c24f0c468ae03 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 14:08:44 2025 +0700 Proto (#163) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> commit c4d0fdc33cd1ccf9cfc996b351959ae4d004a7e6 Merge: 7c547fcdd 269972a1d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 13:38:33 2025 +0700 Merge branch 'master' of https://github.com/Dargon789/sequence.js commit 269972a1dad423f67c0262149e46e7d8b3c3b10d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 09:58:04 2025 +0700 fix: package.json to reduce vulnerabilities (#157) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 - https://snyk.io/vuln/SNYK-JS-TMP-11501554 Co-authored-by: snyk-bot commit 7c547fcdd75774e39120241d16bf64c86e243355 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 27 02:34:25 2025 +0700 Bump the npm_and_yarn group across 4 directories with 7 updates (#144) Bumps the npm_and_yarn group with 4 updates in the /wagmi-project directory: [next](https://github.com/vercel/next.js), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk) and [nuxt](https://github.com/nuxt/nuxt/tree/HEAD/packages/nuxt). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/connectors directory: [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/create-wagmi/templates/next directory: [next](https://github.com/vercel/next.js). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/playgrounds/next directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `happy-dom` from 15.10.2 to 18.0.1 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v15.10.2...v18.0.1) Updates `vite` from 5.4.19 to 5.4.21 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `nuxt` from 3.16.0 to 3.19.0 - [Release notes](https://github.com/nuxt/nuxt/releases) - [Commits](https://github.com/nuxt/nuxt/commits/v3.19.0/packages/nuxt) Updates `@nuxt/devtools` from 2.4.1 to 2.7.0 - [Release notes](https://github.com/nuxt/devtools/releases) - [Changelog](https://github.com/nuxt/devtools/blob/main/CHANGELOG.md) - [Commits](https://github.com/nuxt/devtools/commits/v2.7.0/packages/devtools) Updates `devalue` from 5.1.1 to 5.6.1 - [Release notes](https://github.com/sveltejs/devalue/releases) - [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/devalue/compare/v5.1.1...v5.6.1) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `next` from 15.2.4 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 18.0.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 5.4.21 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: nuxt dependency-version: 3.19.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: "@nuxt/devtools" dependency-version: 2.7.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: devalue dependency-version: 5.6.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 977998758f93df492849cb55e7208864677515ef Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat Dec 27 02:10:27 2025 +0700 Update GitHub Actions workflow for tests (#149) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 9c420a789831c3affe0881d732bb95bd2bb075db Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 04:55:34 2025 +0700 Revise README structure and add sponsorship details (#146) * Revise README structure and add sponsorship details Updated README to include new sections and sponsorship information. https://sequence.xyz/ Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 224f7612cd574849b75e17056859f0a208a24aa1 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 03:19:19 2025 +0700 sequence-core-1.0.0 commit e90b2e6395fb14c6463a02e88f65dc23ce455d6d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu Dec 25 14:15:53 2025 +0700 Initial project structure and core packages Add initial monorepo structure for wagmi-project, including CLI, connectors, and core packages with source code, tests, configuration, and CI/CD workflows. This sets up the foundation for further development and collaboration. commit 1f452493d6ac5f23e20def94b7edf207bc2ce40a Author: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Date: Wed Dec 24 21:11:40 2025 +0700 fix: extras/web/package.json to reduce vulnerabilities (#117) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> commit 8bad845d94b7ca97a1d01a255eb8b41357eaf38d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 24 19:35:49 2025 +0700 feat: upgrade react from 18.3.1 to 19.2.0 (#121) Snyk has created this PR to upgrade react from 18.3.1 to 19.2.0. See this package in npm: react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot commit 5e6dca3ce44d2e8d5b00b1182ba9d6eae7855b23 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:23:47 2025 +0700 Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) (#135) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 802829cc116d9656dfb166beba03a1e77c8d556b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:15:56 2025 +0700 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot commit 893eedbb1a99db6736a157fed7d73a0196f30778 Merge: bc418b171 7fe4a922d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:50:09 2025 +0700 Merge remote-tracking branch 'origin/v1' into v1 commit 7fe4a922dfbd817fa76b8e30e9be184e6f38ddb1 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:16:10 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 640be8ffe175c762828aded47cc76e8d2c404b56 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:48 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 51a64321d3c0b91c9bd43c1e7e693f974c045dbb Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:24 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 28a268eef9f36a4bcf257d175c49c31f55f8008b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:14:59 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit bc418b171da95091d834f3a21141780169818db3 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 00:27:24 2025 +0700 Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Mona… * Update packages/0xsequence/tests/browser/wallet-provider/dapp.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/auth/src/session.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#187) https://github.com/Dargon789/sequence.js/commit/ea7e889bdca6ab92991b03a34eb3e2002806b5a5 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * dapp-client: export TransportMessage and MessageType * 1.9.19 (#189) * 1.9.17 * Update packages/0xsequence/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/account/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/auth/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/multicall/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/provider/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 1.9.19 * Update packages/waas/src/networks.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Squashed commit of the following: commit dafd2eda59d728355ab9028d03b0e10b014f2818 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:30:16 2026 +0700 Create nextjs.yml (#176) CI: Introduce a Next.js GitHub Actions workflow that detects the package manager, builds the app, caches Next.js artifacts, and deploys the static output to GitHub Pages. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit e6efe1f5b8e19fcd47714aa1417a9a01a16343a9 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:06:13 2026 +0700 sequence-core-dapp-1.0.0 commit cd4a860bbe5d27a96fd2a091cb6d074ff1c92331 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Jan 6 01:37:52 2026 +0700 Create web-sdk.yml (#175) https://github.com/Dargon789/Web3-Onboard/commit/fb66abf9ef6c55706a1dab2198db715f2588f1d1 https://github.com/Dargon789/web-sdk/commit/d26f62241ed85e6108a481f7a74ba7573c6c4c95 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit f2fd08bd5c463fc1c154c0fb26d8286bfcde01fa Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 01:11:33 2025 +0700 V2 (#174) * Updating DefaultGuest address * Update tests.yml (#51) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#52) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#55) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#56) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Corban Riley commit e7b277e79c7fe27c3cb129627d9f70e5bea9a25c Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 00:17:52 2025 +0700 Revise security policy for reporting vulnerabilities (#173) * Revise security policy for reporting vulnerabilities Updated contact information for vulnerability reporting. https://github.com/Dargon789/sequence.js/commit/e90b2e6395fb14c6463a02e88f65dc23ce455d6d Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 70208b1b85034bada6c5f8f858cc11bfd1a11241 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:50:23 2025 +0700 Potential fix for code scanning alert no. 95: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4c696d0e57d8ec45057b111bfb551ab497d0f93a Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:47:34 2025 +0700 Potential fix for code scanning alert no. 94: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit c62e5ddc2818a6b0624d63be3089c5ad7d08bd72 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:42:22 2025 +0700 Bump happy-dom in the npm_and_yarn group across 1 directory (#167) Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 18.0.1 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v18.0.1...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit e13fe5a71769b6d325b9cc3185c4a0519205f7b1 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:19:24 2025 +0700 Bump the npm_and_yarn group across 2 directories with 4 updates (#161) Bumps the npm_and_yarn group with 1 update in the / directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /packages/0xsequence directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b9d25688cb184f4b5ec1d0aba07bd36351efc65b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 15:35:25 2025 +0700 Update CNAME to new domain (#164) sequence.app Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4a81a2c4338191c93915c3101f3c24f0c468ae03 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 14:08:44 2025 +0700 Proto (#163) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> commit c4d0fdc33cd1ccf9cfc996b351959ae4d004a7e6 Merge: 7c547fcdd 269972a1d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 13:38:33 2025 +0700 Merge branch 'master' of https://github.com/Dargon789/sequence.js commit 269972a1dad423f67c0262149e46e7d8b3c3b10d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 09:58:04 2025 +0700 fix: package.json to reduce vulnerabilities (#157) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 - https://snyk.io/vuln/SNYK-JS-TMP-11501554 Co-authored-by: snyk-bot commit 7c547fcdd75774e39120241d16bf64c86e243355 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 27 02:34:25 2025 +0700 Bump the npm_and_yarn group across 4 directories with 7 updates (#144) Bumps the npm_and_yarn group with 4 updates in the /wagmi-project directory: [next](https://github.com/vercel/next.js), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk) and [nuxt](https://github.com/nuxt/nuxt/tree/HEAD/packages/nuxt). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/connectors directory: [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/create-wagmi/templates/next directory: [next](https://github.com/vercel/next.js). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/playgrounds/next directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `happy-dom` from 15.10.2 to 18.0.1 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v15.10.2...v18.0.1) Updates `vite` from 5.4.19 to 5.4.21 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `nuxt` from 3.16.0 to 3.19.0 - [Release notes](https://github.com/nuxt/nuxt/releases) - [Commits](https://github.com/nuxt/nuxt/commits/v3.19.0/packages/nuxt) Updates `@nuxt/devtools` from 2.4.1 to 2.7.0 - [Release notes](https://github.com/nuxt/devtools/releases) - [Changelog](https://github.com/nuxt/devtools/blob/main/CHANGELOG.md) - [Commits](https://github.com/nuxt/devtools/commits/v2.7.0/packages/devtools) Updates `devalue` from 5.1.1 to 5.6.1 - [Release notes](https://github.com/sveltejs/devalue/releases) - [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/devalue/compare/v5.1.1...v5.6.1) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `next` from 15.2.4 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 18.0.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 5.4.21 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: nuxt dependency-version: 3.19.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: "@nuxt/devtools" dependency-version: 2.7.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: devalue dependency-version: 5.6.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 977998758f93df492849cb55e7208864677515ef Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat Dec 27 02:10:27 2025 +0700 Update GitHub Actions workflow for tests (#149) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 9c420a789831c3affe0881d732bb95bd2bb075db Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 04:55:34 2025 +0700 Revise README structure and add sponsorship details (#146) * Revise README structure and add sponsorship details Updated README to include new sections and sponsorship information. https://sequence.xyz/ Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 224f7612cd574849b75e17056859f0a208a24aa1 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 03:19:19 2025 +0700 sequence-core-1.0.0 commit e90b2e6395fb14c6463a02e88f65dc23ce455d6d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu Dec 25 14:15:53 2025 +0700 Initial project structure and core packages Add initial monorepo structure for wagmi-project, including CLI, connectors, and core packages with source code, tests, configuration, and CI/CD workflows. This sets up the foundation for further development and collaboration. commit 1f452493d6ac5f23e20def94b7edf207bc2ce40a Author: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Date: Wed Dec 24 21:11:40 2025 +0700 fix: extras/web/package.json to reduce vulnerabilities (#117) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> commit 8bad845d94b7ca97a1d01a255eb8b41357eaf38d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 24 19:35:49 2025 +0700 feat: upgrade react from 18.3.1 to 19.2.0 (#121) Snyk has created this PR to upgrade react from 18.3.1 to 19.2.0. See this package in npm: react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot commit 5e6dca3ce44d2e8d5b00b1182ba9d6eae7855b23 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:23:47 2025 +0700 Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) (#135) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 802829cc116d9656dfb166beba03a1e77c8d556b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:15:56 2025 +0700 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot commit 893eedbb1a99db6736a157fed7d73a0196f30778 Merge: bc418b171 7fe4a922d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:50:09 2025 +0700 Merge remote-tracking branch 'origin/v1' into v1 commit 7fe4a922dfbd817fa76b8e30e9be184e6f38ddb1 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:16:10 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 640be8ffe175c762828aded47cc76e8d2c404b56 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:48 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 51a64321d3c0b91c9bd43c1e7e693f974c045dbb Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:24 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 28a268eef9f36a4bcf257d175c49c31f55f8008b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:14:59 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit bc418b171da95091d834f3a21141780169818db3 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 00:27:24 2025 +0700 Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove L… * Potential fix for code scanning alert no. 61: Cross-window communication with unrestricted target origin Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump the npm_and_yarn group across 2 directories with 25 updates (#177) Bumps the npm_and_yarn group with 11 updates in the /lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction directory: | Package | From | To | | --- | --- | --- | | [express](https://github.com/expressjs/express) | `4.18.2` | `4.22.1` | | [base-x](https://github.com/cryptocoinjs/base-x) | `3.0.9` | `3.0.11` | | [cipher-base](https://github.com/crypto-browserify/cipher-base) | `1.0.4` | `1.0.7` | | [follow-redirects](https://github.com/follow-redirects/follow-redirects) | `1.15.3` | `1.15.11` | | [min-document](https://github.com/Raynos/min-document) | `2.19.0` | `2.19.2` | | [pbkdf2](https://github.com/browserify/pbkdf2) | `3.1.2` | `3.1.5` | | [secp256k1](https://github.com/cryptocoinjs/secp256k1-node) | `4.0.3` | `4.0.4` | | [sha.js](https://github.com/crypto-browserify/sha.js) | `2.4.11` | `2.4.12` | | [undici](https://github.com/nodejs/undici) | `5.26.3` | `5.29.0` | | [@openzeppelin/contracts](https://github.com/OpenZeppelin/openzeppelin-contracts) | `5.0.0` | `5.0.2` | | [browserify-sign](https://github.com/crypto-browserify/browserify-sign) | `4.2.1` | `4.2.5` | Bumps the npm_and_yarn group with 11 updates in the /lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts directory: | Package | From | To | | --- | --- | --- | | [axios](https://github.com/axios/axios) | `1.7.4` | `1.13.2` | | [base-x](https://github.com/cryptocoinjs/base-x) | `3.0.9` | `3.0.11` | | [brace-expansion](https://github.com/juliangruber/brace-expansion) | `1.1.11` | `1.1.12` | | [cipher-base](https://github.com/crypto-browserify/cipher-base) | `1.0.4` | `1.0.7` | | [glob](https://github.com/isaacs/node-glob) | `11.0.0` | `11.1.0` | | [glob](https://github.com/isaacs/node-glob) | `10.4.5` | `10.5.0` | | [js-yaml](https://github.com/nodeca/js-yaml) | `3.14.1` | `3.14.2` | | [micromatch](https://github.com/micromatch/micromatch) | `4.0.5` | `4.0.8` | | [nanoid](https://github.com/ai/nanoid) | `3.3.3` | `removed` | | [pbkdf2](https://github.com/browserify/pbkdf2) | `3.1.2` | `3.1.5` | | [undici](https://github.com/nodejs/undici) | `5.28.4` | `5.29.0` | | [undici](https://github.com/nodejs/undici) | `6.12.0` | `6.23.0` | | [ws](https://github.com/websockets/ws) | `7.5.9` | `7.5.10` | Updates `form-data` from 2.3.3 to 4.0.2 - [Release notes](https://github.com/form-data/form-data/releases) - [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md) - [Commits](https://github.com/form-data/form-data/commits/v4.0.2) Updates `qs` from 6.5.3 to 6.13.0 - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.5.3...v6.13.0) Updates `undici` from 5.28.5 to 5.28.4 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.26.3...v5.29.0) Updates `vite` from 5.4.14 to 7.3.0 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.3.0/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.3.0/packages/vite) Updates `express` from 4.18.2 to 4.22.1 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...v4.22.1) Updates `base-x` from 3.0.9 to 3.0.11 - [Commits](https://github.com/cryptocoinjs/base-x/compare/v3.0.9...v3.0.11) Updates `body-parser` from 1.20.1 to 1.20.2 - [Release notes](https://github.com/expressjs/body-parser/releases) - [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/body-parser/compare/1.20.1...1.20.2) Updates `cipher-base` from 1.0.4 to 1.0.7 - [Changelog](https://github.com/browserify/cipher-base/blob/master/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/cipher-base/compare/v1.0.4...v1.0.7) Updates `follow-redirects` from 1.15.3 to 1.15.11 - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.11) Updates `min-document` from 2.19.0 to 2.19.2 - [Commits](https://github.com/Raynos/min-document/compare/v2.19.0...v2.19.2) Updates `pbkdf2` from 3.1.2 to 3.1.5 - [Changelog](https://github.com/browserify/pbkdf2/blob/master/CHANGELOG.md) - [Commits](https://github.com/browserify/pbkdf2/compare/v3.1.2...v3.1.5) Updates `secp256k1` from 4.0.3 to 4.0.4 - [Release notes](https://github.com/cryptocoinjs/secp256k1-node/releases) - [Commits](https://github.com/cryptocoinjs/secp256k1-node/compare/v4.0.3...v4.0.4) Updates `send` from 0.18.0 to 0.19.2 - [Release notes](https://github.com/pillarjs/send/releases) - [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md) - [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.2) Updates `serve-static` from 1.15.0 to 1.16.3 - [Release notes](https://github.com/expressjs/serve-static/releases) - [Changelog](https://github.com/expressjs/serve-static/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.3) Updates `sha.js` from 2.4.11 to 2.4.12 - [Changelog](https://github.com/browserify/sha.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/sha.js/compare/v2.4.11...v2.4.12) Updates `undici` from 5.26.3 to 5.29.0 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.26.3...v5.29.0) Updates `@openzeppelin/contracts` from 5.0.0 to 5.0.2 - [Release notes](https://github.com/OpenZeppelin/openzeppelin-contracts/releases) - [Changelog](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CHANGELOG.md) - [Commits](https://github.com/OpenZeppelin/openzeppelin-contracts/compare/v5.0.0...v5.0.2) Updates `browserify-sign` from 4.2.1 to 4.2.5 - [Changelog](https://github.com/browserify/browserify-sign/blob/main/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/browserify-sign/compare/v4.2.1...v4.2.5) Updates `axios` from 1.7.4 to 1.13.2 - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.7.4...v1.13.2) Updates `base-x` from 3.0.9 to 3.0.11 - [Commits](https://github.com/cryptocoinjs/base-x/compare/v3.0.9...v3.0.11) Updates `brace-expansion` from 1.1.11 to 1.1.12 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12) Updates `cipher-base` from 1.0.4 to 1.0.7 - [Changelog](https://github.com/browserify/cipher-base/blob/master/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/cipher-base/compare/v1.0.4...v1.0.7) Updates `form-data` from 4.0.0 to 4.0.5 - [Release notes](https://github.com/form-data/form-data/releases) - [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md) - [Commits](https://github.com/form-data/form-data/commits/v4.0.2) Updates `glob` from 11.0.0 to 11.1.0 - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v11.0.0...v11.1.0) Updates `glob` from 10.4.5 to 10.5.0 - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v11.0.0...v11.1.0) Updates `js-yaml` from 3.14.1 to 3.14.2 - [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2) Updates `micromatch` from 4.0.5 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8) Removes `nanoid` Updates `pbkdf2` from 3.1.2 to 3.1.5 - [Changelog](https://github.com/browserify/pbkdf2/blob/master/CHANGELOG.md) - [Commits](https://github.com/browserify/pbkdf2/compare/v3.1.2...v3.1.5) Updates `serialize-javascript` from 6.0.0 to 6.0.2 - [Release notes](https://github.com/yahoo/serialize-javascript/releases) - [Commits](https://github.com/yahoo/serialize-javascript/compare/v6.0.0...v6.0.2) Updates `sha.js` from 2.4.11 to 2.4.12 - [Changelog](https://github.com/browserify/sha.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/sha.js/compare/v2.4.11...v2.4.12) Updates `undici` from 5.28.4 to 5.29.0 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.26.3...v5.29.0) Updates `undici` from 6.12.0 to 6.23.0 - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.26.3...v5.29.0) Updates `ws` from 7.5.9 to 7.5.10 - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10) --- updated-dependencies: - dependency-name: form-data dependency-version: 4.0.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: qs dependency-version: 6.13.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: undici dependency-version: 5.28.4 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.3.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: express dependency-version: 4.22.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: base-x dependency-version: 3.0.11 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: body-parser dependency-version: 1.20.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: cipher-base dependency-version: 1.0.7 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: follow-redirects dependency-version: 1.15.11 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: min-document dependency-version: 2.19.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: pbkdf2 dependency-version: 3.1.5 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: secp256k1 dependency-version: 4.0.4 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: send dependency-version: 0.19.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: serve-static dependency-version: 1.16.3 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: sha.js dependency-version: 2.4.12 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: undici dependency-version: 5.29.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: "@openzeppelin/contracts" dependency-version: 5.0.2 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: browserify-sign dependency-version: 4.2.5 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: axios dependency-version: 1.13.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: base-x dependency-version: 3.0.11 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: brace-expansion dependency-version: 1.1.12 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: cipher-base dependency-version: 1.0.7 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: form-data dependency-version: 4.0.5 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: glob dependency-version: 11.1.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: glob dependency-version: 10.5.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: js-yaml dependency-version: 3.14.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: nanoid dependency-version: dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: pbkdf2 dependency-version: 3.1.5 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: serialize-javascript dependency-version: 6.0.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: sha.js dependency-version: 2.4.12 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: undici dependency-version: 5.29.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: undici dependency-version: 6.23.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: ws dependency-version: 7.5.10 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Potential fix for code scanning alert no. 73: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update lib/signals-implicit-mode/foundry.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * demo dapp (#191) (#192) * Revise security policy for reporting vulnerabilities (#173) * Revise security policy for reporting vulnerabilities Updated contact information for vulnerability reporting. https://github.com/Dargon789/sequence.js/commit/e90b2e6395fb14c6463a02e88f65dc23ce455d6d * Update SECURITY.md --------- * V2 (#174) * Updating DefaultGuest address * Update tests.yml (#51) * Update tests.yml (#52) * Update tests.yml * Update tests.yml (#55) * Update tests.yml (#56) * Update tests.yml --------- * Create web-sdk.yml (#175) https://github.com/Dargon789/Web3-Onboard/commit/fb66abf9ef6c55706a1dab2198db715f2588f1d1 https://github.com/Dargon789/web-sdk/commit/d26f62241ed85e6108a481f7a74ba7573c6c4c95 * sequence-core-dapp-1.0.0 * Create nextjs.yml (#176) CI: Introduce a Next.js GitHub Actions workflow that detects the package manager, builds the app, caches Next.js artifacts, and deploys the static output to GitHub Pages. * Update config.json (#185) * Potential fix for code scanning alert no. 108: Incomplete regular expression for hostnames (#186) * Potential fix for code scanning alert no. 108: Incomplete regular expression for hostnames * Update lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/run.js --------- * 0xsequence 1.9.19 (#179) * 1.9.17 * Update packages/0xsequence/CHANGELOG.md * Update packages/account/CHANGELOG.md * Update packages/auth/CHANGELOG.md * Update packages/multicall/CHANGELOG.md * Update packages/provider/CHANGELOG.md * Update packages/wallet/CHANGELOG.md * 1.9.19 * Update packages/waas/src/networks.ts * Squashed commit of the following: commit dafd2eda59d728355ab9028d03b0e10b014f2818 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:30:16 2026 +0700 Create nextjs.yml (#176) CI: Introduce a Next.js GitHub Actions workflow that detects the package manager, builds the app, caches Next.js artifacts, and deploys the static output to GitHub Pages. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit e6efe1f5b8e19fcd47714aa1417a9a01a16343a9 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:06:13 2026 +0700 sequence-core-dapp-1.0.0 commit cd4a860bbe5d27a96fd2a091cb6d074ff1c92331 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Jan 6 01:37:52 2026 +0700 Create web-sdk.yml (#175) https://github.com/Dargon789/Web3-Onboard/commit/fb66abf9ef6c55706a1dab2198db715f2588f1d1 https://github.com/Dargon789/web-sdk/commit/d26f62241ed85e6108a481f7a74ba7573c6c4c95 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit f2fd08bd5c463fc1c154c0fb26d8286bfcde01fa Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 01:11:33 2025 +0700 V2 (#174) * Updating DefaultGuest address * Update tests.yml (#51) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#52) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#55) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#56) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Corban Riley commit e7b277e79c7fe27c3cb129627d9f70e5bea9a25c Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 00:17:52 2025 +0700 Revise security policy for reporting vulnerabilities (#173) * Revise security policy for reporting vulnerabilities Updated contact information for vulnerability reporting. https://github.com/Dargon789/sequence.js/commit/e90b2e6395fb14c6463a02e88f65dc23ce455d6d Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 70208b1b85034bada6c5f8f858cc11bfd1a11241 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:50:23 2025 +0700 Potential fix for code scanning alert no. 95: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4c696d0e57d8ec45057b111bfb551ab497d0f93a Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:47:34 2025 +0700 Potential fix for code scanning alert no. 94: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit c62e5ddc2818a6b0624d63be3089c5ad7d08bd72 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:42:22 2025 +0700 Bump happy-dom in the npm_and_yarn group across 1 directory (#167) Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 18.0.1 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v18.0.1...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit e13fe5a71769b6d325b9cc3185c4a0519205f7b1 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:19:24 2025 +0700 Bump the npm_and_yarn group across 2 directories with 4 updates (#161) Bumps the npm_and_yarn group with 1 update in the / directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /packages/0xsequence directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b9d25688cb184f4b5ec1d0aba07bd36351efc65b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 15:35:25 2025 +0700 Update CNAME to new domain (#164) sequence.app Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4a81a2c4338191c93915c3101f3c24f0c468ae03 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 14:08:44 2025 +0700 Proto (#163) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> commit c4d0fdc33cd1ccf9cfc996b351959ae4d004a7e6 Merge: 7c547fcdd 269972a1d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 13:38:33 2025 +0700 Merge branch 'master' of https://github.com/Dargon789/sequence.js commit 269972a1dad423f67c0262149e46e7d8b3c3b10d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 09:58:04 2025 +0700 fix: package.json to reduce vulnerabilities (#157) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 - https://snyk.io/vuln/SNYK-JS-TMP-11501554 Co-authored-by: snyk-bot commit 7c547fcdd75774e39120241d16bf64c86e243355 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 27 02:34:25 2025 +0700 Bump the npm_and_yarn group across 4 directories with 7 updates (#144) Bumps the npm_and_yarn group with 4 updates in the /wagmi-project directory: [next](https://github.com/vercel/next.js), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk) and [nuxt](https://github.com/nuxt/nuxt/tree/HEAD/packages/nuxt). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/connectors directory: [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/create-wagmi/templates/next directory: [next](https://github.com/vercel/next.js). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/playgrounds/next directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `happy-dom` from 15.10.2 to 18.0.1 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v15.10.2...v18.0.1) Updates `vite` from 5.4.19 to 5.4.21 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `nuxt` from 3.16.0 to 3.19.0 - [Release notes](https://github.com/nuxt/nuxt/releases) - [Commits](https://github.com/nuxt/nuxt/commits/v3.19.0/packages/nuxt) Updates `@nuxt/devtools` from 2.4.1 to 2.7.0 - [Release notes](https://github.com/nuxt/devtools/releases) - [Changelog](https://github.com/nuxt/devtools/blob/main/CHANGELOG.md) - [Commits](https://github.com/nuxt/devtools/commits/v2.7.0/packages/devtools) Updates `devalue` from 5.1.1 to 5.6.1 - [Release notes](https://github.com/sveltejs/devalue/releases) - [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/devalue/compare/v5.1.1...v5.6.1) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `next` from 15.2.4 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 18.0.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 5.4.21 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: nuxt dependency-version: 3.19.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: "@nuxt/devtools" dependency-version: 2.7.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: devalue dependency-version: 5.6.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 977998758f93df492849cb55e7208864677515ef Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat Dec 27 02:10:27 2025 +0700 Update GitHub Actions workflow for tests (#149) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 9c420a789831c3affe0881d732bb95bd2bb075db Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 04:55:34 2025 +0700 Revise README structure and add sponsorship details (#146) * Revise README structure and add sponsorship details Updated README to include new sections and sponsorship information. https://sequence.xyz/ Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 224f7612cd574849b75e17056859f0a208a24aa1 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 03:19:19 2025 +0700 sequence-core-1.0.0 commit e90b2e6395fb14c6463a02e88f65dc23ce455d6d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu Dec 25 14:15:53 2025 +0700 Initial project structure and core packages Add initial monorepo structure for wagmi-project, including CLI, connectors, and core packages with source code, tests, configuration, and CI/CD workflows. This sets up the foundation for further development and collaboration. commit 1f452493d6ac5f23e20def94b7edf207bc2ce40a Author: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Date: Wed Dec 24 21:11:40 2025 +0700 fix: extras/web/package.json to reduce vulnerabilities (#117) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> commit 8bad845d94b7ca97a1d01a255eb8b41357eaf38d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 24 19:35:49 2025 +0700 feat: upgrade react from 18.3.1 to 19.2.0 (#121) Snyk has created this PR to upgrade react from 18.3.1 to 19.2.0. See this package in npm: react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot commit 5e6dca3ce44d2e8d5b00b1182ba9d6eae7855b23 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:23:47 2025 +0700 Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) (#135) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 802829cc116d9656dfb166beba03a1e77c8d556b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:15:56 2025 +0700 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot commit 893eedbb1a99db6736a157fed7d73a0196f30778 Merge: bc418b171 7fe4a922d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:50:09 2025 +0700 Merge remote-tracking branch 'origin/v1' into v1 commit 7fe4a922dfbd817fa76b8e30e9be184e6f38ddb1 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:16:10 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 640be8ffe175c762828aded47cc76e8d2c404b56 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:48 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 51a64321d3c0b91c9bd43c1e7e693f974c045dbb Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:24 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 28a268eef9f36a4bcf257d175c49c31f55f8008b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:14:59 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit bc418b171da95091d834f3a21141780169818db3 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 00:27:24 2025 +0700 Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name… Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: dependabot[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Corban Riley Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: spongeboi Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update publish-dists.yml (#184) * 1.9.17 * Update packages/0xsequence/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/account/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/auth/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/multicall/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/provider/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 1.9.19 * Update packages/waas/src/networks.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Squashed commit of the following: commit dafd2eda59d728355ab9028d03b0e10b014f2818 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:30:16 2026 +0700 Create nextjs.yml (#176) CI: Introduce a Next.js GitHub Actions workflow that detects the package manager, builds the app, caches Next.js artifacts, and deploys the static output to GitHub Pages. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit e6efe1f5b8e19fcd47714aa1417a9a01a16343a9 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:06:13 2026 +0700 sequence-core-dapp-1.0.0 commit cd4a860bbe5d27a96fd2a091cb6d074ff1c92331 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Jan 6 01:37:52 2026 +0700 Create web-sdk.yml (#175) https://github.com/Dargon789/Web3-Onboard/commit/fb66abf9ef6c55706a1dab2198db715f2588f1d1 https://github.com/Dargon789/web-sdk/commit/d26f62241ed85e6108a481f7a74ba7573c6c4c95 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit f2fd08bd5c463fc1c154c0fb26d8286bfcde01fa Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 01:11:33 2025 +0700 V2 (#174) * Updating DefaultGuest address * Update tests.yml (#51) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#52) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#55) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#56) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Corban Riley commit e7b277e79c7fe27c3cb129627d9f70e5bea9a25c Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 00:17:52 2025 +0700 Revise security policy for reporting vulnerabilities (#173) * Revise security policy for reporting vulnerabilities Updated contact information for vulnerability reporting. https://github.com/Dargon789/sequence.js/commit/e90b2e6395fb14c6463a02e88f65dc23ce455d6d Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 70208b1b85034bada6c5f8f858cc11bfd1a11241 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:50:23 2025 +0700 Potential fix for code scanning alert no. 95: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4c696d0e57d8ec45057b111bfb551ab497d0f93a Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:47:34 2025 +0700 Potential fix for code scanning alert no. 94: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit c62e5ddc2818a6b0624d63be3089c5ad7d08bd72 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:42:22 2025 +0700 Bump happy-dom in the npm_and_yarn group across 1 directory (#167) Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 18.0.1 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v18.0.1...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit e13fe5a71769b6d325b9cc3185c4a0519205f7b1 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:19:24 2025 +0700 Bump the npm_and_yarn group across 2 directories with 4 updates (#161) Bumps the npm_and_yarn group with 1 update in the / directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /packages/0xsequence directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b9d25688cb184f4b5ec1d0aba07bd36351efc65b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 15:35:25 2025 +0700 Update CNAME to new domain (#164) sequence.app Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4a81a2c4338191c93915c3101f3c24f0c468ae03 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 14:08:44 2025 +0700 Proto (#163) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> commit c4d0fdc33cd1ccf9cfc996b351959ae4d004a7e6 Merge: 7c547fcdd 269972a1d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 13:38:33 2025 +0700 Merge branch 'master' of https://github.com/Dargon789/sequence.js commit 269972a1dad423f67c0262149e46e7d8b3c3b10d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 09:58:04 2025 +0700 fix: package.json to reduce vulnerabilities (#157) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 - https://snyk.io/vuln/SNYK-JS-TMP-11501554 Co-authored-by: snyk-bot commit 7c547fcdd75774e39120241d16bf64c86e243355 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 27 02:34:25 2025 +0700 Bump the npm_and_yarn group across 4 directories with 7 updates (#144) Bumps the npm_and_yarn group with 4 updates in the /wagmi-project directory: [next](https://github.com/vercel/next.js), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk) and [nuxt](https://github.com/nuxt/nuxt/tree/HEAD/packages/nuxt). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/connectors directory: [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/create-wagmi/templates/next directory: [next](https://github.com/vercel/next.js). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/playgrounds/next directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `happy-dom` from 15.10.2 to 18.0.1 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v15.10.2...v18.0.1) Updates `vite` from 5.4.19 to 5.4.21 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `nuxt` from 3.16.0 to 3.19.0 - [Release notes](https://github.com/nuxt/nuxt/releases) - [Commits](https://github.com/nuxt/nuxt/commits/v3.19.0/packages/nuxt) Updates `@nuxt/devtools` from 2.4.1 to 2.7.0 - [Release notes](https://github.com/nuxt/devtools/releases) - [Changelog](https://github.com/nuxt/devtools/blob/main/CHANGELOG.md) - [Commits](https://github.com/nuxt/devtools/commits/v2.7.0/packages/devtools) Updates `devalue` from 5.1.1 to 5.6.1 - [Release notes](https://github.com/sveltejs/devalue/releases) - [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/devalue/compare/v5.1.1...v5.6.1) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `next` from 15.2.4 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 18.0.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 5.4.21 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: nuxt dependency-version: 3.19.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: "@nuxt/devtools" dependency-version: 2.7.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: devalue dependency-version: 5.6.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 977998758f93df492849cb55e7208864677515ef Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat Dec 27 02:10:27 2025 +0700 Update GitHub Actions workflow for tests (#149) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 9c420a789831c3affe0881d732bb95bd2bb075db Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 04:55:34 2025 +0700 Revise README structure and add sponsorship details (#146) * Revise README structure and add sponsorship details Updated README to include new sections and sponsorship information. https://sequence.xyz/ Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 224f7612cd574849b75e17056859f0a208a24aa1 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 03:19:19 2025 +0700 sequence-core-1.0.0 commit e90b2e6395fb14c6463a02e88f65dc23ce455d6d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu Dec 25 14:15:53 2025 +0700 Initial project structure and core packages Add initial monorepo structure for wagmi-project, including CLI, connectors, and core packages with source code, tests, configuration, and CI/CD workflows. This sets up the foundation for further development and collaboration. commit 1f452493d6ac5f23e20def94b7edf207bc2ce40a Author: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Date: Wed Dec 24 21:11:40 2025 +0700 fix: extras/web/package.json to reduce vulnerabilities (#117) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> commit 8bad845d94b7ca97a1d01a255eb8b41357eaf38d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 24 19:35:49 2025 +0700 feat: upgrade react from 18.3.1 to 19.2.0 (#121) Snyk has created this PR to upgrade react from 18.3.1 to 19.2.0. See this package in npm: react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot commit 5e6dca3ce44d2e8d5b00b1182ba9d6eae7855b23 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:23:47 2025 +0700 Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) (#135) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 802829cc116d9656dfb166beba03a1e77c8d556b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:15:56 2025 +0700 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot commit 893eedbb1a99db6736a157fed7d73a0196f30778 Merge: bc418b171 7fe4a922d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:50:09 2025 +0700 Merge remote-tracking branch 'origin/v1' into v1 commit 7fe4a922dfbd817fa76b8e30e9be184e6f38ddb1 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:16:10 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 640be8ffe175c762828aded47cc76e8d2c404b56 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:48 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 51a64321d3c0b91c9bd43c1e7e693f974c045dbb Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:24 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 28a268eef9f36a4bcf257d175c49c31f55f8008b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:14:59 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit bc418b171da95091d834f3a21141780169818db3 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 00:27:24 2025 +0700 Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * A… * Bump body-parser in the npm_and_yarn group across 1 directory (#190) Bumps the npm_and_yarn group with 1 update in the /lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction directory: [body-parser](https://github.com/expressjs/body-parser). Updates `body-parser` from 1.20.2 to 1.20.4 - [Release notes](https://github.com/expressjs/body-parser/releases) - [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md) - [Commits](https://github.com/expressjs/body-parser/compare/1.20.2...1.20.4) --- updated-dependencies: - dependency-name: body-parser dependency-version: 1.20.4 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Potential fix for code scanning alert no. 92: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 94: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 93: Incomplete regular expression for hostnames Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 95: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Adding eoa LoginMethod to dapp-client * Delete lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs directory (#202) erc2470-libs directory non forge std remove and clean Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Delete lib/signals-implicit-mode/lib/sequence-v3/script/DeployMocks.s.sol (#203) erc2470-libs directory non forge std remove and clean all env Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Delete wagmi-project/packages/sequence-core-1.0.0/lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs directory (#204) erc2470-libs directory non forge std remove and clean all env Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Delete wagmi-project/packages/sequence-core-1.0.0/lib/signals-implicit-mode/lib/sequence-v3/script/DeployMocks.s.sol (#205) Chores: Delete the erc2470-libs directory and its contents, including forge-std sources, tests, scripts, and related configuration files, to reduce duplicated tooling and dependencies. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 3.0.0-beta.9 * chore(dapp-client): re-export network/util helpers and add explicit session config helper * Fix React Server Components CVE vulnerabilities (#209) Updated dependencies to fix Next.js and React CVE vulnerabilities. The fix-react2shell-next tool automatically updated the following packages to their secure versions: - next - react-server-dom-webpack - react-server-dom-parcel - react-server-dom-turbopack All package.json files have been scanned and vulnerable versions have been patched to the correct fixed versions based on the official React advisory. Co-authored-by: Vercel * Create Docker.yml (#210) CI: Introduce a Docker GitHub Actions workflow that authenticates to Docker Hub, builds images with Buildx, tags them using metadata, and pushes or locally loads them depending on the event type. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * move circleci docker to github * Fix React Server Components CVE vulnerabilities (#211) Updated dependencies to fix Next.js and React CVE vulnerabilities. The fix-react2shell-next tool automatically updated the following packages to their secure versions: - next - react-server-dom-webpack - react-server-dom-parcel - react-server-dom-turbopack All package.json files have been scanned and vulnerable versions have been patched to the correct fixed versions based on the official React advisory. Co-authored-by: Vercel * Potential fix for code scanning alert no. 92: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 93: Incomplete regular expression for hostnames Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update lib/signals-implicit-mode/foundry.toml Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Delete .github/.circleci directory (#216) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Delete .github/workflows/publish-dists.yml (#217) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Revert "Delete lib/signals-implicit-mode/lib/sequence-v3/script/DeployMocks.s…" (#218) This reverts commit f9123e43459040f24b7f29fd7e8f74d1a920ce51. * Revert "Delete lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs dir…" (#219) * Revert "Delete lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs dir…" This reverts commit 75ae648720ba6c85cc9597348550ff522cbde832. * Update lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/.githooks/pre-commit Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/scripts/vm.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Sequence.js/master (#222) * Fix apple auth scope (#950) * Fix apple auth scope * Fix Apple auth scope test * 3.0.0-beta.7 * Update apple auth scope (#951) * 3.0.0-beta.8 * dapp-client: export TransportMessage and MessageType * Adding eoa LoginMethod to dapp-client --------- Co-authored-by: tolgahan-arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Riley * Wagmi project (#199) * 0xsequence/sequence.js/master (#166) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Fix apple auth scope (#950) * Fix apple auth scope * Fix Apple auth scope test * 3.0.0-beta.7 * Update apple auth scope (#951) * 3.0.0-beta.8 * dapp-client: export TransportMessage and MessageType * Update indexer client (#207) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: tolgahan-arikan Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> * Wagmi project (#225) * 0xsequence/sequence.js/master (#166) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Fix apple auth scope (#950) * Fix apple auth scope * Fix Apple auth scope test * 3.0.0-beta.7 * Update apple auth scope (#951) * 3.0.0-beta.8 * dapp-client: export TransportMessage and MessageType * Update indexer client (#207) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: tolgahan-arikan Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> * 1.10.15 (#229) * Fix apple auth scope (#950) * Fix apple auth scope * Fix Apple auth scope test * 3.0.0-beta.7 * Update apple auth scope (#951) * 3.0.0-beta.8 * dapp-client: export TransportMessage and MessageType * Adding eoa LoginMethod to dapp-client * 3.0.0-beta.9 * chore(dapp-client): re-export network/util helpers and add explicit session config helper --------- Co-authored-by: tolgahan-arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Riley * 0xsequence 1.9.19 (#194) * 1.9.17 * Update packages/0xsequence/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/account/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/auth/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/multicall/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/provider/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 1.9.19 * Update packages/waas/src/networks.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Squashed commit of the following: commit dafd2eda59d728355ab9028d03b0e10b014f2818 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:30:16 2026 +0700 Create nextjs.yml (#176) CI: Introduce a Next.js GitHub Actions workflow that detects the package manager, builds the app, caches Next.js artifacts, and deploys the static output to GitHub Pages. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit e6efe1f5b8e19fcd47714aa1417a9a01a16343a9 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:06:13 2026 +0700 sequence-core-dapp-1.0.0 commit cd4a860bbe5d27a96fd2a091cb6d074ff1c92331 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Jan 6 01:37:52 2026 +0700 Create web-sdk.yml (#175) https://github.com/Dargon789/Web3-Onboard/commit/fb66abf9ef6c55706a1dab2198db715f2588f1d1 https://github.com/Dargon789/web-sdk/commit/d26f62241ed85e6108a481f7a74ba7573c6c4c95 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit f2fd08bd5c463fc1c154c0fb26d8286bfcde01fa Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 01:11:33 2025 +0700 V2 (#174) * Updating DefaultGuest address * Update tests.yml (#51) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#52) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#55) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#56) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Corban Riley commit e7b277e79c7fe27c3cb129627d9f70e5bea9a25c Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 00:17:52 2025 +0700 Revise security policy for reporting vulnerabilities (#173) * Revise security policy for reporting vulnerabilities Updated contact information for vulnerability reporting. https://github.com/Dargon789/sequence.js/commit/e90b2e6395fb14c6463a02e88f65dc23ce455d6d Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 70208b1b85034bada6c5f8f858cc11bfd1a11241 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:50:23 2025 +0700 Potential fix for code scanning alert no. 95: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4c696d0e57d8ec45057b111bfb551ab497d0f93a Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:47:34 2025 +0700 Potential fix for code scanning alert no. 94: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit c62e5ddc2818a6b0624d63be3089c5ad7d08bd72 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:42:22 2025 +0700 Bump happy-dom in the npm_and_yarn group across 1 directory (#167) Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 18.0.1 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v18.0.1...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit e13fe5a71769b6d325b9cc3185c4a0519205f7b1 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:19:24 2025 +0700 Bump the npm_and_yarn group across 2 directories with 4 updates (#161) Bumps the npm_and_yarn group with 1 update in the / directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /packages/0xsequence directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b9d25688cb184f4b5ec1d0aba07bd36351efc65b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 15:35:25 2025 +0700 Update CNAME to new domain (#164) sequence.app Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4a81a2c4338191c93915c3101f3c24f0c468ae03 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 14:08:44 2025 +0700 Proto (#163) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> commit c4d0fdc33cd1ccf9cfc996b351959ae4d004a7e6 Merge: 7c547fcdd 269972a1d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 13:38:33 2025 +0700 Merge branch 'master' of https://github.com/Dargon789/sequence.js commit 269972a1dad423f67c0262149e46e7d8b3c3b10d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 09:58:04 2025 +0700 fix: package.json to reduce vulnerabilities (#157) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 - https://snyk.io/vuln/SNYK-JS-TMP-11501554 Co-authored-by: snyk-bot commit 7c547fcdd75774e39120241d16bf64c86e243355 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 27 02:34:25 2025 +0700 Bump the npm_and_yarn group across 4 directories with 7 updates (#144) Bumps the npm_and_yarn group with 4 updates in the /wagmi-project directory: [next](https://github.com/vercel/next.js), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk) and [nuxt](https://github.com/nuxt/nuxt/tree/HEAD/packages/nuxt). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/connectors directory: [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/create-wagmi/templates/next directory: [next](https://github.com/vercel/next.js). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/playgrounds/next directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `happy-dom` from 15.10.2 to 18.0.1 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v15.10.2...v18.0.1) Updates `vite` from 5.4.19 to 5.4.21 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `nuxt` from 3.16.0 to 3.19.0 - [Release notes](https://github.com/nuxt/nuxt/releases) - [Commits](https://github.com/nuxt/nuxt/commits/v3.19.0/packages/nuxt) Updates `@nuxt/devtools` from 2.4.1 to 2.7.0 - [Release notes](https://github.com/nuxt/devtools/releases) - [Changelog](https://github.com/nuxt/devtools/blob/main/CHANGELOG.md) - [Commits](https://github.com/nuxt/devtools/commits/v2.7.0/packages/devtools) Updates `devalue` from 5.1.1 to 5.6.1 - [Release notes](https://github.com/sveltejs/devalue/releases) - [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/devalue/compare/v5.1.1...v5.6.1) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `next` from 15.2.4 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 18.0.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 5.4.21 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: nuxt dependency-version: 3.19.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: "@nuxt/devtools" dependency-version: 2.7.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: devalue dependency-version: 5.6.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 977998758f93df492849cb55e7208864677515ef Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat Dec 27 02:10:27 2025 +0700 Update GitHub Actions workflow for tests (#149) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 9c420a789831c3affe0881d732bb95bd2bb075db Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 04:55:34 2025 +0700 Revise README structure and add sponsorship details (#146) * Revise README structure and add sponsorship details Updated README to include new sections and sponsorship information. https://sequence.xyz/ Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 224f7612cd574849b75e17056859f0a208a24aa1 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 03:19:19 2025 +0700 sequence-core-1.0.0 commit e90b2e6395fb14c6463a02e88f65dc23ce455d6d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu Dec 25 14:15:53 2025 +0700 Initial project structure and core packages Add initial monorepo structure for wagmi-project, including CLI, connectors, and core packages with source code, tests, configuration, and CI/CD workflows. This sets up the foundation for further development and collaboration. commit 1f452493d6ac5f23e20def94b7edf207bc2ce40a Author: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Date: Wed Dec 24 21:11:40 2025 +0700 fix: extras/web/package.json to reduce vulnerabilities (#117) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> commit 8bad845d94b7ca97a1d01a255eb8b41357eaf38d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 24 19:35:49 2025 +0700 feat: upgrade react from 18.3.1 to 19.2.0 (#121) Snyk has created this PR to upgrade react from 18.3.1 to 19.2.0. See this package in npm: react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot commit 5e6dca3ce44d2e8d5b00b1182ba9d6eae7855b23 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:23:47 2025 +0700 Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) (#135) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 802829cc116d9656dfb166beba03a1e77c8d556b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:15:56 2025 +0700 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot commit 893eedbb1a99db6736a157fed7d73a0196f30778 Merge: bc418b171 7fe4a922d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:50:09 2025 +0700 Merge remote-tracking branch 'origin/v1' into v1 commit 7fe4a922dfbd817fa76b8e30e9be184e6f38ddb1 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:16:10 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 640be8ffe175c762828aded47cc76e8d2c404b56 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:48 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 51a64321d3c0b91c9bd43c1e7e693f974c045dbb Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:24 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 28a268eef9f36a4bcf257d175c49c31f55f8008b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:14:59 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit bc418b171da95091d834f3a21141780169818db3 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 00:27:24 2025 +0700 Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Mona… * 0xsequence/master (#180) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 0xsequence-1.9.19 # 0xsequence-#1.9.19 * Update packages/0xsequence/tests/browser/wallet-provider/dapp.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/auth/src/session.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#187) https://github.com/Dargon789/sequence.js/commit/ea7e889bdca6ab92991b03a34eb3e2002806b5a5 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 61: Cross-window communication with unrestricted target origin Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Delete .github/workflows/Docker.yml (#233) CI: Remove the Docker GitHub Actions workflow configuration file. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 3.0.0-beta.10 * 1.0.8 (#234) * Merge remote-tracking branch 'origin/v1' into v1 * # 1.10.8 # 0xsequence ## 1.10.8 * 0xsequence [Sequence](https://sequence.xyz): a modular web3 stack and smart wallet for Ethereum chains * Update lefthook.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update turbo.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update CHANGELOG.md Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update api.gen.ts Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update guard.gen.ts Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update CHANGELOG.md Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update CHANGELOG.md Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Delete packages/services directory Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .eslintrc.js Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .eslintrc.js Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * 0xsequence-core wagmi-project-playgrounds-0xsequence-core * Potential fix for code scanning alert no. 40: Workflow does not contain permissions (#242) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * fix(dapp-client): tighten transport message source validation * Bump diff (#235) Bumps the npm_and_yarn group with 1 update in the /lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts directory: [diff](https://github.com/kpdecker/jsdiff). Updates `diff` from 5.2.0 to 5.2.2 - [Changelog](https://github.com/kpdecker/jsdiff/blob/master/release-notes.md) - [Commits](https://github.com/kpdecker/jsdiff/compare/v5.2.0...v5.2.2) --- updated-dependencies: - dependency-name: diff dependency-version: 5.2.2 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete wagmi-project/.circleci directory (#245) CI: Delete the obsolete .circleci/config.yml configuration from wagmi-project. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Revert "Delete lib/signals-implicit-mode/lib/sequence-v3/script/DeployMocks.s…" (#248) This reverts commit f9123e43459040f24b7f29fd7e8f74d1a920ce51. * Install Vercel Web Analytics in Next.js (#249) Implemented Vercel Web Analytics for Next.js Applications ## Summary Successfully configured Vercel Web Analytics for two Next.js App Router projects in the repository. ## Changes Made ### 1. Added @vercel/analytics Dependency Modified package.json files to include the @vercel/analytics package: - `extras/docs/package.json` - Added "@vercel/analytics": "^1.5.0" - `extras/web/package.json` - Added "@vercel/analytics": "^1.5.0" ### 2. Updated Root Layout Files Modified both App Router layout.tsx files to integrate the Analytics component: **Files Modified:** - `extras/docs/app/layout.tsx` - `extras/web/app/layout.tsx` **Changes Applied:** - Added import statement: `import { Analytics } from '@vercel/analytics/next'` - Added `` component inside the `` tag, placed after `{children}` - Preserved all existing code structure, styling, and functionality ## Implementation Details Both Next.js applications use the App Router pattern with TypeScript. The Analytics component was added following the official Vercel Analytics documentation: 1. Imported the Analytics component from '@vercel/analytics/next' 2. Placed the component at the end of the body element in the root layout 3. Maintained proper formatting and code style consistency ## Notes - The root package.json already had @vercel/analytics installed at version ^1.5.0 - Both applications are configured identically for consistent analytics tracking - The workspace has pre-existing dependency issues unrelated to these changes (missing @0xsequence/identity-instrument package), which prevents running `pnpm install` successfully - Once the workspace dependency issues are resolved, running `pnpm install` will pull in the analytics package for both apps - The changes are syntactically correct and follow Next.js best practices for App Router projects ## Testing Recommendations Once dependencies are installed: 1. Run `pnpm build` in both extras/docs and extras/web directories 2. Start the development server with `pnpm dev` 3. Verify analytics are being tracked in your Vercel dashboard 4. Check browser console for any errors related to analytics Co-authored-by: Vercel * 0xsequence 1.9.19 (#252) * 1.9.17 * Update packages/0xsequence/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/account/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/auth/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/multicall/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/provider/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/CHANGELOG.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 1.9.19 * Update packages/waas/src/networks.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Squashed commit of the following: commit dafd2eda59d728355ab9028d03b0e10b014f2818 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:30:16 2026 +0700 Create nextjs.yml (#176) CI: Introduce a Next.js GitHub Actions workflow that detects the package manager, builds the app, caches Next.js artifacts, and deploys the static output to GitHub Pages. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit e6efe1f5b8e19fcd47714aa1417a9a01a16343a9 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Jan 7 06:06:13 2026 +0700 sequence-core-dapp-1.0.0 commit cd4a860bbe5d27a96fd2a091cb6d074ff1c92331 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Jan 6 01:37:52 2026 +0700 Create web-sdk.yml (#175) https://github.com/Dargon789/Web3-Onboard/commit/fb66abf9ef6c55706a1dab2198db715f2588f1d1 https://github.com/Dargon789/web-sdk/commit/d26f62241ed85e6108a481f7a74ba7573c6c4c95 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit f2fd08bd5c463fc1c154c0fb26d8286bfcde01fa Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 01:11:33 2025 +0700 V2 (#174) * Updating DefaultGuest address * Update tests.yml (#51) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#52) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#55) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#56) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Corban Riley commit e7b277e79c7fe27c3cb129627d9f70e5bea9a25c Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 31 00:17:52 2025 +0700 Revise security policy for reporting vulnerabilities (#173) * Revise security policy for reporting vulnerabilities Updated contact information for vulnerability reporting. https://github.com/Dargon789/sequence.js/commit/e90b2e6395fb14c6463a02e88f65dc23ce455d6d Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 70208b1b85034bada6c5f8f858cc11bfd1a11241 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:50:23 2025 +0700 Potential fix for code scanning alert no. 95: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4c696d0e57d8ec45057b111bfb551ab497d0f93a Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 30 21:47:34 2025 +0700 Potential fix for code scanning alert no. 94: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit c62e5ddc2818a6b0624d63be3089c5ad7d08bd72 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:42:22 2025 +0700 Bump happy-dom in the npm_and_yarn group across 1 directory (#167) Bumps the npm_and_yarn group with 1 update in the /wagmi-project directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 18.0.1 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v18.0.1...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit e13fe5a71769b6d325b9cc3185c4a0519205f7b1 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue Dec 30 21:19:24 2025 +0700 Bump the npm_and_yarn group across 2 directories with 4 updates (#161) Bumps the npm_and_yarn group with 1 update in the / directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Bumps the npm_and_yarn group with 1 update in the /packages/0xsequence directory: [webpack-dev-server](https://github.com/webpack/webpack-dev-server). Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) Updates `http-proxy-middleware` from 0.19.1 to 2.0.9 - [Release notes](https://github.com/chimurai/http-proxy-middleware/releases) - [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md) - [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v0.19.1...v2.0.9) Updates `micromatch` from 3.1.10 to 4.0.8 - [Release notes](https://github.com/micromatch/micromatch/releases) - [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/micromatch/compare/3.1.10...4.0.8) Updates `on-headers` from 1.0.2 to 1.1.0 - [Release notes](https://github.com/jshttp/on-headers/releases) - [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md) - [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0) Updates `webpack-dev-server` from 3.11.3 to 5.2.1 - [Release notes](https://github.com/webpack/webpack-dev-server/releases) - [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.3...v5.2.1) --- updated-dependencies: - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: http-proxy-middleware dependency-version: 2.0.9 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: micromatch dependency-version: 4.0.8 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: on-headers dependency-version: 1.1.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: webpack-dev-server dependency-version: 5.2.1 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit b9d25688cb184f4b5ec1d0aba07bd36351efc65b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 15:35:25 2025 +0700 Update CNAME to new domain (#164) sequence.app Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 4a81a2c4338191c93915c3101f3c24f0c468ae03 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 14:08:44 2025 +0700 Proto (#163) * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts --------- Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> commit c4d0fdc33cd1ccf9cfc996b351959ae4d004a7e6 Merge: 7c547fcdd 269972a1d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 13:38:33 2025 +0700 Merge branch 'master' of https://github.com/Dargon789/sequence.js commit 269972a1dad423f67c0262149e46e7d8b3c3b10d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Mon Dec 29 09:58:04 2025 +0700 fix: package.json to reduce vulnerabilities (#157) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 - https://snyk.io/vuln/SNYK-JS-TMP-11501554 Co-authored-by: snyk-bot commit 7c547fcdd75774e39120241d16bf64c86e243355 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat Dec 27 02:34:25 2025 +0700 Bump the npm_and_yarn group across 4 directories with 7 updates (#144) Bumps the npm_and_yarn group with 4 updates in the /wagmi-project directory: [next](https://github.com/vercel/next.js), [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite), [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk) and [nuxt](https://github.com/nuxt/nuxt/tree/HEAD/packages/nuxt). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/connectors directory: [@metamask/sdk](https://github.com/MetaMask/metamask-sdk/tree/HEAD/packages/sdk). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/packages/create-wagmi/templates/next directory: [next](https://github.com/vercel/next.js). Bumps the npm_and_yarn group with 1 update in the /wagmi-project/playgrounds/next directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `happy-dom` from 15.10.2 to 18.0.1 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v15.10.2...v18.0.1) Updates `vite` from 5.4.19 to 5.4.21 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.4.21/packages/vite) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `nuxt` from 3.16.0 to 3.19.0 - [Release notes](https://github.com/nuxt/nuxt/releases) - [Commits](https://github.com/nuxt/nuxt/commits/v3.19.0/packages/nuxt) Updates `@nuxt/devtools` from 2.4.1 to 2.7.0 - [Release notes](https://github.com/nuxt/devtools/releases) - [Changelog](https://github.com/nuxt/devtools/blob/main/CHANGELOG.md) - [Commits](https://github.com/nuxt/devtools/commits/v2.7.0/packages/devtools) Updates `devalue` from 5.1.1 to 5.6.1 - [Release notes](https://github.com/sveltejs/devalue/releases) - [Changelog](https://github.com/sveltejs/devalue/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/devalue/compare/v5.1.1...v5.6.1) Updates `@metamask/sdk` from 0.32.1 to 0.33.1 - [Release notes](https://github.com/MetaMask/metamask-sdk/releases) - [Changelog](https://github.com/MetaMask/metamask-sdk/blob/main/packages/sdk/CHANGELOG.md) - [Commits](https://github.com/MetaMask/metamask-sdk/commits/@metamask/sdk@0.33.1/packages/sdk) Updates `next` from 15.2.4 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) Updates `next` from 15.3.3 to 15.4.10 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.3.3...v15.4.10) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 18.0.1 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 5.4.21 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: nuxt dependency-version: 3.19.0 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: "@nuxt/devtools" dependency-version: 2.7.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: devalue dependency-version: 5.6.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: "@metamask/sdk" dependency-version: 0.33.1 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: next dependency-version: 15.4.10 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 977998758f93df492849cb55e7208864677515ef Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Sat Dec 27 02:10:27 2025 +0700 Update GitHub Actions workflow for tests (#149) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 9c420a789831c3affe0881d732bb95bd2bb075db Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 04:55:34 2025 +0700 Revise README structure and add sponsorship details (#146) * Revise README structure and add sponsorship details Updated README to include new sections and sponsorship information. https://sequence.xyz/ Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 224f7612cd574849b75e17056859f0a208a24aa1 Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Fri Dec 26 03:19:19 2025 +0700 sequence-core-1.0.0 commit e90b2e6395fb14c6463a02e88f65dc23ce455d6d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Thu Dec 25 14:15:53 2025 +0700 Initial project structure and core packages Add initial monorepo structure for wagmi-project, including CLI, connectors, and core packages with source code, tests, configuration, and CI/CD workflows. This sets up the foundation for further development and collaboration. commit 1f452493d6ac5f23e20def94b7edf207bc2ce40a Author: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Date: Wed Dec 24 21:11:40 2025 +0700 fix: extras/web/package.json to reduce vulnerabilities (#117) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> commit 8bad845d94b7ca97a1d01a255eb8b41357eaf38d Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Wed Dec 24 19:35:49 2025 +0700 feat: upgrade react from 18.3.1 to 19.2.0 (#121) Snyk has created this PR to upgrade react from 18.3.1 to 19.2.0. See this package in npm: react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot commit 5e6dca3ce44d2e8d5b00b1182ba9d6eae7855b23 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:23:47 2025 +0700 Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) (#135) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> commit 802829cc116d9656dfb166beba03a1e77c8d556b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 21:15:56 2025 +0700 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot commit 893eedbb1a99db6736a157fed7d73a0196f30778 Merge: bc418b171 7fe4a922d Author: dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:50:09 2025 +0700 Merge remote-tracking branch 'origin/v1' into v1 commit 7fe4a922dfbd817fa76b8e30e9be184e6f38ddb1 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:16:10 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 640be8ffe175c762828aded47cc76e8d2c404b56 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:48 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 51a64321d3c0b91c9bd43c1e7e693f974c045dbb Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:15:24 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit 28a268eef9f36a4bcf257d175c49c31f55f8008b Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 18:14:59 2025 +0700 Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> commit bc418b171da95091d834f3a21141780169818db3 Author: Dargon789 <64915515+Dargon789@users.noreply.github.com> Date: Tue Dec 23 00:27:24 2025 +0700 Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Mona… * feat(dapp-client): cache signed calls from fee options * Add new userdata client (#954) * Fix build error * 3.0.0-beta.10 * fix(dapp-client): remove _refreshExplicitSession use that causes blocked pop up * 3.0.0-beta.12 * fix: extras/docs/package.json to reduce vulnerabilities (#250) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-15104645 - https://snyk.io/vuln/SNYK-JS-NEXT-15105315 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#251) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-15104645 - https://snyk.io/vuln/SNYK-JS-NEXT-15105315 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * 0xsequence 1.9.19 (#253) * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * [Snyk] Upgrade @tanstack/react-query from 5.64.2 to 5.90.11 (#125) * fix: upgrade @tanstack/react-query from 5.64.2 to 5.90.11 Snyk has created this PR to upgrade @tanstack/react-query from 5.64.2 to 5.90.11. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * feat: upgrade vite from 5.4.21 to 7.2.4 (#124) Snyk has created this PR to upgrade vite from 5.4.21 to 7.2.4. See this package in npm: vite See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * feat: upgrade wagmi from 0.12.19 to 3.0.2 (#123) Snyk has created this PR to upgrade wagmi from 0.12.19 to 3.0.2. See this package in npm: wagmi See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * feat: upgrade react-dom from 18.3.1 to 19.2.0 (#122) Snyk has created this PR to upgrade react-dom from 18.3.1 to 19.2.0. See this package in npm: react-dom See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#136) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * [Snyk] Upgrade @types/react from 18.3.27 to 19.2.7 (#127) * feat: upgrade @types/react from 18.3.27 to 19.2.7 Snyk has created this PR to upgrade @types/react from 18.3.27 to 19.2.7. See this package in npm: @types/react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/main.tsx Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#116) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanu… * Vercel/react server components CVE vu qan1bu (#256) * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * 0xsequence/master (#79) * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update .github/ISSUE_TEMPLATE/bug_report.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .github/ISSUE_TEMPLATE/feature_request.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update tests.yml (#82) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update App.tsx (#92) Summary by Sourcery Overhaul App.tsx to build a comprehensive Sequence Wallet demo application, replacing wagmi with Sequence SDK integration, adding environment/configuration management, rich wallet operations, and a structured UI with console output for interactive testing New Features: Replace wagmi-based hooks with @0xsequence wallet initialization and integration Add environment selection and dynamic wallet URLs via query parameters Implement connect, disconnect, open/close wallet and customizable connection settings Provide extensive demo actions including chain/network switching, account/balance queries, message signing, typed data signing, and transaction sending Introduce a console component and logging for viewing function outputs Add email-based auto-login via modal with validation Enhancements: Refactor UI to use design-system components and group actions thematically Initialize logger and configure default chain/network Memoize and listen to wallet events such as chain changes Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * [Snyk] Upgrade @tanstack/react-query from 5.64.2 to 5.90.11 (#125) * fix: upgrade @tanstack/react-query from 5.64.2 to 5.90.11 Snyk has created this PR to upgrade @tanstack/react-query from 5.64.2 to 5.90.11. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * feat: upgrade vite from 5.4.21 to 7.2.4 (#124) Snyk has created this PR to upgrade vite from 5.4.21 to 7.2.4. See this package in npm: vite See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * feat: upgrade wagmi from 0.12.19 to 3.0.2 (#123) Snyk has created this PR to upgrade wagmi from 0.12.19 to 3.0.2. See this package in npm: wagmi See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * feat: upgrade react-dom from 18.3.1 to 19.2.0 (#122) Snyk has created this PR to upgrade react-dom from 18.3.1 to 19.2.0. See this package in npm: react-dom See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#136) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * [Snyk] Upgrade @types/react from 18.3.27 to 19.2.7 (#127) * feat: upgrade @types/react from 18.3.27 to 19.2.7 Snyk has created this PR to upgrade @types/react from 18.3.27 to 19.2.7. See this package in npm: @types/react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/main.tsx Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#116) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0… * Potential fix for code scanning alert no. 83: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * extras docs extras\docs\next-env.d.ts * Update publish-dists.yml * Codesandbox (#258) * 0xsequence 1.9.19 (#253) * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * [AUTOMATED] Update: proto/clients/indexer*.gen.ts * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * [Snyk] Upgrade @tanstack/react-query from 5.64.2 to 5.90.11 (#125) * fix: upgrade @tanstack/react-query from 5.64.2 to 5.90.11 Snyk has created this PR to upgrade @tanstack/react-query from 5.64.2 to 5.90.11. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * feat: upgrade vite from 5.4.21 to 7.2.4 (#124) Snyk has created this PR to upgrade vite from 5.4.21 to 7.2.4. See this package in npm: vite See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * feat: upgrade wagmi from 0.12.19 to 3.0.2 (#123) Snyk has created this PR to upgrade wagmi from 0.12.19 to 3.0.2. See this package in npm: wagmi See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * feat: upgrade react-dom from 18.3.1 to 19.2.0 (#122) Snyk has created this PR to upgrade react-dom from 18.3.1 to 19.2.0. See this package in npm: react-dom See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#136) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * [Snyk] Upgrade @types/react from 18.3.27 to 19.2.7 (#127) * feat: upgrade @types/react from 18.3.27 to 19.2.7 Snyk has created this PR to upgrade @types/react from 18.3.27 to 19.2.7. See this package in npm: @types/react See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Master ceb95d4 (#129) * Update issue templates (#128) * Bump the npm_and_yarn group across 1 directory with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [express](https://github.com/expressjs/express). Updates `express` from 4.18.2 to 4.19.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: direct:development dependency-group: npm_and_yarn-security-group ... Signed-off-by: dependabot[bot] * Create SECURITY.md * Set up CI with Azure Pipelines [skip ci] * Create CNAME * Create fortify.yml * Update issue templates * Update CNAME * fix: upgrade @tanstack/react-query from 5.45.1 to 5.64.2 Snyk has created this PR to upgrade @tanstack/react-query from 5.45.1 to 5.64.2. See this package in npm: @tanstack/react-query See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr * Create config.yml (#46) Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Update fortify.yml Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/main.tsx Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#116) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Michael Standen Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Tolgahan Arikan Co-authored-by: Taylan Pince Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Agusx1211 Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 2.3.7 (#131) (#132) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta… * 0xsequence/sequence.js/master (#255) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create solidity-files-cache.json --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * 0xsequence/master (#270) * 2.3.7 (#131) * fix broken guard private key * Expose access to passkey credential list * Dapp client direct txn request (#856) * Signature request refactor * WIP * Refactor * Update dapp-client exports (#858) * Add hasPermission method to DappClient (#859) * Save discovered passkey credentials upon login * Expose name property in PasskeySignupArgs * Fix blacklist sort * Add multi server script * relayer: /SimulateV3 (#857) * Add await for handleOpenDB scheduleExpiration * Update increment to always include native once used * Fix session tests * Adding lastLoginAt to PasskeyCredential * LoginToPasskeyArgs now accept a credentialId which is used to specify which credential to use * Adding onSignatureRequestStatus function to register single use callbacks for when a request reaches a terminal state of completed or cancelled * When a login is cancelled we can remove the wallet which is logging-in * Add RC3 contracts * Sessions space restriction * Dedupe signers for encoding * Support RC3 sessions * Tightly increment call validation * CLI defaults to RC3 wallet code * Rc3 address test * Fix hashing tests * Add deprecated encoding test * wdk: throw errors from otp respond callback (#864) * wdk: throw errors from otp respond callback * wdk: otp auth error and handler refactor * Handle guard 2FA (#861) * guard: return a specific error when auth required * core: pass guard token to the service * wdk: handle prompting for guard 2FA code * dapp-client: handle prompting for guard 2FA code * guard 2fa tests * wdk: separate wallet and sessions guards * dapp-client: remove guard 2fa * dapp-client: fix imports * fix guard tests * wdk: remove unneeded promise resolve * Update relayer and api gen.ts, force public packages * Add standalone fetch queued payloads * Replacing GuardRole enum with string union type, as well as replacing guardAddresses Map with Record * Fallback to chain for non-logged in recovery * Add Katana, Sandbox Tesnet, Incentiv Testnet v2 (#873) * Update a few remaining dev1 contract addresses to rc3 (#874) * Remove unnecessary console.error where we already throw error * Improve DappClient hasPermission method * Wallet db try checksum and lowercase * Update dapp client json utils to include Map reviver and replacer * Bump next in the npm_and_yarn group across 1 directory Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.4.2 to 15.4.7 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.4.2...v15.4.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.4.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Update type name, update exports for dapp client * Expired explicit sessions can't sign * Improve session validity test * session isValid returns invalid reason * InvalidReason is typed * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Update issue templates * Provider sent to prepareBlankEnvelope * Add session signature decoding * Add feeTokens endpoint to relayer (#885) * const for node length * Clearer blacklist size encoding * identity signer node length * Potential fix for code scanning alert no. 84: Insecure randomness Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) Updates `happy-dom` from 17.6.3 to 20.0.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.0) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.0 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Bump happy-dom in the npm_and_yarn group across 1 directory (#69) Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 20.0.0 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v20.0.0...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Create SECURITY.md for security policy (#70) * Create SECURITY.md for security policy Add a security policy document outlining supported versions and vulnerability reporting. Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Bump the npm_and_yarn group across 3 directories with 1 update Bumps the npm_and_yarn group with 1 update in the / directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/dapp-client directory: [happy-dom](https://github.com/capricorn86/happy-dom). Bumps the npm_and_yarn group with 1 update in the /packages/wallet/wdk directory: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) Updates `happy-dom` from 17.6.3 to 20.0.2 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.2) --- updated-dependencies: - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.2 dependency-type: direct:development dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Update SECURITY.md Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/dapp-client/src/DappTransport.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/src/App.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create FUNDING.json (#90) Enhancements: Include FUNDING.json to display GitHub sponsorship options in the repository Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create config.yml (#91) Add initial CircleCI configuration to enable automated builds using a custom Docker executor and a defined workflow. Build: Add .circleci/config.yml with version 2.1 specification and custom Docker executor. CI: Define web3-defi-game-project job with checkout step. Set up my-custom-workflow to run the job. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * SSR safety test * Fix CI job * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update api.gen.ts * Update metadata.gen.ts * Update marketplace.gen.ts * Update guard.gen.ts * Support multiple identity signers in sessions configuration * Device signers can approve implicit sessions * Remove invalid test * Fix recursion * Fix comment * Improve test stability by reducing race conditions * Do not set passkey signer as identity signer * Use length checks * Throw on missing identity signer * Encoding requires identity signer to encode * Fix test * Refactor/types namings tsdoc redundant code (#880) * refactor types, namings, ts doc * fix session response payload * change parameter name * change parameter name * change type in tests * improve types and dapp client methods * fix session test to use new types * refactor * refactor implicit sessions array in chain session manager * remove unused types * remove unused types and add ConnectionError * update pnpm lock * move reusable session types to wallet-core * Update some imports and update some response type names --------- Co-authored-by: Tolgahan Arikan * Fix check for explicit session for the updated type in dapp-client * Update api.gen.ts and relayer.gen.ts * Add missing chainId for dapp client event * Fix initializing new chain session manager on redirect * Add support for non-viem, custom Sequence chains (#882) * Provider sent to prepareBlankEnvelope * Add session signature decoding * const for node length * Clearer blacklist size encoding * identity signer node length * Add feeTokens endpoint to relayer (#885) * add getFeeTokens to dapp client (#889) * add getFeeTokens to dapp client * fix typo * make getFeeTokens independent of chain session manager and initialize state (#890) * make getFeeTokens independent of chain session manager and initialized state * remove getFeeTokens from chain session manager * Throw specific error when trying to sign with an expired session (#887) * Throw when supported session signer is expired * Fix tests * Make dapp-client implicit sessions chain agnostic (#893) * Add Monad, remove LAOS and Root Network * Add support for sessionless dapp connection (#896) * Refactor relayer package & update dependant packages (#891) * refactor exports for relayer (#900) * Add Arc Testnet * Fix changelog config * Sessionless connection upgrade and error handling in DappClient (#902) * dapp-client: add sessionless snapshot restore flow * Allow to logout a wallet with skipRemoveDevice even if the wallet is not in a ready state to allow force removing of wallets (#906) * Pass request to PromptCodeHandler in guard registerUI (#909) * Pass request to PromptCodeHandler in guard registerUI * Fixing guard registerUI test * guard: allow using recovery code as 2FA token (#910) * guard: allow using recovery code as 2FA token * Cleanup types of ResponseFn --------- Co-authored-by: Corban Riley * Add a way to reset 2fa when using a backup code (#911) * Add a way to reset 2fa when using a backup code * use the GuardToken type instead of breaking out the props * Add rc4 contracts * Set rc4 as default and add it to lists * Session enhanced replay protection * New sessions replay protection hashes payload * Use the 4337 factory wrapper * Update keymachine url in dapp-client constants * Update keymachine url in Provider constructor * SSR safety (#915) * Guard dapp-client for SSR (lazy transport, browser checks, gated storage) * Fix guard topology (#918) * Use proper guard topology * Test and fixes * login and setup tests * Switch prod manager settings (#917) * Add prod guard and identity instrument info * Remove completed TODOs * Small JS tweaks (#919) * Fix type exports to built declarations * Update repository links to current package paths * Improve Next app tooling and React typings * Expose primitives CLI bin and use base lint config * Update relayer.gen.ts and TransactionPrecondition interface * Update relayer.gen.ts and TransactionPrecondition interface (#920) * 3.0.0-beta.1 * identity-instrument: generate nonce from current time (#921) * Remove publish-dists.yml github action (#923) * 3.0.0-beta.2 * Clean up changeset config * Improve test stability by removing race conditions * Ensure build before test * Updating happy-dom to 20.0.10 (#926) * Add support for custom auth providers (authcode & authcode-pkce only) (#894) * Add support for custom auth providers (authcode & authcode-pkce only) * fix authcode tests * Updating Deps November 2025 (#927) * Updating deps for the workspace root * Updating deps for wallet/wdk * Fixing sessions test for latest vitest * Lets not upgrade to the latest typescript quite yet * Updating to latest vitest * Updating deps for wallet/core * Updating deps for wallet/primitives-cli * Updating deps for wallet/dapp-client * Adding syncpack to check for dep version inconsistencies * Setup syncpack versionGroups for pnpm workspace:^ * Fixing dep versions mismatches * Fixing @types/node mismatches * Adding syncpack to pre commit hook * Remove the syncpack format script. * Update ox to v9.17.0 (#928) * Upgrading ox to 9.17.0 * WrappedSignature renamed to SignatureErc6492 * Fixing PasskeySignatureValidator interface * Lock ox lib dep to use the same version with pnpm overrides and update viem to latest * Fix explicitSessionRequested check in dapp client * Typescript 5.9.3 (#930) * Upgrading to typescript v5.9.3 * Fix type errors that arose from typescript upgrade related to Bytes and Buffer source typings. * Don't catch errors thrown by Guard 2FA or reject early to allow multiple attempts on incorrect TOTP (#931) * Update pnpm * Mark @0xsequence/wallet-primitives-cli as private * 3.0.0-beta.3 * changeset cleanup * Fix rc4 4337 factory (#933) * Add rc5 and set it as default (#934) * 3.0.0-beta.4 * Update SECURITY.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update wagmi-project/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Bump next from 15.5.5 to 15.5.7 (#936) Bumps [next](https://github.com/vercel/next.js) from 15.5.5 to 15.5.7. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.7) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * add userdata service client (#940) * Skip LocalDevice identity signers not on current device (#942) * Skip LocalDevice identity signers not on current device * Update log * 3.0.0-beta.5 * Update config.yml (#102) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * Update config.yml (#103) * Update config.yml Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .circleci/config.yml Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#101) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: extras/docs/package.json to reduce vulnerabilities (#100) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * fix: package.json to reduce vulnerabilities (#104) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-BABELHELPERS-9397697 - https://snyk.io/vuln/SNYK-JS-BABELRUNTIME-10044504 - https://snyk.io/vuln/SNYK-JS-BRACEEXPANSION-9789073 - https://snyk.io/vuln/SNYK-JS-CROSSSPAWN-8303230 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577916 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577917 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-7577918 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8187303 - https://snyk.io/vuln/SNYK-JS-ELLIPTIC-8720086 - https://snyk.io/vuln/SNYK-JS-IMAGESIZE-9634164 - https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116 - https://snyk.io/vuln/SNYK-JS-JSYAML-13961110 - https://snyk.io/vuln/SNYK-JS-MICROMATCH-6838728 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14114940 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125097 - https://snyk.io/vuln/SNYK-JS-NODEFORGE-14125745 - https://snyk.io/vuln/SNYK-JS-ONHEADERS-10773729 - https://snyk.io/vuln/SNYK-JS-ROLLUP-8073097 - https://snyk.io/vuln/SNYK-JS-SECP256K1-8237220 - https://snyk.io/vuln/SNYK-JS-SEND-7926862 - https://snyk.io/vuln/SNYK-JS-SERVESTATIC-7926865 - https://snyk.io/vuln/SNYK-JS-SHAJS-12089400 Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> * Revert "Merge remote-tracking branch 'origin/dependabot/npm_and_yarn/npm_and_yarn-318c02e2da'" This reverts commit fd0fdf9ecc6ad9056447e381de7fc5bb19f78e47, reversing changes made to cba78943db9942a4635bb530b7a43fc5d18b0ab4. * fix: extras/web/package.json to reduce vulnerabilities (#109) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14173355 Co-authored-by: snyk-bot * fix: extras/docs/package.json to reduce vulnerabilities (#106) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump next in the npm_and_yarn group across 1 directory (#110) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.7 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Delete .github/workflows/fortify.yml (#111) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * fix: extras/web/package.json to reduce vulnerabilities (#107) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JS-NEXT-14400636 - https://snyk.io/vuln/SNYK-JS-NEXT-14400644 Co-authored-by: snyk-bot * Bump the npm_and_yarn group across 1 directory with 3 updates (#115) Bumps the npm_and_yarn group with 1 update in the / directory: [next](https://github.com/vercel/next.js). Updates `next` from 15.5.5 to 15.5.9 - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.5...v15.5.9) Updates `happy-dom` from 17.6.3 to 20.0.11 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v17.6.3...v20.0.11) Updates `vite` from 7.1.10 to 7.2.7 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.2.7/packages/vite) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production dependency-group: npm_and_yarn - dependency-name: happy-dom dependency-version: 20.0.11 dependency-type: direct:development dependency-group: npm_and_yarn - dependency-name: vite dependency-version: 7.2.7 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 * Update tests.yml (#119) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update config.yml (#120) Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/services/identity-instrument/src/index.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * feat: upgrade @wagmi/cli from 0.1.15 to 2.8.0 (#126) Snyk has created this PR to upgrade @wagmi/cli from 0.1.15 to 2.8.0. See this package in npm: @wagmi/cli See this project in Snyk: https://app.snyk.io/org/dargon789/project/bb845543-cbee-4e11-8cf9-8bfdf9205bf1?utm_source=github&utm_medium=referral&page=upgrade-pr Co-authored-by: snyk-bot * Potential fix for code scanning alert no. 82: Workflow does not contain permissions Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 62: Information exposure through a stack trace Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * Update extras/docs/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update extras/web/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * 0xsequence-1.9.19 # 0xsequence-#1.9.19 * Update packages/0xsequence/tests/browser/wallet-provider/dapp.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/auth/src/session.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update tests.yml (#187) https://github.com/Dargon789/sequence.js/commit/ea7e889bdca6ab92991b03a34eb3e2002806b5a5 Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 61: Cross-window communication with unrestricted target origin Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/deployer/src/UniversalDeployer.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Corban Riley Co-authored-by: tolgahan-arikan Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: Michael Standen Co-authored-by: Patryk Kalinowski Co-authored-by: Taylan Pince Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot * @0xsequence 2.3.8 wagmi-project - 0xsequence Demo Dapp Sequence Wallet is an Ethereum wallet supporting Ethereum mainnet, Polygon and more. Sequence will work * @0xsequence v3 SDK update submodule signals-implicit-mode @0xsequence * 0xsequence/sequence.js/master (#275) * Pin foundry to v1.5.0 instead of nightly (0xsequence#947) (#134) * Bump next from 15.5.7 to 15.5.9 (#944) Bumps [next](https://github.com/vercel/next.js) from 15.5.7 to 15.5.9. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v15.5.7...v15.5.9) --- updated-dependencies: - dependency-name: next dependency-version: 15.5.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Pin foundry to v1.5.0 instead of nightly (#947) * Include repo and extras in syncpack config to ensure deps are synced (#945) * Include repo and extras in syncpack config to ensure deps are synced across all * Updating support deps * Updating deps * Updating pnpm lock * Fixing type errors within wdk tests * Short circuit 404s (#949) * skip witness on signers that don't support it * add passkey to test * 3.0.0-beta.6 --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update packages/wallet/wdk/test/wallets.test.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Create solidity-files-cache.json * Delete .circleci directory (#267) CI: Delete obsolete .circleci/config.yml to fully remove CircleCI configuration from the project. Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: Corban Riley Co-authored-by: Agusx1211 Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * submodule lib/signals-implicit-mode submodule lib/signals-implicit-mode * Potential fix for code scanning alert no. 61: Cross-window communication with unrestricted target origin Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Potential fix for code scanning alert no. 121: Cross-window communication with unrestricted target origin Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .codesandbox/README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .codesandbox/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .codesandbox/package.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> * Update .codesandbox/tsconfig.json Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> --------- Signed-off-by: Dargon789 <64915515+Dargon789@users.noreply.github.com> Signed-off-by: dependabot[bot] Signed-off-by: AU_gdev_19 <64915515+Dargon789@users.noreply.github.com> Co-authored-by: Taylan Pince Co-authored-by: tolgahan-arikan Co-authored-by: Gabi <56271768+VGabriel45@users.noreply.github.com> Co-authored-by: Corban Brook Co-authored-by: Patryk Kalinowski Co-authored-by: Agusx1211 Co-authored-by: Michael Standen Co-authored-by: marino39 <722509+marino39@users.noreply.github.com> Co-authored-by: pkieltyka <18831+pkieltyka@users.noreply.github.com> Co-authored-by: xiam <385670+xiam@users.noreply.github.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> Co-authored-by: snyk-io[bot] <141718529+snyk-io[bot]@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: Patryk Kalinowski Co-authored-by: Michael Standen Co-authored-by: William Hua Co-authored-by: spongeboi Co-authored-by: vercel[bot] <35613825+vercel[bot]@users.noreply.github.com> Co-authored-by: Vercel Co-authored-by: Ahmet Buğra Yiğiter --- .changeset/README.md | 2 +- .changeset/bright-pots-hope.md | 18 + .changeset/crisp-zoos-retire.md | 18 + .changeset/cyan-radios-relax.md | 18 + .changeset/free-tips-switch.md | 18 + .changeset/goofy-laws-serve.md | 21 + .changeset/new-turkeys-double.md | 18 + .changeset/nice-tips-slide.md | 18 + .changeset/open-toes-marry.md | 20 + .changeset/plain-feet-stare.md | 17 + .changeset/pre.json | 39 + .changeset/tiny-files-chew.md | 18 + .changeset/wild-feet-carry.md | 17 + .changeset/wise-heads-buy.md | 17 + .codesandbox/.github/workflows/build.yml | 32 + .codesandbox/.gitignore | 19 + .codesandbox/.prettierrc | 9 + .codesandbox/README.md | 49 + .codesandbox/index.html | 35 + .codesandbox/package.json | 60 + .codesandbox/pnpm-lock.yaml | 4111 + .codesandbox/public/favicon.ico | Bin 0 -> 1068 bytes .codesandbox/public/logo192.png | Bin 0 -> 16795 bytes .codesandbox/public/logo512.png | Bin 0 -> 159929 bytes .codesandbox/public/manifest.json | 25 + .codesandbox/public/robots.txt | 3 + .codesandbox/screenshots/screen-open.png | Bin 0 -> 90533 bytes .codesandbox/screenshots/screen-txn.png | Bin 0 -> 92730 bytes .codesandbox/src/App.tsx | 1348 + .codesandbox/src/README.md | 49 + .codesandbox/src/components/Console/index.tsx | 37 + .../src/components/Console/styles.css.ts | 11 + .codesandbox/src/components/Group/index.tsx | 42 + .../src/components/Group/styles.css.ts | 17 + .codesandbox/src/constants/abi.ts | 64 + .codesandbox/src/helpers.ts | 17 + .codesandbox/src/images/logo.svg | 61 + .../src/images/skyweaver-banner-large.png | Bin 0 -> 282630 bytes .../src/images/skyweaver-banner.old.png | Bin 0 -> 211421 bytes .codesandbox/src/images/skyweaver-banner.png | Bin 0 -> 668492 bytes .codesandbox/src/index.css | 9 + .codesandbox/src/index.tsx | 17 + .codesandbox/src/react-app-env.d.ts | 1 + .codesandbox/src/vite-env.d.ts | 1 + .codesandbox/tasks.json | 118 + .codesandbox/tsconfig.json | 27 + ...e_moduleszS@preconstructzSclizSbin.js.BLOB | Bin 0 -> 1584680 bytes ...e_moduleszS@preconstructzSclizSbin.js.BLOB | Bin 0 -> 1583672 bytes .codesandbox/vite.config.ts | 21 + .eslintignore | 2 + .eslintrc.js | 48 + .github/ISSUE_TEMPLATE/bug_report.md | 40 + .github/ISSUE_TEMPLATE/custom.md | 7 + .github/ISSUE_TEMPLATE/feature_request.md | 19 + .../actions/install-dependencies/action.yml | 16 +- .../{publish-dists.yml => Publish-Dists.yml} | 11 +- .github/workflows/fortify.yml | 85 + .github/workflows/nextjs.yml | 93 + .github/workflows/on_pr_pnpm-format-label.yml | 3 + .github/workflows/tests.yml | 5 +- .github/workflows/web-sdk.yml | 137 + .gitmodules | 54 + .nycrc | 26 + CNAME | 1 + FUNDING.json | 10 + SECURITY.md | 20 + azure-pipelines.yml | 21 + babel.config.js | 19 + extras/docs/next-env.d.ts | 6 + extras/docs/package.json | 2 +- extras/web/next-env.d.ts | 6 + extras/web/package.json | 2 +- foundry.lock | 68 + foundry.toml | 10 + lib/signals-implicit-mode/.env.sample | 1 + lib/signals-implicit-mode/.gas-snapshot | 35 + .../.github/workflows/test.yml | 56 + lib/signals-implicit-mode/.gitmodules | 9 + lib/signals-implicit-mode/README.md | 84 + .../Deploy.s.sol/1/run-1770363485985.json | 58 + .../Deploy.s.sol/1/run-1770364554426.json | 58 + .../broadcast/Deploy.s.sol/1/run-latest.json | 58 + .../Deploy.s.sol/1/run-1770363485985.json | 7 + .../Deploy.s.sol/1/run-1770364554426.json | 7 + .../cache/Deploy.s.sol/1/run-latest.json | 7 + .../cache/solidity-files-cache.json | 1 + .../forge-std-1.14.0/.github/CODEOWNERS | 1 + .../forge-std-1.14.0/.github/dependabot.yml | 6 + .../forge-std-1.14.0/.github/workflows/ci.yml | 125 + .../.github/workflows/sync.yml | 36 + .../dependencies/forge-std-1.14.0/.gitignore | 4 + .../forge-std-1.14.0/CONTRIBUTING.md | 193 + .../forge-std-1.14.0/LICENSE-APACHE | 203 + .../dependencies/forge-std-1.14.0/LICENSE-MIT | 25 + .../dependencies/forge-std-1.14.0/README.md | 268 + .../forge-std-1.14.0/RELEASE_CHECKLIST.md | 12 + .../forge-std-1.14.0/scripts/vm.py | 636 + .../forge-std-1.14.0/src/Base.sol | 48 + .../forge-std-1.14.0/src/Config.sol | 60 + .../forge-std-1.14.0/src/LibVariable.sol | 477 + .../forge-std-1.14.0/src/Script.sol | 28 + .../forge-std-1.14.0/src/StdAssertions.sol | 779 + .../forge-std-1.14.0/src/StdChains.sol | 295 + .../forge-std-1.14.0/src/StdCheats.sol | 825 + .../forge-std-1.14.0/src/StdConfig.sol | 632 + .../forge-std-1.14.0/src/StdConstants.sol | 30 + .../forge-std-1.14.0/src/StdError.sol | 15 + .../forge-std-1.14.0/src/StdInvariant.sol | 120 + .../forge-std-1.14.0/src/StdJson.sol | 275 + .../forge-std-1.14.0/src/StdMath.sol | 47 + .../forge-std-1.14.0/src/StdStorage.sol | 475 + .../forge-std-1.14.0/src/StdStyle.sol | 333 + .../forge-std-1.14.0/src/StdToml.sol | 275 + .../forge-std-1.14.0/src/StdUtils.sol | 200 + .../forge-std-1.14.0/src/Test.sol | 32 + .../dependencies/forge-std-1.14.0/src/Vm.sol | 2500 + .../forge-std-1.14.0/src/console.sol | 1551 + .../forge-std-1.14.0/src/console2.sol | 4 + .../src/interfaces/IERC1155.sol | 105 + .../src/interfaces/IERC165.sol | 12 + .../src/interfaces/IERC20.sol | 43 + .../src/interfaces/IERC4626.sol | 190 + .../src/interfaces/IERC6909.sol | 72 + .../src/interfaces/IERC721.sol | 164 + .../src/interfaces/IERC7540.sol | 144 + .../src/interfaces/IERC7575.sol | 241 + .../src/interfaces/IMulticall3.sol | 68 + .../forge-std-1.14.0/src/safeconsole.sol | 13248 +++ .../forge-std-1.14.0/test/CommonBase.t.sol | 44 + .../forge-std-1.14.0/test/Config.t.sol | 381 + .../forge-std-1.14.0/test/LibVariable.t.sol | 452 + .../forge-std-1.14.0/test/StdAssertions.t.sol | 141 + .../forge-std-1.14.0/test/StdChains.t.sol | 227 + .../forge-std-1.14.0/test/StdCheats.t.sol | 638 + .../forge-std-1.14.0/test/StdConstants.t.sol | 38 + .../forge-std-1.14.0/test/StdError.t.sol | 119 + .../forge-std-1.14.0/test/StdJson.t.sol | 49 + .../forge-std-1.14.0/test/StdMath.t.sol | 202 + .../forge-std-1.14.0/test/StdStorage.t.sol | 485 + .../forge-std-1.14.0/test/StdStyle.t.sol | 110 + .../forge-std-1.14.0/test/StdToml.t.sol | 49 + .../forge-std-1.14.0/test/StdUtils.t.sol | 342 + .../forge-std-1.14.0/test/Vm.t.sol | 18 + .../test/compilation/CompilationScript.sol | 8 + .../compilation/CompilationScriptBase.sol | 8 + .../test/compilation/CompilationTest.sol | 8 + .../test/compilation/CompilationTestBase.sol | 8 + .../test/fixtures/broadcast.log.json | 187 + .../test/fixtures/config.toml | 81 + .../forge-std-1.14.0/test/fixtures/test.json | 8 + .../forge-std-1.14.0/test/fixtures/test.toml | 6 + lib/signals-implicit-mode/foundry.lock | 1 + lib/signals-implicit-mode/foundry.toml | 25 + .../lib/forge-std/.gitattributes | 1 + .../lib/forge-std/.github/CODEOWNERS | 1 + .../lib/forge-std/.github/workflows/ci.yml | 95 + .../lib/forge-std/.github/workflows/sync.yml | 31 + .../lib/forge-std/CONTRIBUTING.md | 193 + .../lib/forge-std/LICENSE-APACHE | 203 + .../lib/forge-std/LICENSE-MIT | 25 + .../lib/forge-std/README.md | 268 + .../lib/forge-std/RELEASE_CHECKLIST.md | 12 + .../lib/forge-std/foundry.toml | 27 + .../lib/forge-std/package.json | 16 + .../lib/forge-std/scripts/vm.py | 646 + .../lib/forge-std/src/Base.sol | 48 + .../lib/forge-std/src/Config.sol | 60 + .../lib/forge-std/src/LibVariable.sol | 477 + .../lib/forge-std/src/Script.sol | 28 + .../lib/forge-std/src/StdAssertions.sol | 764 + .../lib/forge-std/src/StdChains.sol | 287 + .../lib/forge-std/src/StdCheats.sol | 829 + .../lib/forge-std/src/StdConfig.sol | 612 + .../lib/forge-std/src/StdConstants.sol | 30 + .../lib/forge-std/src/StdError.sol | 15 + .../lib/forge-std/src/StdInvariant.sol | 122 + .../lib/forge-std/src/StdJson.sol | 283 + .../lib/forge-std/src/StdMath.sol | 43 + .../lib/forge-std/src/StdStorage.sol | 473 + .../lib/forge-std/src/StdStyle.sol | 333 + .../lib/forge-std/src/StdToml.sol | 283 + .../lib/forge-std/src/StdUtils.sol | 208 + .../lib/forge-std/src/Test.sol | 34 + .../lib/forge-std/src/Vm.sol | 2494 + .../lib/forge-std/src/console.sol | 1560 + .../lib/forge-std/src/console2.sol | 4 + .../lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../lib/forge-std/src/interfaces/IERC165.sol | 12 + .../lib/forge-std/src/interfaces/IERC20.sol | 43 + .../lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../lib/forge-std/src/interfaces/IERC6909.sol | 72 + .../lib/forge-std/src/interfaces/IERC721.sol | 164 + .../lib/forge-std/src/interfaces/IERC7540.sol | 150 + .../lib/forge-std/src/interfaces/IERC7575.sol | 241 + .../forge-std/src/interfaces/IMulticall3.sol | 73 + .../lib/forge-std/src/safeconsole.sol | 13937 +++ .../lib/forge-std/test/CommonBase.t.sol | 44 + .../lib/forge-std/test/Config.t.sol | 352 + .../lib/forge-std/test/LibVariable.t.sol | 434 + .../lib/forge-std/test/StdAssertions.t.sol | 141 + .../lib/forge-std/test/StdChains.t.sol | 227 + .../lib/forge-std/test/StdCheats.t.sol | 639 + .../lib/forge-std/test/StdConstants.t.sol | 38 + .../lib/forge-std/test/StdError.t.sol | 120 + .../lib/forge-std/test/StdJson.t.sol | 49 + .../lib/forge-std/test/StdMath.t.sol | 202 + .../lib/forge-std/test/StdStorage.t.sol | 488 + .../lib/forge-std/test/StdStyle.t.sol | 110 + .../lib/forge-std/test/StdToml.t.sol | 49 + .../lib/forge-std/test/StdUtils.t.sol | 342 + .../lib/forge-std/test/Vm.t.sol | 18 + .../test/compilation/CompilationScript.sol | 10 + .../compilation/CompilationScriptBase.sol | 10 + .../test/compilation/CompilationTest.sol | 10 + .../test/compilation/CompilationTestBase.sol | 10 + .../test/fixtures/broadcast.log.json | 187 + .../lib/forge-std/test/fixtures/config.toml | 81 + .../lib/forge-std/test/fixtures/test.json | 8 + .../lib/forge-std/test/fixtures/test.toml | 6 + .../lib/sequence-v3/.env.sample | 7 + .../sequence-v3/.github/workflows/tests.yml | 148 + .../lib/sequence-v3/.gitmodules | 12 + .../lib/sequence-v3/.prettierignore | 4 + .../lib/sequence-v3/.prettierrc | 7 + .../lib/sequence-v3/LICENSE | 201 + .../lib/sequence-v3/README.md | 53 + .../lib/sequence-v3/build_proxy.sh | 21 + .../lib/sequence-v3/docs/CHAINED.md | 450 + .../lib/sequence-v3/docs/CONFIGURATIONS.md | 279 + .../lib/sequence-v3/docs/PAYLOAD.md | 392 + .../lib/sequence-v3/docs/SESSIONS.md | 502 + .../lib/sequence-v3/docs/SIGNATURE.md | 367 + .../lib/sequence-v3/foundry.toml | 31 + .../lib/sequence-v3/lefthook.yml | 8 + .../lib/account-abstraction/.eslintrc.js | 79 + .../.github/workflows/build.yml | 89 + .../lib/account-abstraction/.solcover.js | 8 + .../lib/account-abstraction/.solhint.json | 12 + .../lib/account-abstraction/.solhintignore | 1 + .../lib/account-abstraction/LICENSE | 674 + .../lib/account-abstraction/README.md | 11 + ...bstraction_Incremental_Audit_Feb_2023.pdf" | Bin 0 -> 565821 bytes .../contracts/core/BaseAccount.sol | 113 + .../contracts/core/BasePaymaster.sol | 151 + .../contracts/core/EntryPoint.sol | 800 + .../contracts/core/EntryPointSimulations.sol | 190 + .../contracts/core/Helpers.sol | 106 + .../contracts/core/NonceManager.sol | 43 + .../contracts/core/SenderCreator.sol | 38 + .../contracts/core/StakeManager.sol | 145 + .../contracts/core/UserOperationLib.sol | 139 + .../contracts/interfaces/IAccount.sol | 39 + .../contracts/interfaces/IAccountExecute.sol | 20 + .../contracts/interfaces/IAggregator.sol | 44 + .../contracts/interfaces/IEntryPoint.sol | 223 + .../interfaces/IEntryPointSimulations.sol | 73 + .../contracts/interfaces/INonceManager.sol | 27 + .../contracts/interfaces/IPaymaster.sol | 63 + .../contracts/interfaces/IStakeManager.sol | 111 + .../interfaces/PackedUserOperation.sol | 28 + .../contracts/package.json | 29 + .../samples/LegacyTokenPaymaster.sol | 115 + .../contracts/samples/SimpleAccount.sol | 150 + .../samples/SimpleAccountFactory.sol | 52 + .../contracts/samples/TokenPaymaster.sol | 217 + .../contracts/samples/VerifyingPaymaster.sol | 96 + .../contracts/samples/bls/BLSAccount.sol | 65 + .../samples/bls/BLSAccountFactory.sol | 61 + .../contracts/samples/bls/BLSHelper.sol | 232 + .../samples/bls/BLSSignatureAggregator.sol | 171 + .../contracts/samples/bls/IBLSAccount.sol | 16 + .../contracts/samples/bls/lib/BLSOpen.sol | 64 + .../hubble-contracts/contracts/libs/BLS.sol | 440 + .../contracts/libs/ModExp.sol | 652 + .../samples/callback/TokenCallbackHandler.sol | 51 + .../contracts/samples/utils/IOracle.sol | 10 + .../contracts/samples/utils/OracleHelper.sol | 170 + .../contracts/samples/utils/UniswapHelper.sol | 111 + .../contracts/utils/Exec.sol | 70 + .../deploy/1_deploy_entrypoint.ts | 19 + .../deploy/2_deploy_SimpleAccountFactory.ts | 33 + .../deployments/arbitrum/.chainId | 1 + .../deployments/arbitrum/EntryPoint.json | 1318 + .../a4c52f0671aad8941c53d6ead2063803.json | 68 + .../deployments/gnosis/.chainId | 1 + .../deployments/gnosis/EntryPoint.json | 1318 + .../a4c52f0671aad8941c53d6ead2063803.json | 68 + .../deployments/goerli/.chainId | 1 + .../deployments/goerli/EntryPoint.json | 1318 + .../a4c52f0671aad8941c53d6ead2063803.json | 68 + .../deployments/kovan/.chainId | 1 + .../deployments/kovan/EntryPoint.json | 1073 + .../deployments/kovan/SimpleWallet.json | 338 + .../deployments/kovan/TestCounter.json | 118 + .../9255faacf3ae4e81db1326413027bfa0.json | 86 + .../deployments/mainnet/.chainId | 1 + .../deployments/mainnet/EntryPoint.json | 1318 + .../mainnet/SimpleAccountFactory.json | 107 + .../02113a2ed1850c3774563305ee607f11.json | 329 + .../a4c52f0671aad8941c53d6ead2063803.json | 68 + .../cfbebdf1101dd2bc0f310cb0b7d62cb7.json | 59 + .../deployments/matic/.chainId | 1 + .../deployments/matic/EntryPoint.json | 1318 + .../a4c52f0671aad8941c53d6ead2063803.json | 68 + .../cfbebdf1101dd2bc0f310cb0b7d62cb7.json | 59 + .../deployments/mumbai/.chainId | 1 + .../deployments/mumbai/EntryPoint.json | 1318 + .../a4c52f0671aad8941c53d6ead2063803.json | 68 + .../deployments/optimism/.chainId | 1 + .../deployments/optimism/EntryPoint.json | 1318 + .../a4c52f0671aad8941c53d6ead2063803.json | 68 + .../deployments/sepolia/.chainId | 1 + .../deployments/sepolia/EntryPoint.json | 1318 + .../a4c52f0671aad8941c53d6ead2063803.json | 68 + .../account-abstraction/erc/ERCS/erc-4337.md | 1017 + .../account-abstraction/erc/ERCS/erc-7562.md | 393 + .../erc/assets/erc-4337/bundle-seq-pm.svg | 1 + .../erc/assets/erc-4337/bundle-seq.svg | 1 + .../erc/assets/erc-4337/image1.png | Bin 0 -> 32181 bytes .../erc/assets/erc-4337/image2.png | Bin 0 -> 27514 bytes .../gascalc/0-init-gas-checker.ts | 12 + .../gascalc/1-simple-wallet.gas.ts | 17 + .../gascalc/2-paymaster.gas.ts | 59 + .../gascalc/3-huge-tx-gas.ts | 27 + .../gascalc/4-paymaster-postop.gas.ts | 62 + .../gascalc/5-token-paymaster.gas.ts | 159 + .../account-abstraction/gascalc/GasChecker.ts | 459 + .../lib/account-abstraction/hardhat.config.ts | 86 + .../lib/account-abstraction/package.json | 71 + .../reports/gas-checker.txt | 55 + .../scripts/check-gas-reports | 17 + .../scripts/docker-gascalc | 7 + .../scripts/docker-gascalc.yml | 20 + .../lib/account-abstraction/scripts/gascalc | 15 + .../account-abstraction/scripts/hh-wrapper | 5 + .../scripts/postpack-contracts-package.sh | 6 + .../scripts/prepack-contracts-package.sh | 17 + .../scripts/sample-script.js | 32 + .../account-abstraction/scripts/solcErrors | 12 + .../lib/account-abstraction/src/AASigner.ts | 458 + .../account-abstraction/src/Create2Factory.ts | 126 + .../lib/account-abstraction/src/Utils.ts | 15 + .../lib/account-abstraction/src/runop.ts | 158 + .../test/0-create2factory.test.ts | 43 + .../lib/account-abstraction/test/UserOp.ts | 364 + .../account-abstraction/test/UserOperation.ts | 30 + .../lib/account-abstraction/test/aa.init.ts | 8 + .../account-abstraction/test/chaiHelper.ts | 73 + .../lib/account-abstraction/test/debugTx.ts | 34 + .../test/entrypoint.test.ts | 1929 + .../test/entrypointsimulations.test.ts | 534 + .../account-abstraction/test/helpers.test.ts | 74 + .../test/paymaster.test.ts | 415 + .../test/samples/OracleHelper.test.ts | 287 + .../test/samples/TokenPaymaster.test.ts | 588 + .../test/simple-wallet.test.ts | 208 + .../account-abstraction/test/solidityTypes.ts | 11 + .../test/testExecAccount.test.ts | 61 + .../lib/account-abstraction/test/testutils.ts | 529 + .../test/verifying_paymaster.test.ts | 191 + .../account-abstraction/test/y.bls.test.ts | 249 + .../lib/account-abstraction/tsconfig.json | 31 + .../lib/account-abstraction/yarn.lock | 10171 ++ .../lib/erc2470-libs/.gitattributes | 1 + .../lib/erc2470-libs/.githooks/pre-commit | 30 + .../erc2470-libs/.github/workflows/test.yml | 34 + .../sequence-v3/lib/erc2470-libs/.gitmodules | 3 + .../lib/erc2470-libs/.solhint.json | 9 + .../sequence-v3/lib/erc2470-libs/README.md | 80 + .../sequence-v3/lib/erc2470-libs/foundry.toml | 6 + .../erc2470-libs/lib/forge-std/.gitattributes | 1 + .../lib/forge-std/.github/workflows/ci.yml | 128 + .../lib/forge-std/.github/workflows/sync.yml | 31 + .../erc2470-libs/lib/forge-std/LICENSE-APACHE | 203 + .../erc2470-libs/lib/forge-std/LICENSE-MIT | 25 + .../lib/erc2470-libs/lib/forge-std/README.md | 252 + .../erc2470-libs/lib/forge-std/foundry.toml | 21 + .../erc2470-libs/lib/forge-std/package.json | 16 + .../erc2470-libs/lib/forge-std/scripts/vm.py | 635 + .../erc2470-libs/lib/forge-std/src/Base.sol | 35 + .../erc2470-libs/lib/forge-std/src/Script.sol | 27 + .../lib/forge-std/src/StdAssertions.sol | 669 + .../lib/forge-std/src/StdChains.sol | 263 + .../lib/forge-std/src/StdCheats.sol | 817 + .../lib/forge-std/src/StdError.sol | 15 + .../lib/forge-std/src/StdInvariant.sol | 122 + .../lib/forge-std/src/StdJson.sol | 283 + .../lib/forge-std/src/StdMath.sol | 43 + .../lib/forge-std/src/StdStorage.sol | 473 + .../lib/forge-std/src/StdStyle.sol | 333 + .../lib/forge-std/src/StdToml.sol | 283 + .../lib/forge-std/src/StdUtils.sol | 226 + .../erc2470-libs/lib/forge-std/src/Test.sol | 33 + .../lib/erc2470-libs/lib/forge-std/src/Vm.sol | 1968 + .../lib/forge-std/src/console.sol | 1560 + .../lib/forge-std/src/console2.sol | 4 + .../lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../lib/forge-std/src/interfaces/IERC165.sol | 12 + .../lib/forge-std/src/interfaces/IERC20.sol | 43 + .../lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../lib/forge-std/src/interfaces/IERC721.sol | 164 + .../forge-std/src/interfaces/IMulticall3.sol | 73 + .../lib/forge-std/src/mocks/MockERC20.sol | 234 + .../lib/forge-std/src/mocks/MockERC721.sol | 231 + .../lib/forge-std/src/safeconsole.sol | 13937 +++ .../lib/forge-std/test/StdAssertions.t.sol | 145 + .../lib/forge-std/test/StdChains.t.sol | 228 + .../lib/forge-std/test/StdCheats.t.sol | 618 + .../lib/forge-std/test/StdError.t.sol | 120 + .../lib/forge-std/test/StdJson.t.sol | 49 + .../lib/forge-std/test/StdMath.t.sol | 202 + .../lib/forge-std/test/StdStorage.t.sol | 471 + .../lib/forge-std/test/StdStyle.t.sol | 110 + .../lib/forge-std/test/StdToml.t.sol | 49 + .../lib/forge-std/test/StdUtils.t.sol | 342 + .../erc2470-libs/lib/forge-std/test/Vm.t.sol | 18 + .../test/compilation/CompilationScript.sol | 10 + .../compilation/CompilationScriptBase.sol | 10 + .../test/compilation/CompilationTest.sol | 10 + .../test/compilation/CompilationTestBase.sol | 10 + .../test/fixtures/broadcast.log.json | 187 + .../lib/forge-std/test/fixtures/test.json | 8 + .../lib/forge-std/test/fixtures/test.toml | 6 + .../lib/forge-std/test/mocks/MockERC20.t.sol | 441 + .../lib/forge-std/test/mocks/MockERC721.t.sol | 721 + .../script/MockERC20Deployer.s.sol | 14 + .../script/SingletonDeployer.s.sol | 66 + .../erc2470-libs/src/ISingletonFactory.sol | 12 + .../sequence-v3/lib/forge-std/.gitattributes | 1 + .../lib/forge-std/.github/workflows/ci.yml | 128 + .../lib/forge-std/.github/workflows/sync.yml | 31 + .../sequence-v3/lib/forge-std/CONTRIBUTING.md | 193 + .../sequence-v3/lib/forge-std/LICENSE-APACHE | 203 + .../lib/sequence-v3/lib/forge-std/LICENSE-MIT | 25 + .../lib/sequence-v3/lib/forge-std/README.md | 268 + .../sequence-v3/lib/forge-std/foundry.toml | 23 + .../sequence-v3/lib/forge-std/package.json | 16 + .../sequence-v3/lib/forge-std/scripts/vm.py | 646 + .../sequence-v3/lib/forge-std/src/Base.sol | 42 + .../sequence-v3/lib/forge-std/src/Script.sol | 28 + .../lib/forge-std/src/StdAssertions.sol | 669 + .../lib/forge-std/src/StdChains.sol | 286 + .../lib/forge-std/src/StdCheats.sol | 829 + .../lib/forge-std/src/StdConstants.sol | 30 + .../lib/forge-std/src/StdError.sol | 15 + .../lib/forge-std/src/StdInvariant.sol | 122 + .../sequence-v3/lib/forge-std/src/StdJson.sol | 283 + .../sequence-v3/lib/forge-std/src/StdMath.sol | 43 + .../lib/forge-std/src/StdStorage.sol | 473 + .../lib/forge-std/src/StdStyle.sol | 333 + .../sequence-v3/lib/forge-std/src/StdToml.sol | 283 + .../lib/forge-std/src/StdUtils.sol | 209 + .../sequence-v3/lib/forge-std/src/Test.sol | 34 + .../lib/sequence-v3/lib/forge-std/src/Vm.sol | 2397 + .../sequence-v3/lib/forge-std/src/console.sol | 1560 + .../lib/forge-std/src/console2.sol | 4 + .../lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../lib/forge-std/src/interfaces/IERC165.sol | 12 + .../lib/forge-std/src/interfaces/IERC20.sol | 43 + .../lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../lib/forge-std/src/interfaces/IERC6909.sol | 72 + .../lib/forge-std/src/interfaces/IERC721.sol | 164 + .../lib/forge-std/src/interfaces/IERC7540.sol | 150 + .../lib/forge-std/src/interfaces/IERC7575.sol | 241 + .../forge-std/src/interfaces/IMulticall3.sol | 73 + .../lib/forge-std/src/safeconsole.sol | 13937 +++ .../lib/forge-std/test/CommonBase.t.sol | 44 + .../lib/forge-std/test/StdAssertions.t.sol | 141 + .../lib/forge-std/test/StdChains.t.sol | 227 + .../lib/forge-std/test/StdCheats.t.sol | 639 + .../lib/forge-std/test/StdConstants.t.sol | 38 + .../lib/forge-std/test/StdError.t.sol | 120 + .../lib/forge-std/test/StdJson.t.sol | 49 + .../lib/forge-std/test/StdMath.t.sol | 202 + .../lib/forge-std/test/StdStorage.t.sol | 488 + .../lib/forge-std/test/StdStyle.t.sol | 110 + .../lib/forge-std/test/StdToml.t.sol | 49 + .../lib/forge-std/test/StdUtils.t.sol | 342 + .../sequence-v3/lib/forge-std/test/Vm.t.sol | 18 + .../test/compilation/CompilationScript.sol | 10 + .../compilation/CompilationScriptBase.sol | 10 + .../test/compilation/CompilationTest.sol | 10 + .../test/compilation/CompilationTestBase.sol | 10 + .../test/fixtures/broadcast.log.json | 187 + .../lib/forge-std/test/fixtures/test.json | 8 + .../lib/forge-std/test/fixtures/test.toml | 6 + .../.changeset/config.json | 12 + .../lib/openzeppelin-contracts/.codecov.yml | 16 + .../lib/openzeppelin-contracts/.editorconfig | 21 + .../openzeppelin-contracts/.githooks/pre-push | 8 + .../.github/ISSUE_TEMPLATE/bug_report.md | 20 + .../.github/ISSUE_TEMPLATE/config.yml | 4 + .../.github/ISSUE_TEMPLATE/feature_request.md | 15 + .../.github/PULL_REQUEST_TEMPLATE.md | 19 + .../.github/actions/gas-compare/action.yml | 50 + .../.github/actions/setup/action.yml | 22 + .../.github/actions/storage-layout/action.yml | 56 + .../.github/workflows/actionlint.yml | 18 + .../.github/workflows/changeset.yml | 28 + .../.github/workflows/checks.yml | 136 + .../.github/workflows/docs.yml | 19 + .../.github/workflows/formal-verification.yml | 86 + .../.github/workflows/release-cycle.yml | 212 + .../.github/workflows/upgradeable.yml | 34 + .../lib/openzeppelin-contracts/.gitmodules | 10 + .../lib/openzeppelin-contracts/.mocharc.js | 4 + .../lib/openzeppelin-contracts/.prettierrc | 15 + .../lib/openzeppelin-contracts/.solcover.js | 21 + .../lib/openzeppelin-contracts/CHANGELOG.md | 1158 + .../openzeppelin-contracts/CODE_OF_CONDUCT.md | 73 + .../openzeppelin-contracts/CONTRIBUTING.md | 36 + .../lib/openzeppelin-contracts/FUNDING.json | 7 + .../lib/openzeppelin-contracts/GUIDELINES.md | 154 + .../lib/openzeppelin-contracts/LICENSE | 22 + .../lib/openzeppelin-contracts/README.md | 106 + .../lib/openzeppelin-contracts/RELEASING.md | 45 + .../lib/openzeppelin-contracts/SECURITY.md | 43 + .../openzeppelin-contracts/audits/2017-03.md | 293 + .../openzeppelin-contracts/audits/2018-10.pdf | Bin 0 -> 1000527 bytes .../audits/2022-10-Checkpoints.pdf | Bin 0 -> 155606 bytes .../audits/2022-10-ERC4626.pdf | Bin 0 -> 204184 bytes .../audits/2023-05-v4.9.pdf | Bin 0 -> 485395 bytes .../audits/2023-10-v5.0.pdf | Bin 0 -> 910284 bytes .../audits/2024-10-v5.1.pdf | Bin 0 -> 395831 bytes .../openzeppelin-contracts/audits/README.md | 18 + .../openzeppelin-contracts/certora/Makefile | 54 + .../openzeppelin-contracts/certora/README.md | 60 + .../access_manager_AccessManager.sol.patch | 97 + .../AccessControlDefaultAdminRulesHarness.sol | 46 + .../harnesses/AccessControlHarness.sol | 6 + .../harnesses/AccessManagedHarness.sol | 36 + .../harnesses/AccessManagerHarness.sol | 116 + .../harnesses/DoubleEndedQueueHarness.sol | 58 + .../harnesses/ERC20FlashMintHarness.sol | 36 + .../certora/harnesses/ERC20PermitHarness.sol | 16 + .../certora/harnesses/ERC20WrapperHarness.sol | 34 + .../harnesses/ERC3156FlashBorrowerHarness.sol | 13 + .../certora/harnesses/ERC721Harness.sol | 33 + .../harnesses/ERC721ReceiverHarness.sol | 11 + .../harnesses/EnumerableMapHarness.sol | 55 + .../harnesses/EnumerableSetHarness.sol | 35 + .../harnesses/InitializableHarness.sol | 23 + .../certora/harnesses/NoncesHarness.sol | 14 + .../certora/harnesses/Ownable2StepHarness.sol | 10 + .../certora/harnesses/OwnableHarness.sol | 10 + .../certora/harnesses/PausableHarness.sol | 18 + .../harnesses/TimelockControllerHarness.sol | 13 + .../certora/reports/2021-10.pdf | Bin 0 -> 92882 bytes .../certora/reports/2022-03.pdf | Bin 0 -> 199401 bytes .../certora/reports/2022-05.pdf | Bin 0 -> 132223 bytes .../lib/openzeppelin-contracts/certora/run.js | 160 + .../openzeppelin-contracts/certora/specs.json | 110 + .../certora/specs/AccessControl.spec | 119 + .../specs/AccessControlDefaultAdminRules.spec | 464 + .../certora/specs/AccessManaged.spec | 34 + .../certora/specs/AccessManager.spec | 826 + .../certora/specs/DoubleEndedQueue.spec | 300 + .../certora/specs/ERC20.spec | 352 + .../certora/specs/ERC20FlashMint.spec | 55 + .../certora/specs/ERC20Wrapper.spec | 198 + .../certora/specs/ERC721.spec | 679 + .../certora/specs/EnumerableMap.spec | 333 + .../certora/specs/EnumerableSet.spec | 246 + .../certora/specs/Initializable.spec | 165 + .../certora/specs/Nonces.spec | 92 + .../certora/specs/Ownable.spec | 77 + .../certora/specs/Ownable2Step.spec | 108 + .../certora/specs/Pausable.spec | 96 + .../certora/specs/TimelockController.spec | 274 + .../certora/specs/helpers/helpers.spec | 12 + .../certora/specs/methods/IAccessControl.spec | 8 + .../IAccessControlDefaultAdminRules.spec | 36 + .../certora/specs/methods/IAccessManaged.spec | 5 + .../certora/specs/methods/IAccessManager.spec | 33 + .../certora/specs/methods/IERC20.spec | 11 + .../certora/specs/methods/IERC2612.spec | 5 + .../specs/methods/IERC3156FlashBorrower.spec | 3 + .../specs/methods/IERC3156FlashLender.spec | 5 + .../certora/specs/methods/IERC5313.spec | 3 + .../certora/specs/methods/IERC721.spec | 17 + .../specs/methods/IERC721Receiver.spec | 3 + .../certora/specs/methods/IOwnable.spec | 5 + .../certora/specs/methods/IOwnable2Step.spec | 7 + .../contracts/access/AccessControl.sol | 209 + .../contracts/access/IAccessControl.sol | 98 + .../contracts/access/Ownable.sol | 100 + .../contracts/access/Ownable2Step.sol | 67 + .../contracts/access/README.adoc | 45 + .../AccessControlDefaultAdminRules.sol | 396 + .../extensions/AccessControlEnumerable.sol | 82 + .../IAccessControlDefaultAdminRules.sol | 192 + .../extensions/IAccessControlEnumerable.sol | 31 + .../access/manager/AccessManaged.sol | 113 + .../access/manager/AccessManager.sol | 740 + .../access/manager/AuthorityUtils.sol | 32 + .../access/manager/IAccessManaged.sol | 32 + .../access/manager/IAccessManager.sol | 401 + .../contracts/access/manager/IAuthority.sol | 14 + .../contracts/account/README.adoc | 12 + .../account/utils/draft-ERC4337Utils.sol | 170 + .../account/utils/draft-ERC7579Utils.sol | 278 + .../contracts/finance/README.adoc | 14 + .../contracts/finance/VestingWallet.sol | 159 + .../contracts/finance/VestingWalletCliff.sol | 54 + .../contracts/governance/Governor.sol | 833 + .../contracts/governance/IGovernor.sol | 441 + .../contracts/governance/README.adoc | 181 + .../governance/TimelockController.sol | 472 + .../extensions/GovernorCountingFractional.sol | 196 + .../GovernorCountingOverridable.sol | 225 + .../extensions/GovernorCountingSimple.sol | 102 + .../extensions/GovernorPreventLateQuorum.sol | 92 + .../extensions/GovernorSettings.sol | 112 + .../governance/extensions/GovernorStorage.sol | 125 + .../extensions/GovernorTimelockAccess.sol | 349 + .../extensions/GovernorTimelockCompound.sol | 167 + .../extensions/GovernorTimelockControl.sol | 170 + .../governance/extensions/GovernorVotes.sol | 64 + .../GovernorVotesQuorumFraction.sol | 110 + .../contracts/governance/utils/IVotes.sol | 59 + .../contracts/governance/utils/Votes.sol | 252 + .../governance/utils/VotesExtended.sol | 84 + .../contracts/interfaces/IERC1155.sol | 6 + .../interfaces/IERC1155MetadataURI.sol | 6 + .../contracts/interfaces/IERC1155Receiver.sol | 6 + .../contracts/interfaces/IERC1271.sol | 17 + .../contracts/interfaces/IERC1363.sol | 86 + .../contracts/interfaces/IERC1363Receiver.sol | 32 + .../contracts/interfaces/IERC1363Spender.sol | 26 + .../contracts/interfaces/IERC165.sol | 6 + .../interfaces/IERC1820Implementer.sol | 20 + .../contracts/interfaces/IERC1820Registry.sol | 112 + .../contracts/interfaces/IERC1967.sol | 24 + .../contracts/interfaces/IERC20.sol | 6 + .../contracts/interfaces/IERC20Metadata.sol | 6 + .../contracts/interfaces/IERC2309.sol | 19 + .../contracts/interfaces/IERC2612.sol | 8 + .../contracts/interfaces/IERC2981.sol | 26 + .../contracts/interfaces/IERC3156.sol | 7 + .../interfaces/IERC3156FlashBorrower.sol | 27 + .../interfaces/IERC3156FlashLender.sol | 41 + .../contracts/interfaces/IERC4626.sol | 230 + .../contracts/interfaces/IERC4906.sol | 20 + .../contracts/interfaces/IERC5267.sol | 28 + .../contracts/interfaces/IERC5313.sol | 16 + .../contracts/interfaces/IERC5805.sol | 9 + .../contracts/interfaces/IERC6372.sol | 17 + .../contracts/interfaces/IERC721.sol | 6 + .../interfaces/IERC721Enumerable.sol | 6 + .../contracts/interfaces/IERC721Metadata.sol | 6 + .../contracts/interfaces/IERC721Receiver.sol | 6 + .../contracts/interfaces/IERC777.sol | 200 + .../contracts/interfaces/IERC777Recipient.sol | 35 + .../contracts/interfaces/IERC777Sender.sol | 35 + .../contracts/interfaces/README.adoc | 85 + .../contracts/interfaces/draft-IERC1822.sol | 20 + .../contracts/interfaces/draft-IERC4337.sol | 253 + .../contracts/interfaces/draft-IERC6093.sol | 161 + .../contracts/interfaces/draft-IERC7579.sol | 226 + .../contracts/interfaces/draft-IERC7674.sol | 17 + .../contracts/metatx/ERC2771Context.sol | 86 + .../contracts/metatx/ERC2771Forwarder.sol | 369 + .../contracts/metatx/README.adoc | 17 + .../contracts/mocks/AccessManagedTarget.sol | 34 + .../contracts/mocks/AccessManagerMock.sol | 21 + .../contracts/mocks/ArraysMock.sol | 127 + .../contracts/mocks/AuthorityMock.sol | 69 + .../contracts/mocks/Base64Dirty.sol | 19 + .../contracts/mocks/BatchCaller.sol | 20 + .../contracts/mocks/CallReceiverMock.sol | 73 + .../contracts/mocks/ConstructorMock.sol | 34 + .../contracts/mocks/ContextMock.sol | 35 + .../contracts/mocks/DummyImplementation.sol | 65 + .../contracts/mocks/EIP712Verifier.sol | 16 + .../contracts/mocks/ERC1271WalletMock.sol | 24 + .../ERC165/ERC165InterfacesSupported.sol | 58 + .../mocks/ERC165/ERC165MaliciousData.sol | 12 + .../mocks/ERC165/ERC165MissingData.sol | 7 + .../mocks/ERC165/ERC165NotSupported.sol | 5 + .../mocks/ERC165/ERC165ReturnBomb.sol | 18 + .../contracts/mocks/ERC2771ContextMock.sol | 28 + .../mocks/ERC3156FlashBorrowerMock.sol | 53 + .../contracts/mocks/EtherReceiverMock.sol | 17 + .../contracts/mocks/InitializableMock.sol | 130 + .../mocks/MerkleProofCustomHashMock.sol | 62 + .../contracts/mocks/MerkleTreeMock.sol | 44 + .../contracts/mocks/MulticallHelper.sol | 23 + .../MultipleInheritanceInitializableMocks.sol | 131 + .../contracts/mocks/PausableMock.sol | 31 + .../contracts/mocks/ReentrancyAttack.sol | 12 + .../contracts/mocks/ReentrancyMock.sol | 50 + .../mocks/ReentrancyTransientMock.sol | 50 + .../mocks/RegressionImplementation.sol | 61 + .../SingleInheritanceInitializableMocks.sol | 49 + .../contracts/mocks/Stateless.sol | 49 + .../contracts/mocks/StorageSlotMock.sol | 87 + .../contracts/mocks/TimelockReentrant.sol | 26 + .../contracts/mocks/TransientSlotMock.sol | 61 + .../contracts/mocks/UpgradeableBeaconMock.sol | 27 + .../contracts/mocks/VotesExtendedMock.sol | 42 + .../contracts/mocks/VotesMock.sol | 42 + .../mocks/account/utils/ERC7579UtilsMock.sol | 23 + .../contracts/mocks/compound/CompTimelock.sol | 174 + .../mocks/docs/ERC20WithAutoMinerReward.sol | 22 + .../contracts/mocks/docs/ERC4626Fees.sol | 109 + .../contracts/mocks/docs/MyNFT.sol | 9 + .../AccessControlERC20MintBase.sol | 25 + .../AccessControlERC20MintMissing.sol | 24 + .../AccessControlERC20MintOnlyRole.sol | 23 + .../access-control/AccessControlModified.sol | 14 + .../AccessControlNonRevokableAdmin.sol | 17 + .../AccessManagedERC20MintBase.sol | 16 + .../docs/access-control/MyContractOwnable.sol | 17 + .../mocks/docs/governance/MyGovernor.sol | 81 + .../mocks/docs/governance/MyToken.sol | 21 + .../docs/governance/MyTokenTimestampBased.sol | 32 + .../mocks/docs/governance/MyTokenWrapped.sol | 28 + .../mocks/docs/token/ERC1155/GameItems.sol | 21 + .../token/ERC1155/MyERC115HolderContract.sol | 7 + .../mocks/docs/token/ERC20/GLDToken.sol | 11 + .../mocks/docs/token/ERC721/GameItem.sol | 19 + .../mocks/docs/utilities/Base64NFT.sol | 27 + .../mocks/docs/utilities/Multicall.sol | 15 + .../GovernorCountingOverridableMock.sol | 18 + .../governance/GovernorFractionalMock.sol | 14 + .../mocks/governance/GovernorMock.sol | 14 + .../GovernorPreventLateQuorumMock.sol | 40 + .../mocks/governance/GovernorStorageMock.sol | 79 + .../governance/GovernorTimelockAccessMock.sol | 70 + .../GovernorTimelockCompoundMock.sol | 69 + .../GovernorTimelockControlMock.sol | 69 + .../mocks/governance/GovernorVoteMock.sol | 20 + .../governance/GovernorWithParamsMock.sol | 51 + .../contracts/mocks/proxy/BadBeacon.sol | 11 + .../mocks/proxy/ClashingImplementation.sol | 19 + .../mocks/proxy/UUPSUpgradeableMock.sol | 35 + .../mocks/token/ERC1155ReceiverMock.sol | 74 + .../mocks/token/ERC1363ForceApproveMock.sol | 14 + .../mocks/token/ERC1363NoReturnMock.sol | 34 + .../mocks/token/ERC1363ReceiverMock.sol | 52 + .../mocks/token/ERC1363ReturnFalseMock.sol | 34 + .../mocks/token/ERC1363SpenderMock.sol | 47 + .../mocks/token/ERC20ApprovalMock.sol | 10 + .../mocks/token/ERC20DecimalsMock.sol | 17 + .../mocks/token/ERC20ExcessDecimalsMock.sol | 9 + .../mocks/token/ERC20FlashMintMock.sol | 26 + .../mocks/token/ERC20ForceApproveMock.sol | 13 + .../mocks/token/ERC20GetterHelper.sol | 38 + .../contracts/mocks/token/ERC20Mock.sol | 16 + .../mocks/token/ERC20MulticallMock.sol | 8 + .../mocks/token/ERC20NoReturnMock.sol | 28 + .../contracts/mocks/token/ERC20Reentrant.sol | 39 + .../mocks/token/ERC20ReturnFalseMock.sol | 19 + .../ERC20VotesAdditionalCheckpointsMock.sol | 31 + .../mocks/token/ERC20VotesLegacyMock.sol | 253 + .../mocks/token/ERC20VotesTimestampMock.sol | 29 + .../mocks/token/ERC4626LimitsMock.sol | 23 + .../contracts/mocks/token/ERC4626Mock.sol | 17 + .../mocks/token/ERC4626OffsetMock.sol | 17 + .../contracts/mocks/token/ERC4646FeesMock.sol | 40 + .../token/ERC721ConsecutiveEnumerableMock.sol | 42 + .../mocks/token/ERC721ConsecutiveMock.sol | 61 + .../mocks/token/ERC721ReceiverMock.sol | 47 + .../mocks/token/ERC721URIStorageMock.sol | 17 + .../contracts/package.json | 32 + .../contracts/proxy/Clones.sol | 262 + .../contracts/proxy/ERC1967/ERC1967Proxy.sol | 40 + .../contracts/proxy/ERC1967/ERC1967Utils.sol | 177 + .../contracts/proxy/Proxy.sol | 69 + .../contracts/proxy/README.adoc | 87 + .../contracts/proxy/beacon/BeaconProxy.sol | 57 + .../contracts/proxy/beacon/IBeacon.sol | 16 + .../proxy/beacon/UpgradeableBeacon.sol | 70 + .../proxy/transparent/ProxyAdmin.sol | 45 + .../TransparentUpgradeableProxy.sol | 118 + .../contracts/proxy/utils/Initializable.sol | 228 + .../contracts/proxy/utils/UUPSUpgradeable.sol | 147 + .../contracts/token/ERC1155/ERC1155.sol | 401 + .../contracts/token/ERC1155/IERC1155.sol | 123 + .../token/ERC1155/IERC1155Receiver.sol | 59 + .../contracts/token/ERC1155/README.adoc | 43 + .../ERC1155/extensions/ERC1155Burnable.sol | 28 + .../ERC1155/extensions/ERC1155Pausable.sol | 38 + .../ERC1155/extensions/ERC1155Supply.sol | 90 + .../ERC1155/extensions/ERC1155URIStorage.sol | 61 + .../extensions/IERC1155MetadataURI.sol | 20 + .../token/ERC1155/utils/ERC1155Holder.sol | 42 + .../token/ERC1155/utils/ERC1155Utils.sol | 88 + .../contracts/token/ERC20/ERC20.sol | 312 + .../contracts/token/ERC20/IERC20.sol | 79 + .../contracts/token/ERC20/README.adoc | 75 + .../token/ERC20/extensions/ERC1363.sol | 137 + .../token/ERC20/extensions/ERC20Burnable.sol | 39 + .../token/ERC20/extensions/ERC20Capped.sol | 56 + .../token/ERC20/extensions/ERC20FlashMint.sol | 134 + .../token/ERC20/extensions/ERC20Pausable.sol | 33 + .../token/ERC20/extensions/ERC20Permit.sol | 83 + .../token/ERC20/extensions/ERC20Votes.sol | 83 + .../token/ERC20/extensions/ERC20Wrapper.sol | 91 + .../token/ERC20/extensions/ERC4626.sol | 282 + .../token/ERC20/extensions/IERC20Metadata.sol | 26 + .../token/ERC20/extensions/IERC20Permit.sol | 90 + .../draft-ERC20TemporaryApproval.sol | 119 + .../token/ERC20/utils/ERC1363Utils.sol | 95 + .../contracts/token/ERC20/utils/SafeERC20.sol | 198 + .../contracts/token/ERC721/ERC721.sol | 456 + .../contracts/token/ERC721/IERC721.sol | 135 + .../token/ERC721/IERC721Receiver.sol | 28 + .../contracts/token/ERC721/README.adoc | 69 + .../ERC721/extensions/ERC721Burnable.sol | 26 + .../ERC721/extensions/ERC721Consecutive.sol | 176 + .../ERC721/extensions/ERC721Enumerable.sol | 174 + .../ERC721/extensions/ERC721Pausable.sol | 37 + .../token/ERC721/extensions/ERC721Royalty.sol | 27 + .../ERC721/extensions/ERC721URIStorage.sol | 61 + .../token/ERC721/extensions/ERC721Votes.sol | 47 + .../token/ERC721/extensions/ERC721Wrapper.sol | 102 + .../ERC721/extensions/IERC721Enumerable.sol | 29 + .../ERC721/extensions/IERC721Metadata.sol | 27 + .../token/ERC721/utils/ERC721Holder.sol | 24 + .../token/ERC721/utils/ERC721Utils.sol | 50 + .../contracts/token/common/ERC2981.sol | 143 + .../contracts/token/common/README.adoc | 10 + .../contracts/utils/Address.sol | 150 + .../contracts/utils/Arrays.sol | 482 + .../contracts/utils/Base64.sol | 123 + .../contracts/utils/Bytes.sol | 114 + .../contracts/utils/CAIP10.sol | 54 + .../contracts/utils/CAIP2.sol | 51 + .../contracts/utils/Comparators.sol | 19 + .../contracts/utils/Context.sol | 28 + .../contracts/utils/Create2.sol | 92 + .../contracts/utils/Errors.sol | 34 + .../contracts/utils/Multicall.sol | 37 + .../contracts/utils/Nonces.sol | 46 + .../contracts/utils/NoncesKeyed.sol | 74 + .../contracts/utils/Packing.sol | 1656 + .../contracts/utils/Panic.sol | 57 + .../contracts/utils/Pausable.sol | 119 + .../contracts/utils/README.adoc | 149 + .../contracts/utils/ReentrancyGuard.sol | 87 + .../utils/ReentrancyGuardTransient.sol | 61 + .../contracts/utils/ShortStrings.sol | 122 + .../contracts/utils/SlotDerivation.sol | 155 + .../contracts/utils/StorageSlot.sol | 143 + .../contracts/utils/Strings.sol | 441 + .../contracts/utils/TransientSlot.sol | 183 + .../contracts/utils/cryptography/ECDSA.sol | 180 + .../contracts/utils/cryptography/EIP712.sol | 160 + .../contracts/utils/cryptography/Hashes.sol | 31 + .../utils/cryptography/MerkleProof.sol | 514 + .../utils/cryptography/MessageHashUtils.sol | 84 + .../contracts/utils/cryptography/P256.sol | 370 + .../contracts/utils/cryptography/RSA.sol | 154 + .../utils/cryptography/SignatureChecker.sol | 50 + .../contracts/utils/introspection/ERC165.sol | 27 + .../utils/introspection/ERC165Checker.sol | 124 + .../contracts/utils/introspection/IERC165.sol | 25 + .../contracts/utils/math/Math.sol | 685 + .../contracts/utils/math/SafeCast.sol | 1162 + .../contracts/utils/math/SignedMath.sol | 68 + .../contracts/utils/structs/BitMaps.sol | 60 + .../contracts/utils/structs/Checkpoints.sol | 630 + .../utils/structs/CircularBuffer.sol | 140 + .../utils/structs/DoubleEndedQueue.sol | 156 + .../contracts/utils/structs/EnumerableMap.sol | 905 + .../contracts/utils/structs/EnumerableSet.sol | 375 + .../contracts/utils/structs/Heap.sol | 256 + .../contracts/utils/structs/MerkleTree.sol | 175 + .../contracts/utils/types/Time.sol | 133 + .../vendor/compound/ICompoundTimelock.sol | 86 + .../contracts/vendor/compound/LICENSE | 11 + .../lib/openzeppelin-contracts/docs/README.md | 16 + .../openzeppelin-contracts/docs/antora.yml | 7 + .../lib/openzeppelin-contracts/docs/config.js | 21 + .../ROOT/images/access-control-multiple.svg | 97 + .../ROOT/images/access-manager-functions.svg | 47 + .../modules/ROOT/images/access-manager.svg | 99 + .../modules/ROOT/images/erc4626-attack-3a.png | Bin 0 -> 60433 bytes .../modules/ROOT/images/erc4626-attack-3b.png | Bin 0 -> 66184 bytes .../modules/ROOT/images/erc4626-attack-6.png | Bin 0 -> 56290 bytes .../modules/ROOT/images/erc4626-attack.png | Bin 0 -> 58886 bytes .../modules/ROOT/images/erc4626-deposit.png | Bin 0 -> 115497 bytes .../docs/modules/ROOT/images/erc4626-mint.png | Bin 0 -> 112787 bytes .../ROOT/images/erc4626-rate-linear.png | Bin 0 -> 50813 bytes .../ROOT/images/erc4626-rate-loglog.png | Bin 0 -> 72818 bytes .../ROOT/images/erc4626-rate-loglogext.png | Bin 0 -> 109923 bytes .../docs/modules/ROOT/images/tally-exec.png | Bin 0 -> 231859 bytes .../docs/modules/ROOT/images/tally-vote.png | Bin 0 -> 40507 bytes .../docs/modules/ROOT/nav.adoc | 23 + .../modules/ROOT/pages/access-control.adoc | 288 + .../ROOT/pages/backwards-compatibility.adoc | 48 + .../docs/modules/ROOT/pages/crowdsales.adoc | 11 + .../docs/modules/ROOT/pages/drafts.adoc | 19 + .../docs/modules/ROOT/pages/erc1155.adoc | 118 + .../docs/modules/ROOT/pages/erc20-supply.adoc | 71 + .../docs/modules/ROOT/pages/erc20.adoc | 67 + .../docs/modules/ROOT/pages/erc4626.adoc | 214 + .../docs/modules/ROOT/pages/erc721.adoc | 58 + .../ROOT/pages/extending-contracts.adoc | 51 + .../docs/modules/ROOT/pages/faq.adoc | 13 + .../docs/modules/ROOT/pages/governance.adoc | 239 + .../docs/modules/ROOT/pages/index.adoc | 70 + .../docs/modules/ROOT/pages/tokens.adoc | 31 + .../docs/modules/ROOT/pages/upgradeable.adoc | 77 + .../docs/modules/ROOT/pages/utilities.adoc | 388 + .../docs/modules/ROOT/pages/wizard.adoc | 15 + .../docs/templates/contract.hbs | 137 + .../docs/templates/helpers.js | 46 + .../docs/templates/page.hbs | 4 + .../docs/templates/properties.js | 72 + .../openzeppelin-contracts/eslint.config.mjs | 26 + .../lib/openzeppelin-contracts/foundry.toml | 15 + .../fv-requirements.txt | 4 + .../openzeppelin-contracts/hardhat.config.js | 124 + .../hardhat/async-test-sanity.js | 3 + .../hardhat/env-artifacts.js | 29 + .../hardhat/ignore-unreachable-warnings.js | 45 + .../hardhat/remappings.js | 18 + .../hardhat/skip-foundry-tests.js | 6 + .../hardhat/task-test-get-files.js | 25 + .../lib/erc4626-tests/ERC4626.prop.sol | 404 + .../lib/erc4626-tests/ERC4626.test.sol | 349 + .../lib/erc4626-tests/LICENSE | 661 + .../lib/erc4626-tests/README.md | 121 + .../lib/forge-std/.gitattributes | 1 + .../lib/forge-std/.github/workflows/ci.yml | 128 + .../lib/forge-std/.github/workflows/sync.yml | 31 + .../lib/forge-std/LICENSE-APACHE | 203 + .../lib/forge-std/LICENSE-MIT | 25 + .../lib/forge-std/README.md | 235 + .../lib/forge-std/foundry.toml | 21 + .../lib/forge-std/package.json | 16 + .../lib/forge-std/scripts/vm.py | 635 + .../lib/forge-std/src/Base.sol | 35 + .../lib/forge-std/src/Script.sol | 27 + .../lib/forge-std/src/StdAssertions.sol | 669 + .../lib/forge-std/src/StdChains.sol | 263 + .../lib/forge-std/src/StdCheats.sol | 817 + .../lib/forge-std/src/StdError.sol | 15 + .../lib/forge-std/src/StdInvariant.sol | 122 + .../lib/forge-std/src/StdJson.sol | 283 + .../lib/forge-std/src/StdMath.sol | 43 + .../lib/forge-std/src/StdStorage.sol | 473 + .../lib/forge-std/src/StdStyle.sol | 333 + .../lib/forge-std/src/StdToml.sol | 283 + .../lib/forge-std/src/StdUtils.sol | 226 + .../lib/forge-std/src/Test.sol | 33 + .../lib/forge-std/src/Vm.sol | 1968 + .../lib/forge-std/src/console.sol | 1560 + .../lib/forge-std/src/console2.sol | 4 + .../lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../lib/forge-std/src/interfaces/IERC165.sol | 12 + .../lib/forge-std/src/interfaces/IERC20.sol | 43 + .../lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../lib/forge-std/src/interfaces/IERC721.sol | 164 + .../forge-std/src/interfaces/IMulticall3.sol | 73 + .../lib/forge-std/src/mocks/MockERC20.sol | 234 + .../lib/forge-std/src/mocks/MockERC721.sol | 231 + .../lib/forge-std/src/safeconsole.sol | 13937 +++ .../lib/forge-std/test/StdAssertions.t.sol | 145 + .../lib/forge-std/test/StdChains.t.sol | 228 + .../lib/forge-std/test/StdCheats.t.sol | 618 + .../lib/forge-std/test/StdError.t.sol | 120 + .../lib/forge-std/test/StdJson.t.sol | 49 + .../lib/forge-std/test/StdMath.t.sol | 202 + .../lib/forge-std/test/StdStorage.t.sol | 471 + .../lib/forge-std/test/StdStyle.t.sol | 110 + .../lib/forge-std/test/StdToml.t.sol | 49 + .../lib/forge-std/test/StdUtils.t.sol | 342 + .../lib/forge-std/test/Vm.t.sol | 18 + .../test/compilation/CompilationScript.sol | 10 + .../compilation/CompilationScriptBase.sol | 10 + .../test/compilation/CompilationTest.sol | 10 + .../test/compilation/CompilationTestBase.sol | 10 + .../test/fixtures/broadcast.log.json | 187 + .../lib/forge-std/test/fixtures/test.json | 8 + .../lib/forge-std/test/fixtures/test.toml | 6 + .../lib/forge-std/test/mocks/MockERC20.t.sol | 441 + .../lib/forge-std/test/mocks/MockERC721.t.sol | 721 + .../lib/halmos-cheatcodes/LICENSE | 661 + .../lib/halmos-cheatcodes/README.md | 100 + .../lib/halmos-cheatcodes/src/SVM.sol | 35 + .../lib/halmos-cheatcodes/src/SymTest.sol | 11 + .../lib/openzeppelin-contracts/logo.svg | 15 + .../lib/openzeppelin-contracts/netlify.toml | 3 + .../openzeppelin-contracts/package-lock.json | 11419 ++ .../lib/openzeppelin-contracts/package.json | 92 + .../lib/openzeppelin-contracts/remappings.txt | 1 + .../lib/openzeppelin-contracts/renovate.json | 4 + .../scripts/checks/compare-layout.js | 20 + .../scripts/checks/compareGasReports.js | 247 + .../scripts/checks/coverage.sh | 18 + .../scripts/checks/extract-layout.js | 38 + .../scripts/checks/generation.sh | 6 + .../scripts/checks/inheritance-ordering.js | 55 + .../scripts/checks/pragma-consistency.js | 49 + .../openzeppelin-contracts/scripts/gen-nav.js | 41 + .../scripts/generate/format-lines.js | 16 + .../scripts/generate/helpers/sanitize.js | 5 + .../scripts/generate/run.js | 58 + .../scripts/generate/templates/Arrays.js | 384 + .../scripts/generate/templates/Arrays.opts.js | 3 + .../scripts/generate/templates/Checkpoints.js | 242 + .../generate/templates/Checkpoints.opts.js | 17 + .../generate/templates/Checkpoints.t.js | 137 + .../generate/templates/EnumerableMap.js | 272 + .../generate/templates/EnumerableMap.opts.js | 19 + .../generate/templates/EnumerableSet.js | 247 + .../generate/templates/EnumerableSet.opts.js | 12 + .../scripts/generate/templates/MerkleProof.js | 187 + .../generate/templates/MerkleProof.opts.js | 11 + .../scripts/generate/templates/Packing.js | 92 + .../generate/templates/Packing.opts.js | 3 + .../scripts/generate/templates/Packing.t.js | 48 + .../scripts/generate/templates/SafeCast.js | 136 + .../scripts/generate/templates/Slot.opts.js | 15 + .../generate/templates/SlotDerivation.js | 119 + .../generate/templates/SlotDerivation.t.js | 127 + .../scripts/generate/templates/StorageSlot.js | 77 + .../generate/templates/StorageSlotMock.js | 57 + .../generate/templates/TransientSlot.js | 80 + .../generate/templates/TransientSlotMock.js | 35 + .../scripts/generate/templates/conversion.js | 30 + .../scripts/git-user-config.sh | 6 + .../openzeppelin-contracts/scripts/helpers.js | 7 + .../openzeppelin-contracts/scripts/prepack.sh | 23 + .../scripts/prepare-docs.sh | 26 + .../openzeppelin-contracts/scripts/prepare.sh | 5 + .../scripts/release/format-changelog.js | 33 + .../scripts/release/synchronize-versions.js | 15 + .../scripts/release/update-comment.js | 34 + .../scripts/release/version.sh | 11 + .../release/workflow/exit-prerelease.sh | 8 + .../release/workflow/github-release.js | 48 + .../release/workflow/integrity-check.sh | 20 + .../scripts/release/workflow/pack.sh | 26 + .../scripts/release/workflow/publish.sh | 26 + .../scripts/release/workflow/rerun.js | 7 + .../workflow/set-changesets-pr-title.js | 17 + .../scripts/release/workflow/start.sh | 35 + .../scripts/release/workflow/state.js | 112 + .../scripts/remove-ignored-artifacts.js | 45 + .../scripts/solhint-custom/index.js | 84 + .../scripts/solhint-custom/package.json | 5 + .../scripts/update-docs-branch.js | 65 + .../scripts/upgradeable/README.md | 21 + .../scripts/upgradeable/patch-apply.sh | 19 + .../scripts/upgradeable/patch-save.sh | 18 + .../scripts/upgradeable/transpile-onto.sh | 54 + .../scripts/upgradeable/transpile.sh | 50 + .../scripts/upgradeable/upgradeable.patch | 361 + .../slither.config.json | 5 + .../openzeppelin-contracts/solhint.config.js | 26 + .../openzeppelin-contracts/test/TESTING.md | 3 + .../test/access/AccessControl.behavior.js | 874 + .../test/access/AccessControl.test.js | 19 + .../test/access/Ownable.test.js | 79 + .../test/access/Ownable2Step.test.js | 102 + .../AccessControlDefaultAdminRules.test.js | 32 + .../AccessControlEnumerable.test.js | 24 + .../test/access/manager/AccessManaged.test.js | 146 + .../access/manager/AccessManager.behavior.js | 257 + .../access/manager/AccessManager.predicate.js | 456 + .../test/access/manager/AccessManager.test.js | 2489 + .../access/manager/AuthorityUtils.test.js | 102 + .../account/utils/draft-ERC4337Utils.test.js | 288 + .../account/utils/draft-ERC7579Utils.t.sol | 421 + .../account/utils/draft-ERC7579Utils.test.js | 353 + .../test/bin/EntryPoint070.abi | 1 + .../test/bin/EntryPoint070.bytecode | Bin 0 -> 16035 bytes .../test/bin/SenderCreator070.abi | 1 + .../test/bin/SenderCreator070.bytecode | Bin 0 -> 451 bytes .../test/finance/VestingWallet.behavior.js | 87 + .../test/finance/VestingWallet.test.js | 65 + .../test/finance/VestingWalletCliff.test.js | 70 + .../test/governance/Governor.t.sol | 55 + .../test/governance/Governor.test.js | 992 + .../governance/TimelockController.test.js | 1279 + .../GovernorCountingFractional.test.js | 248 + .../GovernorCountingOverridable.test.js | 346 + .../extensions/GovernorERC721.test.js | 131 + .../GovernorPreventLateQuorum.test.js | 185 + .../extensions/GovernorStorage.test.js | 155 + .../extensions/GovernorTimelockAccess.test.js | 864 + .../GovernorTimelockCompound.test.js | 448 + .../GovernorTimelockControl.test.js | 504 + .../GovernorVotesQuorumFraction.test.js | 165 + .../extensions/GovernorWithParams.test.js | 245 + .../test/governance/utils/ERC6372.behavior.js | 28 + .../test/governance/utils/Votes.behavior.js | 325 + .../test/governance/utils/Votes.test.js | 102 + .../governance/utils/VotesExtended.test.js | 152 + .../test/helpers/access-manager.js | 85 + .../test/helpers/account.js | 14 + .../test/helpers/chains.js | 109 + .../test/helpers/constants.js | 4 + .../test/helpers/deploy.js | 14 + .../test/helpers/eip712-types.js | 59 + .../test/helpers/eip712.js | 45 + .../test/helpers/enums.js | 12 + .../test/helpers/erc4337-entrypoint.js | 31 + .../test/helpers/erc4337.js | 111 + .../test/helpers/erc7579.js | 58 + .../test/helpers/governance.js | 215 + .../test/helpers/iterate.js | 36 + .../test/helpers/math.js | 33 + .../test/helpers/methods.js | 14 + .../test/helpers/random.js | 19 + .../test/helpers/storage.js | 48 + .../test/helpers/strings.js | 5 + .../test/helpers/time.js | 30 + .../test/helpers/txpool.js | 29 + .../test/metatx/ERC2771Context.test.js | 133 + .../test/metatx/ERC2771Forwarder.t.sol | 279 + .../test/metatx/ERC2771Forwarder.test.js | 384 + .../test/proxy/Clones.behaviour.js | 160 + .../test/proxy/Clones.t.sol | 91 + .../test/proxy/Clones.test.js | 175 + .../test/proxy/ERC1967/ERC1967Proxy.test.js | 23 + .../test/proxy/ERC1967/ERC1967Utils.test.js | 162 + .../test/proxy/Proxy.behaviour.js | 185 + .../test/proxy/beacon/BeaconProxy.test.js | 141 + .../proxy/beacon/UpgradeableBeacon.test.js | 55 + .../test/proxy/transparent/ProxyAdmin.test.js | 82 + .../TransparentUpgradeableProxy.behaviour.js | 357 + .../TransparentUpgradeableProxy.test.js | 28 + .../test/proxy/utils/Initializable.test.js | 216 + .../test/proxy/utils/UUPSUpgradeable.test.js | 120 + .../test/sanity.test.js | 27 + .../test/token/ERC1155/ERC1155.behavior.js | 763 + .../test/token/ERC1155/ERC1155.test.js | 213 + .../extensions/ERC1155Burnable.test.js | 66 + .../extensions/ERC1155Pausable.test.js | 105 + .../ERC1155/extensions/ERC1155Supply.test.js | 119 + .../extensions/ERC1155URIStorage.test.js | 70 + .../token/ERC1155/utils/ERC1155Holder.test.js | 56 + .../token/ERC1155/utils/ERC1155Utils.test.js | 299 + .../test/token/ERC20/ERC20.behavior.js | 269 + .../test/token/ERC20/ERC20.test.js | 199 + .../token/ERC20/extensions/ERC1363.test.js | 370 + .../ERC20/extensions/ERC20Burnable.test.js | 105 + .../ERC20/extensions/ERC20Capped.test.js | 55 + .../ERC20/extensions/ERC20FlashMint.test.js | 164 + .../ERC20/extensions/ERC20Pausable.test.js | 129 + .../ERC20/extensions/ERC20Permit.test.js | 109 + .../token/ERC20/extensions/ERC20Votes.test.js | 546 + .../ERC20/extensions/ERC20Wrapper.test.js | 203 + .../test/token/ERC20/extensions/ERC4626.t.sol | 41 + .../token/ERC20/extensions/ERC4626.test.js | 888 + .../draft-ERC20TemporaryApproval.test.js | 142 + .../test/token/ERC20/utils/SafeERC20.test.js | 427 + .../test/token/ERC721/ERC721.behavior.js | 972 + .../test/token/ERC721/ERC721.test.js | 23 + .../token/ERC721/ERC721Enumerable.test.js | 28 + .../ERC721/extensions/ERC721Burnable.test.js | 77 + .../ERC721/extensions/ERC721Consecutive.t.sol | 181 + .../extensions/ERC721Consecutive.test.js | 236 + .../ERC721/extensions/ERC721Pausable.test.js | 81 + .../ERC721/extensions/ERC721Royalty.test.js | 57 + .../extensions/ERC721URIStorage.test.js | 121 + .../ERC721/extensions/ERC721Votes.test.js | 194 + .../ERC721/extensions/ERC721Wrapper.test.js | 201 + .../token/ERC721/utils/ERC721Holder.test.js | 20 + .../token/ERC721/utils/ERC721Utils.test.js | 94 + .../test/token/common/ERC2981.behavior.js | 152 + .../test/utils/Address.test.js | 281 + .../test/utils/Arrays.t.sol | 31 + .../test/utils/Arrays.test.js | 223 + .../test/utils/Base64.t.sol | 34 + .../test/utils/Base64.test.js | 59 + .../test/utils/Bytes.test.js | 88 + .../test/utils/CAIP.test.js | 53 + .../test/utils/Context.behavior.js | 48 + .../test/utils/Context.test.js | 18 + .../test/utils/Create2.t.sol | 17 + .../test/utils/Create2.test.js | 190 + .../test/utils/Multicall.test.js | 72 + .../test/utils/Nonces.behavior.js | 189 + .../test/utils/Nonces.test.js | 16 + .../test/utils/NoncesKeyed.test.js | 17 + .../test/utils/Packing.t.sol | 993 + .../test/utils/Packing.test.js | 70 + .../test/utils/Panic.test.js | 37 + .../test/utils/Pausable.test.js | 90 + .../test/utils/ReentrancyGuard.test.js | 50 + .../test/utils/ShortStrings.t.sol | 109 + .../test/utils/ShortStrings.test.js | 64 + .../test/utils/SlotDerivation.t.sol | 248 + .../test/utils/SlotDerivation.test.js | 58 + .../test/utils/StorageSlot.test.js | 73 + .../test/utils/Strings.t.sol | 50 + .../test/utils/Strings.test.js | 342 + .../test/utils/TransientSlot.test.js | 59 + .../test/utils/cryptography/ECDSA.test.js | 211 + .../test/utils/cryptography/EIP712.test.js | 105 + .../utils/cryptography/MerkleProof.test.js | 213 + .../cryptography/MessageHashUtils.test.js | 68 + .../test/utils/cryptography/P256.t.sol | 44 + .../test/utils/cryptography/P256.test.js | 156 + .../test/utils/cryptography/RSA.helper.js | 17 + .../test/utils/cryptography/RSA.test.js | 102 + .../utils/cryptography/SigVer15_186-3.rsp | 3850 + .../cryptography/SignatureChecker.test.js | 61 + .../ecdsa_secp256r1_sha256_p1363_test.json | 3719 + .../test/utils/introspection/ERC165.test.js | 18 + .../utils/introspection/ERC165Checker.test.js | 245 + .../SupportsInterface.behavior.js | 145 + .../test/utils/math/Math.t.sol | 311 + .../test/utils/math/Math.test.js | 562 + .../test/utils/math/SafeCast.test.js | 159 + .../test/utils/math/SignedMath.t.sol | 80 + .../test/utils/math/SignedMath.test.js | 53 + .../test/utils/structs/BitMap.test.js | 149 + .../test/utils/structs/Checkpoints.t.sol | 332 + .../test/utils/structs/Checkpoints.test.js | 146 + .../test/utils/structs/CircularBuffer.test.js | 83 + .../utils/structs/DoubleEndedQueue.test.js | 102 + .../utils/structs/EnumerableMap.behavior.js | 151 + .../test/utils/structs/EnumerableMap.test.js | 65 + .../utils/structs/EnumerableSet.behavior.js | 116 + .../test/utils/structs/EnumerableSet.test.js | 61 + .../test/utils/structs/Heap.t.sol | 74 + .../test/utils/structs/Heap.test.js | 113 + .../test/utils/structs/MerkleTree.test.js | 100 + .../test/utils/types/Time.test.js | 135 + .../lib/sequence-v3/package.json | 13 + .../lib/sequence-v3/pnpm-lock.yaml | 157 + .../lib/sequence-v3/pnpm-workspace.yaml | 2 + .../lib/sequence-v3/script/Deploy.s.sol | 36 + .../lib/sequence-v3/script/DeployMocks.s.sol | 19 + .../lib/sequence-v3/src/Estimator.sol | 111 + .../lib/sequence-v3/src/Factory.sol | 28 + .../lib/sequence-v3/src/Guest.sol | 76 + .../lib/sequence-v3/src/Simulator.sol | 109 + .../lib/sequence-v3/src/Stage1Module.sol | 29 + .../lib/sequence-v3/src/Stage2Module.sol | 27 + .../lib/sequence-v3/src/Wallet.huff | 55 + .../lib/sequence-v3/src/Wallet.sol | 67 + .../src/extensions/passkeys/Passkeys.sol | 123 + .../src/extensions/recovery/Recovery.sol | 217 + .../src/extensions/sessions/SessionErrors.sol | 56 + .../extensions/sessions/SessionManager.sol | 133 + .../src/extensions/sessions/SessionSig.sol | 421 + .../explicit/ExplicitSessionManager.sol | 171 + .../explicit/IExplicitSessionManager.sol | 41 + .../sessions/explicit/Permission.sol | 112 + .../sessions/explicit/PermissionValidator.sol | 135 + .../sessions/implicit/Attestation.sol | 122 + .../implicit/ISignalsImplicitMode.sol | 26 + .../implicit/ImplicitSessionManager.sol | 83 + .../lib/sequence-v3/src/modules/Calls.sol | 124 + .../sequence-v3/src/modules/ERC4337v07.sol | 73 + .../lib/sequence-v3/src/modules/Hooks.sol | 124 + .../src/modules/Implementation.sol | 50 + .../lib/sequence-v3/src/modules/Nonce.sol | 48 + .../lib/sequence-v3/src/modules/Payload.sol | 278 + .../src/modules/ReentrancyGuard.sol | 38 + .../lib/sequence-v3/src/modules/Storage.sol | 37 + .../sequence-v3/src/modules/auth/BaseAuth.sol | 174 + .../sequence-v3/src/modules/auth/BaseSig.sol | 500 + .../sequence-v3/src/modules/auth/SelfAuth.sol | 19 + .../src/modules/auth/Stage1Auth.sol | 62 + .../src/modules/auth/Stage2Auth.sol | 45 + .../src/modules/interfaces/IAccount.sol | 65 + .../src/modules/interfaces/IAuth.sol | 17 + .../src/modules/interfaces/ICheckpointer.sol | 25 + .../interfaces/IDelegatedExtension.sol | 25 + .../modules/interfaces/IERC1155Receiver.sol | 38 + .../src/modules/interfaces/IERC1271.sol | 35 + .../modules/interfaces/IERC223Receiver.sol | 15 + .../modules/interfaces/IERC721Receiver.sol | 21 + .../modules/interfaces/IERC777Receiver.sol | 24 + .../src/modules/interfaces/IEntryPoint.sol | 10 + .../src/modules/interfaces/IPartialAuth.sol | 35 + .../src/modules/interfaces/ISapient.sol | 38 + .../lib/sequence-v3/src/utils/Base64.sol | 169 + .../lib/sequence-v3/src/utils/LibBytes.sol | 120 + .../lib/sequence-v3/src/utils/LibOptim.sol | 68 + .../lib/sequence-v3/src/utils/P256.sol | 153 + .../lib/sequence-v3/src/utils/WebAuthn.sol | 333 + .../lib/sequence-v3/test/Factory.t.sol | 32 + .../lib/sequence-v3/test/Guest.t.sol | 287 + .../lib/sequence-v3/test/Stage1Module.t.sol | 1305 + .../lib/sequence-v3/test/Wallet.t.sol | 110 + .../test/extensions/passkeys/Passkeys.t.sol | 540 + .../test/extensions/recovery/Recovery.t.sol | 595 + .../extensions/sessions/Attestation.t.sol | 51 + .../test/extensions/sessions/Permission.t.sol | 157 + .../extensions/sessions/SessionCalls.t.sol | 299 + .../extensions/sessions/SessionManager.t.sol | 855 + .../test/extensions/sessions/SessionSig.t.sol | 1020 + .../extensions/sessions/SessionTestBase.sol | 209 + .../explicit/ExplicitSessionManager.t.sol | 866 + .../explicit/PermissionValidator.t.sol | 323 + .../implicit/ImplicitSessionManager.t.sol | 221 + .../recovery/RecoveryDenialOfService.t.sol | 199 + .../sessions/ExtendedSessionTestBase.sol | 175 + .../sessions/SessionDenialOfService.t.sol | 191 + .../sessions/SessionLimitIncrementTest.t.sol | 76 + .../extensions/sessions/SessionSelfCall.t.sol | 72 + .../sessions/SessionSignatureAbuse.t.sol | 143 + .../sessions/SessionUsingERC4337.t.sol | 142 + .../sessions/SessionValueForwarding.t.sol | 295 + .../ERC4337v07/ERC4337Entrypoint.t.sol | 179 + .../lib/sequence-v3/test/mocks/AcceptAll.sol | 10 + .../lib/sequence-v3/test/mocks/CanReenter.sol | 11 + .../lib/sequence-v3/test/mocks/Emitter.sol | 39 + .../lib/sequence-v3/test/mocks/MockERC20.sol | 46 + .../test/mocks/MockPayableReceiver.sol | 8 + .../sequence-v3/test/mocks/ValueForwarder.sol | 14 + .../sequence-v3/test/modules/BaseSig.t.sol | 2550 + .../lib/sequence-v3/test/modules/Calls.t.sol | 457 + .../sequence-v3/test/modules/ERC4337v07.t.sol | 246 + .../lib/sequence-v3/test/modules/Hooks.t.sol | 174 + .../test/modules/Implementation.t.sol | 31 + .../lib/sequence-v3/test/modules/Nonce.t.sol | 50 + .../sequence-v3/test/modules/Payload.t.sol | 381 + .../lib/sequence-v3/test/utils/Base64.t.sol | 161 + .../lib/sequence-v3/test/utils/LibBytes.t.sol | 335 + .../sequence-v3/test/utils/PrimitivesRPC.sol | 581 + .../lib/sequence-v3/test/utils/TestUtils.sol | 129 + lib/signals-implicit-mode/remappings.txt | 1 + lib/signals-implicit-mode/script/Deploy.s.sol | 18 + lib/signals-implicit-mode/soldeer.lock | 6 + .../src/helper/SignalsImplicitMode.sol | 58 + .../src/registry/IImplicitProjectRegistry.sol | 79 + .../registry/IImplicitProjectValidation.sol | 25 + .../src/registry/ImplicitProjectRegistry.sol | 211 + .../test/ImplicitProjectRegistry.t.sol | 774 + .../test/SignalsImplicitMode.t.sol | 115 + lib/signals-implicit-mode/test/TestHelper.sol | 64 + .../test/mock/SignalsImplicitModeMock.sol | 15 + package-lock.json | 49400 ++++++++ package.json | 77 +- packages/0xsequence/README.md | 67 + packages/0xsequence/hardhat.config.js | 21 + packages/0xsequence/hardhat2.config.js | 21 + packages/0xsequence/src/abi.ts | 1 + packages/0xsequence/src/account.ts | 1 + packages/0xsequence/src/api.ts | 1 + packages/0xsequence/src/auth.ts | 1 + packages/0xsequence/src/core.ts | 6 + packages/0xsequence/src/guard.ts | 1 + packages/0xsequence/src/index.ts | 3 + packages/0xsequence/src/indexer.ts | 1 + packages/0xsequence/src/metadata.ts | 1 + packages/0xsequence/src/migration.ts | 1 + packages/0xsequence/src/multicall.ts | 1 + packages/0xsequence/src/network.ts | 14 + packages/0xsequence/src/provider.ts | 29 + packages/0xsequence/src/relayer.ts | 3 + packages/0xsequence/src/sequence.ts | 21 + packages/0xsequence/src/sessions.ts | 1 + packages/0xsequence/src/signhub.ts | 1 + packages/0xsequence/src/transactions.ts | 10 + packages/0xsequence/src/utils.ts | 5 + .../browser/json-rpc-provider/rpc.test.ts | 39 + .../browser/mock-wallet/mock-wallet.test.ts | 120 + .../tests/browser/mux-transport/mux.test.ts | 175 + .../browser/proxy-transport/channel.test.ts | 172 + .../tests/browser/testutils/accounts.ts | 44 + .../testutils/deploy-wallet-context.ts | 79 + .../tests/browser/testutils/index.ts | 3 + .../tests/browser/testutils/wallet.ts | 16 + .../browser/wallet-provider/dapp.test.ts | 543 + .../browser/wallet-provider/dapp2.test.ts | 116 + .../browser/window-transport/dapp.test.ts | 135 + .../tests/json-rpc-provider.spec.ts | 3 + packages/0xsequence/tests/mock-wallet.spec.ts | 3 + .../0xsequence/tests/mux-transport.spec.ts | 3 + .../0xsequence/tests/proxy-transport.spec.ts | 3 + packages/0xsequence/tests/utils/assert.ts | 76 + .../tests/utils/browser-test-runner.ts | 90 + .../tests/utils/webpack-test-server.ts | 31 + .../0xsequence/tests/wallet-provider.spec.ts | 4 + packages/0xsequence/tests/webpack.config.js | 165 + .../0xsequence/tests/window-transport.spec.ts | 3 + packages/abi/CHANGELOG.md | 1664 + packages/abi/README.md | 4 + packages/abi/src/index.ts | 1 + packages/abi/src/tokens/erc1155.ts | 3 + packages/abi/src/tokens/erc20.ts | 3 + packages/abi/src/tokens/erc721.ts | 3 + packages/abi/src/wallet/erc1271.ts | 26 + packages/abi/src/wallet/erc5719.ts | 19 + packages/abi/src/wallet/erc6492.ts | 61 + packages/abi/src/wallet/factory.ts | 18 + packages/abi/src/wallet/index.ts | 19 + .../src/wallet/libs/requireFreshSigners.ts | 15 + packages/abi/src/wallet/mainModule.ts | 158 + .../abi/src/wallet/mainModuleUpgradable.ts | 28 + packages/abi/src/wallet/sequenceUtils.ts | 516 + packages/account/hardhat.config.js | 12 + packages/account/hardhat2.config.js | 11 + packages/account/src/account.ts | 1085 + packages/account/src/index.ts | 1 + packages/account/src/orchestrator/wrapper.ts | 69 + packages/account/src/signer.ts | 223 + packages/account/src/utils.ts | 14 + packages/account/tests/account.spec.ts | 1536 + packages/account/tests/signer.spec.ts | 896 + packages/api/CHANGELOG.md | 1733 + packages/api/README.md | 4 + packages/api/src/api.gen.ts | 1745 + packages/api/src/index.ts | 38 + packages/auth/README.md | 4 + packages/auth/hardhat.config.js | 15 + packages/auth/src/authorization.ts | 81 + packages/auth/src/index.ts | 3 + packages/auth/src/proof.ts | 16 + packages/auth/src/services.ts | 337 + packages/auth/src/session.ts | 397 + packages/auth/tests/session.spec.ts | 1424 + packages/auth/tests/utils/index.ts | 33 + packages/core/src/commons/config.ts | 67 + packages/core/src/commons/context.ts | 112 + packages/core/src/commons/index.ts | 10 + packages/core/src/commons/orchestrator.ts | 42 + packages/core/src/commons/reader.ts | 93 + packages/core/src/commons/signature.ts | 71 + packages/core/src/commons/signer.ts | 73 + packages/core/src/commons/transaction.ts | 322 + packages/core/src/commons/validateEIP1271.ts | 38 + packages/core/src/commons/validateEIP6492.ts | 197 + packages/core/src/index.ts | 11 + packages/core/src/universal/index.ts | 25 + packages/core/src/v1/config.ts | 221 + packages/core/src/v1/index.ts | 15 + packages/core/src/v1/signature.ts | 256 + packages/core/src/v2/chained.ts | 23 + packages/core/src/v2/config.ts | 620 + packages/core/src/v2/context.ts | 5 + packages/core/src/v2/index.ts | 25 + packages/core/src/v2/signature.ts | 977 + packages/core/tests/v2/config.spec.ts | 512 + packages/core/tests/v2/signature.spec.ts | 603 + packages/deployer/.gitignore | 4 + packages/deployer/README.md | 60 + .../NanoUniversalDeployer.json | 28 + .../UniversalDeployer2.json | 42 + packages/deployer/config/PROD.env.sample | 2 + .../contracts/NanoUniversalDeployer.sol | 12 + .../deployer/contracts/UniversalDeployer2.sol | 16 + packages/deployer/hardhat.config.ts | 31 + packages/deployer/src/UniversalDeployer.ts | 207 + packages/deployer/src/constants.ts | 18 + packages/deployer/src/index.ts | 3 + packages/deployer/src/types.ts | 15 + .../contracts/NanoUniversalDeployer.ts | 60 + .../typings/contracts/UniversalDeployer2.ts | 109 + .../deployer/src/typings/contracts/common.ts | 32 + .../NanoUniversalDeployer__factory.ts | 67 + .../factories/UniversalDeployer2__factory.ts | 81 + .../src/typings/contracts/factories/index.ts | 5 + .../deployer/src/typings/contracts/index.ts | 8 + packages/deployer/src/utils/configLoader.ts | 49 + packages/deployer/src/utils/logger.ts | 34 + packages/deployer/tests/mock.spec.ts | 3 + .../src/builds/MainModuleGasEstimation.ts | 854 + packages/estimator/src/builds/index.ts | 1 + packages/estimator/src/estimator.ts | 15 + packages/estimator/src/index.ts | 3 + .../estimator/src/overwriter-estimator.ts | 137 + .../src/overwriter-sequence-estimator.ts | 139 + packages/estimator/tests/estimator.spec.ts | 44 + .../tests/sequence-estimator.spec.ts | 319 + packages/guard/CHANGELOG.md | 2159 + packages/guard/README.md | 4 + packages/guard/src/guard.gen.ts | 814 + packages/guard/src/index.ts | 2 + packages/guard/src/signer.ts | 294 + packages/indexer/CHANGELOG.md | 1358 + packages/indexer/README.md | 4 + packages/indexer/src/index.ts | 38 + packages/metadata/CHANGELOG.md | 1366 + packages/metadata/README.md | 4 + packages/metadata/src/index.ts | 68 + packages/metadata/src/metadata.gen.ts | 2384 + packages/migration/src/defaults.ts | 6 + packages/migration/src/index.ts | 4 + packages/migration/src/migrations/index.ts | 25 + .../src/migrations/migration_01_02.ts | 113 + packages/migration/src/migrator.ts | 123 + packages/migration/src/version.ts | 30 + packages/multicall/README.md | 169 + packages/multicall/src/constants.ts | 5 + packages/multicall/src/index.ts | 2 + packages/multicall/src/multicall.ts | 321 + .../src/providers/external-provider.ts | 44 + packages/multicall/src/providers/index.ts | 3 + .../src/providers/provider-middleware.ts | 11 + packages/multicall/src/providers/provider.ts | 119 + packages/multicall/src/types.ts | 8 + packages/multicall/src/utils.ts | 47 + packages/multicall/tests/multicall.spec.ts | 600 + packages/multicall/tests/utils/index.ts | 33 + packages/network/CHANGELOG.md | 2749 + packages/network/README.md | 4 + packages/network/constants/package.json | 4 + packages/network/src/config.ts | 128 + packages/network/src/constants.ts | 774 + packages/network/src/index.ts | 5 + packages/network/src/json-rpc-provider.ts | 108 + packages/network/src/json-rpc/index.ts | 5 + .../src/json-rpc/middleware/allow-provider.ts | 42 + .../json-rpc/middleware/cached-provider.ts | 175 + .../src/json-rpc/middleware/eager-provider.ts | 62 + .../json-rpc/middleware/exception-provider.ts | 21 + .../network/src/json-rpc/middleware/index.ts | 9 + .../json-rpc/middleware/logging-provider.ts | 33 + .../json-rpc/middleware/network-provider.ts | 33 + .../json-rpc/middleware/public-provider.ts | 56 + .../json-rpc/middleware/signing-provider.ts | 51 + .../src/json-rpc/middleware/singleflight.ts | 95 + packages/network/src/json-rpc/router.ts | 54 + packages/network/src/json-rpc/sender.ts | 99 + packages/network/src/json-rpc/types.ts | 39 + packages/network/src/json-rpc/utils.ts | 17 + packages/network/src/utils.ts | 210 + packages/provider/README.md | 4 + packages/provider/hardhat1.config.js | 16 + packages/provider/hardhat2.config.js | 16 + packages/provider/src/analytics.ts | 47 + packages/provider/src/client.ts | 535 + packages/provider/src/eip191exceptions.ts | 137 + packages/provider/src/extended.ts | 26 + packages/provider/src/index.ts | 8 + packages/provider/src/init.ts | 170 + packages/provider/src/provider.ts | 524 + packages/provider/src/signer.ts | 300 + packages/provider/src/transactions.ts | 57 + .../src/transports/base-provider-transport.ts | 415 + .../src/transports/base-wallet-transport.ts | 475 + .../base-injected-transport.ts | 101 + .../extension-message-handler.ts | 29 + .../extension-message-provider.ts | 41 + .../transports/extension-transport/index.ts | 3 + packages/provider/src/transports/index.ts | 8 + .../src/transports/mux-transport/index.ts | 1 + .../mux-transport/mux-message-provider.ts | 249 + .../src/transports/proxy-transport/index.ts | 3 + .../proxy-transport/proxy-message-channel.ts | 57 + .../proxy-transport/proxy-message-handler.ts | 44 + .../proxy-transport/proxy-message-provider.ts | 85 + .../src/transports/unreal-transport/index.ts | 2 + .../unreal-transport/overridelogs.ts | 34 + .../unreal-message-handler.ts | 121 + .../unreal-message-provider.ts | 121 + .../src/transports/wallet-request-handler.ts | 940 + .../src/transports/window-transport/index.ts | 2 + .../window-message-handler.ts | 168 + .../window-message-provider.ts | 197 + packages/provider/src/types.ts | 380 + packages/provider/src/utils.ts | 212 + packages/provider/src/utils/index.ts | 75 + packages/provider/tests/client.spec.ts | 1637 + packages/provider/tests/eip191prefix.spec.ts | 22 + packages/provider/tests/messages.ts | 93 + packages/provider/tests/provider.spec.ts | 1743 + .../tests/remove-eip191prefix.spec.ts | 34 + packages/provider/tests/signer.spec.ts | 1091 + packages/provider/tests/transactions.spec.ts | 109 + packages/provider/tests/zeroxv3.spec.ts | 14 + packages/react-native/src/index.ts | 1 + packages/react-native/src/keychain-store.ts | 30 + packages/relayer/CHANGELOG.md | 3132 + packages/relayer/README.md | 4 + packages/relayer/hardhat.config.js | 15 + packages/relayer/src/index.ts | 86 + packages/relayer/src/local-relayer.ts | 79 + packages/relayer/src/provider-relayer.ts | 247 + packages/relayer/src/rpc-relayer/index.ts | 328 + .../relayer/src/rpc-relayer/relayer.gen.ts | 1461 + .../relayer/tests/provider-relayer.spec.ts | 532 + packages/replacer/src/cached.ts | 31 + packages/replacer/src/index.ts | 118 + packages/replacer/src/ipfs.ts | 9 + packages/services/api/CHANGELOG.md | 2 - packages/services/api/src/api.gen.ts | 3779 +- packages/services/guard/CHANGELOG.md | 1 - packages/services/indexer/CHANGELOG.md | 2 - packages/services/metadata/CHANGELOG.md | 2 - packages/services/relayer/CHANGELOG.md | 2 - .../relayer/src/rpc-relayer/relayer.gen.ts | 1365 +- packages/sessions/hardhat.config.js | 11 + packages/sessions/src/index.ts | 2 + packages/sessions/src/tracker.ts | 56 + packages/sessions/src/trackers/cached.ts | 186 + packages/sessions/src/trackers/debug.ts | 96 + packages/sessions/src/trackers/deduped.ts | 99 + packages/sessions/src/trackers/index.ts | 7 + packages/sessions/src/trackers/local.ts | 594 + packages/sessions/src/trackers/multiple.ts | 230 + .../sessions/src/trackers/promise-cache.ts | 58 + .../sessions/src/trackers/remote/index.ts | 359 + .../src/trackers/remote/sessions.gen.ts | 634 + .../sessions/src/trackers/stores/index.ts | 78 + .../src/trackers/stores/indexedDBStore.ts | 191 + .../src/trackers/stores/memoryStore.ts | 88 + packages/sessions/tests/local.spec.ts | 1195 + packages/signhub/src/index.ts | 2 + packages/signhub/src/orchestrator.ts | 218 + packages/signhub/src/signers/index.ts | 2 + packages/signhub/src/signers/signer.ts | 45 + packages/signhub/src/signers/wrapper.ts | 41 + packages/signhub/tests/orchestrator.spec.ts | 551 + packages/simulator/src/geth-call.ts | 90 + packages/simulator/src/index.ts | 2 + packages/simulator/src/simulate.ts | 28 + .../tests/sequence-simulator.spec.ts | 298 + packages/tests/src/builds/artifact.ts | 9 + packages/tests/src/builds/index.ts | 4 + .../tests/src/builds/v1/artifacts/Factory.ts | 37 + .../src/builds/v1/artifacts/GuestModule.ts | 295 + .../src/builds/v1/artifacts/MainModule.ts | 528 + .../v1/artifacts/MainModuleUpgradable.ts | 530 + .../src/builds/v1/artifacts/MultiCallUtils.ts | 281 + .../src/builds/v1/artifacts/SequenceUtils.ts | 527 + packages/tests/src/builds/v1/index.ts | 6 + .../tests/src/builds/v2/artifacts/Factory.ts | 37 + .../src/builds/v2/artifacts/GuestModule.ts | 628 + .../src/builds/v2/artifacts/MainModule.ts | 1104 + .../v2/artifacts/MainModuleUpgradable.ts | 1062 + .../v2/artifacts/UniversalSigValidator.ts | 190 + packages/tests/src/builds/v2/index.ts | 5 + packages/tests/src/configs/index.ts | 1 + packages/tests/src/configs/random.ts | 47 + packages/tests/src/context/index.ts | 13 + packages/tests/src/context/v1.ts | 103 + packages/tests/src/context/v2.ts | 24 + packages/tests/src/index.ts | 8 + packages/tests/src/singletonFactory.ts | 95 + packages/tests/src/tokens/erc20.ts | 324 + packages/tests/src/utils.ts | 37 + packages/utils/CHANGELOG.md | 1670 + packages/utils/abi/CHANGELOG.md | 2 - packages/utils/src/base64.ts | 23 + packages/utils/src/big-number.ts | 14 + packages/utils/src/digest.ts | 18 + packages/utils/src/index.ts | 17 + packages/utils/src/is-node-or-browser.ts | 9 + packages/utils/src/jwt-decode.ts | 10 + packages/utils/src/logger.ts | 98 + packages/utils/src/merkle.ts | 49 + packages/utils/src/merkletree/Base.ts | 109 + packages/utils/src/merkletree/MerkleTree.ts | 186 + packages/utils/src/merkletree/README.md | 1 + packages/utils/src/merkletree/index.ts | 1 + packages/utils/src/network.ts | 27 + packages/utils/src/promise-cache.ts | 58 + packages/utils/src/promisify.ts | 32 + packages/utils/src/query-string.ts | 15 + packages/utils/src/rand.ts | 5 + packages/utils/src/sanitize.ts | 27 + packages/utils/src/sleep.ts | 8 + packages/utils/src/typed-data.ts | 24 + packages/utils/src/types.ts | 25 + packages/utils/src/web.ts | 2 + packages/utils/tests/base64.spec.ts | 49 + packages/utils/tests/jwt-decode.spec.ts | 13 + packages/utils/tests/merkle.spec.ts | 34 + packages/utils/tests/query-string.spec.ts | 51 + packages/utils/tests/sanitize.spec.ts | 21 + packages/waas-ethers/README.md | 4 + packages/waas-ethers/src/index.ts | 1 + packages/waas-ethers/src/signer.ts | 135 + packages/waas/README.md | 4 + packages/waas/src/auth.ts | 712 + packages/waas/src/base.ts | 605 + packages/waas/src/challenge.ts | 121 + .../waas/src/clients/authenticator.gen.ts | 823 + packages/waas/src/clients/intent.gen.ts | 593 + packages/waas/src/email.ts | 134 + packages/waas/src/index.ts | 14 + packages/waas/src/intents/accounts.ts | 24 + packages/waas/src/intents/base.ts | 54 + packages/waas/src/intents/index.ts | 4 + packages/waas/src/intents/messages.ts | 21 + packages/waas/src/intents/responses.ts | 290 + packages/waas/src/intents/session.ts | 71 + packages/waas/src/intents/transactions.ts | 383 + packages/waas/src/intents/utils.ts | 7 + packages/waas/src/networks.ts | 49 + packages/waas/src/secure-store.ts | 69 + packages/waas/src/session/index.ts | 42 + packages/waas/src/session/keyTypes.ts | 4 + packages/waas/src/session/secp256k1.ts | 48 + packages/waas/src/session/secp256r1.ts | 92 + packages/waas/src/store.ts | 89 + packages/waas/src/subtle-crypto.ts | 102 + packages/waas/tests/intents.spec.ts | 168 + packages/wallet/CHANGELOG.md | 3916 + packages/wallet/README.md | 4 + packages/wallet/hardhat.config.js | 11 + packages/wallet/hardhat2.config.js | 11 + packages/wallet/src/index.ts | 5 + packages/wallet/src/orchestrator/wrapper.ts | 46 + packages/wallet/src/signer.ts | 96 + packages/wallet/src/utils.ts | 31 + packages/wallet/src/wallet.ts | 438 + .../tests/utils/deploy-wallet-context.ts | 57 + packages/wallet/tests/utils/get-contract.ts | 0 packages/wallet/tests/utils/index.ts | 5 + packages/wallet/tests/wallet.spec.ts | 594 + .../wallet/wallet-contracts/.eslintignore | 3 + packages/wallet/wallet-contracts/.eslintrc.js | 38 + .../wallet/wallet-contracts/.gitattributes | 1 + .../actions/install-dependencies/action.yml | 36 + .../wallet-contracts/.github/workflows/ci.yml | 108 + packages/wallet/wallet-contracts/.gitmodules | 6 + packages/wallet/wallet-contracts/.prettierrc | 9 + packages/wallet/wallet-contracts/.solcover.js | 3 + .../wallet/wallet-contracts/.solhint.json | 26 + .../0xsequence-wallet-contracts-3.0.1.tgz | Bin 0 -> 34322 bytes .../Counter/.github/workflows/test.yml | 38 + .../wallet-contracts/Counter/.gitmodules | 3 + .../wallet/wallet-contracts/Counter/README.md | 66 + .../Counter.s.sol/1/run-1763223074249.json | 47 + .../Counter.s.sol/1/run-1763223530987.json | 47 + .../broadcast/Counter.s.sol/1/run-latest.json | 47 + .../wallet-contracts/Counter/foundry.lock | 8 + .../wallet-contracts/Counter/foundry.toml | 6 + .../Counter/lib/forge-std/.gitattributes | 1 + .../Counter/lib/forge-std/.github/CODEOWNERS | 1 + .../lib/forge-std/.github/dependabot.yml | 6 + .../lib/forge-std/.github/workflows/ci.yml | 142 + .../lib/forge-std/.github/workflows/sync.yml | 36 + .../Counter/lib/forge-std/CONTRIBUTING.md | 193 + .../Counter/lib/forge-std/LICENSE-APACHE | 203 + .../Counter/lib/forge-std/LICENSE-MIT | 25 + .../Counter/lib/forge-std/README.md | 266 + .../lib/forge-std/RELEASE_CHECKLIST.md | 12 + .../Counter/lib/forge-std/foundry.toml | 27 + .../Counter/lib/forge-std/package.json | 16 + .../Counter/lib/forge-std/scripts/vm.py | 646 + .../Counter/lib/forge-std/src/Base.sol | 48 + .../Counter/lib/forge-std/src/Config.sol | 60 + .../Counter/lib/forge-std/src/LibVariable.sol | 477 + .../Counter/lib/forge-std/src/Script.sol | 28 + .../lib/forge-std/src/StdAssertions.sol | 764 + .../Counter/lib/forge-std/src/StdChains.sol | 287 + .../Counter/lib/forge-std/src/StdCheats.sol | 829 + .../Counter/lib/forge-std/src/StdConfig.sol | 612 + .../lib/forge-std/src/StdConstants.sol | 30 + .../Counter/lib/forge-std/src/StdError.sol | 15 + .../lib/forge-std/src/StdInvariant.sol | 122 + .../Counter/lib/forge-std/src/StdJson.sol | 283 + .../Counter/lib/forge-std/src/StdMath.sol | 43 + .../Counter/lib/forge-std/src/StdStorage.sol | 473 + .../Counter/lib/forge-std/src/StdStyle.sol | 333 + .../Counter/lib/forge-std/src/StdToml.sol | 283 + .../Counter/lib/forge-std/src/StdUtils.sol | 208 + .../Counter/lib/forge-std/src/Test.sol | 34 + .../Counter/lib/forge-std/src/Vm.sol | 2494 + .../Counter/lib/forge-std/src/console.sol | 1560 + .../Counter/lib/forge-std/src/console2.sol | 4 + .../lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../lib/forge-std/src/interfaces/IERC165.sol | 12 + .../lib/forge-std/src/interfaces/IERC20.sol | 43 + .../lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../lib/forge-std/src/interfaces/IERC6909.sol | 72 + .../lib/forge-std/src/interfaces/IERC721.sol | 164 + .../lib/forge-std/src/interfaces/IERC7540.sol | 150 + .../lib/forge-std/src/interfaces/IERC7575.sol | 241 + .../forge-std/src/interfaces/IMulticall3.sol | 73 + .../Counter/lib/forge-std/src/safeconsole.sol | 13937 +++ .../lib/forge-std/test/CommonBase.t.sol | 44 + .../Counter/lib/forge-std/test/Config.t.sol | 352 + .../lib/forge-std/test/LibVariable.t.sol | 434 + .../lib/forge-std/test/StdAssertions.t.sol | 141 + .../lib/forge-std/test/StdChains.t.sol | 227 + .../lib/forge-std/test/StdCheats.t.sol | 639 + .../lib/forge-std/test/StdConstants.t.sol | 38 + .../Counter/lib/forge-std/test/StdError.t.sol | 120 + .../Counter/lib/forge-std/test/StdJson.t.sol | 49 + .../Counter/lib/forge-std/test/StdMath.t.sol | 202 + .../lib/forge-std/test/StdStorage.t.sol | 488 + .../Counter/lib/forge-std/test/StdStyle.t.sol | 110 + .../Counter/lib/forge-std/test/StdToml.t.sol | 49 + .../Counter/lib/forge-std/test/StdUtils.t.sol | 342 + .../Counter/lib/forge-std/test/Vm.t.sol | 18 + .../test/compilation/CompilationScript.sol | 10 + .../compilation/CompilationScriptBase.sol | 10 + .../test/compilation/CompilationTest.sol | 10 + .../test/compilation/CompilationTestBase.sol | 10 + .../test/fixtures/broadcast.log.json | 187 + .../lib/forge-std/test/fixtures/config.toml | 81 + .../lib/forge-std/test/fixtures/test.json | 8 + .../lib/forge-std/test/fixtures/test.toml | 6 + .../Counter/script/Counter.s.sol | 19 + .../wallet-contracts/Counter/src/Counter.sol | 14 + .../Counter/test/Counter.t.sol | 24 + .../Counter/utils/JsonBindings.sol | 18 + packages/wallet/wallet-contracts/LICENSE | 219 + packages/wallet/wallet-contracts/README.md | 56 + .../audits/v1/Consensys_Diligence.md | 7 + .../v1/Quantstamp_Arcadeum_Report_Final.pdf | Bin 0 -> 399997 bytes .../v1/sequence_quantstamp_audit_feb_2021.pdf | Bin 0 -> 376935 bytes .../Sequence Wallet - Zellic Audit Report.pdf | Bin 0 -> 1669108 bytes ...-horizon-sequence-wallet-audit-2023-02.pdf | Bin 0 -> 1020223 bytes .../wallet-contracts/config/PROD.env.sample | 3 + .../wallet-contracts/contracts/Factory.sol | 23 + .../GuestModule-wallet/metadata.json | 1 + .../contracts/interfaces/IERC1271Wallet.sol | 38 + .../sources/contracts/modules/GuestModule.sol | 126 + .../modules/artifacts/GuestModule.json | 14655 +++ .../artifacts/GuestModule_metadata.json | 985 + .../c563de663c25f57de739af959840b24e.json | 96556 ++++++++++++++++ .../contracts/modules/commons/ModuleAuth.sol | 176 + .../contracts/modules/commons/ModuleCalls.sol | 156 + .../modules/commons/ModuleCreator.sol | 36 + .../modules/commons/ModuleERC165.sol | 18 + .../contracts/modules/commons/ModuleNonce.sol | 67 + .../commons/ModuleOnlyDelegatecall.sol | 23 + .../modules/commons/ModuleSelfAuth.sol | 14 + .../modules/commons/ModuleStorage.sol | 23 + .../commons/interfaces/IModuleAuth.sol | 53 + .../commons/interfaces/IModuleCalls.sol | 44 + .../commons/interfaces/IModuleCreator.sol | 14 + .../submodules/auth/SequenceBaseSig.sol | 276 + .../submodules/auth/SequenceChainedSig.sol | 129 + .../submodules/auth/SequenceDynamicSig.sol | 31 + .../submodules/auth/SequenceNoChainIdSig.sol | 23 + .../submodules/nonce/SubModuleNonce.sol | 30 + .../sources/contracts/utils/LibBytes.sol | 83 + .../contracts/utils/LibBytesPointer.sol | 161 + .../sources/contracts/utils/LibOptim.sol | 102 + .../contracts/utils/SignatureValidator.sol | 137 + .../wallet-contracts/contracts/Wallet.sol | 60 + .../contracts/hooks/WalletProxyHook.sol | 12 + .../hooks/interfaces/IWalletProxy.sol | 12 + .../contracts/interfaces/IERC1271Wallet.sol | 26 + .../interfaces/receivers/IERC1155Receiver.sol | 9 + .../interfaces/receivers/IERC223Receiver.sol | 6 + .../interfaces/receivers/IERC721Receiver.sol | 6 + .../interfaces/receivers/IERC777Receiver.sol | 6 + .../contracts/interfaces/tokens/IERC1155.sol | 27 + .../contracts/interfaces/tokens/IERC20.sol | 14 + .../contracts/interfaces/tokens/IERC721.sol | 18 + .../contracts/mocks/AlwaysRevertMock.sol | 8 + .../contracts/mocks/CallReceiverMock.sol | 22 + .../contracts/mocks/DelegateCallMock.sol | 23 + .../contracts/mocks/ERC1155Mock.sol | 63 + .../contracts/mocks/ERC165CheckerMock.sol | 53 + .../contracts/mocks/ERC20Mock.sol | 51 + .../contracts/mocks/ERC721Mock.sol | 86 + .../contracts/mocks/GasBurnerMock.sol | 17 + .../contracts/mocks/HookCallerMock.sol | 55 + .../contracts/mocks/HookMock.sol | 8 + .../contracts/mocks/LibBytesImpl.sol | 20 + .../contracts/mocks/LibBytesPointerImpl.sol | 24 + .../contracts/mocks/LibStringImp.sol | 24 + .../contracts/mocks/ModuleMock.sol | 10 + .../contracts/modules/GuestModule.sol | 103 + .../contracts/modules/MainModule.sol | 49 + .../modules/MainModuleGasEstimation.sol | 104 + .../modules/MainModuleUpgradable.sol | 61 + .../modules/commons/Implementation.sol | 31 + .../contracts/modules/commons/ModuleAuth.sol | 166 + .../modules/commons/ModuleAuthConvenience.sol | 43 + .../modules/commons/ModuleAuthFixed.sol | 74 + .../modules/commons/ModuleAuthUpgradable.sol | 50 + .../contracts/modules/commons/ModuleCalls.sol | 131 + .../modules/commons/ModuleCreator.sol | 35 + .../modules/commons/ModuleERC165.sol | 17 + .../modules/commons/ModuleERC5719.sol | 18 + .../modules/commons/ModuleExtraAuth.sol | 75 + .../contracts/modules/commons/ModuleHooks.sol | 142 + .../contracts/modules/commons/ModuleIPFS.sol | 37 + .../contracts/modules/commons/ModuleNonce.sol | 66 + .../commons/ModuleOnlyDelegatecall.sol | 22 + .../modules/commons/ModuleSelfAuth.sol | 13 + .../modules/commons/ModuleStorage.sol | 22 + .../modules/commons/ModuleUpdate.sol | 49 + .../ModuleIgnoreAuthUpgradable.sol | 20 + .../gas-estimation/ModuleIgnoreNonceCalls.sol | 34 + .../commons/interfaces/IModuleAuth.sol | 46 + .../interfaces/IModuleAuthUpgradable.sol | 9 + .../commons/interfaces/IModuleCalls.sol | 37 + .../commons/interfaces/IModuleCreator.sol | 13 + .../commons/interfaces/IModuleHooks.sol | 31 + .../commons/interfaces/IModuleUpdate.sol | 21 + .../submodules/auth/SequenceBaseSig.sol | 255 + .../submodules/auth/SequenceChainedSig.sol | 112 + .../submodules/auth/SequenceDynamicSig.sol | 25 + .../submodules/auth/SequenceNoChainIdSig.sol | 14 + .../submodules/nonce/SubModuleNonce.sol | 33 + .../contracts/modules/utils/GasEstimator.sol | 15 + .../modules/utils/MultiCallUtils.sol | 105 + .../contracts/modules/utils/RequireUtils.sol | 112 + .../contracts/modules/utils/SequenceUtils.sol | 7 + .../contracts/trust/Trust.sol | 160 + .../contracts/trust/TrustFactory.sol | 33 + .../contracts/utils/LibAddress.sol | 17 + .../contracts/utils/LibBytes.sol | 75 + .../contracts/utils/LibBytesPointer.sol | 150 + .../contracts/utils/LibOptim.sol | 74 + .../contracts/utils/LibString.sol | 87 + .../contracts/utils/SignatureValidator.sol | 127 + .../wallet/wallet-contracts/docs/book.css | 13 + .../wallet/wallet-contracts/docs/book.toml | 13 + .../wallet-contracts/docs/solidity.min.js | 74 + .../wallet-contracts/docs/src/README.md | 56 + .../wallet-contracts/docs/src/SUMMARY.md | 92 + .../contracts/Factory.sol/contract.Factory.md | 32 + .../docs/src/contracts/README.md | 11 + .../contracts/Wallet.sol/library.Wallet.md | 58 + .../docs/src/contracts/hooks/README.md | 5 + .../contract.WalletProxyHook.md | 15 + .../interface.IWalletProxy.md | 14 + .../src/contracts/hooks/interfaces/README.md | 4 + .../interface.IERC1271Wallet.md | 57 + .../docs/src/contracts/interfaces/README.md | 6 + .../interface.IERC1155Receiver.md | 21 + .../interface.IERC223Receiver.md | 12 + .../interface.IERC721Receiver.md | 12 + .../interface.IERC777Receiver.md | 12 + .../contracts/interfaces/receivers/README.md | 7 + .../tokens/IERC1155.sol/interface.IERC1155.md | 83 + .../tokens/IERC20.sol/interface.IERC20.md | 60 + .../tokens/IERC721.sol/interface.IERC721.md | 87 + .../src/contracts/interfaces/tokens/README.md | 6 + .../contract.AlwaysRevertMock.md | 12 + .../contract.CallReceiverMock.md | 48 + .../contract.DelegateCallMock.md | 48 + .../ERC1155Mock.sol/contract.ERC1155Mock.md | 110 + .../contract.ERC165CheckerMock.md | 37 + .../mocks/ERC20Mock.sol/contract.ERC20Mock.md | 103 + .../ERC721Mock.sol/contract.ERC721Mock.md | 151 + .../contract.GasBurnerMock.md | 19 + .../contract.HookCallerMock.md | 49 + .../mocks/HookMock.sol/contract.HookMock.md | 12 + .../LibBytesImpl.sol/contract.LibBytesImpl.md | 26 + .../contract.LibBytesPointerImpl.md | 33 + .../LibStringImp.sol/contract.LibStringImp.md | 33 + .../ModuleMock.sol/contract.ModuleMock.md | 19 + .../docs/src/contracts/mocks/README.md | 17 + .../GuestModule.sol/contract.GuestModule.md | 124 + .../MainModule.sol/contract.MainModule.md | 57 + .../contract.MainModuleGasEstimation.md | 85 + .../contract.MainModuleUpgradable.md | 63 + .../docs/src/contracts/modules/README.md | 9 + .../contract.Implementation.md | 42 + .../ModuleAuth.sol/abstract.ModuleAuth.md | 203 + .../abstract.ModuleAuthConvenience.md | 53 + .../abstract.ModuleAuthFixed.md | 108 + .../abstract.ModuleAuthUpgradable.md | 75 + .../ModuleCalls.sol/abstract.ModuleCalls.md | 104 + .../contract.ModuleCreator.md | 57 + .../ModuleERC165.sol/abstract.ModuleERC165.md | 31 + .../contract.ModuleERC5719.md | 15 + .../abstract.ModuleExtraAuth.md | 92 + .../ModuleHooks.sol/contract.ModuleHooks.md | 202 + .../ModuleIPFS.sol/contract.ModuleIPFS.md | 52 + .../ModuleNonce.sol/contract.ModuleNonce.md | 96 + .../contract.ModuleOnlyDelegatecall.md | 36 + .../contract.ModuleSelfAuth.md | 19 + .../library.ModuleStorage.md | 33 + .../ModuleUpdate.sol/contract.ModuleUpdate.md | 70 + .../src/contracts/modules/commons/README.md | 23 + .../abstract.ModuleIgnoreAuthUpgradable.md | 32 + .../abstract.ModuleIgnoreNonceCalls.md | 26 + .../modules/commons/gas-estimation/README.md | 5 + .../IModuleAuth.sol/abstract.IModuleAuth.md | 101 + .../interface.IModuleAuthUpgradable.md | 14 + .../interface.IModuleCalls.md | 78 + .../interface.IModuleCreator.md | 33 + .../interface.IModuleHooks.md | 77 + .../abstract.IModuleUpdate.md | 46 + .../modules/commons/interfaces/README.md | 9 + .../modules/commons/submodules/README.md | 5 + .../modules/commons/submodules/auth/README.md | 7 + .../library.SequenceBaseSig.md | 225 + .../abstract.SequenceChainedSig.md | 91 + .../library.SequenceDynamicSig.md | 35 + .../library.SequenceNoChainIdSig.md | 28 + .../commons/submodules/nonce/README.md | 4 + .../library.SubModuleNonce.md | 51 + .../GasEstimator.sol/contract.GasEstimator.md | 14 + .../contract.MultiCallUtils.md | 133 + .../src/contracts/modules/utils/README.md | 7 + .../RequireUtils.sol/contract.RequireUtils.md | 149 + .../contract.SequenceUtils.md | 7 + .../docs/src/contracts/trust/README.md | 6 + .../trust/Trust.sol/contract.Trust.md | 186 + .../trust/Trust.sol/function.absDiff.md | 8 + .../TrustFactory.sol/contract.TrustFactory.md | 26 + .../LibAddress.sol/library.LibAddress.md | 23 + .../utils/LibBytes.sol/library.LibBytes.md | 114 + .../library.LibBytesPointer.md | 201 + .../utils/LibOptim.sol/library.LibOptim.md | 100 + .../utils/LibString.sol/library.LibString.md | 106 + .../docs/src/contracts/utils/README.md | 9 + .../library.SignatureValidator.md | 130 + packages/wallet/wallet-contracts/foundry.lock | 8 + packages/wallet/wallet-contracts/foundry.toml | 11 + .../foundry_test/base/AdvTest.sol | 205 + .../foundry_test/hooks/WalletProxyHook.t.sol | 37 + .../modules/commons/Implementation.t.sol | 66 + .../modules/commons/ModuleCalls.t.sol | 351 + .../modules/commons/ModuleERC5719.t.sol | 42 + .../modules/commons/ModuleExtraAuth.t.sol | 175 + .../modules/commons/ModuleIPFS.t.sol | 46 + .../modules/commons/ModuleStorage.t.sol | 84 + .../submodules/auth/SequenceBaseSig.t.sol | 325 + .../submodules/auth/SequenceChainedSig.t.sol | 276 + .../submodules/auth/SequenceDynamicSig.t.sol | 57 + .../auth/SequenceNoChainIdSig.t.sol | 51 + .../submodules/nonce/SubModuleNonce.t.sol | 16 + .../modules/utils/L2CompressorEncoder.sol | 393 + .../modules/utils/L2CompressorHuff.t.sol | 284 + .../utils/L2CompressorHuffReadExecute.sol | 143 + .../utils/L2CompressorHuffReadFlag.t.sol | 1018 + .../utils/L2CompressorHuffReadNonce.sol | 55 + .../utils/L2CompressorHuffReadTx.t.sol | 93 + .../utils/L2CompressorHuffReadTxs.t.sol | 123 + .../modules/utils/RequireUtils.t.sol | 158 + .../foundry_test/trust/Trust.t.sol | 867 + .../foundry_test/trust/TrustFactory.t.sol | 53 + .../foundry_test/utils/LibAddress.t.sol | 15 + .../foundry_test/utils/LibBytes.t.sol | 100 + .../foundry_test/utils/LibBytesPointer.t.sol | 152 + .../foundry_test/utils/LibOptim.t.sol | 63 + .../utils/SignatureValidator.t.sol | 199 + packages/wallet/wallet-contracts/funding.json | 5 + .../wallet/wallet-contracts/hardhat.config.ts | 72 + .../lib/forge-std/.github/workflows/ci.yml | 92 + .../lib/forge-std/.github/workflows/sync.yml | 29 + .../lib/forge-std/.gitmodules | 3 + .../lib/forge-std/LICENSE-APACHE | 203 + .../lib/forge-std/LICENSE-MIT | 25 + .../wallet-contracts/lib/forge-std/README.md | 250 + .../lib/forge-std/foundry.toml | 21 + .../lib/ds-test/.github/workflows/build.yml | 41 + .../lib/forge-std/lib/ds-test/LICENSE | 674 + .../lib/forge-std/lib/ds-test/Makefile | 14 + .../lib/forge-std/lib/ds-test/default.nix | 4 + .../lib/forge-std/lib/ds-test/demo/demo.sol | 222 + .../lib/forge-std/lib/ds-test/package.json | 15 + .../lib/forge-std/lib/ds-test/src/test.sol | 592 + .../lib/forge-std/lib/ds-test/src/test.t.sol | 417 + .../lib/forge-std/package.json | 16 + .../lib/forge-std/src/Base.sol | 33 + .../lib/forge-std/src/Script.sol | 26 + .../lib/forge-std/src/StdAssertions.sol | 376 + .../lib/forge-std/src/StdChains.sol | 231 + .../lib/forge-std/src/StdCheats.sol | 639 + .../lib/forge-std/src/StdError.sol | 15 + .../lib/forge-std/src/StdInvariant.sol | 92 + .../lib/forge-std/src/StdJson.sol | 179 + .../lib/forge-std/src/StdMath.sol | 43 + .../lib/forge-std/src/StdStorage.sol | 327 + .../lib/forge-std/src/StdStyle.sol | 333 + .../lib/forge-std/src/StdUtils.sol | 192 + .../lib/forge-std/src/Test.sol | 32 + .../wallet-contracts/lib/forge-std/src/Vm.sol | 490 + .../lib/forge-std/src/console.sol | 1533 + .../lib/forge-std/src/console2.sol | 1546 + .../lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../lib/forge-std/src/interfaces/IERC165.sol | 12 + .../lib/forge-std/src/interfaces/IERC20.sol | 43 + .../lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../lib/forge-std/src/interfaces/IERC721.sol | 164 + .../forge-std/src/interfaces/IMulticall3.sol | 73 + .../lib/forge-std/test/StdAssertions.t.sol | 999 + .../lib/forge-std/test/StdChains.t.sol | 160 + .../lib/forge-std/test/StdCheats.t.sol | 418 + .../lib/forge-std/test/StdError.t.sol | 118 + .../lib/forge-std/test/StdMath.t.sol | 197 + .../lib/forge-std/test/StdStorage.t.sol | 283 + .../lib/forge-std/test/StdStyle.t.sol | 110 + .../lib/forge-std/test/StdUtils.t.sol | 297 + .../test/compilation/CompilationScript.sol | 10 + .../compilation/CompilationScriptBase.sol | 10 + .../test/compilation/CompilationTest.sol | 10 + .../test/compilation/CompilationTestBase.sol | 10 + .../test/fixtures/broadcast.log.json | 187 + .../lib/foundry-huff/.git-blame-ignore-revs | 2 + .../foundry-huff/.github/workflows/tests.yaml | 31 + .../lib/foundry-huff/.gitmodules | 6 + .../wallet-contracts/lib/foundry-huff/LICENSE | 201 + .../lib/foundry-huff/README.md | 167 + .../lib/foundry-huff/assets/Group 1.png | Bin 0 -> 23776 bytes .../lib/foundry-huff/assets/banner.jpg | Bin 0 -> 45536 bytes .../black_white_huff-removebg-preview.png | Bin 0 -> 5748 bytes .../foundry-huff/assets/black_white_huff.png | Bin 0 -> 8644 bytes .../lib/foundry-huff/assets/foundry.png | Bin 0 -> 14491 bytes .../assets/foundry_huff_banner.jpg | Bin 0 -> 45502 bytes .../assets/foundry_huff_banner.png | Bin 0 -> 23481 bytes .../lib/foundry-huff/assets/huff.png | Bin 0 -> 11820 bytes .../lib/foundry-huff/assets/inverted_huff.png | Bin 0 -> 14651 bytes .../assets/x-removebg-preview.png | Bin 0 -> 11985 bytes .../lib/foundry-huff/assets/x.jpg | Bin 0 -> 8013 bytes .../lib/foundry-huff/foundry.toml | 10 + .../lib/forge-std/.github/workflows/ci.yml | 134 + .../lib/forge-std/.github/workflows/sync.yml | 29 + .../foundry-huff/lib/forge-std/.gitmodules | 3 + .../foundry-huff/lib/forge-std/LICENSE-APACHE | 203 + .../foundry-huff/lib/forge-std/LICENSE-MIT | 25 + .../lib/foundry-huff/lib/forge-std/README.md | 250 + .../foundry-huff/lib/forge-std/foundry.toml | 21 + .../lib/ds-test/.github/workflows/build.yml | 41 + .../lib/forge-std/lib/ds-test/LICENSE | 674 + .../lib/forge-std/lib/ds-test/Makefile | 14 + .../lib/forge-std/lib/ds-test/default.nix | 4 + .../lib/forge-std/lib/ds-test/demo/demo.sol | 222 + .../lib/forge-std/lib/ds-test/package.json | 15 + .../lib/forge-std/lib/ds-test/src/test.sol | 592 + .../lib/forge-std/lib/ds-test/src/test.t.sol | 417 + .../foundry-huff/lib/forge-std/package.json | 16 + .../foundry-huff/lib/forge-std/src/Base.sol | 35 + .../foundry-huff/lib/forge-std/src/Script.sol | 27 + .../lib/forge-std/src/StdAssertions.sol | 376 + .../lib/forge-std/src/StdChains.sol | 234 + .../lib/forge-std/src/StdCheats.sol | 817 + .../lib/forge-std/src/StdError.sol | 15 + .../lib/forge-std/src/StdInvariant.sol | 92 + .../lib/forge-std/src/StdJson.sol | 179 + .../lib/forge-std/src/StdMath.sol | 43 + .../lib/forge-std/src/StdStorage.sol | 331 + .../lib/forge-std/src/StdStyle.sol | 333 + .../lib/forge-std/src/StdUtils.sol | 198 + .../foundry-huff/lib/forge-std/src/Test.sol | 33 + .../lib/foundry-huff/lib/forge-std/src/Vm.sol | 542 + .../lib/forge-std/src/console.sol | 1533 + .../lib/forge-std/src/console2.sol | 1558 + .../lib/forge-std/src/interfaces/IERC1155.sol | 105 + .../lib/forge-std/src/interfaces/IERC165.sol | 12 + .../lib/forge-std/src/interfaces/IERC20.sol | 43 + .../lib/forge-std/src/interfaces/IERC4626.sol | 190 + .../lib/forge-std/src/interfaces/IERC721.sol | 164 + .../forge-std/src/interfaces/IMulticall3.sol | 73 + .../lib/forge-std/src/safeconsole.sol | 13248 +++ .../lib/forge-std/test/StdAssertions.t.sol | 999 + .../lib/forge-std/test/StdChains.t.sol | 215 + .../lib/forge-std/test/StdCheats.t.sol | 610 + .../lib/forge-std/test/StdError.t.sol | 118 + .../lib/forge-std/test/StdMath.t.sol | 212 + .../lib/forge-std/test/StdStorage.t.sol | 293 + .../lib/forge-std/test/StdStyle.t.sol | 110 + .../lib/forge-std/test/StdUtils.t.sol | 342 + .../test/compilation/CompilationScript.sol | 10 + .../compilation/CompilationScriptBase.sol | 10 + .../test/compilation/CompilationTest.sol | 10 + .../test/compilation/CompilationTestBase.sol | 10 + .../test/fixtures/broadcast.log.json | 187 + .../lib/foundry-huff/scripts/binary_check.sh | 11 + .../lib/foundry-huff/scripts/file_writer.sh | 3 + .../lib/foundry-huff/scripts/rand_bytes.sh | 3 + .../foundry-huff/scripts/read_and_append.sh | 3 + .../lib/solidity-stringutils/.gitattributes | 1 + .../.github/workflows/ci.yml | 14 + .../lib/solidity-stringutils/.gitmodules | 3 + .../lib/solidity-stringutils/LICENSE | 201 + .../lib/solidity-stringutils/Makefile | 4 + .../lib/solidity-stringutils/README | 1 + .../lib/solidity-stringutils/README.md | 357 + .../lib/solidity-stringutils/dappfile | 8 + .../solidity-stringutils/lib/ds-test/LICENSE | 674 + .../solidity-stringutils/lib/ds-test/Makefile | 14 + .../lib/ds-test/default.nix | 4 + .../lib/ds-test/demo/demo.sol | 223 + .../lib/ds-test/src/test.sol | 434 + .../lib/solidity-stringutils/src/strings.sol | 727 + .../solidity-stringutils/src/strings.t.sol | 216 + .../lib/foundry-huff/remappings.txt | 2 + .../lib/foundry-huff/scripts/binary_check.sh | 11 + .../lib/foundry-huff/scripts/file_writer.sh | 3 + .../lib/foundry-huff/scripts/rand_bytes.sh | 3 + .../foundry-huff/scripts/read_and_append.sh | 3 + .../lib/foundry-huff/src/HuffConfig.sol | 247 + .../lib/foundry-huff/src/HuffDeployer.sol | 134 + .../src/depreciated/StatefulDeployer.sol | 73 + .../src/depreciated/StatefulDeployer.t.sol | 56 + .../foundry-huff/src/test/HuffConfig.t.sol | 55 + .../foundry-huff/src/test/HuffDeployer.t.sol | 276 + .../lib/foundry-huff/src/test/Logging.t.sol | 83 + .../src/test/contracts/ConstOverride.huff | 6 + .../src/test/contracts/Constructor.huff | 69 + .../test/contracts/ConstructorNeedsValue.huff | 16 + .../src/test/contracts/EVMVersionCheck.huff | 5 + .../src/test/contracts/LotsOfLogging.huff | 56 + .../src/test/contracts/NoConstructor.huff | 38 + .../src/test/contracts/Number.huff | 38 + .../src/test/contracts/RememberCreator.huff | 24 + .../src/test/interfaces/IConstructor.sol | 7 + .../src/test/interfaces/INumber.sol | 7 + .../src/test/interfaces/IRememberCreator.sol | 6 + .../wallet-contracts/networks/arbitrum.json | 22 + .../networks/arbitrumGoerli.json | 22 + .../networks/arbitrumNova.json | 22 + .../wallet-contracts/networks/avalanche.json | 22 + .../networks/avalancheFuji.json | 22 + .../wallet/wallet-contracts/networks/bnb.json | 22 + .../wallet-contracts/networks/bnbTestnet.json | 22 + .../wallet-contracts/networks/gnosis.json | 22 + .../wallet-contracts/networks/goerli.json | 22 + .../wallet-contracts/networks/hardhat.json | 22 + .../wallet-contracts/networks/mainnet.json | 22 + .../wallet-contracts/networks/mumbai.json | 22 + .../wallet-contracts/networks/optimism.json | 22 + .../wallet-contracts/networks/polygon.json | 26 + .../networks/polygonZkevm.json | 22 + .../wallet/wallet-contracts/package-lock.json | 24771 ++++ packages/wallet/wallet-contracts/package.json | 105 + .../wallet/wallet-contracts/pnpm-lock.yaml | 13554 +++ .../wallet/wallet-contracts/remappings.txt | 3 + .../wallet/wallet-contracts/run_huff_tests.sh | 17 + packages/wallet/wallet-contracts/soldeer.lock | 6 + .../wallet/wallet-contracts/src/Errors.huff | 158 + .../wallet-contracts/src/L2Compressor.huff | 140 + .../wallet-contracts/src/L2CompressorLib.huff | 2562 + ...jkqagwbukjfojatjegwtjmxhdL2Compressor.huff | 142 + ...vvfcuoxtlisicumgcpzqhgavjL2Compressor.huff | 142 + ...egfauooldcwyvlordhurwepivL2Compressor.huff | 142 + ...shkgzisywrbnkhcrodypkvbvyL2Compressor.huff | 142 + ...drtxibkzevmerruajxffksduvL2Compressor.huff | 142 + ...lnugcaogzpvcdfhvolsvzerleL2Compressor.huff | 142 + ...ovsnvnyyhadlushmcopgxtlcwL2Compressor.huff | 142 + ...sqtnysjlyfovitokyykvxttnoL2Compressor.huff | 142 + ...ufexucahwkkbkfdcmuiabvbfeL2Compressor.huff | 142 + ...gvfqaqtuxwpgejdnyqkualpwlL2Compressor.huff | 142 + ...orkxonmlujouewhlrvjjrmurcL2Compressor.huff | 142 + ...skwojupcsygtzovabokiotusaL2Compressor.huff | 142 + ...wzygdglttftvfnbgkuxhmtqwiL2Compressor.huff | 142 + ...aqrahclmuoszdisbtgmuppjvfL2Compressor.huff | 142 + ...kbktfjhzdpajytwhcpkhlmscqL2Compressor.huff | 142 + ...eweytjiloryhjilsqguaprwtwL2Compressor.huff | 142 + ...onlpbmziexnicojtlgsgfouyrL2Compressor.huff | 142 + ...zwlsndhjyagmukhxiugwadpxxL2Compressor.huff | 142 + ...kngjvjjjqfpzmxlycnvbslwevL2Compressor.huff | 142 + ...nijxlttsivcfgzleurbgpchhzL2Compressor.huff | 142 + ...fmyszewnycpzlqmcopsqccarqL2Compressor.huff | 142 + ...vbjyubdfmmdxzehdfcdiwufcrL2Compressor.huff | 142 + ...mhbdbiuueqxutuvcxicgrmnxwL2Compressor.huff | 142 + ...nxxrhkhfelgdrwmnbwwirribaL2Compressor.huff | 142 + ...yicdnumnesfhcjlgtqguwdpnpL2Compressor.huff | 142 + ...csyytsvygxsyhvyojjbqsghpbL2Compressor.huff | 142 + ...yvcmrjzhibkdksklxflvtfefdL2Compressor.huff | 142 + ...fcykqjxgggzptgdvokhmzcvamL2Compressor.huff | 142 + ...lozoqyyfvpcdqeanjxglmtzbbL2Compressor.huff | 142 + .../src/imps/L2CompressorImps.huff | 52 + .../src/imps/L2CompressorReadExecute.huff | 30 + .../src/imps/L2CompressorReadFlag.huff | 30 + .../src/imps/L2CompressorReadNonce.huff | 30 + .../src/imps/L2CompressorReadTx.huff | 30 + .../src/imps/L2CompressorReadTxs.huff | 30 + ...fvplniuqleqmglgpL2CompressorReadNonce.huff | 32 + ...brskpnttujfxlnsuqL2CompressorReadFlag.huff | 32 + ...kvygupcezykxnllxhooL2CompressorReadTx.huff | 32 + ...hmuynutuutdpetfmL2CompressorReadNonce.huff | 32 + ...ijkxkzjebeugweL2CompressorReadExecute.huff | 32 + ...vimfyeuyukrpkefkpjvL2CompressorReadTx.huff | 32 + ...xubslwqheqqdtpojdxL2CompressorReadTxs.huff | 32 + ...fpbluzvxgnvfnbjbvdL2CompressorReadTxs.huff | 32 + ...juvxauktfiveuhazL2CompressorReadNonce.huff | 32 + ...eablvdedlohtwcpgruiL2CompressorReadTx.huff | 32 + ...ujxdddmmbuqrzcvpqlL2CompressorReadTxs.huff | 32 + ...muiiddtfwsyytzwszL2CompressorReadFlag.huff | 32 + ...ecwtcwuiczrfadymzpwL2CompressorReadTx.huff | 32 + ...lfabzhyfjejoyhqoxvnL2CompressorReadTx.huff | 32 + ...licrbibyyssybguhL2CompressorReadNonce.huff | 32 + ...svglcrgoqbepkaL2CompressorReadExecute.huff | 32 + ...ksdozrardbmkofvggL2CompressorReadFlag.huff | 32 + ...zxedpzkrqkrxgpL2CompressorReadExecute.huff | 32 + ...ssijauhsotgyqtayygL2CompressorReadTxs.huff | 32 + ...dwrkmombuemzhicuirL2CompressorReadTxs.huff | 32 + ...tvptvgszvdeemgpomnL2CompressorReadTxs.huff | 32 + ...glrinqvkqirnywzkmmmL2CompressorReadTx.huff | 32 + ...sulrygitvkhredhzhL2CompressorReadFlag.huff | 32 + ...aalvdegpzaqhuqqhiasL2CompressorReadTx.huff | 32 + ...mdvycqormkvpykanxnL2CompressorReadTxs.huff | 32 + ...ucihkxihmonvdzfxL2CompressorReadNonce.huff | 32 + ...fcvecckcbuhhhpvpfL2CompressorReadFlag.huff | 32 + ...ftzbzzrxvcmizbL2CompressorReadExecute.huff | 32 + ...cwxtmeqbuwldxifmL2CompressorReadNonce.huff | 32 + ...jwbyxrediuokmghmftbL2CompressorReadTx.huff | 32 + ...rdpemqiejqiknsfiL2CompressorReadNonce.huff | 32 + ...foughzygdwrhxuzibL2CompressorReadFlag.huff | 32 + ...rixmvtxkffgwchL2CompressorReadExecute.huff | 32 + ...tqmujkoilcaudgL2CompressorReadExecute.huff | 32 + ...ycyuqniujobcpgjuysL2CompressorReadTxs.huff | 32 + ...ixyvzwfzordmogvuL2CompressorReadNonce.huff | 32 + ...yygzhjrvozrogmL2CompressorReadExecute.huff | 32 + ...epdhwqsahoduwcqrrpL2CompressorReadTxs.huff | 32 + ...izmyrwtgelqlacL2CompressorReadExecute.huff | 32 + ...dhdecpajexqefympmL2CompressorReadFlag.huff | 32 + ...xkesysithbtrbvqqL2CompressorReadNonce.huff | 32 + ...vwlvozjzwlctwrzrL2CompressorReadNonce.huff | 32 + ...rexbaruoucdulzvqvL2CompressorReadFlag.huff | 32 + ...zsmahiisgmgdjzfjxqL2CompressorReadTxs.huff | 32 + ...aqwygxkipfvshmgystL2CompressorReadTxs.huff | 32 + ...perstvmceseoukqtcL2CompressorReadFlag.huff | 32 + ...lvuclsezveuuexubagL2CompressorReadTxs.huff | 32 + ...pfceqpqhdfzbiiL2CompressorReadExecute.huff | 32 + ...pfucdlmsxiuwbhxrsL2CompressorReadFlag.huff | 32 + ...xcpetgqmymkladcanwtL2CompressorReadTx.huff | 32 + ...llmivwlrgrfhmdzslL2CompressorReadFlag.huff | 32 + ...rmebqsqsnoleofcgyciL2CompressorReadTx.huff | 32 + ...aqrlwcoejtxsysubcL2CompressorReadFlag.huff | 32 + ...saspukxeydggrhL2CompressorReadExecute.huff | 32 + ...qlpehxidlrhdvkcoyL2CompressorReadFlag.huff | 32 + ...bqyenjlfkzsbjkxcL2CompressorReadNonce.huff | 32 + ...rwmufefnibyzayqaaciL2CompressorReadTx.huff | 32 + ...suogqwefdorgsntvcxL2CompressorReadTxs.huff | 32 + ...ihfqfuruuvbxqbL2CompressorReadExecute.huff | 32 + ...medlqkqqhszmvuuxioL2CompressorReadTxs.huff | 32 + ...bouzrwkvkhpzncpjzsL2CompressorReadTxs.huff | 32 + ...kuiktwofhzwbszraL2CompressorReadNonce.huff | 32 + ...ntvdsgkeofzbhbhdsL2CompressorReadFlag.huff | 32 + ...obnextlfkyykzrdomL2CompressorReadFlag.huff | 32 + ...zdduewzkbcwlvsakcL2CompressorReadFlag.huff | 32 + ...fkhccrhufdhjjazeL2CompressorReadNonce.huff | 32 + ...htlarvljeqysguhoizaL2CompressorReadTx.huff | 32 + ...wrmogebamkqmhdvljmlL2CompressorReadTx.huff | 32 + ...dnlbnftvkuearfL2CompressorReadExecute.huff | 32 + ...stckycmjquytqlfsdxoL2CompressorReadTx.huff | 32 + ...rrpmypzdufaanmpuL2CompressorReadNonce.huff | 32 + ...asdtggpxqllpajsfgL2CompressorReadFlag.huff | 32 + ...tgrrlpmnzupwinL2CompressorReadExecute.huff | 32 + ...mbynuotwqkanwdlaqwpL2CompressorReadTx.huff | 32 + ...gzyejxobzrgvpizgfdL2CompressorReadTxs.huff | 32 + ...ihlkysfiliofczzxkhL2CompressorReadTxs.huff | 32 + ...eikmnrgvhavunciniubL2CompressorReadTx.huff | 32 + ...lvopyxfsbdteqegnyogL2CompressorReadTx.huff | 32 + ...mzpjfotpjfuqxtnqrznL2CompressorReadTx.huff | 32 + ...mayqquwflixlquuhfxhL2CompressorReadTx.huff | 32 + ...itanbofqxpeepnlpnL2CompressorReadFlag.huff | 32 + ...dekencowviukvlcrylcL2CompressorReadTx.huff | 32 + ...wbvymwfzttbygcbfmqL2CompressorReadTxs.huff | 32 + ...hrcqjmlolnoulkL2CompressorReadExecute.huff | 32 + ...ckjtrcwgaqmtqrL2CompressorReadExecute.huff | 32 + ...wzkubprcmgpexkL2CompressorReadExecute.huff | 32 + ...vfvlctpjeldqbrshL2CompressorReadNonce.huff | 32 + ...jpleorchotchzsecL2CompressorReadNonce.huff | 32 + ...wcvynodibgfqnidibL2CompressorReadFlag.huff | 32 + ...jvdzyjcjrsbhplpsL2CompressorReadNonce.huff | 32 + ...gxsfgldujuphcmuueL2CompressorReadFlag.huff | 32 + ...zffpwypehvvksjzbvnL2CompressorReadTxs.huff | 32 + ...klqlujjtzpxrejpmL2CompressorReadNonce.huff | 32 + ...sisgwnqqymvpjvskcL2CompressorReadFlag.huff | 32 + ...htgjgwawtaakhwL2CompressorReadExecute.huff | 32 + ...voiaurnusvgnrhusL2CompressorReadNonce.huff | 32 + ...wupwcjsnyherfswgsgcL2CompressorReadTx.huff | 32 + ...uaqyoulenyhrwfuvsiL2CompressorReadTxs.huff | 32 + ...prlkfulinnjttkL2CompressorReadExecute.huff | 32 + ...xerdftkvyxqwwiL2CompressorReadExecute.huff | 32 + ...hkmwlwmhlgvymnL2CompressorReadExecute.huff | 32 + ...vxsxrlsluymfdiL2CompressorReadExecute.huff | 32 + ...bwcqavoskmutltL2CompressorReadExecute.huff | 32 + ...gmtbremlhrxnejL2CompressorReadExecute.huff | 32 + ...bspndmkchcjaofllL2CompressorReadNonce.huff | 32 + ...dfbtyakjkbvehkjdbmgL2CompressorReadTx.huff | 32 + ...pekynjthxzellyhsxeL2CompressorReadTxs.huff | 32 + ...uggwhjnxbrgifehtxhfL2CompressorReadTx.huff | 32 + .../test/ChainedSignatures.spec.ts | 136 + .../wallet-contracts/test/ERC165.spec.ts | 73 + .../wallet-contracts/test/Factory.spec.ts | 65 + .../test/GasEstimation.spec.ts | 353 + .../wallet-contracts/test/GuestModule.spec.ts | 98 + .../wallet-contracts/test/LibBytes.spec.ts | 185 + .../wallet-contracts/test/LibString.spec.ts | 83 + .../wallet-contracts/test/MainModule.bench.ts | 198 + .../wallet-contracts/test/MainModule.spec.ts | 2247 + .../test/MerkleSignatures.spec.ts | 30 + .../test/MultiCallUtils.spec.ts | 282 + .../wallet-contracts/test/utils/contracts.ts | 87 + .../wallet-contracts/test/utils/imposter.ts | 43 + .../wallet-contracts/test/utils/index.ts | 118 + .../wallet-contracts/test/utils/sequence.ts | 613 + .../wallet-contracts/test/utils/wallet.ts | 329 + .../wallet/wallet-contracts/tsconfig.json | 37 + .../typings/chai-bignumber.d.ts | 16 + .../wallet-contracts/typings/chai-bn.ts | 19 + .../wallet-contracts/typings/truffle.d.ts | 12 + .../wallet-contracts/utils/JsonBindings.sol | 193 + .../wallet-contracts/utils/benchmarker.ts | 106 + .../wallet-contracts/utils/config-loader.ts | 159 + .../utils/deploy-contracts.ts | 207 + .../utils/workers/bench-worker.ts | 89 + pnpm-lock.yaml | 19206 ++- pnpm-workspace.yaml | 58 +- remappings.txt | 6 + tsconfig.json | 23 + tsconfig.test.json | 17 + 2386 files changed, 704913 insertions(+), 6896 deletions(-) create mode 100644 .changeset/bright-pots-hope.md create mode 100644 .changeset/crisp-zoos-retire.md create mode 100644 .changeset/cyan-radios-relax.md create mode 100644 .changeset/free-tips-switch.md create mode 100644 .changeset/goofy-laws-serve.md create mode 100644 .changeset/new-turkeys-double.md create mode 100644 .changeset/nice-tips-slide.md create mode 100644 .changeset/open-toes-marry.md create mode 100644 .changeset/plain-feet-stare.md create mode 100644 .changeset/pre.json create mode 100644 .changeset/tiny-files-chew.md create mode 100644 .changeset/wild-feet-carry.md create mode 100644 .changeset/wise-heads-buy.md create mode 100644 .codesandbox/.github/workflows/build.yml create mode 100644 .codesandbox/.gitignore create mode 100644 .codesandbox/.prettierrc create mode 100644 .codesandbox/README.md create mode 100644 .codesandbox/index.html create mode 100644 .codesandbox/package.json create mode 100644 .codesandbox/pnpm-lock.yaml create mode 100644 .codesandbox/public/favicon.ico create mode 100644 .codesandbox/public/logo192.png create mode 100644 .codesandbox/public/logo512.png create mode 100644 .codesandbox/public/manifest.json create mode 100644 .codesandbox/public/robots.txt create mode 100644 .codesandbox/screenshots/screen-open.png create mode 100644 .codesandbox/screenshots/screen-txn.png create mode 100644 .codesandbox/src/App.tsx create mode 100644 .codesandbox/src/README.md create mode 100644 .codesandbox/src/components/Console/index.tsx create mode 100644 .codesandbox/src/components/Console/styles.css.ts create mode 100644 .codesandbox/src/components/Group/index.tsx create mode 100644 .codesandbox/src/components/Group/styles.css.ts create mode 100644 .codesandbox/src/constants/abi.ts create mode 100644 .codesandbox/src/helpers.ts create mode 100644 .codesandbox/src/images/logo.svg create mode 100644 .codesandbox/src/images/skyweaver-banner-large.png create mode 100644 .codesandbox/src/images/skyweaver-banner.old.png create mode 100644 .codesandbox/src/images/skyweaver-banner.png create mode 100644 .codesandbox/src/index.css create mode 100644 .codesandbox/src/index.tsx create mode 100644 .codesandbox/src/react-app-env.d.ts create mode 100644 .codesandbox/src/vite-env.d.ts create mode 100644 .codesandbox/tasks.json create mode 100644 .codesandbox/tsconfig.json create mode 100644 .codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSsequence.jszSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB create mode 100644 .codesandbox/v8-compile-cache-0/x64/11.3.244.8-node.19/zSprojectzSworkspacezSnode_moduleszS.pnpmzS@preconstruct+cli@2.8.7zSnode_moduleszS@preconstructzSclizSbin.js.BLOB create mode 100644 .codesandbox/vite.config.ts create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/custom.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md rename .github/workflows/{publish-dists.yml => Publish-Dists.yml} (89%) create mode 100644 .github/workflows/fortify.yml create mode 100644 .github/workflows/nextjs.yml create mode 100644 .github/workflows/web-sdk.yml create mode 100644 .gitmodules create mode 100644 .nycrc create mode 100644 CNAME create mode 100644 FUNDING.json create mode 100644 SECURITY.md create mode 100644 azure-pipelines.yml create mode 100644 babel.config.js create mode 100644 extras/docs/next-env.d.ts create mode 100644 extras/web/next-env.d.ts create mode 100644 foundry.lock create mode 100644 foundry.toml create mode 100644 lib/signals-implicit-mode/.env.sample create mode 100644 lib/signals-implicit-mode/.gas-snapshot create mode 100644 lib/signals-implicit-mode/.github/workflows/test.yml create mode 100644 lib/signals-implicit-mode/.gitmodules create mode 100644 lib/signals-implicit-mode/README.md create mode 100644 lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-1770363485985.json create mode 100644 lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-1770364554426.json create mode 100644 lib/signals-implicit-mode/broadcast/Deploy.s.sol/1/run-latest.json create mode 100644 lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-1770363485985.json create mode 100644 lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-1770364554426.json create mode 100644 lib/signals-implicit-mode/cache/Deploy.s.sol/1/run-latest.json create mode 100644 lib/signals-implicit-mode/cache/solidity-files-cache.json create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/CODEOWNERS create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/dependabot.yml create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/workflows/ci.yml create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.github/workflows/sync.yml create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/.gitignore create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/CONTRIBUTING.md create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/LICENSE-APACHE create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/LICENSE-MIT create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/README.md create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/RELEASE_CHECKLIST.md create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/scripts/vm.py create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Base.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Config.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/LibVariable.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Script.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdAssertions.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdChains.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdCheats.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdConfig.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdConstants.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdError.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdInvariant.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdJson.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdMath.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdStorage.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdStyle.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdToml.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/StdUtils.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Test.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/Vm.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/console.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/console2.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC1155.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC165.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC20.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC4626.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC6909.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC721.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC7540.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IERC7575.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/interfaces/IMulticall3.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/src/safeconsole.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/CommonBase.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/Config.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/LibVariable.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdAssertions.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdChains.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdCheats.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdConstants.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdError.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdJson.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdMath.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdStorage.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdStyle.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdToml.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/StdUtils.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/Vm.t.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationScript.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationScriptBase.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationTest.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/compilation/CompilationTestBase.sol create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/broadcast.log.json create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/config.toml create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/test.json create mode 100644 lib/signals-implicit-mode/dependencies/forge-std-1.14.0/test/fixtures/test.toml create mode 100644 lib/signals-implicit-mode/foundry.lock create mode 100644 lib/signals-implicit-mode/foundry.toml create mode 100644 lib/signals-implicit-mode/lib/forge-std/.gitattributes create mode 100644 lib/signals-implicit-mode/lib/forge-std/.github/CODEOWNERS create mode 100644 lib/signals-implicit-mode/lib/forge-std/.github/workflows/ci.yml create mode 100644 lib/signals-implicit-mode/lib/forge-std/.github/workflows/sync.yml create mode 100644 lib/signals-implicit-mode/lib/forge-std/CONTRIBUTING.md create mode 100644 lib/signals-implicit-mode/lib/forge-std/LICENSE-APACHE create mode 100644 lib/signals-implicit-mode/lib/forge-std/LICENSE-MIT create mode 100644 lib/signals-implicit-mode/lib/forge-std/README.md create mode 100644 lib/signals-implicit-mode/lib/forge-std/RELEASE_CHECKLIST.md create mode 100644 lib/signals-implicit-mode/lib/forge-std/foundry.toml create mode 100644 lib/signals-implicit-mode/lib/forge-std/package.json create mode 100644 lib/signals-implicit-mode/lib/forge-std/scripts/vm.py create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/Base.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/Config.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/LibVariable.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/Script.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdAssertions.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdChains.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdCheats.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdConfig.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdConstants.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdError.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdInvariant.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdJson.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdMath.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdStorage.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdStyle.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdToml.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/StdUtils.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/Test.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/Vm.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/console.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/console2.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC1155.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC165.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC20.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC4626.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC6909.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC721.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC7540.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IERC7575.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/interfaces/IMulticall3.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/src/safeconsole.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/CommonBase.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/Config.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/LibVariable.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdAssertions.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdChains.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdCheats.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdConstants.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdError.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdJson.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdMath.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdStorage.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdStyle.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdToml.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/StdUtils.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/Vm.t.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationScript.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationScriptBase.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationTest.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/compilation/CompilationTestBase.sol create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/fixtures/broadcast.log.json create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/fixtures/config.toml create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/fixtures/test.json create mode 100644 lib/signals-implicit-mode/lib/forge-std/test/fixtures/test.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/.env.sample create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/.github/workflows/tests.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/.gitmodules create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/.prettierignore create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/.prettierrc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/LICENSE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/build_proxy.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/docs/CHAINED.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/docs/CONFIGURATIONS.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/docs/PAYLOAD.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/docs/SESSIONS.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/docs/SIGNATURE.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/foundry.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lefthook.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.eslintrc.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.github/workflows/build.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solcover.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solhint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/.solhintignore create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/LICENSE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/README.md create mode 100644 "lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/audits/EIP_4337_\342\200\223_Ethereum_Account_Abstraction_Incremental_Audit_Feb_2023.pdf" create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/BaseAccount.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/BasePaymaster.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/EntryPoint.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/EntryPointSimulations.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/Helpers.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/NonceManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/SenderCreator.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/StakeManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/core/UserOperationLib.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAccount.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAccountExecute.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IAggregator.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IEntryPoint.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IEntryPointSimulations.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/INonceManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IPaymaster.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/IStakeManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/LegacyTokenPaymaster.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/SimpleAccount.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/SimpleAccountFactory.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/TokenPaymaster.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/VerifyingPaymaster.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSAccount.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSAccountFactory.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSHelper.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/BLSSignatureAggregator.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/IBLSAccount.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/BLSOpen.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/hubble-contracts/contracts/libs/BLS.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/bls/lib/hubble-contracts/contracts/libs/ModExp.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/callback/TokenCallbackHandler.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/IOracle.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/OracleHelper.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/samples/utils/UniswapHelper.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/contracts/utils/Exec.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deploy/1_deploy_entrypoint.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deploy/2_deploy_SimpleAccountFactory.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/arbitrum/solcInputs/a4c52f0671aad8941c53d6ead2063803.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/gnosis/solcInputs/a4c52f0671aad8941c53d6ead2063803.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/goerli/solcInputs/a4c52f0671aad8941c53d6ead2063803.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/SimpleWallet.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/TestCounter.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/kovan/solcInputs/9255faacf3ae4e81db1326413027bfa0.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/SimpleAccountFactory.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/02113a2ed1850c3774563305ee607f11.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/a4c52f0671aad8941c53d6ead2063803.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mainnet/solcInputs/cfbebdf1101dd2bc0f310cb0b7d62cb7.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/solcInputs/a4c52f0671aad8941c53d6ead2063803.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/matic/solcInputs/cfbebdf1101dd2bc0f310cb0b7d62cb7.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/mumbai/solcInputs/a4c52f0671aad8941c53d6ead2063803.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/optimism/solcInputs/a4c52f0671aad8941c53d6ead2063803.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/.chainId create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/EntryPoint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/deployments/sepolia/solcInputs/a4c52f0671aad8941c53d6ead2063803.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/ERCS/erc-4337.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/ERCS/erc-7562.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/bundle-seq-pm.svg create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/bundle-seq.svg create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/image1.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/erc/assets/erc-4337/image2.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/0-init-gas-checker.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/1-simple-wallet.gas.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/2-paymaster.gas.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/3-huge-tx-gas.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/4-paymaster-postop.gas.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/5-token-paymaster.gas.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/gascalc/GasChecker.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/hardhat.config.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/reports/gas-checker.txt create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/check-gas-reports create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/docker-gascalc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/docker-gascalc.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/gascalc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/hh-wrapper create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/postpack-contracts-package.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/prepack-contracts-package.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/sample-script.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/scripts/solcErrors create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/src/AASigner.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/src/Create2Factory.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/src/Utils.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/src/runop.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/0-create2factory.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/UserOp.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/UserOperation.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/aa.init.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/chaiHelper.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/debugTx.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/entrypoint.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/entrypointsimulations.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/helpers.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/paymaster.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/samples/OracleHelper.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/samples/TokenPaymaster.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/simple-wallet.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/solidityTypes.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/testExecAccount.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/testutils.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/verifying_paymaster.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/test/y.bls.test.ts create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/tsconfig.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/account-abstraction/yarn.lock create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/.gitattributes create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/.githooks/pre-commit create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/.github/workflows/test.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/.gitmodules create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/.solhint.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/foundry.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/.gitattributes create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/.github/workflows/ci.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/.github/workflows/sync.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/LICENSE-APACHE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/LICENSE-MIT create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/foundry.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/scripts/vm.py create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/Base.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/Script.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdAssertions.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdChains.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdCheats.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdError.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdInvariant.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdJson.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdMath.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdStorage.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdStyle.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdToml.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/StdUtils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/Test.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/Vm.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/console.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/console2.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/interfaces/IERC1155.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/interfaces/IERC165.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/interfaces/IERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/interfaces/IERC4626.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/interfaces/IERC721.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/interfaces/IMulticall3.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/mocks/MockERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/mocks/MockERC721.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/src/safeconsole.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdAssertions.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdChains.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdCheats.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdError.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdJson.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdMath.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdStorage.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdStyle.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdToml.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/StdUtils.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/Vm.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/compilation/CompilationScript.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/compilation/CompilationScriptBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/compilation/CompilationTest.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/compilation/CompilationTestBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/fixtures/broadcast.log.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/fixtures/test.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/fixtures/test.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/mocks/MockERC20.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/lib/forge-std/test/mocks/MockERC721.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/script/MockERC20Deployer.s.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/script/SingletonDeployer.s.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/erc2470-libs/src/ISingletonFactory.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/.gitattributes create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/.github/workflows/ci.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/.github/workflows/sync.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/CONTRIBUTING.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/LICENSE-APACHE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/LICENSE-MIT create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/foundry.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/scripts/vm.py create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/Base.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/Script.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdAssertions.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdChains.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdCheats.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdConstants.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdError.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdInvariant.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdJson.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdMath.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdStorage.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdStyle.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdToml.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/StdUtils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/Test.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/Vm.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/console.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/console2.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IERC1155.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IERC165.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IERC4626.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IERC6909.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IERC721.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IERC7540.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IERC7575.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/interfaces/IMulticall3.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/src/safeconsole.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/CommonBase.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdAssertions.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdChains.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdCheats.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdConstants.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdError.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdJson.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdMath.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdStorage.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdStyle.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdToml.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/StdUtils.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/Vm.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/compilation/CompilationScript.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/compilation/CompilationScriptBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/compilation/CompilationTest.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/compilation/CompilationTestBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/fixtures/broadcast.log.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/fixtures/test.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/forge-std/test/fixtures/test.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.changeset/config.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.codecov.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.editorconfig create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.githooks/pre-push create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/actions/gas-compare/action.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/actions/setup/action.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/actions/storage-layout/action.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/workflows/actionlint.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/workflows/changeset.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/workflows/checks.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/workflows/docs.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/workflows/formal-verification.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/workflows/release-cycle.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.gitmodules create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.mocharc.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.prettierrc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/.solcover.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/CHANGELOG.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/CONTRIBUTING.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/FUNDING.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/GUIDELINES.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/LICENSE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/RELEASING.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/SECURITY.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/audits/2017-03.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/audits/2018-10.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/audits/2022-10-Checkpoints.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/audits/2022-10-ERC4626.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/audits/2023-05-v4.9.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/audits/2023-10-v5.0.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/audits/2024-10-v5.1.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/audits/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/Makefile create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/diff/access_manager_AccessManager.sol.patch create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/AccessControlDefaultAdminRulesHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/AccessControlHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/AccessManagedHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/AccessManagerHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/DoubleEndedQueueHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/ERC20FlashMintHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/ERC20PermitHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/ERC20WrapperHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/ERC3156FlashBorrowerHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/ERC721Harness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/ERC721ReceiverHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/EnumerableMapHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/EnumerableSetHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/InitializableHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/NoncesHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/Ownable2StepHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/OwnableHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/PausableHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/harnesses/TimelockControllerHarness.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/reports/2021-10.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/reports/2022-03.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/reports/2022-05.pdf create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/run.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/AccessControl.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/AccessControlDefaultAdminRules.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/AccessManaged.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/AccessManager.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/DoubleEndedQueue.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/ERC20.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/ERC20FlashMint.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/ERC20Wrapper.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/ERC721.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/EnumerableMap.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/EnumerableSet.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/Initializable.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/Nonces.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/Ownable.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/Ownable2Step.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/Pausable.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/TimelockController.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/helpers/helpers.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IAccessControl.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IAccessControlDefaultAdminRules.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IAccessManaged.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IAccessManager.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IERC20.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IERC2612.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashBorrower.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IERC3156FlashLender.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IERC5313.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IERC721.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IERC721Receiver.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IOwnable.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/certora/specs/methods/IOwnable2Step.spec create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/AccessControl.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/Ownable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/Ownable2Step.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/manager/AccessManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/access/manager/IAuthority.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/account/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/account/utils/draft-ERC4337Utils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/account/utils/draft-ERC7579Utils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/finance/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/finance/VestingWallet.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/finance/VestingWalletCliff.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/Governor.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/IGovernor.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/TimelockController.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingFractional.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingOverridable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorStorage.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockAccess.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/utils/IVotes.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/utils/Votes.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/governance/utils/VotesExtended.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC2309.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC2612.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC4626.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC4906.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC5267.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC5313.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC5805.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC6372.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC721.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC777.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC4337.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC7579.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC7674.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/metatx/ERC2771Forwarder.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/metatx/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/AccessManagedTarget.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/AccessManagerMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ArraysMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/AuthorityMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/Base64Dirty.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/BatchCaller.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ConstructorMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ContextMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/EIP712Verifier.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MaliciousData.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165ReturnBomb.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/InitializableMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/MerkleProofCustomHashMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/MerkleTreeMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/MulticallHelper.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/PausableMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/ReentrancyTransientMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/Stateless.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/TimelockReentrant.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/TransientSlotMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/UpgradeableBeaconMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/VotesExtendedMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/VotesMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/account/utils/ERC7579UtilsMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/ERC20WithAutoMinerReward.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/ERC4626Fees.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/MyNFT.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintMissing.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintOnlyRole.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlModified.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlNonRevokableAdmin.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessManagedERC20MintBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/access-control/MyContractOwnable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyGovernor.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyToken.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenTimestampBased.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenWrapped.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC1155/GameItems.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC1155/MyERC115HolderContract.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC20/GLDToken.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/token/ERC721/GameItem.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/utilities/Base64NFT.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/docs/utilities/Multicall.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorCountingOverridableMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorFractionalMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorPreventLateQuorumMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorStorageMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockAccessMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockCompoundMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockControlMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorVoteMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/governance/GovernorWithParamsMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/proxy/BadBeacon.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/proxy/ClashingImplementation.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/proxy/UUPSUpgradeableMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC1155ReceiverMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363ForceApproveMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363NoReturnMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363ReceiverMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363ReturnFalseMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC1363SpenderMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ApprovalMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20DecimalsMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ExcessDecimalsMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20FlashMintMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ForceApproveMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20GetterHelper.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Mock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20MulticallMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20NoReturnMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20Reentrant.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20ReturnFalseMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesAdditionalCheckpointsMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesLegacyMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesTimestampMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626LimitsMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626Mock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC4626OffsetMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC4646FeesMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC721ReceiverMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/mocks/token/ERC721URIStorageMock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/Clones.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/Proxy.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Utils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC1363.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-ERC20TemporaryApproval.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/utils/ERC1363Utils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Consecutive.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Votes.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Wrapper.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Utils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/token/common/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Address.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Arrays.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Base64.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Bytes.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/CAIP10.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/CAIP2.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Comparators.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Context.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Create2.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Errors.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Multicall.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Nonces.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/NoncesKeyed.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Packing.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Panic.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Pausable.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/README.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/ReentrancyGuardTransient.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/ShortStrings.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/SlotDerivation.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/Strings.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/TransientSlot.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/cryptography/Hashes.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/cryptography/P256.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/cryptography/RSA.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/math/Math.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/structs/Checkpoints.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/structs/CircularBuffer.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/structs/Heap.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/structs/MerkleTree.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/utils/types/Time.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/antora.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/config.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/access-control-multiple.svg create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/access-manager-functions.svg create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/access-manager.svg create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3a.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-3b.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack-6.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-attack.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-deposit.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-mint.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-linear.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglog.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/erc4626-rate-loglogext.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-exec.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/backwards-compatibility.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc4626.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/faq.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/contract.hbs create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/helpers.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/page.hbs create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/docs/templates/properties.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/eslint.config.mjs create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/foundry.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/fv-requirements.txt create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat.config.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/async-test-sanity.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/env-artifacts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/ignore-unreachable-warnings.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/remappings.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/skip-foundry-tests.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/hardhat/task-test-get-files.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.prop.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/ERC4626.test.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/LICENSE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/erc4626-tests/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.gitattributes create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/ci.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/.github/workflows/sync.yml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/LICENSE-APACHE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/LICENSE-MIT create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/foundry.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Base.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Script.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdAssertions.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdChains.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdCheats.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdError.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdInvariant.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdJson.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdMath.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdStorage.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdStyle.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdToml.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/StdUtils.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Test.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/Vm.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/console.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/console2.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC1155.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC165.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC4626.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IERC721.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/interfaces/IMulticall3.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/mocks/MockERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/mocks/MockERC721.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/src/safeconsole.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdAssertions.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdChains.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdCheats.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdError.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdJson.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdMath.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdStorage.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdStyle.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdToml.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/StdUtils.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/Vm.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScript.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTest.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/broadcast.log.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/fixtures/test.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/mocks/MockERC20.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/forge-std/test/mocks/MockERC721.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/LICENSE create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SVM.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/SymTest.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/logo.svg create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/netlify.toml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/package-lock.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/remappings.txt create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/renovate.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/compare-layout.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/compareGasReports.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/coverage.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/extract-layout.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/generation.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/inheritance-ordering.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/checks/pragma-consistency.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/gen-nav.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/format-lines.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/helpers/sanitize.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/run.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Arrays.opts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.opts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Checkpoints.t.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableMap.opts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/EnumerableSet.opts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/MerkleProof.opts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.opts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Packing.t.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SafeCast.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/Slot.opts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/SlotDerivation.t.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlot.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/StorageSlotMock.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlot.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/TransientSlotMock.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/generate/templates/conversion.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/git-user-config.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/helpers.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepack.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepare-docs.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/prepare.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/format-changelog.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/update-comment.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/version.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/exit-prerelease.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/github-release.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/integrity-check.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/pack.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/publish.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/rerun.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/set-changesets-pr-title.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/start.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/release/workflow/state.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/solhint-custom/index.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/solhint-custom/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/update-docs-branch.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/README.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/patch-apply.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/patch-save.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/transpile-onto.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/transpile.sh create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/scripts/upgradeable/upgradeable.patch create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/slither.config.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/solhint.config.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/TESTING.md create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/AccessControl.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/AccessControl.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/Ownable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/Ownable2Step.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/extensions/AccessControlDefaultAdminRules.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/extensions/AccessControlEnumerable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/manager/AccessManaged.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/manager/AccessManager.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/manager/AccessManager.predicate.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/manager/AccessManager.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/access/manager/AuthorityUtils.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/account/utils/draft-ERC4337Utils.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/account/utils/draft-ERC7579Utils.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/account/utils/draft-ERC7579Utils.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/bin/EntryPoint070.abi create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/bin/EntryPoint070.bytecode create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/bin/SenderCreator070.abi create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/bin/SenderCreator070.bytecode create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/finance/VestingWallet.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/finance/VestingWallet.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/finance/VestingWalletCliff.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/Governor.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/Governor.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/TimelockController.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorCountingFractional.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorCountingOverridable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorERC721.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorPreventLateQuorum.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorStorage.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockAccess.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockCompound.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockControl.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorVotesQuorumFraction.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/extensions/GovernorWithParams.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/utils/ERC6372.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/utils/Votes.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/utils/Votes.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/governance/utils/VotesExtended.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/access-manager.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/account.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/chains.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/constants.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/deploy.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/eip712-types.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/eip712.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/enums.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/erc4337-entrypoint.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/erc4337.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/erc7579.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/governance.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/iterate.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/math.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/methods.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/random.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/storage.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/strings.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/time.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/helpers/txpool.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/metatx/ERC2771Context.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/metatx/ERC2771Forwarder.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/metatx/ERC2771Forwarder.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/Clones.behaviour.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/Clones.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/Clones.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Utils.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/Proxy.behaviour.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/beacon/BeaconProxy.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/beacon/UpgradeableBeacon.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/transparent/ProxyAdmin.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/utils/Initializable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/proxy/utils/UUPSUpgradeable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/sanity.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Burnable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Pausable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Supply.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155URIStorage.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Holder.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Utils.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/ERC20.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/ERC20.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC1363.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20FlashMint.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Pausable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Permit.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Votes.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Wrapper.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/extensions/draft-ERC20TemporaryApproval.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC20/utils/SafeERC20.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/ERC721.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Burnable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Consecutive.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Consecutive.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Pausable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Royalty.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721URIStorage.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Votes.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Wrapper.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Utils.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/token/common/ERC2981.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Address.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Arrays.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Arrays.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Base64.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Base64.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Bytes.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/CAIP.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Context.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Context.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Create2.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Create2.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Multicall.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Nonces.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Nonces.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/NoncesKeyed.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Packing.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Packing.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Panic.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Pausable.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/ReentrancyGuard.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/ShortStrings.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/ShortStrings.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/SlotDerivation.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/SlotDerivation.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/StorageSlot.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Strings.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/Strings.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/TransientSlot.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/ECDSA.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/EIP712.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/MerkleProof.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/MessageHashUtils.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/P256.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/P256.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/RSA.helper.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/RSA.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/SigVer15_186-3.rsp create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/SignatureChecker.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/cryptography/ecdsa_secp256r1_sha256_p1363_test.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/introspection/ERC165Checker.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/introspection/SupportsInterface.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/math/Math.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/math/Math.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/math/SafeCast.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/math/SignedMath.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/math/SignedMath.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/BitMap.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/Checkpoints.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/Checkpoints.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/CircularBuffer.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/DoubleEndedQueue.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.behavior.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/Heap.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/Heap.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/structs/MerkleTree.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/lib/openzeppelin-contracts/test/utils/types/Time.test.js create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/package.json create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/pnpm-lock.yaml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/pnpm-workspace.yaml create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/script/Deploy.s.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/script/DeployMocks.s.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/Estimator.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/Factory.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/Guest.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/Simulator.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/Stage1Module.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/Stage2Module.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/Wallet.huff create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/Wallet.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/passkeys/Passkeys.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/recovery/Recovery.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/SessionErrors.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/SessionManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/SessionSig.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/explicit/ExplicitSessionManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/explicit/IExplicitSessionManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/explicit/Permission.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/explicit/PermissionValidator.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/Attestation.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ISignalsImplicitMode.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/extensions/sessions/implicit/ImplicitSessionManager.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/Calls.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/ERC4337v07.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/Hooks.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/Implementation.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/Nonce.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/Payload.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/ReentrancyGuard.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/Storage.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/auth/BaseAuth.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/auth/BaseSig.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/auth/SelfAuth.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/auth/Stage1Auth.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/auth/Stage2Auth.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IAccount.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IAuth.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/ICheckpointer.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IDelegatedExtension.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IERC1155Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IERC1271.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IERC223Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IERC721Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IERC777Receiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IEntryPoint.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/IPartialAuth.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/modules/interfaces/ISapient.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/utils/Base64.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibBytes.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/utils/LibOptim.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/utils/P256.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/src/utils/WebAuthn.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/Factory.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/Guest.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/Stage1Module.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/Wallet.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/passkeys/Passkeys.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/recovery/Recovery.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/Attestation.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/Permission.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/SessionCalls.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/SessionManager.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/SessionSig.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/SessionTestBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/explicit/ExplicitSessionManager.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/explicit/PermissionValidator.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/extensions/sessions/implicit/ImplicitSessionManager.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/extensions/recovery/RecoveryDenialOfService.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/extensions/sessions/ExtendedSessionTestBase.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/extensions/sessions/SessionDenialOfService.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/extensions/sessions/SessionLimitIncrementTest.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/extensions/sessions/SessionSelfCall.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/extensions/sessions/SessionSignatureAbuse.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/extensions/sessions/SessionUsingERC4337.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/extensions/sessions/SessionValueForwarding.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/integrations/modules/ERC4337v07/ERC4337Entrypoint.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/mocks/AcceptAll.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/mocks/CanReenter.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/mocks/Emitter.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/mocks/MockERC20.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/mocks/MockPayableReceiver.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/mocks/ValueForwarder.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/modules/BaseSig.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/modules/Calls.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/modules/ERC4337v07.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/modules/Hooks.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/modules/Implementation.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/modules/Nonce.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/modules/Payload.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/utils/Base64.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/utils/LibBytes.t.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/utils/PrimitivesRPC.sol create mode 100644 lib/signals-implicit-mode/lib/sequence-v3/test/utils/TestUtils.sol create mode 100644 lib/signals-implicit-mode/remappings.txt create mode 100644 lib/signals-implicit-mode/script/Deploy.s.sol create mode 100644 lib/signals-implicit-mode/soldeer.lock create mode 100644 lib/signals-implicit-mode/src/helper/SignalsImplicitMode.sol create mode 100644 lib/signals-implicit-mode/src/registry/IImplicitProjectRegistry.sol create mode 100644 lib/signals-implicit-mode/src/registry/IImplicitProjectValidation.sol create mode 100644 lib/signals-implicit-mode/src/registry/ImplicitProjectRegistry.sol create mode 100644 lib/signals-implicit-mode/test/ImplicitProjectRegistry.t.sol create mode 100644 lib/signals-implicit-mode/test/SignalsImplicitMode.t.sol create mode 100644 lib/signals-implicit-mode/test/TestHelper.sol create mode 100644 lib/signals-implicit-mode/test/mock/SignalsImplicitModeMock.sol create mode 100644 package-lock.json create mode 100644 packages/0xsequence/README.md create mode 100644 packages/0xsequence/hardhat.config.js create mode 100644 packages/0xsequence/hardhat2.config.js create mode 100644 packages/0xsequence/src/abi.ts create mode 100644 packages/0xsequence/src/account.ts create mode 100644 packages/0xsequence/src/api.ts create mode 100644 packages/0xsequence/src/auth.ts create mode 100644 packages/0xsequence/src/core.ts create mode 100644 packages/0xsequence/src/guard.ts create mode 100644 packages/0xsequence/src/index.ts create mode 100644 packages/0xsequence/src/indexer.ts create mode 100644 packages/0xsequence/src/metadata.ts create mode 100644 packages/0xsequence/src/migration.ts create mode 100644 packages/0xsequence/src/multicall.ts create mode 100644 packages/0xsequence/src/network.ts create mode 100644 packages/0xsequence/src/provider.ts create mode 100644 packages/0xsequence/src/relayer.ts create mode 100644 packages/0xsequence/src/sequence.ts create mode 100644 packages/0xsequence/src/sessions.ts create mode 100644 packages/0xsequence/src/signhub.ts create mode 100644 packages/0xsequence/src/transactions.ts create mode 100644 packages/0xsequence/src/utils.ts create mode 100644 packages/0xsequence/tests/browser/json-rpc-provider/rpc.test.ts create mode 100644 packages/0xsequence/tests/browser/mock-wallet/mock-wallet.test.ts create mode 100644 packages/0xsequence/tests/browser/mux-transport/mux.test.ts create mode 100644 packages/0xsequence/tests/browser/proxy-transport/channel.test.ts create mode 100644 packages/0xsequence/tests/browser/testutils/accounts.ts create mode 100644 packages/0xsequence/tests/browser/testutils/deploy-wallet-context.ts create mode 100644 packages/0xsequence/tests/browser/testutils/index.ts create mode 100644 packages/0xsequence/tests/browser/testutils/wallet.ts create mode 100644 packages/0xsequence/tests/browser/wallet-provider/dapp.test.ts create mode 100644 packages/0xsequence/tests/browser/wallet-provider/dapp2.test.ts create mode 100644 packages/0xsequence/tests/browser/window-transport/dapp.test.ts create mode 100644 packages/0xsequence/tests/json-rpc-provider.spec.ts create mode 100644 packages/0xsequence/tests/mock-wallet.spec.ts create mode 100644 packages/0xsequence/tests/mux-transport.spec.ts create mode 100644 packages/0xsequence/tests/proxy-transport.spec.ts create mode 100644 packages/0xsequence/tests/utils/assert.ts create mode 100644 packages/0xsequence/tests/utils/browser-test-runner.ts create mode 100644 packages/0xsequence/tests/utils/webpack-test-server.ts create mode 100644 packages/0xsequence/tests/wallet-provider.spec.ts create mode 100644 packages/0xsequence/tests/webpack.config.js create mode 100644 packages/0xsequence/tests/window-transport.spec.ts create mode 100644 packages/abi/CHANGELOG.md create mode 100644 packages/abi/README.md create mode 100644 packages/abi/src/index.ts create mode 100644 packages/abi/src/tokens/erc1155.ts create mode 100644 packages/abi/src/tokens/erc20.ts create mode 100644 packages/abi/src/tokens/erc721.ts create mode 100644 packages/abi/src/wallet/erc1271.ts create mode 100644 packages/abi/src/wallet/erc5719.ts create mode 100644 packages/abi/src/wallet/erc6492.ts create mode 100644 packages/abi/src/wallet/factory.ts create mode 100644 packages/abi/src/wallet/index.ts create mode 100644 packages/abi/src/wallet/libs/requireFreshSigners.ts create mode 100644 packages/abi/src/wallet/mainModule.ts create mode 100644 packages/abi/src/wallet/mainModuleUpgradable.ts create mode 100644 packages/abi/src/wallet/sequenceUtils.ts create mode 100644 packages/account/hardhat.config.js create mode 100644 packages/account/hardhat2.config.js create mode 100644 packages/account/src/account.ts create mode 100644 packages/account/src/index.ts create mode 100644 packages/account/src/orchestrator/wrapper.ts create mode 100644 packages/account/src/signer.ts create mode 100644 packages/account/src/utils.ts create mode 100644 packages/account/tests/account.spec.ts create mode 100644 packages/account/tests/signer.spec.ts create mode 100644 packages/api/CHANGELOG.md create mode 100644 packages/api/README.md create mode 100644 packages/api/src/api.gen.ts create mode 100644 packages/api/src/index.ts create mode 100644 packages/auth/README.md create mode 100644 packages/auth/hardhat.config.js create mode 100644 packages/auth/src/authorization.ts create mode 100644 packages/auth/src/index.ts create mode 100644 packages/auth/src/proof.ts create mode 100644 packages/auth/src/services.ts create mode 100644 packages/auth/src/session.ts create mode 100644 packages/auth/tests/session.spec.ts create mode 100644 packages/auth/tests/utils/index.ts create mode 100644 packages/core/src/commons/config.ts create mode 100644 packages/core/src/commons/context.ts create mode 100644 packages/core/src/commons/index.ts create mode 100644 packages/core/src/commons/orchestrator.ts create mode 100644 packages/core/src/commons/reader.ts create mode 100644 packages/core/src/commons/signature.ts create mode 100644 packages/core/src/commons/signer.ts create mode 100644 packages/core/src/commons/transaction.ts create mode 100644 packages/core/src/commons/validateEIP1271.ts create mode 100644 packages/core/src/commons/validateEIP6492.ts create mode 100644 packages/core/src/index.ts create mode 100644 packages/core/src/universal/index.ts create mode 100644 packages/core/src/v1/config.ts create mode 100644 packages/core/src/v1/index.ts create mode 100644 packages/core/src/v1/signature.ts create mode 100644 packages/core/src/v2/chained.ts create mode 100644 packages/core/src/v2/config.ts create mode 100644 packages/core/src/v2/context.ts create mode 100644 packages/core/src/v2/index.ts create mode 100644 packages/core/src/v2/signature.ts create mode 100644 packages/core/tests/v2/config.spec.ts create mode 100644 packages/core/tests/v2/signature.spec.ts create mode 100644 packages/deployer/.gitignore create mode 100644 packages/deployer/README.md create mode 100644 packages/deployer/artifacts/contracts/NanoUniversalDeployer.sol/NanoUniversalDeployer.json create mode 100644 packages/deployer/artifacts/contracts/UniversalDeployer2.sol/UniversalDeployer2.json create mode 100644 packages/deployer/config/PROD.env.sample create mode 100644 packages/deployer/contracts/NanoUniversalDeployer.sol create mode 100644 packages/deployer/contracts/UniversalDeployer2.sol create mode 100644 packages/deployer/hardhat.config.ts create mode 100644 packages/deployer/src/UniversalDeployer.ts create mode 100644 packages/deployer/src/constants.ts create mode 100644 packages/deployer/src/index.ts create mode 100644 packages/deployer/src/types.ts create mode 100644 packages/deployer/src/typings/contracts/NanoUniversalDeployer.ts create mode 100644 packages/deployer/src/typings/contracts/UniversalDeployer2.ts create mode 100644 packages/deployer/src/typings/contracts/common.ts create mode 100644 packages/deployer/src/typings/contracts/factories/NanoUniversalDeployer__factory.ts create mode 100644 packages/deployer/src/typings/contracts/factories/UniversalDeployer2__factory.ts create mode 100644 packages/deployer/src/typings/contracts/factories/index.ts create mode 100644 packages/deployer/src/typings/contracts/index.ts create mode 100644 packages/deployer/src/utils/configLoader.ts create mode 100644 packages/deployer/src/utils/logger.ts create mode 100644 packages/deployer/tests/mock.spec.ts create mode 100644 packages/estimator/src/builds/MainModuleGasEstimation.ts create mode 100644 packages/estimator/src/builds/index.ts create mode 100644 packages/estimator/src/estimator.ts create mode 100644 packages/estimator/src/index.ts create mode 100644 packages/estimator/src/overwriter-estimator.ts create mode 100644 packages/estimator/src/overwriter-sequence-estimator.ts create mode 100644 packages/estimator/tests/estimator.spec.ts create mode 100644 packages/estimator/tests/sequence-estimator.spec.ts create mode 100644 packages/guard/CHANGELOG.md create mode 100644 packages/guard/README.md create mode 100644 packages/guard/src/guard.gen.ts create mode 100644 packages/guard/src/index.ts create mode 100644 packages/guard/src/signer.ts create mode 100644 packages/indexer/CHANGELOG.md create mode 100644 packages/indexer/README.md create mode 100644 packages/indexer/src/index.ts create mode 100644 packages/metadata/CHANGELOG.md create mode 100644 packages/metadata/README.md create mode 100644 packages/metadata/src/index.ts create mode 100644 packages/metadata/src/metadata.gen.ts create mode 100644 packages/migration/src/defaults.ts create mode 100644 packages/migration/src/index.ts create mode 100644 packages/migration/src/migrations/index.ts create mode 100644 packages/migration/src/migrations/migration_01_02.ts create mode 100644 packages/migration/src/migrator.ts create mode 100644 packages/migration/src/version.ts create mode 100644 packages/multicall/README.md create mode 100644 packages/multicall/src/constants.ts create mode 100644 packages/multicall/src/index.ts create mode 100644 packages/multicall/src/multicall.ts create mode 100644 packages/multicall/src/providers/external-provider.ts create mode 100644 packages/multicall/src/providers/index.ts create mode 100644 packages/multicall/src/providers/provider-middleware.ts create mode 100644 packages/multicall/src/providers/provider.ts create mode 100644 packages/multicall/src/types.ts create mode 100644 packages/multicall/src/utils.ts create mode 100644 packages/multicall/tests/multicall.spec.ts create mode 100644 packages/multicall/tests/utils/index.ts create mode 100644 packages/network/CHANGELOG.md create mode 100644 packages/network/README.md create mode 100644 packages/network/constants/package.json create mode 100644 packages/network/src/config.ts create mode 100644 packages/network/src/constants.ts create mode 100644 packages/network/src/index.ts create mode 100644 packages/network/src/json-rpc-provider.ts create mode 100644 packages/network/src/json-rpc/index.ts create mode 100644 packages/network/src/json-rpc/middleware/allow-provider.ts create mode 100644 packages/network/src/json-rpc/middleware/cached-provider.ts create mode 100644 packages/network/src/json-rpc/middleware/eager-provider.ts create mode 100644 packages/network/src/json-rpc/middleware/exception-provider.ts create mode 100644 packages/network/src/json-rpc/middleware/index.ts create mode 100644 packages/network/src/json-rpc/middleware/logging-provider.ts create mode 100644 packages/network/src/json-rpc/middleware/network-provider.ts create mode 100644 packages/network/src/json-rpc/middleware/public-provider.ts create mode 100644 packages/network/src/json-rpc/middleware/signing-provider.ts create mode 100644 packages/network/src/json-rpc/middleware/singleflight.ts create mode 100644 packages/network/src/json-rpc/router.ts create mode 100644 packages/network/src/json-rpc/sender.ts create mode 100644 packages/network/src/json-rpc/types.ts create mode 100644 packages/network/src/json-rpc/utils.ts create mode 100644 packages/network/src/utils.ts create mode 100644 packages/provider/README.md create mode 100644 packages/provider/hardhat1.config.js create mode 100644 packages/provider/hardhat2.config.js create mode 100644 packages/provider/src/analytics.ts create mode 100644 packages/provider/src/client.ts create mode 100644 packages/provider/src/eip191exceptions.ts create mode 100644 packages/provider/src/extended.ts create mode 100644 packages/provider/src/index.ts create mode 100644 packages/provider/src/init.ts create mode 100644 packages/provider/src/provider.ts create mode 100644 packages/provider/src/signer.ts create mode 100644 packages/provider/src/transactions.ts create mode 100644 packages/provider/src/transports/base-provider-transport.ts create mode 100644 packages/provider/src/transports/base-wallet-transport.ts create mode 100644 packages/provider/src/transports/extension-transport/base-injected-transport.ts create mode 100644 packages/provider/src/transports/extension-transport/extension-message-handler.ts create mode 100644 packages/provider/src/transports/extension-transport/extension-message-provider.ts create mode 100644 packages/provider/src/transports/extension-transport/index.ts create mode 100644 packages/provider/src/transports/index.ts create mode 100644 packages/provider/src/transports/mux-transport/index.ts create mode 100644 packages/provider/src/transports/mux-transport/mux-message-provider.ts create mode 100644 packages/provider/src/transports/proxy-transport/index.ts create mode 100644 packages/provider/src/transports/proxy-transport/proxy-message-channel.ts create mode 100644 packages/provider/src/transports/proxy-transport/proxy-message-handler.ts create mode 100644 packages/provider/src/transports/proxy-transport/proxy-message-provider.ts create mode 100644 packages/provider/src/transports/unreal-transport/index.ts create mode 100644 packages/provider/src/transports/unreal-transport/overridelogs.ts create mode 100644 packages/provider/src/transports/unreal-transport/unreal-message-handler.ts create mode 100644 packages/provider/src/transports/unreal-transport/unreal-message-provider.ts create mode 100644 packages/provider/src/transports/wallet-request-handler.ts create mode 100644 packages/provider/src/transports/window-transport/index.ts create mode 100644 packages/provider/src/transports/window-transport/window-message-handler.ts create mode 100644 packages/provider/src/transports/window-transport/window-message-provider.ts create mode 100644 packages/provider/src/types.ts create mode 100644 packages/provider/src/utils.ts create mode 100644 packages/provider/src/utils/index.ts create mode 100644 packages/provider/tests/client.spec.ts create mode 100644 packages/provider/tests/eip191prefix.spec.ts create mode 100644 packages/provider/tests/messages.ts create mode 100644 packages/provider/tests/provider.spec.ts create mode 100644 packages/provider/tests/remove-eip191prefix.spec.ts create mode 100644 packages/provider/tests/signer.spec.ts create mode 100644 packages/provider/tests/transactions.spec.ts create mode 100644 packages/provider/tests/zeroxv3.spec.ts create mode 100644 packages/react-native/src/index.ts create mode 100644 packages/react-native/src/keychain-store.ts create mode 100644 packages/relayer/CHANGELOG.md create mode 100644 packages/relayer/README.md create mode 100644 packages/relayer/hardhat.config.js create mode 100644 packages/relayer/src/index.ts create mode 100644 packages/relayer/src/local-relayer.ts create mode 100644 packages/relayer/src/provider-relayer.ts create mode 100644 packages/relayer/src/rpc-relayer/index.ts create mode 100644 packages/relayer/src/rpc-relayer/relayer.gen.ts create mode 100644 packages/relayer/tests/provider-relayer.spec.ts create mode 100644 packages/replacer/src/cached.ts create mode 100644 packages/replacer/src/index.ts create mode 100644 packages/replacer/src/ipfs.ts create mode 100644 packages/sessions/hardhat.config.js create mode 100644 packages/sessions/src/index.ts create mode 100644 packages/sessions/src/tracker.ts create mode 100644 packages/sessions/src/trackers/cached.ts create mode 100644 packages/sessions/src/trackers/debug.ts create mode 100644 packages/sessions/src/trackers/deduped.ts create mode 100644 packages/sessions/src/trackers/index.ts create mode 100644 packages/sessions/src/trackers/local.ts create mode 100644 packages/sessions/src/trackers/multiple.ts create mode 100644 packages/sessions/src/trackers/promise-cache.ts create mode 100644 packages/sessions/src/trackers/remote/index.ts create mode 100644 packages/sessions/src/trackers/remote/sessions.gen.ts create mode 100644 packages/sessions/src/trackers/stores/index.ts create mode 100644 packages/sessions/src/trackers/stores/indexedDBStore.ts create mode 100644 packages/sessions/src/trackers/stores/memoryStore.ts create mode 100644 packages/sessions/tests/local.spec.ts create mode 100644 packages/signhub/src/index.ts create mode 100644 packages/signhub/src/orchestrator.ts create mode 100644 packages/signhub/src/signers/index.ts create mode 100644 packages/signhub/src/signers/signer.ts create mode 100644 packages/signhub/src/signers/wrapper.ts create mode 100644 packages/signhub/tests/orchestrator.spec.ts create mode 100644 packages/simulator/src/geth-call.ts create mode 100644 packages/simulator/src/index.ts create mode 100644 packages/simulator/src/simulate.ts create mode 100644 packages/simulator/tests/sequence-simulator.spec.ts create mode 100644 packages/tests/src/builds/artifact.ts create mode 100644 packages/tests/src/builds/index.ts create mode 100644 packages/tests/src/builds/v1/artifacts/Factory.ts create mode 100644 packages/tests/src/builds/v1/artifacts/GuestModule.ts create mode 100644 packages/tests/src/builds/v1/artifacts/MainModule.ts create mode 100644 packages/tests/src/builds/v1/artifacts/MainModuleUpgradable.ts create mode 100644 packages/tests/src/builds/v1/artifacts/MultiCallUtils.ts create mode 100644 packages/tests/src/builds/v1/artifacts/SequenceUtils.ts create mode 100644 packages/tests/src/builds/v1/index.ts create mode 100644 packages/tests/src/builds/v2/artifacts/Factory.ts create mode 100644 packages/tests/src/builds/v2/artifacts/GuestModule.ts create mode 100644 packages/tests/src/builds/v2/artifacts/MainModule.ts create mode 100644 packages/tests/src/builds/v2/artifacts/MainModuleUpgradable.ts create mode 100644 packages/tests/src/builds/v2/artifacts/UniversalSigValidator.ts create mode 100644 packages/tests/src/builds/v2/index.ts create mode 100644 packages/tests/src/configs/index.ts create mode 100644 packages/tests/src/configs/random.ts create mode 100644 packages/tests/src/context/index.ts create mode 100644 packages/tests/src/context/v1.ts create mode 100644 packages/tests/src/context/v2.ts create mode 100644 packages/tests/src/index.ts create mode 100644 packages/tests/src/singletonFactory.ts create mode 100644 packages/tests/src/tokens/erc20.ts create mode 100644 packages/tests/src/utils.ts create mode 100644 packages/utils/CHANGELOG.md create mode 100644 packages/utils/src/base64.ts create mode 100644 packages/utils/src/big-number.ts create mode 100644 packages/utils/src/digest.ts create mode 100644 packages/utils/src/index.ts create mode 100644 packages/utils/src/is-node-or-browser.ts create mode 100644 packages/utils/src/jwt-decode.ts create mode 100644 packages/utils/src/logger.ts create mode 100644 packages/utils/src/merkle.ts create mode 100644 packages/utils/src/merkletree/Base.ts create mode 100644 packages/utils/src/merkletree/MerkleTree.ts create mode 100644 packages/utils/src/merkletree/README.md create mode 100644 packages/utils/src/merkletree/index.ts create mode 100644 packages/utils/src/network.ts create mode 100644 packages/utils/src/promise-cache.ts create mode 100644 packages/utils/src/promisify.ts create mode 100644 packages/utils/src/query-string.ts create mode 100644 packages/utils/src/rand.ts create mode 100644 packages/utils/src/sanitize.ts create mode 100644 packages/utils/src/sleep.ts create mode 100644 packages/utils/src/typed-data.ts create mode 100644 packages/utils/src/types.ts create mode 100644 packages/utils/src/web.ts create mode 100644 packages/utils/tests/base64.spec.ts create mode 100644 packages/utils/tests/jwt-decode.spec.ts create mode 100644 packages/utils/tests/merkle.spec.ts create mode 100644 packages/utils/tests/query-string.spec.ts create mode 100644 packages/utils/tests/sanitize.spec.ts create mode 100644 packages/waas-ethers/README.md create mode 100644 packages/waas-ethers/src/index.ts create mode 100644 packages/waas-ethers/src/signer.ts create mode 100644 packages/waas/README.md create mode 100644 packages/waas/src/auth.ts create mode 100644 packages/waas/src/base.ts create mode 100644 packages/waas/src/challenge.ts create mode 100644 packages/waas/src/clients/authenticator.gen.ts create mode 100644 packages/waas/src/clients/intent.gen.ts create mode 100644 packages/waas/src/email.ts create mode 100644 packages/waas/src/index.ts create mode 100644 packages/waas/src/intents/accounts.ts create mode 100644 packages/waas/src/intents/base.ts create mode 100644 packages/waas/src/intents/index.ts create mode 100644 packages/waas/src/intents/messages.ts create mode 100644 packages/waas/src/intents/responses.ts create mode 100644 packages/waas/src/intents/session.ts create mode 100644 packages/waas/src/intents/transactions.ts create mode 100644 packages/waas/src/intents/utils.ts create mode 100644 packages/waas/src/networks.ts create mode 100644 packages/waas/src/secure-store.ts create mode 100644 packages/waas/src/session/index.ts create mode 100644 packages/waas/src/session/keyTypes.ts create mode 100644 packages/waas/src/session/secp256k1.ts create mode 100644 packages/waas/src/session/secp256r1.ts create mode 100644 packages/waas/src/store.ts create mode 100644 packages/waas/src/subtle-crypto.ts create mode 100644 packages/waas/tests/intents.spec.ts create mode 100644 packages/wallet/CHANGELOG.md create mode 100644 packages/wallet/README.md create mode 100644 packages/wallet/hardhat.config.js create mode 100644 packages/wallet/hardhat2.config.js create mode 100644 packages/wallet/src/index.ts create mode 100644 packages/wallet/src/orchestrator/wrapper.ts create mode 100644 packages/wallet/src/signer.ts create mode 100644 packages/wallet/src/utils.ts create mode 100644 packages/wallet/src/wallet.ts create mode 100644 packages/wallet/tests/utils/deploy-wallet-context.ts create mode 100644 packages/wallet/tests/utils/get-contract.ts create mode 100644 packages/wallet/tests/utils/index.ts create mode 100644 packages/wallet/tests/wallet.spec.ts create mode 100644 packages/wallet/wallet-contracts/.eslintignore create mode 100644 packages/wallet/wallet-contracts/.eslintrc.js create mode 100644 packages/wallet/wallet-contracts/.gitattributes create mode 100644 packages/wallet/wallet-contracts/.github/actions/install-dependencies/action.yml create mode 100644 packages/wallet/wallet-contracts/.github/workflows/ci.yml create mode 100644 packages/wallet/wallet-contracts/.gitmodules create mode 100644 packages/wallet/wallet-contracts/.prettierrc create mode 100644 packages/wallet/wallet-contracts/.solcover.js create mode 100644 packages/wallet/wallet-contracts/.solhint.json create mode 100644 packages/wallet/wallet-contracts/0xsequence-wallet-contracts-3.0.1.tgz create mode 100644 packages/wallet/wallet-contracts/Counter/.github/workflows/test.yml create mode 100644 packages/wallet/wallet-contracts/Counter/.gitmodules create mode 100644 packages/wallet/wallet-contracts/Counter/README.md create mode 100644 packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-1763223074249.json create mode 100644 packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-1763223530987.json create mode 100644 packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-latest.json create mode 100644 packages/wallet/wallet-contracts/Counter/foundry.lock create mode 100644 packages/wallet/wallet-contracts/Counter/foundry.toml create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/.gitattributes create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/CODEOWNERS create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/dependabot.yml create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/workflows/ci.yml create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/workflows/sync.yml create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/CONTRIBUTING.md create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/LICENSE-APACHE create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/LICENSE-MIT create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/README.md create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/RELEASE_CHECKLIST.md create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/foundry.toml create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/package.json create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/scripts/vm.py create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Base.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Config.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/LibVariable.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Script.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdAssertions.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdChains.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdCheats.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdConfig.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdConstants.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdError.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdInvariant.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdJson.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdMath.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdStorage.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdStyle.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdToml.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdUtils.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Test.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Vm.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/console.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/console2.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC1155.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC165.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC20.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC4626.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC6909.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC721.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC7540.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC7575.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IMulticall3.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/src/safeconsole.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/CommonBase.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/Config.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/LibVariable.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdAssertions.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdChains.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdCheats.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdConstants.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdError.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdJson.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdMath.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdStorage.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdStyle.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdToml.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdUtils.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/Vm.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationScript.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationScriptBase.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationTest.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationTestBase.sol create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/broadcast.log.json create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/config.toml create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/test.json create mode 100644 packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/test.toml create mode 100644 packages/wallet/wallet-contracts/Counter/script/Counter.s.sol create mode 100644 packages/wallet/wallet-contracts/Counter/src/Counter.sol create mode 100644 packages/wallet/wallet-contracts/Counter/test/Counter.t.sol create mode 100644 packages/wallet/wallet-contracts/Counter/utils/JsonBindings.sol create mode 100644 packages/wallet/wallet-contracts/LICENSE create mode 100644 packages/wallet/wallet-contracts/README.md create mode 100644 packages/wallet/wallet-contracts/audits/v1/Consensys_Diligence.md create mode 100644 packages/wallet/wallet-contracts/audits/v1/Quantstamp_Arcadeum_Report_Final.pdf create mode 100644 packages/wallet/wallet-contracts/audits/v1/sequence_quantstamp_audit_feb_2021.pdf create mode 100644 packages/wallet/wallet-contracts/audits/v2/Sequence Wallet - Zellic Audit Report.pdf create mode 100644 packages/wallet/wallet-contracts/audits/v2/consensys-horizon-sequence-wallet-audit-2023-02.pdf create mode 100644 packages/wallet/wallet-contracts/config/PROD.env.sample create mode 100644 packages/wallet/wallet-contracts/contracts/Factory.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/metadata.json create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/interfaces/IERC1271Wallet.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/GuestModule.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/GuestModule.json create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/GuestModule_metadata.json create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/build-info/c563de663c25f57de739af959840b24e.json create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleAuth.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleCalls.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleCreator.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleERC165.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleNonce.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleSelfAuth.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleStorage.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleAuth.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleCalls.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleCreator.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibBytes.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibBytesPointer.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibOptim.sol create mode 100644 packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/SignatureValidator.sol create mode 100644 packages/wallet/wallet-contracts/contracts/Wallet.sol create mode 100644 packages/wallet/wallet-contracts/contracts/hooks/WalletProxyHook.sol create mode 100644 packages/wallet/wallet-contracts/contracts/hooks/interfaces/IWalletProxy.sol create mode 100644 packages/wallet/wallet-contracts/contracts/interfaces/IERC1271Wallet.sol create mode 100644 packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC1155Receiver.sol create mode 100644 packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC223Receiver.sol create mode 100644 packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC721Receiver.sol create mode 100644 packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC777Receiver.sol create mode 100644 packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC1155.sol create mode 100644 packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC20.sol create mode 100644 packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC721.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/AlwaysRevertMock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/CallReceiverMock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/DelegateCallMock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/ERC1155Mock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/ERC165CheckerMock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/ERC20Mock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/ERC721Mock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/GasBurnerMock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/HookCallerMock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/HookMock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/LibBytesImpl.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/LibBytesPointerImpl.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/LibStringImp.sol create mode 100644 packages/wallet/wallet-contracts/contracts/mocks/ModuleMock.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/GuestModule.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/MainModule.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/MainModuleGasEstimation.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/MainModuleUpgradable.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/Implementation.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuth.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthConvenience.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthFixed.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthUpgradable.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleCalls.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleCreator.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleERC165.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleERC5719.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleExtraAuth.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleHooks.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleIPFS.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleNonce.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleOnlyDelegatecall.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleSelfAuth.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleStorage.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/ModuleUpdate.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleAuth.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleCalls.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleCreator.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleHooks.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleUpdate.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/utils/GasEstimator.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/utils/MultiCallUtils.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/utils/RequireUtils.sol create mode 100644 packages/wallet/wallet-contracts/contracts/modules/utils/SequenceUtils.sol create mode 100644 packages/wallet/wallet-contracts/contracts/trust/Trust.sol create mode 100644 packages/wallet/wallet-contracts/contracts/trust/TrustFactory.sol create mode 100644 packages/wallet/wallet-contracts/contracts/utils/LibAddress.sol create mode 100644 packages/wallet/wallet-contracts/contracts/utils/LibBytes.sol create mode 100644 packages/wallet/wallet-contracts/contracts/utils/LibBytesPointer.sol create mode 100644 packages/wallet/wallet-contracts/contracts/utils/LibOptim.sol create mode 100644 packages/wallet/wallet-contracts/contracts/utils/LibString.sol create mode 100644 packages/wallet/wallet-contracts/contracts/utils/SignatureValidator.sol create mode 100644 packages/wallet/wallet-contracts/docs/book.css create mode 100644 packages/wallet/wallet-contracts/docs/book.toml create mode 100644 packages/wallet/wallet-contracts/docs/solidity.min.js create mode 100644 packages/wallet/wallet-contracts/docs/src/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/SUMMARY.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/Factory.sol/contract.Factory.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/Wallet.sol/library.Wallet.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/hooks/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/hooks/WalletProxyHook.sol/contract.WalletProxyHook.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/hooks/interfaces/IWalletProxy.sol/interface.IWalletProxy.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/hooks/interfaces/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/IERC1271Wallet.sol/interface.IERC1271Wallet.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC1155Receiver.sol/interface.IERC1155Receiver.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC223Receiver.sol/interface.IERC223Receiver.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC721Receiver.sol/interface.IERC721Receiver.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC777Receiver.sol/interface.IERC777Receiver.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC1155.sol/interface.IERC1155.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC20.sol/interface.IERC20.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC721.sol/interface.IERC721.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/AlwaysRevertMock.sol/contract.AlwaysRevertMock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/CallReceiverMock.sol/contract.CallReceiverMock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/DelegateCallMock.sol/contract.DelegateCallMock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC1155Mock.sol/contract.ERC1155Mock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC165CheckerMock.sol/contract.ERC165CheckerMock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC20Mock.sol/contract.ERC20Mock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC721Mock.sol/contract.ERC721Mock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/GasBurnerMock.sol/contract.GasBurnerMock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/HookCallerMock.sol/contract.HookCallerMock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/HookMock.sol/contract.HookMock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibBytesImpl.sol/contract.LibBytesImpl.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibBytesPointerImpl.sol/contract.LibBytesPointerImpl.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibStringImp.sol/contract.LibStringImp.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/ModuleMock.sol/contract.ModuleMock.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/mocks/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/GuestModule.sol/contract.GuestModule.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModule.sol/contract.MainModule.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModuleGasEstimation.sol/contract.MainModuleGasEstimation.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModuleUpgradable.sol/contract.MainModuleUpgradable.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/Implementation.sol/contract.Implementation.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthConvenience.sol/abstract.ModuleAuthConvenience.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthFixed.sol/abstract.ModuleAuthFixed.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthUpgradable.sol/abstract.ModuleAuthUpgradable.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleCalls.sol/abstract.ModuleCalls.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleCreator.sol/contract.ModuleCreator.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC5719.sol/contract.ModuleERC5719.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleExtraAuth.sol/abstract.ModuleExtraAuth.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleHooks.sol/contract.ModuleHooks.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleIPFS.sol/contract.ModuleIPFS.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleNonce.sol/contract.ModuleNonce.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleOnlyDelegatecall.sol/contract.ModuleOnlyDelegatecall.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleStorage.sol/library.ModuleStorage.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleUpdate.sol/contract.ModuleUpdate.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol/abstract.ModuleIgnoreAuthUpgradable.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol/abstract.ModuleIgnoreNonceCalls.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuth.sol/abstract.IModuleAuth.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol/interface.IModuleAuthUpgradable.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCalls.sol/interface.IModuleCalls.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCreator.sol/interface.IModuleCreator.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleHooks.sol/interface.IModuleHooks.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleUpdate.sol/abstract.IModuleUpdate.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol/library.SequenceBaseSig.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol/abstract.SequenceChainedSig.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol/library.SequenceDynamicSig.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol/library.SequenceNoChainIdSig.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/nonce/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol/library.SubModuleNonce.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/GasEstimator.sol/contract.GasEstimator.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/MultiCallUtils.sol/contract.MultiCallUtils.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/RequireUtils.sol/contract.RequireUtils.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/SequenceUtils.sol/contract.SequenceUtils.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/trust/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/trust/Trust.sol/contract.Trust.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/trust/Trust.sol/function.absDiff.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/trust/TrustFactory.sol/contract.TrustFactory.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/utils/LibAddress.sol/library.LibAddress.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/utils/LibBytes.sol/library.LibBytes.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/utils/LibBytesPointer.sol/library.LibBytesPointer.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/utils/LibOptim.sol/library.LibOptim.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/utils/LibString.sol/library.LibString.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/utils/README.md create mode 100644 packages/wallet/wallet-contracts/docs/src/contracts/utils/SignatureValidator.sol/library.SignatureValidator.md create mode 100644 packages/wallet/wallet-contracts/foundry.lock create mode 100644 packages/wallet/wallet-contracts/foundry.toml create mode 100644 packages/wallet/wallet-contracts/foundry_test/base/AdvTest.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/hooks/WalletProxyHook.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/Implementation.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleCalls.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleERC5719.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleExtraAuth.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleIPFS.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleStorage.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceBaseSig.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceChainedSig.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceDynamicSig.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceNoChainIdSig.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/nonce/SubModuleNonce.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorEncoder.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuff.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadExecute.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadFlag.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadNonce.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadTx.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadTxs.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/modules/utils/RequireUtils.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/trust/Trust.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/trust/TrustFactory.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/utils/LibAddress.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/utils/LibBytes.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/utils/LibBytesPointer.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/utils/LibOptim.t.sol create mode 100644 packages/wallet/wallet-contracts/foundry_test/utils/SignatureValidator.t.sol create mode 100644 packages/wallet/wallet-contracts/funding.json create mode 100644 packages/wallet/wallet-contracts/hardhat.config.ts create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/.github/workflows/ci.yml create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/.github/workflows/sync.yml create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/.gitmodules create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/LICENSE-APACHE create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/LICENSE-MIT create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/README.md create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/foundry.toml create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/.github/workflows/build.yml create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/LICENSE create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/Makefile create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/default.nix create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/demo/demo.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/package.json create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/src/test.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/src/test.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/package.json create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/Base.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/Script.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdAssertions.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdChains.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdCheats.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdError.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdInvariant.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdJson.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdMath.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdStorage.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdStyle.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/StdUtils.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/Test.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/Vm.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/console.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/console2.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC1155.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC165.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC20.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC4626.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC721.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IMulticall3.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/StdAssertions.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/StdChains.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/StdCheats.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/StdError.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/StdMath.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/StdStorage.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/StdStyle.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/StdUtils.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationScript.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationTest.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol create mode 100644 packages/wallet/wallet-contracts/lib/forge-std/test/fixtures/broadcast.log.json create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/.git-blame-ignore-revs create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/.github/workflows/tests.yaml create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/.gitmodules create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/LICENSE create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/README.md create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/Group 1.png create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/banner.jpg create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/black_white_huff-removebg-preview.png create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/black_white_huff.png create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/foundry.png create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/foundry_huff_banner.jpg create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/foundry_huff_banner.png create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/huff.png create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/inverted_huff.png create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/x-removebg-preview.png create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/assets/x.jpg create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/foundry.toml create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/.github/workflows/ci.yml create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/.github/workflows/sync.yml create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/.gitmodules create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/LICENSE-APACHE create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/LICENSE-MIT create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/README.md create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/foundry.toml create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/.github/workflows/build.yml create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/LICENSE create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/Makefile create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/default.nix create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/demo/demo.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/package.json create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/src/test.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/src/test.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/package.json create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Base.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Script.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdAssertions.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdChains.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdCheats.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdError.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdInvariant.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdJson.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdMath.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdStorage.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdStyle.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdUtils.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Test.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Vm.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/console.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/console2.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC1155.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC165.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC20.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC4626.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC721.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IMulticall3.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/safeconsole.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdAssertions.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdChains.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdCheats.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdError.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdMath.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdStorage.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdStyle.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdUtils.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationScript.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationScriptBase.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationTest.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationTestBase.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/fixtures/broadcast.log.json create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/binary_check.sh create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/file_writer.sh create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/rand_bytes.sh create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/read_and_append.sh create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.gitattributes create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.github/workflows/ci.yml create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.gitmodules create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/LICENSE create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/Makefile create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/README create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/README.md create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/dappfile create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/LICENSE create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/Makefile create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/default.nix create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/demo/demo.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/src/test.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/src/strings.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/src/strings.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/remappings.txt create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/scripts/binary_check.sh create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/scripts/file_writer.sh create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/scripts/rand_bytes.sh create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/scripts/read_and_append.sh create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/HuffConfig.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/HuffDeployer.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/depreciated/StatefulDeployer.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/depreciated/StatefulDeployer.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/HuffConfig.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/HuffDeployer.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/Logging.t.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/ConstOverride.huff create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/Constructor.huff create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/ConstructorNeedsValue.huff create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/EVMVersionCheck.huff create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/LotsOfLogging.huff create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/NoConstructor.huff create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/Number.huff create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/RememberCreator.huff create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/IConstructor.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/INumber.sol create mode 100644 packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/IRememberCreator.sol create mode 100644 packages/wallet/wallet-contracts/networks/arbitrum.json create mode 100644 packages/wallet/wallet-contracts/networks/arbitrumGoerli.json create mode 100644 packages/wallet/wallet-contracts/networks/arbitrumNova.json create mode 100644 packages/wallet/wallet-contracts/networks/avalanche.json create mode 100644 packages/wallet/wallet-contracts/networks/avalancheFuji.json create mode 100644 packages/wallet/wallet-contracts/networks/bnb.json create mode 100644 packages/wallet/wallet-contracts/networks/bnbTestnet.json create mode 100644 packages/wallet/wallet-contracts/networks/gnosis.json create mode 100644 packages/wallet/wallet-contracts/networks/goerli.json create mode 100644 packages/wallet/wallet-contracts/networks/hardhat.json create mode 100644 packages/wallet/wallet-contracts/networks/mainnet.json create mode 100644 packages/wallet/wallet-contracts/networks/mumbai.json create mode 100644 packages/wallet/wallet-contracts/networks/optimism.json create mode 100644 packages/wallet/wallet-contracts/networks/polygon.json create mode 100644 packages/wallet/wallet-contracts/networks/polygonZkevm.json create mode 100644 packages/wallet/wallet-contracts/package-lock.json create mode 100644 packages/wallet/wallet-contracts/package.json create mode 100644 packages/wallet/wallet-contracts/pnpm-lock.yaml create mode 100644 packages/wallet/wallet-contracts/remappings.txt create mode 100644 packages/wallet/wallet-contracts/run_huff_tests.sh create mode 100644 packages/wallet/wallet-contracts/soldeer.lock create mode 100644 packages/wallet/wallet-contracts/src/Errors.huff create mode 100644 packages/wallet/wallet-contracts/src/L2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/L2CompressorLib.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__csfnkjajkqagwbukjfojatjegwtjmxhdL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__cvwewezvvfcuoxtlisicumgcpzqhgavjL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__cvyihdgegfauooldcwyvlordhurwepivL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__dpdvzwushkgzisywrbnkhcrodypkvbvyL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__ecomtgzdrtxibkzevmerruajxffksduvL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__iacuotklnugcaogzpvcdfhvolsvzerleL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__jcmwhtnovsnvnyyhadlushmcopgxtlcwL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__jdfvnyqsqtnysjlyfovitokyykvxttnoL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__jyyzvebufexucahwkkbkfdcmuiabvbfeL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__kbisarygvfqaqtuxwpgejdnyqkualpwlL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__lszmdtforkxonmlujouewhlrvjjrmurcL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__mgltnswskwojupcsygtzovabokiotusaL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__mzwfsngwzygdglttftvfnbgkuxhmtqwiL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__nxqmasuaqrahclmuoszdisbtgmuppjvfL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__pgmagdckbktfjhzdpajytwhcpkhlmscqL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__pwbfbdaeweytjiloryhjilsqguaprwtwL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__pxqvpgsonlpbmziexnicojtlgsgfouyrL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__qcagqkszwlsndhjyagmukhxiugwadpxxL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__qymdioekngjvjjjqfpzmxlycnvbslwevL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__rpzdmcdnijxlttsivcfgzleurbgpchhzL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__rulclzzfmyszewnycpzlqmcopsqccarqL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__uexsnlcvbjyubdfmmdxzehdfcdiwufcrL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__ughbfnqmhbdbiuueqxutuvcxicgrmnxwL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__uzsvtiqnxxrhkhfelgdrwmnbwwirribaL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__vffsqkjyicdnumnesfhcjlgtqguwdpnpL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__vtbpzpccsyytsvygxsyhvyojjbqsghpbL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__xhuychsyvcmrjzhibkdksklxflvtfefdL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__ylxrpbrfcykqjxgggzptgdvokhmzcvamL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/__TEMP__zkzjzrglozoqyyfvpcdqeanjxglmtzbbL2Compressor.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/L2CompressorImps.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/L2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/L2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/L2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/L2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/L2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__aayxscdgqfgqckqcfvplniuqleqmglgpL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__agjsoduxivwxbunbrskpnttujfxlnsuqL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__aozfhsjnhfgdhkvygupcezykxnllxhooL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__auoqqxuvhsugblxkhmuynutuutdpetfmL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__bgiysfzlfrqnqopegdijkxkzjebeugweL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__bhcstacsnwaeevimfyeuyukrpkefkpjvL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__bjodacjzehrzeexubslwqheqqdtpojdxL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__bqzqrnjvdcsevkfpbluzvxgnvfnbjbvdL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__bxxjqefyxrrctwjijuvxauktfiveuhazL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__cczbajsfeehqceablvdedlohtwcpgruiL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__ceqwybpkmvqejmujxdddmmbuqrzcvpqlL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__cinzltxsvuofyvnmuiiddtfwsyytzwszL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__ckntqzzuqphqsecwtcwuiczrfadymzpwL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__ctxqvslrdaagplfabzhyfjejoyhqoxvnL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__cxyftrlslztbljuqlicrbibyyssybguhL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__cyxkjqcsonpojbyksbsvglcrgoqbepkaL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__deeivxbssjzviqkksdozrardbmkofvggL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__dexeqmbbqijqudvjnczxedpzkrqkrxgpL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__ebpduriemctxazssijauhsotgyqtayygL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__edfwesooemxojadwrkmombuemzhicuirL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__eicqyirjstlxuotvptvgszvdeemgpomnL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__eiovqvzojbuhtglrinqvkqirnywzkmmmL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__elmwrfrphdzesjosulrygitvkhredhzhL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__eqatcxksiizfyaalvdegpzaqhuqqhiasL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__etsleznlprfdbomdvycqormkvpykanxnL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__ezolvnoridtqgdaoucihkxihmonvdzfxL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__fjxkkzopmkrdujlfcvecckcbuhhhpvpfL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__fnqywxkjihwbqdurhcftzbzzrxvcmizbL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__fophszhswirxqqcvcwxtmeqbuwldxifmL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__fvrcmlbliwfwkjwbyxrediuokmghmftbL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__fzlawzzpwhflvpxtrdpemqiejqiknsfiL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__gllqgrsektwpyxkfoughzygdwrhxuzibL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__gmuxapiaoacldjbqqarixmvtxkffgwchL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__gnbrxkaxjdmimbyepztqmujkoilcaudgL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__grtgxrlusabnzjycyuqniujobcpgjuysL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__guymonsuywmugusjixyvzwfzordmogvuL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__gvmiqpcdvchroaxhcnyygzhjrvozrogmL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__hahsuwlfvumxsoepdhwqsahoduwcqrrpL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__hbzqhssjozyiqufyamizmyrwtgelqlacL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__hfunbeczbrqifdmdhdecpajexqefympmL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__htawaymiowrkxyrnxkesysithbtrbvqqL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__hwddxmqkngntwieovwlvozjzwlctwrzrL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__iepjlcxcjkjplwmrexbaruoucdulzvqvL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__igcaczanzcfoaizsmahiisgmgdjzfjxqL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__irlchgckchrpalaqwygxkipfvshmgystL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__ixvgjbblpufenoaperstvmceseoukqtcL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__jehdemzdnzfibjlvuclsezveuuexubagL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__jgpbsiwsniszmajdqepfceqpqhdfzbiiL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__jowmzjwgdpwndoapfucdlmsxiuwbhxrsL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__jujqtnlfowbvuxcpetgqmymkladcanwtL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__jvyndfqmdiikuahllmivwlrgrfhmdzslL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__kqlasykhhfirrrmebqsqsnoleofcgyciL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__krffnjyglejvywvaqrlwcoejtxsysubcL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__lcamxsrkjvabmusmojsaspukxeydggrhL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__lhhzpskainxqfqaqlpehxidlrhdvkcoyL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__lqfhpuhoyykhenkubqyenjlfkzsbjkxcL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__lvxixehkgptearwmufefnibyzayqaaciL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__lyxapewhygradusuogqwefdorgsntvcxL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__mfzlovayqwfmitftdbihfqfuruuvbxqbL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__mimqucgooefgrgmedlqkqqhszmvuuxioL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__mlmvtiltzqbjdwbouzrwkvkhpzncpjzsL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__mscgrvpcuajxspktkuiktwofhzwbszraL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__mscqnapvfrrvforntvdsgkeofzbhbhdsL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__nikafqmlyyfgnksobnextlfkyykzrdomL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__nmkhnrsondojimozdduewzkbcwlvsakcL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__nwvyiqgthdyhbeqefkhccrhufdhjjazeL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__obfmnrpwkqhjnhtlarvljeqysguhoizaL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__osezdxhuqmvwkwrmogebamkqmhdvljmlL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__pabiechkuxsxbofnkwdnlbnftvkuearfL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__paowmqtaesjuestckycmjquytqlfsdxoL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__pbsqieaiicgyhrvarrpmypzdufaanmpuL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__pdhdqmtavohyssvasdtggpxqllpajsfgL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__petemgomrtnkvriaaltgrrlpmnzupwinL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__prsagizbgnvlqmbynuotwqkanwdlaqwpL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__pwmrquntendpgjgzyejxobzrgvpizgfdL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__qcnbdgafrzidybihlkysfiliofczzxkhL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__qmgpovlxptxlyeikmnrgvhavunciniubL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__qotscdrriksxilvopyxfsbdteqegnyogL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__qpcuafrrwylbrmzpjfotpjfuqxtnqrznL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__qrusinhmosfcvmayqquwflixlquuhfxhL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__raqvmbdtosqccjiitanbofqxpeepnlpnL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__ruqfgeoaamevndekencowviukvlcrylcL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__sccswirfbmatrvwbvymwfzttbygcbfmqL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__sgfhxhvokcpqraldrihrcqjmlolnoulkL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__smnsryuyuhbbunwequckjtrcwgaqmtqrL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__stxwzpcueqdwmcsxvxwzkubprcmgpexkL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__syiwghttzfntbuucvfvlctpjeldqbrshL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__tadxtxolhcweyyokjpleorchotchzsecL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__tlpzvbklzufubgnwcvynodibgfqnidibL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__uobsemubvemlejzpjvdzyjcjrsbhplpsL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__uudbvubkefushlwgxsfgldujuphcmuueL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__uyprsxxzmvxmqqzffpwypehvvksjzbvnL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__vmmtlehczdflhfwnklqlujjtzpxrejpmL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__voqybenghboelsmsisgwnqqymvpjvskcL2CompressorReadFlag.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__vtdvfmunyolkgcpjpzhtgjgwawtaakhwL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__vtynudukibsyoxexvoiaurnusvgnrhusL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__vvictwvevvjztwupwcjsnyherfswgsgcL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__vzqupagxqpkbexuaqyoulenyhrwfuvsiL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__wcgjgrxjyjenenrnolprlkfulinnjttkL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__weeyfqxkqtokrkcwbrxerdftkvyxqwwiL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__xbuxrypubsjveaucjyhkmwlwmhlgvymnL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__xeqwdqdlujruiiyywivxsxrlsluymfdiL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__xprohfjolmgvmuxskobwcqavoskmutltL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__yhfcljsbzcghwkonkegmtbremlhrxnejL2CompressorReadExecute.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__yphredkigvzhxnjzbspndmkchcjaofllL2CompressorReadNonce.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__zfeyxnkrahdyldfbtyakjkbvehkjdbmgL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__zmblbdmtdrpbbopekynjthxzellyhsxeL2CompressorReadTxs.huff create mode 100644 packages/wallet/wallet-contracts/src/imps/__TEMP__zvcrygcudiscauggwhjnxbrgifehtxhfL2CompressorReadTx.huff create mode 100644 packages/wallet/wallet-contracts/test/ChainedSignatures.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/ERC165.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/Factory.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/GasEstimation.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/GuestModule.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/LibBytes.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/LibString.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/MainModule.bench.ts create mode 100644 packages/wallet/wallet-contracts/test/MainModule.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/MerkleSignatures.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/MultiCallUtils.spec.ts create mode 100644 packages/wallet/wallet-contracts/test/utils/contracts.ts create mode 100644 packages/wallet/wallet-contracts/test/utils/imposter.ts create mode 100644 packages/wallet/wallet-contracts/test/utils/index.ts create mode 100644 packages/wallet/wallet-contracts/test/utils/sequence.ts create mode 100644 packages/wallet/wallet-contracts/test/utils/wallet.ts create mode 100644 packages/wallet/wallet-contracts/tsconfig.json create mode 100644 packages/wallet/wallet-contracts/typings/chai-bignumber.d.ts create mode 100644 packages/wallet/wallet-contracts/typings/chai-bn.ts create mode 100644 packages/wallet/wallet-contracts/typings/truffle.d.ts create mode 100644 packages/wallet/wallet-contracts/utils/JsonBindings.sol create mode 100644 packages/wallet/wallet-contracts/utils/benchmarker.ts create mode 100644 packages/wallet/wallet-contracts/utils/config-loader.ts create mode 100644 packages/wallet/wallet-contracts/utils/deploy-contracts.ts create mode 100644 packages/wallet/wallet-contracts/utils/workers/bench-worker.ts create mode 100644 remappings.txt create mode 100644 tsconfig.json create mode 100644 tsconfig.test.json diff --git a/.changeset/README.md b/.changeset/README.md index e5b6d8d6a..4f3b76b09 100644 --- a/.changeset/README.md +++ b/.changeset/README.md @@ -5,4 +5,4 @@ with multi-package repos, or single-package repos to help you version and publis find the full documentation for it [in our repository](https://github.com/changesets/changesets) We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) +[our documentation](https://github.com/changesets/changesets/blob/master/docs/common-questions.md) diff --git a/.changeset/bright-pots-hope.md b/.changeset/bright-pots-hope.md new file mode 100644 index 000000000..6bd9a887c --- /dev/null +++ b/.changeset/bright-pots-hope.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +Beta release with dapp connector fixes diff --git a/.changeset/crisp-zoos-retire.md b/.changeset/crisp-zoos-retire.md new file mode 100644 index 000000000..84fd2a25c --- /dev/null +++ b/.changeset/crisp-zoos-retire.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +dapp-client updates diff --git a/.changeset/cyan-radios-relax.md b/.changeset/cyan-radios-relax.md new file mode 100644 index 000000000..ec408d6cd --- /dev/null +++ b/.changeset/cyan-radios-relax.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +Fix signer 404 error, minor fixes diff --git a/.changeset/free-tips-switch.md b/.changeset/free-tips-switch.md new file mode 100644 index 000000000..0921b6d35 --- /dev/null +++ b/.changeset/free-tips-switch.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +3.0.0 beta diff --git a/.changeset/goofy-laws-serve.md b/.changeset/goofy-laws-serve.md new file mode 100644 index 000000000..690a5f76b --- /dev/null +++ b/.changeset/goofy-laws-serve.md @@ -0,0 +1,21 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +'@repo/eslint-config': patch +'@repo/typescript-config': patch +'@repo/ui': patch +--- + +Beta release for v3 diff --git a/.changeset/new-turkeys-double.md b/.changeset/new-turkeys-double.md new file mode 100644 index 000000000..72f26beb9 --- /dev/null +++ b/.changeset/new-turkeys-double.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +Apple auth fixes diff --git a/.changeset/nice-tips-slide.md b/.changeset/nice-tips-slide.md new file mode 100644 index 000000000..1595123e7 --- /dev/null +++ b/.changeset/nice-tips-slide.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +Apple auth fix diff --git a/.changeset/open-toes-marry.md b/.changeset/open-toes-marry.md new file mode 100644 index 000000000..ec5bf3217 --- /dev/null +++ b/.changeset/open-toes-marry.md @@ -0,0 +1,20 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +'@repo/eslint-config': patch +'@repo/typescript-config': patch +'@repo/ui': patch +--- + +3.0.0-beta.3 with fixes diff --git a/.changeset/plain-feet-stare.md b/.changeset/plain-feet-stare.md new file mode 100644 index 000000000..c99c82026 --- /dev/null +++ b/.changeset/plain-feet-stare.md @@ -0,0 +1,17 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +3.0.0-beta.2 with identity instrument updates diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 000000000..3b0804872 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,39 @@ +{ + "mode": "exit", + "tag": "beta", + "initialVersions": { + "docs": "0.1.0", + "web": "0.1.0", + "@0xsequence/api": "3.0.0-beta.11", + "@0xsequence/builder": "3.0.0-beta.11", + "@0xsequence/guard": "3.0.0-beta.11", + "@0xsequence/identity-instrument": "3.0.0-beta.11", + "@0xsequence/indexer": "3.0.0-beta.11", + "@0xsequence/marketplace": "3.0.0-beta.11", + "@0xsequence/metadata": "3.0.0-beta.11", + "@0xsequence/relayer": "3.0.0-beta.11", + "@0xsequence/userdata": "3.0.0-beta.11", + "@0xsequence/abi": "3.0.0-beta.11", + "@0xsequence/wallet-core": "3.0.0-beta.11", + "@0xsequence/dapp-client": "3.0.0-beta.11", + "@0xsequence/wallet-primitives": "3.0.0-beta.11", + "@0xsequence/wallet-wdk": "3.0.0-beta.11", + "@repo/eslint-config": "0.0.1-beta.1", + "@repo/typescript-config": "0.0.1-beta.1", + "@repo/ui": "0.0.1-beta.1" + }, + "changesets": [ + "bright-pots-hope", + "crisp-zoos-retire", + "cyan-radios-relax", + "free-tips-switch", + "goofy-laws-serve", + "new-turkeys-double", + "nice-tips-slide", + "open-toes-marry", + "plain-feet-stare", + "tiny-files-chew", + "wild-feet-carry", + "wise-heads-buy" + ] +} diff --git a/.changeset/tiny-files-chew.md b/.changeset/tiny-files-chew.md new file mode 100644 index 000000000..672546fd0 --- /dev/null +++ b/.changeset/tiny-files-chew.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +dapp client updates for EOA login diff --git a/.changeset/wild-feet-carry.md b/.changeset/wild-feet-carry.md new file mode 100644 index 000000000..962942831 --- /dev/null +++ b/.changeset/wild-feet-carry.md @@ -0,0 +1,17 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +3.0.0-beta.1 diff --git a/.changeset/wise-heads-buy.md b/.changeset/wise-heads-buy.md new file mode 100644 index 000000000..1c35a4d35 --- /dev/null +++ b/.changeset/wise-heads-buy.md @@ -0,0 +1,17 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +RC5 upgrade diff --git a/.codesandbox/.github/workflows/build.yml b/.codesandbox/.github/workflows/build.yml new file mode 100644 index 000000000..86518b55b --- /dev/null +++ b/.codesandbox/.github/workflows/build.yml @@ -0,0 +1,32 @@ +name: build dapp + +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + name: Build and Push + steps: + - name: git-checkout + uses: actions/checkout@v3 + + - name: Setup PNPM + uses: pnpm/action-setup@v2 + with: + version: 8 + run_install: true + + - name: Build + run: pnpm dist + + - name: Push + uses: s0/git-publish-subdir-action@develop + env: + REPO: self + BRANCH: build + FOLDER: dist + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MESSAGE: 'Build: ({sha}) {msg}' diff --git a/.codesandbox/.gitignore b/.codesandbox/.gitignore new file mode 100644 index 000000000..e4db0232c --- /dev/null +++ b/.codesandbox/.gitignore @@ -0,0 +1,19 @@ +.env + +#dependencies +node_modules/ + +# production +dist/ + +# misc +.DS_Store +.vscode +.idea/ +*.iml +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +.env.local diff --git a/.codesandbox/.prettierrc b/.codesandbox/.prettierrc new file mode 100644 index 000000000..421afa979 --- /dev/null +++ b/.codesandbox/.prettierrc @@ -0,0 +1,9 @@ +{ + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "trailingComma": "none", + "arrowParens": "avoid", + "printWidth": 130 +} diff --git a/.codesandbox/README.md b/.codesandbox/README.md new file mode 100644 index 000000000..dd2d3cbf3 --- /dev/null +++ b/.codesandbox/README.md @@ -0,0 +1,49 @@ +Demo Dapp +========= + +Dapp example on how to use Sequence Wallet. Covers how to connect, sign messages and send transctions. + +Try this dapp at: [https://0xsequence.github.io/demo-dapp](https://0xsequence.github.io/demo-dapp) + +For complete documentation on Sequence, please see: [https://docs.sequence.build](https://docs.sequence.build) + +## Usage + +1. pnpm install +2. pnpm start +3. Open browser to http://localhost:4000 to access the demo dapp +4. Open browser inspector to see responses from the remote Sequence Wallet + +## Development + +See [src/App.tsx](./src/App.tsx) for the source +usage for a variety of functions. Be sure to open your browser's dev inspector to see output. +Think of these functions as a "cookbook" for how you can perform these functions in your dapps. + +Also note, sequence.js is built on top of ethers.js, and is API-compatible. + +## Screenshots + +**Opening wallet from dapp:** + +![Open Sequence Wallet From Dapp](./screenshots/screen-open.png) + + +**Send transaction from dapp:** + +Sequence Wallet is an Ethereum wallet supporting Ethereum mainnet, Polygon and more. Sequence will work +with any blockchain which is EVM compatible and supports Ethereum's node JSON-RPC interface. + +Here you can see in this screenshot the call to "Send DAI" from demo-dapp +(https://github.com/0xsequence/demo-dapp/blob/master/src/routes/HomeRoute.tsx#L420). This function demonstrates +how you can transfer an ERC-20 token like DAI on any Ethereum network. + +Notice how you can pay gas fees for a transaction in either MATIC token or USDC for price of $0.01. + +![Transfer ERC-20 token on Polygon](./screenshots/screen-txn.png) + + + +## LICENSE + +Apache 2.0 or MIT (your choice) diff --git a/.codesandbox/index.html b/.codesandbox/index.html new file mode 100644 index 000000000..7a355ef15 --- /dev/null +++ b/.codesandbox/index.html @@ -0,0 +1,35 @@ + + + + + + + + + + + + + Sequence | Demo Dapp + + + + +
+ + + diff --git a/.codesandbox/package.json b/.codesandbox/package.json new file mode 100644 index 000000000..438e0f488 --- /dev/null +++ b/.codesandbox/package.json @@ -0,0 +1,60 @@ +{ + "name": "demo-dapp", + "description": "Ethereum Demo Dapp built on Sequence stack", + "version": "0.1.0", + "private": true, + "homepage": "demo-dapp", + "scripts": { + "dev": "BROWSER=none pnpm start", + "start": "vite", + "build": "tsc && vite build", + "typecheck": "tsc --noEmit", + "serve": "vite preview", + "dist": "pnpm build", + "link-sequence": "pnpm run clear:vite:cache && ../sequence.js/scripts/pnpm-link.sh link", + "unlink-sequence": "pnpm run clear:vite:cache && ../sequence.js/scripts/pnpm-link.sh unlink", + "clear:vite:cache": "rimraf node_modules/.vite/" + }, + "dependencies": { + "0xsequence": "2.2.3", + "@0xsequence/abi": "2.2.13", + "@0xsequence/design-system": "^1.8.1", + "@0xsequence/ethauth": "^1.0.0", + "@0xsequence/network": "2.2.13", + "@0xsequence/provider": "2.2.13", + "@0xsequence/utils": "2.2.13", + "@types/node": "^20.11.30", + "@types/react": "^18.3.7", + "@types/react-dom": "^18.3.0", + "@vanilla-extract/css": "^1.14.1", + "ethers": "^6.13.4", + "framer-motion": "^9.0.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "typescript": "^4.5.5" + }, + "devDependencies": { + "@vanilla-extract/vite-plugin": "^4.0.6", + "@vitejs/plugin-react": "^4.2.1", + "vite": "^5.2.6", + "vite-plugin-svgr": "^4.2.0", + "vite-tsconfig-paths": "^4.3.2" + }, + "eslintConfig": { + "extends": [ + "react-app" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/.codesandbox/pnpm-lock.yaml b/.codesandbox/pnpm-lock.yaml new file mode 100644 index 000000000..14abf5d34 --- /dev/null +++ b/.codesandbox/pnpm-lock.yaml @@ -0,0 +1,4111 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + 0xsequence: + specifier: 2.2.3 + version: 2.2.3(ethers@6.13.4) + '@0xsequence/abi': + specifier: 2.2.13 + version: 2.2.13 + '@0xsequence/design-system': + specifier: ^1.8.1 + version: 1.8.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@0xsequence/ethauth': + specifier: ^1.0.0 + version: 1.0.0(ethers@6.13.4) + '@0xsequence/network': + specifier: 2.2.13 + version: 2.2.13(ethers@6.13.4) + '@0xsequence/provider': + specifier: 2.2.13 + version: 2.2.13(ethers@6.13.4) + '@0xsequence/utils': + specifier: 2.2.13 + version: 2.2.13(ethers@6.13.4) + '@types/node': + specifier: ^20.11.30 + version: 20.11.30 + '@types/react': + specifier: ^18.3.7 + version: 18.3.7 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@vanilla-extract/css': + specifier: ^1.14.1 + version: 1.14.1 + ethers: + specifier: ^6.13.4 + version: 6.13.4 + framer-motion: + specifier: ^9.0.1 + version: 9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + typescript: + specifier: ^4.5.5 + version: 4.5.5 + devDependencies: + '@vanilla-extract/vite-plugin': + specifier: ^4.0.6 + version: 4.0.6(@types/node@20.11.30)(vite@5.2.6(@types/node@20.11.30)) + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.2.1(vite@5.2.6(@types/node@20.11.30)) + vite: + specifier: ^5.2.6 + version: 5.2.6(@types/node@20.11.30) + vite-plugin-svgr: + specifier: ^4.2.0 + version: 4.2.0(rollup@4.21.3)(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30)) + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30)) + +packages: + + 0xsequence@2.2.3: + resolution: {integrity: sha512-1P/U1oEu51vCA6VgrzCt1pPjEx6iKd44NLLjHTEmmUxEKcesEFHtzhfA9H6tY/O2liqVT8SpS5NoHnQqtoyEAg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/abi@2.2.13': + resolution: {integrity: sha512-cZDR83SNxpXTD9vZoJAtmn6/YgvttN0gmeB8feQ5cpo8yd+AeJvQpUGMPR6Ud1MQGsvcPTLnTwKkL432Pc6UGQ==} + + '@0xsequence/abi@2.2.3': + resolution: {integrity: sha512-y0JxKXHKqkJh2i2d8F+Ql7P5jyGujJ2P28pN4YTcYacqmpDZqYi3d0Bf+uMgroWfncKBZDBETGxjWNvUYmhivg==} + + '@0xsequence/account@2.2.13': + resolution: {integrity: sha512-+kGyDsLEYOQUMhahtJps1N2j0jLXl0hAl2ilGA4NiALck7JP1Q/IO0RtkOlfSgjqFdyaipGvhYYyJuok2ARF5w==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/account@2.2.3': + resolution: {integrity: sha512-Q0czXuoNpwwECwMS4GGkmoh0xIEfQrATi5gcyLlhA5kDu4Idsws3dy95D4fkTXTY2kt7JUNuG79XEmq5L2GciQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/api@2.2.13': + resolution: {integrity: sha512-UmFMdLRCOfUGT2WqXzHE91sm+XU7eossdoKZ74W/F1ZTBU8XRa4DldQ0alKjff5x4Hxe/wIjppBPE9pQUzGYxA==} + + '@0xsequence/api@2.2.3': + resolution: {integrity: sha512-qwNcAWb4LbewZqn/39WHU/te1Wi+h7JJ2kuu9RRcV+rore3Z3zc7SqxHqtxoVMUOKlubmDEv/Y4BsL00m6XLmQ==} + + '@0xsequence/auth@2.2.13': + resolution: {integrity: sha512-3UQ6/zDhrNO5BVsgiLwCfQq4Nmbd1W0Ync/FNug8Yum1i9r2il54bUZRtauct6uMUaotAqNG4l/nzy105v93QQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/auth@2.2.3': + resolution: {integrity: sha512-Ct5ECn5qigaSMDZ6j9vvGX3eaeSO9P9bAoknImhFURH4dsC7Dz03Z3oYbP/78oKX2RqV3uu8c8NxAWzYjBLuNg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/core@2.2.13': + resolution: {integrity: sha512-tu6OEGbDLg1KfMb+YOn0Z5BsYbK3UFBjuPVHRx7SpmCsZPEApJqqRKHpTYah2T3bmYIJy9tRBtqstfTsniSgng==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/core@2.2.3': + resolution: {integrity: sha512-Bt2PsAIDSOjRx82uTqDYmOdin1DYVtwlt/TYb27Q/oNSY8MA1GG5NqEHefssi/ohXAsPRNeLMaspfmX0/BUTWw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/design-system@1.8.1': + resolution: {integrity: sha512-VsYBYR8d2UXnte5MvysyWtrdYpyvTYpQFbpNW8nOseAB6lWc8q9miTwYzeUy0fq90BQQ1YfE95EbJ4BjGTYInw==} + peerDependencies: + framer-motion: '>=6' + react: '>=17' + react-dom: '>=17' + + '@0xsequence/ethauth@1.0.0': + resolution: {integrity: sha512-piihXzbS8Sq7P670a+GyTm3igTJL3Ts6pqjJcC0Sv86yqeK6QD0pzJP4APP+/IQa5k+0s2l1SeZwMjR7gSPtCA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/guard@2.2.3': + resolution: {integrity: sha512-B9FRVJauAs/Asispe0p6wk3zAQubL9c6laC3xsCnFq3Qkv5t4VsGudTBe6ewx0xTeyQwEnVkneVgnUcnUP9xwA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/indexer@2.2.13': + resolution: {integrity: sha512-RFjjjckuAhM0vgYFO1RgYyBqsUrU54l2N/Isr5DPSLCCczp+qcopNuFMB0e0FuvzUP1buunxTjHRVjFH75kQEA==} + + '@0xsequence/indexer@2.2.3': + resolution: {integrity: sha512-bt74b5+SV5aGM+ZZfUmSU7rkttmc8I7OsQovQZBDw5YRVWPVEeVPZeX4ws4bZwiuYifD954A2Z/2MX1brH76Sw==} + + '@0xsequence/metadata@2.2.13': + resolution: {integrity: sha512-RpkIXSYKEt/W6zCoY99Q44OMjjLf//Pi8yImitXNh8IqTZqio54L9Xo4L+5ryz6rjPmaY3Mce1J1D5YJam0h4g==} + + '@0xsequence/metadata@2.2.3': + resolution: {integrity: sha512-Y7/Prw0CVxTuw59B0DnE0WnjbhJaPATibThWb13Y6W99M4NvQi5NlfS2KagfsMo5MHb5iFRjJHrCFovbv+MiuA==} + + '@0xsequence/migration@2.2.13': + resolution: {integrity: sha512-YcdjW7BRrQiOvhmSuvTM3GqklZVfO3dpbwSNqT0bMqwx/9YzE0CsVZVSMYrqVq5njyNFZjs42zazLdcrqqA2Ag==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/migration@2.2.3': + resolution: {integrity: sha512-Q1+YePKzfPnCF9Rk0Tc9EqYtD1BdLym8ZEjco6b5BtyAGyIF7UefWql57IVEXBB/H1DtF+M7JHoZusvmS6atTw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/network@2.2.13': + resolution: {integrity: sha512-U8sVC2nWokPtQzIXwNKOP/mgkkuvjxYmQrgITkc8YDTAQOYPu6n/4lIqQ2//jjSfloniMK00tDpfUd5fCFbsUA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/network@2.2.3': + resolution: {integrity: sha512-oOw4oB/Y6EqTvFHYzMX9bjpizj8DQxkUGdQLBcs3R1ZLipbbwhMKWfBf9BoXAl1YUthyFKI5rl9v0MJMxaq3Bg==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/provider@2.2.13': + resolution: {integrity: sha512-p5DlA2eHWhgfyCK7JQL3k7qT+aNiNxFkiAMbO2Q/eRnBnmrKcN0dK9HjuK1lWvWH3eZniEgK/M9Kec6nfixbcw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/provider@2.2.3': + resolution: {integrity: sha512-QxHBbgLGGpVsnEiFI5uvpuEUdl7JfxQ/i2T28aUK4vtUtiYLTiOnNwQy9RiK/bGPtqx9vh3Xh05G8c1KKWRqyw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/relayer@2.2.13': + resolution: {integrity: sha512-fnt4AJ1u9CPwx7JJwpZ7UbJ3eN2LOG0Wuwe4FS9OSfxCOhbokELRSWegToEyH6ew6FRPvsuRMN/im3Bu3Og0QQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/relayer@2.2.3': + resolution: {integrity: sha512-baFGhIQIXhYcRNWV2mzFss+EXYkSlsnMI0+G3ZOUAfTkPR5Tv8iL/srvM0d+/ByhCsGwe8fqNfEbFTGIDOVviA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/replacer@2.2.13': + resolution: {integrity: sha512-+cTsda4HKzLpCzERrcPSEn5ei/lj4vPIs6kAS9aqO1XOWqeyslPWcPbfMgMbMbn+/vmbnVuqUXDOgRZqkZ2FEA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/replacer@2.2.3': + resolution: {integrity: sha512-onYf/GjYUkah1GTqimBliQQzCF9ksfb53ugJKibN1Q1uT2mKJvO1NMxXviuduXan2A+Rdr8/tTkfZwMnbVoX+A==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/sessions@2.2.13': + resolution: {integrity: sha512-duClp86VeyaMuyKItByK2rIbsDQHDiMP22yLQeCN+Si+bk0T7Jta9rHP+PoAOncKpbRDJZSqSX1hmzYgB4LD5g==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/sessions@2.2.3': + resolution: {integrity: sha512-MJgOZkG3fZFc0sidYY1OzFGte2HVRjmkrxDukuwlEsxvN2M+HikgrpFwVcG5u1n2uiJGA0Uzq85UL7jvF5QozQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/signhub@2.2.13': + resolution: {integrity: sha512-yCo3l3a4nYNy5LOxcH4xEoGmQqMfWq9BxkUF+Y8xDd001L7cynaGzAS7s+5Fs4B+HD9obC7NxwSOeoJ6qqk4xw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/signhub@2.2.3': + resolution: {integrity: sha512-Gk0DitT/Su+gMDAa/r6mNOBX+RcWQfd75CnuOmJxBZT/jH6uxrbtlz/DDTR/P1gjf1EyYJ7NjibszMvr9sawzA==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/utils@2.2.13': + resolution: {integrity: sha512-V4uip1fCZAzp5O2S+nkKnwrqmzzC7em1Mc4HJvUX+fqT0jzw20BZt0CNlX34DgW6E6MzBvWnrX+DTfz/+alBWQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/utils@2.2.3': + resolution: {integrity: sha512-2F9dMqlgsoPdXk8xfOc7VuTrEtsNukadI5HSUYpLF+J1HZBamkCa/shgiHoKIZULiDt+scZ/3amVXvQUk0Zj1w==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/wallet@2.2.13': + resolution: {integrity: sha512-lCD+Z6E4bpZCkwAttFy4P1iAM1ZkaiN9zo8dw4+unSVqzVslPPKoWNCX+b16Qg1pZEqe0yPjbqqon0eH/iHGyw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/wallet@2.2.3': + resolution: {integrity: sha512-lS/eVCQtjm4TAL4Xc+Hec7YZAoAZJ5XLRd3eo7oV8Seakwa2GagT3MeGnpMgRUTpySf4i9k3iDcL6fkpxWVvMg==} + peerDependencies: + ethers: '>=6' + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.23.5': + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.23.7': + resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.3': + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.23.6': + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.1': + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.0': + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.22.5': + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.5': + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.23.8': + resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.1': + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.23.6': + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.24.1': + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-typescript@7.24.1': + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.23.3': + resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.23.3': + resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.24.1': + resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.22.15': + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.7': + resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.1': + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.22.5': + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.23.6': + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@databeat/tracker@0.9.3': + resolution: {integrity: sha512-eGsiNU/CRFujcNtUUqvBiqveCs6S6SiAhalXPDodbk74d3FzvLqHDn5k6WfOEJIhrP3CbYgfMXL0nk51s/rQsg==} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.6.0': + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + + '@floating-ui/dom@1.6.3': + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + + '@floating-ui/react-dom@2.0.8': + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.1': + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.0': + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.14': + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.18': + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + + '@jridgewell/trace-mapping@0.3.21': + resolution: {integrity: sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@motionone/animation@10.15.1': + resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==} + + '@motionone/dom@10.16.2': + resolution: {integrity: sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==} + + '@motionone/easing@10.15.1': + resolution: {integrity: sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==} + + '@motionone/generators@10.15.1': + resolution: {integrity: sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==} + + '@motionone/types@10.15.1': + resolution: {integrity: sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==} + + '@motionone/utils@10.15.1': + resolution: {integrity: sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} + engines: {node: ^14.21.3 || >=16} + + '@radix-ui/number@1.1.0': + resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + + '@radix-ui/primitive@1.1.0': + resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.0': + resolution: {integrity: sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.1.1': + resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.0': + resolution: {integrity: sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.0': + resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.0': + resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.1': + resolution: {integrity: sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.0': + resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.1': + resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.0': + resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.0': + resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.1': + resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.1': + resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.0': + resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.0': + resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.0': + resolution: {integrity: sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.2.0': + resolution: {integrity: sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.1.1': + resolution: {integrity: sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.1.0': + resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.1.0': + resolution: {integrity: sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.0': + resolution: {integrity: sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toast@1.2.1': + resolution: {integrity: sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.1.2': + resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.0': + resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.13.1': + resolution: {integrity: sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.21.3': + resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.13.1': + resolution: {integrity: sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.21.3': + resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.13.1': + resolution: {integrity: sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.21.3': + resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.13.1': + resolution: {integrity: sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.21.3': + resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.13.1': + resolution: {integrity: sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.13.1': + resolution: {integrity: sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.21.3': + resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.13.1': + resolution: {integrity: sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.21.3': + resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.13.1': + resolution: {integrity: sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.13.1': + resolution: {integrity: sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.3': + resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.13.1': + resolution: {integrity: sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.3': + resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.13.1': + resolution: {integrity: sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.21.3': + resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.13.1': + resolution: {integrity: sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.21.3': + resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.13.1': + resolution: {integrity: sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.3': + resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.13.1': + resolution: {integrity: sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.21.3': + resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} + cpu: [x64] + os: [win32] + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': + resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': + resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0': + resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0': + resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0': + resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@8.0.0': + resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@8.1.0': + resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@8.1.0': + resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} + engines: {node: '>=14'} + + '@svgr/hast-util-to-babel-ast@8.0.0': + resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} + engines: {node: '>=14'} + + '@svgr/plugin-jsx@8.1.0': + resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} + engines: {node: '>=14'} + peerDependencies: + '@svgr/core': '*' + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/node@20.11.30': + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.7': + resolution: {integrity: sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==} + + '@vanilla-extract/babel-plugin-debug-ids@1.0.5': + resolution: {integrity: sha512-Rc9A6ylsw7EBErmpgqCMvc/Z/eEZxI5k1xfLQHw7f5HHh3oc5YfzsAsYU/PdmSNjF1dp3sGEViBdDltvwnfVaA==} + + '@vanilla-extract/css@1.14.1': + resolution: {integrity: sha512-V4JUuHNjZgl64NGfkDJePqizkNgiSpphODtZEs4cCPuxLAzwOUJYATGpejwimJr1n529kq4DEKWexW22LMBokw==} + + '@vanilla-extract/integration@7.1.1': + resolution: {integrity: sha512-2JjDKL2HDTazis4oTkUFsQFUyw61k8oym9r0NOLSJC0JB0W25W1ryVZvDx74d3deIyB5AWbCselyzl3gja30kQ==} + + '@vanilla-extract/private@1.0.3': + resolution: {integrity: sha512-17kVyLq3ePTKOkveHxXuIJZtGYs+cSoev7BlP+Lf4916qfDhk/HBjvlYDe8egrea7LNPHKwSZJK/bzZC+Q6AwQ==} + + '@vanilla-extract/vite-plugin@4.0.6': + resolution: {integrity: sha512-uT2AhzxEC8qdn7SFxD/MHF7pxyFMb2e7HY3+isyPDzkTyIdiA/ZXk7qwWhcigFMNCJ6YuyxFQJmiDhP9U9oOmg==} + peerDependencies: + vite: ^4.0.3 || ^5.0.0 + + '@vitejs/plugin-react@4.2.1': + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + + browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001579: + resolution: {integrity: sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + electron-to-chromium@1.4.638: + resolution: {integrity: sha512-gpmbAG2LbfPKcDaL5m9IKutKjUx4ZRkvGNkgL/8nKqxkXsBVYykVULboWlqCrHsh3razucgDJDuKoWJmGPdItA==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + ethers@6.13.4: + resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} + engines: {node: '>=14.0.0'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + framer-motion@9.0.1: + resolution: {integrity: sha512-0EP7+b/hnsbrFOum9zU+23Fq2cJJrLOqv/yJ26fIzK4CC33ZAjXZGi1/XyblbgnUF0cxZ/SEDj5IYHeQo42qNg==} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + + mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + + modern-ahocorasick@1.0.1: + resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-hook-form@7.53.0: + resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.6: + resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.5.7: + resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.1: + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + rollup@4.13.1: + resolution: {integrity: sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.21.3: + resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + tsconfck@3.0.3: + resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + typescript@4.5.5: + resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} + engines: {node: '>=4.2.0'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-callback-ref@1.3.2: + resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.2: + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + vite-node@1.4.0: + resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-svgr@4.2.0: + resolution: {integrity: sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA==} + peerDependencies: + vite: ^2.6.0 || 3 || 4 || 5 + + vite-tsconfig-paths@4.3.2: + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@5.2.6: + resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + 0xsequence@2.2.3(ethers@6.13.4): + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/account': 2.2.3(ethers@6.13.4) + '@0xsequence/api': 2.2.3 + '@0xsequence/auth': 2.2.3(ethers@6.13.4) + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/guard': 2.2.3(ethers@6.13.4) + '@0xsequence/indexer': 2.2.3 + '@0xsequence/metadata': 2.2.3 + '@0xsequence/migration': 2.2.3(ethers@6.13.4) + '@0xsequence/network': 2.2.3(ethers@6.13.4) + '@0xsequence/provider': 2.2.3(ethers@6.13.4) + '@0xsequence/relayer': 2.2.3(ethers@6.13.4) + '@0xsequence/sessions': 2.2.3(ethers@6.13.4) + '@0xsequence/signhub': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + '@0xsequence/wallet': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/abi@2.2.13': {} + + '@0xsequence/abi@2.2.3': {} + + '@0xsequence/account@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.13 + '@0xsequence/core': 2.2.13(ethers@6.13.4) + '@0xsequence/migration': 2.2.13(ethers@6.13.4) + '@0xsequence/network': 2.2.13(ethers@6.13.4) + '@0xsequence/relayer': 2.2.13(ethers@6.13.4) + '@0xsequence/sessions': 2.2.13(ethers@6.13.4) + '@0xsequence/utils': 2.2.13(ethers@6.13.4) + '@0xsequence/wallet': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/account@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/migration': 2.2.3(ethers@6.13.4) + '@0xsequence/network': 2.2.3(ethers@6.13.4) + '@0xsequence/relayer': 2.2.3(ethers@6.13.4) + '@0xsequence/sessions': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + '@0xsequence/wallet': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/api@2.2.13': {} + + '@0xsequence/api@2.2.3': {} + + '@0xsequence/auth@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.13 + '@0xsequence/account': 2.2.13(ethers@6.13.4) + '@0xsequence/api': 2.2.13 + '@0xsequence/core': 2.2.13(ethers@6.13.4) + '@0xsequence/ethauth': 1.0.0(ethers@6.13.4) + '@0xsequence/indexer': 2.2.13 + '@0xsequence/metadata': 2.2.13 + '@0xsequence/migration': 2.2.13(ethers@6.13.4) + '@0xsequence/network': 2.2.13(ethers@6.13.4) + '@0xsequence/sessions': 2.2.13(ethers@6.13.4) + '@0xsequence/signhub': 2.2.13(ethers@6.13.4) + '@0xsequence/utils': 2.2.13(ethers@6.13.4) + '@0xsequence/wallet': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/auth@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/account': 2.2.3(ethers@6.13.4) + '@0xsequence/api': 2.2.3 + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/ethauth': 1.0.0(ethers@6.13.4) + '@0xsequence/indexer': 2.2.3 + '@0xsequence/metadata': 2.2.3 + '@0xsequence/migration': 2.2.3(ethers@6.13.4) + '@0xsequence/network': 2.2.3(ethers@6.13.4) + '@0xsequence/sessions': 2.2.3(ethers@6.13.4) + '@0xsequence/signhub': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + '@0xsequence/wallet': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/core@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.13 + '@0xsequence/utils': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/core@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/design-system@1.8.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-aspect-ratio': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collapsible': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-progress': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-radio-group': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-switch': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tabs': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toast': 1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + framer-motion: 9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-hook-form: 7.53.0(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + + '@0xsequence/ethauth@1.0.0(ethers@6.13.4)': + dependencies: + ethers: 6.13.4 + js-base64: 3.7.7 + + '@0xsequence/guard@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/account': 2.2.3(ethers@6.13.4) + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/signhub': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/indexer@2.2.13': {} + + '@0xsequence/indexer@2.2.3': {} + + '@0xsequence/metadata@2.2.13': {} + + '@0xsequence/metadata@2.2.3': {} + + '@0xsequence/migration@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.13 + '@0xsequence/core': 2.2.13(ethers@6.13.4) + '@0xsequence/wallet': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/migration@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/wallet': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/network@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/core': 2.2.13(ethers@6.13.4) + '@0xsequence/indexer': 2.2.13 + '@0xsequence/relayer': 2.2.13(ethers@6.13.4) + '@0xsequence/utils': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/network@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/indexer': 2.2.3 + '@0xsequence/relayer': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/provider@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.13 + '@0xsequence/account': 2.2.13(ethers@6.13.4) + '@0xsequence/auth': 2.2.13(ethers@6.13.4) + '@0xsequence/core': 2.2.13(ethers@6.13.4) + '@0xsequence/migration': 2.2.13(ethers@6.13.4) + '@0xsequence/network': 2.2.13(ethers@6.13.4) + '@0xsequence/relayer': 2.2.13(ethers@6.13.4) + '@0xsequence/utils': 2.2.13(ethers@6.13.4) + '@0xsequence/wallet': 2.2.13(ethers@6.13.4) + '@databeat/tracker': 0.9.3 + ethers: 6.13.4 + eventemitter2: 6.4.9 + webextension-polyfill: 0.10.0 + + '@0xsequence/provider@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/account': 2.2.3(ethers@6.13.4) + '@0xsequence/auth': 2.2.3(ethers@6.13.4) + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/migration': 2.2.3(ethers@6.13.4) + '@0xsequence/network': 2.2.3(ethers@6.13.4) + '@0xsequence/relayer': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + '@0xsequence/wallet': 2.2.3(ethers@6.13.4) + '@databeat/tracker': 0.9.3 + ethers: 6.13.4 + eventemitter2: 6.4.9 + webextension-polyfill: 0.10.0 + + '@0xsequence/relayer@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.13 + '@0xsequence/core': 2.2.13(ethers@6.13.4) + '@0xsequence/utils': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/relayer@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/replacer@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.13 + '@0xsequence/core': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/replacer@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/core': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/sessions@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/core': 2.2.13(ethers@6.13.4) + '@0xsequence/migration': 2.2.13(ethers@6.13.4) + '@0xsequence/replacer': 2.2.13(ethers@6.13.4) + '@0xsequence/utils': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + idb: 7.1.1 + + '@0xsequence/sessions@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/migration': 2.2.3(ethers@6.13.4) + '@0xsequence/replacer': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + idb: 7.1.1 + + '@0xsequence/signhub@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/core': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/signhub@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/core': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/utils@2.2.13(ethers@6.13.4)': + dependencies: + ethers: 6.13.4 + js-base64: 3.7.7 + + '@0xsequence/utils@2.2.3(ethers@6.13.4)': + dependencies: + ethers: 6.13.4 + js-base64: 3.7.7 + + '@0xsequence/wallet@2.2.13(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.13 + '@0xsequence/core': 2.2.13(ethers@6.13.4) + '@0xsequence/network': 2.2.13(ethers@6.13.4) + '@0xsequence/relayer': 2.2.13(ethers@6.13.4) + '@0xsequence/signhub': 2.2.13(ethers@6.13.4) + '@0xsequence/utils': 2.2.13(ethers@6.13.4) + ethers: 6.13.4 + + '@0xsequence/wallet@2.2.3(ethers@6.13.4)': + dependencies: + '@0xsequence/abi': 2.2.3 + '@0xsequence/core': 2.2.3(ethers@6.13.4) + '@0xsequence/network': 2.2.3(ethers@6.13.4) + '@0xsequence/relayer': 2.2.3(ethers@6.13.4) + '@0xsequence/signhub': 2.2.3(ethers@6.13.4) + '@0xsequence/utils': 2.2.3(ethers@6.13.4) + ethers: 6.13.4 + + '@adraffy/ens-normalize@1.10.1': {} + + '@ampproject/remapping@2.2.1': + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.23.5': + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + '@babel/compat-data@7.23.5': {} + + '@babel/core@7.23.7': + dependencies: + '@ampproject/remapping': 2.2.1 + '@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/core@7.23.7) + '@babel/helpers': 7.23.8 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.24.3': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.23.6': + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.21 + jsesc: 2.5.2 + + '@babel/generator@7.24.1': + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-compilation-targets@7.23.6': + 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': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-module-imports@7.22.15': + dependencies: + '@babel/types': 7.23.6 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + '@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-module-transforms@7.23.3(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@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.22.5': {} + + '@babel/helper-plugin-utils@7.24.0': {} + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.22.5 + + '@babel/helper-string-parser@7.22.5': {} + + '@babel/helper-string-parser@7.23.4': {} + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-identifier@7.22.5': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.23.8': + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.7 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.24.1': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.23.4': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/highlight@7.24.2': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.23.6': + dependencies: + '@babel/types': 7.23.6 + + '@babel/parser@7.24.1': + dependencies: + '@babel/types': 7.24.0 + + '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.3)': + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + '@babel/helper-plugin-utils': 7.22.5 + + '@babel/runtime@7.24.1': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.22.15': + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + + '@babel/traverse@7.23.7': + 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.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.24.1': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.22.5': + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + '@babel/types@7.23.6': + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@databeat/tracker@0.9.3': + dependencies: + '@noble/hashes': 1.6.1 + + '@emotion/hash@0.9.1': {} + + '@emotion/is-prop-valid@0.8.8': + dependencies: + '@emotion/memoize': 0.7.4 + optional: true + + '@emotion/memoize@0.7.4': + optional: true + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@floating-ui/core@1.6.0': + dependencies: + '@floating-ui/utils': 0.2.1 + + '@floating-ui/dom@1.6.3': + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + + '@floating-ui/react-dom@2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.1': {} + + '@jridgewell/gen-mapping@0.3.3': + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.0': {} + + '@jridgewell/resolve-uri@3.1.1': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.14': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.18': + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + + '@jridgewell/trace-mapping@0.3.21': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@motionone/animation@10.15.1': + dependencies: + '@motionone/easing': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.6.2 + + '@motionone/dom@10.16.2': + dependencies: + '@motionone/animation': 10.15.1 + '@motionone/generators': 10.15.1 + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.6.2 + + '@motionone/easing@10.15.1': + dependencies: + '@motionone/utils': 10.15.1 + tslib: 2.6.2 + + '@motionone/generators@10.15.1': + dependencies: + '@motionone/types': 10.15.1 + '@motionone/utils': 10.15.1 + tslib: 2.6.2 + + '@motionone/types@10.15.1': {} + + '@motionone/utils@10.15.1': + dependencies: + '@motionone/types': 10.15.1 + hey-listen: 1.0.8 + tslib: 2.6.2 + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.6.1': {} + + '@radix-ui/number@1.1.0': {} + + '@radix-ui/primitive@1.1.0': {} + + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-aspect-ratio@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-collapsible@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-context@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-dialog@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-id@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.0.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-progress@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-radio-group@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-select@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.0 + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.7)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-slot@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-switch@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-tabs@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-toast@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.7)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.7 + + '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + '@types/react-dom': 18.3.0 + + '@radix-ui/rect@1.1.0': {} + + '@rollup/pluginutils@5.1.0(rollup@4.21.3)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.3 + + '@rollup/rollup-android-arm-eabi@4.13.1': + optional: true + + '@rollup/rollup-android-arm-eabi@4.21.3': + optional: true + + '@rollup/rollup-android-arm64@4.13.1': + optional: true + + '@rollup/rollup-android-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.13.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.3': + optional: true + + '@rollup/rollup-darwin-x64@4.13.1': + optional: true + + '@rollup/rollup-darwin-x64@4.21.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.13.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.13.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.13.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.3': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.13.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.13.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.13.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.13.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.13.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.13.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.13.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.3': + optional: true + + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + + '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + + '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + + '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + + '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + + '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + + '@svgr/babel-preset@8.1.0(@babel/core@7.23.7)': + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.23.7) + '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.23.7) + '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.23.7) + + '@svgr/core@8.1.0(typescript@4.5.5)': + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.23.7) + camelcase: 6.3.0 + cosmiconfig: 8.3.6(typescript@4.5.5) + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + - typescript + + '@svgr/hast-util-to-babel-ast@8.0.0': + dependencies: + '@babel/types': 7.23.6 + entities: 4.5.0 + + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@4.5.5))': + dependencies: + '@babel/core': 7.23.7 + '@svgr/babel-preset': 8.1.0(@babel/core@7.23.7) + '@svgr/core': 8.1.0(typescript@4.5.5) + '@svgr/hast-util-to-babel-ast': 8.0.0 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.23.6 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + + '@types/babel__traverse@7.20.5': + dependencies: + '@babel/types': 7.23.6 + + '@types/estree@1.0.5': {} + + '@types/node@20.11.30': + dependencies: + undici-types: 5.26.5 + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + '@types/prop-types@15.7.13': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.7 + + '@types/react@18.3.7': + dependencies: + '@types/prop-types': 15.7.13 + csstype: 3.1.3 + + '@vanilla-extract/babel-plugin-debug-ids@1.0.5': + dependencies: + '@babel/core': 7.24.3 + transitivePeerDependencies: + - supports-color + + '@vanilla-extract/css@1.14.1': + dependencies: + '@emotion/hash': 0.9.1 + '@vanilla-extract/private': 1.0.3 + chalk: 4.1.2 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.3 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.0.1 + outdent: 0.8.0 + + '@vanilla-extract/integration@7.1.1(@types/node@20.11.30)': + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.3) + '@vanilla-extract/babel-plugin-debug-ids': 1.0.5 + '@vanilla-extract/css': 1.14.1 + esbuild: 0.19.12 + eval: 0.1.8 + find-up: 5.0.0 + javascript-stringify: 2.1.0 + lodash: 4.17.21 + mlly: 1.6.1 + outdent: 0.8.0 + vite: 5.2.6(@types/node@20.11.30) + vite-node: 1.4.0(@types/node@20.11.30) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + '@vanilla-extract/private@1.0.3': {} + + '@vanilla-extract/vite-plugin@4.0.6(@types/node@20.11.30)(vite@5.2.6(@types/node@20.11.30))': + dependencies: + '@vanilla-extract/integration': 7.1.1(@types/node@20.11.30) + vite: 5.2.6(@types/node@20.11.30) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + '@vitejs/plugin-react@4.2.1(vite@5.2.6(@types/node@20.11.30))': + dependencies: + '@babel/core': 7.23.7 + '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.7) + '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.7) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 5.2.6(@types/node@20.11.30) + transitivePeerDependencies: + - supports-color + + acorn@8.11.3: {} + + aes-js@4.0.0-beta.5: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.6.2 + + browserslist@4.22.2: + dependencies: + caniuse-lite: 1.0.30001579 + electron-to-chromium: 1.4.638 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.2) + + cac@6.7.14: {} + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001579: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + convert-source-map@2.0.0: {} + + cosmiconfig@8.3.6(typescript@4.5.5): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 4.5.5 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + detect-node-es@1.1.0: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + electron-to-chromium@1.4.638: {} + + entities@4.5.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + esbuild@0.19.12: + 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 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.1: {} + + escape-string-regexp@1.0.5: {} + + estree-walker@2.0.2: {} + + ethers@6.13.4: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + eval@0.1.8: + dependencies: + '@types/node': 20.11.30 + require-like: 0.1.2 + + eventemitter2@6.4.9: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + framer-motion@9.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@motionone/dom': 10.16.2 + hey-listen: 1.0.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-nonce@1.0.1: {} + + globals@11.12.0: {} + + globrex@0.1.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + hey-listen@1.0.8: {} + + idb@7.1.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + is-arrayish@0.2.1: {} + + javascript-stringify@2.1.0: {} + + js-base64@3.7.7: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json5@2.2.3: {} + + jsonc-parser@3.2.1: {} + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case@2.0.2: + dependencies: + tslib: 2.6.2 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.24.1 + + mlly@1.6.1: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 + + modern-ahocorasick@1.0.1: {} + + ms@2.1.2: {} + + nanoid@3.3.7: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + + node-releases@2.0.14: {} + + outdent@0.8.0: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@4.0.0: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pkg-types@1.0.3: + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-hook-form@7.53.0(react@18.3.1): + dependencies: + react: 18.3.1 + + react-refresh@0.14.0: {} + + react-remove-scroll-bar@2.3.6(@types/react@18.3.7)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.7 + + react-remove-scroll@2.5.7(@types/react@18.3.7)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.6(@types/react@18.3.7)(react@18.3.1) + react-style-singleton: 2.2.1(@types/react@18.3.7)(react@18.3.1) + tslib: 2.6.2 + use-callback-ref: 1.3.2(@types/react@18.3.7)(react@18.3.1) + use-sidecar: 1.1.2(@types/react@18.3.7)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.7 + + react-style-singleton@2.2.1(@types/react@18.3.7)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.3.1 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.7 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + regenerator-runtime@0.14.1: {} + + require-like@0.1.2: {} + + resolve-from@4.0.0: {} + + rollup@4.13.1: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.13.1 + '@rollup/rollup-android-arm64': 4.13.1 + '@rollup/rollup-darwin-arm64': 4.13.1 + '@rollup/rollup-darwin-x64': 4.13.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.1 + '@rollup/rollup-linux-arm64-gnu': 4.13.1 + '@rollup/rollup-linux-arm64-musl': 4.13.1 + '@rollup/rollup-linux-riscv64-gnu': 4.13.1 + '@rollup/rollup-linux-s390x-gnu': 4.13.1 + '@rollup/rollup-linux-x64-gnu': 4.13.1 + '@rollup/rollup-linux-x64-musl': 4.13.1 + '@rollup/rollup-win32-arm64-msvc': 4.13.1 + '@rollup/rollup-win32-ia32-msvc': 4.13.1 + '@rollup/rollup-win32-x64-msvc': 4.13.1 + fsevents: 2.3.3 + + rollup@4.21.3: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.3 + '@rollup/rollup-android-arm64': 4.21.3 + '@rollup/rollup-darwin-arm64': 4.21.3 + '@rollup/rollup-darwin-x64': 4.21.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 + '@rollup/rollup-linux-arm-musleabihf': 4.21.3 + '@rollup/rollup-linux-arm64-gnu': 4.21.3 + '@rollup/rollup-linux-arm64-musl': 4.21.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 + '@rollup/rollup-linux-riscv64-gnu': 4.21.3 + '@rollup/rollup-linux-s390x-gnu': 4.21.3 + '@rollup/rollup-linux-x64-gnu': 4.21.3 + '@rollup/rollup-linux-x64-musl': 4.21.3 + '@rollup/rollup-win32-arm64-msvc': 4.21.3 + '@rollup/rollup-win32-ia32-msvc': 4.21.3 + '@rollup/rollup-win32-x64-msvc': 4.21.3 + fsevents: 2.3.3 + optional: true + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@6.3.1: {} + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + source-map-js@1.2.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + svg-parser@2.0.4: {} + + to-fast-properties@2.0.0: {} + + tsconfck@3.0.3(typescript@4.5.5): + optionalDependencies: + typescript: 4.5.5 + + tslib@2.6.1: {} + + tslib@2.6.2: {} + + tslib@2.7.0: {} + + typescript@4.5.5: {} + + ufo@1.5.3: {} + + undici-types@5.26.5: {} + + undici-types@6.19.8: {} + + update-browserslist-db@1.0.13(browserslist@4.22.2): + dependencies: + browserslist: 4.22.2 + escalade: 3.1.1 + picocolors: 1.0.0 + + use-callback-ref@1.3.2(@types/react@18.3.7)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.7 + + use-sidecar@1.1.2(@types/react@18.3.7)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.6.2 + optionalDependencies: + '@types/react': 18.3.7 + + vite-node@1.4.0(@types/node@20.11.30): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.6(@types/node@20.11.30) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-plugin-svgr@4.2.0(rollup@4.21.3)(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30)): + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.3) + '@svgr/core': 8.1.0(typescript@4.5.5) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@4.5.5)) + vite: 5.2.6(@types/node@20.11.30) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + + vite-tsconfig-paths@4.3.2(typescript@4.5.5)(vite@5.2.6(@types/node@20.11.30)): + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 3.0.3(typescript@4.5.5) + optionalDependencies: + vite: 5.2.6(@types/node@20.11.30) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.2.6(@types/node@20.11.30): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.13.1 + optionalDependencies: + '@types/node': 20.11.30 + fsevents: 2.3.3 + + webextension-polyfill@0.10.0: {} + + ws@8.17.1: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/.codesandbox/public/favicon.ico b/.codesandbox/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bf5da566d2f6c1f4708991ea19e967b9c80182d9 GIT binary patch literal 1068 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

Z~ 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 O0000fcioJ literal 0 HcmV?d00001 diff --git a/.codesandbox/public/logo512.png b/.codesandbox/public/logo512.png new file mode 100644 index 0000000000000000000000000000000000000000..36aff8456a17628959dc6d762518aa6b8c101e85 GIT binary patch literal 159929 zcmW(+d0b5E|9{SzGc#wlnwh3OnyH~8Nm7%jGb1WX=2}t|QzR}jEvhfknQ2khxeB2& z?zLo}D_3Lfl;wt`O9;_K6r!;wEx*U_k7<3qX3ja!=lOiz+f%5F2<5RI*Z=@tcv#3R z08scN3UCJe_9e5a7k)!hXN4+|$2UE*;V&$8Sad1?Hp70sknmYjGeFe~!$ahAGD{C$ zep7vN-rQH&gGhK%(z*}l@0@>seuj4Rv8Mf-Y}{S$jo6xoqFVPFJ$VmXez54z!Zbu- zduZe|eTc)M-;}rS^)5d;xBB~v*UpbSs=j|d5%8#Fal=35>t~IAn7AK%9_+e!+s7fH z-}Xma9R7a$=DNuBcXxdq`F`TY=c)cPU$=Jb%vtfSb;aGB?<4oQeXY9EaeDB_k9V!M zC$bkQ4`;0T{Im8)?8()=Kj-M zHQ4v|&dB$dmwrAtaH@61?V9Jk8QuSU?f=l*+J9<#^|uYHKQGyEdck1-`2N`HNADI4 zUi4qNP}7>Cj{E%FII!;Xhn;V_Io}&rch7j2z2Sb}@$8x1-ydZUZrIbh@9W9IXAAsJ zHwOk!+>_mUZ06xs&gun&Nza`-SMM2oeyQqq&H1X`UvsKk{~l-F{BL3^Hm=^mcrG`lG2Y;@!`) zSA44PhJCu#7c}zg&YaorGJ53!vahDz@7u3G_gJ5OW}qW@Pxkxu7SB7{)=RDwEplhN zRl5(YKYDrgU_$@9=e>i2M|>_@-5<$x8#q3_yZ!a|yJq;Aw|gHB_E{HpAO9RU@E}Fq zSH0?aZ+GzSZ=1VUeC?myvA*oN|C7LT|7$I6{dlLlYRC88Uj~j{4jee<x}+~ z)%&WquTSjvzqGhDcJRf|^6XIm?$d4kyy_J7m!Ds|yQ?yOet$GLzSx4#>F@7&S)raSx3@4;{StG^7KzZ|-91HA6d-Ptui zAN79e&d&MXJ z?zo=|F&&SgBi_}$cSq-ZfA{_S&{MtS5QS}TQ$2Gk_=f7cVHWvXfMuie@M-I%JOgTPs zet)NRb#XLS!8c|MJgA0UG_xIeb{(5!r+`U|K-Mj7Ir-)<% z9S-__#`ZmQZr|!&p-}bqRIeN8+5a@Fr`2@^wsOM^e9mv?h1S?1mgf5%=fP*+|JgqH z;pgW54;xeiJ$GG*;R1DJa9>YQ*y{ea;MuKG>==+OR_Le4tLEiVpHk{Z+2mx0{0IRvD;v z86qJpV>P{PiT_jEB*F7>SBlg`o6Dw9K{cKx@!VHAH3y?tdKp9-h~>=y1pi!@$?1c`yW<@ zWae~C)Xg9{>KhZ+pr$>1{%Fjvf!qYFQ8AhxB=6R^V|#HR=R0X$#3Jdmppgx%k`2yV z;wg-BwiTjMv|iwTheymK>0}}K;u^^&tsbysZBCk5dBk#sSb%&O7D1%aQUvN3D+=vY zwki|DX|`PNJQ#vG%?tq-kbjTyWekPN6)kl&m@qxx_?H_d^cP#9A6^btiGfe3N{+Wo zQJDOM*fbZDK#C3hcy}Q_9X0I_bTP%THKBd0h2YU6xQIb(Xx~1r!fGnv@&s`(fBl9Y z|3pp4o8`pe?Snx^ozb^9m>1%&>i=WIa%-g8E8W3V zNu9wfx~+SzIccV?6;>!rpKkCf0olUVzgO=J!HeCoQrx}L)mwsyr#b|Uq!j0$)htG4AV`Cr-pI}3acOJOY{c2w181vM6=83_H7eMu77yZD( zCI0$Nn$4LuVR@h(TS&72I5Lq_?;^gV8<1}c^2nu_pTcyhjBaj=rn38BCmx6tn1|LeJ7**2@)014s~%33 zk}q1waI866ud`Fil`Y{aS4IQL_m-R6;vbXGnpjjNfe45QD&7yknxhTnXWOV<^g3Xg zKx_~y1-deN#2(zP9hEuiUeT^}#%g9u(Re>`1}!2z0(Gk{m7#L1{s`Q_m3Hn=%jhwF zdS50v8I;j|{8gX-3m({QIS%=?opY%#A3L(ZX7X#`rUq(}TRccbE>}{PeHVvJhAT5I ziRyGBlZctviPrb+Xp2Sm#g$a`gr;DgfnOJ+$=;uxjhB+nv*bE9=>NHAz*ldtdAG-v zlE~BP{LovV+d)@(A?d;D_(@5b|sh*o5HB@rh(5EHo) z_kLs!R$qM&)s}KPm(cd|0TWEpb~5yKhAe{1{&2;zfhNWpB2XeS@i*L5sZ+gqP220L zd>gH=kJn!S7YjLt#V+Ed*j_8s5Y3&_uV~(4-106mAXSz+8tw~ z7EvmKR6(rb4PoZdMO%mz8}$#Mrkx>8|8?&w;lb^iN*fq106qStSl2KYllvyJI=GZ? z9MS?Na9YaGqh+MY)%@x_`5-b831apAoB}4S@0Vw<{b^q3FD|E_`pb&Uo}^SaFqW)B z{ys;gSyVhGGi?ZgAxqeqk3Hsjhl&~40zZ8Rqpn2+wkF_N~BUv`On@D5p=e+{z9HB<9g%EXgnMD5>-skgS#g^toB#qV(8ER@-7sfpi z+}E-82!i7m5+9R$IXwiA{U^ty)q0{+`N(@;SW0=cqaM@`vTOuHi+2VfUec(&uBI09 zo|9%~Mg)5K9N14g;n8Tx+O`)xGR`h)G8G=gQTv%TfB87LLn&+APcOxRziG*6XYXa~ z`fbD=W?w*|X5)W0&A4{46k8f9wnZ)79LXf=@9yE-2qFK{;y2R9K%Nwli;&0RrcS>k zuvwG6MPd3@4hRYSyk_^1Di>7Al_nyA%%)P} z0|Wk4M~`90lQU5}Zt-iZ^Yl5|hmWYqr4*aPt*}xTI-;HUr5pPh4^h>c|H?3S88#g| z@u#DA3TE~t-4M+aF-zlL6F>|>`a7%lJOdLsq70#FC3U{aI>Sa5x{Zuv+&$oGZrG6v z3&GUY=?Pp+E!n#w77$rV{#Z1|-dCWUKbN1Qb;p8?hxipq#2xyHQoIK*#l((=)WP1t zd34PK`f(t$x<<6}%&7iaC6VIL{Db=sLnbarMEZMzqq3%eeQ0!;y3Nxx8RXF_vw#tC zTl<4tDD#Hb^GHben{pZ0829FhtorVf@w7#|t;^}P;id)OE{Q%xIGY- z$4QnJFL~Ztzj}-_)dBj}Y$M+6r_02dQK6>&ovR`M&EF(wXSeJ!A`)l#80ryfdvNds zj%v1^4ct(R8Vlpncp{JB;X$V#V)rYl-m51X-~f=aSW{Dko#zodi`+_r$NH0Rd>erZ zBWSx94UfQ$x5OKBoTRG1jV@q8;k5S?bN++lY{@S zAu#Z0aI=(+RPY*Fz~9rUxpZdUEfoh}m|sL0J;Y-i$u%|ebXLSR>J?uo%C_j7!x%k0 z5!ub7?h_~3A1*s!uznUkjX-VBd#I3_ZFtn+!p!x_X0aP~!pr?NR)SYVP(xE_LQ=<| z-z~xoYW-~n36yfZ8(CFV{kMk>&AnGd+M=h1=^oHqCq;mqT&Fy+f~7e>%sYwQ{`mhl zy=fnsz{bmc1j-$UiRBTLyL01lPX4d^8=t5;UPJ_lh-IE=)-;oaHP)KMKj15_s0Si& zjW6rH?32V+$0`TkEkYFSm^)Dy)MrU^5zR-#gY@fcDmuugwm>nlpmEh;Z=+$9l1}vZ zyc=svEJX|h>w-&}uT!b7VmLzwqKCyXr7oZpB(b8R8eh?bV{|ye@f4XEFl>~JQ3-$Ad5KY)!72ppw~Lk=UXDE7NOC*kh~XxuC_kL*~Q@f zSw#KM4GrTPpXd)J5x1FPDK=t%Fq76j>OX5jU~<=9|C{D%)fmX>gSh*YSCrUR{N72` zLi%jPg3lx)4+ozsw4-eGs}O5YK15ea*V&sCTE#y#=?+9eV?!7w{XyRE{8j785_uXH zVYv@wO>l2xsu$?9ZTO)A-@T?;Vf-@kG#Cp)$Ux2)g*H0YJbJjTYRv=|`_yFWcN;X} z7Cmi}wuD1{rm9}1CK0bOZVUO>S6^KKlEDRvEDISsiTdxqa8vi~Z*E9m&-M_a!`EDp zJA|*$?ip!bJp-#piT#D3P(kKs@1FPpaQ2I6Q*VKzj-}}k?dK^^cz4jsM-TA_?%L7r zg^mysLNdBa>3HeW3xz}urH*aR>OIfMvp&tK*fB@dRz#9cSb<7c{)(I#ctHm3!yhKh z_*Q?MvnwK2N7KG|f~MO*yqt=DkP@fJ#Y{W^`QL0Rkv4x-V<7Umwd02;*oxd{8A;WF z`@}~?PBP0js!U(zhzvm82a-`!X&Iejg`G#lm`|y90-8Q#s__+#KWsuCEeAJckr^~! zTXL1gX=rgCw$D-30#5Q2v#Eureeg9kH|eT_YMiB*1b)DJDOTE_-JUHJwiJNT*exe^ z*HYT1GKSA4eLnUqKqbXwj;ftC_cGAwxGG4cw2dKgxu5>Ns33{@_#v8@KUbH6c!aCv zzY0EtiVM?vIV(|r)3P^drgA`WAu7A@ktH?;pc)Zh}R2( znRbEtKd`OC?cTyIxugsCp4ga6P7lzmw?Pq)mL9~D(Yp#MR1kvNHS<*CSy6tJ6?Xbt z1PTOG&m$8L8dk8wxOn6SSjDaJ0&fm^dj!B;v;O;p2=}4$9kbSK5UO1$B==e_$;4SW z@@6#~f-f#B(oHqG0IYAesoRHkgkuLEgA8Hg1%2*H>VMCyRkq^CBH7P|hZeHiqcj<| zfz0O9aF+XGGBM;(uh1ya6+eZ_!-feEdJFgyuWdc)C40eW3|ARE)cIu~a~DsgH66K@ zK>M@`u|d1AkOF=xEz3{8@?VP{MJj!`S_d~+2!)2=Pf>x}i6r9Yc|>G!EfxHk`!rlX zN21&{N&AmaNjY}qaRd4qTUj|$mxm$ZgQA+nt^Zp#3cYm(?^!V#yLX?m5!INmEy`Ls zw|K9m`wWogqG&;|WCx^9TBj4_qVx`M}oIy!Zj?7wn0bFa7xTe+mpHSb~z`SoIZ zeqNoxyFmF+R8jpsY=cn0i`>fXPe=JFN#u!L?%G>C^$|#<#J1iqbLV0!<-*)2swqP5 zUy9X#9#c68w>(9Ux|+|GSgP-yN4^++a5qgQYqIxibW{fzG7$Sn)${sZf+q{C^9Ikq*Gbxn($%L9_Ga{#|f0BJZw)*G4KCcLz=YImzO!Uz`y=tMo(=2Qe|0x=`T!#@d zK~#|bk{ljm|>olJ61?BHz+?|jN# zTqly#@bI7450l3^Q&SP6hk2bR*ulJr8b`t5<-nJ^neLqDFO$>^NBJIILo|wCL;*^i zTM;du&__4M4&-S&r-cN%8X0uJL#WpNz(2HOZkj?ejBWsOSQ42SSKpxB(K z`64wdZHM}kaS>|tpqrV~t$`h94W?Sz!YF9C@gKTh*m-}5!Yj(@g@YOyodgI3Wp z7vkLS?3j1C7`#if`0q;Miih|=YaB>;oO|U!hCUKYEB1iuk;E$G1}kTzde0NIL11^5 z?$w`v;!~{VH6up55{!rYaLcru6w{d6`Sv0X9+7>K)Hg2I)9K$^YE`K;uSgO$eI+m+ z2KyNY3z7ackIAh#C^k%DTSb;!r}lMh0WWeV#hOQ5@G#jj?j}sju@Fm>6TGjonVZA~ zV3B>yV~UUDwzQkq-4tXx2cT*PH6kx{eBSrzFeEXS!{l-`wwJGaD6;#99<-~J;pDHc zcSN1B=h%va}j^pHd5zmqG^BHk0nDu2hAzm zo5fz3svsgCK?RY4T_5}uP397*m`|~RwiYc7O_~8pN^;n_;PK&EYxo@LQG8S?NOM8s8*mQbv zBgc40*@f&i4axR6{$Ds%r~&*D{fCKKi>Nf@q2)VmTok<6r)(r0ow5p1)4oX6KTV$0 zDvhT&v;D>taH93~BMvA`)Eo&H3frHkK5j+0?38KZ#ms~I&^y+~e1$lWWxPQIi#s#u z1a90}6X6GvYacJCpayOs6Bsn~nijPP`6@MBzooj(Xo@>9kC;YC6gTV5Hw4D6`RM!D zOGli(7@==~B|(+S50UpD((7w-%oDs%aCfO4jC@q<>-FUZS`TuWZOh4^0S^LiK!<~C ziKt?Mo=uwAB0F2*QyUqCOv^Z8qGBSK?cz^L6qo#(lhNnhh+^o_YqGX>Po*Pzi)+}P zy$1c_WZ*@5&@o%0;QlE%K z+1H;zezbT~xt-F+73`37B0P^OwhCL3BlOU^7AS96DAjyivslc?f2nwOn0Q5p)9=G! ziojOpi9VFk7z*km?OZ)$3#x4qc}p4tSYkN@WL0}W<}GMZol+3NeQPbqO5%yI^AF7G zp!zt6T}uCb0XdTvOX|{^ksac^-*Ad*yn%pF@d{4+9x&7D(x-Sn&DX0bm$0TuQAMmd z;d)KZDZ-E1@XV--3R6BscbAS7AD@=78TrLa_Mr{dR2C?u-MgS_;F{&~J9Lp7<`9BU z(q`J|v#58k#Ey185+VsC()wHG#TX$Ee`j{gr!L%GkEUPFZUH586Uh5;=x8Fr^Iq z&T3vxenM(^?m@1GRk3F0zxc+>a99o=+4weGug9YjUMk?|N2!VR7%9dR5kB(M!Df00 z#c=Rl-!o2H;R4FYE-4ugdCXcHqS!DCTgS=C7d8MzJ1P!0?}cJmQvgrzXcmrU)Lu}% zz&kHMbWv|ab`KX2W3SG|Vpyv*=|X%JvQac8op3=-QvSbrQQV%Y?{9g&VT#3I2r?RN z7O4F7Rc>ODu#_&ZXNbCSSvnzQxkU6#C}pfnvO9y=;={IFMBh6#V&o>xXNfdw$4X)i zCUUwastNWy>!C}a$(-D41hUN$B!|`DJW%P5zU{VO#WvTQyU-Kq{|R~w8R%Y)DUXtZ zFVV3E>Xyn2L@b_W(g=UgNgo;p6t_k4oA0zDVVX(I#V_0--gwh`Tga_^*%&S>NEE9{ z3NvKe$ShVN3+&p@w|P42jOf1uibyEi7?H9{%0C<&ROqFNntK5(u9IftOKizDLMsfq zrBHd;8bX8zb^1V7-`$NileBe~B^dQJ1Y71OUN5l{Kj*3KHRs27Iw4%#s|*|e7zDEB z%+m*Y`_8xT>SAqqg2u%)mZ1mFqv5luTCFF@jMKG{GOwl>QYV08D;Y?nto$e9%bWeY z+n=K4QrTwBrD3W7&Dp z-y!DH$BCn$LC5&r-F))7pz&zjT?>8=BQH;GE6m*m=-4v@{~W!E1wT-PW(g_1-Yx{M zM51idq;d;Z%4}24p-ASmiJY@>2V!l7a|Fr@U1S;8ZHty_KLlg^K z^R9c>X7n9`6pnf%0RLXuT|i#r*|9awnG$tiAyV!TG*uz?gD6IR8G8F;jd2(eb=X4QV&>gvH)P*vVo1aP7rR2a+^dETwrm zD}R?M%gB{66=k$iSM$vfEGs35*<;YRikg#K$QP5e^X;$QAg$268+lV*7*hl3##Dl} zQ=WC?o=z3WGaDMig^=8F-86jB^c3Vxw0IL3&na%?Q@8Z1*~R7fvNmFYE*1$57})%FxT+tVM@OJbj7o1S`=6x}Eyud+t7H4V|E zSaIimRlMoYJ`)t4J`L(N864{OcChy#9ut+-=m|{EpSB~X|FL6 z1HZFV&cOexHI3mTuhFc(O6+7C3NEM~+SEB|7N=PlrUL_Q4rr+v{2IKB15F0Y6ljfr zb9}Va(pWYVpdpZ#7N%Xt5X8IbYjf&Zx`^4t1^$6^J~9qD zF+*4qJg|;0+#-ux!t|X-9FRZf5fbm}Esoxsfe@{?$aLdqoWyD0o}JknG_Yo#KG+NE zfOcKFgV{~R85n4=>o_~r^#z15ypeiL1H;AMySW&HDigqX4RQr!cG$9 zLUi&aHD5!s$Bk!wQP+khO$ZMjh(}E~if;0tBC4Q%X?Mm|3&aKFH?1pNb}^%THX30^ z2N-=`DW`d6n|zFOV=kp1QF0!+m z=u#;3PXdu>f`1+nrXn_c&uhG}DS3(nI6#+Jzs~R88752{nN!J^4GvF3WzrHZXU%ye z#=h8&&)o*~^iK3_CDCH7*QwSZpU#1NY@IA_6{k4e!Elb$@jJ)Sr&jRxx`Hm!Fp_Aa z&iS~nnp0QCU>A}3>N07}0M&ZU_IqS=JWm z*mSe4$S_jpN8b@cu{s#41W4I~rFBX0-Zn~V{yRl{Gy8h8H1}#X?hH?9)TeV)Rl=*+ z`EC-ka;mUiT{{A78!oDWK^B%~W6T1IrKt|w!gpWri19{?W4rV!#+xWP= zCT<#7BouO82!}A-EnniktPj|r8}~R&*`b;u=(@wr0cNTEra%3HEKZDHY2HjqCaWRE zd5yNiCh8Tyicm8c$Q#CM`EFp200e5dA96{Rh^v z&qRYI6l!W&-Fi^xN4In9$|XL=gQqCYf4hX{6AF&xUlhr0P}t39AR;tr9*ovN7lr)e z0M{)Gy^;4M0H#eQN(dJiwowavYyyx2e$64|1;i6<8$pC6*S3zjeO2+aKy%QqU}VnK zxC1BusC~H-@m4ISXFB&utAcSgpEbt;$KRTM`CfOE#nngBfrC2_JsnLiUJ)ANp^1=jzW%NlSd>= zc@RibeIJ&E$7(RoZO$q4lLLlL#6M(zi$YOh(?ZR2cBfqi3(#K4=dtWX+ux+Z7p_;Fd%tiIo{ zv@=MNo!YF|xSBT)dj;>C3JQP*`EbNszr&N;dqMS@;XX@toRcn59Pq)%UOhWfy(-hj z{pv2tNhqRNyQc`#6nZpoM=IGWA~KaW{Px47F^kNn`FlZoY)R48W}&j!u;20A&9*O| z-rejkCb?}mCZ3vUnOs}VjH`L{u`-pq)j_lK@JvcDjN6UzBHY{!yuBrAU^+V@n0%3Ue>B^@N^Pc=ZoV@t|w}u z?Av$BorPyL5=ZM#@|prG8%zG$iB)vt2t0yV10xb}x3;s5dT|4H1!2BJw_%KNa{nMz z{UAwUL%6nq*ZG=OBCTs7-{P0t%IO!tfopX0=|)4N6pf5aFkiXG>QNm?mVC6jnk8&D zLPf4eCw`ebWU{(Zq~3~*=ZM4AiAOzjJFsD%ybF8UMxgl$@+s;G3_i_)EYg)qg1G~W zog9)>twAH*8hM>FEHa*vAH%_2bivEq(2G!qHZ`DcA=uO>Y9^;sJ6s#(tc)R=L%(ua zX*NnXQ{5f66Twer_Ehr`4*x*h6zV*(VM$#BdUr`WY0Q&zSy0glAz}G?V#jEPo7|=% zDku=Cb{V;p2}$XqAzL_WGU#kR*8h@JG5Akp$UKd-;wc)NL~iH{gzhwNEy>Tvin72) z>|^!7e}Yb5tgnv$H%+BlW|>Pm+h`9HI6EZ)W)Ti=A1Jnja&QaDwwxa)Yupe!31rZ{ zrD3zLrrRj}^-zZ%KW;iFr=u!})1=pL0tt9?Io!VNJdE>zfk?jujpv!pfl=IZ7gWog z2Z7}dsjIS{S2vlE;veRu6Zuvajp9G?@}ULf{r$x|aGEPXSX+$plACJa0w3r}$W)ihI znqP37dsrbp$(`x;63@*`8={_5m6)e^=h9?d1B{oGGHz@9dQa)HPG8f=1AP} zdQi)%nxR3vNQ(%&vFMusq9p)Yl)c|CAF9m}hEk(=E`eZ~_N;G#T)x0|`h4_?2Z&c) zT^UH?NZm9m;|xzl6-OY5RV!%P z*$YU2`leteu}b|C&D`R>i9B?UGI@H>WlXb1ua_Wy`$Q4k;*+IdrqHv^)4*cHE4}wQ z+&CYXPW#XtiT9Nq+*uPB=DnQN@+}x97M`)lw^)m>Kfy?XYU#mOXt~0R$QQk~9JG1f0sX)j-7M@k@MQ#Snj*J8Kb$iw%^R6tu3sW#@14a7w5c){6f(D1H7K<9f#T)tv`XaJ6Fmdt zB+#zm+WV7A&32;{|dKoe$;ZTk&s?9_dZ!%5w7UV0_Mnqdx@%UyY5u;c74 z{b|lIS4sgbFWWE?YGYA6aEie38^1}I{Ix7gZg_;%L7hoG+w`gnUy`UXhvc5~HfO)o_H=Dcz(Q^u}xmhMA0KC@Pjg1WI<)tNeiF?9rrjx}-2ALqHLgis_| zwhCFnReM2H`#wzTIL7<3iBW9yFhI#-DUIEhJ50meIh-NfqJE33{a_0_%o@5@wd|-@ z*v=ZGcV^v6Dp&^${)GTWA7%x?kkd>rWT+^F5=O}GFgUMQcKzxJ;?_YtB?eSFQW35 zb679JshJl0$8I2=T6??c*_siI$mnU}KXWzC5LX8{n#*@Ev2{;TqX+*+9^Yd+QZt=v z7hz1MJ*gG1VynFQVcHdlVU{gbMc<*HKEdyZIs5&CG?j<)4J(U)V#@MWi!gxOmnUxQ9P<5QB0RSz4P zPTRI!SsNavyNh-*oF4pfK;x(qAK1n>_WwL|(Swq;O~;&|Z~yxnPiR#C>yM~k+QL91 zMp;pU%zHNkb{Kud3z0v4mqQ}p^PG%e1|UP6O9$2Ds1Jlp9lWUe$bfWyA95*WeF!yxD+?=WA|z_cSO z9x(S=0SIk&sQ$vwfC_s}T9i8rAHM?zdn0YXfCFcmg>{obKE2Q$Y$MWbWZ%!dK(#Xf zOi-zqdJZM6$?zY;uS8DzWG1EA5M%VH>GJgydR`Ibt?A*O(IdOA~DV`EWI z(|Y@~&qN>Bo86|y+InsqzHBS9iiJs(pNgnPp8L5`B=iIE7nBl8hMkP8EA5YAK&WCw zWT=0)#*{?O>Tz4lLke*U&ynI@A~tf`UAih3JBXhE}^z(mQjY{Djk z^PtxsNA@{cv_O;bP*~i@$D}PcgxW0hhauK9n1`b(v{!GbK0Za|0Q%jT^nC2;E&Wn- zmOr!*PM>h@&x7T}JhM~2Z-`B)!-q*r{N7!!8bt!Jk-MyQ!-j8yi zMLDLO2NH=gW(u{R_I91yetK4{*>e@g;HW}PmK{Yzg~cZ$zd#e4N_%?_oTUS|OR)Ek z=Ef(OCw=a=pJ(q`E{3s%v)-Bc(Ceam3(U!NxUq-`RC3`xQEZxNm|p z*+NoWGGi@i1*Ngun8A@s)C89e(J1YwM>5JBsZ-QE;TUC()^9|62w}gG_Mg37A#h3w+5a&AyohnQtiDk2iOX9E$db>D**-|!>_uZd9 zMO2e-bEPgG?558JdcHVQmrUb|n=q12uRK)qD6vEH;x27<@&6Wq9PKVkzJqPNR{W4& z`AbqMOj1`!kqN7}iopSi3J>dD4#~C(m=vkkNHS(9tIS4fa*=Y4)6i+xS z(>8+kRGte1l$iVkcax(XdmAXwltlzllDybe%2;F~y>8RSJlJL~fMIu;UvMqw2k`ei zd*>7s8|OKCer`9vemR(T?;QOCCuf)ryIQaA_JrZ2Nd?M(t?mB77~6;&JUdIyKN+EA zPFH9{G^=mln!$s~Mq?JmYVb z$miopl+|8bs(N6{FxwjK&IPf35F z9?(X4dmp^27$q$zy80*z+K<+JbRNYsD(sPLq0UCQ#MYE>eKvNS-?%3(jdn_gh$FBV z81x9H`R)*J25Gbr6YBEwj2?P7M2&1%rxO@fA(~3!oKKWfxSzi>h=7i=Ja*9<~DHgRB6#R{)hj-$#BpMXUj5Vl@r*-jR&$>rbw-`j2w>PcFiBwQ55ap0| zRT2MB&3Yjcw^Sz1yPiO65~v&Xe2bVAY<{faBTZ_cow`!LS#ulapHdjdfPoYnk$E~P zbf{i1^6OdpTPC}q2Ne_(OH87!-emMtC5E+S3eBlkhXt?jRJ@GI7uK3F49j+P%ZnETzsvyC^(_xM6|2w@IZqYAP866H;VHzQ6N; zw@-05+qkCY`brRhgnrbx8s;t#vsm%5{N!4QZ)I(+{?1hcnZc(nfG);~)+yW;!e0f? z8tjoF@UjM$M1Kt-U!iMPX(mnQbsyO&w}$A?P~|~vBO`d<&%;AmV&;Z<#Dy7}6_Yag zEO>Nf*{|e$l>MdNd-pct{k_vgm%19D^<{b$W3^w?KC3aGX?6x zaBcOZF3^EN`|VMro{#1ly(;2~GGLATzjowx={b|Wc!7Qs!ew45Y(R#Tnt$|qiz~Lm zJXi;O$mQi|lK@|bLSHZ$rv4yaY2uN$Oy|8ORLrGkw7QK99@jTuV{9| z`XqPg_(|^Tcxn~90yjFtVV4K!^z)Wb@>cr^-cdYBzK+vyS*CQTGDG zS6R*qTt(<$pOw_ORuQ1(SOhVGFAB<=x+O$(X#D2VQ2%e)Yi`7i_ zhu*3Xd9(H88exh*2FR;OCU$z zB;G`x;+yoQkzrU1q=Hc787~kopG`g^2TqZ8{-#+nmNbG|v8jV;GU}|5I-V{kD?yo( zPF<#(}s+mAkBtSSYR12@f~ z!-Spfj@OL7_&`pJ3ehQYmAGoQSU|%qQg+Ji?2p0IKX(__G3_Q)wB@Gyi}yJ$bt9g5 zz-BaES1WObi#&N5{}KJr0^8ENXpppXWB&Lfnv1tJi|nUswR17wKgDdM+8ZioH@Gm5 z(vGDypr`yw*nolmjq`;_7b8Tg%3*#y43ES$yC#82xiMa*QI}VORh&!DR&#v)$=_;+ z9p&xvb>tt@4rffg%7$szbb4kSY^<JhT+b`kZZX0SX1c@eH(IU3s_KI*6zwUDm<*-8C>4+IF2 zFG-}M+Lgl@-bDsDiyQ2lZ}Ch;6fXAFG9{B6%VCGDgucvwC1IPaL9{xCJy#Q2gy&yCT*!w8kQ?usMP0dCU?rD1`+ zlMbeB#qT{;5_u9w&o^DrH`nUNBir2JF@s0K3g_$v_6INM>DcxE4_8@m<6@zY3p1#D zAs>F2Ectte<{!JLJshQ6!LZVvBdq}7PyLP^vy;K3z%9m-F7n(cF*7cy`8Vvm2PLVQ zKjf@VmF%KlWPjp4sNnpG%dB4KSBYr7^#Zd(TuO_=#Z#jOKa^uO4YVu63@IHX({?_( z;2-*4;JwLYyXiLLO9-_r&YO;J4FMlGC9Z}vq5FaWWDjn-V0swV76MH5>L`bpW4!S@ z;E*}HVdP7CRyF3PXY$9Vtmyw(RV4u1i++gA#=IgZ1j=kFOm4yUDgaBEvUw^omIQ;T zvJuy~$ONXblHAgfzu)!1C^gRsZpB~u0=j-2-w7FFdn=MrCF984RH+uaQgI0joMb2E zh$8)A27ZW*g5=M_M$c>`xU6qLF(8R(=4kS*u3&D61?$6_aCo?ka?>bnn`R(RHf-9Y z6n;nko0r`{p%B%a7zIyEB*ld7*eOp#_d4pOH7C3(M&_(#%itMmB=}{5=W)UQ`sri zUCMPdZOl6-Lh3lgLA8x&$zHuC_u2!-KVuBj1zo;$pB?%SZ0RbE)uMIo7m!oqqiS#I zIk-{7!eBR^rtoPIYck+3c@_X*|ki2AO~ zT4MW^ZwRAez9YU9wwq`nv71N%Be~T{Mq-JQgX_B&M6rJe%_PPnjM9wA18%|3PF9a$?E!qHIM@H(XDxD0upsX|cu{XpU+IXukb(ul z`)U~aw~Ixgqp<{yW7cr&lIy@kF#<~wDW_HrHy+4l^u~`HCh!j~(a#dKs*y&0ymaFd z^!0Roh<9(b{ud8wR{ziNubw7S#_$)NvyF*f9a4aKPuJXUu}3Y@OUCuCIEK{KOVBNw z{OoQ$oXOMC#YEj<*7b||+Pq9h(5>-KHLh@?o+MIeLBMufc3R*BzLhk?j4)llL)@{p zGC+UqT7vz#us*76w(Vdj+o<-8&x)7KLa8+wj^DQNX;iCF<>S`ynjCblC&ZGbBXMR; zwqWCu(p}KT+W|s!&Rps$-+wH{A%5^`-;I^a9$lQ^Xw(wxA}#xA;ge zs|1tY#EN`~Cu$FAoSc!VCWPI|N8g{$M%F{+nu>ud9yT2P@UTDYZWc#oUOu%WvJkPx^1~XZNaTlL^lq^2H7DAstxxhbV%Gm#V z;}-b4`C30ZUX3l&90yU^J~y*O&FW3+iL{#5M4)q*Co@Cz*GJ@Z)8qJo@r4@mql*d&dSg(`3lmb0_Tr}PDiIMil1XCb zdmL<`7ISW{fizHZg!UI*19u2mrl&qd9~0g5=&s()Oz8wOc3g@`q_dA7WxpoOn?BtE@W`C&* zPr>NsN72*%O&9PNL*btuO>fl>=UsN6!D$vV73_1(bp3FAbJstee@^+hBmrkr*?qWT zFTNw*AS2IOvJ{u2`(H{i-(XtjK2j z73IvL87!^-XMO~l8pU2j!KS^(H4??4jFI$dBKM2rqD}^;Pju)dr-gR)4ACNoCHm_C zL~W3J>B7wTi?#o860G&;?djN*D#Pxm>}!HaN2{Kg#1+qp}7@ z^7wqIS>bEvvL7QL=yE0GkLVjbM}t<*n2Y5|Co?@Bd`78UH+#az{h>@Nax^6)TR>!T zEa7GG86JavtzduYQ^0$tQrx_Xdw(fg!u`{mMfTfqvzKGIj8hi`*n*nO7u`9F}u{5v5`&g?8nWAm`se~C~$3b#v6Fck_$$6S%C4(qdV$XqQLF>UR?iolN*XG;Kb! zlQ$G%4*`~^SfsyIOcUw)KJWGdjwmRtFA_du(k)V_c?2OnYK9oXLH$=v3$ij z+wwr(-VNtevBE_I)tuM~1!#+Th+VF({#ITDU0xAk*a^KOA^&?Z0q1dM^(iQ^Z7(LUyb(wLqAC%?Ka|;*8{A$|pK<0>4-5+GRpxs9W z`uMz?6t;t7-iM7mX#Iuz89{3t-a_VVSY4WDVJjS|nMcrlE-}e+b&&un zkvlulp?1?IPu<#tdh~}-i^|sFri`|1kb)~>yl*$YJ@pIR?3hjZZGOEou>VN{7a;KJ z4Z}(~6Q>1sQ@G+RzA()4wNJ`%(c(sRYBI$dCr<|o3-N(@wRE|~RLkxUG(4V*vVK~d z7^0suW9_d4v44{2E}0{_@%DrRuFz|YJrq+;Eyh5S62@e>aax>p1&u#uGYrn+B;%YyGmP!8-8a<@j^5T_w zSe4LT#C3#d7EVOwVN2dA*kGe@yR9}rlfAg(EoZ6>*>|{t6^ZA)J_#eLTPMoNWfKI% zcV1)(oi=#f>mx!xZL@RWw_cV2{inNc;96MhvCVpUMQbjMOg~@V+=+Oe=4@WK-L_SL z93cFrJ1$P#YWdM8+U}gmHIrEwFceZ{fR8cj+=xC#Pu9H_enxmC6(0@KHJj~|@vi20 z!!$p;rxf~COCYfqkEA_IM;CY=Jfx}|e7MC<`I=*}DCMFsrYW1<;2OXfV5Bvl!xeVZ zDQQx1KCi*r{ue1fCjKkXkh;?9O2&Pstr6uzds;v3)U~&0>ST6UsftKjJ)|06bLyZU z`x*Y&GFzoTOnZ6c&$dNh&6B%0w|pKO7T3qz`1$cDUiotV*%DikTXQFx8n5Xe4Uc;j z8TiM@sWE2!KeoLO?q$$5C?pKNlZy}>-)UE^_lKgch}xDbINPHAO3G|xo%i9jqlJl~ z`f-89Q)ggM`s`1zzgCUt0nH8*8ZLB;!I%X3W3g z286CsF6J~rY(N1$Z=IBOw=g85g>$|C^7{hjE-yWnM%8D8=)g0Xnh^dYNw;fm9 z6pamF3pj_*AW5R-^Vw=Hr0rw*j{6p0_xzX)9}f)G74bpNY38nuk3hdD*097}xkYa4 z92EH98Q{d+mnrAklZT$>O!l*%ITz|kT|aT+5JpoYT%5#|8%D%GC#pn%jylO?;&ow_ z8-=N3=~dj?6T&%Fj=Vy&E|gV4t2$;*3Hw7FP9?ODQEeUDG= zww&X}gSP_rwgdNkU;Ny9Y6K4c)^rk!KIYL3EtXVv1Nci(5-KB8DHg;YEv#aO;ax3u zED0>+y$e3A;f3R0`O%Cg)g7t(FEtPuvr+|iFKTO4n|#WrqU9{7_6EB$#t-_f5^yfx)hH)Yk5WVI42lL zCk;aSh)a77hIlg3TYqg3^eZ07z`=jymbKDWI_Pc%^Y5f$^K~Ay{%}>LS7{n#)<;!2 zQkMf}3JP!=6=iB#9Yqn)kbZgpB!kSU3^s-!yZyD#7?)87%PG;_Etd;$?c(gx8HU#Tcfy13u$E)Z)<%9Q+lFOLhdKM0mo|yL=QAee^{Ceuv2`9EVQPt~$&w&66J& z-AdI4OOPBCCpt$XyP>b4UBeV`q(z9u6md{T0yZgL*U)*#@$U5uci!)_1K1`YrjQBN zX)fCemlYRCJN7Eda_P&;x@RyIinbYJMult>2kuoApYlk6%iP~?V}$ml%zX^(we#F} zPgeY5JO7!c9j;(;^fBSWc%`rVn}SA-D~x4h#oB393|8n&m64^KAHrj<9309X(I2W{ zgn}KDU7IS{DKG}ki*bBZxU+qbhpci@N+>sJ*YD8a2-PQF3T2aM65B3!1XQ1){dgW! zPc-*_bNf+lG}|WLxn{oo`m7;+n}pK?^f6(Pi=4a{YI}j4kR??ASrh=DE(Mc6 zH1H?sgxegKKZcLhDzNX#_V1~=ya%;RkDBR3$8S?+3p!YhfLvx{mn)Eyg>lGj{QNu* zJX*VV@D4!uln}aHx|z4lm|0F$^UQt(xqm;&9A=z_e{`o(>7J(afo@%>s9`i6WSA-~ zjA#t=ZGRxs7L!rD!DCr-!=ByREKxDj{w0*F#zJLfqw7y+*o#jZcXfBd%>r^k9bzq9 zZv)u-SY5E@5=lT7UjhjQ&+AUI$8NpVyyEos9D%}*DM0l@m?dzqAZqOr3ZMLpIT}^w z(LEsyTJC!)*r0TezG}QM1w!guv)Q6O*y~6oj6uQXjlv;g6fs(->^g|EKx!AAq`br3 zJ`B3eP*GmQnT31T|GDq!r+=a)Oc-Pg8<%kIA7)bKYtuZv2?imz#*?ky`Xjxk6#rsd zFQ6S#WtHQ0ylBx%)m7nxRJu=LNp8Fc@SD#)L1_44sCAPUbCUU{|Iql80`+`AQISEA zN75!Y7E77itW0$FC%S+G<0@iO$HGM6>|^rOk5d$T7QmUWJjDNp(Spd6)BYP4)u>h{ zLE9h>GN^Io7PBk$L->2%`{_;0=bomYkPATQ(xta^@v%Ue!Yh5-?_*dFbW82$y=1cc zgR%_v+5P1h3&TIPpr*>>WuJd|iDkqok4%rxKQGkBomA3<@%m|gKwuwLXxMN3h zW9MOZy-!RTS9RU#xEmM~{S07K2BClL;puZ_aCY zE}&u{s&+$cc{Yc)%dfJUJ1?0!DUwD8_6g!$(J(Lgsf7F;aX3AnjzB5w-MQ^5k|S4C zy5jyxb((mqC?D-SN#DThz*OcFV$t?yaqn@_UR4othj--jFL=$WQrEj@m~&iRT3`ql%}SCST{U7BGwH|*fkrF4TZ zMgn)>|9qZ?&}xXk1kEf~;r2QWMT7y`ZWyY4^}o;X$N=Qy%k}!78%9X*Z|2j{T;3A& zgfR9|1)evz)XVE#;O>UV#Q92!PB{Na*rFAOX9lm+Y z@VHLqS%p7LY7_XtDe|M6ldyI-y2>$IioRBmZ_(PwvU4{1xSI9)M1TdZJ}Ex!uWWW| z^Ebm*n7gv}TITT}CPN+_Hj9gtqs~M_mzA$?5d+YX3`jfyJgD|`eQl67 z!v-3k+%_biQe7rOpLXYm0X25kPz$Om18= z*B%EdvQ-l`{H&euUIIWS-oYp8;rROyrGP)o&z=%BI&D5C@rgTvVnjEq;ko3$V-t}6 zNCJ_fs|T}Z*r!h>6morn{~WqdTj)%0bTrhNXY)1<3mhV06sq6DIZ+w(0jK+q|9G<2 zSi;^)WgGM(6&(kN1#4@8a#HEi{Iv8;2`IRVHYZ1mwp9A`4BN~{P`J-XW_lzTnw=}p zp#Bod*{3k5hx610Jcw;zA^9Q8jEU01J=oRVSo${WD6V!sd$@FHj<9YA@)Rph3k(rW z^>BX!g)!(-DHE*TO{*Cf(S`a9lM@7+gvD;uL0uMKmux9;*7;BT2jEkEJjZCr7Z9Z3 zK4k_?f&E5-%q-V>xe40bct^)T{P~Bd-UpcDUw$DzZy2)+eK=h|W9MdnO>KMLcowR)|7IgD!fLjHz7V8YnC@6U1cfedO1xwKd>&q5 z2C~}XxfW5du>z@E{`P;b%9!~fycC@AV(gZ&e>Q>_|Fat$Eu%eZPO@z)zIJ2o+cS1! z>#~GB0g!*7W_jTOh$jYernw!m_Mw0(0ufzPgzV*B@~0kv7?Rm8M8}Jprt8DU343qZ zw@=z??-SThBDMJ9Dy807x(Cu;Wvkk7|CRK9%l<{Uow7RHKoV z^a@Y~fB0AnpZO737O(zWGYr!ZOOIi*iuLSnPbSoaWO)1n*>^6O!11}glUQ@#Sw^?nN-zRu?8rA#N zDX@4%IY}ubZaT9wz}_-meDAFd)pvKKdm!= zW)v`_GQagwE)&#vShw5GhBtQt`>1%EZn@}eEo~w`SnNJ!`e}PyuE3M;ihUWSy(SKv zSj3iG2=^%B-kOfS_G7C7T7$2SxAM^(q2q$Rezz;V)&5}>@f+tWKeht@pBSn<%CK3h zHSK>0wkfET{s=i$ye<1|EKMJfI8iW~S64vShiIXt^=#Z>?<0{J?yOiz%%=Iy7j?}K$cCvU6+CbYz=bJNOc3_3J_y`Euiz+Em( z@?$CWmYt=8lI*HzXu6nS7Cpj(hG#j$CJUyEr;*6-18APCWyMmo4YK!x@P~QwB91)- zB2XlC_VY>Xn&(81+7cboa}yiU(t(chLNL$^6-nZC5XwT+J&(^;l@j%4Y9IG>i#FkK z>5C~7VlaMO^E|A>&63D?fudz!{$8P3ZtTM^-5m?$+`!S%zze!5ri z3FGN4yyFPaATPF`x~dNLG}{nH?&=1 zVeH>tyz9Gm5W4D6F8!Zj<%QBLBRHrX7T6Edk&VL6HVn6AcEA9GIqe zWV)E{uQ0pW?sauG&ueDN{ZwX3>EX9v!Ay*|G6=|^0`mDRZrguoJ+|7-zFoDZSX!e{ zWee-f+S5VpgV3Y?)Ow=E_fvg%-5Y2XinDU82LS_yU3?j-@gA48?z0AK08|_xigriB znk{3H3V-tkrh30u`)H>-Y3$KQ2^8d|CmIe-lP;2zr_n^$<8qs8%8=H1*t%=H)uZar z;76{#<v)umre?SH8etb&;(8g4xf7VL0ogY60U3!NmkycUVKA`>d@{}sL z(tX95_+teNRYmvZCN$A?!gLSntBTI!tju> z_lG?)!k<9&PXOx18J(b;H&{`u@p2!|pX$*G7eg@T*XzIXshhhx6RhZ_5n}0ND5JmK zD4SetUM?U;!h8-b_RBwN(#`SEtTlg`0`u0>9kh_|=HmR-jHRLIUhgP(Dvz_x%kgoc z8k~@X92l*4c>47Gzn`t0W?v&k9;VTLIQYbwoT9G+^g)r8h)Fjvea5CN9A@8gy~sgH zvAshq05QRmR_YpdNZ^mTzL-|>IhEw8ZR)H^Sb}kFh@AC7A1E4KEZsz;-Qp^zj8KRKcUW~7@ zF6WD&OM@g5XIt#C)lP-WI)221vNzL5hFa^Cb&(O?r%`AUPs?T2Bd^zvHBfLA-M6q8 zw8umXoR^?7q!%w+s~nMC05=U~G+Zr)4bXW@OTr%chq*$U^4AC0S8nlK`s=Ts^0wtB zvqHUEZu@lsP|<|U2L$-RIZ!26hAiqtmI>(?C@_kLhI~{Y1&zbtQ?k@EZvluFX@j3i zh)xu&OQYX-kG1&onk9}dWEekxK5Ys2m}p4CS64n{Aac)`-8q+(9>K;=DAYqy0DA&% z^}bAwbTNG-JPQG?(bfvc-Y^cT)v2llGi;PS-N6V@Z;xA{dX&y;!GWA}x=P$z%blv@ zB;vhGX)aQMPuYyj=Iud>w|#p5;8Z!YZ^v*J-gM)gFT|vb=2ax1@IHU31CF2W1|J&-ga^9=znKJ zbr@bam)(tdPS9$+&T8$t4C{{-9?ngl$qy6ZaWzw1x_ALyd6>b=F@0%7BdB;CGGrti ziTl#l+Slg)m+|S^aJ)nE{`bF5*U~$Lm6##T%ljP8idn|uR|3;+vvbFHL6&DI=xfPx zWiwYBMYo}&0*n81SCJbV^g=ZgWN@7VRq>PSfE9_{+Z!6(UG5cl)AW#zzYBxHS zWHYX42Wc*nYNjy5jc_@vQuq43g}Q^`a_{R# zbzOL6DSlnGDnkeL;aNOTjaSXJU)}A(yk+1v5N&~DdR)++Y~9rm$ORDq7 zCU4U3Cj;#`QHNX(wZGIBM>w5R@T5Xl8P$~$knxdBSTa{JTLxz8F>Eeg4-Wj~Ai3W$%xVbwbn~^RN?9&6|;#_#UFej4z+9>>O0K(pDy`t)*K;5TR+6WOX9L zh|QqK-mj(eUKm=P*=+V&+qL0a@%3Kqp6>JVIrmd7O)YjXCF;;3KREpKM8~ke7=zO{ z#uDTX*GXtRgS=lKh*Y`K3qcGJrRnD<;n_BEvkADqzH_seb@1UMPm!YI%k2x3nF#Fa zIqn;H&rix!^0*Na2J*-)_A}EKIaNZ>H~f7X1Ra)(v#*Kanw;OB!*}eZCrf87Mof5m zCV;T2#O)Q$1ktEwKgp4-DIw z)zw_i_{^*`ZKTsYWoxDO@9n1LiM%;I|LxsS9OK}f=6B#wRRtsKRr$*$wM?2VG`wwEW_ zcp{{Vry&kr#Ky~+lWg*aQ_iOm$RVAW%llmhScaww+=yhw*_L;ngzgc91-GQj@Yq~9TglHy{g!n}rshR4H5|9ZB>YFU3KJ`&2KFUjYTkX_myiJ|g8C=DEWM zbghxl(^79>Pb8s`kQ&azrq&$<%g=o`&ib!ixW)^0#JeGZ@YkexT-S1Y`Ys~=4Z03~ zj9}ve9FB+Flz8U`tER!ZV<1cuxsQ{T7C2f6h_?k{_ML(5j%ofy^zUj@3ZB*mZ!@RN zbE>C2$6@AyTgP!xei*$vot(o9K$*33CE5Z24rq^{yFD(KgE(u|0Jm4mgV2hCNK2+` zq5>yNE*%fm&n=2$Z=FPXu*DHU{GJ1y=ZIlM`4_y6H?jYTEwDrY9gh84r+KDutWU+W;vH6Ge|6iq zJMOSPr2Tv2?VtC(Mg6zwcDS%QN?tM>hbP3ZWdBf|bb){zOq*oE*&K{f52lyb~aFdd?v)JUqipfLo$mBvOrQJ)?(wWA)L zC%+RxcMO7g+h^+gH`A6+Myfz@gv0z{4(jBBtzjSb;9cT#sw@HQAoztR@$V}$uwtT< ziBa~Hz{su5K@)-u)A4s5=)2cP7|UJWh^!oQ0SZ>O$S-cXUf3N%Pcy2BtS{g-mKtj@ z%1$ORauA%l}KHQqW=(yx0HUQ9maq-9!XN(yFE7l9xQ=617UOs}ty~%_4M1n?4c*)y;kTm!L}@ zU=OqDL3rDGs4RIYs|F|41L{k*PWo~kzTpY?-7@3ct!8^va^q$npy1i@_^o2Pl2n^a z_c7@J14>s9e(=>9&i>;9{rS?Fb(@4slP$$XbPS)4f+lMi73dTbami_bSTGJSrf?~( zyASM+M>8)Gc7_^_-Jat6z47Hhbl5B@o;y}t_07%+{8m3L9FmR3Hx)GF^y8H{gMFC4 zS%Pm;^j?Mcb5k1IA@RuPT^@)4{^J78vDZJ)#2uEHPaY$_ z6fNP5->5vxg+5b|;i?ezcK_}S?aC?n3!rq&zkfzD7=+D-Ut3De;myWzIpVNXgZWkk z%ps7jO90WBD6SYdMsAAXK)2t~JySsB2>=MoM3qP&IBz0h4u^bRhm8r_R)TLy^!@mc zPbY-d`}honH$6A5`gj)j;M0jpFUvD#im#tnJC``>VGhI#GaavQt#Lx+0hmXScM?`l zWbLQ(LeZ;ymlF1N`6}Gu4Y4EWW&t&aS29cv{WNFFgxgyAx;@z2(e~kcc{M{>xe6Nm z_2?aG9ZYuxxY<`Lw=G)ivD~N(i`+YSae$@ROjbJ`cA2oS(wB%Jdm zn>M(X9tMO`HIsX>7TTNScGb@wLH*PD0eb%}xD#>}A`-nloW90Sfv{l%Ej#fdz$}6dEYY4tmAn zly4ipa;tOPy>&`BGe;S~e^aNyNJEJYkm0zK(Q!9PJM&kguf5a*B^07oYZm zj=6+7s8AJfL3;4#!-kS%{H?_@hxfLY*(^LtLMsZ85=-K7T@t|LZCq`%B>;g;sXNc9 ziy6ArF2@Wfqq0tI3^t}qG_@^GH9}p_w-ahV27c;z`eeicyuWT0*QZ{AtvS7>-*@P- zi!>~TaD>UQYpHg((O5Hd)h*MEFTHhTwX~Oe`M~b76Y+)_i6&TO0PH+xx>o~YWHysw zs<^Lx0v?(5DYo~=9-bzaS}qtjW6pz3!a-j+rE#Jm6h{Q02_>*cE51g!V5mVmQLv$! zckR)i&7v1$O)HQ-OwYx=3jmiJD#Zh zbLr6zxh>zkgaaoA@JG!Ed4HHYJL5dp>}4HK*F5263rRm%kaq0!k3`4!VJTQ#mK1sU zgR8ZNXF=X4q;?-hZsA4(Lb5i9Dmfxf|B|Y0B&}L%5l2b&9xk175>$U>7`z%YXysAi z1+%5cPrHoJrR##c$bH?WXx~pueuCKBBy)lxLDT+C|9Jr)U@4H-4#)a<&@5J{pi0Y- zb?N|p@Q9ov=$;{u7$fD+JW=N^dmr7OYRNFw4^K%O$XEB`u<_thXgh9ux8`C~p4@eS zY=13P+XhH1WS76W2aX?R=C=)Re|}tn548!t$T8QWzp*Z`%}Lh^i;3Q^3aj?qn~q!w zultzEXl^)F-3Wx`5od$!PNj>0@C{@tqIg0+N3lZaxMaQV^sb6g=ja!{qnr5Ax%AR6 zA=xR*;-B4er5cA9I?#im_Y$d*PO~M+sP_j^EdsIh$VY&?` zbtg31U|9j_vmpY3H_X> ziv^E2Oi$8NEEA%ue&96e8cGN8B<)SW(UlEI2yYVTIV!?q1a(w6FB9sJU^2bt)D7fg z^8)n!0}FI2@U~yxvZHH6VSMy+_f``FMnDg*Dibx2;?9h=@X-^_&u;-<*%DPVU4Le6 z+(HDmdAeeUxZL#l>^<(P=Ly;+!}upVB<+V;&vC-liE#3jleGo({t9{!@>K9HA3fd2 zqo>&;S>vxQ+Ld_h6g4GuTC+f#Rs)32sX~5H6MOfGnp4*P`jpw#F`FO87B97iyb{zP zb;n=><(duy(;Gc&ExVcW)_zfPiSBb$9c{oI~vdBOuVcBjOHuU`;r=T}>( zTKrbt{*OJ%&BFa;Sr-J2AlEk}nweLw7mP;BT=)8nL95O7(`39GWFU&qdqX)GHZu%Cbt7ZYq1A);E+}*o{kn`aF}-0nMZ@Z(|RA{tJauxEl? zZoCKyj;q=1H`oVeIP&tqmbLByea}k28Gs@mx-Ql&1PaAZT?_zY<+d4HT^&nXVF%8d z5x(uN=%C=%Bqm3|aCC#YssKf?^fBxpMThdZPMet(!flhPprL@cJfAK;=8=*%01z4| zyKLF-uLSxZpTBIHwwLHXA_Znr1${oqai*Ru%VjzeDA*o%PlEiOYB8N*=X{N=_h*t= zadgBb3MzQmzr*om(;+T;fQV1xRJdwBzo6{>x#YCYzNXT1N2QB)0Rq%LIq2iMy3$pCFA;l}M-2P8` zq#W9aB*$H9CfmfvysY=G4`km~ynd#Sm-OVxoduJl?fqj@L?J5#9+N$GW3Ls+*RZk* z)`~3AKgSd0Dy`F{eGjnV$W-X?m6?AvO@me=2G!H|6^wv+ir*<OdS$Db`LG78 z@P)y1T%aqu@0ZV^lnK|1YbWWK1mg-{wQD$KlEZ;rbzhD5o}_ztixz5gg&jZpCK$#` ztT*b~?@`|G-2;&|IG4dC+FgwATR(We)(+(tA?jVOI^hdL=aVqAu8~0zRWa5?-unb!zqKUO?*#r1Wuz zaOf>OIhU3pFUPfa^9mneBZj&|;3sj5P1VcmpUltE-<6U1c%>)n$IQdllR)axI)U~u z3}1{QCjqU|v>IOdTNiOyPkJjg6F(8e1^{33<`>H;4ZfiOzh7teUL>=92(d3WX3W+8 z_xYzKLlWAZ@ITxEs25gQ#YrR}H1q@KQNYO{K&YJgd(ueqE^k8oLYiYBrHOeB3CTt%LRtI5pwnf_)%|ADt&>!Gi_&98W_4qvqWA{u^>c*C~O@w1Nvu&Otj`r9)^#Q$nBy(<6x zv*ll~aZIaGEh7^rAymoRTDmq!L-?7l_{diq&*QauoUh_DU<)mu9D(t=nB{HXZePwH z=bi>dzKwx~AI;i9NJLzX(RIO<;1OGAhw+-kqV8LeDTymK?;Ct~yR9e0ibyWtYVACC z_&t8VqZAqlX$$NUFyYfOdE25Q(%R66+ijP^>z3t$$jx|Z@~fci^QE>%5rD3VC#%-X zT|iLNb*!j(>>ch6N&8Q*-x8jCMDl&3dZ`BFR^_Nm%X4XJeX^uDlf z%mStyY2hl4pby<3VEBDCI6*XOI~w&qVfBx<>F|-`D!pR=v>f*c%08lpg6)3+zgDBI z+|?&RyZWtyUXg66YoX3_52wM`aS=m~#(uui;Aih(G)7HLU8+Xao;lGP8 zLn#{2V3X^f;9Utv&_T#9SD4##hh8}YXpR0etD$Sp+k=(4-i!ylmIYkOfhJYvlH#4KSr*Fejt{G~C%b0^T+4HrRf~lpnF4m>Y*Q4PK{Ty1+)GY4GrAjgXuFIzt z`w2@j!^KN@rHclED={e1uKIcyuQ0879|sV;(ED@KmXT-iNH0rF#wusH7H%YYbAhR0 z78YOs=gF1;y`GG5&oW5!8iaeW;ee`*e*hxHl?&*z9p4*llIFaI+E51?!|mCF9rF$l z^#Q}YuOWesz%Kq+fZXMwLs#?KK;s4p{A}L-!J^1DH0(ZU;=kSVx?#_jD>p@LICyy3 zYj+yq;`77=T-DDSZb$-ssCS2MWjZBd$WJ9n!=MY}?cSgT6aYZHEG;Z>%TQS?Fnhyu2$;47# z4!@Jm%c8*588;RQST{vsV+IBUUXFgF7edNMUQ!-&fqF4F%n)gy7DAy-=# z#k~MKu>^DG+W$KQ2R%7P_>4KTS^#SxA_CwN4jt7CN)Y~NSJ6sa98tF`V4Xkhp53o1;e`@@v@ju`1g%A;b z`$B;7oIaax4=d!|%4Q(0<`We1d#i&8=o`#gnWMZhP_@_}YBjm;{Tn|B!xah{Zy5p} z*~&3u?QA8E{}E~329uJ$cyPzs(o;e#0+>ms&XBsm?t`K2jYPx*JGUQJPW>ZSUE70= zc;ja;zwQ(m7k|tk1@2QIao6|Lu?n&#j3t8lc4Ixfn626?QN3@_zqhH9Ejz_ouVzZg zt^?W37!)!KbG-Tl@L_8;fOOdH(au;%x-1{P(zY44XjM-c$qJ2KGDg3@U@gdkxiese zQCmPn<7U5(&OsV^JB~zhyS_yJ!oA1UAS%+0cg)}3hJp1eM%_u-gF(6^CX@4gG-F~$ zW3@wR7o6QSgQAHKV5k(+Gq8ogO2ih@)+d5RolM)*|F0*INOc5H5d8qBg3j;)z z20%ZEFups;-!U7OH>{yCa?G2?7hA6U_^HDL)Q-uW3@jilfD2pY6B8hBm6NP5c;oKB zg{ZW5X~|dTY=2&S`$P3@8iv0Y&&Ezi3%SpGtQXK|4LRyqaHwfz21Regl=R%o1u=SLlfzb1jU}&g8 z^G_{!(qP%+{c@9Vr91D>5I{Rz2q1NETl4*Z?o1CucA;WFQ%pBP!pgPEVC&C0`g;xk zrmqh+zEn^{BxYF4+FOkla5Mxy*YX?o7lg?cTxFi30P*LttDWl@%%1ZL-+E?XNn9cR zD99-f7PLTr=Ks~p8bbM9jQc}sU}#jhcz|Pu6Q6O3-az(t(L-eo560!G40>} zkHj4%7qr)bdIj0GbD`SVHfMMeOOK8z^PhNoH08>1_Gt<>{&z^l;s0;6WrM6J7k~`I zCn+cJ%K`)+m-=BJXA#t_pZut?!dWA&vpgeFOA_mH0IBh_E2rx>!RBPFLtK1t45Y@a zA0E5u8e+Yu4buUD;yR}oAx|?@G9DnIw)-ksVqH4AKE6Akwu0U{#9WU-TxSNh&c|)x zTuQ}{X3X!F8`Bxhhfkefzm2}W`T0ES$1>j0{Nvvr_g>c0I(XKBsc*-*WU18{9$%&+ zZoD;lgpl#AQ9nhsfHibsZ0p@9LLdE{J&R{OnP)>klvQFF$ovY-0H4UD!9@mDWd5MMU67bn!(h z)G6=+a$>%AdTqYJpSKmEnJU9|E8 zuQ?5UKE#Y5e@M-lXdu6`8XHVxokNdjDhY0|(q0xzxrdof7z9+7*i_tQb^pWQ-k<9v0pCXsMj zcUx3C=afZjx&MB`3t1GMf!1tNO8C2XVQbwGwl?4RcybC7UKypGGJ|a2fiIh%VRhY{ zNaNV$+tCb$T;ml-q&43nfbUrw-=6E49o>JspDGf(yCFj+)1my7z38)i(t_#VMo^Xm zndax%Voxu+1=~3fSjcnU=l|}-&gcCwpHZT72P4#3XM?^y5@BxEWc+U^V3H^$X9sPr zclt+lJIKD$Nj1~0j6tqriT>s|!`W%Jl?KV$Sb#)dGC1#Pcu2x!I9X!BMjII0?x=~b^d9++t=EiX1S9E+-(PK zgONq>{kUVj8`V1|nHM~a!qDMlb_7?7Ae8bH!(^OABWF;jQH@*8RIED4I0Un01+Tu8 z?RmTfowpNl6-=I%@z}=mpqWB`b~$YcmAo4z`QFAXd5Bf#8f1t^x7w>RmMIe9dD^ez zf-}xQ#Q7Cd+*(fv^p+(<(Pe&-6R%@;Mp!EN@sH4NreZ-U&Br#f|J)nf?N_(=tazBx z{^vH;)-Vr|X|NJWWcU22<=j=>(%ue_k2CmXXm0bgt;(E1qD*w(3QrkNJ$os8>@vzH zv==S6f|xlC^Nt{he$=;ohe@oAGyG9m=WAo$iL)5Gkx=TX|2bJt!|$LzjC_IB#G6l} zdshH?aj`3>m#l7$GJuur` zrumSj&o&jGwft zuxb$&mw+%#X27M9w?k=H-pEWPqF*pfy<|+cCp+DwQS{E9%*yzu)6mBULhKPVvyCV_ z0o$woDv+ACB0<9DTs@0Xq~<>N!Dc;yo%}1!pN#rMV3uV1wa5}=JezKI68&C}ZK|-e zDN%6vYi%h~Viy+H$@hm3hxhpAF6Nxw%d#E6TT*CC3hpkt9gvAW_hPs5j;>%bsluHz zo+Qn{4VT59hOI~kajJgC53Z9r@?VG0PfAmd*^O0Pk13B44F66;o-pmIu*?~(YmF;g z#@QO*{<={0OHv1hPKO>hzv%$yE#;zRRY#a<3C8af?YSQhhOjLh--25c>1#5}oQ7L* zHGjyIG>vn<>oaNlecsA%*kHcD`Gu^;16>xp@e%r6x^;`5 z6uRdpxYG;kjw?ca8<_H9TOYhLCf%P!%P z4!;atP&L*-H=mZ?UCp_vTXvplmh~PIJ5J~5QgRRjI#H4JfPb;a(~9S?iSL{pYA@y2 z+n)_n4<#xO4b>m}c94A|+d671my|T3IOSm(rk>?W7Gk?@(d|6NV?<0?CL=8zlf*(X zJ2=1ok$Az%tF6yzwojip|MYf*ef?cum^vI99u~ynuhr> zTbcVomh;ZM9E5|Mjb!^w<6pbz68xD9%-?b$a>8Jc=)TJ|m*a8Q5<zB;A3o@n?V0`%k zApoyU1Ckg476^jYP0}l2q(krXQ<``PpWHz`!fgALZjVwGBmugLc7@ zQy$TV*HGwmd5%)$aFaJ_j*@JmzkN(CjuG23`l5+DM0N$bb0haBO^8cYFt)&VGle?y zgTC4bIa9)(9|QiO#ch%jSp zbywy4ZR2iG-r!7{6E3G?_LSmArYcc%${1K6-KM-I)Gjt4gvzCh_o>5_bW9)W>ayL6 zXEyRYY>q-4j^)K7w~5FqYnBs#%o{`In3wW2s53$i+bB#vr zGk!)=f}_SQp~@=Yjf5JT5$S#7OWMba%fL7dCRgphPCaRLws<0k9ekjJwjMtAwHd5O z-AhwJjDatq^l>JE)W(|eb~@FZkNcn#S91Mnr<`#G$hF9I;Of+(tweS*&D>cjC4>oV zxifi13La+0BW+(KK+qr zZUE!rvnG@$498dupOBkGCnB?cwZOV2a!DP-v2CMKDa$Q?PXC;xK-Ta&}cL40SCECet5mIBmI`9H8 zU`&GR+%)_URS_YsWSzB1uXj;up=L_^%ttObBCA?)AK$F2cV4ztJfnN6HZ~&du)!Uv zD`qKww-Sv9$l`oMNx!VXF*_Q_z#v~h_Sg)<6nugZQ|_1$Kt-Q2Y)xAB|+dC<)0t4x0|SV0Nqep z;F`S>rPH`{;+)zTz`OgFcr)}Lf6PcH2Ah^lDBZy7A~Edr#Yrw{D<(*y;mc7P?qVd{ zKcyuvvs6^}roTtrb8 z%_Q0KlZNw&`-rJOc!_PPrJpV@r=tJbsW~|5ORhbJ@*5g&vx_+S4Xs|h0>IXHyqUSl zmt3k}6CeYNj2a!#L$zfoVhmm06f5-`1I_x8_tEkQ@f2=TK9<~oM^HjLB}Z(zowRW+ zz>X#Mf|b%}3-&BONbt39G93yapeg;Wo1s16piG^ z7R2`69#Jzv&yX&=D#6fy&4q?_lz{v2$4kVyJxt%3=qc$WA8>%?*{sl53D_(23Eg6` ze)cIusI@plHZi#L)#$%&L>^WmRW<6i!aLPiPN--xbEMR4?p>ELi7AGPq9!bP$IQvj z5FJ7@R2ZxGr*Nlg|MU%|?pgdCv<2Y-N%Y)mQI8?lZ2K{9L)fyd zxlH=M#C(8y7eHV4-DFx5uynKN33-?)F6s8TZm*SmEkYH|PdI->4x2iuRMVh-LCk&p ziH6);(WEOE$Yy28_zS=K>Pk?gfi{>YDjKB_=J01CtePFES&@cyjr^bB7^h$yp|n~C zbZCKxh})XMp8~I{*)}XyX^4ZuN%hD^Udvz>%R4M`;gIEqTXBbRo#EYHFtyN%tN*F^ zabwy|THV1!R%8cwJXP|XVQZi6VURmj>&s(L?sGEI%9s{oV16B0ngS4V4L(PtoK^2a ze9()Ve};VO*qEManVm#bj?=G2>tbMYcJ!rVq!;J%d6~T#_Y$>qm!!{#OUTbf2m=}S z8$+yC(B?j^AVYCIk4$f+impIXW`uOL({*QbKP}a6>|y3=O4}{ejqu`uhZ0oiLnN}q zU1TYT@adj7gF0y+>>7t11NyXf3lQ7o#D9A7u&1xL)-F195=Ax+hfu2j`$?uW&=qmT z#(XYMnv(<;@IDSe>*}dEU!#ouBokvhgLtYl9JHo$+mq+tM59aoAoZSu2_}1g#3Idl zaSkiv%pPHLK<;{ePBihsi1!t_1@};U$qsD0H4B&t?=~UF4^r1G@luvYBWv&sJLS@y zL@tV)W(}TqR`ymQt)g5MU7?v>Mx5jnm?E>ElyYhWyBo2L&dMO7TxV6<><^{|pEM|`Bzcq}kN?@7e>VPIZ0$aQeG@)=ao1()!pI+?5C6zB%wdfH; z_!AcZckih2>@rw*vfoL?I)f)-gn3kyg+B-Xa&k>YOdvMT#!1anF@p|whmqX}727jJ ztFwcpRsfsXz1W5;2j}8kpFCTb41V>@4<3yH!XohfU}KT)h_ob|?tI=Q4plM=0z%86-EMi|@oz>7`f5 zYQ5aAoWYqv@>iqRbfz5DGB_cSjRSOCatWa8qGwJk2Ye}qo7gbFQ=MhRPX1R549T-N zgEuo-Hm3E{9A!k@G!Z$-p&tf!XpM~_=k1gb`ZVjQnox(RfE~uy@35ru^PIuyJYWe# zU_cL8D*N>0gfc-Vd|tX=JL8gMB9o>kRj+8GE1X3Q>=$|&vef>JV}qP*U&6|as6wnY zhn2L*>xdhTwMe)4?RanuJuA-bLraB&_2zo5C$el)iB?Qi0XXA!_J}I{B_Chj@+&OlcZ;P=Z(x<0dL32O4f;xA*imD2hF42#xa3aQI zvpXT4S{L0rKyZ?pxst4-l|~Afwx(JVzK-eit~8-i8_OBqcVoig!( zyYd`Fmvl*|{L(Cn(~OWug1*2SvGW?&NXmpm*OB6-u!`qYB#JN;VhIjV&L$=^YD!r0 zR|r>l>m_DGmp?~KwZ!u&yLS%)AN0`-^%SlP8>su};HZsG$t&dE0@YIs)IK8jCk-o> z0Q8)GZ|b6Sc+i}knx{i=*7YK8adf#bd#(hiYsGbB)_h9fK0J#Rcnl)SJ_}^A5ss6) zu#`i9f{eFMZ}4+P!ET1U7FC-798cs}3uMO<8>Trctyu;3>8GXesC^tHSG7b^zM%E% zri)D^GGMXB^)NlP^-$fb3of zCbQsnvztK=6@}opz9Q>S5Gor;``pRRj7a!t)8KApzGqANK5qFq{h0J{?gC&BheBY> zNPcF|{Y}xcs!!f}+3FP{u;45P@Ng0%VM!J1v8Hrmf({(Gc$3*V#2dT-u3!h>YzI`X ze;l$YPaCCZ4pDE0D67+(?QdChle? zLLX^$OxD(BF@&%$Q!?BpCP>sm&~NBns@E* z$MVEebtzWL73iJM2(pwseZ2;NcL9Vm4uB6|9H?=Q=CSH2P15@J#J$Bz@(!lTuRofi zT1CY^9gL#T^j1xP!`LxIy?iB8qTP_mbO0xGgVahET zPr0`^;6Htc$sWz5KL>L$nK8XY8!l~2q75D^KO^L^TVw^|cZIHlLu^?0$+R&6c`=_C zPd#x^_=HZJR-TlzvhCC7Zzs46nt>?ahJ1w_J{2d_HVqZUY3DK09~0KqOr02Vg5YhQ zAHqOA4iS?WK$o~JYj7bD#L^6gIpk+qk`7XdnWqxxS&@77FymA2Dd7q+3g}pm1vfxW z$k%|GVW|G)Z*3ZKD61pn9a=&=!+(HWqBA%3UA=5*OExxSz>kb=HMK6Kb+G z$JzpEq9=4P_>gOKk#*kUY|4%uVlLCKJQ!&S#@01RBFBZ#z3n1dX~#;AG&GMU9{wF> z0m$B$d(6@M3Km;@bDU{nO+V~_LC<&z9dih`&c{lfl~cM%*H2$7g2;ndr7v>ZZ=^n< ztP{&TCe%Rn0H#~aIBYAALQ4ds5&ik1n|o?B*0h6eQ*VTH@szz-+-_hRp`z=D8X}KFESE}|HAnV5Lj=1F+mKu-G`sv$ z$xf_5yaI6rV&g+-YZ#%TstECCjwFZ3;)v}tC&T@yhWV`m>Kw#$>gz?etVmz-EN75< znoZL!E|`orp*nP5|5W8vO*E^{iCd8&)8|U^8?w?smCl`5Y4B+>YC_3~M%~lLRBJO7 zi8AwbP6Nn?B}4edY;4v5PhN9DDUc%0lTn@HB ziKN63wGJ9X_+x?hc&yMB?qZPw8Bb6Gq$ka|kdCU(`N&^1rk$zMxp0kwaw99Kk*7gE zb@2uA(lv_ME;|C@fYE*H=R>DjqZIKp;ku;VC+MA2h8fgHkf&bllQ;pU^-aR;H7wi= z5R&6p7?TRoBMe*ad`i$iB*@`^8YgHy=$L%?vM$Xwk*sE-TyG0x|KvDl1J;UYWiTX_ zA(Z4mLWoSF_vzCgnsQZ`tdx~aD4X;k0qL7>GM;+LRJ6t-c-yYIx)X2vxel0HPem6Q zdw0^(S3}fW5s~{Jde&?Wla9*`=_xc?Km(3Yrs669t}W=mA})gvyc z5*N&KAJNRYxs^!k47mYawTartwe*;9h3aIfoGX-^VxK*qo_dX<=LHsIoH(G4cooa9 zE3;uNvGkatqzhvpg)^@3S59KY!KK-U+I5kw_PGt2T)Hbj?|BMgoRc}6ZMY@^dCe!^ zkv3-;U`4)Mn$6-d?&u^=Sw>1(g$(N%!Z zvcwY@0cd^qV%jWS`r&$y!`@sU)Wb}zaq}lFdRaSox|j#MMxXAc`6C$sjFJd4%qkU; zhY0dNbhx^HYoO9UU&-K7QpdqI?c$;KKSK zS{GYFRI*UM@|JX`K;0iOK{ZDP`&C_Go+CA&5n6Xu&W+P)u{VQ}$CG$K*}qMxB%|;= zo>cK;SGDMzIeC(b=&BsscTzNTF}8UOxqUy;sE^0U?CFsSh{S3%dvbWI5TO)6gpWWO z)Si`djsOqRw-#%#Qt}1u0KvfgPWdG6a7=^bgYihnVjW2Yf`aCJk-IvFJP?y!xd1lO z3UXqREK^~woKEvN1Q>czo6)(yFPIeci1g^A8k6A$@*?gdm+&H!H59&5Tr;Nwv;p9} zNkSm#A`^w$zY~WO=1N?7X+N|~7DPyoLy7V-TzE${V9lgt9~8zIe00=WoGB}}QwPo? zs3^w1C7$@2uVP_bT%1CS2G9<`fb?&kPlzr(d6|*Kj@)mn5Rv4BLUev09{s00NKQqn z-9Xh}8IsOBylyI_T)BXxV_VO7tKREp+mZP;+}Bx#W|C=)sAxF2hA+CQ$4#KJ98!r2 z?fe|lDhK@35Dx$w&G2Fmsi7Qh2A#>)qqb14=`IbKa4}Y1NB?kj*Vv=pn*@h_4zq z)vhe#^1cT}P!+EhU94scpqJvfV_!;&Wbc7j$n5;TB4C%V^k$4|OG8HaXE`Jv|bc9c-4nk!yE18bjP5pi6${Y`ucE)TKUO8?M-k`O)NYVd*90 z$s7}9Clx-KlUj{CC{t+gyBl1gk=S6ZUC)8rxehGPzWA) z=KiB$&Xq?np}^NjOU}1dG0+0r|}t%k}SztVHdj^DZl~JetA| z@6VXV=We1#HsR|H*s-!n^vJobv_4CZ7k&`Dh&B7nbe62drbH{>=z#z~SupIJ5cW7z zKiN4$x*ST8Y}ZqE#QBVsO?r?oE-^3tMN8O$ov$Et7!{%*+S6*$nM8(s15tA=%9aZF zY-dUQb~iASq7rdEW!HE}qb^j9r5vG%d?uj3M27&Hd;x^e*nkwse08}}a$pSx$LoIc zz9U@}Ok$PeA%b&w6-Oo@D-ix608F_O2=x2Sy?xL;jyOo;ShT^Cu&hPqk(-${ zJi8@H8gnQUyEK=Fhh@P&eYzvMDv#QlQQzS%H~iOJost5*8Au{TS7L#DwLDr=oVW@Eb_ z6L4#=N$=wiP7F02#x&a;kv;H}@(FR$K8t|MdOak*gYtC~;m22(I735)9}}}rRVt!k zZ)yn0>5OM2d5e9+QHHbuIL=`}p(GaK+^rOhN0zt0;}b`*z(4}p*8I(DEF96}46N6N zMchY!Z5{JPP!!_8b7tJY}NYE)uKvj-ByUcad2%g5eCm&y=32I-|fy~Ie4OI|*h^%ZgQ z$19nS^F@$J9N48EzakL60Qq`(zn)T3Jk>7BRZ7x9s~<9VK6I!MwKnc=HHv+31bJ=9 zJ()FLfj$K2@ypCf9`$eeYS`#@&Np;@m>1K#Etg zXqNIAz9xcn7A;#mX59BxW@#TpuZ)f=$)M=l@iry$h&I_Qfzoy(g zF3==~)TEVFfUlaw0wT)5d|AVCA4`d4HOJDR-te@R>KL3v@D9d@>&U8~H1TdI4ykHF zHsoW%sATIIA$>aDi*BwmqAyxWJ`zMuW6-+5D*d<&&R}(l>X?$o-G{@EpxdL^Sh<)6 zA5N8SmS{e5;B%+D0pp7=GI=pA<*GbAA6}7VPMKKf$g3wX1cJEl9I%X-!e!=w&AQD| z7@UsJKgFDvivcgFKIN)JF^)vXFr*GPJD98Ppnmrv0UY1ok=`0y4zdfYyo z#S1M&SMligVv&bf*@+`*b{cQnNw*F%g+Yrvqdf7{28wUDk4KYKR3B1}NW*XoDWHG* zrlNg3fQq0c;5nETo2(0@jkKff7bC*Qwb zl2b@Ar%_5y_*+<)6q3gYdDQrvVvlL5#8Ss(P6c{}h%GbL2=`R`z z$*Gs)xJm%sIHer9g_O;e?7LY%v-By=dmnyS<8xyDj$g%kVw3TY=;mIM-~?9kJ|S<8 z%w`iWm7-dpV&UQsNWm$^o5ThgMKsMuK2!+?afXxU@x0%xVm1oTF)shRi#=0-V^Hn&-r$SmuqmQDdVRK zq?3;QvV9B{PkP)!8r-0k!Fd`WO*E$*av=d3uS^Mq&x8eI?^{@ z?tpT139sc>@jNO-xFJ;Gav}tM=C51qqUzqf4-Y}D`P{Ea^UOvRUG-GMd;k>v-z5}j zFsB6wG=tkv=zo{UpnE9plEEuveQdX;%x0l7U7(C_0f+6m^AV@z>e$6bk`&af0&$FO zk2P$)MuFmfq#@*_9q#Io$uBX7DA(x>+CKa(v)~n?IUki6msGKh80jZr3njw)>iu}_ z(ANS0nZoU0?DYcbMiS=i3?9!%&FC=I3q=wpA2zA}2}osxaJkN4!wh*SvOh&Ep#+EF z8IWJ<(;4aiViFQKlvTh0B4MBT@3Fszs!5FKr2tg3zBzCg-$z$LarGccAF8@26!t6A@S)KvpPJrzJK=5rpseE5spwbZk{w*HChK;;&=358rk%I54z) z+<_yL1(wdo7x_lJR`H5nw%mQO?Z=FGs7Trw9nRU&&vXx?1m>3mA5 z8?>DDn2uhtr1D3Fv6=8A70pO{5*m^7V0o-S<1@aoA2BT+jK-DwX5*EiTfG1BRi|L1JdrN#*Q4nXL)PFfllAUZ?Na` zzFz@_V~2i>ZkTnM=idF`_Q)v{yE|P!mY(3Kf08@Cb7yn|`q|xMvx0HhleBuq1y9k^ z>Gn82qTzavmg_5(STqkK&GQ5P)59aA`y$QX;=!d&I(^l;tL#aT$g=L2NhaJX0OQ!M z49w9_Hkay*uVKaw$yGMcy>aP>i9JuM52AMgxnbZ+rO-l}XcygsLz3QxEBW;vZm2W` z!^E1(#QFdu-ktdY>kOc&Bx;@Vz$VgV3e{P6fHdYx80l63z-euupN|Jo&%L>HyZKd% z-g<+sW!sLp&$=O3nnq5p-sEueZX>la>{3Df-R}6LVnyQkHv_Uvf6H$Cmo zw5VR^XDRNfPxkWzx^~Yw(m9$kxp#E$`R25NA9K~!(L*=lmN{&Dzx(#c<|5lWCjU4) zpv^AIP&9lVUag7Jd3S@Q-=BzPP_N8KW0I5__wJZ@%KQ-ILchNJ6f(Dis>>4pqDA6x zyR66#VPZ#3xwjHUEi19GPC2Bghu!dV+Ju3~>SM-I-HFzmvW``;-#YL0m;i(d^0Whv z4yF5Xp+HZbg3eTkaev)my8vZpgmk`na?Yh0)Qp3QMf!c6Hl%Yyq*a*%LNinRcS~#v zEpxAiIR($ZKM(D12x_|BAHF%h(f&k;!!rZ-Hx73O?o?c~Dr(sl^TFZgw9MO=wp?nw zQPi__(-G|yPHmp@-O?@9Y+ z;W!rLXM1O%O}#ScPgsyX5d$SO-j<6dIi9Ix?|8~BzksP)Oq{G{ZzEsj*k8uO+>9d*4`J+9+KmH8>qdqks+pNz>BpUC2yO*|98FawGVnOh)h{VSyCGn+1H zfQ)8ApqvJtX5F|JfmCmRV<|xA&y#PsulCU3Dsv~+(-IC+tM5OCQbs8uR@8);>Xe+9y_l!6p?N@WsSx#2h+FAgT=^y| z-acKA&Ycm`@fWOmRS6I~&en!0F+@0R6SSN22W<{TXSg3MAfM`U`%t8OvudMIsYA2i ztArqa`%XGWXUU-j59$E4pN{CP0@C6?N={;Z@MXdsS5x`q#+%KvQ~-s2*>eU@0gcj(LNEpINTetWRq(%!3f zoY?)>K}(^>H51v1OyL`xZLrub^T2t?EQ&TI-d7KZab=+Nq$y9`L0aoA3C7Z$>!Pe)2$5HIjOO)dz3|)p$3&Fj zFarp2b;LXzdMOb8-mz^Co-W%qYj@o>UBob^qsCW=3P9MYF4rB zZcCEMmOsN+Q(w<)_%(kZqNu&#aBqjzt0T_CL+u7>doIp6@F^??fAewH$NM)fl-CZn z5V7Ii*V^LOKX}(Pda*gJ=toyvsKd5TskcYc-5rJzo8=O_e>7b61-GDr?uQI>MuM%U7!DKdgK0YUCs9@R=rz=$AS&Ev6Oz(qN zb!gWxL}Fq0f-=<$51TOOIe17%Un(PYC4v+fUfe=dR2+_~8DFx0MTYooD_@Y1$nV@n?C@Sa$Q+!}~iwL(5kJbHpQn`9u>z zu&on=F)AH@2Nvl=kyV#9st5NrfX1$eG5UEuoI(RwqoYuEKlcEXE5 z`pFkz8+?gs6;hDa$-q8yszH6KUj%w0jijO8XOySk9JhI9|6)bXQ`91?`~8ZMzBi6( zVO`4_LS60~SZs|MJur%krmjRp0r9rGKiF-yCJXlfppd~areo2wb%qn=S{vl%I9C4HdZ^ds&Fi{ENa)xF=^;%cag;aaN>q0Hte~} zp8Z&UR!cmDC3FENZRRUvk$JW+u-D?o5O$1=&X_f{lm z5uA}f_Ij<*=- z#`h))j8gRtJ~UkJyS=gBO)>Z{Yfabf({GHgy!s%#c<=hs2H66nMX_sh;+w_#QT;(v zjxW5}_Ti^{vQ4vl?6<;c+n%@F`21&e_0a0g>=&a4!|i>6vVhK8EXyq2Kyi_XE;YHLOTof-oY8BqRa@H`AeP<8z$8`~U1FaYgbxepPq zUCBe9|sa;LUh{^4#1|MDuwxc~*C@0os#nB%Yj;Uc`FcTLmF@TH(Q%L3Iio z3-uV^Ds=L3Xh+ZZCYtIGvp>fV(dc}|w$799GPfSRMtlpT=j}>0Ht4x}sXIQhEHah4hD1hS3?{ zy16!5mAE7aD)yUU4yBYMiAi6jKu(s}3C}truM~QIrXrYgnz|gXWbZj^fvhx;N3awn zqK-+Wc^FR@D*eWE*OUI_W%e=&-p;rfXc%6ZnaA&C)vdlRwR z8P|2Glb0g^)wi{(|7Ym?BtEwZZ5Md^P}rDIsGjj0EHzL?;2BrIqv<0F<%#z>Z$n>P zEn^+7ZG5MnZZWfE)6s=(Ltn2I8E?5AU+{(=J;`TQ+rb|$pIn?8N5(ae?U$+?AExcC zAV=&LUajS&jRac67NnDr_^_KM?M}c2a-WSPk(GRhp5sPq2Ag%lk0W#Jysu(8r6Koc z$UBBT1Bv_NBm!Cf22zjid<7nk;%Y>d6@5#uTT2#mMpoVd@C+t$yf)9<5_dqi>(CqN z*wgCzkds*l3qq>QC7CQvw|O>B0I9LAypQr;K5?;rLDvT=y`Za?ZxjDdR|npQj(!^0NGbmA8fh?$(#2BP zwPlPGKS+1lC!f-szSU7HlpwU3P>wU2`mx}oBpj%DlckKa?gIx?V?%@ggztC`gn zGC=>b=;puXis>gg0ace?D3kW@cFzMff7u~L6KGlh!V9kKmHo1yUzN5Ut1jjrtyIR1%UmpDvEmjX(4KO5d+NpC3}s89%xI z^`GDRWvATMmiZ(d-_S;@d@*pfWo>cM+>1W~3&#%rNV91kdp5N5^VRD?R5qtZ%B^I{ z-0%oiayH-cd^$9}RWtTi5bdMxxhtr!CWQUFG|o4VG8`<`&eWD{gO&}Y=$s^eOBD^% z)2P=z7lb<^P|N!3OYjt9Y@0$PR=f|%XNa$E#pvJ`CebKf@bi!cemRqR^mY_ zB>r12aQeb*e5;_(Fz(2dt(3ZcQ*S9*PgBj5y5W)`x7E?@KW^*XD{>t5{Ks6s{J)7s zCIgpR{$nmzC7+r~_MXx}sW*$KywS&w^bD|agElwVlIT`x7jO%2fS4 z?tQd=87~;i+@O5(&onX}SZzicTpJlu=<;3m#1HW?$<<~ohUU?PA(%r9Hc`Lc`1FF} zbIaqC>!rY6qa^Hup-?rQT3r=^p7(+JXe1%upv--414|Gz#LfDcu?}8Q!s?k$wbKx- z(jQy{kFauhdn7IPvpns?mPJW1`=1QHs4e50eEKGprSyY7<;|A!lnW0R|Xte$z5cVlSA zR61m|Ji#0%)SfT&BA_8nF3r_|u_3N-r=P6VUG4DNfP}s5Ch8Q;COUQ?g=@osmNlz- zvQH=Ou~)%gYes^zWNHGlY}tc!6cqRXN!w97jgRIrGH5bMhnGA%mn4c1Oc5cxOXqpi zpFc871A|h@1Oq)`E=T|I6>6m~RLyJBvoVK&NcsS>a6n)8(wRdB?GrZD_fKTq znouMDuI!(6b29iE|M>2weJ%DA77kpU8_2EfdeqCMtVrE1p12u8b8 zzA3w&^g7IsUF)J>tq6+W(R+9G`u{g?5i`buTI}x({1EwTTHnR)urEPJO%-y&P6f!% ziqApF>=WjM^H|?_BI_(ibp_iRj(Rx>2lpkswe)zl4o|^;~YBR8KQNAcz&YrM`zB)G>2~;X?MGVT6XkG{!B1% zsUQ=st@`w1ZKL90%$<>x6)DkezfQM|TiyAS?O3#LWagG_dp-uQwj5g6wYqII>6%82 zU^R2-V(Ok7pN4LXb^M)m`82h55i}nO`WAQ*1A1{skr566du0L;mK8P+XA5-7_AbHy zMt=jm`zYB-N^j`14Xw{dvT?ALqGPL8x+o*2Q)}Gd?Z?TNVFGnU)t2h#BS{)Scw{XW zeh7SLwL6^oMHNaEQXo}LZ};azvlxx0hm+Cddvn+5R>f;`*S$YM$b|56#0@2@j=Xv{ zCi`e~^VN-(*I_w}`m4@U=S;h}YVW|%_52|Rp9zEgr5~oogNwbrYXy%}yN>)gT=+e% zq{qZ%`1+UuEGk7~#@0gj4-o}pLldm;bUlUTE1yG`K$}q5A`^8COSy)oQSG{^ zRPoGf@;T1c;?-x{a11QFJLn97f&B=AHQScP0+= zlaZeu1DGv4Lq?dIPeqp);6N#)dCYo~H9L^-G0cmVd0mFixborzmR$fYH-5s}d&J;S zjk1y@{LU%)AbVhMI&0O{52F=fwbBJGy&tA;@cSzG9DHwmL3|~_@SPjZU;7SYT~EAKeB$Shzo4&G@tC>W?Xw%3T%2ZD!eG zm$5j$hqiNRf~F)-Hd_lYWUpG2<{Spjns)-LAQ&dQ1GF7*sPs z53A7=ng?T$jzg>EO{X=k5VWy{17I#fSOzzaYgo+dq^=jLJ)0yfpy|a`oU1!#&j=U6 z*L3>9jVWsa!YHIR@2tQ4oSg(nVY+7tp;SajfAr6qPTjNaE0|GaW4WfqK*UaxG00xtrWX`^7IOFz*+leO}DwXEHmIT!J_Z^v%p=|LDj~}I{ah%LSTA5 zf@aEsJ}BcUNA^Jfit}mF?1R)&f~$d0IJ#;Ecd+{4pydfppOAYZLVEkQQ-LJ`9ZD8R zqrOU(dG<}#`LtC|tz(~Dy*eGd_Jn=xjjKOZbkp-s6+l-0|;C@OmL&*b+*-?y?;2RgbQdu+d)bm`Y#zocUWv7bk6hbFgd ziTJbHYv|(9O9f+vskd*%bVd0f9Im(u**7kZ$&0(?sp4BeF&jqZA}Cj`P_0=+CBk6G zQHsyn32FT@hvn*N@gxUK~ci=yac{=*%Ii5m0R%>be;~ru*`0Sldxr zBFe*ogk+?rmSs%UooL7K#wB^wpVgd1SH{^_Fxf7Aot1J`!lFS%!eNWURpR}wd3K3+ zPFU;frIzk0O}z2-+lLPZt^#tagEGF&nGy5GWZcF2qV?<|pJ~01)@_{-6Qu2cekgl8+S}If;_iJB?RsoFF`BgIa>?;k4!u7^u zfu{jaBZ8fgaR6UuU~F+632PMzj|fX^>D2^T!?272uFRdmh>0#O@Uqfsnl65gk~~lH z^c6e^qCU|&8Xg8PM=G~t)i^IyChGXwr}y`BD#GLl*gpK2u+UsmL7hH>>U?$8OOz$o zDn+wUJ|R_}cxC}thNMB=JbL%w2If|&?k=rh`Rj&d`V-eX+-x(xyU7AhcLN^!>xkv60>1+EV|_ zJ=m7w(3>{8yU6~I$tG>g9Otf}F5*Kcp@v-$S*UTUCgc+z%=I_H??aadk8?g<50pkA zdh|*CGSfA@o0%VBTu`UfWm_m-vJ>M_ikEI3>Lo}Dnf|YnaIFGG*s7VxA{}}yTALwy z2@9PYkpEEUZNrA>jXQfs*UtPFE+^E-H@w@QL3D#UD=aWQ{m`b;pVd}Q-VWm9N~V1HA5MAziNkCoq}uWjgedv^MS zeZk1Iq}14+EZV@`nHwTzzn?nxtoPdg+i=Iiw4cxS-uS6ot|y!zBKMlss|1ZaRm#mIwk zFuvkS=UOAm`V)p6uF3~pY#@J6p>q|mJ@u1b@Ajz87tv@i2d2fvqF=tf8bmwyz~m@q zK<7g8_)s#j#R(beJZ^J#!`O2wOHh5`M$*c`o~|6Kk6rT}Q`L{rXJL8Y%dTyI(OY~x zsikdTsQuxBh-{9>tV4Sqoclh?-*qvW(_gp!SlZU(*W=?{huqJ*-}OoS6F+v-b?nLH z&p%w82O|o{c3X|p{XS~`AJRy0#T))CG6CHl10u@APln>yKa@(n2?l=;xX7K4o`g#F zxS30=cQ0z7IYl5aH$g?~{K@xda*8|z4N!95GR2m-CujD3JOo?TZ|m~@+7t$64!8x< z+50%+8Ppy?hcUHOyG#mb3}kN5{RtF$ujIQh3cb`UE65ARyw1lW{^ot2O>jzvj&K#V ztZRgRH8Sg^IDdU)m-y!k_bsnhc7aW-j@<9}1Wg@brxWde41L087cRIq&|6#L&>S{} z{{;3u!=Da)8@;%?=SQ1zUR&0#mgjHcUB=o5A&48>HEnEGSI`4==91W-A}#UWd`@x= z+=n)S!y3{fk{G=8Jvbrd8n6~~g?oHSI?wbl8DJDwXHIZ3WL{uAMlq8gq`KMppiU7& z1_lGE1A5BRZaRj6Qs*(@8ZAemV!I5wf@VhMV;NFabSsse46m^@Jp2UB(v0|uoIV)m z!WXu8yyKI&e3k&_R{zt>E+Y#Cyj!y2&M`s2(ZRL-)rqS=c)U7goV5ARi1N`VFSs)|?$7g~?*(ZELlMW) zz6|Z}P3!p6c|Y{e#_RvJJc)Dvnnp3%eq)Pv&+62N$A{cwn#UTR-@ZlB-~%x#ozH8} zra)cA5M~T3S$Aqeg3MHNI98Upm*y0%d^1bZiI=cVS;SUK=v7IA?k!(rZ4Lc>kLa`a zV%qrvC}R~grzcO7JiQJHyIIU1nwbiEmD&nu5uUR6dARjT?9rlJnBEY=J*int*QEvF z3fEqZe1YVHC520ORvzgQd6*Y43=TgZ*4{j^LO)?hc6h&m>C2I6^xUw%4I=+%)Ehym zsj21V`b$4dJ5SZ0;Qq8c#dmXz=9i;)EBGF5Evc(MMEsAVGY^OId&Bs7-&qV}8I*k) zQj~3wCB&;$nW+;)>?(|O$l>_BM}hYTQ$5kbHr(zv_Tz}dR2T%I?9&8_YG4!%o^(-q? zzRW*J^TuY0&8rhNrZ)#^^#0m3WEN#MRRk;T)cJA!1nr0O=GiU37(*^5#r2YG6o{Nh zLAi}gqGnXKQ){7kjSo@_O$*F^*a4^UM>((Nw}Blw#Ox~R=q?D^aipS-hgB>CNIM8L znsDTfM#i*|M+CemGDi=60bOhTV)%)N?lX5bu#>esE>c~~n4kFMe*K2-MAFbB1N;{u zP}0IYubfbF5^vcd*d^B#guRS8V0Z3RKqo8D&qpHeQ9X$zUNB7 z>`y)3=8ReQ%{-^6JjW?Gms;nuvV)3tHC38gneFYw?WKl~p2EpgeV@oM3>%PdO(K?@ z1VyWat2mQ8WEtFfbd#jT{!SoFRu+fO>eYR?YSjTf+A{!!8q9Q#S}-)_(*BSR%RBh| z3fxA6*NAo{{0Dfmhn@#CPDt%R3)1*IpC%Jk{!LXS)BNP@CIheI~_1p?j_~2dNwfMn%Zqvju?_*B0KkbPD zLv2M&`vlh0=E{Zh4e)J~lTt_C-C+%kubJ!8zBpfOCOZ=Pe*AI@uZP!ZGh}XPxV4ct z_uMQ6x-1ApbBXy_U|j3t$oVV80QZQs6yoA{0o&TipEo~OGxs`J22hXrxD}+U7c*01x3p}} z9a$fR2+W!9h?}`kIz80Oc;ZC{TMgAJ@D=&te>fvQ#e#D696fkXbkC!9#<-ADO zx^lUxj746X^AVHc`GTt-7DXg(iX^2j5&%&6-i51(MJK;KtjLJ~dB_8I#uehhIvVL8 zmgYz&IF80Zzgh&e048CeMkwGq+eRkl2l%qV=CQ4z3NRmWHCgJS1(6iD$aNeX5kf=@JqmYrxVfz{efCs*+xto0<1I z?`I{{p8oh%y2aBgY_4>m^wt!mMLZ+dGio^0WxnH}%e%6SBF599Tbs^~q!|yn!<)X= zly3!WAG^Go&j?vO0uB83G;ZvN^HaVxb5XW(G0>W-0<0n*cth-2>-NNA!5urmwWzid z*9-(zDErq0aVM0-La}=tEK`NEERX=PKpG6Q@#Q>Q{_&*3ymf3nU+_MYAsYN~!Pljt7`J#@vDrD}HxZ0cki+e5+CIUA+Oo7_qWKi@`@i6GjVG#lBebD%uW9xBtJ(TYcWFLp@946pw_xlH8C? z_(1NJt6L%@-N5oh*TEvjRuWo5NW|=o^u{Pm#qtfIbu0db--JxIIm%&(p082`?DKrq z;!3rJh#-K{P`8r^@q2V+t7hJXOOT28Z@6pcQ-M+%pZFl%yF2;Aux8V`ze3RA*SR*& zLR7$BGm0qa)w^`0Kk~zak>+ZKQ%wK4_7O=Iue$BLmmP7s_B8d-Y}I2;vG!w6Gj5-c zzc+Mw-0k*){mh8q1?Mww9si9qT<);uk6QK4*y^0C^t=N)h7qA? z|EWN>(1#z#GMVJ)D~Sg?K|RsB4{V?bVr(cGeG%mbyEi#|BSbEsV50$N_49a7!{xyc zwn828dl7{8VF39lO@DWBRUdfl03kyv>Rh%4)XN?Ji_{4R-Xfy^HruvW7R_j*&shJh|h^isUO(N7NToKic-p{7Wj}1LPWhv)M!NYZxBP3 zb>JP;x8E0GmZDnu$X3>(bYPA(3N@Lp7%y)bE%SCt z>zWc=eDTOrDW`U!F(5~FWm7<3d|`D?%Q4Nq%ttD(&D2NqY8OTH6h~Kh3PUXZmU&MT zp8TxC9iA9SoBe%aD)+MF+6Ze2kH3hP4ngD)le2+})zha1;g|cD67)rRuFd|p@fm@- zZhi<`K)^>m`gy*Ry_w)MpHU6!!5{T`d=p6V@ojlx12+GLPMkc%R?hM!sq}H)0kIUl zK;-B@r*>W^zICjaxApWcx-3kpBEsDe{E{`^_Ra#1zl{WDxJ;GdcHfKKiGHP z`NCA_sb*G2%TP>nrGL2g%u<3vz)_uZ8Efe5*wIab;I) zK4bt|mjI?lf^&n<>$&$2vi(=dJ^r>Ofy96pQ2YB#Xi`|WCEEdXlNQ|sbm6~LWEVsM*nND zqvAAZK}`*}RS_7KnyPy5dwF_G(QhgL1BWa3B$zyLii_9LDs$sXNpLpKO+8s02)MjB zEcsXGm-m9nLineVDbl$>r-eIT&&sE3o29RWXD%3zmR8Y*vNUa$OpW_mjKhVO=5?oX z%YWxiFYTAFSyG>sJ=D9{I+f6pdd|E-mv?X>AZDJ=TCZ`*GdGj<OObXLGhU0BDs z*1GZeqf|6BERBuh9t2b>B_#1QG3y*nhN8bdst1cn<=Y1xsS`q$PH5XMKf!&`ZA>M3 z3j2DihvjOhZyl7Ry(T%<|Ffq{QLfSUd^=QoTXuQ!$0hk4@5pk@yWsgAxT!V<|3p_Y zTHoz!J&vCE0M*Yp-b4vpE2z8%2e9O6N`5N_yn5%hmonRATdgKdrX!z)S89D7r0O|E zf3Myt8NA$outFz$jimR?G}FIHGh`(A$t;N7sKq%IaA|5?Zi~;&>U}PWbCK6F_oW*6*m zvo#>w3(7qIQ(~CF1mFDs-fEpWufsvF8|)~v_`Ry-a_WFbIqr(sO4tP5Ts!nZLWX=i zY3hzLw&iGRb%1(oMo8LB`iK6FS6g0`pO}*QW@bVy^ZT^jd9#S=OOnln&5m9#TBa#Y zytW39mCQ?NtWLil7Yc_mSi)Q3l4+b;`7jtG`{Tw?pOJRJivP`ym5zX^mh`Cb!%(*= z-m!8@=bZ2Bc|N*d<^F!GiWvP8{Kp5ciBgpNmWjneJFeksR3kO2wE^ZUDR%|XAe=ImZ(SjHKfRCKr7~@F;3gxd%w&pIYvqd4pd0KU1PewSfTOs|Wf8SC)*JP+MQmi@1YoX-WV9ME5RMqgp&T}&v zt1mS3TB>`e%w0x}M`mL$4k&6o8Pxu1S9g2D+4ZexpUv$*jy0vnhlu7ktM#sa*fXxy z{&nF(^}I5==buD z>$oTk_4UPF4AuzeemFM5_sPH8?Ua|Q+s;k#^Gq2N^R_sr&mrZTeutM!U#QP7mS3z2 z>HpB*89d7Klc_y4ux7tRZSerqb}tRztlo7z&GA~op#f_3`XBi+nTH1knv7n^XI`GX zq8h7L?|;Ii`B{x>hDNhi!pYmU0bTyTeV_O%NDuK2>uJ#ks`l#-JYa+`e(3N2Gxw~| zYT!n&Ldc(k>&vTp4Xw-Vv`v+~Vuy&lfquMZe zvA^iYWPRU4L4OaQ`C++$$?593OJRFnOC(P&98vslU|~G;USmMqy(tDCm|ZwQq|pE; z%zG2u_7eYq2646mYWlB-_vr@iCno3xnpRC@tI++uRzJ{O0-hre6A`#g}ONowrq{7C520z=MwnrvylUfRRbCApaK(SlE(<~vy zs(v3Uu^xG;k+*Ntr5kWpwU&W|$q&=HR+habM#kDN<6X_de=#`k@~Hc#?MG%M3NG|H z$OWv-#tyhl`Bv}B4ZCkNJ*~Yev+~=;{%pg|E@=VF)arAFrY??iuZCh{eM2jZcnhoz z@s)G?uio)KqS<#rp?^7W^W~XYXX>#cnpV1V_PIsXt3UhBR`)m1oi>4f!Lv|8-6oHg$H#hxMsl zb!*7yr8XJm$iZhI+IMyJl`*5A-P`@om{`qspGdQh|F7cUs?6enxN(WBch-?rw~Gg^Dz2`6 z-r(=9AMUv7NYQ})SjmFwcK>~woE@%Z#`XvO2no|qUw_rJd-Bqm^2yAmkb|3Y7LV%n zI$k>&+kYvz{IQ(x=GM64TLWW!ss3)8di}Gc4T}cu<*4~+)oT7IDUvUqKhfhHZ?aOM z_S>u0$z1#D>u&!R?YsWIn||{yZ&dK8jpEs@5;-)Gakc;3pSherb9LrZliWU@!(_6y z=^;7Zlh;=#OT)D1M|ghi4C5NB5QqH1^fP1Sd=}U-WSz3q#7j5GvW+069Jh*GEzafZ zF~l7Nrv7oip)+}`m?fsM%8)l}47o=b`>JeB@>|DG%+4jnscaR7LggUliP$z{;U(Rcf=9^-Hp=S;kQlDkUHsj` zk*Dj~pNz9EQm^g5ms)Chw(w!g#r&-Xudkr~F50|7b_}L%ZU6N2BrZ zj4SiS>lZ8f3mPeZB@PG6+ur9CrYJ$p-AM zC4DeamJYZJ5)iNE2W9-l@(}OWN(RNp0ai5c0Js&Wr+6d;@Hzo}Ifa$X6Yxlm>#mrJ z?SC)(`*|+!b33m;cVc0G?(NFl@^G%sYL74H-1(sh0sS4cdlR(d+R8%G@-{Wgrszla zAng6=J;qB|s?#|C;7I=;zPJg2sQ8g+5Q|^6!d0znt6b$TRk+sr@)D z7{Qq6Q&2bhPoJcxtB@kvcW!)1!dN8ro51T?}BYtz1Dc2J;d% zLJP+KUKUW;6z3Cp$%<*kha5hNq2Q|tr03)rSm=6uVoE(6nR&PFkyGJ(?3Qk?GJ_h? z87WUfw-RkrZ(o^w|u`|mij9Q?gX64BO(BpDoW#2xDqpPTvq;LUIvuU#1CEV z_&V+A-|Sgw8@F%#P;YUC^pN?^a0m3VeE+Ly=}(p4hIGTH-&MCsrmMH#POXGXcE^BM zhlZY`khz{jkSNA!t{eoI8xp@3fTOUj=sEI0%n{V0C9ZqQc;e4G6iQhSi+*qE{M z%VmB#gHI}SYTQ_4W==?Twde2PCdyvU=5173J%qhZ0Ai@KEFK43(HeePb_DpX0$ZXT z(nu@WuLY0O;vOIn*#_KvK#>brb-czRP81iz4MKL&V+b$q7a(b(M(j*Mn{`lscrMSn z@+HS7Rw%_=P&y>SrEKX;P~e7>pcH& zty(t1&g&$7v|gpn`d0T}jFJIz;s|yKm15G?8fZnUqA2B)t}gL9{EA1srIK%deY2qH*x6&eIAgry`L&v3_pE9ecjM)9-Oz%L5{hQ)m=`{X$-;#3U5pAqVkz+O7$W9~Q1l88O& zw0UVdWAjYq%2e)C7uNHRAGrf_#ZR4n47&Jq!R&-}Yz2r`qQT-B8A#AY4)H1s&E~cIWv6r8;k( z^(1Ot2i!-_fP0P%ocmDR@at?tf1^4tI_-A8-Cw&ljl4uN$yCwdh0vPZlH!#?^XbRR z@!;R?B56RS1p)_q8to{46`|9avj5h-4vZ?v;8}z@G7j%m75Df+CV{}t2Ze%u&cYzE zi6>SCh!W5a!$I2wVXBgu&{{mxf^TB4hyCViE|h(k9-f%YbXE zOBQQ+MJZn{SXGX=EcUtdPy6;AVR_4DjkLI269C&J*l(PW$Pach6OM9HuZgBfEfBd51Kg1RASwgkIN{!vdoTW$LUr%r1GV52v&gg{DaEGxJ?AO2?5(E!) za6?~x7R0S|j>smw(it*P2+BUBbzLAr2`2Suu2VL~+hNf3a|}AU3(EWYTxtOjXww2jCdiUt7l?B&J5nqy z@L^(I9#A8O-XsIzhvM9OM8J^8o|Ezd!K@hYbKwK67(Sz?DOo-pYp%8<^Q?U7NMFhC zLeB>y)O~#;&&lBI{0SPJaqjE}zU))bg+BY~51iU$iz-`a@V7FRJmhV+MP|#vcoB$w z{6yZHm-4O6z-R}gg1z@+2wx>{Q8_hnKzP>!tb8NX=y=0&H}tS1SXSG z;CgrP*{^m*wl^H~JuV{I%24zR0U%^`vG+$#mc7bhmSkuNU>IF9p_n(sm z+_{o&{~h#X5)D9ZTp*F?p&6B^YZ*#dckz~=oAP_u{NEi1+`zNM`)Xosq{w{li8t#V zEoCU1U`of|y$F*K(&k4b1npuIL5qZ{5I-=YBw9rxg6{(@isby*R+6>|@?BsXXnjTd zednVwS(m&epvMqMN90XT{e$ir5zFws4RjDOn30C!V@*2JDu-X;V`4ZflGjTXy>)`F}(pv6#- zGsX|f^Wm?x5KOAPTC*D z@FxVCAoz@gHj%-7LADNfjetBK+*gW@>jD5zgk*#UmLyS-z8i2+8sh8)4=6P-XCe=* zCGdH~^uI_v^Pno$ia1_2234T^aTEem%Yg+Y#8MZ8ErHV#TtzVePbQ@Yq&gjtB}%DX zOkY;4{=PK1b7|p7hy0&Vudh`>*#i|JJpHq;1UdI|+zItUujLChIIl?@J+_=@7G^z1 zrUSnNDrybri|aIhF)yizN1};?7CA?D;lcb+c{~XbP8hrsZ{Ek3q+pcrtR#AQ*!0)4K2e&5A8FwHICAt*)8E|uNS%G&VKpNPib-G}a68#h@ZVb1V=Frd`65Luj zBE=lfpqb;D=hV5f_gClnN^@4B$^_t!o3I7xfq(~$an|=Om;mT~?6q>2mKd)$zQFzF z#4Fk4$+drdcw)YN!^rC1Ba7!W&5KJWkL*NIWhoDR#6lK!f$l=?T!8O|MKg#;@I)UN zfS05g|JLI~l%~Ho5V26H8;jmNBF5Ymbt{aaLwhh5dG{t$jQ`j!STnZjGrRZ~1%PcT z3x%q{zff&Lh1Jvo>5*W>z==ThZ;zsmh3^3b%F;#^nS(Sl!ldXVQJ1O}UZ_JAP~A|Y=`pb9vyk;Vi1dQiN0 zE%4h;0zTWx+}om{$68@FV+twd9PiCt2sja!{myNJ9(Q2ptmFI2Wdea7jmrQa0Uz)z z0$T%K^6v`6!=h1yo4VT&|H#h?1kzjCr_=sJ(Cot)0>ZNZ9-Jb`*)O=2u15GCjXzPu zUe8y$U4c(I=0Pfq#+W)6`g`3xVdHT+AmhX~x zf6e|s*Ayf0PyFmtNSRlJDDWy;f_putMu5~@O?e_^D_h|eCk$Xr#2Dcu95)04$a?C8 z@nd<$OVHw{!vw(hl@w0cA$=ESd@-Y%Pq>6u+aU={$kmz~)aK&@EnOJ2{x@4*g-dLM}-7oH%eg64?Z>nBnxx@R37X?SZVpB@G=5W6T}}A>hgh8JYFRs)d0+k zO^{<+9P{hCSb_u=?8RdJ+Ls`gKf;T7VOXQz18@nLoEm|(l1kdvLORw{PpE?HdI)*$ zuc{t6wd(9(>gqzIcS@)wWL0r!?r2COLt7+fFLF%?nl}1&BKT0TrpdS9Y~xZAP`&BP zE7V|~LSM##pTaR3aL?SUdYu^~(+_Y#fBd*R?q*yM_VTflK;(LB z1F2yXeqh_TQsfA)8EipJ2!cT;Y|l!=n{+M)*z?FzCxdw2UIx7{%>GTx1Gp0Ly)KqX zOO!!fRRM}C86z7X(ie(5LKmiXjxM-#l@)n^80ov)?IaVyU$PYehl@FzUtDk9T<*r) zcbt%?!i@{IIJUO&*rly^*rl7DzffcMB5)jionAr_xDM?YFMP3sVo*N~B4Fl$(L1b8 zAJF4Z54iNQ=s&nb0!BnHOzQ|6A$~G}r1HN$ zk}x0Tbu!Yqqb7LZRj}e%Mc7Kaep$=?QjdAJCss>~caapcC<1oCB+hlsM zp^@f{;sq2?LIa#znjl1z@b7Cce>N>d)?E9C>Da7631#&=Hl@g}>QhU8BOIXZ;1 zh2U-h*mTaMR)n3{L>zyLiaXM~9$&Ymjy&uWc|{1^1LBn3s!$yRS$emE-=4kj_8%Jy zO2=y4c5&3bqdIjv;|^t716l+oReFO{knc(NT2c*;1Tb%)jQGTRmgC%uJj3$73_m`L zJ%PGSV%A=4WL+l%8CFTb@#U7jvjx35j*0Iazwdb?!dq-x&-;`FY(Z-h2zHj)4d7e_ zUW1O@)%%w23cq z!kj+@qm5~bpn(KWtRVF7air`o_*^pGy%OWZYbb`Chn4o8!#-Wb=bDKB#i2|M?y)= zUCLM?2Y)K!x7FG5a==IVFFHYgDpknbY%=gN%k6ojrKSuzs{wWpHF}ByB{4e^AQSw? z1J(lWT6}Y+c_7ieIJ`yY<+NbHyN(oO4>3yssT7FEWgs^XxLgj#9tv^*2u4E-cA9X{ z%IL7kz(X3`L_~qL5?e-a8-g{{D1bAPp8ORYHi7@DK?Xt*iKLRxBY-O`0K%1`A{rg> zxHar*v~}?->=);r_fj40`IOTn0NOM--qHM&Y>Y{KV8Bs-jO<@R>%6-(vA-by&_wTd zWusj}(a)}>7gDVlJAe~WoRSi1cSS}R;HQbtv=Beh@A9Y>3Hi8-k%Tf%(ex1_1@?Od zlF+}Oz-F6uOn$A%Izi$+5JQY|!EdQT4)O_)Dz4H|v6PSXDBtuAPFj_~@j^s~W|T&K z$}8?#!{8QWS}p7p2F*_ahfM^jXmFZuj-Nl! z>j?oxoxZ+HETsrAMVN~Xo@xn18RmHI@FnatKT~QeeLF?%46@1`tU_n_$yeR+%=3e& zM>yCm4SPj&>BKLn$N(R_IC^Q}mqWO5O0AnMD4n&my1C>G+3}@Rg7&p0mUQ~brWdf* zFyM9H9e|8;H40b<5r8dxP2$#tP+Ju96`h50>Lh|kJyVPtX+7bZuE|Ctc7Dn~EiHF} zXo15p6>|Qn!LdjI*bBjt2mxZE4ZcpS@f2#igLzjEolmmp(&~JRTCW47$O8LQn21!@ zz9m9oyTvGteSb^O_C!x&VUy$Iza3J=xBaK;E81nwr3Yr4tkjBv#vQ=g68N1XfM=!< zRhY96z{{QFLEzUgB?!t9fITMIna*f7Os$9nWG_y!K98)_v&Zmk;>7Jl>V*4GK4#GW z7fkXzqqVP&$sXooZbEHzm^)Q5ePsf37^EoCR--c-1d0Rm;cD7z$V_@j7(Pfgdh{KY zyD^3*3j+)M7VL~+T9WMNt0peBgiq)3iW8jc-P-GF2aI(`Z{HCB)--DodjWPWSK99~ z8RTgI@2K4k%wr^qEDa`!(n8p$q`yOR_}(ZSLRlH7i0d3+7?zj{hINqPxVml?L=ALm zV!P3SM+cdopTgG*f^ZPVwR8j!lR^<9VoZg}u;?1*Z6d_n-x6ixoM9TA+UT9`1d!6x zdUlOjnHwP|+=X{d?sM(OMUPZdC>Ug23$HA?P??3|>qKFz=Bp^MmBB3@A~Av-YW1d$ zVnIxn68O_3U0aJa1i!K#e}ECNT#L&pgyy7lorw<*_lz5`Upe}eYV+H-#_`4SSZ0%u z;+=?T4oLY5T*ylFAYx-axT=}A_TTX;0YV-4$qNoq2*VDa5>jIJ1#_}#c_P$_gU#r1 zp$OsONzOQ~i%$?RG6tXJ?K=%&3x@duZxxPlf~2{LQjt(wzCU+(LH@kP9bZo#9Pb(~ zD%vCK`Mjxei8XPi<2XNB_z8RB?f2xT43yP}=2`y{u&zf4y*gZ*9>#i-hb*O%UYuO}qA9;Z z?eCht><{DhwemsQd79zL?J1$dQy*rIbk7~2 z%-xnR1un^@V9MnKz?qc4M_!8K!33fxdo6L>Ryy+UR{rTFX1S; zM7cv~LOhjZJrJ=thnSi;>N4v{SqMHtLsz!^yCT8_ZDMV!UB0N$sKe@Zih1xmI+VPqFLv9>3fu&-M3`F>->6*CCJ2EZhP$x_P&G`5}k{^uT8(~874t-5tK>P^d@a5PI&f6RY zE(UL$@BVn4+oxt}ba%7l8`?MDIg^D8b)&59J6K z8sIj{fQ=E@b)*CySuHz(^$%ntVAm7ildqRExAk1kT3@9_9;m(Uv=R~@v2=gf-ozV zJ}$vrALZT6M8QEKaqkxlY>(U`C-oPRUZd2F)%i%9D!>{;udyckfhhgk77d>iev$~k z0j4Ls#g*&x7!D=z&ejh#0UJxXG(e#NS>DGvsSt&rfaur`RCxnfUkj^&LjZFH-~&iI zdK)-10ry5Sk|l;ngRD{9lgur>yV4iZ=xNJ{qKdi1d_UO?690VZ@1gh|y7pAQx~yeI zkIMUS3)u@9y*R8j9V&&5@!Tj$ti=lK__$ZoG^Aup4YGN{i>MOD3g3^(JcZNfX;1Sx4;op)8vic@g3@N2Biv zN{9tlCGoT4BZpNi9mxM#?uu$N;f#2}vB(_S6t(3P6joRHe?G+l*7QU-a)}oE%iMlw z`E*cA$rnFdgzybqze3EslF9_=e^4B@L1NWj&fX0o6j|3UWe*Qxp;iR6NOQM*(ponr zn-lbHP%C7ts?DIOcXaEf9fnT1Nq}5^ObA?kguq8Vk&>kYBmrOxaz;*r2}ddjKkB&B zK7RJ)+FwH_y@uNdn$CgN!`H5Ko4Iv?HR5o~kiUdw3$llSh6C5p5UeBUn!}}KN})%8 z;!c8`c{;K145D=a0C!{yKX-#4v2g+BaZohy6O^O^V!L2OnW*hjIRXKoOvRHq zTMG#`^t_PvL$DRt@-}37qUXdXm;1Xr?1|>3MpaU9)IF~z%F%P^`C?|xD zuJX7+I@itozt>ifpmc))@1eGm+#k%Z==&|5^%CqdP!FvIY!pmia!JToohgKX$Q@9B zDN0O(uANU(5d%M4^m;a1`%1U%MqgP%fxU+ls`qK5;;tp_+2QUs)!AYKHn-KZF}p`;&?!mS}rJEd>xiF3xy=`TN4 zda2l{jD}0g)n(?(x&Bctrx1oz-3G#OY4D6NXPks21!JSc)$cE-chT7X+PijZnk=1^xH$3w`5mNeI9g??=XC54y=vIcHLa$v1x08 zH*Ghn`rZayC7wHqc}lmTm)abW?Xv7Egi=^h9b_KX1@B-ed+ZtMjDVEb^MNxDjt$1K z)D6uVwL3})_LKCcH(n9$cFl%1U1 z4Qs(WiIDZ--~BvG&04=nEtyr$hkO z?S`esh+nCh-k2<(V(g^e&qt>3PEPh}yH9~=VfMS#*56UPc$`gWh0hY0*!KZ^x5Hfl z{zD)Hk-qm9+xi_%d4a=0$qPIQ$rFsYF7J_n9vYqwz3g*@)Q%oiBZRS=55F0MPI!y6BrQ!V~>H zuIfkVMIv{VEohWW$!`aqxWB^F)%~z032YraMqVxxbRS0~lPIaX%fN7J`0d~7iczw+ zLWP%u{;)DD2Ux`}o~Qd*r~mD1P*4N6!5lcc%5*YeUV-nlB>Mz_UCk*`C}^1BIXC*e zDI8cjlkxCX{#lmUvYF(cslUy~nrbUL?uf8|g2D4iNb>i88`}XGQ3D>zC;mW>2ZAS> zjGsi>SI`HQ{4Yu2`pF<1U5m#F(<9+rt5t-JA}#B*!682GpP%>_*t)01ydt!RgFA;g z6R!gl7dmrC7seHwhA!ro-ujx^HP`V*FArD?m)t=?4wa3*B~$#?+%L*k!69kY0H+ck z?ttc$@%uXOl7v7Q&_&-{w33m#1{@t4e*IknQ zi-fEK{OQYg^blz{-p~+=sdL>x+b9KUh>bGt5l5XQ>0gNrO{{gWL8{Wpi`?|bZTgH^ zU)Nam!ZPn^=b04@#W#q+Dmv;eVpK{7ngl=jlVF1hx4~xv!fE1}Ul?Cj?FjnHKU0Y* zZ?rjktPMWT4v29T8>J9fVYtDH!yz=@X&8ivsB0oOb*rivX z_won*=#5)zcN1kIY&SbJ-%xAFD0;IFuUM=SQth36MxaD4znd@Lt=;xIsAai*Hne5a z?LU_=Y0$a+*Zgio>Z{6&vrpxB-tOXzJ(>BKyOT;dw3~0q%~2v{nna7nH_FoOX=;Z> z00W#oD38UFXbWhzGQd6|a}4M&dS&T~2MeJ0t}mk2LYOenVk*%;BevdxuzU5e6|vO7 zGz9a$ZRIsL{(AlMMJmrNZL8jg$o((ICy51sAvd7{5Srj|K_E(b(1je^k7S7?79yI- zS}`_c7nL8;u18&k0NV?(J1m7F_WP`9e8vo}v7m7T+l?5m^%eu4g)jiU7;!>uWf(Y| zghwo<=6*{Aj&pA;6OU6i?zSN>^2-7c(SE}2KT3?U#V4kv03S?3wKD-5rLF?tuRF8% zdvsdLm9J+TwC`*eaXK!@kvGwn1WaE5NCdwx*_+OPF%1-q24{eEG%zsL^;#IrO>Z4{ znRaeGzPLTj-ffq01nY?JYOf$*vmLw558JLEUvhREvx%TS5Nsr}gZPr7aR#JaT&3k@ zZ=O&uQ2;^&&R$TDj$Wf6+W}?=UZ_m$;s@KL;OS2fB0stVlmVc!lE+!&le13xQ>=2c zJ#fVWKZeVpAd4T`i~!K*P&jQCj;55E)pRc)K!t_ijJT!L8W4mS9i+eQg5^7Ah<*bwc~Da zHnaPsCAFI0z-8c6R8z+e6&gN5uDc&$7obE$ZSOOOwL%sT!Pan6kdU__Rl#%s;f%#2 zo%ax26a`w30oMirFE3#UtL2g6&6C=LPS4F;PZ;{hE*Hg-v1@w6ci*h||2NB8wreDM zSPF6!CvR}n1i5$7^qVhu!H~=PgGm&Sjh#N+z z*lWVe3UGafbIgri2Q0&or1S7z&Vc>RDZ){Tnmd700lxIJ`UCp(1IF!VlUruhUEd_E z25jwOB93ok64^Uou#dGNUC9;MAm)Y86a5(U=~Z;0OQ+Qiay|=DlpYgkp|o#2R*L-A(fZ~{%v=ut~)r9czB0P}Z=KD@ z6gmxdk043YB%_D1$aP^LL45EN7XvY?iDCeJLY6j(5ImId*_Fp>{Mig_{>_M~LbH;ZFgmNQV@+vDB2HPu1K!ykuybLHga992o zobIA)sP+*1F^<6ZYtb_0c%s9ox}@lzJ7~^-bZDqUcJHN zf|V0KBb=$?3!2}jzHW7B;*9ZXdJ6xDG|G3c)bvoL@YQ@gmjGT)!QiVymEMEB=c^iX z`f6G>i#Eq86pWs`a_E8WqK`qrc(-R+{L0;@VSiW--@L{aMHp*K+6Ht4_XQq0RkmVi$^G5FgQF%Zm z*uLOP>>6;H4=5O7EfNC8pNgcsHBny~P|TgzZX608;-!S`-%kc&z7ax}8nTJpJe)(0 z-W{1FnnyJ!qBgfJYDnBuq?3_Te3rjgM`r=yI*ZpON!3`cL?wPW@OmfO%|9_@6UX zr!(IoIihM9XV%{mddJ-CAJqiB^*q_1Ff;dTP05$WXWIG&3qH5{ZqGb_iPg#_%s4$7 zIPA~tDw+?IJY?M5SR5~`zPp^l!&xfhD6PdY9!QG|aW{N5a zZi}5AgNd_)d)YzP$I_Jk$dzl`FUY(e2;f1BdTN3s_2Xah{QuDS*Bh( z;)%5D^dvp>B5qPbE^c-Zb#-YKckVawOBI<}U5%5eNua3yO z3V&MA1%7W!YK=7f-ol{3JP&I%g+MbmbceMERB4D&@?u#`;;|ya1_pA>jvG{TmHFdF z6+vYy_DmLZ;#q5AH&L68S#1w>N@4!pY%qCo*WJ|qxWcJ|76D=Yu!_j3tn1^V0XIJ7 zyX|QCZ);A$XiwK%`KzZidOVXn%i<~sZ3rWnAY`dDjR}+9EhTN|{lfD(? zZINe$BFbZEFJv)e!DH8%*R|C4+m~J28*Y5A@XFJDYLn&HKRmbc__er1am!9p6XPI5(r2J&A1MmQ8As!o$Cp&zGG4iTRkU0bZi%D!dm8ieEYVal5F7?}NamXuh zS}O@2VZm=**5?6ZN(n}cD)hn51t{?g_UtSmS$g0G5@HtE6{Ebo4)1{bCDt@OBwAF8 zQwG{k(HO{~dsh}JW)hfb8oxrHIksfUe^mRuJ#`ifI_f3N-28-=X)fGHC+# z0Z${hY1sXDo?0$afR?1e7&m)6)kOQ9Gvh3GMT7M!)+z7Nx>HdU!Hrvzfu^eCi${44 zQuukCdVI2yZWjMPj;=f!s`vjt_s(J#%VZtzT>0q{^$dhQNwuTFi$#J2gG^yQl5N$_Ty zz17+?b!PBefugS*OQR1X$s(qs^DfSfXYwUFhK~RkNOknJ?Jbp4u zu_TgE)u^nsP*cb}FY5|e9mK(EiPOr-uLC z|92dQ(YqjsW?<}1B$LB$Ka#}cdm>9Q8i6mQkhli48}x5La&b2X4M0M=hzGutqUO~x z=cdzr<<;W#S${B*&LkrYbzSFP^iQLs$JRA)4X1^DaEJRFnby;fJU$YwdnWd^kh8DK zd0@cN?b&ihR%MJ{hr+7J>aSTs2i35<-mkRK1M(B+1xp5$Z(nejcf=yfbFymZGe1lB zagS);rFrew9T&vq_PgK%Injkp-5Ke%)~dVSj|{0Fg~$9iZTs2!nQD{Axv_CQk6lQh z>Qa~<@N%Ieczr$UY!GFlJ}?gxlaLqGKXpB>EEfE$9v0%Mf0g^Mh9sV}6E(uND<*jp z;E`)Az;RN-GSPpp$)akcq>43vo~*yzft$BOQ{x!ucX^l>BW{mp5j8y`1s~? z`bNpb(Hii2DGZCKQcdZ5aJjcQ?b(-!jM0flW5Y)>bsen$&+!6 z0_K*Kl?0QmPvB3&@AW@93+icJL0F4wYlO@}j^r=sd#@;SIb5*PM6m`tM*dojSn);j zdZd+Rdy)LTYj;066?2?(OVmS$_2 zyT1ggvU?Ns-74Rf$RRf?0B->TtNuhdMkBu{C7)hsA@Sr>RT+~e0z&Rs3i;4;tQ8t3 z(8G^$zb?uB3&o=)z|?5kp`Y{g#40a`x*LnnT+I7s_O^ZAlUKL2Et|l}2=tH0Jo~psCcZq)#d=`o-usD1 zQ%q+^?gqB9r?)v$%4ph8Ieb|;vqW`cY zj?-M%6Q`6{aX&&6#bFwY*hlhOjhwdNK0?h~Ls;$d{l2{jkU_Wjf~|C+iNF&(<}RSg zZseG1*qZ?xs!mZ>cHP|)+NrD~m8{5`3tSV2U&1`0?^C z%<;P1Cr^@wuH2eXKbX@I@ue$qh;MX1uDNM>T}#oEO+c#y-GA$k?=*WNj@wuGBx}g; zVA`ddws8}i)2Aj9Mj!oPznvIwjjp3CQIB`n@AEitW0YySOI7=@e~0hg2vYILh01e3in4TeH=^mI-Dn@Flh( zWg(yyZb!iY3<))~R`I z2|rM`jKxfjf`BcAH#XN!1QxAZb@n^@$CKaQnRrYuBzA4s6W_B(RerZC|F`D5(AH?a z--gb=>#Tm&^yK!Y#x&`zw~BogDRnH1xj3RDeQCOAcE^!IQ-|3d>AedU%y!jI-Pkv+ z&N}6?fdlA4sA2>4jT4P~@HyQ7?3bS9Cz6yg$s=^V@iBr}sn#^b@Y;mG5ZOI43lLjO7VRgp z=e5>FP@?5(5G;OLNyZmbaR@pWQVsNa5($8Qr7 zB(j|>kxDzU#2zG52n%9n;=c#R89|x%qH}ip8818Za{tAGFZN|KN$sgKPri|h`<<#! zKZ#d1Opn)W&pa^`;5@sb_mI)S57+%?Ugi5vYqMao@a}sn-D5#037AHiSou?2?=%l9 zRUY#?wCM9`q4il~v@SCTRVH(nCWeh*{_ZeNE?_?3s!f%nOmQRs+FK@H^uA|rUG(A* zPMa^6L6>B^UTrQ>Vwg+VYb5U|hm6y#rme$)ZnvH_9j^!igKMV@8 zEj~y4j9+*fqkkl$Ek=22mC}wYRY#SqX0NDUNzsvxROSw*Nqt*pR_RKu{AakP0FcT4 zcX5_AiW!K`C?#W9-C+fomTn*{;NCbcwzjY^+OeqwMz9yK@hpyB78ndoW)#C%J9^>>Hie z<{>yOhi9QH)BkN<%NX+h4_oB$jhsK~byQwk(@7z!=#5{Be1!9%#oglN&JQ9U4sTK$ z9!k+V)HKi&aW-$!s==5W>1qz1&ra4&%}ZOO_CP`4t<^knAR&5Hy7cX$*`HIA_QC`7 zc5l1ckAJF9Mb!E~?hfo_Ki1VMo#j%2KSc?~|G=M`4$U^b^NE2sR;(*-qbO}$Li|+~ zey1AfYhtQ%+%WMw2Eavz1Yab_J&5R?o)7B4Gd9K}HYh>_l8HLJt4h)}n>{ASyD2_& zQjT^WAAI{4SlLRfslT=pd+Vt33LoTj zUw?CR*OeGv$fbp4GE!yEm;ABXT{djr=Jtj%b~63PI6vJr3iMxW^#ew3FY7Mm@Lmrb zn4|S>?{Dqt=r4=&r#Add9dfL)Y~B8fB9qp#_pok9?9o-(4&!hk(URVKH375c%-K>D z82qbfD z9`x6d4m|IDHd1T%BzJT0Sk3NAAG6t)>B{euL(tMG&oftXu_|TqdIGFltNe?rCMuzhG zd+*(pya>K5u+_Ob3B)vR51wmrj47isFDYabZn>3m%o&_kvS^nPXV)bH#0!7wqwvOr z?krQm(ITER?)jd^TT)SQut)(awaD)fmgF2*Z-ZN6WWLw~Zc~++JiqIb-?A**ut6yI z6CES*xg|HNSiek%HTvfh_hrBFpzt=)iy(o$g5y%p?B(u8f5VK<^)K$48J8QopyRl+ zarvrZy~9mAr_b%L9rxABvNilUId}Xw+=BKOzxXxqe#`WI_?0eM&z^Xcau1a?sLB(9 zW<{0_MNwHX3J33Gi(Z={?|8HVS;NYm_@@xgd>Pao^Nq<&0Bl8kA4!YW+D4tj3cF(> zaB{XK`1q40`}5*yDB;XjwGUW17empGjYavdd7F&qZ*0H7+#Ui8xIfF_VMKx4W3r&= zyvWN2|89NoUOi3O<>w*Ef6f^X3}1^nr$(nMvIZAstjr&fL^nR1j_$9C+|xEbY~|1y z`r`HuokbSidy*5nZ$#-D$Sesg%)Jy^D^pW&NOHe!NMHLv&gbrXKkvU>5^S}zx7%sa zY*w$r%h$1k>G2PTb;DKiKt%eSr*-0!4K`>R9qU97alu^_)51`GmVp^?WGeD856vdE zcsZJK9-*PktTz#?o(Invh^GDG6ahjE5NeT9vQJ>o7M1H6P>!3M6vMr3yC>MN9oKK5-dDOw?*N1N>$Lo6s zqQ8tUxbiYVN7sS9uY1vC%(VZv($VF)<}qfA0tTmgh729&)mZKmj-EK8`^D;{mQG+) z_K4<>i4B#yaDP}d+v_lUa{P9~#6tP2%*6o6g{p$6O)#Y)-_7meF)w56%VEZwlXgTR z$+rSGp8Ek(Ic^oe0()a!bDa00mAYiXwTqlL)Ws{x5szwY0c07YQe76vk^xhq6L5*x z=;3?afcsvK8A~x>vF2k2-_h?Pfk+vO74d*mWNlX1!)0yMx}NTXJIDgCW9^Fc+jxET zl9LzRBJZAZ6zo|tMZ?{r*Z*wNUv>G=%|(VEg9cs}{XBHe+w|ATU##wTy@8({ z%7zv%njOq=nbz_7HCk>v`>!WA0H8_pk}M=pnriDUzRK{>Ll~&njn9b#q=pirYnwd@ zJUga9Z}4C+za~zJobfQ5G!r^J)pL&GqIroF#X$R_;0J+!7O{@qMZ9!H>l7R2C-lvY z1jU9EqPH>);WF;(NUk;87o48Q3POL~_z!v{Imod&m118ahE2jOFZU#pQv3G)_I1ul z`yQONeo{t1RyF5d*5=hs^rlzEOPsp3W-6_Ynr~VX`I*m+K=( zb92Qb8F5EnrNw`7Fer?Fn^rsg5#mv&ezbpk>|--qzsP9Mw5Ch|AeTYg%QuQ(OEpih z1XX5%lOi>l@UMwWVW?)Ig2|5LO<~w-br_Hz7M*wghT8BtrW)%v4q3=h|HVrPD}*;9 zqfVL+>?73T!{oumav(8#M;LBdoV#-KH}*GSyD|rN z=}uQV{qn?ZUH>nW^NyxC|A)9XTBQwM`8d^oK;zNGhN=vu1+#mPbX)Yc{Q7!IC;oHX z#*q=Vv1_)o^$$|hT@KxXpmZo;I6-a<3fvQ^fA-Xm<+@Oi961=SWUmQ+$cXpUuhSGp z8R8)%e;wI31}7ypZi|Atc(i2lv1R}N(^ChbY{0`sA&i^*w$wSp?MHMejF{@oN?r?`$mOZl4kgG_6cPmuFpC=s-iKQP@u+n4+-xs{&3Gg23A8R(vW zaqF9r`7ec=j&404eDbzm_0F$0vIY&eO?%c|ewljlzv!+W`_>q2Qz(4}=I}FO-}Jzb z=l}8}c127NR6g{695|VNXQc3nX2wYSn0DXDt^$CSKCa78l;a9v)TTl>tudjY1YEh4{jN%o5@4mr|gu3!tQ zMI!D(tQ|77dYGP=0cbwQ;$I{ME$m72>1` z0rw*F0v1=BmpM)eRdQ7D^;}ozeDvZOd-9xTrhP%}nCHRflgHAp{d5ZXe4$`t>i3#0 z<97tXCl>v_5j5S{lD=iSap-_~dhOV>M_T+(|MENRuMu3RFN zZh(bw)^rf3DWJS`|A}V#*^UQQdApx~Xp;)6LL^CBewf8R+}hejESNaLdVlL&v-wZE@Fjxg zn7R+YB8?Ys{vH`ua=@Is<6$`^=_69{R8@6<=(g0#kEc52j(_xx?7pF=_Kp2(PC#mci@BDQgcd-6tXu2*Tve>^deOQlkqqH8dvCD-oHfVKg6w%> zYYGF-k4vgccEPIvkUZ7A99NJ9p?>yaIytBd+XBoE?4SxVP&n&q+@;`@+5H)`ed`&24`@ zADr^vajxn>|H9^XOCNoc^rU_pHh;W0)BoY7Elnqzb}sn#s%fXqH{+7vdjSFAO(RX8 zd^%Db8II>VFFn3kZQ2n$RI&e_RYu`hgHuON&ApPsU(B&TGmjUK;?*k$J3~5h0ycMy zn%;B@Yhs!*V_tQ|toIAp(X=9h5wmMs1T*H)rl6r0KlLJq0s}i*B01kkn#`%rm0~;1 zQP&8UdyQS|gX5e_cRZfH&{Ux|mZzN*doVPpR@ix)C*6M_sJ8M+*XH23`K3os{QLUG zIkWR&ecZg#nWUNUZ8B;9%A4d>$6hT-nwk7uAJ;o4*m;|I{E>#U87}9$Ue!CF?6eAY zKG!+2W$N1AscTA)k92h|=M9Xm&Z*q$JTZJII_j@<=eL$k-VY~^N4uXRg}qY0{*af~ zE0}5g=h}CLvmqk2Nt~nX8#kG{tx+v5{9Ww(vvS4k(tr0KN5;QB`?2uEp@}rBnA*|R z+eU|C+dquYu0HoG>A=IQqw)TlqqSKV&-`2bJFalg%g1p5{IpvLq0_`UL}P-0%R>2H z9vx%KMQ!07p^P%G`$1L3L|cGF83567%tT-L2M5Z$_{OavvSMp!S~zG25Cvc-^1{h9 zR-TAT^|~$+gKQtgH_z$CZf4>|W{TPMXl&o9GFLN={5&FL-)*KahF+t}pw)eI6J3m& z*M}OdQvYtTZ{3xNBlr6Zid;&!4H=g1tW#^sYdq8ZxseK`V2ZSZ*?{N;;9}G^HOR{Q zj;7X@KN*r=22DRu8~=2WkJ1+R0`YGEa$W=AI~@&5Gyt)H4Qf1rc!~~Kt`M&YKtP8F zASj6Lehiq+)|LbS5Mu^9Zjivei5o!T1wbvL8m|C!C=h4@GSJ;6;$gAV>QfU{I|5&x z0!`=9TF;@Lsp77Gf!j>Ln)L1_fQM69Tn?)QUsV_ie|5ZKYDQLJ$(RZToKEfEOO2Z|#A*=)J#YZ~{hi+%zGk$z1G->!w6=l1= zke&F>cbft84MbPvPOl`-K~`j~U9>7d=|&T>&ffCCk<{Pu)19?5OZI+N1L8R+D3#g- zan+h;Pj|(~hPu^x;5r}*e<_#|HqXI9Rg47QZ6;%qMjtjPG7~ScW&*YN=P}t2uzT-LTwCU0*+aMM9Q!yPDOR(Ffl@`MpX$Iz#)nMW)RoB%iD3Rb?CgG z)57D-7?ta>T?d=8jx*2yIlSZJn$j<|(pyzOTGFceObuoJ=MF6yj8O%$nxzmx>1+FU z5+#(13u}jl3TuBvOT&M~Lng>p+8GyoQF>+bmvajBKLt?hPHQc}^AwCL-B-TzgPxEL<`%t>^om|!EE#LQMCmL&sv52d3>3ydqVO^! zM8Uzgd?&QQa3pv|RfY*MrgJy`Q6_MSnWer#66Nv&(!taqY0XO;if=+*k=L-`rd$|p zN3u2zyNTZ{7SH5Rie7?sn}(lQcP{%uyBd49ecOTVZ53vR%Y7vu-FB(XEFpu%s5${( z+}g5P8o6vg zJ^gHH^wgQODsL#GfUrXjO4yJ=&3Zum$q*g-)^ehAG(PTCQ@BOki#``-NP0rXo_8PG zO=JZGX>5d_572Z<6pz@((DLw7sS_y>Zgr}3rUA4V*kO9rz-y_{PHn9QbE!9#f=T{2 zM{=IduFU6C|d*ep#DlGIe5KW_`=pn3>J}U6TJkMGSPEHlS0E z0bXGf_>$^^fZFMj%SgvAgdn5xKZ1yiIaH7goVQD79F^2!D~Gejo%c-qw=FE{>O{a9 z_tMu-gTs8(s_r&=AO7ex6#wr)Q*$6^+cUKje&LAtqZJr7p@O5vAWQ{@1lDr<>dyEV zJlRfKW+i?ws*KnUa5DRNdNSGbRzsK;-RSl6qwTCdZ3_S9>4*5~qx6THu%k+8%w zT%KGRiF8(4NX%BNn*Cu#NNnw z=Gv%v5>@^G_DcODf7iu+o9qj!ExBa4*kWvV?u8ZUOe4%$p*A^c_S~k07X}yB+_soF zs;nyE1R**PRG>Y%CnJ$q!I#JC(d;C!m>J~)kR6G@)*Q%^>{+7k;N6)Y;6qRDQN)-8 zg+%~3*UV)rqwpxVhT!H_PY?p)-kQ(KDC>!A^vDudv6U8srw8=LEKzi7;*9*vrkCUf zwOdtN<;9Dv)SPk(n&vqK_G^8a>K*^lGF#yH=g|M8uz?joa^vxbGtlH801fy};HNSW z@1}uFSkdw);m?DXhg-IdeQbRC78O{Ac_(qB%)q%n9V_D0Neg- z2Lycz8IV&Br zJ_=*OJ-jHVbYQuSG+M1$4jwmDc+8)Y2Q^!o;K?;+3?y_W$Y}xMz=GPVwbt8y6ibc9 zw7V`z+q5#8<74ALW-O00+5fTmXh5AUix3k`ih;d1p)$uqh?j6K&KF*gK~pT0{|pG| z*Rg&_Sq}}Qh$*_2y!0*8-IB+tOu>0R^;;b#)hTepO1r14qhW#yg3-Hp0 zS?y0%;|nPh@Hyya?gcwXG7^#N+ejE_U1diAV0+$$K_%>?Mq_K=eA^Nz2R3vXIkbFV zc!A#?`>1IuI6<9I1|Regpow-EaDWT~?3W^9=x`k7*II2GDM;85IlEybWOui1{x6yF z|Dd^z>}x1aA?G>cR3u->inNh+kejSV*3Qw}u#|;B9ch$I1U6--qZ9EAQvRU?8?dQ9Td_qPt{KiXb zL%z+Pv>IIjvu2p!-4RnjKt$rFrUjdr+Xu5iHX$JX(rjGqSYJVD=xkz(bWQh#&aYEz zd8f=LXOzi{KU{xFZmmX+USBuoi(8$Wn$W!*v8K^(0t@}@#9{D;jKkzi@*U*%ao$jH zTaV>c*)}2W=7u&_T=AXW$HL5K{R@D_d`~`9;~C)CbDBFsv;_$TV67A9(*`iEW?YX5 z>5@y-t9$CtomxrTuINKWN?#aVIjHq@dd-UQs$j|7-Fdks`%oIU|AUtJC)DwY-#j*xow2s^I@Q9f&3mSMD>n)zg^O{-??2~a_67@g}BGb%(i%Gv$QX_na2QHq^K-1c&Nc9 zWWnNWgxFvP4wlo9pQU=lT(!1CfK3#_ho}Hw>S@j3)4vui_&n;eKl1ziju^KIn{TBb zdIIIh1}KY#6Uy?eNyZx|P2dLIMZ)1d^=<{kc{?_fStOV2_8bdFMRwp0!lyq?L*Ues z-0KNgj5h1~8iGYZ_Y?p{dcD3|`W%ploVPeu%^dq|hRC8XM@rz}|Kczcid6UbN)VL1 ztT(OSCB~LMx25sfe9!&O^oFr#kxx#f%&wN6wkKhC!M*1czA-aOkc|9#vk&;QCC?ZG zM3IST9g7PPV{KtFc(?ur?X2ajmu%%C9cmPi^j-BNv>lj)8;JRGov2060xMb84VkFK zqlojIAjEm4ADA!4K~d+!UvyV)7|Lv0n(DM6ZtC^i=qu0f^l3?pw$J9#fn+reOzZ*R z#dQ>h#f8B%zR+5y&!e@+yRZK~zgK>;YWBf^{=<6!T*dGp5^q7>kr5Z{jN;25G9CJE zB|_G7<*>N{V4<2vl!~j5rchV{XmY~FTol>p{xpQnr6ejshlG{(1-S2gh_Ta<_u}Kl z!PJ*NG-ihx|2&E|L=jE2o4-!^A^wYL73u|lNn0ZEjcP0h+2gm4^6iM({q2J~ha!CD9;n;{Wehlu56Kr&Mfr@~iq zxRL@|7J=b22-v#5_UkPDf^_zihxAKu+)Bp-&mIhQzkcqD$2(%U9J4Z#56JGz00FWW z5IF7z8PlW$W0rloAKzI6wn7jMt*9H6E0aK39m`l>`8yR}totvJ0PJKJo+DtCM{DZJ z+xl#%%7iOz<$1~Z&28JxI&bq7FS1nJdK16&0~IcVylVgUguc3-)eIWK^77P)h^9V@ zo~ZuwAwJIH(}DCTv&n}C_9U%5`s8eLhPq*K+@&F%>9Y?f{sVkt>c-2VBzRergSB?x zI}_VV=Ke3aj%QAUa@implwBv{M${UJE6Zi3;e(&RLJ&w7oeDvxFE;=fS_haI15x-P zORQ6pc(0RTk&w0f@RH_7plz{Y-;0gbt0hB$=XXVqIRBZDTzoyXYr)@^&9==gyQz}X zE~gN20sxU_Bv4EO!!QZp;J;!Hs0@~7DcMPVbg3^FYDX46>P?9|p%Y|2Y^sscX5ytj$I+$xz&s#ML3F(V zVL;BG$6w0Ad?;!Cplq-Bj445w3=rWGeA za9vKM!S7cHydXPRvpHmU@!`$%a{=%7KT4|DB0c&vcw%~v-aL3O(ScSw^pQ>n`H1%? z5zt73QIFK!0Um}#wjAMx9GA!5X<`K=oWkGVaG!L1fUs4P1kIBLsVE)buTgO%@K-&X zg4{?Xkx$^K~(M-WNunTArWOg>$^`gpn$s$%;uVaO6G!0c0>tgK6?c zKw@bH?08ry zMnmg@78rOLDt=i&%75&JMTm;?A7LxCf8NS82kOX&O|7Zq6g%v+12=|ov*^)xzWqK9 z3E5%Z$pC0M=`U+~ZOsCD)n@G2t5!v!#jfB4;Zl;N^prqN!R2OTJ?X|_F zicFYhxmMNpr+g70*i5ei(!?Tt^14R=ifs0RkRXD@CO5!PXtr^e7R_w7WIiiG-oUBC zu5f?!)Tn9swUd-0#e>wL15Q%`IS5+_#A?v|Y9kBQlc?|!ye5N<@L77Rf*LLmw-k&u zoUtfdC=HgrxiLLQJ=H~N?2@xliOtOYfTY2?cQ8^dPl3BNmQY|C5OZktxUu5atBIoz z(Ud`R;=SCXa6$N@AO>p8#ys(UOJIwtlHb7Dq_F;7xq3ktp#@qq>kR@#!7HjoyMoLJ zRaG`T817t*lH(v|JG_+WIrD<}Jyi@;Tt8Gw!I-U@s`0R=CF>@?I$wd-iPXf2DN7C5 zYh~W==3d$S^M+2SY-B@@ru23fs_=SN`IRUX?409I>eg5;V|Go(OC78;ra>Ur;-{%g`+#bm_ z-SM*a_V~0>3y_`8vsxk#jyQ9`&{`mN;3EeiqZrBrQOX>!x_m1Tc6tYHU)eF8+d4yT z{fxlxj!s@O6o<+h%)zh$G?S%@B<5yJDChHJJBkg_T9b^V~4Y)YXh0b;aJFD>v6x}!0+qY*BkgmZAKA7ut*Yu zUnA5(<*f%CV9wNvkk2-sUj4}^pJXvNh`4@&PqxBtF^t!fJ@2{94IxEdFCY={no#w< z$zVfQCQh8E1Tl^3fW;()N=7MH|z=!FV4S6yv;6&&8*4@<3flEOkB)Rp9Z`@F*x4lEQRlO^yQ_`S?srxT28CTvoedr?rT?C@w z8-Wuo`kfyvu@^20Rq{TZpbRJ+(Qt*;HE(B-~@%lAicnkv!a!??@ z?L1UCDhKhQ95{=9O&g~O%=KBG++BQ3QC1c{m92I>UmmH)&DBsb5hwO*lu0Ms$Jd^~ z51oejl$Y1l6j0ilp1BzC`(AO<;}OISlT60xq?u z2tWbcAdrF-X;67z35qIyT}C{Kx?e}HFC`M&13&%MzF(QtJ+f|O+%x{iXB%(R=H;=Q zLzq7xsKO?d01mhpX9b8DGSoT2TL=KH0zJZDW~B+>Jv!?0@!fQ8*W>9kv1=Wtvb+C- z*k*+p4HO6n@&Nk96LD4J@$m#@h49Mkx&-=b3fz$1Q3y|@a1QShb%CLXQjcy_6YiR? zi7!DbE=E~0m{8)Leruq9sM&nliH}76#1HvmoAF};P^2Pc^L;-O&(nxOBZ)c;w=3ar z{8yb#BzYaJTZ=`xM%lNndG(B|m3pl5Q6E~u($WOloqZEqEp=YJ+yw@6cMNGw_&ANl zub5syQ}$&O-+_TDZ@aq;mV(S3Aa1JS6e`9fO}r$|vrDeCN-iA+>zE~1niDET?MbLi&@isnUAE{0#5y(?S90;%2(s9Qw7 zxz5Wfnh{8nkQ8adJj^u+QD$_Qs<7JDQdLe6tJNELSl0&0$txh{SSiKj-9`2tzhAze*(}-C_$B=h{7AsJ zHTGBnIsMALn5DL3Evgd?H&=gU8VVR_J_|o}SM2kiwBiKc;{|H^zY~uAms&&vHB=m$ zUcm6Ej~}sVx3>5{WmWtq6Gy~z-PT~{N)mfZM*f1?l&chr2LoVg=7rh$va`#l)?G}f z4-LDar>3hSE0)s$6EG*4P2wT=JH?6ROt2Ylg~bp~GOsS}npS(bp>z6ZZdR<1 zec<#yfSuK4WK10>TTDBKf?jUlmPLLRiI~J- za-K6tAQCsQ44}Unu>SVwlx;K~{9e1+0y7dOZ{|+#KodZQqCD2b2K*hu5Z3})83Op;!jP~clp0z3^ z21=rjhk*|RUHSrjy;n>F!Zu_MQ`8TBv*1+dm8XMmcg4(QF+TC9yxV?q^|o#8^&HD> z^ihVH^`8TSs!M8(Uou8LP=e$$ z`Z2&`Yw71)l@!Xz_}by!-l3!I{g)Mn#>MFdG6>00se#JdfeQ$Tf}N&t@0HvG5!UXm zU@K)Yjay?UV$oI8@RJt*lQw%nsEcTeLo1u3y4T2}@IU)4>;ciV)SgE8vq6FE^UvT;CPqTm>9V$S@)6|BeEbI$ z07?8XIb{XYdD+01a=-e9gjK6uC*uMS$2qtTF3>XqFCXOpn|+=dbIp!WC7BG!(*j5~ zdc5T;2@?$>%n7FU_|8GV94ick#V`1&hrn!J)C~YCMm&i?(O+QlhZ5yUSklP8pnO48 z{vxlNR;`84>%rK+(8PATPoqJHtj?=cv~6ioE%!U}a^<|*SlbP>)Nh+}Klw&Z#trF0 ziqs!n0eDsLBV#QAF#|)zP_XmkY=2@)JcB5Ud8Bq|`-rY`apMCQq4}&jQ55Yji zDkjZI)s3wEUK^AocK}P);$B=#YopOnS0=j54bgkBAJ3-4*7iLIT>ag{Zc!*fFKj69 z{_Ng?ud&29q#K8~C+NA(h5o5E$$0fXTYvRa%Z$|bY%G21eyQ2W=)%p?iP8Rs4O-pn zB+3QNI@XT6CR~+4t1Z4p2}?u_w8dBM4g3Yh|6>c_xLgl}9Pw+&tBAZ5@aqh265$`i z)1ZRXct0O}gA%xkE}KM)J|cXUa66KCS8S^-OhT;_Ag0I$xGHvD-uS9aSG;snd85g} zvDA-du{-Z1d7ii7&DK{5zR~TswP#6Rl8ArtkZL}&7nIC8lEKA05Ml&R5ODA@N}MqR z_J5N~A*QHvU+3_NJO31NBSv+t(vN2Z4Kc+*8k~v$XqzttOhe-EGZ?Pqp$t177D{Sc z>d#`@AuMBGgvDq*OB^pJi43t&sz)2;lB*p7Wx(0lbp|wY2E|a^F2~cRZubR+a^Gad z`(Z9AtBBu<%h{0lh*uqfDW{cbRBRV)Sro+5X^o&>Z06%CC$XKziH}g*2%d@@{f(6k z3!0CNmb;uao{2=OT0En3FUjR*(I2Jv<)|e~@3ck?7!~DiUf~i&YwV@OW>hSl`40+@ zWkmTToqa)IIc>t?st)cKNF0-wsAtLzr#%K?7?BL2N3T{in~u1YT=QRp%^|x#M;%$i zD`Nh@%gqw}kYxvfhU*Y4f@78koA*}Ra)8O*I#M^9&}6!>Wn1qdnZA>u?EFTHnBq|W z_Gw)gPW0=>_}N@#ZDd!4Hev&!LK)!Kejxd=bOl5x_oE=n7gn4 zQ$Rx(DKu5;?eBoWG(X==`AUy|`Hlj4%wN@)OUY)ScfR3J2cbtiXsmDXC!e7qZ!hB> z4iX~@@S3O1VNw>~|GIi*-^D|-3msPe+ccWwJpJ&W{%SSX=|#@9PcNdy&6S}?)u%tq zlLrqY5%Gqtpkz4@xC0@X%4?Q!Sra>J6W{t6K4qY|_{{zc7FIWYCPC#$8WgiP?w8>( zQ7t77@C7;=Tz8B(2N2ppK5xquqrsZ8)ee`Z0}iZ}iY*{Q$%;Dit?q&+O8>jF(7Wh5 z17AY0nCx|yglNeg>mtmwFdKBPg`+ryw4?&G)7FJ^$akql%P?Ej%)8{Cx8(LU9G1Dx z-kimcwO}Zf9r+jTYh-`boTtC(Jb>GazV4AA?7sZd1U&fAG7Ik zQuo#^xU^XMEzj9-{o)tM&YsA_Qd7h(7xBNV=mZd7<)BF2Z5P)ixQ|VmX@pZ zqc(ht9G_K~WQkX*f)Da+V#*9WT>`r60Tv9#Xg~sWHZ6sK*B3t#={mFe&Gd#N>t(02 z`EoCnhsXEGi7QTrB3kUH9Ry4X7oS5}v@i(v8o;7&u{9}tHS&O9{hTj$kgfORKY|V% zH{yQ;`MjiFNHW&cvCMS#UPKWs#i#0owhkHU6Oy5-7p8d8G_kkx#wxVOdyxej@MGUe zFZH&;VzsExXEbH?u+|s*5PeqB6IVbcjnLgA3piE!(w*487GDylt}w6Vg~%-@-$8uV zDfC)r+@tXuDj@Uw|5{OwBfGL137;txV?`ZkMa1jGMr3W!OpVeb?h5cNPJo3T+kYLDq;-D} zXj}*kVV<(>mel(`v>(fvD8GpCfW#CAn2yQ4fZ@Dwh8Q}c0*KLpBk*p9pq_*0e~L&!rdD9dfwurGR8`xWXf~00E)r+u;}n2$io2Qk)XFy z6Vm3e2>pkx8D^()9PrH`#6`O!pTMW|cR=WmjJ$~olbDeZTP?7H`C?`AUV!JOZlb2FTzK}V>XAELwKHscg2KQ4hIH`ECpD4B0r6QDYds}#kbg;@ z7^8|}k;?-_#Lu4M60p(R0`Q?klE4?k0RV+V+45(lqb^(xl9S>Plcj_nZ|2`U z9`9H?DE;>&?#b2KkyjcQHC4V9m*xz%oYRyJ2R3KAm;8fFH z>-Sye+fFsutl3JuCC}C4Yk@C$d@=#5vZHup|C<64WE!a`SH-p6_ZWjh2eiY)AZjYK zn4FtrCy{-j%5$qTX0?XPl(qB1VlB<)ACb3JMb$~=rDkRrogBO}S>(*yr>n}m>>=2v zPR9E57AZG(3L7i63$p_3{DP<2+Vi75`qVz%FaH-8E%_FIDs?8ipX5&EEnh6l3I-;0 zBzQi5eDpF71ErNvk61*+j#^Mm>saq2UO9&amOun?Yiez_BKHv_A4N;~X3XImQ%hoa zPf-zzc&A;mWhrh+B}-=yEFS)`ZCSfutk1PG^y(tk`-OXII(i&_RFr>9?sgc2s{^b5 zVX;Oj1lzl5|5Gvet>DRk^s7M9F%WNkZ}Ifj&ED}%qqQHWR7T~lR2qfA7nOn1OeGN% zdyF6p^0(nh4^a)4WC2OB=HqHNl1xcb7h(ZLwI=lBR;cIpck9Bq>Tk|7wH5OC&WfrS z5c3He6B>*bn{UASE+Z_#6=cALh?@Jn_n7GMYsw7-s%ZL6VJCeTGRF?y+u3yQ*_N6` z53>&0%AeePG^X2m=vVdo4=&>_-*7wx<;DUNTH1H8b1sFSeOFvqc2_K5d4(X5p?I;} z2VY8?(9vYHGSKB8k!}TOkeEc_$+^Y~rthbzO3%vkioIB2E^4IuF>&oOKk%FklfeFu zq%)6)>ihrrxp#JB8Qa)%MIuXZ;l`Ppw1{Eox zlr0%)Q3xfJ?RP%k-#=sg<6-9Bd(Qj3->=v6wWkYwuZuoVzpx^9?&YW7iznSOH&`v5 z%j-9M%%}+&DKuIB!YupGt5uN}nXAecT2$FU2$AouRN+k+|9$eSW60=B)m0w9Q=Nuq zm;a$T&Kb8^E7e66&WJ!&4!JZW7UyUBGPmh0Rd%6XObO(=Hu0NTkj*1e8WF4JWn-}A z0JYe@iQ~WWl>(PsfE2{=b#x$p7&;<4zaxN(y4VX05f&h0!OsIwEqdpN`jzM-E3i*Q z)EF1oA}sRhbhP*;kBW)_K^n*xGi{;7RC5`y1)i%EEN%dr3r;y{E)=eM;ivJfUDv8% zGNFOeaQoX>LtxWImlMj@o;DsfscyazQdMzhJY`pv@b^AAcWw8S$F-TtBygMY9}4`3 z`01y_%VjcTsW-@-NkRJGZ2~Dn4qWAqlLEi!#aI`63^HN;>u*A|E6RTd;%m;L8)T7F z280H6cDijvQ?H`)$amzKvKQ+utnU*E*gG_z~lS9@u% z7Tx2H!U%2F;I7gh-Qz8Xu2wBHcpak>D528#Z)wq|tu==ZcK*&v?|R&IW8g>T!nBo0 z)IoN|!7uJ4x83`K18$L!R5ji?(uPuj(@XKwiJ(|xFB95Lp#P?c=5~_KjNq*iAJ)t`UNh^M2<;8Hy87BH&Zv{IYme{O#hbi_N|NWo z{0`bx{~XVoI6Qu`arIA9{+}&9`@i1lId;%(XYQ8HlWk%D8kj}_yEl1FwLt#L%s*Sd zxvnt3!jbGAk9}=;r@mt6{<8Pf{vnIGfK>)P`wwOWluecl|2==uB0Re{=9}HKfot)( zck*SE!`UW>QY(&mMnn}wCh0{+&g&PM_UgYby>(|)uhaKo#L07!QJenFvS((moC>>E zeZ}g@;g4+N&Xa=B*Nf_EwjccoRiYmf=J#EG_I7#R=Q5{-u3J8DI%IjyMhkuueS0bo zdHMX17&bWnrOKhNSE)IJ5-uY<`|;~<)l9ca>hb0E-)LKbL4ldV3j#m5#RNkX5uO@2 zOMkJQe37oilUcWsQFWxQVr0|jR>6Eh5a42gD?b#UiaqI%>n%+Tpv8T%32R#(urkq> zR8Ba*2Bs|D@>!Tg8|q^KZ1DZ|0{wY+tq2nrOZyf!gsq)@7VYXsIaw(*i)GSmws0U- z=(;3tO^iz^?mgY0Z+dsv+=ssgTRk(^CT%|exI4`=Kc6f zSvXmjFLe7oh&uGBy!G&n{}Eo47n(ZE3MyQuX%G&8adaq%UJE)wf*22x$pF-bMh@$W zUfAfPmZ~SP5PefX_>$91FvctJ!)OpEJT3S(p@{u|9YHBTV1jr=gevG3r;<6QFnr+B z9p-^bg0+Z#l_>aflw@LrI|F3LD)63}b1Jkp;lRyW-nI<}fM7|vGCM(zG|VNaeq6|# z&ab)tVz&u5ZtCt+P0x2eB_r<3x?M9!bJ<(|$lnpquUnb)&&nZbp~Q54>wV?*mC+Xm zyuKed0tRVZ0!q0)t3iMN;1q`0aQLcO;_PmarY|qSTw#N#^||}!i;+yv6IYG221)jn z{C02WxBoHcY*d8@Xzkb6!8Lz92C)Hq`FtBD?E;kg!SNc=PpI_rAYB39q#%k3MX4x- zWKb7C%aE-@{TR|XlU~xcm7jW=Y|~3%BA3#LqQy+19ctj=tc!)-*vrUxV4~2yuJMth zQuaV%_V%z#JL{f@M#n{mPaLZnICefUIxsQ+%y@!mt=4m|YT8cdoE$4NlpL_;$VE$# zOIg2R>Q^VRW-r;c6t|T}cH;DXOaTvCx&QZxe8>99ag@(4bz<9adqB!7;^#=v9q{)D z%cB}as2i-2zJ2An^%#eA1PC4WkisUNVLT7=kYJ&RdhuD|4z5`6xthBYtuGl8GeNlo z&v=`?J)Lw3O1}c3d+c~i5l;|jniZbn(LCj!+Yz=hy6nNTWgl*riSC70Ag)VzcTd0S zhl~j5CMNXsp3+UR*8II91^*EKK>>{1Y3f29W!Uy7BcPVRQW@G$;O#0y_wPdW++AFk zVQcD0P?Gdz4YwCnYCZpqyTTH;0ZsCtAMD=Hx}U5O3CAPK#s!9>rmlLv!K=w=burOu z#uXDB=LYsCh{ZqBkFBUEz%^N+H(~dhi0%{%m{|F}aN_TCQx&`J)F-c}G8ac_PVRnD z=yxeHIsQoQk13lcUpZUbPlzV1I(LI~GV03Y>XI2Fv-vL_@MUyj9O~(a5}TK(=)n!T zI^Zc+gg(|!1pN=NU_sbBx6{CR!HvbbEL)Nubow!v(~!=mAB(vGw)nCUJsuym-7^9@ zw+gpFHNa3I2HWrybpr<%N`=1Q6jItz=W~}icrzXKla%M5vu>v~_EL1>D92lVU9#be zX$`x3Z|vr``#S&7Cbp7EAZ@YJ$6pQamU@)DNJxUupRw>;R*OkoK=4d|?h=Rdmhu=`=Z@aFS1W04>82CTnaH=iH0NUop0IAd^S zT=hfevcRqIo?=Pi-iV?&0nMu-gsqLd6tTzVs%Ba@tj=|VSn*UTp0?2Fza|w0JSLn; zKS<89Hd-OTM22?odnRQ`Bu=INI)mw6+3Gi@x;j(q&C`L`sDEbVN4DUpLY z6JV#4e2Eej=c~I-hddA=A16$R?+_{p-fzNvCsp^dOOwA@16ni8q`04Ua+2Sx{`oZXtd>U7 z{vEp0dG^~4H4DAyzCl|{QsCu)ySRPz=D-VbPi7#m>E-n1w%5Hsr|bJ_$>*)z+wT?( zDJ6`rpUOEoTe3D%q$&yGfR2byDxFD;hOxD>901K^XYp2FriQwUf_L|Uw0P1HE+)-% z@xYmdNbV(rJ&>sh^|y$p91caeYB&9R2@NT!0>DWo0YTW`k^NZ`o$o@Za$>gLTvtRb zLrw68sx1x40_IE?>VrQrrwvi7paQvKMXFx>mT((2AN-{ZtfD_F@AJ2gI>zNKa8qlR zM%^&2GFop!aSxdAA|E|)_I9fr?UTGrg7K*j^=b7fPhxAtC-R+xi|dYkuinwHKYn(8 z`>Oev-*C%1EFV1*<@j_u^~3MOO40q5w+5DX`ah2jwqq86@2G=702vR^T~4Q#a*Jz6 z7&)40#KBm-9k@LiK=tOGY@Ee7!V z?JP~mLtd`TaS<4NA*m{rBY7C}CY2J8>SRR6esJsUl^g#cxo3r^b0j#>v-6yaGj)ll z)Qt7J&_xw3bhpo1IUz0=Ov0iLACOS>6ESO$ITHBq$>4OH&jxWfbLzkO?kO}geer6! zybYGAM{3%haMbXrO*2mle?L`TaF{#(KX%^I1}|0U-7)R47lrM5GWAwE>ZxvE8$iWb z5d5Y=fHafx2Y2KorMdv0(W&%?@$x0gv~Im1!lR&2{t?wJvtR@;AI862B%GZ3CD zXrkvp`pMHh|t0MhUb-6G3E>4|=Kt?q1e%mFR=OEGFw)VUX;3slJps>)7RGd<$ zKud*6$#iNLBK#CS z3GJy$Snr=&8`S&EM_akz;W}GX!;xpAkaC|!HQ`(O;LFq#6!Eo_xOx{WtN*m`Necpb4cb<<_X>Fn~xN~-r{s!EmO&CnZYrijt1pl4zunvH>NFC zKAmAz?Hsc@*N2#S{5^hWh?T!t9?~76{gSLpAjfh1&*oRt5_yNTF^r*xY*5F^F>Nk& zxf#KAYhtW4_-xi2N{qayhGh_|Sn=o1|Gt4>xGR$Utzo1#?`Mq4-?~G35~RHZe-jDG zUW*CV#NbL`CA!^B>~;Y(F`bs=+~l&T^gv>p<>^&y+pENcm$idJF^5AgRoPJ`DsnHT zdk?Yn`tY#E()HIBu0zUklR7{W<;d+*b$ zXEUF!2gF7%VkDOMK|BPriH zfdEm_N}k|-Tr7|i@4S&1x6P*dst_-(U~$NtQjm+u2dr|4i=hDe99eOPD%@Ri3t242 zd#-bV&!Nhk(UOJvsZckA)<|=Iw33XqE-^;oD7BLq>GfMzV9MJmnOLICmRnHFQ^od^ zf_n+?e1>xXZ35zXR%kdgy9rFRT>+ti`{pNKeD_~iSG<9i?D0>u|j}&kH{GPUWvQT+!ED(&6=P!{&);<7`XFAG`kh07QqT?TncHUa{U{emHz( z)A%93L`b44oKauhA~%-+jW(D+x;Rh(R#H)S?fx~xI>HkoP@&7$$6v_s0|lOS)VcFEy3I4X*A$$)qo3tVxn9TvDavojb_5EI`5#@ZMfOlMa81^670 zA&X-LNL3YzLHkgp2`)uH&f>Er&nA$c>cgIIwr#8qbIw2f@dGxfHcwk*W)ehg$ju! zfZQ4k=!`W+l&od2eCKs4qGv?O_!S7EELXY9{B)#_l$*kF*GOAF%ae7sLo4<1Ws9F4 zpwd@UmV$h&luQe)4IYl>p_F@*lcC zB?3`KU_d{QaCMORb2({UZgAa&#z(T#QBcJ+m0@Tf1UP%91jTdI6K~g;0IzWmY68>8Uul&9Be4( z9>h^2ij)UdzLFrKXmmWGHcCq>RDoo*32Re8ny3JCuFl36$5FF*xV@4t5J1V3uoZ|% zgbwAxJG9k>x`ATz@GbUQh6hP$#?*2v&Q=LAiPn!O3y5w~<4W$f6J#@X2NQ^(r)S;N z@_iW&vvS8M$=W9;|D7qn`=B$gWE`RnG#eJq_6WP#D3Zaj--`)c5e0gyOC9M6;T%&$ z){-wE_|a}giy_y|8!_Ap;YBNa4G;|LzZ2&nsm5SI6O*@gtm8GKPNqyi!Q8R(>vP=(KW6h)hYTBjSl*e_Q4Vo%y7trJM#Fv1kJXT@)Ye;H_ItW4Bp0H^ z7>_Cxfa?&zKh**X8gkP#c(o*Thb;Zdq%3hI=N}QZR59yI+%pGcCM^bdSqSzqVCz57 zVB5okM38Q=wPA5RXHuR-nB}v3LcQ4v+@HqoTAk;+h>hv!V!GBF>XHjW@r6;CQUIwQQ$V_p+B|K3t=hl;D$weKT5?E!&eF zlGtJXzgyty(D8&s$SJK@k|qWoEXdh>Qje(pjyaL}xSvGA)LwgWf^t!!yrY@;PUd^S}o9_RRVq)S3jnhebxw2ED2 z9(}tp=6IF2rqnRG^&2@V2Boy+ekb|AUcQ9Gm@?#{e8wA@X$11^y+Y z&boWC2gdp2SXin-vvF%6SA|i)Gckp8mV%YfF4;J5l>fs9&*E5gObv0f#)_1oZrBce zWJ25(x!;9)EZIfM$_G@a6vY9FOm9DJ!e@Jv?IqQk=t5mYZ!4!f2h%!DUgZoOENxTW zXWE$=r%!xfTIsC*xkUOwhtrjhV>c#th0S{Yb^Vler{VjvhM{5U*S!rbVlDlXH#65a z$S#TlR#u;HQ0*-WI6nL0kT=9u zr@-fwFcv{Ed615#JM&JFo6-m=7O{*ja+&&GE-K+05+!A-Tlv7<8`o8k*xL@CwAd~rF zPl&wFX~_I2*WaC&J<9AjyxQ!2&hyNZ*=H0NDjpO)vmVDd!H&#R6k9D!4ad$5lJ;Ow zo#bGv-S7BN4BBlO{a!rIoZQFy_Yt6)u2Kx6Yob)>G@J}&Bv1yKzv?VyVv7bMB6BOsv z4-a%?>6OENn$^7V@nK?`DUl#Jer{4};8ywH>3!+Br(ZB<@GzO~^_?v3* zpcq%%7Hrd%*Tz=ZA4L|4ItSq{?X1)BOB)o;qYpTyDK~+$6ZBKX5K!F zj7}9t_nPp@tk8?lp_7EKQDrr=`GLSecKH1Xk-+>74g!VOWO^c08Qjli+OjY+iJ*Sz z>xII>9Cew6JM@b?LQL-)V+~1Wx+7j%k-GDCOQvuOKN;OutVI?H_M;ab@h>GY4!cgc ze)?~#FoY+Hq>BSB$%c2wlM^W_^`#A&=rW`EML-J!-(h!*S8xfMhC0^7tnhVilHpL| zc0b7o))$w##+1~Ad#ctWiWDa0aIzV=uVw9JvJPYKs4KYkED`d|J<~DhKENm-|LO-_ zr~t$P`3}ZcGDc1W!L3q1!rTC{EfpLDAji425SAUGOjrPExYqX*q5Y}~VssvKZs44H zG-c~WP5xJhEQV^xD_^G_J!SAzoFsX|(IWewLT%S&kK3WI(uxB7wgh}rY(FvQv?!Wl z|G!PU;khaT804J)(8IANID?V9dELe#s^Gb;%NzjUmpN*nEO=w^-(dJU<=%qQ*6@gdh~O z?X?lc@*!h7tZS}qXIj5z>0QgZdXevx_v&U&Qh5Bypu*peq7N_Wv!1MY6mTW)LDS0T z%H_qT+p5DyPmjyZi6fv`o>*ooUGOZ4SRS_L2XuhI0KUHW<+Mu>B~~^=u&E{rnY;dYa1<8*AVZL*G;y9z_livRVb=%CM`UQz*@+M3_$0o4L&~F zSA=>Hut&vprPxTojVgjgY^6dBXNjiWo^kB17_sEkmyIz!1}qLHcqhW*;^NdCgH{Cc z{?bw`PG8MTd-l0G!@1e|hE&&q(YC4l(e~t})d^lhe;W3TZvOU-`F_*KA+f%97VH0J z6#jlY+Ne79sG~Juw62|lY zd7kh&>iay}-}hw<5yvHN8kulZWEq-A{`=2Pw@bjzk-!Kg#aMAz1OZnpd030(rNW+) zh6nZbVw)XKuCfdfxIvSgJEO`*&_u#(*6X~V$Tk`JCs-%~zDr$_?4WiNW9NuY0jUs` zpHm|7VFZ9hWX2|{S)-h5|1C|* z?9fT%N{h~DkJ9SRcScRGD;L!j7SF*m+~JFISrEqCb~qWLjb?RJ*Y|eJ4Z%w2Ro;nf zi4cKzf(6pR88Hry*#rtOQATy(@z6as|ADM=gND`Us|p zFNWO+1O&>lquRY$1|)e_hA&j=8WVGZmp97#FYOV}KD$+MWKBboW3*m~WszU=%HK0T z4Z_798kbF2Lk|C@Wfm!6d3GnA@(-B@n|J%&&+s|^+5G#7vCNOTYR1*2uRP)cd0PFulf(Jb)$6LyBfQ!I=F+7lPvB1eFS8UKU zO4beH=1Y#y5*D|}H@b=KB%{03)yU-I?$2=!2%8jD`rvEu zn%e4sbb1E|ROZ}1QnyA`m>1ZlNE*L$dTOd##i?>e3Jeu z9T43y+keCRcdxp&Np|vltXZUP$-n|9e)DYX-}h}bh6}z^sjpt@L^bOwxbFBly!dsz zxyl7!|N0Bh7APW9Hx#F5+q=#+XRK8rh>cgk!w|z1vgjTd$`E(_xr0K zzUHeKGT*0vVCN|ro?B#e>S0T%`q%hBr+Uk87F;u7hlT9Bw(ixZ_Jdu@fiJE|h6L<$ zGp-6e*kh8iyRz46&%w<>-zQ)0`<^8EJMUGPr%Cv*vSIkorr}2wIz_#ws!we84j)z7 zFmmMJl%;!T_4}VErc)}S7ruO0)Hp2gEz&KDO>I7MDD_org8ntxgf}DooA&wcOLjMT zu&Clv&kyy~tyO#9TVCz*Et(v>^WnX3SZ+Z=l3eNh8gHfCAj|abdz<#Xy?1WkTc6Zd z`vTk+Ee{OXx7ppO=SY=*sr9iJ!;QoD&Q*-O8vcH6U&q_jS9yN=S9|Y`ycq7{NLZ(K zUHjVqZTZ*I(Z8#jpU8b&G2`_(t^3+n`~a;lqz%4l-6YrCKecc2?y=8b&fTj{@3}Bl zy?@d9&I_pv&xViBKHgRIt>zk~OvPxcpIGAld9P^7x9EwL=7$=;^?%R-kQ5G3GkI6p z#8Z^_ECb;`y8q(ZH#~rll%&^cXc-_s3mxUwEUtC!=DVzg<@hB@=Muz5x%0#I#A&MC z6|pe@Vu)Ba;6#Fb)JYoyXGKNcBNFUHJ-jS!)q4YHU6KA7<`^G;L7&*iSW}CO#UkC? z8uyb*3sBoE@%{<&T6hIGt!Ru5_ZuAQ+Cnujc{t2@P?czc>n#Q*)+ zpP4qQqCNcXw)G1eLAne%V}p%g>_xlNT&&qlr*+!G14K0$3|9>! zxOXZ_Hx1VInl)w>d~)_yUyTbQIvph2v|)6re?qOT zR>V3-g{=KCf0HduB%9b447z{jxjBpAi+cN74|jg+xBz>LlloCjC!-psn!_iny`K~< zG<>~GN{8=G3@-gzm9P~XvljtItTBHP^awU~F@qs*^>-^1jXLmp_59Y~ZaoXB3O}k= zi^uKh+g`r>*4AY+8NXa-`McovPjy9wn591g`*KN$z1%#Miir}i z+d<;U(+N?*r)C*4&K97c3UX5lpk*(77}XX0ynupXO~8TLrt~k&g(m=9F=Pu}=0|Hd zKpz@)y&otuIS3SPvViGX1nfba%vr&0k06K&TJlyigAFM_jzk)R_sMr_hyjE0EE~bc zlK~5Je!2oCkW(s*+BtDjzo(hqoumN`r-v0;IR78Z_ddgK~PYjR?9}jf=S2ag6nq zFBzgK&MaSsRyvwOiPn-gY6=xtFOAqiJpvmKU@6S2_gD4ND7Xk{9F9e({0C*Hk6n~8l z*LxE*C^^K5g(-=8V8-OdK>4z;tF;}vhWgyBqXtEXeYJHl>%T4o-8C4C5vGhX=hYrfhXjF$4-^7&LN5K0%}LV} zG%@TjLY|vuAM7f|6#PS6D78U9k2PE6jfdKFACUJGB_9_4;f&v6?u@8T2<+X{p+4%9 zIY6;~9IaxW4X@%a(?^3hBkTSAnll3C2Yy(u?Cboi{`2)?hc zYib}vY+9d;+&iWz?A(0Bk)WY~oN;VetmyDKH&|kLs{G(?iOQw(Cmw)%>%-0t&a}>m z{A8Hb)O`E=#A#@k_m8PL121S$;A5EXJPa;f0U&L-Kn>WC_}>A0E0u@?XAOuf5&E!|hdc;^A%q(kfM5)Z12Js)qEFHz-Xb#N(b=TN(xD7-;o#aVQbf)QQ2+!!azXOK zTNHqa3T@#F<3L*6HHn;NxDv$)o`}uDH;ViNe2=M=G~3J?s`OOn%j#KKJfx^wPf` zw~yJ)UYtDSWtw2RDyML&LZT`u>LUXDk`QNsfW=_SV3?*%F-F`KM=x-;tO66#Irk+x zJ8jcZD-Za&q_1cj3>J|&_c2NOvOwTVUZKemT$a^L#2apQh4p97t>#ip9dY2KAgT+x z%(2#ky`W%v299VA8bc9}N-H8;L|lCb@m}2DO{rDgpA^Rf|1N~Td2!zXh7G4o>ao}E zPuV~7Cg9%q26+lty>GW){p@7Z^0fS*g`0o>C8-7=A1ieo-I$}Ds`|PfS?z~vl^eWXAmZBH}T2P=S z+)V?)bP$igDT^+lPu376-l1f8TtxI|4B&2-CN4mbW#mx6@lvCUDgse-hpU=!qbijE zKm@VV;#_}@0wA;@BuMUSFnA61k5Tz7(jJx&0UTtq+kkiqFcrZ$8yX=Go}w~{obk zPy^w@=Yg+Fg)7eT@2Lx%xca{)j61e8Al4RoCx1qUpR7B1^rb{|M=2anP>{aP@!QJe zlhOonXmsu{K+-h@|B+`u*9q3&2^MT_?vkNrY~l)ZmM*;4z2A50^>V%TcCN?z8Xec! z{A-?3ec!A3LiFS4M~fP0dOw8>CJzD;7RMOLV6hM&kFw$jI!Hr-fgvA0iBw#i1RdIB zpev2jVbrw1H;)wY`A8$x)TIEx?we{H$T9#@=nek48Xus~HV4b8kLBYC1$x9UseQ-| zO&PMQcGC~B3z<$%Mso78TxDxSa`Asb-WDav9G>V^mX84T7|scx#0OZ-mlf7J`*P7~p-(^J9CyE#mp$nGMFggXrsA^O}3lYIt|BNF2PpT)RPK|LF6+d#WCti_Prs~!92=61;D+S=Mo7;==3 zw0_(*(D8h}-1$GAqVL1HE7EQkP6q-eGdCu_9@mav>e_EpZL1;W&^j3Y;aX@;f zajDR8V8&~69__|JP2Ozj-=^m^tGv1VQB<^_rIVL z{8gTeSU20?``l736^}Z+iTsqA|6(doapB{{{E>t%pS!Os-nOew`)!`7X8~DsauWbq zP@IFkrUs`23NzTwQyOn1cS6Y^1MnP(9(iW4LKewWybD+??+F!1dP;C4>?s-m0>3<6 zLP6O0)IB2A#$5OXCG%LY*m&#?1Ff$%XY0eyy@yU=>HQb$y9eB;S0f@Zvd|S`OkNow zAIU3`N2g}?T=OQ*!Bnu)FN3Qz_s#3fJjD-pJx+u`h{R(rrO44FlMvcYaUPaMiL`WXh(adWD3uI1q={tl`l!kSmY6 zXknXVLn(3Mp%fO}@eM`DQ#p|oI&1I^j29L)V1oqmURLnBQ3E&_54^BW+E+1?B~!SG zDR~v=7&T0`u~+Ulj4KVP9r*fkXyM~*SA6>s)|eeYqxRaslwce#%>tWL6=5BsZzo); zrX2i;gFXqKR^EfO{&9IwP<~E)V^!wUEtON12miJNwk4lJvI5~EL^lWS5>PPiz8d6_ zf<*<6E;bk){1*@Z(w-zxATBsd5Cm~zK6>)w#D+&hPoy416N4r1U+u1}th!%Wb>-mj z37@5tmmOIa_^=oplc#(_PhVPcUb*P`t4{HRFA^@DhHnyw6$19QG$viJKhtfwxNVbO zb@&(Bsq#kA1ohckg#X*@H*BWP>3s_yZT@lakOJvm_VuXpZBcv< z*e(UyBvWH-8TsTNpFMOLDh2FYg)>kq5nrG|p1n0h&JpF>D&UZ1DhoJ}A(}#&E}()q zWK5UPBGI?;-@(BMt#r97!3@PmBd)qrbs)2z=i1)C| z9q#t8iw7w&o*HRv+G|q@gnyjPF$@9$vRPDHJzwl| zCt+1Kegfl(p`XxNeGqXtbk}8aakwC*fb|-x=Hf5e^yvwEXsO5Yh-dUf66So4eBFdd zB_CiJJclSCn%1WNai4!ZcRytOYgi#dyTNttW1`OLZ%LKl`&nTbC@$CEoeek(j$WVLLx5wQ1#KJxToc+ zA$Ffl<^oM5nnRz=Ez}%;+k${?bk`Un%%66$RiC6A!RAvzGF4CTC0SMkd@cmv4yfQ| zfB+iIqmjF+P{}!2cwD!4O*2!J(Is5ul)jaKa{~y&wK1HmbLj4FeDLO#LrU#>vG%I1 zB8hmGFE2sl@Bm+-O`B6Ds^}C$COcT%#Jtgeo zWH@`QeXdi}jOw{lJZcfsr%Wb#Qjoj}2yqC*VyUB`x6@AN<@GbgftY*_Cv!MYOrA^;J*5TaC?voi%ZyJ8Y?7 zu3NITgyLci)-R~5VQ&%4j^A)fZ%q1wgz)%cvhF5ibLQK-c#bGb68&`${Gg2$)}qc^ zvE5YR4RF{FtC!&GBF@&J9(I?JEbZ3cS)$k+@XYN&uCvDORLb&-fFj5;IhKX+efEC3 ze=cmUeu(y%?YFY6gk}<5p!xHOPYD^R8g+kI3#s0w2KY;e@z*e?xFB|Q8(JyMiZGi| zWqJ=)o8?cz$K>TN3l>Ef1 zq454g`T8fTri*5x-MIv<3h?)#KT_bC^v4l_be{6q+xr^W3M6kWk3sT!*o3?>pKg?k zatR!{g0%jXpg1?)5GEQa57LySW~ zj*_r)sS2GQk3Uvv{SLZ!nL`K?n=l4{zIv%vh!Z3NhK2wXY=xXxVmaa_wAUvlNm!`> zr;XkEMW$a7EFs}Io;N+psng-ickk5i{*xS?Fk0WSim|Ts>YdDNCXCeWlqMl;9nNX; zz3ag;gBi4Ze zv;xNpz)BEY2H~s0i)}0pq>*AS$C(f)_-IHpp)VYeHp8*3WlUBdQ3%LcCRm{G!lA2Y z&O^w`=uuYz7Ck#K6rDf)G1B@zE{OGD3zy1DkJ*c%l@55g^7MxB%nj!_t>oF_A1n;x zACR8aUQTl^!agZ>`l5NAhkLH}(Pn04b$BGKuH|A`UY(frJ<{n?(heZlk8E2iu)8VE z;a))&iQ%9Et#kt0sjPVXrjjtD6+P_^eu&VOktLvfYbohTMBY#Gpy+LB{t#XM2=dyH z3cjHBY+?vliCnAkr)AaRnj}~(*GdTM&E*>lfvS;;;H5nc3*@$xsT5coJTX{P;olK` zs6%n?P0^K=fsZ@49-M!8{P&^1Js#^gWn?rQ;qv#8cgvGM^lbbrVz1-9OEISybx?JV zh4s{;U1Al`)&LXzjJ6VV%H?pu03jIxD~D$KMD_cwL9c*zOc0CI(&fJZ8Zcn-6uG`1 zm)RF1%lF1`E&G6^*)SL1&gNaH|BDIJmeVX{n~)JqCU+O$OA3{o0z+O@@o$kHJF&+a zO*8vGE>wRyF*Tnze!SNm>JzMT>$z5YlZbZK;1WB!d^Zwwpzl3(tk3%2n{aqP_r0BKnPI+krGO8Z zuHaxTdH7}^aYtgz10G`<^$~!EZPMv~efTSP$Fo7pT22R|T%T#$LzBcCiOzUkjXkSBTQr2$Zw3moY9$cDeM7ePk zj*b-hhwE>bUKAP+G?=oSpCApk4=^2?y$9@h%K6R?vm(Q1dwP=C(Z^eo&syu*2$E6y z;3FWheF?W_%~e8Q+W7}M?-WjJe_y-(w6mWu&qt)n1^?0gydu>;Q(3wC-+8VcsSE%pTs5EB8O zk}Sjot2Gvt%b-twG=XoX5C%-FN;Cppvu4b(3y&ya*Q{kpw$^|r?%#u6bSI{)e%0bu z3S;OD654R_(8F1Wj<^y}yInvy`R>4nHltc%4|xv;LG3?LMeZA8tV{zFjmx?oyiHlF z3H9dm5&L&ZVO#2D)j9s894q27X*U$lV9tkTQzQq^i{bsYFQ2$U=DMk-;5*4G69!#h z4_^ivF?XmxR^E=V_*2XQM=CJ*>+9mFcq&1Q71DpHK5up;2&i{mxd z`fn|^u9}`H`N|m@oIl`GmJ{6svjycu0f`DDT+(D=y)A<%L1PYr=P2Ep z2&mS0z@L(=&%XpuR9FQN6gX|zhMYDM z=%{w!d=l_fi^uc#Q*m>2$ACH=EPBv`Slhu~I5l`5o~d&Yv5q$f9U}gfXw-E#($@6? zp~&>j?;@vH0#${wky-@*nR@2KN?Kp|?cF}_pM(Wzv{Za6eYdBS3?9UZF4HHqUG_w)YS{4hh9CNU;e(tx7Tm7bO!@%LSUauLr_VP^5uG@ zh?V$WaiYvTH#Loc)1%nZeNnfQp zC@TVj@YrIelw7UnaNNix8vwIS8Uz1Jn^M(Z(d0qi-o!~1!#z+RQ*UQukggQ5T<+8R z;OOIq->gig<`<^#_vt)2(I8=g@r||U%@q zG6=8Ut2!PP{jEBJ`z`J9pF^MYiHbaeFU=|AfEYP2MdFVTDG0|_a7oR1guyvQG6cLw z6enM&bNU(1eve7bz%ZnRa)=Fy>53(72PBYI*@HoWt|Ni(d? zXmB+tD;%tlME}9vj|Fh1KZz_)^rBbA(lq}O`%{e4beZ;Gtot+-dNJtN7H;X&+ReGC zFIvnvAe%{*K-9ep9Ff}J%}YoimlY`x>7cUCL(IXtQ-|>C@9Il!o{Tn@U$Fj4L$78G^GA+5TC^-ra-=P0K?^A1uz`@HOTP20JJqx6W7RilkZZ@-rh zcqpCR7cz98ij)H+8Qh`$c4JoR3 zHhzu^Bt&u^8kERHSt`$Xs9yZH&0+3T2jn5nJfaP{KP4ZUQ9~d`eEMS5u?>6_vDU6eQR%Vpm8={aLWcTAqxPT~5lRcS5gf7_8||Oz zkw1}qgo|c!-KRCq#VlI&_}fmk5mgep0SK#*ZV{MmBlNx@p7V@|XN>_idL@ZyWt+;Q zT^LRR%cy%{T!%A?>*B3QhWZGxT|pS7D3Q^Q5D^>+)N0vLkm;)n#z@mC{TU>AJ5y(J)vqdjkoIuZ{H}A1Mr|hS zu{qhv0V7J78iwP*pi!x-`?n*dEH> zmwex)89vy=Vh-6VKg#ocBG6;BtFu=oK8&;54--$y#@+gD4Oz~{h*Fu!$obPArjAC5 zGcnBklk>l#9DgY`51wKlh;|I~{P}GxV|KhIq<-q0^^-q`R@0}Q80Y~_;ZH?aC6Ds zIyV%6tfqP;-&?LX=&luF*y9T-F}~HhO(>Z@T-t;-S!&&q2)=7`E66#Fnf4J$cZzY4 z=GD{pUZGgZvoJvgqcR1MfC&o{(%46{fj7l-$+f6uI|&lfWrzVm&LAtNi}-eJlVqge zEQc(r$w{1{7QC+=2apgh)MkiOE*2d35m{e3ZZdTK+QIqRd8MJ6gqfsA4UZZok{@+! zBR5b}ixpIlCVw^8TRjejoM|Ac#Eh@&1%#e2eLL+Mm^E3Zh zP|*2b={4F{>#L^yz{i*C{!DENoBucZX>Nvc`sAXy+ryoHc|D)c$MbQFNYd_&Rv8gJ;#tv@3PxjRO`75!0Iv+f#y ze*c1f$+u@$3wY3v;uz8SI#{8lg0tJr+7-kLOk!>Wz%(4Hk;~ug1bWcY^kB?0WDRWI z&IvG-m%_&1XD86BWr|&`_u#n}13Jmc142wuE#S~Ub2UU0<`=G4P*WVSPY@hA;m&si zM1{n0oX=q0qm!VkMJg%`j2MEpyd&9Kxzv~ZzOAn|o^pexF0y)}r(daap8<(Ac@875 z|5jr(6cDne*v5bb!im{D`>ovG5dy978PNc?2tt8!ftQvo6arLeh3*wt3$D*7St$=4 zojXHRrB!2m9a@n)2eZD3oD$0G*s!?Hv+yC|I z0rK2yKDhf9YI>N$(j~ph&%im|o*Rz$=YT^>6Hd6Q299ayG~>P8t^IkKzryYh*?Si} zHwg&|UwRy!S&GYe$&rVN1WF(zrXkHZ^c1AOLxsu;6cB5oD#pqMOu|!%;C^+AHxIlS zpp%LK&Y~sJA#yEqp7STs7v%tNPN0{RUvdig=h7328;Li;2qVfIjsbAC;of{>?ll?- zXNk{cE*gSG+Tp)Q<3WFm#l=(<`u(`hc~e{F!^>A@AMt4N(#S|XazHkXM&2HPPh)oN zl7X`{uwKE@R(51Nz9q%=CBH>K{`md}C=A{Z@Cu7WhGlb8>PP@YEPOk)Q;LP@w{;O& z-g#f<-a-NPfA|XzFxm*Rg>qK@#&tE@AU-0+_65+HI&MI`b>r0qw``)(g$rR~c@grD z^qQl6Le|e5--rT0XMl0?K56+GwiX!I!6Yi7=yvdksBJv)a508aR)@+nSJk zANSY>E1c7Zc}5n%pJ88zmxBNP$>;v6%Lpp!X=)Q8pfLa+u+Rz}E9X2uC#~}ze%AML zdmUBC)(1$GeXt2v<-sPak=oJ<-8x~1SAd#WME9nXKdu26gr@=Y?%thpME%D)7}$p3 zV+x#YLkT*WY)dw?4E&Mh)}@A=03Hc7>j+;=-E{oOevUTO;V6YC1-0T51=3`%1RcIl zmEZUJ>93ecamE{$Q|?~1%Y#!Us+bRKr9WrJMs#lXN2TS5g7AP=3uq^$if~Ao(VN$5 zmKMUA{bbLt7!ULs1|OFe6ng=uUIZN~fjvBw05D6L#U}ig0lx5sinrtSN2IXzg$_S6 zPtY70BThJ=!bM zp&zdBbe!W^$L7U9UQ{#yF3JYP`Nf8p21CEL-`&e?Ug}(5t+VY^zyoW?Uo!yY2K>9L z06bo3uSc2vZS0ZWht+tAj3P=!mRc3!IuVnod zka1VockQ5p7fypbCsQJ3$jn|KZP)3+AORe&cgDH<9OX#{?NZG2)`OnXqNjNd6%Al)Ta?0uY5)-~Qq*#N3{W zU*|6xm(PmWE&#=CMLhw&?|g}WfzNw*kQd-WEAVQQZ33<=(vbd~pCW}8s#DxS7sGw) zK#bss{3l*YAdnu+*|%papoPOEL2STe6HP?OdJ~xcvr#xL5sci*2~W2{ttD7hD?+Iq z+<|A@q%a@f$$V8$zcGNLuz3fC0|b!UPUG$|$^Ig7wO|d3-Uv$r;a*BMBt~TDaz5~Q z>9S@?J8^S(K8&EiC_*eUvFpx9g4*r$)xG`!0NTi9&B#*h2?Dwtka_s9Ofw8_Axj0A zK<1LPmVSJ`ynqMu>0hHBMv2aw_p9NPe^#Sbm8O5~Y?z2ahik{Qh{TBucq4-b-V9>T z3Z`9X2)e?OB$znf#N`dIc~r1-XTJv526grhua<98-Qu^l-){!x1(1WxLIq@kVA&77 za6)mG{FZ^h)w@oBj8IW4u*Ou!@{&*Eaf6MHU}t=m{vAeW}crW~DGvkF?^LSevUCO@I$zYvQAV zQuWrDCdxvh|8P1z;PMnClT>dbH39h_jAP$qNCL10Mm|fSib|S6kkTgH6+A1r;gq^D zohZd4@VoO$($5Ip?*k+W9P{9`-;%19%Zkxb#K+mywQ}*kuygWX(^$@_|&{M(4pT ztnuxDJ0S0U-3j<0SSST_35KFcF>;KaXNLIsKBIb%M8-4_G~y0)VQIDJ)f=5N!v&Lqv) zey!}O;o%{>s}n(q&rU_={Z;Nc%8%@Nh0uMYt#0B~MA?_L!3)kD-w)d-s&S_)$U(wK zwwUvh>C!|4XTSr;(&g;qFV~Sp9MGY?F=mwBKk;8=fWTBgeyx}4*q^P+({(C=3WSg} zj;^9x&PuBcZ#<%Myf?*BFqMs~JB5BCkk8hcBcex^N$KO=3dh`S)wgHCI4t&n=UIxk zLpx)B`PB5CQri%32jZYU599D;%Au>RIU!=)g~wc$8S+DPPI*ie!ER)%UQe>VNJ`co z<`?ijGaf5RI;Fkcba$zxg$d8n?ZfN>(;nuge65!=rUm}sy`5}pf<`>rE#YtjG~Z4M zfi?CKa2WMOFinJW=8^h{!F$2bR2l{yR!H9jz4U+sgwr1ARe^oTXTeY^w%pQW>%fM~ zhXo*$26Ik%EO`#qz(pMHhj>g;GyVznz+as`J812ZCt7z@ba?d&F{q1susBXUU_Lt2)oi)w#v%h!x zsSoA--PbrfFxS(t70tm%j_1{>Z9I|XvO+`0?z=PS`-EoiUTVBr{qW%Xrg7?nl6WiA z7yd_Z864h~e5W>^?N5-sBFhfZkcTp;ocr~lBKITOqYXc4J6$(IHo zHvu~jRMG%oV6D%UU=9nH_y$Kh&dE~j0u==03_&j=mKLsB9pp5Vc&79@FEvZ?Jr)!)9a^|@LZ-#TWn2|IPjE<^CcY;jYk z=2T^JBE%6_GlpJ(80dG&HqXXTqIY%>O0R@5v3r1Lw$HHG>{-i=q_M ztBU@{Mqh>&$fG7OAl-}E$P`*KuKJVTcz}MI*01oVTUapoQWv}FmTqnD{quy*ogGX(cZReQPIs z4rhTybzOKpw1a-RiT}C{C`df!P?7e1QWhdc>2cIviRntBqDo^PPP zb>-HlNRuCn#V)6wE(&dAej4Xq-^KkDv=#25GfG7g7du$PRh zcCc8Azx*?a>K<6Hewr%Df8K33>4g)06e4sC!h&zzl_U?Jf5Gl(a z_Y8g4*3W5CE{j^GP5I;NcRT$eH)dAKb?2>uHa>EF^@CIX^DH(J22feOA8y+ry%62# zW@0HMm1d0;o#IT0&PW${{^!Ea zq|h(tUjIQTCnPA}nFJ6U@TA_G*Y|)@mI)*SU6!;V-bEasDIXrk-{OkV46m*zcnzIsbFPy~I0X*OKak)7Fj<%b22B4h7ZatJ zAuUD}32N!SP@X+~z)dxz9(d2YX9+y)gXkTZsL$|(Ve$lkD#zo%!0P=xAn3OpvoDG< zQwC5ZLzmJ((AnR>0)Uzu@Ey(AyAG156P(SoU8%ZBBo+dkpY>Z8BvBXYo*?1hFZF#Y zRFj;gCRfU1hSUF4)?d86qIs}(EX-R&axU`E((3=-_&Um>R=!sFMtQ=DLeA<%?GWdX zML#@%G^IQ_AdB{)8J`GJTg+9DvmhMh5E8@}sOx=PkgOSNODQ}6fk5*yvrfW*tZwx8 zP1sM{b`pKV|EFfKZ)7+FpsRRqn5k5#IxzP>6ZRrU0-8cPG@|8A{6KkhJ2A~4P$f~U zzBsguSea9rTflaf5Ms?CT@E(mgMH;Tb_OZlqpF5$PrJQ8@lEg6Xak)(D(QLJw0v3a z8p-zSV#(~)+WWapYYzF`BonS|RQ*`=YZ({rb$zapWK=l>^gPA=WKfd;(Q7%8w}n|0*0fkf9Tq6Hqv0U?G=PD|5^B7* z2&V;lZ6}NE$mRIo=tdtA>7oN(IGKAM?0ps^-w$W2q0j#{if<0a$q}1X1&mEr2lKQ_ zU8rnIs7T###09F|)OttA;fXL@9p)g^IbrZ=JUVitXWVq-c2)5zD=P#*u)sIM0ZNy9 zGNjVJ+P+xb)k<*1 z(ASLJaRIIlSUS6Dt z+&EQy-u0wu@ye{mn@xIBwVO(q_!-_Jk+uYW481J$R@g| zK5Z1%0#=RZw|HntmHc^RdR<^tZgl)o-tj1cY-7Nip)(idyAsO&6-F*^cJyyU$+H{p zhB3mb8!s?+j*O9+@983?{2em)nFiTv?EDa(X>31`z`u8IObs7gW5GJQnIEFD)g`E6 zXQjI_&SC>xiWSz!0H^=;K5H`2iu?7Jo6&>U5OD@1c<;~)Tt4HEHX#9*Gx3F6IOT%B zJ+ajR0OcR|0CQE{q% z3%Tj?iL30vxltzS1?tCUV>+XD4$wo^$faP47CD z&M2Nrl8nrs*r6+bMzdvN-oNB!t=YS<|K9~f|E+lXx<@RaCs23o{PLJWFM13B2lI>l zf)eTpiPtzqOG2tl#A*jfIgY__FK+N!f=tVX5&7dH>{s~hcM=}u(!8bHRC$*wQ%vQq z`qONES9ekh>;6{V-A)$KjBPPOgL&Q{C^kD6`6B~H=n3An1*F!tivYH=e8}fcKo%vdlLmSlJis*C z#0h3waQ!(tldko}yvRB2GvC7qoD#vjYWDn1gi|W!sTPYlY@~`2iP&A@cU9^>xLc#J zJvJ3{35AF^n6@o?tjaf^;n&*UzbkX06>p$fY;KFW;kjNA-6vCbRXAi<*Vipt%eUjr zoSRQhj%RkNYuQ$wts1x1piJEU9&R=+R9Aqm-SHE9AOGHA`pehT8odiOoV|fN^bgU> zKLxPItC|=6s4XQcS8rSWT)*pgPcmTR$69soqE_9n@u+7dYwH^03Xy^fvlBJnJ50md zo7Y3GR%vk;&n?!yB0-Mw#5Q3v1&={iX?@#?{`kkw5%p~%12`#AS_5VRUBovBpu<*Q zlH<%;US3K;?~jgekx&hcUNe|mdyxOdg7NcHf`Fu6MVio~ z;r{~ET#Z6DQc^a*I{dt+CHrCWN@p+2Zt;-m$@3deJ9}?&mjn3g7p*#?-4|W^*ZUU( z)H=8cBt!1k9k>9!?ugRQ%Yzjb{4CzAt@nZGWL~^;)yTmo_yDnLgV#pDeSXLX(Q%vm z{SiA2Eszqu`8?!rh8~jgK8q_zW)#$F1?i4aiNtTJYWOaHj1P5c2(*@D_dZw!`l!ut zOv7G`ndLr&fz&`QoHMkGeeiC=({x|SJwsr<&GO!Qn0*b|5ywBHuqxos6j*7@a1E_V zNjW*NcRDY?VV7x?Q(3Ryy_^pjid^H>`7av=ox^KuBl*m5g@v61YeD7T!ynX*CuOg% z(YPmSHzXpd-rfb{PSLt2?ecf!jgt(xpUyihcIsIz_4O@AD_+{k{j_#}ars3)*KH>^ zY%%m~yQyjM(z$J?gjvmmC5P?mbz#a(O=K(2So~VX>m)t zNTgd(#$?G(@Kk%9Fcul((WOBO+#3tSZ|)|986ahX7YW#VFQ-W;pXMd?de){FB(>F2 zF7?LTcFdZo`<8O-ZzRd2uBg#dAjxH2`_rj_P9cqn^G+Oh(wIk%UDE7Idvr&2wB5Mr zc)-bgE-4_-Aphe^Tiq{d?@iTrvg#I&-~kmPlFTW)*ml?g1(^PeA=YR&Q7X7WSGFrg z3A5^8-DjM!*F8x%xo&wXVedmu-XT&6-Qo=+6=Ba>4IYeEr2(!*ei+jP0xS;#F!1sw zy9Y+&{#8|1Kifr$qKNlG1o&f1Vgv>vleL5aoZ|LpG7&~xb8U$c^v-o^fk&Sl%hX#&Uc~rDDXaMLHTt zd{d1pyienmypoC6AtTnne>?+2Uo`*-3b|s#ta2RsH#hDz zv#a%G(#~MT;_vP{3d*kI#u90y=gZ!c^C!FF^||s20ky*)bUh=ENnTXM#zLzz8v!Oy z^843a@BJzDU@gvYuh@$NjNKsf7%w1kn?{Qj7_mmoWjQEHhm46{*`EQuu~)gEsz;ZX zla4TO~DK zxsOnN`eU)KBqn)N^=^a&2LypK#NJncx>K_>(b;JE=JJD@{R179s;5Z9TfUh*8lS=k zHup3~JRLQ^v9^I(tWnJwim!S}n+&eD>i$@Z{4j3%tJ1Y_MQ?mo)P&m?5T=M#g4vbl zF5`7gJ-ynCIh%m4zJX%zn>pNuqadu|l-r7}Sdmh&&o{>6pWpDZHK-yo`YZ+{mQGVa zTfts|D!gNn3IYNFqI+t=7~x)L2*r5L`efRXSX7ahkSdeRNiV$4Iw6sUBEdWyR56w} z%_nw?EPJ#SEdKbDS#X|`r=F%@pz#7Ojb)vJ@?>`%;rBa{sP!sm`D?lpv54eiveocP z6DLVw{pa>dTMrFr?3B{1mFDfs2gkOr)IRO>)673}u0*0->w13lJpHf4CKS`R~pa@P%8`sxX1Bm^7C-+6g z^B$Qa<3EO97+z&O`x)_3>1L(Z`=(a>`-^^oRBAvzxJ#%s`)~4?!jM+L#>X>hx4F#^ z{{Hda=nGqS8ds=(8`crMJjhy&a9=bnTl;e*zV-N%!#Feyf}S%0I_^dYW~{dhBZb;H zWWq`_F>5D%TKChAN@UgC#XB&M{%3?yGcz`WuT5FAgB=fM5Ka|DY;Nb~UR>15Miu+E zB?`n19iUNAUtmk5Wz;BK~;^z=Yp?{inDwAg9) zrxNLA(O-^BR>_{eu6XsP?1c(C&r1469+m8S_|fcmha1jl>mU6EJ#LoSg52&=gJ$S~ zM1~o6gL-|Ow==t1J|h3;%EX#zopSNr;e5HbPF(>WB-Lo4%=ZD5@pn-!`P}K1GXWJQ z+!Kq%COz`w`T75S9*?eAsbsJ8oXY!WV$7maK5hma2{lP{Ercci0wA_YBlM0EfLE8J zBYeji1)+$u$ONPVbXfydGJ*WSrW*pGXDn~Pac2NOQDZ0&%pFd#wfaI=62qp`pGs0^ zWg|{Wjq>SK++=t2R1a0=�*K$JrXN6thr%3uF=(*hZ@H(gI7; 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

j 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�Tx^I=-0eH~Q=68FUR@Lw;ey7G5Xi8)NI7r)ihM52u!D zea$66pe69r=?VMe>jAI%n{ql zvB}vnjx&EP$ED>2VC#2RSW>Xo;uF?J#2u-gSdHXbAmZ7@b~uLWW`6T74)88Y>2zHz zd^obQm~rTfoX&QZ@!X)v`A4yGxZ{VC$&u!|b~JwyjeWQ969VmmPx0A4KKBZ zH|Hmnvz<@v_i|Ddpme{Gc>eB>l(O?whP3IK`6kl&JbNs^({I-h!m9^0kcK)?|Mt1) z30ag8mwLHX-!Y~y z>1X!FEi27e-;I}!4*41;6OtG=n`kZ8RYdHgP9kQex7btI#I>qyty{ReN|`H4DjN%C zhw2vh*dCS|6}orPVkJfs?xBZm*2U}&Nog8)0sh-;$Irk$3dKR5eSo61VEh0Vnb+33 zx^LFLhqn?+(b5`*Dmgf`zOr0l#|dLS;n1N~Z{t*om6ROF?$dsp)m0ziil$s6*{j;& zPdz$0lQoQ5lj=L{t)Z=y=#r?BC`l#V`FgKTQV8#DCaZIj5DnRC#_!1EL@D=?{lpp0fMr~nMY(s^l$B7}{F~F5JILVGpc=5r z_?|gD=!jY0S+FTqv}3BvIC@ec3dK$m?hHdFbEdiZ`D|8i{y3C7_{f(2@UgrfNqk3E zsuO)krC2Jv_Y9vjc<|%`~3+h zCBWnEDPO+(fDuzUI$Ayy$*H96b7CHQ%CJ|%Y2xA@Q5}<7E+OqM%^gb266)@ppJvn; z9h@{MbbFs^f9W|X(ob+jH5Uv1{7K#-Hxcs1h6iMq5T1`6^W>qA7xS?x3GXn3>j&Y@ zzYADKPctQctV9UrfjairTh@n6k#Z3ja_DmAS`YCEAom9T(QJZ}5%O?OX^xUbI$gfF z7_|GP`@#`I&SX-a`koQPA~ne`_r*50Bbc<`1-K{JZ^b`Re)J^9KiO;2J^pmFExLh! z@RR4AsSinY!;g)~rs$XK8mP`2a+JC4OXV}}ZAi`JMF?63SAU9Qi%Td`)3`A+d6Zrv zm$Tkl$^?R2&@P9H_HT7^)%waxXLq+uO}-qpFSQc&JT-41o-59VvT8}b3(t{Fu}wRX zp_2Ef*HazR5z)99a_jyb^JH2Q62gH2qII&Zem^NQABhUzqTEkt$MBrv8$T9d7>`bt z-Fhvvb)Fx(D!3?|<23s9=pTir?+?`7MwhkhnFY?ZvIN>^+N@*Br`OYS*EQ{=x8%zS zGyq-W<*uDr0*5oTT54yNpdXt z`AWnDBIozMhT3GybSCg@(O>iWh_r#fN-`w1~X33tb{B+`}Qe^g7BweD&!t*IZ`|fYjv|HoX!7+`p}OZ8$t63)e@{-_ zYP2uXE#CB7T+49w#T8z;r>LW2X>OjM#8gsHbknncXsDpb0%_2C_nxbN`-^Vh=da&V zzv}AEK7;>KzHX6yq6)s98Z@)MzHYI;cGvOaM6H%sgYXMIdPqta!6izRIfh3@xrb@( zujy3eYcI+x6y8_lzPFQ`bD1>I=FMenC1}XXA4y7-y zThhwvs^i8Oo*um)uA3hO1nMd(^~Gd&&;`B!h9dtC5iY#FGLS)_g9)F%5lSxD+)tL~ z9ri7-7!gLN^wr9$s#4R_Ys~9e#uHx2QUb0>Q}g)WNxJ^uBt`A~-7yrodQDZ`pxjp~ z$jfv6yZt+`__}ZjNze?QFnXGLfHqSHo{MjPcVT}1EfHtmi`#?^RPgmBu^pilqoboF zL_`hk)^Wn<4IhCdzC7DgNMs4^Z$!J)qqrId&FboETzq_$<>Yhd=h+ z=D!rn7-ATBW7sdAtv{acm3-ifYo^`b=w0j`nC97!$4V*c@T7BQTTK1N|AvGhSgvWy z{@4ukz2D`9i0+kgbhi8%32upR<|&aHvK>*1?zxji(dxp(HAn||c0NHR@?Hcu51XojTJkF7=p&BT5)7*`UObZXsR zR=*s5;&$^hrkp;EDVBDMKuGR zt{Iy;GoZEb6D}?N*Lc!u!_t&@#{1bp>vj(X2!DM+6HAo6bMMYWqc+~}tn1gVXCsLI zAJPg|Cb`x!rRI-fW)jWUD!Wh+eV5`CKd~g4I{}))=mu@+KNezx(`KA5RbuG~E_mFh zhF9vf5as8c6SzgC7Vnpd@SPq|GD`dyq+2k0Oc9DsW>oS5)!0;ni&8YcstY65iad>f z?$hnIkL8iCnzMNcIIAMucf7%jif*xk? zvDIf+=^)=P1^0k+ovjHk2q#dg>psC9VGXrU_p7OfC&f)j*ba5m@IFM8ixuuNEoah@ zqGOtSIU^#c{r3OZdy4#gZrkRI8`1FR`>tJx$gg}$l%nQ&kESZGIs_M#2 zMdPY(X7|jJxIVwpv=h4@hg6q{{P)ZoBpE{*l!Ny29bk{U*44|6;Mi!#aE1Jk(Ht1r z*dVo?S2^9trB(1NOQf}}Kx_OR7#WB`S*SsDj4$kOnnDq?j(3PDgKiKwg1yj&W`-4N zFQ`UC+b5+_x?*1Sq=ePkR;xAlr>uju?S_t~(H5h_El;PhUpY)|hH`d>x6uQ_kh4vf_<*6=RgmSQMS|dmx&^ zG-XWxmv&X`LXA(JoG&v^jz@Bz9n6rnb8gU4`cn5f9_psF4_bV8xBLB1ZHVA8QHjn& zE$*;O(Q2*nVG}EDGNQcg#h0VQOXx z4b8j}-zt0}@gsZd7IEP}k3vNBTl*Lq!dNQfHoI1I=;pw4ZBuDw_ist9~xbayu2oI@7$CF;); z&g1P=`~H%eX{-u#nY{Kh0%1ZA)5&JEelv5gP|HBEW?+;uiLA~l!v9@HV==3~I`ONQ zfz+#qUA;`%rPW#{zBSIRs#<^l2>9phybO^L zeMIT&k8?f$8h>vl;o^g31qC@#^(fh~g*MNT^+y_Kn3TR@k(BwugaozG37JLxi7kCR z4A~;z*M>eP)W)lcZ|Sc!(1*g#qk0oOUl!CMjz{Txw*$>wbbyPJbKjQgv+4DuNn zb!`}F#BVB+*cx3@Qq23+iO%tby)+lkhBTj>h1}>g(=LkztmHrv_ zlbgL_FY8mt|5#;FNZp{bav| zf!87HR(sZtt5e^nP!~w)>%@9?cX#cNuK$&r-!HV8<`*tuaV^a(ypQ-;WRY4KYoB}6 zqC6X46|$g%InKO!f%hIEX$`x@)hDDd7*%8AxXruq?yigdE4A1&k>6+(M+BnlGy zQj7MTi1;tTL=*G}ef}X`ih4h8BfAy@9d-!fA|iNEs@i3jw=V>XKHMUYK{@#^&1^l% zWzsjj)@Z?`xO=xW5hS@XWaQWG@Jd5^PUNnkA^QT-bgbb0<|htY$YxKj2VK_2La7RD zkhdsSj1CHfyC)O&D9@4~-|b51R8AluxyS5IClzgXR)L0Kx%1(uIpMO1cusvm9t>Sg zYgE9%V^9V;3EEznP*HsyAkim-G)=Ww4=X2O3owUXU_D!m8k=|BS2@3Vw2Z)C{zgXR zbUop(+VoLeC*EujM8iV-=Zrz=bf&-l%{Eb&WU`MV=Bqx#NO;jR_fEx>fFo=3moX&xWv6j$*l) z+uPeEhg6!IFK{AAR=Pm&1KCF~$%G{AU6FQZo<#_v@%x_IX=0Xe8XA(C;HjXznc*Fr z`13Z_giw^W<|A6Bq52KJxFF-7BhF#&2Oo|7G0FspiL@prtA}`~@v>vgN5pcm*jxoU zAM=~C{Mso*L8LXMeJM$rPdpE}3Z6zVt?2wNBv_Pmc;mhJ+XV1XHn-RA56 zB8lkVAr0saT|8K1qA}_}J5dnA?p{&^5gBE{!?4&jF^-NVrro_6U#cl5$B6jI5*2dy z^mlb7q99??6~ZP+m`oNMXj02C5j>Ole7u3hLrSc!E)-Va=P%1W+LZTA=-uhzhH=|s zg|Vy}lM!c&0#Z{UoGl=86G?Z6`!Lx709<5D}`0$y^9c?TB1rKG*!1ltHI9%KQd< zyVXk%2?BqQr0drbgm@Qqr6`c1Y)*eW1nfJf1{DGqYRB1EWC4#4l<} z(vy*fSp#aEI25Lf#o^r3u@$$8eredDIB;FN@;Ut$H?J0zL69KXR+LQOs(=X#S7ytA zou(%H3s5pLe*443sEMT=K@?wRki9|i(UzxwHTCl^1)m|mE;nq4alrudCyDGXJK>&b zy-NtPTP9$TEvu%CT8ZdS^^C{mxQ{i8>*i5amNuuV{*EUmJGMv_$8JJ~l)T@t8vX;R zyArFDUXEV6e#s)}WnmdKW{gPldlBTd?DB}YoLO0A9wXhUiJ+i z*4IIktlqyz|HUyS4~6 z^ZCp_8ZQY+5^Bd>c?`D}m(Pk=GNP9^Y4s6mj1K%10bV;kq?eG5uYKn>Z+vBuiZQEk z#mruI;m*@hwSUKSY4WcXW++x*@eFnInme8~i>UvrO9Z{|G@~c3su{2tOy0iStzAX8 zBI@o99;)xI2o>TNIc<^xqC5;!;qjB@26j}B_mhZ^fZ=?F(OMcmLTJMyS6pr4@Q?qE zAR`HEW8(XE$S=3DgErr$ZC`A~^&D0#oQSe)0lx5Cm*aw^fnEH!GZcd(2MX+nK? z9YJa`3-6|`))m&%#i>kq1Zg{MxTIqt8};W&gr9c~k8w~R)Yu3tN}>MjBJY=+2{O!^ z9=GTiDr5|oq(?y*iWnWWGb#H%GATdKs(tkHDJCCInwst&`pv7LmvaB|ibc?Uq20)- z=bnJ-!@y~7Ek2L6HfT}f;JtfMT&t^Z{MUM;pYhI;B!bl5O00Y*C6Zk3gNcO2P@O$q zx;ExryH@ZG3;EP0Ax^-Rt>s*P4S8};cVtR6)tB#Q%Sn3qxcx~ zU7%Kc_!4)~>q&%!E#E4s!X5AO`Y6YMip*@|oMN{Bc ztwi4UUOd;@a(Bkq-vR?A%g1$`ULZL>U|_rT^1A4wbJ|l(P<(6?a5IUXCb*-y?I6#R!wF~S zoUFj#?%*T8ZsQ!UiJ&0p^XVyH<#y>;g?W+KqoaNoZ~oEKf}Lwc_%s1K!t%W!w)Ec_ z0YrAl=RF+qyzz4Vr!%uXcM)m=d2>sa%YR~%1(?9vKcr+_6ua6sZaVt=A^kEx`p166 zcUzv}^tJ1<3^SXq7W?k|`j;MJ`DougZ!`I=;P-NO*plRq5rXw}q3KQAj8kxUYE6@M zTljR!IJ-7^PI}ghIg_Xw#})-6ME`QUI9Ib+dy$uDroTUzk@E08vQc`wu43l)40U$V zab&@g)BHHU>)#%&dk1?XzMSL&B8aB=-yk!E8#5>i>Luv(C_d|~_QmCFJ|X7lnuB$lGFw0&COzO~MV`KA%)XNfZ5G3^U&)=Yavf!ZqFR$AA$N~WH-pL zYqb99i~AHwl8DcG^(%GBdCX;A&+}$%tHbc+MYGBmGjDE}`XNmRr$XkXk4s98YI>EO z#Cn{;g%NF~gF}NaGBxPF7>O>M98#m(TOCLTj{L%hV zYe_l-7| z9}S5VKH=Yd=HEc+(=x|FODRgqNl(obirf6rzO0;GwTN0?V}H2K)`S{Y*q?*RL0YBi z6KL;aV9@uW^%C6S7E&hBrCnw zUXcpFvKs~%6ZlcJ+B)jP2`}ODXIWq!Hn)G)=E?rLGLKSe@q3uE=jpo;;#&qUY2*Bh zi$)1U8mRW^!qvN|dGmHof6Cim_W9&ZvN#`(^LH4FWDk$e>#tSz&vU!vlhriGa(UKEPdiY(aNb^!IuZQ0&sP{M~ zi}Y#H9^3Ar=NvEXnTDILCJl>ra#Y%W*FYr-RfnJ6NCSQH*+doM+&BJmj$PDhNS8u@t-%Cm_0{dTPA$ z{0jfML$nU?iz_v>fz$S~*P3{)-@x(WedI~P=PlG0g%Xw+Brv^?h0&haJ>s@Q-m*2` zgNwW#oNKJ{J1hT;iACOv5|;DFeK-F<{Cs)yia_q)qq;mk-9{rqm~C{o_b7}qOhZ6R`+&1+hPo250W=YQfdO-l65eIsH_1F)ffFbV<1A_14GReI*^gE;Sq+D$H9t zBO)R!MvE;ctK=T^dnrF~)7(Dx5bn&9iCG!_^-Ev4^GeL6BzYh7w^V0esyqzWu6MER zP2|na)?#=ncaxZW6#x(tA&C+zT*j+R?zr%d9y* zvo|0hj(KbxSU#`jvPT$}RdW8yafrE~q-T=L#OxuazB$DgR!xTcfugU}67O@4Mp>Yj z{n*Zgs!ILJ?P5&wYhmNU~zB;QjEn=o+T5*)ZlS!2UWqk4vr4) zd338wOTg-Lxx1f&geXw;4P#voe0A;qdkl|wSvCU&UG3~gN8HtFE~b;VlXZ$nv4V-h zx-|^uLd=p4TiEFmx|s+zZ`&LtHc$zPfNJ!DO$}*Sj1=3QqhfTzr8+Lvqd=Ssv-gM3 z6S!|qJkx9*RQSm;J?e9D9l8=L%FE|>Ts(v>6Rf}HL7N*CD8p#a+t}Na zaG3UE7GnJCFoaj4L``~c-n?1x*v-Y|Q%nqGVR(3W>T^FfB!X%nx3GV3u$(fHcqq9X z`go1~a-;eO0)Bfhc;p;euu4GH2URX8IQU$>Z$_Hgo~EU_8J#l4>%>f%$R;0CSn~SS zzCx!Q)(Qv+fI|p|hK7`JxN03%%Ut)2!zERelp^BdYM}IcbFmex1q!eOapyKR3X|oj za-junpac~8p4u%)8W>P^mwo^KJ@S#9k{=WFxcY{H#K4F(FDW+V0?5J`X44Tn|JK^E348S)G zrCk1<4{d8}bN(}RHA~P{ure?3*>>5EmDhl9IBr`U7>>DlNUx zBR-bvDHpbL$)I!>b-T22B=Ph!i{%FQMpZvCnNDDMB zz<|pbUTSDS=kAMxw53_^%Ou>Zd4m@D#Kc5+#7P3K5q-;bwY86^sXsHg&$kErVG^vZ zKRvE4h>IJCI_YAaIyEh=c$kX&_l*q<2D-9M^CPSq4t_!xb>PRVm(!mqB0Rk3TLdY6 zH+?{GYOrK|v_wHx_O&J#H#au}!$vUoOzP9>($X{{YziTdm43c+u=Cjp!nT#uJf|l!MAat^lv9a-wmXzr#POwlGB_$=SfjZ|c-RIB0!LyQ+ zmAzV5lV>0bkRcvyZgdJsq^nh_OT^a!$)3r{1l;rq-M~K3dIKE?P?d~{i=&N_#-Pm0 z%Oee0Dhq>?TkwRPwq}Z?ORK7)rL$;gXtbFKkoFL=muhO_=rx|FhtMr;cDKT?1Dm*~ zN(fqsDk?aH{WCJC&WQ;KB+z-?4;juUaug_p{S}{N(kLYHMJ3BTxtpDp6%`W`*!F4@ zsM@HDi_MIR}`N*cY5+{7WL_C>pK!+coUT_ZuO()^wr4m!vX!Sa9>{)ik^ z6_x&se!>Qe&Ym7dTG|&1aa@+fJ=SJsQm4|x(_d^wmiIrXsg+5Dl3%}mePZN+)3Z0o|@WKTX+wtN*_nhXfp*-Mzd2w#0A=WsU>HxL;9Bx3) z$x1?^P*haZ^sIksD$!_sa8QZ30JRA$+p0B6Q&-p8OoO{`7_D-4e+Co$Ir_uNNg} z$n2g74hr%*KTsF;|M20%T9CKFl1E@np}c|uv!GxSZW$<*a#>CwK7M}JE!Ti;p7lCq zq@<>$&9h(bMVeTCyuVF?PN`n3&C0^U!pd6Xeq;rk`SfrT+9>w%F8h*#l*zGXkM>e@q~>4 zLaTK)zptHlm2G57MV_6XYev)fqWcMJU8IS8FnynynF((90$lCBg|P5jr}^r#2>4eS zdT@1c28o@Wo!RL}FRQIQ&vrUmKHxmHokNq0d+IHeE4HPSw_i~5m6+{yXRYJ9X;+?d zj)M^41pD%;XXcUoNa)ZU1+k~JH_XgLvP1h#%GX2LavUvC2EMYFQBDjw@oT+_67V4V z*;7l8D7?>5kOr_aLpciI*-cGN<>YQ7l37Z8&pkm(AYW?qE+rHcQh}{=aN}xWx${^a z4I%D7IXNLFAxYtLG@t$I$>FW0cK`P0N|EvVNj$dK5SS0s?>BDT0G|bxP)JA!c~%_~ z7#Nu08Wa>XH$RU8N0_{ z8)y)rprFW8aa-;sV`gSXMSXXrcuhi*lbP9nIzybq=a^3MXSNXs@$&N8&xGdP0<|Kg z+iBI-v&q;O%1~^e=XGpkXSaK}IcX-Xtvv;TMk@=~k(H^M@_+!04=qHjuh0;%1okjH z1?nY-hldvjqk1S!yV(yU!!Z#oVvbJGo{qYQ>a(`C2CYq8 z92`yMXK7?0Qe0b0jIgn@oAtu;8x*M^b_lo$l_P!w{8v^s8Rd3BiFVC31eBAIu!IDe zd8z!*pFcxyPHU^EJL(}BzY_-s$5lr-EVbF$*{LZ38k)tUS#R}wQIU}u$$IBuTvSvU z*>rIU3GVAZ8TtA7L0{@chB){!KVM$~ud^{IacFOU-?u#5;2t9{nVqr2Z9OwARPr7g zc1D)L9HAg&3uoQQs}W{`dwY8$34F}V3TcWJOWLqYIN8~iK~_WR4p68sWlWg*hX$BJ zafJRh!Q&hp+=Z4uQ2bjNE1ma2K^;Ej*Lr6_ID)?pdst4@+t6_Sd9aH>GF|!F2Zrv! z*vMk!rVpr3out**Cwj54vzM2ZrDOgAI06bXD5+^_Z^U!@_fdyDXlk^X827**<#SgL zkfT`U6H!3fNv-`dcCI6u;@Tzye!$Aj3G^ZrZEc1a`q|F|Cr>NDvgZpy(;$kE=)*KU zXdC-&{j>r-jQ|rUHgIQ^Ki#()z=4fIF$)L+BhRFyFp#my$%31MAQsBa%9>YPoJ}>d zw!6Cv;G2Pw(bL0YCGiYqzh9){Nw8SWKE2>RNWMS`kg~G!h@>IhP<$TUZO*613y~o0i~v1qO^GrL&Oj!%6Fc%PRE}-HGdiPfA@Gt#FEy)7oUzB-Y0> zBybM0t12rkvoS?RcF zr4kQER(Sckc*pzB{cx`CUz!;M)Wym6r4bllVf9Nrxdk1H4?_q`CQRud9&loNup947pCZu^bpD%v-m>D43l< zOVXlUO-TuJk~|KAjg2i6&47Z`M#T%KJz-+vf;%P&V#Q(yw{J`*OVxL!?EzCIDa6Di zuLq~J4dorgt-bW{#%d^!#Yn zdiJZOkx?ahFXCn>gL>g^|Him~a}G>_v_t?{sJ+eVStoFtpFfAmi-0l`FLa%N?|Cd6 zs|ZLgIhpD1t+rP?z8H6AT;_uzb}@7A$c0X}RtV6_p~VVjFI4CR9Rc0nP(Voo85MPz z5a(cEVCZ@5v`y96dtV$c0|ppzLhV}s6bM1YO&=l86X?KOS}$o7a$NgVP(Xi$em}O& zH7ZKQ$wo&+Ttgb%4)|>6L?tCVL7hgmTD%2jd9+aT${+px>vFPS!C*nbX+8`dQAAi+ zK9T3S`)ek>uiD_937GC*3{ntZ86K!!ySzSK`3Ej>e0&T(F@Lj8tynwn;%71ZLwF(y zxBx8^lauA0(HlLE%MK5X>1b(bVKX>u-$X+LD?h}z13G+kbad#Hu=~`4)rYwM0T7g# zotp~z}KccX5 zLtoGHAd1ci!WxIbN{Fbe$IHa(*sSY!ZcK+Wfnnq2)qH?ku@o`VaQdgN;sRh4K)G5# z>P05>&P5h*&vtffl$jM3`_;2vk&@I7Lto%10}01lC&DPgo$#KF^4E(Ki}*p6*rEws zc@cSe><00V2C*RDV{QWBC530=O0i>p+}gVvx6_GKPJiU-&WPuPztq$m@Z1`PmcFFG znU|VUa3{6Fja5rWi3(Cu0MXuLA0;v~F#MBml9Q*iKAc1SjQ*m(B1NfIqG7Gb4%V%oiUyJLmc?!MV3YD7$kEoUy5(Jow$@gtM|?y>LqtO2yf(ZF9s$(Q{#2L^sX(ds z)=UG$B_MG@F6egm-n~3s`I)zG?(KqvbuWU0?~Y-HS_`|HGr#~)(FdW*^XJdkLY3E}qN8i;>bAhoz_oAr zrDtX?e4y|mWP2^ij=IID#`g57cdI`h>?<(Kph*4#I?jPf>BWbk#6(0qjOnJQqXWV6 zn*cRxJGB>~obdw=h|q2uKqE86(*lBm39H8D!HwG=-v3A83VV0M^q^BZeB==>!5tZ^ zYscQB%P)0KDq(zvp4N!*Uqros<^X4zOisQ`Q`{IYUltp^e#Oa00VfYvNn8G4Mdb{q zo0v>^lU(h$|0)_+c+EzOb@cTgaQqSYA7A|6cKmlw{=ffGk^q4s)T2;B11NJXlfsV# z?oix_n3&Nj%a@yX0ZC~s1D;q`PWd-t-37BUSONHhq(<4Lh zHYpySEtu>72&f`B+607yhyQMll^Wi;a|c${ONchX%EI{rrms!qDB*UK*;@#7P_BGz zgM){s=dp(n0taPCF~t-Nl97^%hmc|*m*-pFfGjTahT>vlWs~^sArRgW`)FLM4= zvEZHuk9^g1>{OeSq~qb?0RVdy=BQ2{Xdr-X$;ru}BEn%iUF!&>OWfLH*q+3|oxOkc`Vg*)J{A5u|)81VTCjG-S3B7huP!2KYy41)lPj|aYBD34%@qx?)k z4UU8IHMB5#mk{Y%!m+gvd}R}PO7pO^nPPBvPq!MM_Gv-b&3?jMd+ll+oHVwxK&Xa} zh>D8~dHhv0xus+_`}G|B1jOtWIN)2m2L|wvV(l6>)Be<7zkUJsy?_7yHJ|Eg?xd6A zTg+G31lp_r9v}ClJf%SP4-QaKQD17JyKTbeYFMFr;OhX1x2tb@dH^s5!i0}T;~<|7 z*tY-rG6*P8`g-gSNN|K|Fl1BB{L8*v@e0`#0xpW297V)GfUxs?_3B}F8GsE4o%7!~ z02BqBIyX1h*(pgyMHOuB0dbL*uGbp^+N`0jbq^+2T@90zW792So9w2Mb*eJcu2&K%D0m#czG1EPzrL=bbySP@O<%2tqAj zM*x3MRaqtgOX&6L87;0iMn7Q0KV7`2e>ZAz!eE6~v9zh1_S=7iY&DXZnQ3(CrHnpbo94%*t&tSS@JRuk-Tr zH^TV~p!}z+tIP51d?h2aH(AjA?62*J0u~k)XoFryZeo+BTI5$MJAjo@l$8xKN3Vqg zu0bBb9z6BYQI1T<@{hQ3AWT&+oZ(F7Y3Er-d;0`IcP_*O{sJy*KP)L}8rViH*Wlm3 ze^(3uJyHu-1_p@~+$jR#h4;zoW7Q@zOG~o5cNZ2H7dJO`V9Dm>5Ri~e);U|dRX|vc zhle*>qG!D%3IKF{s)ijY)NB0eeR;vb%E2)_G;{}n&2V)bPs-()#QEd=+m{e0mq=6l z_Ty9(nUWu1g;G5A0&alBx;`yA?O0glHQRVwAVH0`6`0jbrB#3$rVo)I2yx*0Km*{A z3p`Axeh1+}5@Tc(mf$&d!eK$$r`!!IZwsg-C_>aNXa(pO*+ec%To9 z6K<9*PL?ieu-n$&9upgziH@!o1kqrV{=1ofGDaJjm3*j$%?C$~fzGf7Q_PT1352`I zuf1a!${LtwIk_GP$Kk>70cr+!=Hl)?WUMj{PXEdf8+CnRd|3s3&?r91$>h_GK0*ye z%=ttRqt`iYp3H|ng;OH5j_*Kz$=7fTz2RDrEYDAm7*>0=_t>STyxhWd0mZmHh9>0Dw^+)$)fCbakd{S|!xcJymm89o98tcj74Bdk*}IXPg{1Yn2HN4I}0 z{J*sT9ig+;)_PuE7hoK&5;{XIEiKTj@YH%n;NTiOg{ROA0Y(IjB;xbz!QZ(+=3lEk zis$S|5D|Me5JvFPnOa8+W!i~}D$6>PK5}BIWL|q?m`0BKu)cAVZZhGbM>A+%LvH!a zbx?SNWg^)`{|iwvoIFxq&VG9u)ONsaezltB+x#||EdYcFOp*Ha;QZ45?QI+4TD>|a zOW>}+ry%-9Mq*U-06K_kA5&8Y5p%8qasXxt{DWL&m77SO&=seSNx+2W1C9W)3zcQf zbd0@zRz0uHf(0NB0W%8A9tn$xnA^H~!TPp_0L^w@9GD>pp$@<(gV%uw7$%XB->I;% zvC*j%Oy#{Rt>ylKfr0Pe^I)?ka9OgkvJwe-@E|U(u5!r&$FS~T$HQ8#EH6KWS=!&< zZ*Fde=%JXdwZ9)?L_YwafG>zPk(0B%K2Ex=#l?Gf?{WZ~gczBSgrvaD2Bv8+MU@h$2&M-@rad4Zk||$c%o#$}frE8DzA7LqelMR zOK@?HfSf89TR$7Lzyw~o%Vfb*SuxHG2)V<9sxKhYQdY4r?!BV> z3}UmHP$>7C8(wE1=#)`>ZK#^6Q2G_cuk>7yZvv&R%dmU zerkT<14hb6OA(@+3}(Y^MnSWuA%{Qj2Zaki!ZS(?=8f*1%)6LP(ph zAtgVtW0)hR@V{Mm{YtDWH3_d6mm_| zns1!Z{>Gf*X=-P_Jc;$qmep=-YC!#zqQkx=iQ;n*%Q^ek0p)PR`R2W^L$k{*i(AH* z56sIP311$iA_@}8eqQ(7=@+FcdH-NGKi<9ln)YQgO>xT2ea<_ZaYV_*2uqpG{_Vd_ zezW7vt&%TPDe=yoxRxB$YOXa&vd{<&7d1SzSpLDd`th+PX4$8M@}p@4q3T%0E7z9I zXZp}L!>B^2$rEzRWj3yF-Sm};9t}OMq>O-yvwjffY%^N^ zALArGn+JKHr5%+pZ>F#cS-tJO|LBIQkzaFQ2R8MBAa9qed+P_?cc zB6SA{hIAX;9M>|n(JR1L0SvZSxQf8s4mUK_)vLkaXDd0R|E5QB)B8bta~62~{?z9X zPe5V=oH2(Wu%2FDz^KP_TCA7=>wEH?b45o*rM0Y(PWzwt`2%1fNy*3nxJ*KU0pzV9 z-GE3cD3lZxUH1V`49Nq(;=-z`s{4U$SEqzFxK)A`&AEClLvkNJy=rB{2iyM!Tocow?Ax2tihcbal#J<{DOW7L zB&zyI(F?Q5s-n0!2z;j@13oeYsg@C$p|PSQr=i>!r=veQd|9Lj%nF)$0rF(T9vcC6 z@G%Dy+ST5jNFH7Z$gh*x}0*+iCp@eV|iF|J$gt0GZ4E z8#vTQT?Mj*$EfhjxW&Q0q0hv63=tn}Cgtop=X&p#DjL|EMc20!EwWvU?^h(gmc;t6FqN z1KQ;#rk&FXQc!#P=DB{~?7f8>`{Y8!hqYtk+hd2?C+2N8Rd z`wZn#ND2&P)3iJ9^`2<@oODL-wZ7ErVyAhVE}mXKnRlt1G5QZC-U__~r`pJ2#P?+b>*$@jBX#<`N&o9Cj(& zXd5%eakgiD&@?Jl)X*?9KKk>8c{#Mo?2Lbv+x7QG>ATrKua#8oa&a0V zUq?pnMZ9Gr##W7yYV|uJA4U)XB4^JxDwnc33DJ4VS-DQh7D7qH0xm4)fcZuslL3tf zSsXMxJbwY9t^Iz2_`ZLCtqG_pmFI;{ALa8ID{o*CK6@G)7dId`3a%Jhpy41jv)Y6N zl5>4S!*cy^*Cqth@<$-4EAtdG)pGp#!&3Li^0?zw=(6-+@0So?Kv41E{8>vqfTY@* z8epfQnHFI0W|!Bc1*k3VxBv@1Q*MG2+JTA~&PSVA<)%Zbx?}M6nXH`L>e*Yc84xq8 zk~77uLomS(z&P1Su-|e-OW9w3Eplx&-z>P);Y8K_IjC120F!eY3u}c;<;65!Qr18e z`dZe2SEMmV)NcUl5Gv(DH4ul{;NKj%cn%C?Wj^x-3XEr@LCrOL5u;)k@{DVBj8GIY z-P)R2TYCbe&BQ?t2^!cD@56Bu$hTevnccct%6B(iUkDmPTk`6ln7vT!t~Vy0Ff%9LR@T8z`Jd-^*e z%8&hI)n3?m97NwG(g?j+BGI!5*~7h{G*G*((Kz4Ae&dP2SC7S2JA?%f?FW%z0ZU~S z+JKG^(;vh48YIu7wwwMBbMG0|_S5!Wd#yR=TC03h zmx&Shjp$!(t^VC*A!4wuDmzQOOvgvq6=#V#l#?Y?&tj-U)ZG@+^k%*-Ah-ytL# z%uY$tzxjLztIPyx>P>UG?fWb=8_V)8*Jmz%KHf?Y zLseKqkgqHBH9QtJ+b&*Fr_}lsvGts0ldt}dlT7kqDbnU%R2RIrm~PG|s`xKVQz@~jr;S)`K{z4g>$Y5JVebWQV%Y1;vh1V_C; zV5j7KQy~!F4b);7<@LYlH!2J?D|Ng2)+=<=UC^`a#>VWE0p~w{8RCJIolwtQgmjh< zL>jp;$Ma9^ym=w|{Tp47l9%&iFR+I?n*=M(fKn2M#)>Z9R!0|dHEUlk{y0y@xO@5e zK~=6;o6EjM)K0~sg~i$$u3Z>1zR2H&pe+0zu3(Elej(dSeTl(bTeyk?g{#A$~bNZlFM{jXs8H3`D z6BQ^FDerIekFro(&L6->_{o}5P{FxJ?yn%wt{HgFy1KeR3^Q<0 zn-O<*)(3NYfldoBLJPltD_xov6%}o<6ovp80|uJQ00J^5I{FK$JT*C4Y;a<-+A-Uo z&a~d$`}Bkuc>G7TKEccexEAgwKf$KHQnm?p=!%Mp8E>Fh01(fpc_2FA#OF*(6GG3* zdI~NLq6ioUfV4tx0wW0IDjKQcKudBV2v`{a5bD!sz1~=R>Es0T0$RRo0Lea+H3E?O zOw~n>1Ei2US1^zb*(EvySQ1EW9Htw*!DRv;2w=)703if~LK6V0fO3izcp5+$^t{aC z$C-|5rmfax9-y>}QY zEPlP&F+D3rmN>9dYLm=FMn`s@{Uh8nP0_0~)ZSM2u598j9?0h>NqV21J?{_Tp1VW( z()+z-_|d-xbE87P_tS4te9r!C4ujn5RcGKf(wU=&$EB24&L^f^#oAU0el7EWJiYtm z$;T_q&7x&xRg2&8Tvxffq(3|Gi9p((%6!>VavUEred7C zlI*&2@=ppad$rl|J)vM%Wf&JJ72Id%GkNZ;=$qqZM9ID2ns?92`B{!!&ndd_;uGVf zAx{_5vFH>1OAqrBR!ed-^$>-YEcVo9Yzm}(D`#h+W}$~bg9DUOfDpCaApxR>fu4Q> zKn7!DMaDH7fW}+xmuVJS71Tz#%>R`Jae~83p6H@Oqo^t}B-OM#u^X^N2`UU z`+o93F9GxqXc5rnCt5rlxF%RgAXwBpPai&fW5-mD8PON}+wmJCw>xyQ$+ix*5vN@4_f|IM4~xXr>yqi>d>c0=eErTZoz$jHh9 zHNpXJ(P>={2oTE9pPfAKHzvC zfL@^UWpium*TzPG%r$=gJPRH=xThIlRzM3D1_2WI{G^SDA z*%|nmynPu>v3kAyXVJXz$h!LI?f^q;cNPmIsAco+QNCQo&3EU5ta`-G0XKdZ*(hR( zOUDBQac*t&5=H#>Do94{)X~Z@fG`@%#H8P<=dtYF+f`FKZ&J@~B|u3@1qnJA*y(9A zJ`=rk4)XlD@heTni_5QGfE>@8#kr>v!~w%@Rlbvx8B2LGjA85AINqD?R^tjpN1R zpoO;_?|C~kmX1l1ZWv@8k@I2*-@=hCGZ(-Qkx~dtf@rTdCZw~ICp=u5>ub{X>`eiF zoluV-osqX`4I{`SG$a{vAM!jQ$~>^X_nd`;ZA)yEP?5DhtPG8h6XU>Ug%mwlq1QGv z+pD&6*z6D4W1wdhYcCSS7N%&}1*vPC!hPNli z$323|ND%VwtOCu)de?I5T=s0qF|tSI%>uzglhxdauyZlX;>TW=PuAgaXcT2IlswtW z35EO7mhQi}qPo#!rSvlRm?m`$9|k0Z*4Ud7*kdTv(|uHRwP6O_OIEe$$@b81Rx4Q=pP;0jD5nPBLn|%dLRbwF(j_JDI!w29J`>CO z(pZ@l7v9b_n9Us#K~H-SHnSb+aLh~{{rEPUxvPpDdlJ zR`5Azi~FTHxA?WVCxPF%r1p0tXs`(+Dxk;PYP3C|06rO*9e^#60GykW5>16i>W3Mp z2N^eb^+Cz;_)nkEe_ENrju-#N17s?IinCJ|LXu9?4L~t)tsfw;3*WbxL|?WORZ489 z49xw-UUnyG$sc@aXlMYnet}Hrtlh5Is0olB($@U|9u6@TUcUkec%WhgeC{T|EWT={ z67Up@K7dYhb0^FD`wXUj0~m?0Rckk( zy1?SjeEJIb0)ptBI3&T;NfdZk0Gd5x`+N3Ir*1!UF6QK2g z{0C^h%lD6gH98A^fM8h0effP#NB zl!|R@6Evz^j^r)r)A`i{;BH{66S8k$BJz8aJtwZ!=}VCN%nQ@!j0znIBvSs3VJI~7sYc%GCstw6 z2Ej6JZk~Fng;CTr9|AXf2~94w88O$3_g}3XUKnny;F^*WXufL1<7R$5m@#T9y%+od zRJ0m6CdEf@x52J-Kk{DqaNs-ie&ulBxOBVc^;YKW-t0Gd>&c?R#Rc)8w!^89uZ~TA zVrm~p8rU$XtM^Ls+do=u_}T5ws%;DRjK6c`oy1tJ9<6`+Ddz}9O4~b6)Q@~2rzG5R zW-wkkb1vBy-K!oeC-XXH!BOBcy*vM9)AyhH1&f!tY@wN1jt3%%COa$hfzwj1>n#sO zdNGf*w(cT7h;6+sdLWl^(%e<|gVWRZM3^3GG!5B(HTrBNWmkFB`U^tJ?djW6K2hEl zwuz6a6>CXU~bvxt*)E$Qle``5+qqGZ|kd^U0dBApHX-pF zOjJslnfbAZ74Yki7q&FOGVn3`o(jQ!=8u8r=v>;uDcfG^&-A9Q! zeXv@9$6|#YhGqD3W;k#qk17tyUkn=gt6xUZUXQf^{(GuXEayg8#I<{s+uNfv(Ts3A zo3xo3E$AovrG`eK*zjv{Tp?{4KeC*b(4-z&wyunk!1Z?sP0W*aMqychQkZhi;wLCK z)JBRGeM|VMypo}VId?vJ*;<+%lea$xKs7opS_k4aXf@^}E_&y;{9eSOQx8yckLHCT=6EH*nir(R(!%rYt zzsx4!TXqd?{oB$9v8ubusoT5C*Lkp&J6H|1i1x(y!uu048x0)%bH{4s)7>XaP`zW^l>ID?o)-CIh{-F zXE#I8i++K$01wCw$hM#P(2R-6jU+T3*tx}P?K>;)YQqPS6M)JBT5iA^7}- zSTs2UjE43@lg=f!CyaiBJ59&yH)jL*T!|s;T4_Y=}$Nd{`Z1OT(J3?q5L$7z6^NX(PHdK9%ySLbI zhe@7?|K7d3S>?yUZx+@>Ie3%v%0DY|_WHhS!o|kQ9kjEQ8$A3(R#!*%VBlbrt`Gl- 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
4;xuxgGV1b!ALF zgvYJo{-v^5Rka@>skGc#N@2szJ@DL4?!2gOh8Z0>oLK%c;my|R&%R^7_*tIg?;i~E zReIe7)@|Qqm^k5-pDmK&7XER)7ANP&AFaS~2gpz%br&AR^$#gNd1YTtZkMGUB|H&j z_Q;9&{pl;i1o(!CeXsy^m4?tTy?yqW;6UQU2=2>S)6?dsz7_IzPYs{bV9j45Vs#pZ z_y+S|j#Z4uYj~%W=7!}aYS@)i{3Xs92Ur*YY?x%LaOJ#39x3M2X%n%c-{FTF|hKYkEZhndIrptH+e zO@9-$+t|R7Ll0;3WLd3GEYDZN{;o8m2hr&o=m#npzH!e<4kP|@0pep>__5$0<`cPEOhplAHi7lJtP3YTX|8Lhlg4vHyFcf8oFb2rp-<`HqP*DWpi~_0o?yO0IDR6Ocu^`Vo$M|9#pBKs`F#is z{SPzi&w*#;^F+VO)l6NT#A4XcGrf0N4*A+USNhW%A0LC{)y>UK@Wkd>NrCYwK}T)o zx}%hqtz^{CCm}>yQ)ChGfk0ZI#g7#7juM}E3(AqbiLVl>1^YO52OqTb$c6kS%Z=AB z2Jx+U?1~jRwU}>kP6gO2*5?D5m!o8S+~vzjJ8eC!nwh6x@RMhhD2EIoR4NE975IZ2 z*$U@~qJ8{(*@;wZc1fGXO$+26YipA+PE~9F9k$#;UC$H%0}Tz??p7+GmckfY2$V>G z{x~g8HFb43(0k0Qo_qYIq-SdfQBuyR<6;sTS`vxlwNuvW_%Z$K{48Dpe}SXij+DT( zIrDr-#K`0>K7UfEpc5;ZmDlSn6Xsv9Y#Q7(!#3#Z{kOX&cejIX)N`{Xf^v*Y3&z=% zAeKQq^;0fKo|}l%0c!XMejlBJKyArgsr%!w*VHWUOV`9Q*Jng0UE$g?T*xL52ghys zSFR%!O~N?;yJ^T2tc}*jZq@$?c%cAq6#-I&Tuz`f8)$u9!sxSw#uOe-;qy(Uo2h$K>q%+G^l;`w?F^Cxm)A>qTM#V;HN|V6s9)H7Cj5R%4U(j| z6(DdlO)z!oqauvXxL1%IaQy6vTeb2d023)_Nw?MS^{_w=h0s2hVutzg3@1@}i`Y+{sYKQdzk+VeNaxKHOb;*zRX|Y^w~S&=mV)KknYH zuUq*-xZCr-2M8BYkExcr%5rEc3)rVmplpix@5I{p&;Clf@d~b@9Hw^*Pm0PhM6lp66H4q73?pdMDO0zY+?H8@Rlf`qOd}YImg?cX2L*PaX zg0|AUnMtdPSeMT&0A1oym`HQgVxX5Ls99GLmh6Y#wk%S95uNUNtiJhcj;fZ+qO8Y7 zLXb4*%5M_PLq#%r{92dsz01N2@1w4t%H7M*`3_q3|6SjL%)({Lo1ZDFUE$Cp)C^zs zT^Xk2@9Jk9@}Xp^KkD&wjpyEn8VqrlS2`E&92Kdj5?2cGpj?}evsz$@^)=&+XTlHDhdzD`@?bv|Iea_HB?=gr2yP58WV_W?AL? zP{O(p1>}z#PeaZVwM5V11(Kk4@oOpvH>Ve6rSyLfz&@S3TQ}1AV`p^$vzVJda!WwaW3zMYP~1hSooQbfxaF)91w>8-r>oRh@fSaCGONeq0i$S@@oPpr*Vv^!Ba! z&re^=*B7O8-Y4?btQ(j^R9T$iyv}oWOmmO_sjUB*y_$!Tj1OKMaWUZQG)>OT@a>K* zG3wMe*~LzsPsMnzue_c*7FjD#cyLb7O+wb0CxX1c+jv}JG*_}&k&4_B83v0|woI39 z&Y=i%y)FGtpzCgFyYDw%(NeV_5`NF=GBeuU3uO}_M8mgx1eJX73=ex?k`r-{9~q&8 z()oacWD1*f2zt;px%W0cj3qO0zIvbA3nzDF94_I`~cKQBZI-O z6I=)^yEdAFrsHB+@52&`NliUZbj)?pCagB;HX5ET=Gp8YBV@Y#bww#V1`c%_R9$zQq$7Jm7N7y*dQ30UFMhIeyH80MqW% zASCda^{2dtSzZeLLK^)WhTFXOmF{n2?&w7A8Sh+Xw>AW^6HAQ4Rv22USvv8G?7t>> z3cKeRj8l@1U4y zSIxu?f0+6E9bhSGL z7#%>UxOt@ZJT1rV{VV$0{5cyKHfRW;Hk)|68h z#6X7*$~;)()fujII#|#*3ICO4e505d=vOunzwyrvNE1lX2Jm*VgpzGly7|+!IZsXK z+WSh_c^fKRON0>MxOe53dEJQSCi<4mN|Z=jYhsJTtP?^4f~^RbRe||}raSE)*yK%H z&`u!5X=Q!4iO7=>1u(3u_^FTE+CIVzQDsI3D#h;J({y01dWklJE8d)RKAZ!_@~7}~ z>p{w3`M=STaTwL5DYr0jqD@~~J`@@tx9TKylw7Op>pj>HHWZps2WJ0HL*{eyY$(HDu4Qt`^|T+En;@Q-AZ|cN5L8XxH#wA$kv}YUylsv6gT}h zleT&FMt@NyGIWvY&EgM@r2DbL`mGPq@csg}h$zyJc=0)6@V`}3}vZ8y_1LJf+Q2p&KAkfdnfcqz@n_XTRvmTewVJDW-=YD~={f@Bk4V@K}859vWWbM6{D)l*#?Zxc8Fys$TKSttG%^?SCK7 z{9I8heXb&ipW3zY2r=~lnAn~*yHDP@O29oQUbO~$*R4ElYAX`m7= z4b~ZCASia^WWDR96moBE%5WNNFVEL6CTisyJT1;W32t=tIzY@>Qi)J!1IK|!vm%po zv#cS@zhD00y{G<+K(y9m|I|3emhx+($Xo6xD{2GZWa@OR>$gOd*oq?&Fsnl>jgmj% zYCfWBZrR;DP6)7E&{nhX)WRO(QNC6-1@~?pV`8e4MIyGs4QL3V^+Lm~#uwJpP2hfm zU*}i9EVMkDdkw*wgVw^1ooObwGoTHcpX%`jJ}D!u+|ZReK<@b5_HK+4&^GXIvivc7 z7A$(uZZ?xHI??ZqhIOqGFn8tI#tESs>Da$JT+|kCe99qpMl|;>d7*;q;(G6Z7?0}v zGT3{ZK@-562Qhf#D*UloGcaFV=SDWMb&RAFynD%qM|0a;>P%+M;dq*C-3e(ocY2y0 z!Y?j(-(92dCBvUxGhhXnw*a?#exB?ft|tXC6k)bX-TPee6$)0$l-}Z-_stq1@se?U z#19={3%?Y3_R~Ub0lowiYW3=Pk~ZApdsz>Xon>1xip(<8ZS}hC1vbAN9Re5Hv7D!S zrU-by;Nz=psc*&=YHHue_#w#yoIb>ym2NLpLlXW>L-*LsOyfUne`Y5t$8#!02@mw6 zkx=%s1PM1pb2r$Y9?aUkcnG7dWc12f*b1W?X@OzyC?v(-2;IPR(dr^U%;U+<3Gc;x z1H+!dKZu@9<_TsBy6q!)g8j5dnh;yKo+B=81nV&8<;>iE{2PZHn@Pgd*`V-T9*qCd zSwww2<_<`aSnR<~9h`K)H5PC+1s*Pjf1-=;a>8si;{8k)%f2Dl;-f7>#Sznwf$ONY za|@&=gsJh8x@})3*dG%cvYww3A{nG_hQ*mQ#>&-^*p3!bV1(q${q;^ z`PD;nzw2_fK-mgzSvo(Fr7lHSTuxAq(pS*?d$&lXs~)wK#$moJqs@zcmu7Cy?spV( zQ74d3^H1_0VHKEqaz(pYO>4#~B!z#BSrD_WMyq*k%}eJfKqP^X%ETP5HvG)tUSj!N3>H-q z?t`+4!9`6t*L!U;$G>B*_QX2sqwC+l!`^{L?=HbivIbl$1S_Gx)-*v&0xL&s8jz!9<|^{z|}s7XEZQClf=SSTE7+87=}MY zk7=)64sVgxpSaoW22!+%Nac~?GU9fn1-adD`J6cc$(8e&mv5fa+`+H=7 z{d*s%=KPqF{`1vxF5t*ZxGEnEQ0FiZ|5MStVbuH$af*>SSEdD>RJ+{{JjzivkqYr0 zuHKtPUL0s%4#T2drj~!foR~NVCV#q~6)^=erp1}MyQv;#!3Jm;F?J8F?a6t*UBp3W< zdA2&Vo9*G{K7aO4xS*&gb{Oz42250X9~}bA_PMPkxVmki*kQK8I#M150XP4Utrd0i z196tm9jsiR(Y2jzlao4sYbq^ly`BjUjSW~}yEp3FHFSi9qJR%2?8OvbnD=*|VQET3wjXk-@%QcIOZV0)|IW_XMyjM&m zXMOc*Bcx>l%anOu-gprGWZ#fvd)on1TR|0#HFmuBLoLyM$0cY>j11m##6PTE`&28} z(HE00N&>F8RX@bTDY=S$tz*JfB2s5x8LLA>|NWbaZ#^nHFSWFP`_NggeiAGFvrb}? zbJAd)eYJMo^^@t4R%lPpynTRAmQ)I2^5Jx}@G|)+Rt6dar3LaTOFh*vh)V(%=_eceS1Ngajwc zVAcSa-xKGJRKC{3g%DnK*q&R+>wa%+@EW%5DkQ{e_g%=@py88{687-+B?#c9|!`D1C@(J8Vx9ZM#z9mI+Yl zxiH99BpOx&u3DI{iSopI5_M<&%;6^9Z!Fs(kha)T*@-jADgvGx??UT?LvZjSr>=w!r$yzT6E$M8(DHfFD;Nk=ozp4Qt=oF&6sb(soXk*WO}Ba_iBK9gsa z%dJ|v7xHIoU5Vna7cRz&J!eMEp>s_ks6r-ETaH3P4R#-A2R|EhGHTh^)fV&Zxg#WR z=S#STIzt8WZrIy;e33!3^O3`k-3*%u37Y$epj)9n4?v*}&e_MUH5@QL;y1v(tx>QDnjr?TY zSC`~^k8l*Ww_S($$j2`nKXc?LWkmT!QD$1vIK>S}F@?vlqBluE$yoSY%dJTS=ad%O^G zQC{5BcHx_Kl@xLwJ$AhulBp|c(%`&W?6o1&=B>rmiAii`*mFJQ$T^%Wg`mLN z3tjt(1PzmzA8Roy)BAnlVlKJ+KV_~jVbTTX5#8%B6OW3h>h3oo^(0USRnAu{PI0Af z(#9RnlYt28nS`V6din1nJDL8)^m!;uj^fl*Lj;JdP>v;q_I9YP5~47aD0@t3MWLs< zx)ljp8;^E$ZR#`TfF86r#prJ!&>JBrQzYO58ejJJ0dcSwPLT@L;DX4-XhAD;VxXdm zrFN0XMM1xzo(JzT_7VC?=0ES4lSb_$b|6+&Mn1ur2cHt!MA}tDfCeo900&f0|BcRe z!B0m5?r!W>(=le5y~GS&KWagd%A7m#g{*F0AKRnNVF9}Ahkb6>$B>yR z+(0QAFltLN{Kc2d<^VRlfz@j)pb&lR0wBiqN2r1dbEq&i)F)c{M6366NnaB#=*#rG ztOY=Js{f>fHd3Z!v`(C#~c!a?Yaj^v_RZ& zDl#1Usv6O3T~~VdzqFW09GyRO=VG(%3Possc|aYqE~*vuy zZyX}rc2CqsGl@ga#;=3>xi!~D7*CIzv#y8vt{|0@*zOATa^(48t)@TnddK1<){yY} z3c}Icc9sv!?=_a7^2^$YeHKC#+u48O2J?Q_8o0w=?!U2qHB~uDViAB|kg;+jEK^TE zK-6b|K0Pzn)18`t(#)8?$s-Elz|qRm(TJ+pIC3<0m0E76!|V)e>6w*OP@-{4)?rTh zbv~{I=)l9@NyndEMy1-YXGi^;7wNv%I|P;d0-0@rr+^G6-~%L1f9(I%gUhqG&Ec|u zeSf966hGfmgITL~Bj#D2o`ke+1j+#!!8Qt{05q!9K;oQH`!iZe*>j$_?)z5(Oh<7L z&uv3A>>;DDvtv4iYQcg1eBOV3y1pybZCAc+GY2xk=$|1c?_%2yOGEaiuAP=dTQ4^G zF3vpp!KkIEnd?1GBvkvGNYC|e-&RR1s_hgr8gwNPr)CDDI9+49o?2+^(DgiqSX`2v zI$4~CXO3PGJM2!s+^$DnN6Yx52nazl7T2|v=*t<4fHkhRu~Yb@%u!B&?*Mql2UphL zA8lz@22n{MQ;z{Z8Fo0#_g{lrmw}I+>9$}Xp?B~!AoUVHs2(Ln4r!>N;f=+`FAm>i zF0Kr1>KcyTLF!T5dLKy9EG{KQcT3n6&JOSIk0Vb}p6uB|Q% z4$RSdQ(Ry3FNpnT(5l~BS0}Q>E-r!}grv8KN6*X-;!2Rhb5(~kK6CL^`3MV}y|Lou z?d9|@Io~S7Ry6HLyq~^wbr}#5K;u&Y$K}Nv7@HZCPV9I){*dD4*Ij7=pVF}6l1%kL zLoD^-`aGR=Cn5|lDDcDn)`OP8LxifY5d??R$gr&o+!$+5glP7ZEG4@b{4;&P4@ITs zx}U%6u!54_Yj001U&xU^`t`NNMM_(91oiCTyEyC!yDw@fwqD(3OXCE|wSs zkpRpp=+Z}>^qv!&SaSFnGswvzYwGAabJ+6XX`*kL*wXA8<`Wrfe;@t~FCJd`d zq77g12Kj{~{BwkC_AJ zx2;FB>DW#eEckVzz1$xi@T29GvaU*0Wauu;q|Ax) z7!i|*(*vF{1#)7apr;U|R&%T zuTp*goZr`>bc>ot? zl+Te39T}(+X_u-0cS$*Y>4xYl3MYx#M&$q$cg56oy+>(}WOTodJ3ISu34HQiV{v99 zn|dwEIH{zzzGy0$S(Gf2^PWtoID>|g2G63>s?M26G2|s(&h+q>G^XE;@$xE^D%rei zve3C=iB*Q4Akx3kk3zUHvWYX$bLLZvfhnI&6ySvm-R4pE$kK6z7)|7Ncla0n zhUrQfnqk8qL2xxY;<2sA2w|an= zT3>p){-2b@TKE2dpIyM3c~974+tAR{%*PGmP9HVM_%m!kgA$$czIAp+NXUL?)ULIY zc|${sBnk#OpIt8#VtJV!f~$9Ke}ss!`?!RCO%5-<`(8{N#C=EdRf{huPk1Nk-cmJv z`su)DIuvZ-)3?%Em)h{B6~h%&+N*3R7(Xc8Z^ ztnFT)s5a^BvO~xQ$VYw}iOQ_hkWAj2ym?gS^V5VApva=y=zGmZ#TOkvEGf}oavg64C(^CK`N<0(LO>nbXD%)>~-j|f>*W{r&cY4 zkRwotx_q?)b7B`wc%m`)W5gdFJ>X$a+T-6>|M}LLK$<@~UzOr%9Vt+3OPTaF=B&{A zvRYhCe2i1B^q2lqroL94N$;Ct`i}bbE2{_1+yX46@ql?)w^0VZxUb7vO9lW3=}XM_ z2P8kW4o6iq{cgg;`B5fTiMBPi%UaO*n(U2c2qgnXQgwGr?yCR}ji$oPkk`-XR2EwB zhu#-=g}vu(%C_?&##o(Z!+=d3AW1)p@fCQza%BV9V!HP<4?G$6ziELo za+`CM6fnEg!nIXNlc^)xP4)?OiQKUL1b^>ngvwrr)sA{`fGk&FfTLdU?mYGwjXM3l|WB4|X!P%#tnKZd~8Pi~s@ze;yO zREh1JWzk(q_gt)^O&Nz{G9yeAHZMH(OH1@uHA#lW^Bzf9@}7lPjVeRB5eOfQs`glaT=-yI4-D{-&!i?uy^ z>1LXUiGUeertN&{a24|^%`8l$sxPn#Kv$fFYy}9?$>96q{7pQb<5!a%-6%vF6Ehg$5vE00w&|*RuOobb^F|v_-h{y zHIESz65iJ%t7G}keSL#I|7FM&Gk+y)5is0dE%o&@*kO|vy2+;ct zlgyZiQhxspd*{#qnL8@OYJ?IETLXAdX{J z=k5_ZbZn&XTWgpF*gU8+BB<1B7h0t>YE5YIvUh&}SY=bp8cZdYVZ0m8bxL&qzaWDi zQ|ya@|CnlCRU~_VKXcv5@AI-&f2F~#KMinz3N+v}2|UE*txromgYXH+-x!?J@g} zn`~WpYD4&-*a>=XT>{k3Q!u<;TDwB65Z)2Yw`J^>u6?4WSlHrgIVq8mv|doSvOs!9}y3m7f8db_=D>TZ{5dQantY@Dy5= z&6333DiyaE%t^9SDuki`hWC2Xlhg19q;ZSU_4DCJ9a;zE9}VX08pIBDT%Qbf#COy1 zTr2gYSx%u$jzETuL~WnS&M>c<{-aVo>b|s^?~!bC%Ft2vgbooH&?oL1On=rhkx&j0 zZ6D+MKmNkD)-rw>`r{yl+vB++K8tz}++YWuT(8EO>4$U166Pxve@TiqF}ijE{@Mb{ z=Na>^^+1Q8JDNUx2GdVO&7AE4STe4mutWCoR+}e<9;pb=&h{805BeIoR4-!|axfP4_)C}x( zJ(ZO63TfDb?&hz#MEbX#T9sjef0@wRD~{UNWb9o=A{%Dl2x6(=lt>wAgNTsI)0@uz zJST_iiX)DT-I$S`ub$tU)ixvUH%njSXKcuPBL;$Z&<8PwvtaRc)3Gw2ePxu8N-w&z z7u`4`EyWC#As-5$osG{ur}zdK5*;|;PuLetYfD&?Dp=`& zwtXIC__L(z&-)Mc2%@_5+-av8oO$Mo-?-)6qInLyGpnh4yPPx7!&gG^x9O5PKwcjJ zikvu=gYMIo4Bu6ECK}Gu9jFaH;emch$9W@5xFp7pj+*h>tb4wc5uB~nuhMh_)C17{ zj0!sHi-*Ur{G1Mkr&v6D$+(~)Latk zWryK`oHrW=*ADlNlMlkqp!O#W6X9yY#8UNie_mvY-7cH=oo=3(SK;`CO8TwHI=#*j z%A~8t#tgjq^RdsV1;wPNyuyo-*Fz5>O81Rid1EfUpZT80ZvFXgzto0Tv7(Y4jF89Z z)2aP86XbPvdT=KwSbSUp)b7(`QEPwu)hJI|J@`RIi0gf%oCFXM{{QFM a-jd<>av=Cn!|43y170XzWsj;m9(G$ literal 0 HcmV?d00001 diff --git a/.codesandbox/src/App.tsx b/.codesandbox/src/App.tsx new file mode 100644 index 000000000..05da5e5b3 --- /dev/null +++ b/.codesandbox/src/App.tsx @@ -0,0 +1,1348 @@ +import { AnimatePresence } from 'framer-motion' +import React, { useState, useEffect, useMemo, SetStateAction } from 'react' +import { ethers } from 'ethers' +import { sequence } from '0xsequence' +import { walletContracts } from '@0xsequence/abi' +import { + Box, + Image, + Text, + Button, + ExternalLinkIcon, + Divider, + Card, + TransactionIcon, + Select, + TokenImage, + TextInput, + Modal +} from '@0xsequence/design-system' +import { ETHAuth } from '@0xsequence/ethauth' +import { configureLogger } from '@0xsequence/utils' +import { ConnectOptions, OpenWalletIntent, Settings } from '@0xsequence/provider' +import { ChainId, NetworkType } from '@0xsequence/network' + +import { ERC_20_ABI } from './constants/abi' +import { Console } from './components/Console' +import { Group } from './components/Group' +import { getDefaultChainId, toHexString } from './helpers' +import logoUrl from './images/logo.svg' +import skyweaverBannerUrl from './images/skyweaver-banner.png' +import skyweaverBannerLargeUrl from './images/skyweaver-banner-large.png' + +configureLogger({ logLevel: 'DEBUG' }) + +interface Environment { + name: string + walletUrl: string + projectAccessKey: string +} + +const environments: Environment[] = [ + { + name: 'production', + walletUrl: 'https://sequence.app', + projectAccessKey: 'AQAAAAAAAAbvrgpWEC2Aefg5qYStQmwjBpA' + }, + { + name: 'development', + walletUrl: 'https://dev.sequence.app', + //projectAccessKey: 'AQAAAAAAAAVBNfoB30kz7Ph4I_Qs5mkYuDc', + projectAccessKey: 'AQAAAAAAAAVCXiQ9f_57R44MjorZ4SmGdhA' + }, + { + name: 'local', + walletUrl: 'http://localhost:3333', + projectAccessKey: 'AQAAAAAAAAVCXiQ9f_57R44MjorZ4SmGdhA' + }, + { + name: 'custom', + walletUrl: '', + projectAccessKey: '' + } +] + +const DEFAULT_API_URL = 'https://api.sequence.app' + +// Specify your desired default chain id. NOTE: you can communicate to multiple +// chains at the same time without even having to switch the network, but a default +// chain is required. +const defaultChainId = getDefaultChainId() || ChainId.MAINNET +// const defaultChainId = ChainId.POLYGON +// const defaultChainId = ChainId.GOERLI +// const defaultChainId = ChainId.ARBITRUM +// const defaultChainId = ChainId.AVALANCHE +// etc.. see the full list here: https://docs.sequence.xyz/multi-chain-support + +// For Sequence core dev team -- app developers can ignore +// a custom wallet app url can specified in the query string +const urlParams = new URLSearchParams(window.location.search) + +const env = urlParams.get('env') ?? 'production' +const envConfig = environments.find(x => x.name === env) +const walletAppURL = urlParams.get('walletAppURL') ?? envConfig.walletUrl +const projectAccessKey = urlParams.get('projectAccessKey') ?? envConfig.projectAccessKey +const showProhibitedActions = urlParams.has('showProhibitedActions') + +const isCustom = walletAppURL !== envConfig.walletUrl || projectAccessKey !== envConfig.projectAccessKey + +if (walletAppURL && walletAppURL.length > 0) { + // Wallet can point to a custom wallet app url + // NOTICE: this is not needed, unless testing an alpha version of the wallet + sequence.initWallet(projectAccessKey, { defaultNetwork: defaultChainId, transports: { walletAppURL } }) +} else { + // Init the sequence wallet library at the top-level of your project with + // your designed default chain id + sequence.initWallet(projectAccessKey, { defaultNetwork: defaultChainId, transports: { walletAppURL } }) +} + +// App component +const App = () => { + const [consoleMsg, setConsoleMsg] = useState(null) + const [email, setEmail] = useState(null) + const [consoleLoading, setConsoleLoading] = useState(false) + const [isWalletConnected, setIsWalletConnected] = useState(false) + + const wallet = sequence.getWallet().getProvider() + + const [showChainId, setShowChainId] = useState(wallet.getChainId()) + const [isOpen, toggleModal] = useState(false) + const [warning, setWarning] = useState(false) + + useMemo(() => { + wallet.on('chainChanged', (chainId: string) => { + setShowChainId(Number(BigInt(chainId))) + }) + }, []) + + useEffect(() => { + setIsWalletConnected(wallet.isConnected()) + }, [wallet]) + + useEffect(() => { + consoleWelcomeMessage() + // eslint-disable-next-line + }, [isWalletConnected]) + + useEffect(() => { + // Wallet events + wallet.client.onOpen(() => { + console.log('wallet window opened') + }) + + wallet.client.onClose(() => { + console.log('wallet window closed') + }) + }, [wallet]) + + const defaultConnectOptions: ConnectOptions = { + app: 'Demo Dapp', + askForEmail: true + // keepWalletOpened: true, + } + + // Methods + const connect = async (connectOptions: ConnectOptions = { app: 'Demo dapp' }) => { + if (isWalletConnected) { + resetConsole() + appendConsoleLine('Wallet already connected!') + setConsoleLoading(false) + return + } + + connectOptions = { + ...defaultConnectOptions, + ...connectOptions, + settings: { + ...defaultConnectOptions.settings, + ...connectOptions.settings + } + } + + try { + resetConsole() + appendConsoleLine('Connecting') + const wallet = sequence.getWallet() + + const connectDetails = await wallet.connect(connectOptions) + + // Example of how to verify using ETHAuth via Sequence API + if (connectOptions.authorize && connectDetails.connected) { + let apiUrl = urlParams.get('apiUrl') + + if (!apiUrl || apiUrl.length === 0) { + apiUrl = DEFAULT_API_URL + } + + const api = new sequence.api.SequenceAPIClient(apiUrl) + // or just + // const api = new sequence.api.SequenceAPIClient('https://api.sequence.app') + + const { isValid } = await api.isValidETHAuthProof({ + chainId: connectDetails.chainId, + walletAddress: connectDetails.session.accountAddress, + ethAuthProofString: connectDetails.proof!.proofString + }) + + appendConsoleLine(`isValid (API)?: ${isValid}`) + } + + // Example of how to verify using ETHAuth directl on the client + if (connectOptions.authorize) { + const ethAuth = new ETHAuth() + + if (connectDetails.proof) { + const decodedProof = await ethAuth.decodeProof(connectDetails.proof.proofString, true) + + const isValid = await wallet.utils.isValidTypedDataSignature( + wallet.getAddress(), + connectDetails.proof.typedData, + decodedProof.signature, + Number(BigInt(connectDetails.chainId)) + ) + + appendConsoleLine(`connected using chainId: ${BigInt(connectDetails.chainId).toString()}`) + appendConsoleLine(`isValid (client)?: ${isValid}`) + } + } + + setConsoleLoading(false) + if (connectDetails.connected) { + appendConsoleLine('Wallet connected!') + appendConsoleLine(`shared email: ${connectDetails.email}`) + setIsWalletConnected(true) + } else { + appendConsoleLine('Failed to connect wallet - ' + connectDetails.error) + } + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const disconnect = () => { + const wallet = sequence.getWallet() + wallet.disconnect() + consoleWelcomeMessage() + setIsWalletConnected(false) + } + + const openWallet = () => { + const wallet = sequence.getWallet() + wallet.openWallet() + } + + const openWalletWithSettings = () => { + const wallet = sequence.getWallet() + + const settings: Settings = { + theme: 'light', + includedPaymentProviders: ['moonpay', 'ramp'], + defaultFundingCurrency: 'eth', + defaultPurchaseAmount: 400, + lockFundingCurrencyToDefault: false + } + + const intent: OpenWalletIntent = { + type: 'openWithOptions', + options: { + app: 'Demo Dapp', + settings + } + } + + const path = 'wallet/add-funds' + wallet.openWallet(path, intent) + } + + const closeWallet = () => { + const wallet = sequence.getWallet() + wallet.closeWallet() + } + + const isConnected = async () => { + resetConsole() + const wallet = sequence.getWallet() + appendConsoleLine(`isConnected?: ${wallet.isConnected()}`) + setConsoleLoading(false) + } + + const isOpened = async () => { + resetConsole() + const wallet = sequence.getWallet() + appendConsoleLine(`isOpened?: ${wallet.isOpened()}`) + setConsoleLoading(false) + } + + const getChainID = async () => { + try { + resetConsole() + + const topChainId = wallet.getChainId() + appendConsoleLine(`top chainId: ${topChainId}`) + + const provider = wallet.getProvider() + const providerChainId = provider!.getChainId() + appendConsoleLine(`provider.getChainId(): ${providerChainId}`) + + const signer = wallet.getSigner() + const signerChainId = await signer.getChainId() + appendConsoleLine(`signer.getChainId(): ${signerChainId}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const getAccounts = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + const address = wallet.getAddress() + appendConsoleLine(`getAddress(): ${address}`) + + const provider = wallet.getProvider() + const accountList = provider.listAccounts() + appendConsoleLine(`accounts: ${JSON.stringify(accountList)}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const getBalance = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + const provider = wallet.getProvider() + const account = wallet.getAddress() + const balanceChk1 = await provider!.getBalance(account) + appendConsoleLine(`balance check 1: ${balanceChk1.toString()}`) + + const signer = wallet.getSigner() + const balanceChk2 = await signer.getBalance() + appendConsoleLine(`balance check 2: ${balanceChk2.toString()}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const getNetworks = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + const networks = await wallet.getNetworks() + + appendConsoleLine(`networks: ${JSON.stringify(networks, null, 2)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const signMessageString = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + appendConsoleLine('signing message...') + const signer = wallet.getSigner() + + const message = `1915 Robert Frost +The Road Not Taken + +Two roads diverged in a yellow wood, +And sorry I could not travel both +And be one traveler, long I stood +And looked down one as far as I could +To where it bent in the undergrowth + +Then took the other, as just as fair, +And having perhaps the better claim, +Because it was grassy and wanted wear +Though as for that the passing there +Had worn them really about the same, + +And both that morning equally lay +In leaves no step had trodden black. +Oh, I kept the first for another day! +Yet knowing how way leads on to way, +I doubted if I should ever come back. + +I shall be telling this with a sigh +Somewhere ages and ages hence: +Two roads diverged in a wood, and I— +I took the one less traveled by, +And that has made all the difference. + +\u2601 \u2600 \u2602` + + // sign + const sig = await signer.signMessage(message) + appendConsoleLine(`signature: ${sig}`) + + const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId()) + appendConsoleLine(`isValid?: ${isValid}`) + if (!isValid) throw new Error('sig invalid') + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const signMessageHex = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + appendConsoleLine('signing message...') + const signer = wallet.getSigner() + + // Message in hex + const message = ethers.hexlify(ethers.toUtf8Bytes('Hello, world!')) + + // sign + const sig = await signer.signMessage(message) + appendConsoleLine(`signature: ${sig}`) + + const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId()) + appendConsoleLine(`isValid?: ${isValid}`) + if (!isValid) throw new Error('sig invalid') + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const signMessageBytes = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + appendConsoleLine('signing message...') + const signer = wallet.getSigner() + + // Message in hex + const message = ethers.toUtf8Bytes('Hello, world!') + + // sign + const sig = await signer.signMessage(message) + appendConsoleLine(`signature: ${sig}`) + + const isValid = await wallet.utils.isValidMessageSignature(wallet.getAddress(), message, sig, await signer.getChainId()) + appendConsoleLine(`isValid?: ${isValid}`) + if (!isValid) throw new Error('sig invalid') + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const signTypedData = async () => { + try { + resetConsole() + const wallet = sequence.getWallet() + + appendConsoleLine('signing typedData...') + + const typedData: sequence.utils.TypedData = { + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'address' } + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'cc', type: 'Person[]' }, + { name: 'contents', type: 'string' }, + { name: 'attachements', type: 'string[]' } + ] + }, + primaryType: 'Mail', + domain: { + name: 'Ether Mail', + version: '1', + chainId: 1, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC' + }, + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826' + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' + }, + cc: [ + { name: 'Dev Team', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' }, + { name: 'Accounting', wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB' } + ], + contents: 'Hello, Bob!', + attachements: ['cat.png', 'dog.png'] + } + } + + const signer = wallet.getSigner() + + const sig = await signer.signTypedData(typedData.domain, typedData.types, typedData.message) + appendConsoleLine(`signature: ${sig}`) + + // validate + const isValid = await wallet.utils.isValidTypedDataSignature(wallet.getAddress(), typedData, sig, await signer.getChainId()) + appendConsoleLine(`isValid?: ${isValid}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const estimateUnwrapGas = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + const wmaticContractAddress = '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270' + const wmaticInterface = new ethers.Interface(['function withdraw(uint256 amount)']) + + const tx: sequence.transactions.Transaction = { + to: wmaticContractAddress, + data: wmaticInterface.encodeFunctionData('withdraw', ['1000000000000000000']) + } + + const provider = wallet.getProvider() + const estimate = await provider.estimateGas(tx) + + appendConsoleLine(`estimated gas needed for wmatic withdrawal : ${estimate.toString()}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const sendETH = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() + + appendConsoleLine(`Transfer txn on ${signer.getChainId()} chainId`) + + // NOTE: on mainnet, the balance will be of ETH value + // and on matic, the balance will be of MATIC value + + // Sending the funds to the wallet itself + // so we don't lose any funds ;-) + // (of course, you can send anywhere) + const toAddress = await signer.getAddress() + + const tx1: sequence.transactions.Transaction = { + delegateCall: false, + revertOnError: false, + gasLimit: '0x55555', + to: toAddress, + value: ethers.parseEther('1.234'), + data: '0x' + } + + const tx2: sequence.transactions.Transaction = { + delegateCall: false, + revertOnError: false, + gasLimit: '0x55555', + to: toAddress, + value: ethers.parseEther('0.4242'), + data: '0x' + } + + const provider = signer.provider + + const balance1 = await provider.getBalance(toAddress) + appendConsoleLine(`balance of ${toAddress}, before: ${balance1}`) + + const txnResp = await signer.sendTransaction([tx1, tx2]) + appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`) + + const balance2 = await provider.getBalance(toAddress) + appendConsoleLine(`balance of ${toAddress}, after: ${balance2}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const sendSepoliaUSDC = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + // Sending the funds to the wallet itself + // so we don't lose any funds ;-) + // (of course, you can send anywhere) + const toAddress = await signer.getAddress() + + const amount = ethers.parseUnits('1', 1) + + // (USDC address on Sepolia) + const usdcAddress = '0x07865c6e87b9f70255377e024ace6630c1eaa37f' + + const tx: sequence.transactions.Transaction = { + delegateCall: false, + revertOnError: false, + gasLimit: '0x55555', + to: usdcAddress, + value: 0, + data: new ethers.Interface(ERC_20_ABI).encodeFunctionData('transfer', [toAddress, toHexString(amount)]) + } + + const txnResp = await signer.sendTransaction([tx], { chainId: ChainId.SEPOLIA }) + appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const sendDAI = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + // Sending the funds to the wallet itself + // so we don't lose any funds ;-) + // (of course, you can send anywhere) + const toAddress = await signer.getAddress() + + const amount = ethers.parseUnits('0.05', 18) + const daiContractAddress = '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063' // (DAI address on Polygon) + + const tx: sequence.transactions.Transaction = { + delegateCall: false, + revertOnError: false, + gasLimit: '0x55555', + to: daiContractAddress, + value: 0, + data: new ethers.Interface(ERC_20_ABI).encodeFunctionData('transfer', [toAddress, toHexString(amount)]) + } + + const txnResp = await signer.sendTransaction([tx]) + appendConsoleLine(`txnResponse: ${JSON.stringify(txnResp)}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const sendETHSidechain = async () => { + try { + const wallet = sequence.getWallet() + + // Send either to Arbitrum or Optimism + // just pick one that is not the current chainId + const pick = wallet.getChainId() === ChainId.ARBITRUM ? ChainId.OPTIMISM : ChainId.ARBITRUM + sendETH(wallet.getSigner(pick)) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const send1155Tokens = async () => { + try { + resetConsole() + appendConsoleLine('TODO') + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const contractExample = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() + + const abi = [ + 'function balanceOf(address owner) view returns (uint256)', + 'function decimals() view returns (uint8)', + 'function symbol() view returns (string)', + 'function transfer(address to, uint amount) returns (bool)', + 'event Transfer(address indexed from, address indexed to, uint amount)' + ] + + // USD Coin (PoS) on Polygon + const address = '0x2791bca1f2de4661ed88a30c99a7a9449aa84174' + + const usdc = new ethers.Contract(address, abi) + + const usdSymbol = await usdc.symbol() + appendConsoleLine(`Token symbol: ${usdSymbol}`) + + const balance = await usdc.balanceOf(await signer.getAddress()) + appendConsoleLine(`Token Balance: ${balance.toString()}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const fetchTokenBalances = async () => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + const signer = wallet.getSigner() + const accountAddress = await signer.getAddress() + const networks = await wallet.getNetworks() + const network = networks.find(network => network.chainId === ChainId.POLYGON) + + if (!network) { + throw new Error(`Could not find Polygon network in networks list`) + } + + const indexer = new sequence.indexer.SequenceIndexer(network.indexerUrl) + + const tokenBalances = await indexer.getTokenBalances({ + accountAddress: accountAddress, + includeMetadata: true + }) + + appendConsoleLine(`tokens in your account: ${JSON.stringify(tokenBalances)}`) + + // NOTE: you can put any NFT/collectible address in the `contractAddress` field and it will return all of the balances + metadata. + // We use the Skyweaver production contract address here for demo purposes, but try another one :) + const skyweaverCollectibles = await indexer.getTokenBalances({ + accountAddress: accountAddress, + includeMetadata: true, + contractAddress: '0x631998e91476DA5B870D741192fc5Cbc55F5a52E' + }) + appendConsoleLine(`skyweaver collectibles in your account: ${JSON.stringify(skyweaverCollectibles)}`) + + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const updateImplementation = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + data: new ethers.Interface(walletContracts.mainModule.abi).encodeFunctionData('updateImplementation', [ + ethers.ZeroAddress + ]) + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const updateImageHash = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + data: new ethers.Interface(walletContracts.mainModuleUpgradable.abi).encodeFunctionData('updateImageHash', [ + ethers.ZeroHash + ]) + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const delegateCall = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + delegateCall: true + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const addHook = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + data: new ethers.Interface(['function addHook(bytes4 _signature, address _implementation)']).encodeFunctionData( + 'addHook', + ['0x01234567', ethers.ZeroAddress] + ) + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const setExtraImageHash = async (signer?: sequence.provider.SequenceSigner) => { + try { + resetConsole() + + const wallet = sequence.getWallet() + + signer = signer || wallet.getSigner() // select DefaultChain signer by default + + const transaction: sequence.transactions.Transaction = { + to: wallet.getAddress(), + data: new ethers.Interface(['function setExtraImageHash(bytes32 _imageHash, uint256 _expiration)']).encodeFunctionData( + 'setExtraImageHash', + [ethers.ZeroHash, ethers.MaxUint256] + ) + } + + const response = await signer.sendTransaction(transaction) + appendConsoleLine(`response: ${JSON.stringify(response)}`) + setConsoleLoading(false) + } catch (e) { + console.error(e) + consoleErrorMessage() + } + } + + const appendConsoleLine = (message: string, clear = false) => { + console.log(message) + + if (clear) { + return setConsoleMsg(message) + } + + return setConsoleMsg(prevState => { + return `${prevState}\n\n${message}` + }) + } + + const resetConsole = () => { + setConsoleLoading(true) + } + + const consoleWelcomeMessage = () => { + setConsoleLoading(false) + + if (isWalletConnected) { + setConsoleMsg('Status: Wallet is connected :)') + } else { + setConsoleMsg('Status: Wallet not connected. Please connect wallet first.') + } + } + + const consoleErrorMessage = () => { + setConsoleLoading(false) + setConsoleMsg('An error occurred') + } + + // networks list, filtered and sorted + const omitNetworks = [ + ChainId.RINKEBY, + ChainId.HARDHAT, + ChainId.HARDHAT_2, + ChainId.KOVAN, + ChainId.ROPSTEN, + ChainId.HOMEVERSE_TESTNET, + ChainId.BASE_GOERLI + ] + + const mainnets = Object.values(sequence.network.networks) + .filter(network => network.type === NetworkType.MAINNET) + .sort((a, b) => a.chainId - b.chainId) + const testnets = Object.values(sequence.network.networks) + .filter(network => network.type === NetworkType.TESTNET) + .sort((a, b) => a.chainId - b.chainId) + const networks = [...mainnets, ...testnets].filter(network => !network.deprecated && !omitNetworks.includes(network.chainId)) + + useEffect(() => { + if (email && !isOpen) { + console.log(email) + connect({ + app: 'Demo Dapp', + authorize: true, + settings: { + // Specify signInWithEmail with an email address to allow user automatically sign in with the email option. + signInWithEmail: email, + theme: 'dark', + bannerUrl: `${window.location.origin}${skyweaverBannerUrl}` + } + }) + setEmail(null) + } + }, [email, isOpen]) + + const sanitizeEmail = (email: string) => { + // Trim unnecessary spaces + email = email.trim() + + // Check if the email matches the pattern of a typical email + const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/ + if (emailRegex.test(email)) { + return true + } + + return false + } + + return ( + + +
+ logo + + + + + + Demo Dapp + + + + + + A dapp example on how to use the Sequence Wallet. This covers how to connect, sign messages and send transctions. + + + + + + + Please open your browser dev inspector to view output of functions below. + + + + + + {!isCustom && ( + + wallet.setDefaultChainId(Number(value))} + value={String(showChainId)} + options={[ + ...Object.values(networks).map(network => ({ + label: ( + + + {network.title!} + + ), + value: String(network.chainId) + })) + ]} + /> + + + + + + + + + + + +` + +const entry = resolveEntry() + +module.exports = { + mode: 'none', + context: process.cwd(), + entry: entry, + output: { + library: 'lib', + libraryTarget: 'umd' + }, + watch: false, + plugins: [...resolveHtmlPlugins(entry)], + module: { + rules: [ + { + test: /\.(js|mjs|ts)$/, + include: [...resolvePackages(), resolveCwd('./tests'), ...resolveExtras], + loader: require.resolve('babel-loader'), + options: { + presets: ['@babel/preset-typescript'], + plugins: [ + [require.resolve('@babel/plugin-transform-class-properties'), { loose: true }] + ], + cacheCompression: false, + compact: false, + }, + }, + { + test: /\.(jpe?g|png|gif|svg)$/i, + use: [ + { + loader: 'url-loader', + options: { + limit: 8192000 + } + } + ] + } + ] + }, + resolve: { + modules: ['node_modules', resolveCwd('node_modules')], + extensions: ['.ts', '.js', '.png', '.jpg', '.d.ts'], + alias: {}, + fallback: { + fs: false, + stream: false, + readline: false, + assert: false + } + }, + devServer: { + clientLogLevel: 'silent', + open: false, + host: '0.0.0.0', + port: port, + historyApiFallback: true, + stats: 'errors-only', + disableHostCheck: true, + contentBase: path.resolve(process.cwd(), 'tests/browser'), + publicPath: '/', + inline: false, + hot: false + } +} diff --git a/packages/0xsequence/tests/window-transport.spec.ts b/packages/0xsequence/tests/window-transport.spec.ts new file mode 100644 index 000000000..d56374379 --- /dev/null +++ b/packages/0xsequence/tests/window-transport.spec.ts @@ -0,0 +1,3 @@ +import { runBrowserTests } from './utils/browser-test-runner' + +runBrowserTests('window-transport', 'window-transport/dapp.test.html') diff --git a/packages/abi/CHANGELOG.md b/packages/abi/CHANGELOG.md new file mode 100644 index 000000000..542e66c10 --- /dev/null +++ b/packages/abi/CHANGELOG.md @@ -0,0 +1,1664 @@ +# @0xsequence/abi + +## 1.10.8 + +### Patch Changes + +- update metadata bindings + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia + +## 1.10.3 + +### Patch Changes + +- typing fix + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants + +## 1.9.36 + +### Patch Changes + +- guard: export client + +## 1.9.35 + +### Patch Changes + +- guard: update bindings + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email + +## 1.9.33 + +### Patch Changes + +- waas: umd build + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes + +## 1.9.30 + +### Patch Changes + +- update + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore + +## 1.9.23 + +### Patch Changes + +- update api client bindings + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings + +## 1.9.21 + +### Patch Changes + +- api client bindings + +## 1.9.20 + +### Patch Changes + +- api client bindings update + +## 1.9.19 + +### Patch Changes + +- waas update + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client + +## 1.9.8 + +### Patch Changes + +- waas client update + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer + +## 1.9.6 + +### Patch Changes + +- waas package update + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia + +## 1.9.1 + +### Patch Changes + +- analytics fix + +## 1.9.0 + +### Minor Changes + +- waas release + +## 1.8.8 + +### Patch Changes + +- update metadata bindings + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested + +## 1.8.1 + +### Patch Changes + +- update to analytics provider + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks + +## 1.6.3 + +### Patch Changes + +- network list update + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods + +## 1.4.2 + +### Patch Changes + +- guard: update bindings + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic + +## 1.4.0 + +### Minor Changes + +- project access key support + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions + +## 1.1.11 + +### Patch Changes + +- add homeverse configs + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object + +## 0.43.28 + +### Patch Changes + +- update api bindings + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM + +## 0.43.22 + +### Patch Changes + +- add zkevm chain + +## 0.43.21 + +### Patch Changes + +- api: update client bindings + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings + +## 0.43.19 + +### Patch Changes + +- session proof update + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods + +## 0.43.14 + +### Patch Changes + +- bump + +## 0.43.13 + +### Patch Changes + +- update rpc bindings + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter + +## 0.43.10 + +### Patch Changes + +- various improvements + +## 0.43.9 + +### Patch Changes + +- update deps + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings + +## 0.42.6 + +### Patch Changes + +- api bindings update + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options + +## 0.42.3 + +### Patch Changes + +- update api bindings + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' + +## 0.41.3 + +### Patch Changes + +- api bindings update + +## 0.41.2 + +### Patch Changes + +- api bindings update + +## 0.41.1 + +### Patch Changes + +- update default networks + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain + +## 0.40.5 + +### Patch Changes + +- api: update bindings + +## 0.40.4 + +### Patch Changes + +- add unreal transport + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option + +## 0.39.4 + +### Patch Changes + +- api: update client bindings + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider + +## 0.39.2 + +### Patch Changes + +- update umd name + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) + +## 0.36.7 + +### Patch Changes + +- fix missing break + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation + +## 0.35.10 + +### Patch Changes + +- upgrade deps + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +## 0.29.8 + +### Patch Changes + +- update api + +## 0.29.0 + +### Minor Changes + +- major architectural changes in Sequence design + + - only one API instance, API is no longer a per-chain service + - separate per-chain indexer service, API no longer handles indexing + - single contract metadata service, API no longer serves metadata + + chaind package has been removed, indexer and metadata packages have been added + + stronger typing with new explicit ChainId type + + multicall fixes and improvements + + forbid "wait" transactions in sendTransactionBatch calls + +## 0.28.0 + +### Minor Changes + +- extension provider + +## 0.27.0 + +### Minor Changes + +- Add requireFreshSigner lib to sessions + +## 0.25.1 + +### Patch Changes + +- Fix build typescrypt issue + +## 0.25.0 + +### Minor Changes + +- 10c8af8: Add estimator package + Fix multicall few calls bug + +## 0.23.0 + +### Minor Changes + +- - relayer: offer variety of gas fee options from the relayer service" + +## 0.22.2 + +### Patch Changes + +- e1c109e: Fix authProof on expired sessions + +## 0.22.1 + +### Patch Changes + +- transport session cache + +## 0.22.0 + +### Minor Changes + +- e667b65: Expose all relayer options on networks + +## 0.21.5 + +### Patch Changes + +- Give priority to metaTxnId returned by relayer + +## 0.21.4 + +### Patch Changes + +- Add has enough signers method + +## 0.21.3 + +### Patch Changes + +- add window session cache + +## 0.21.2 + +### Patch Changes + +- exception handlind in relayer + +## 0.21.0 + +### Minor Changes + +- - fix gas estimation on wallets with large number of signers + - update to session handling and wallet config construction upon auth + +## 0.19.3 + +### Patch Changes + +- jwtAuth visibility, package version sync + +## 0.19.2 + +### Patch Changes + +- - api: change jwtAuth visibility + +## 0.19.0 + +### Minor Changes + +- - provider, improve dapp / wallet transport io + +## 0.18.0 + +### Minor Changes + +- relayer improvements and pending transaction handling + +## 0.16.0 + +### Minor Changes + +- relayer as its own service separate from chaind + +## 0.15.1 + +### Patch Changes + +- update api clients + +## 0.14.3 + +### Patch Changes + +- Fix 0xSequence relayer dependencies + +## 0.14.2 + +### Patch Changes + +- Add debug logs to rpc-relayer + +## 0.14.0 + +### Minor Changes + +- update sequence utils finder which includes optimization + +## 0.13.0 + +### Minor Changes + +- Update SequenceUtils deployed contract + +## 0.12.1 + +### Patch Changes + +- npm bump + +## 0.12.0 + +### Minor Changes + +- provider: improvements to window transport + +## 0.11.4 + +### Patch Changes + +- update api client + +## 0.11.3 + +### Patch Changes + +- improve openWindow state options handling + +## 0.11.2 + +### Patch Changes + +- Fix multicall proxy scopes + +## 0.11.1 + +### Patch Changes + +- Add support for dynamic and nested signatures + +## 0.11.0 + +### Minor Changes + +- Update wallet context to 1.7 contracts + +## 0.10.9 + +### Patch Changes + +- add support for public addresses as signers in session.open + +## 0.10.8 + +### Patch Changes + +- Multicall production configuration + +## 0.10.7 + +### Patch Changes + +- allow provider transport to force disconnect + +## 0.10.6 + +### Patch Changes + +- - fix getWalletState method + +## 0.10.5 + +### Patch Changes + +- update relayer gas refund options + +## 0.10.4 + +### Patch Changes + +- Update api proto + +## 0.10.3 + +### Patch Changes + +- Fix loading config cross-chain + +## 0.10.2 + +### Patch Changes + +- - message digest fix + +## 0.10.1 + +### Patch Changes + +- upgrade deps + +## 0.10.0 + +### Minor Changes + +- Deployed new contracts with ERC1271 signer support + +## 0.9.6 + +### Patch Changes + +- Update ABIs for latest sequence contracts + +## 0.9.3 + +### Patch Changes + +- - minor improvements + +## 0.9.1 + +### Patch Changes + +- - patch bump + +## 0.9.0 + +### Minor Changes + +- - provider transport hardening + +## 0.8.5 + +### Patch Changes + +- - use latest wallet-contracts + +## 0.8.4 + +### Patch Changes + +- - minor improvements, name updates and comments + +## 0.8.3 + +### Patch Changes + +- - refinements + + - normalize signer address in config + + - provider: getWalletState() method to WalletProvider + +## 0.8.2 + +### Patch Changes + +- - field rename and ethauth dependency bump + +## 0.8.1 + +### Patch Changes + +- - variety of optimizations + +## 0.8.0 + +### Minor Changes + +- - changeset fix + +## 0.7.0 + +### Patch Changes + +- 6f11ed7: sequence.js, init release diff --git a/packages/abi/README.md b/packages/abi/README.md new file mode 100644 index 000000000..e0bbc2309 --- /dev/null +++ b/packages/abi/README.md @@ -0,0 +1,4 @@ +@0xsequence/abi +=============== + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/abi/src/index.ts b/packages/abi/src/index.ts new file mode 100644 index 000000000..6537ee23d --- /dev/null +++ b/packages/abi/src/index.ts @@ -0,0 +1 @@ +export { walletContracts } from './wallet' diff --git a/packages/abi/src/tokens/erc1155.ts b/packages/abi/src/tokens/erc1155.ts new file mode 100644 index 000000000..1e20ce405 --- /dev/null +++ b/packages/abi/src/tokens/erc1155.ts @@ -0,0 +1,3 @@ +export const abi = [] + +export const returns = {} diff --git a/packages/abi/src/tokens/erc20.ts b/packages/abi/src/tokens/erc20.ts new file mode 100644 index 000000000..1e20ce405 --- /dev/null +++ b/packages/abi/src/tokens/erc20.ts @@ -0,0 +1,3 @@ +export const abi = [] + +export const returns = {} diff --git a/packages/abi/src/tokens/erc721.ts b/packages/abi/src/tokens/erc721.ts new file mode 100644 index 000000000..1e20ce405 --- /dev/null +++ b/packages/abi/src/tokens/erc721.ts @@ -0,0 +1,3 @@ +export const abi = [] + +export const returns = {} diff --git a/packages/abi/src/wallet/erc1271.ts b/packages/abi/src/wallet/erc1271.ts new file mode 100644 index 000000000..14e057611 --- /dev/null +++ b/packages/abi/src/wallet/erc1271.ts @@ -0,0 +1,26 @@ +export const abi = [ + { + type: 'function', + name: 'isValidSignature', + constant: true, + inputs: [ + { + type: 'bytes32' + }, + { + type: 'bytes' + } + ], + outputs: [ + { + type: 'bytes4' + } + ], + payable: false, + stateMutability: 'view' + } +] + +export const returns = { + isValidSignatureBytes32: '0x1626ba7e' +} diff --git a/packages/abi/src/wallet/erc5719.ts b/packages/abi/src/wallet/erc5719.ts new file mode 100644 index 000000000..2f9b43b6a --- /dev/null +++ b/packages/abi/src/wallet/erc5719.ts @@ -0,0 +1,19 @@ +export const abi = [ + { + inputs: [ + { + internalType: 'bytes32', + type: 'bytes32' + } + ], + name: 'getAlternativeSignature', + outputs: [ + { + internalType: 'string', + type: 'string' + } + ], + stateMutability: 'view', + type: 'function' + } +] diff --git a/packages/abi/src/wallet/erc6492.ts b/packages/abi/src/wallet/erc6492.ts new file mode 100644 index 000000000..dcaf022a5 --- /dev/null +++ b/packages/abi/src/wallet/erc6492.ts @@ -0,0 +1,61 @@ +export const abi = [ + { inputs: [{ internalType: 'bytes', name: 'error', type: 'bytes' }], name: 'ERC1271Revert', type: 'error' }, + { inputs: [{ internalType: 'bytes', name: 'error', type: 'bytes' }], name: 'ERC6492DeployFailed', type: 'error' }, + { + inputs: [ + { internalType: 'address', name: '_signer', type: 'address' }, + { internalType: 'bytes32', name: '_hash', type: 'bytes32' }, + { internalType: 'bytes', name: '_signature', type: 'bytes' } + ], + name: 'isValidSig', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { internalType: 'address', name: '_signer', type: 'address' }, + { internalType: 'bytes32', name: '_hash', type: 'bytes32' }, + { internalType: 'bytes', name: '_signature', type: 'bytes' }, + { internalType: 'bool', name: 'allowSideEffects', type: 'bool' }, + { internalType: 'bool', name: 'deployAlreadyDeployed', type: 'bool' } + ], + name: 'isValidSigImpl', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { internalType: 'address', name: '_signer', type: 'address' }, + { internalType: 'bytes32', name: '_hash', type: 'bytes32' }, + { internalType: 'bytes', name: '_signature', type: 'bytes' } + ], + name: 'isValidSigNoThrow', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { internalType: 'address', name: '_signer', type: 'address' }, + { internalType: 'bytes32', name: '_hash', type: 'bytes32' }, + { internalType: 'bytes', name: '_signature', type: 'bytes' } + ], + name: 'isValidSigWithSideEffects', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { internalType: 'address', name: '_signer', type: 'address' }, + { internalType: 'bytes32', name: '_hash', type: 'bytes32' }, + { internalType: 'bytes', name: '_signature', type: 'bytes' } + ], + name: 'isValidSigWithSideEffectsNoThrow', + outputs: [{ internalType: 'bool', name: '', type: 'bool' }], + stateMutability: 'nonpayable', + type: 'function' + } +] diff --git a/packages/abi/src/wallet/factory.ts b/packages/abi/src/wallet/factory.ts new file mode 100644 index 000000000..df5ef5fc6 --- /dev/null +++ b/packages/abi/src/wallet/factory.ts @@ -0,0 +1,18 @@ +export const abi = [ + { + type: 'function', + name: 'deploy', + constant: false, + inputs: [ + { + type: 'address' + }, + { + type: 'bytes32' + } + ], + outputs: [], + payable: true, + stateMutability: 'payable' + } +] diff --git a/packages/abi/src/wallet/index.ts b/packages/abi/src/wallet/index.ts new file mode 100644 index 000000000..cb9bdf867 --- /dev/null +++ b/packages/abi/src/wallet/index.ts @@ -0,0 +1,19 @@ +import * as erc5719 from './erc5719' +import * as erc1271 from './erc1271' +import * as erc6492 from './erc6492' +import * as factory from './factory' +import * as mainModule from './mainModule' +import * as mainModuleUpgradable from './mainModuleUpgradable' +import * as sequenceUtils from './sequenceUtils' +import * as requireFreshSigner from './libs/requireFreshSigners' + +export const walletContracts = { + erc6492, + erc5719, + erc1271, + factory, + mainModule, + mainModuleUpgradable, + sequenceUtils, + requireFreshSigner +} diff --git a/packages/abi/src/wallet/libs/requireFreshSigners.ts b/packages/abi/src/wallet/libs/requireFreshSigners.ts new file mode 100644 index 000000000..ef8f78657 --- /dev/null +++ b/packages/abi/src/wallet/libs/requireFreshSigners.ts @@ -0,0 +1,15 @@ +export const abi = [ + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'requireFreshSigner', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + } +] diff --git a/packages/abi/src/wallet/mainModule.ts b/packages/abi/src/wallet/mainModule.ts new file mode 100644 index 000000000..e92fde8f1 --- /dev/null +++ b/packages/abi/src/wallet/mainModule.ts @@ -0,0 +1,158 @@ +export const abi = [ + { + type: 'function', + name: 'nonce', + constant: true, + inputs: [], + outputs: [ + { + type: 'uint256' + } + ], + payable: false, + stateMutability: 'view' + }, + { + type: 'function', + name: 'readNonce', + constant: true, + inputs: [ + { + type: 'uint256' + } + ], + outputs: [ + { + type: 'uint256' + } + ], + payable: false, + stateMutability: 'view' + }, + { + type: 'function', + name: 'updateImplementation', + constant: false, + inputs: [ + { + type: 'address' + } + ], + outputs: [], + payable: false, + stateMutability: 'nonpayable' + }, + { + type: 'function', + name: 'selfExecute', + constant: false, + inputs: [ + { + components: [ + { + type: 'bool', + name: 'delegateCall' + }, + { + type: 'bool', + name: 'revertOnError' + }, + { + type: 'uint256', + name: 'gasLimit' + }, + { + type: 'address', + name: 'target' + }, + { + type: 'uint256', + name: 'value' + }, + { + type: 'bytes', + name: 'data' + } + ], + type: 'tuple[]' + } + ], + outputs: [], + payable: false, + stateMutability: 'nonpayable' + }, + { + type: 'function', + name: 'execute', + constant: false, + inputs: [ + { + components: [ + { + type: 'bool', + name: 'delegateCall' + }, + { + type: 'bool', + name: 'revertOnError' + }, + { + type: 'uint256', + name: 'gasLimit' + }, + { + type: 'address', + name: 'target' + }, + { + type: 'uint256', + name: 'value' + }, + { + type: 'bytes', + name: 'data' + } + ], + type: 'tuple[]' + }, + { + type: 'uint256' + }, + { + type: 'bytes' + } + ], + outputs: [], + payable: false, + stateMutability: 'nonpayable' + }, + { + type: 'function', + name: 'createContract', + inputs: [ + { + type: 'bytes' + } + ], + payable: true, + stateMutability: 'payable' + }, + { + type: 'function', + name: 'setExtraImageHash', + constant: false, + inputs: [ + { + type: 'bytes32', + name: 'imageHash' + }, + { + type: 'uint256', + name: 'expiration' + } + ], + outputs: [], + payable: false, + stateMutability: 'nonpayable' + } +] diff --git a/packages/abi/src/wallet/mainModuleUpgradable.ts b/packages/abi/src/wallet/mainModuleUpgradable.ts new file mode 100644 index 000000000..e49298a38 --- /dev/null +++ b/packages/abi/src/wallet/mainModuleUpgradable.ts @@ -0,0 +1,28 @@ +export const abi = [ + { + type: 'function', + name: 'updateImageHash', + constant: true, + inputs: [ + { + type: 'bytes32' + } + ], + outputs: [], + payable: false, + stateMutability: 'view' + }, + { + type: 'function', + name: 'imageHash', + constant: true, + inputs: [], + outputs: [ + { + type: 'bytes32' + } + ], + payable: false, + stateMutability: 'view' + } +] diff --git a/packages/abi/src/wallet/sequenceUtils.ts b/packages/abi/src/wallet/sequenceUtils.ts new file mode 100644 index 000000000..7b52c69c8 --- /dev/null +++ b/packages/abi/src/wallet/sequenceUtils.ts @@ -0,0 +1,516 @@ +export const abi = [ + { + inputs: [ + { + internalType: 'address', + name: '_factory', + type: 'address' + }, + { + internalType: 'address', + name: '_mainModule', + type: 'address' + } + ], + stateMutability: 'nonpayable', + type: 'constructor' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + indexed: true, + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'uint256', + name: '_threshold', + type: 'uint256' + }, + { + indexed: false, + internalType: 'bytes', + name: '_signers', + type: 'bytes' + } + ], + name: 'RequiredConfig', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + indexed: true, + internalType: 'address', + name: '_signer', + type: 'address' + } + ], + name: 'RequiredSigner', + type: 'event' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callBalanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callBlockNumber', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_i', + type: 'uint256' + } + ], + name: 'callBlockhash', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callChainId', + outputs: [ + { + internalType: 'uint256', + name: 'id', + type: 'uint256' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCode', + outputs: [ + { + internalType: 'bytes', + name: 'code', + type: 'bytes' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCodeHash', + outputs: [ + { + internalType: 'bytes32', + name: 'codeHash', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCodeSize', + outputs: [ + { + internalType: 'uint256', + name: 'size', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callCoinbase', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callDifficulty', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasLeft', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasLimit', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasPrice', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callOrigin', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callTimestamp', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'knownImageHashes', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + name: 'lastImageHashUpdate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'lastSignerUpdate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'lastWalletUpdate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'multiCall', + outputs: [ + { + internalType: 'bool[]', + name: '_successes', + type: 'bool[]' + }, + { + internalType: 'bytes[]', + name: '_results', + type: 'bytes[]' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + internalType: 'uint256', + name: '_threshold', + type: 'uint256' + }, + { + components: [ + { + internalType: 'uint256', + name: 'weight', + type: 'uint256' + }, + { + internalType: 'address', + name: 'signer', + type: 'address' + } + ], + internalType: 'struct RequireUtils.Member[]', + name: '_members', + type: 'tuple[]' + }, + { + internalType: 'bool', + name: '_index', + type: 'bool' + } + ], + name: 'publishConfig', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: '_sizeMembers', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'bool', + name: '_index', + type: 'bool' + } + ], + name: 'publishInitialSigners', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + internalType: 'uint256', + name: '_nonce', + type: 'uint256' + } + ], + name: 'requireMinNonce', + outputs: [], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'requireNonExpired', + outputs: [], + stateMutability: 'view', + type: 'function' + } +] diff --git a/packages/account/hardhat.config.js b/packages/account/hardhat.config.js new file mode 100644 index 000000000..9e73336b0 --- /dev/null +++ b/packages/account/hardhat.config.js @@ -0,0 +1,12 @@ + +module.exports = { + networks: { + hardhat: { + chainId: 31337, + port: 7146, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + }, + }, + } +} diff --git a/packages/account/hardhat2.config.js b/packages/account/hardhat2.config.js new file mode 100644 index 000000000..e984fc2e7 --- /dev/null +++ b/packages/account/hardhat2.config.js @@ -0,0 +1,11 @@ + +module.exports = { + networks: { + hardhat: { + chainId: 31338, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + } + } + } +} diff --git a/packages/account/src/account.ts b/packages/account/src/account.ts new file mode 100644 index 000000000..3243842eb --- /dev/null +++ b/packages/account/src/account.ts @@ -0,0 +1,1085 @@ +import { walletContracts } from '@0xsequence/abi' +import { commons, universal } from '@0xsequence/core' +import { WalletSignRequestMetadata } from '@0xsequence/core/src/commons' +import { migrator, defaults, version } from '@0xsequence/migration' +import { ChainId, NetworkConfig } from '@0xsequence/network' +import { FeeOption, FeeQuote, isRelayer, Relayer, RpcRelayer } from '@0xsequence/relayer' +import { tracker } from '@0xsequence/sessions' +import { SignatureOrchestrator } from '@0xsequence/signhub' +import { encodeTypedDataDigest, getEthersConnectionInfo } from '@0xsequence/utils' +import { Wallet } from '@0xsequence/wallet' +import { ethers, TypedDataDomain, TypedDataField } from 'ethers' +import { AccountSigner, AccountSignerOptions } from './signer' + +export type AccountStatus = { + original: { + version: number + imageHash: string + context: commons.context.WalletContext + } + onChain: { + imageHash: string + config: commons.config.Config + version: number + deployed: boolean + } + fullyMigrated: boolean + signedMigrations: migrator.SignedMigration[] + version: number + presignedConfigurations: tracker.PresignedConfigLink[] + imageHash: string + config: commons.config.Config + checkpoint: ethers.BigNumberish + canOnchainValidate: boolean +} + +export type AccountOptions = { + // The only unique identifier for a wallet is the address + address: string + + // The config tracker keeps track of chained configs, + // counterfactual addresses and reverse lookups for configurations + // it must implement both the ConfigTracker and MigrationTracker + tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker + + // Versioned contexts contains the context information for each Sequence version + contexts: commons.context.VersionedContext + + // Optional list of migrations, if not provided, the default migrations will be used + // NOTICE: the last vestion is considered the "current" version for the account + migrations?: migrator.Migrations + + // Orchestrator manages signing messages and transactions + orchestrator: SignatureOrchestrator + + // Networks information and providers + networks: NetworkConfig[] + + // Jwt + jwt?: string + + // Project access key + projectAccessKey?: string +} + +export interface PreparedTransactions { + transactions: commons.transaction.SimulatedTransaction[] + flatDecorated: commons.transaction.Transaction[] + feeOptions: FeeOption[] + feeQuote?: FeeQuote +} + +class Chain0Reader implements commons.reader.Reader { + async isDeployed(_wallet: string): Promise { + return false + } + + async implementation(_wallet: string): Promise { + return undefined + } + + async imageHash(_wallet: string): Promise { + return undefined + } + + async nonce(_wallet: string, _space: ethers.BigNumberish): Promise { + return ethers.constants.Zero + } + + async isValidSignature(_wallet: string, _digest: ethers.utils.BytesLike, _signature: ethers.utils.BytesLike): Promise { + throw new Error('Method not supported.') + } +} + +export class Account { + public readonly address: string + + public readonly networks: NetworkConfig[] + public readonly tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker + public readonly contexts: commons.context.VersionedContext + + public readonly migrator: migrator.Migrator + public readonly migrations: migrator.Migrations + + private orchestrator: SignatureOrchestrator + + private jwt?: string + + private projectAccessKey?: string + + constructor(options: AccountOptions) { + this.address = ethers.utils.getAddress(options.address) + + this.contexts = options.contexts + this.tracker = options.tracker + this.networks = options.networks + this.orchestrator = options.orchestrator + this.jwt = options.jwt + this.projectAccessKey = options.projectAccessKey + + this.migrations = options.migrations || defaults.DefaultMigrations + this.migrator = new migrator.Migrator(options.tracker, this.migrations, this.contexts) + } + + getSigner(chainId: ChainId, options?: AccountSignerOptions): AccountSigner { + return new AccountSigner(this, chainId, options) + } + + static async new(options: { + config: commons.config.SimpleConfig + tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker + contexts: commons.context.VersionedContext + orchestrator: SignatureOrchestrator + networks: NetworkConfig[] + migrations?: migrator.Migrations + projectAccessKey?: string + }): Promise { + const mig = new migrator.Migrator(options.tracker, options.migrations ?? defaults.DefaultMigrations, options.contexts) + + const lastMigration = mig.lastMigration() + const lastCoder = lastMigration.configCoder + + const config = lastCoder.fromSimple(options.config) + const imageHash = lastCoder.imageHashOf(config) + const context = options.contexts[lastMigration.version] + const address = commons.context.addressOf(context, imageHash) + + await options.tracker.saveCounterfactualWallet({ config, context: Object.values(options.contexts) }) + + return new Account({ + address, + tracker: options.tracker, + contexts: options.contexts, + networks: options.networks, + orchestrator: options.orchestrator, + migrations: options.migrations, + projectAccessKey: options.projectAccessKey + }) + } + + getAddress(): Promise { + return Promise.resolve(this.address) + } + + get version(): number { + return this.migrator.lastMigration().version + } + + get coders(): { + signature: commons.signature.SignatureCoder + config: commons.config.ConfigCoder + } { + const lastMigration = this.migrator.lastMigration() + + return { + signature: lastMigration.signatureCoder, + config: lastMigration.configCoder + } + } + + network(chainId: ethers.BigNumberish): NetworkConfig { + const tcid = ethers.BigNumber.from(chainId) + const found = this.networks.find(n => tcid.eq(n.chainId)) + if (!found) throw new Error(`Network not found for chainId ${chainId}`) + return found + } + + providerFor(chainId: ethers.BigNumberish): ethers.providers.Provider { + const found = this.network(chainId) + if (!found.provider && !found.rpcUrl) throw new Error(`Provider not found for chainId ${chainId}`) + return ( + found.provider || + new ethers.providers.StaticJsonRpcProvider(getEthersConnectionInfo(found.rpcUrl, this.projectAccessKey, this.jwt), { + name: '', + chainId: ethers.BigNumber.from(chainId).toNumber() + }) + ) + } + + reader(chainId: ethers.BigNumberish): commons.reader.Reader { + if (ethers.constants.Zero.eq(chainId)) return new Chain0Reader() + + // TODO: Networks should be able to provide a reader directly + // and we should default to the on-chain reader + return new commons.reader.OnChainReader(this.providerFor(chainId)) + } + + relayer(chainId: ethers.BigNumberish): Relayer { + const found = this.network(chainId) + if (!found.relayer) throw new Error(`Relayer not found for chainId ${chainId}`) + if (isRelayer(found.relayer)) return found.relayer + return new RpcRelayer({ + ...found.relayer, + // If there's an access key, we don't pass the JWT, because browser-side usage of this code mandates an access key + // and passing a JWT causes a CORS error. + ...(this.projectAccessKey ? { projectAccessKey: this.projectAccessKey } : { jwtAuth: this.jwt }) + }) + } + + setOrchestrator(orchestrator: SignatureOrchestrator) { + this.orchestrator = orchestrator + } + + setJwt(jwt: string) { + this.jwt = jwt + } + + contextFor(version: number): commons.context.WalletContext { + const ctx = this.contexts[version] + if (!ctx) throw new Error(`Context not found for version ${version}`) + return ctx + } + + walletForStatus(chainId: ethers.BigNumberish, status: Pick & Pick): Wallet { + const coder = universal.coderFor(status.version) + return this.walletFor(chainId, this.contextFor(status.version), status.config, coder) + } + + walletFor( + chainId: ethers.BigNumberish, + context: commons.context.WalletContext, + config: commons.config.Config, + coders: typeof this.coders + ): Wallet { + const isNetworkZero = ethers.constants.Zero.eq(chainId) + return new Wallet({ + config, + context, + chainId, + coders, + relayer: isNetworkZero ? undefined : this.relayer(chainId), + address: this.address, + orchestrator: this.orchestrator, + reader: this.reader(chainId) + }) + } + + // Get the status of the account on a given network + // this does the following process: + // 1. Get the current on-chain status of the wallet (version + imageHash) + // 2. Get any pending migrations that have been signed by the wallet + // 3. Get any pending configuration updates that have been signed by the wallet + // 4. Fetch reverse lookups for both on-chain and pending configurations + async status(chainId: ethers.BigNumberish, longestPath: boolean = false): Promise { + const isDeployedPromise = this.reader(chainId).isDeployed(this.address) + + const counterfactualImageHashPromise = this.tracker + .imageHashOfCounterfactualWallet({ + wallet: this.address + }) + .then(r => { + if (!r) throw new Error(`Counterfactual imageHash not found for wallet ${this.address}`) + return r + }) + + const counterFactualVersionPromise = counterfactualImageHashPromise.then(r => { + return version.counterfactualVersion(this.address, r.imageHash, Object.values(this.contexts)) + }) + + const onChainVersionPromise = (async () => { + const isDeployed = await isDeployedPromise + if (!isDeployed) return counterFactualVersionPromise + + const implementation = await this.reader(chainId).implementation(this.address) + if (!implementation) throw new Error(`Implementation not found for wallet ${this.address}`) + + const versions = Object.values(this.contexts) + for (let i = 0; i < versions.length; i++) { + if (versions[i].mainModule === implementation || versions[i].mainModuleUpgradable === implementation) { + return versions[i].version + } + } + + throw new Error(`Version not found for implementation ${implementation}`) + })() + + const onChainImageHashPromise = (async () => { + const deployedImageHash = await this.reader(chainId).imageHash(this.address) + if (deployedImageHash) return deployedImageHash + const counterfactualImageHash = await counterfactualImageHashPromise + if (counterfactualImageHash) return counterfactualImageHash.imageHash + throw new Error(`On-chain imageHash not found for wallet ${this.address}`) + })() + + const onChainConfigPromise = (async () => { + const onChainImageHash = await onChainImageHashPromise + const onChainConfig = await this.tracker.configOfImageHash({ imageHash: onChainImageHash }) + if (onChainConfig) return onChainConfig + throw new Error(`On-chain config not found for imageHash ${onChainImageHash}`) + })() + + const onChainVersion = await onChainVersionPromise + const onChainImageHash = await onChainImageHashPromise + + let fromImageHash = onChainImageHash + let lastVersion = onChainVersion + let signedMigrations: migrator.SignedMigration[] = [] + + if (onChainVersion !== this.version) { + // We either need to use the presigned configuration updates, or we haven't performed + // any updates yet, so we can only use the on-chain imageHash as-is + const presignedMigrate = await this.migrator.getAllMigratePresignedTransaction({ + address: this.address, + fromImageHash: onChainImageHash, + fromVersion: onChainVersion, + chainId + }) + + // The migrator returns the original version and imageHash + // if no presigned migration is found, so no need to check here + fromImageHash = presignedMigrate.lastImageHash + lastVersion = presignedMigrate.lastVersion + + signedMigrations = presignedMigrate.signedMigrations + } + + const presigned = await this.tracker.loadPresignedConfiguration({ + wallet: this.address, + fromImageHash: fromImageHash, + longestPath + }) + + const imageHash = presigned && presigned.length > 0 ? presigned[presigned.length - 1].nextImageHash : fromImageHash + const config = await this.tracker.configOfImageHash({ imageHash }) + if (!config) { + throw new Error(`Config not found for imageHash ${imageHash}`) + } + + const isDeployed = await isDeployedPromise + const counterfactualImageHash = await counterfactualImageHashPromise + const checkpoint = universal.coderFor(lastVersion).config.checkpointOf(config as any) + + return { + original: { + ...counterfactualImageHash, + version: await counterFactualVersionPromise + }, + onChain: { + imageHash: onChainImageHash, + config: await onChainConfigPromise, + version: onChainVersion, + deployed: isDeployed + }, + fullyMigrated: lastVersion === this.version, + signedMigrations, + version: lastVersion, + presignedConfigurations: presigned, + imageHash, + config, + checkpoint, + canOnchainValidate: onChainVersion === this.version && isDeployed + } + } + + private mustBeFullyMigrated(status: AccountStatus) { + if (!status.fullyMigrated) { + throw new Error(`Wallet ${this.address} is not fully migrated`) + } + } + + async predecorateSignedTransactions( + status: AccountStatus, + chainId: ethers.BigNumberish + ): Promise { + // Request signed predecorate transactions from child wallets + const bundles = await this.orchestrator.predecorateSignedTransactions({ chainId }) + // Get signed predecorate transaction + const predecorated = await this.predecorateTransactions([], status, chainId) + if (commons.transaction.fromTransactionish(this.address, predecorated).length > 0) { + // Sign it + bundles.push(await this.signTransactions(predecorated, chainId)) + } + return bundles + } + + async predecorateTransactions( + txs: commons.transaction.Transactionish, + status: AccountStatus, + chainId: ethers.BigNumberish + ): Promise { + // if onchain wallet config is not up to date + // then we should append an extra transaction that updates it + // to the latest "lazy" state + if (status.onChain.imageHash !== status.imageHash) { + const wallet = this.walletForStatus(chainId, status) + const updateConfig = await wallet.buildUpdateConfigurationTransaction(status.config) + return [Array.isArray(txs) ? txs : [txs], updateConfig.transactions].flat() + } + + return txs + } + + async decorateTransactions( + bundles: commons.transaction.IntendedTransactionBundle | commons.transaction.IntendedTransactionBundle[], + status: AccountStatus, + chainId?: ethers.BigNumberish + ): Promise { + if (!Array.isArray(bundles)) { + // Recurse with array + return this.decorateTransactions([bundles], status, chainId) + } + + // Default to chainId of first bundle when not supplied + chainId = chainId ?? bundles[0].chainId + + const bootstrapBundle = await this.buildBootstrapTransactions(status, chainId) + const hasBootstrapTxs = bootstrapBundle.transactions.length > 0 + + if (!hasBootstrapTxs && bundles.length === 1) { + return bundles[0] + } + + // Intent defaults to first bundle when no bootstrap transaction + const { entrypoint } = hasBootstrapTxs ? bootstrapBundle : bundles[0] + + const decoratedBundle = { + entrypoint, + chainId, + // Intent of the first bundle is used + intent: bundles[0]?.intent, + transactions: [ + ...bootstrapBundle.transactions, + ...bundles.map( + (bundle): commons.transaction.Transaction => ({ + to: bundle.entrypoint, + data: commons.transaction.encodeBundleExecData(bundle), + gasLimit: 0, + delegateCall: false, + revertOnError: true, + value: 0 + }) + ) + ] + } + + // Re-compute the meta-transaction id to use the guest module subdigest + if (!status.onChain.deployed) { + const id = commons.transaction.subdigestOfGuestModuleTransactions( + this.contexts[this.version].guestModule, + chainId, + decoratedBundle.transactions + ) + + if (decoratedBundle.intent === undefined) { + decoratedBundle.intent = { id, wallet: this.address } + } else { + decoratedBundle.intent.id = id + } + } + + return decoratedBundle + } + + async decorateSignature( + signature: T, + status: Partial> + ): Promise { + if (!status.presignedConfigurations || status.presignedConfigurations.length === 0) { + return signature + } + + const coder = this.coders.signature + + const chain = status.presignedConfigurations.map(c => c.signature) + const chainedSignature = coder.chainSignatures(signature, chain) + return coder.trim(chainedSignature) + } + + async publishWitness(): Promise { + const digest = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(`This is a Sequence account woo! ${Date.now()}`)) + const signature = await this.signDigest(digest, 0, false) + const decoded = this.coders.signature.decode(signature) + const signatures = this.coders.signature.signaturesOfDecoded(decoded) + return this.tracker.saveWitnesses({ wallet: this.address, digest, chainId: 0, signatures }) + } + + async signDigest( + digest: ethers.BytesLike, + chainId: ethers.BigNumberish, + decorate: boolean = true, + cantValidateBehavior: 'ignore' | 'eip6492' | 'throw' = 'ignore', + metadata?: object + ): Promise { + // If we are signing a digest for chainId zero then we can never be fully migrated + // because Sequence v1 doesn't allow for signing a message on "all chains" + + // So we ignore the state on "chain zero" and instead use one of the states of the networks + // wallet-webapp should ensure the wallet is as migrated as possible, trying to mimic + // the behaviour of being migrated on all chains + const chainRef = ethers.constants.Zero.eq(chainId) ? this.networks[0].chainId : chainId + const status = await this.status(chainRef) + this.mustBeFullyMigrated(status) + + // Check if we can validate onchain and what to do if we can't + // revert early, since there is no point in signing a digest now + if (!status.canOnchainValidate && cantValidateBehavior === 'throw') { + throw new Error('Wallet cannot validate onchain') + } + + const wallet = this.walletForStatus(chainId, status) + const signature = await wallet.signDigest(digest, metadata) + + const decorated = decorate ? this.decorateSignature(signature, status) : signature + + // If the wallet can't validate onchain then we + // need to prefix the decorated signature with all deployments and migrations + // aka doing a bootstrap using EIP-6492 + if (!status.canOnchainValidate) { + switch (cantValidateBehavior) { + // NOTICE: We covered this case before signing the digest + // case 'throw': + // throw new Error('Wallet cannot validate on-chain') + case 'ignore': + return decorated + + case 'eip6492': + return this.buildEIP6492Signature(await decorated, status, chainId) + } + } + + return decorated + } + + buildOnChainSignature(digest: ethers.BytesLike): { bundle: commons.transaction.TransactionBundle; signature: string } { + const subdigest = commons.signature.subdigestOf({ digest: ethers.utils.hexlify(digest), chainId: 0, address: this.address }) + const hexSubdigest = ethers.utils.hexlify(subdigest) + const config = this.coders.config.fromSimple({ + // Threshold *only* needs to be > 0, this is not a magic number + // we only use 2 ** 15 because it may lead to lower gas costs in some chains + threshold: 32768, + checkpoint: 0, + signers: [], + subdigests: [hexSubdigest] + }) + + const walletInterface = new ethers.utils.Interface(walletContracts.mainModule.abi) + const bundle: commons.transaction.TransactionBundle = { + entrypoint: this.address, + transactions: [ + { + to: this.address, + data: walletInterface.encodeFunctionData( + // *NEVER* use updateImageHash here, as it would effectively destroy the wallet + // setExtraImageHash sets an additional imageHash, without changing the current one + 'setExtraImageHash', + [ + this.coders.config.imageHashOf(config), + // 2 ** 255 instead of max uint256, to have more zeros in the calldata + '57896044618658097711785492504343953926634992332820282019728792003956564819968' + ] + ), + // Conservative gas limit, used because the current relayer + // has trouble estimating gas for this transaction + gasLimit: 250000 + } + ] + } + + // Fire and forget request to save the config + this.tracker.saveWalletConfig({ config }) + + // Encode a signature proof for the given subdigest + // use `chainId = 0` to make it simpler, as this signature is only a proof + const signature = this.coders.signature.encodeSigners(config, new Map(), [hexSubdigest], 0).encoded + return { bundle, signature } + } + + private async buildEIP6492Signature(signature: string, status: AccountStatus, chainId: ethers.BigNumberish): Promise { + const bootstrapBundle = await this.buildBootstrapTransactions(status, chainId) + if (bootstrapBundle.transactions.length === 0) { + throw new Error('Cannot build EIP-6492 signature without bootstrap transactions') + } + + const encoded = ethers.utils.defaultAbiCoder.encode( + ['address', 'bytes', 'bytes'], + [bootstrapBundle.entrypoint, commons.transaction.encodeBundleExecData(bootstrapBundle), signature] + ) + + return ethers.utils.solidityPack(['bytes', 'bytes32'], [encoded, commons.EIP6492.EIP_6492_SUFFIX]) + } + + async editConfig(changes: { + add?: commons.config.SimpleSigner[] + remove?: string[] + threshold?: ethers.BigNumberish + }): Promise { + const currentConfig = await this.status(0).then(s => s.config) + const newConfig = this.coders.config.editConfig(currentConfig, { + ...changes, + checkpoint: this.coders.config.checkpointOf(currentConfig).add(1) + }) + + return this.updateConfig(newConfig) + } + + async updateConfig(config: commons.config.Config): Promise { + // config should be for the current version of the wallet + if (!this.coders.config.isWalletConfig(config)) { + throw new Error(`Invalid config for wallet ${this.address}`) + } + + const nextImageHash = this.coders.config.imageHashOf(config) + + // sign an update config struct + const updateStruct = this.coders.signature.hashSetImageHash(nextImageHash) + + // sign the update struct, using chain id 0 + const signature = await this.signDigest(updateStruct, 0, false) + + // save the presigned transaction to the sessions tracker + await this.tracker.savePresignedConfiguration({ + wallet: this.address, + nextConfig: config, + signature + }) + + // safety check, tracker should have a reverse lookup for the imageHash + // outside of the local cache + const reverseConfig = await this.tracker.configOfImageHash({ + imageHash: nextImageHash, + noCache: true + }) + + if (!reverseConfig || this.coders.config.imageHashOf(reverseConfig) !== nextImageHash) { + throw Error(`Reverse lookup failed for imageHash ${nextImageHash}`) + } + } + + /** + * This method is used to bootstrap the wallet on a given chain. + * this deploys the wallets and executes all the necessary transactions + * for that wallet to start working with the given version. + * + * This usually involves: (a) deploying the wallet, (b) executing migrations + * + * Notice: It should NOT explicitly include chained signatures. Unless internally used + * by any of the migrations. + * + */ + async buildBootstrapTransactions( + status: AccountStatus, + chainId: ethers.BigNumberish + ): Promise { + const bundle = await this.orchestrator.buildDeployTransaction({ chainId }) + const transactions: commons.transaction.Transaction[] = bundle?.transactions ?? [] + + // Add wallet deployment if needed + if (!status.onChain.deployed) { + // Wallet deployment will vary depending on the version + // so we need to use the context to get the correct deployment + const deployTransaction = Wallet.buildDeployTransaction(status.original.context, status.original.imageHash) + + transactions.push(...deployTransaction.transactions) + } + const len = transactions.length + + // Get pending migrations + transactions.push( + ...status.signedMigrations.map(m => ({ + to: m.tx.entrypoint, + data: commons.transaction.encodeBundleExecData(m.tx), + value: 0, + gasLimit: 0, + revertOnError: true, + delegateCall: false + })) + ) + + // Build the transaction intent, if the transaction has migrations + // then we should use one of the intents of the migrations (anyone will do) + // if it doesn't, then the only intent we could use if the GuestModule one + // ... but this may fail if the relayer uses a different GuestModule + const id = + status.signedMigrations.length > 0 + ? status.signedMigrations[0].tx.intent.id + : commons.transaction.subdigestOfGuestModuleTransactions(this.contexts[this.version].guestModule, chainId, transactions) + + // Everything is encoded as a bundle + // using the GuestModule of the account version + const { guestModule } = this.contextFor(status.version) + return { entrypoint: guestModule, transactions, chainId, intent: { id, wallet: this.address } } + } + + async bootstrapTransactions( + chainId: ethers.BigNumberish, + prestatus?: AccountStatus + ): Promise> { + const status = prestatus || (await this.status(chainId)) + return this.buildBootstrapTransactions(status, chainId) + } + + async doBootstrap(chainId: ethers.BigNumberish, feeQuote?: FeeQuote, prestatus?: AccountStatus) { + const bootstrapTxs = await this.bootstrapTransactions(chainId, prestatus) + return this.relayer(chainId).relay({ ...bootstrapTxs, chainId }, feeQuote) + } + + signMessage( + message: ethers.BytesLike, + chainId: ethers.BigNumberish, + cantValidateBehavior: 'ignore' | 'eip6492' | 'throw' = 'ignore' + ): Promise { + return this.signDigest(ethers.utils.keccak256(message), chainId, true, cantValidateBehavior) + } + + async signTransactions( + txs: commons.transaction.Transactionish, + chainId: ethers.BigNumberish, + pstatus?: AccountStatus, + options?: { + nonceSpace?: ethers.BigNumberish + serial?: boolean + } + ): Promise { + const status = pstatus || (await this.status(chainId)) + this.mustBeFullyMigrated(status) + + const wallet = this.walletForStatus(chainId, status) + + const metadata: WalletSignRequestMetadata = { + address: this.address, + digest: '', // Set in wallet.signTransactions + chainId, + config: { version: this.version }, + decorate: true, + cantValidateBehavior: 'ignore' + } + + const nonceOptions = options?.serial + ? { serial: true } + : options?.nonceSpace !== undefined + ? { space: options.nonceSpace } + : undefined + + const signed = await wallet.signTransactions(txs, nonceOptions, metadata) + + return { + ...signed, + signature: await this.decorateSignature(signed.signature, status) + } + } + + async signMigrations( + chainId: ethers.BigNumberish, + editConfig: (prevConfig: commons.config.Config) => commons.config.Config + ): Promise { + const status = await this.status(chainId) + if (status.fullyMigrated) return false + + const wallet = this.walletForStatus(chainId, status) + const nextConfig = editConfig(wallet.config) + const signed = await this.migrator.signNextMigration(this.address, status.version, wallet, nextConfig) + if (!signed) return false + + // Make sure the tracker has a copy of the config + // before attempting to save the migration + // otherwise if this second step fails the tracker could end up + // with a migration to an unknown config + await this.tracker.saveWalletConfig({ config: nextConfig }) + const nextCoder = universal.coderFor(nextConfig.version).config + const nextImageHash = nextCoder.imageHashOf(nextConfig as any) + const reverseConfig = await this.tracker.configOfImageHash({ imageHash: nextImageHash, noCache: true }) + if (!reverseConfig || nextCoder.imageHashOf(reverseConfig as any) !== nextImageHash) { + throw Error(`Reverse lookup failed for imageHash ${nextImageHash}`) + } + + await this.tracker.saveMigration(this.address, signed, this.contexts) + + return true + } + + async signAllMigrations( + editConfig: (prevConfig: commons.config.Config) => commons.config.Config + ): Promise<{ signedMigrations: Array; failedChains: number[] }> { + const failedChains: number[] = [] + const signedMigrations = await Promise.all( + this.networks.map(async n => { + try { + // Signing migrations for each chain + return await this.signMigrations(n.chainId, editConfig) + } catch (error) { + console.warn(`Failed to sign migrations for chain ${n.chainId}`, error) + + // Adding failed chainId to the failedChains array + failedChains.push(n.chainId) + // Using null as a placeholder for failed chains + return null + } + }) + ) + + // Filter out null values to get only the successful signed migrations + const successfulSignedMigrations = signedMigrations.filter(migration => migration !== null) + + return { signedMigrations: successfulSignedMigrations, failedChains } + } + + async isMigratedAllChains(): Promise<{ migratedAllChains: boolean; failedChains: number[] }> { + const failedChains: number[] = [] + const statuses = await Promise.all( + this.networks.map(async n => { + try { + return await this.status(n.chainId) + } catch (error) { + failedChains.push(n.chainId) + + console.warn(`Failed to get status for chain ${n.chainId}`, error) + + // default to true for failed chains + return { fullyMigrated: true } + } + }) + ) + + const migratedAllChains = statuses.every(s => s.fullyMigrated) + return { migratedAllChains, failedChains } + } + + async sendSignedTransactions( + signedBundle: commons.transaction.IntendedTransactionBundle | commons.transaction.IntendedTransactionBundle[], + chainId: ethers.BigNumberish, + quote?: FeeQuote, + pstatus?: AccountStatus, + callback?: (bundle: commons.transaction.IntendedTransactionBundle) => void + ): Promise { + if (!Array.isArray(signedBundle)) { + return this.sendSignedTransactions([signedBundle], chainId, quote, pstatus, callback) + } + const status = pstatus || (await this.status(chainId)) + this.mustBeFullyMigrated(status) + + const decoratedBundle = await this.decorateTransactions(signedBundle, status, chainId) + callback?.(decoratedBundle) + + return this.relayer(chainId).relay(decoratedBundle, quote) + } + + async fillGasLimits( + txs: commons.transaction.Transactionish, + chainId: ethers.BigNumberish, + status?: AccountStatus + ): Promise { + const wallet = this.walletForStatus(chainId, status || (await this.status(chainId))) + return wallet.fillGasLimits(txs) + } + + async gasRefundQuotes( + txs: commons.transaction.Transactionish, + chainId: ethers.BigNumberish, + stubSignatureOverrides: Map, + status?: AccountStatus, + options?: { + simulate?: boolean + } + ): Promise<{ + options: FeeOption[] + quote?: FeeQuote + decorated: commons.transaction.IntendedTransactionBundle + }> { + const wstatus = status || (await this.status(chainId)) + const wallet = this.walletForStatus(chainId, wstatus) + + const predecorated = await this.predecorateTransactions(txs, wstatus, chainId) + const transactions = commons.transaction.fromTransactionish(this.address, predecorated) + + // We can't sign the transactions (because we don't want to bother the user) + // so we use the latest configuration to build a "stub" signature, the relayer + // knows to ignore the wallet signatures + const stubSignature = wallet.coders.config.buildStubSignature(wallet.config, stubSignatureOverrides) + + // Now we can decorate the transactions as always, but we need to manually build the signed bundle + const intentId = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + const signedBundle: commons.transaction.SignedTransactionBundle = { + chainId, + intent: { + id: intentId, + wallet: this.address + }, + signature: stubSignature, + transactions, + entrypoint: this.address, + nonce: 0 // The relayer also ignored the nonce + } + + const decoratedBundle = await this.decorateTransactions(signedBundle, wstatus) + const data = commons.transaction.encodeBundleExecData(decoratedBundle) + const res = await this.relayer(chainId).getFeeOptionsRaw(decoratedBundle.entrypoint, data, options) + return { ...res, decorated: decoratedBundle } + } + + async prepareTransactions(args: { + txs: commons.transaction.Transactionish + chainId: ethers.BigNumberish + stubSignatureOverrides: Map + simulateForFeeOptions?: boolean + }): Promise { + const status = await this.status(args.chainId) + + const transactions = await this.fillGasLimits(args.txs, args.chainId, status) + const gasRefundQuote = await this.gasRefundQuotes(transactions, args.chainId, args.stubSignatureOverrides, status, { + simulate: args.simulateForFeeOptions + }) + const flatDecorated = commons.transaction.unwind(this.address, gasRefundQuote.decorated.transactions) + + return { + transactions, + flatDecorated, + feeOptions: gasRefundQuote.options, + feeQuote: gasRefundQuote.quote + } + } + + async sendTransaction( + txs: commons.transaction.Transactionish, + chainId: ethers.BigNumberish, + quote?: FeeQuote, + skipPreDecorate: boolean = false, + callback?: (bundle: commons.transaction.IntendedTransactionBundle) => void, + options?: { + nonceSpace?: ethers.BigNumberish + serial?: boolean + } + ): Promise { + const status = await this.status(chainId) + + const predecorated = skipPreDecorate ? txs : await this.predecorateTransactions(txs, status, chainId) + const hasTxs = commons.transaction.fromTransactionish(this.address, predecorated).length > 0 + const signed = hasTxs ? await this.signTransactions(predecorated, chainId, undefined, options) : undefined + + const childBundles = await this.orchestrator.predecorateSignedTransactions({ chainId }) + + const bundles: commons.transaction.SignedTransactionBundle[] = [] + if (signed !== undefined && signed.transactions.length > 0) { + bundles.push(signed) + } + bundles.push(...childBundles.filter(b => b.transactions.length > 0)) + + return this.sendSignedTransactions(bundles, chainId, quote, undefined, callback) + } + + async signTypedData( + domain: TypedDataDomain, + types: Record>, + message: Record, + chainId: ethers.BigNumberish, + cantValidateBehavior: 'ignore' | 'eip6492' | 'throw' = 'ignore' + ): Promise { + const digest = encodeTypedDataDigest({ domain, types, message }) + return this.signDigest(digest, chainId, true, cantValidateBehavior) + } + + async getSigners(): Promise> { + const last = (ts: T[]): T | undefined => (ts.length ? ts[ts.length - 1] : undefined) + + return ( + await Promise.all( + this.networks.map(async ({ chainId, name }) => { + try { + const status = await this.status(chainId) + + let latestImageHash = last(status.presignedConfigurations)?.nextImageHash + if (!latestImageHash) { + if (status.onChain.version !== status.version) { + const migration = last(status.signedMigrations) + if (migration) { + const { toVersion, toConfig } = migration + const coder = universal.genericCoderFor(toVersion) + latestImageHash = coder.config.imageHashOf(toConfig) + } + } + } + if (!latestImageHash) { + latestImageHash = status.onChain.imageHash + } + + const latestConfig = await this.tracker.configOfImageHash({ imageHash: latestImageHash }) + if (!latestConfig) { + throw new Error(`unable to find config for image hash ${latestImageHash}`) + } + + const coder = universal.genericCoderFor(latestConfig.version) + const signers = coder.config.signersOf(latestConfig) + + return signers.map(signer => ({ ...signer, network: chainId })) + } catch (error) { + console.warn(`unable to get signers on network ${chainId} ${name}`, error) + return [] + } + }) + ) + ).flat() + } + + async getAllSigners(): Promise< + { + address: string + weight: number + network: number + flaggedForRemoval: boolean + }[] + > { + const allSigners: { + address: string + weight: number + network: number + flaggedForRemoval: boolean + }[] = [] + + // We need to get the signers for each status + await Promise.all( + this.networks.map(async network => { + const chainId = network.chainId + + // Getting the status with `longestPath` set to true will give us all the possible configurations + // between the current onChain config and the latest config, including the ones "flagged for removal" + const status = await this.status(chainId, true) + + const fullChain = [ + status.onChain.imageHash, + ...(status.onChain.version !== status.version + ? status.signedMigrations.map(m => universal.coderFor(m.toVersion).config.imageHashOf(m.toConfig as any)) + : []), + ...status.presignedConfigurations.map(update => update.nextImageHash) + ] + + return Promise.all( + fullChain.map(async (nextImageHash, iconf) => { + const isLast = iconf === fullChain.length - 1 + const config = await this.tracker.configOfImageHash({ imageHash: nextImageHash }) + + if (!config) { + console.warn(`AllSigners may be incomplete, config not found for imageHash ${nextImageHash}`) + return + } + + const coder = universal.genericCoderFor(config.version) + const signers = coder.config.signersOf(config) + + signers.forEach(signer => { + const exists = allSigners.find(s => s.address === signer.address && s.network === chainId) + + if (exists && isLast && exists.flaggedForRemoval) { + exists.flaggedForRemoval = false + return + } + + if (exists) return + + allSigners.push({ + address: signer.address, + weight: signer.weight, + network: chainId, + flaggedForRemoval: !isLast + }) + }) + }) + ) + }) + ) + + return allSigners + } +} + +export function isAccount(value: any): value is Account { + return value instanceof Account +} diff --git a/packages/account/src/index.ts b/packages/account/src/index.ts new file mode 100644 index 000000000..8a695b2e2 --- /dev/null +++ b/packages/account/src/index.ts @@ -0,0 +1 @@ +export * from './account' diff --git a/packages/account/src/orchestrator/wrapper.ts b/packages/account/src/orchestrator/wrapper.ts new file mode 100644 index 000000000..ab9e16c3f --- /dev/null +++ b/packages/account/src/orchestrator/wrapper.ts @@ -0,0 +1,69 @@ +import { commons } from '@0xsequence/core' +import { signers, Status } from '@0xsequence/signhub' +import { ethers } from 'ethers' +import { Account } from '../account' + +export type MetadataWithChainId = { + chainId: ethers.BigNumberish +} + +// Implements a wrapper for using Sequence accounts as nested signers in the signhub orchestrator. +export class AccountOrchestratorWrapper implements signers.SapientSigner { + constructor(public account: Account) {} + + async getAddress(): Promise { + return this.account.address + } + + getChainIdFromMetadata(metadata: object): ethers.BigNumber { + try { + const { chainId } = metadata as MetadataWithChainId + return ethers.BigNumber.from(chainId) + } catch (err) { + // Invalid metadata object + throw new Error('AccountOrchestratorWrapper only supports metadata with chain id') + } + } + + async buildDeployTransaction(metadata: object): Promise { + const chainId = this.getChainIdFromMetadata(metadata) + const status = await this.account.status(chainId) + return this.account.buildBootstrapTransactions(status, chainId) + } + + async predecorateSignedTransactions(metadata: object): Promise { + const chainId = this.getChainIdFromMetadata(metadata) + const status = await this.account.status(chainId) + return this.account.predecorateSignedTransactions(status, chainId) + } + + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + const chainId = this.getChainIdFromMetadata(metadata) + const status = await this.account.status(chainId) + return this.account.decorateTransactions(bundle, status) + } + + sign(message: ethers.utils.BytesLike, metadata: object): Promise { + if (!commons.isWalletSignRequestMetadata(metadata)) { + throw new Error('AccountOrchestratorWrapper only supports wallet metadata requests') + } + + const { chainId, decorate } = metadata + // EIP-6492 not supported on nested signatures + // Default to throw instead of ignore. Ignoring should be explicit + const cantValidateBehavior = metadata.cantValidateBehavior ?? 'throw' + + // For Sequence nested signatures we must use `signDigest` and not `signMessage` + // otherwise the account will hash the digest and the signature will be invalid. + return this.account.signDigest(message, chainId, decorate, cantValidateBehavior, metadata) + } + + notifyStatusChange(_i: string, _s: Status, _m: object): void {} + + suffix(): ethers.utils.BytesLike { + return [3] + } +} diff --git a/packages/account/src/signer.ts b/packages/account/src/signer.ts new file mode 100644 index 000000000..770752e29 --- /dev/null +++ b/packages/account/src/signer.ts @@ -0,0 +1,223 @@ +import { ChainId } from '@0xsequence/network' +import { Account } from './account' +import { ethers } from 'ethers' +import { commons } from '@0xsequence/core' +import { FeeOption, proto } from '@0xsequence/relayer' +import { isDeferrable } from './utils' + +export type AccountSignerOptions = { + nonceSpace?: ethers.BigNumberish + cantValidateBehavior?: 'ignore' | 'eip6492' | 'throw' + stubSignatureOverrides?: Map + selectFee?: ( + txs: ethers.utils.Deferrable | commons.transaction.Transactionish, + options: FeeOption[] + ) => Promise +} + +function encodeGasRefundTransaction(option?: FeeOption) { + if (!option) return [] + + const value = ethers.BigNumber.from(option.value) + + switch (option.token.type) { + case proto.FeeTokenType.UNKNOWN: + return [ + { + delegateCall: false, + revertOnError: true, + gasLimit: option.gasLimit, + to: option.to, + value: value.toHexString(), + data: [] + } + ] + + case proto.FeeTokenType.ERC20_TOKEN: + if (!option.token.contractAddress) { + throw new Error(`No contract address for ERC-20 fee option`) + } + + return [ + { + delegateCall: false, + revertOnError: true, + gasLimit: option.gasLimit, + to: option.token.contractAddress, + value: 0, + data: new ethers.utils.Interface([ + { + constant: false, + inputs: [{ type: 'address' }, { type: 'uint256' }], + name: 'transfer', + outputs: [], + type: 'function' + } + ]).encodeFunctionData('transfer', [option.to, value.toHexString()]) + } + ] + + default: + throw new Error(`Unhandled fee token type ${option.token.type}`) + } +} + +export class AccountSigner implements ethers.Signer { + public readonly _isSigner = true + + constructor( + public account: Account, + public chainId: ChainId, + public readonly options?: AccountSignerOptions + ) {} + + get provider() { + return this.account.providerFor(this.chainId) + } + + async getAddress(): Promise { + return this.account.address + } + + signMessage(message: string | ethers.utils.Bytes): Promise { + return this.account.signMessage(message, this.chainId, this.options?.cantValidateBehavior ?? 'throw') + } + + private async defaultSelectFee( + _txs: ethers.utils.Deferrable | commons.transaction.Transactionish, + options: FeeOption[] + ): Promise { + // If no options, return undefined + if (options.length === 0) return undefined + + // If there are multiple options, try them one by one + // until we find one that satisfies the balance requirement + const balanceOfAbi = [ + { + constant: true, + inputs: [{ type: 'address' }], + name: 'balanceOf', + outputs: [{ type: 'uint256' }], + type: 'function' + } + ] + + for (const option of options) { + if (option.token.type === proto.FeeTokenType.UNKNOWN) { + // Native token + const balance = await this.getBalance() + if (balance.gte(ethers.BigNumber.from(option.value))) { + return option + } + } else if (option.token.contractAddress && option.token.type === proto.FeeTokenType.ERC20_TOKEN) { + // ERC20 token + const token = new ethers.Contract(option.token.contractAddress, balanceOfAbi, this.provider) + const balance = await token.balanceOf(this.account.address) + if (balance.gte(ethers.BigNumber.from(option.value))) { + return option + } + } else { + // Unsupported token type + } + } + + throw new Error('No fee option available - not enough balance') + } + + async sendTransaction( + txsPromise: ethers.utils.Deferrable | commons.transaction.Transactionish, + options?: { + simulateForFeeOptions?: boolean + } + ): Promise { + const txs = isDeferrable(txsPromise) + ? await ethers.utils.resolveProperties(txsPromise as ethers.utils.Deferrable) + : txsPromise + + const prepare = await this.account.prepareTransactions({ + txs, + chainId: this.chainId, + stubSignatureOverrides: this.options?.stubSignatureOverrides ?? new Map(), + simulateForFeeOptions: options?.simulateForFeeOptions + }) + + const selectMethod = this.options?.selectFee ?? this.defaultSelectFee.bind(this) + const feeOption = await selectMethod(txs, prepare.feeOptions) + + const finalTransactions = [...prepare.transactions, ...encodeGasRefundTransaction(feeOption)] + + return this.account.sendTransaction( + finalTransactions, + this.chainId, + prepare.feeQuote, + undefined, + undefined, + this.options?.nonceSpace !== undefined + ? { + nonceSpace: this.options.nonceSpace + } + : undefined + ) as Promise // Will always have a transaction response + } + + getBalance(blockTag?: ethers.providers.BlockTag | undefined): Promise { + return this.provider.getBalance(this.account.address, blockTag) + } + + call( + transaction: ethers.utils.Deferrable, + blockTag?: ethers.providers.BlockTag | undefined + ): Promise { + return this.provider.call(transaction, blockTag) + } + + async resolveName(name: string): Promise { + const res = await this.provider.resolveName(name) + if (!res) throw new Error(`Could not resolve name ${name}`) + return res + } + + connect(_provider: ethers.providers.Provider): ethers.Signer { + throw new Error('Method not implemented.') + } + + signTransaction(transaction: ethers.utils.Deferrable): Promise { + throw new Error('Method not implemented.') + } + + getTransactionCount(blockTag?: ethers.providers.BlockTag | undefined): Promise { + throw new Error('Method not implemented.') + } + + estimateGas(transaction: ethers.utils.Deferrable): Promise { + throw new Error('Method not implemented.') + } + + getChainId(): Promise { + return Promise.resolve(ethers.BigNumber.from(this.chainId).toNumber()) + } + + getGasPrice(): Promise { + throw new Error('Method not implemented.') + } + + getFeeData(): Promise { + throw new Error('Method not implemented.') + } + + checkTransaction( + transaction: ethers.utils.Deferrable + ): ethers.utils.Deferrable { + throw new Error('Method not implemented.') + } + + populateTransaction( + transaction: ethers.utils.Deferrable + ): Promise { + throw new Error('Method not implemented.') + } + + _checkProvider(operation?: string | undefined): void { + throw new Error('Method not implemented.') + } +} diff --git a/packages/account/src/utils.ts b/packages/account/src/utils.ts new file mode 100644 index 000000000..b8d715ec6 --- /dev/null +++ b/packages/account/src/utils.ts @@ -0,0 +1,14 @@ +import { ethers } from 'ethers' + +function isPromise(value: any): value is Promise { + return !!value && typeof value.then === 'function' +} + +export function isDeferrable(value: any): value is ethers.utils.Deferrable { + // The value is deferrable if any of the properties is a Promises + if (typeof value === 'object') { + return Object.keys(value).some(key => isPromise(value[key])) + } + + return false +} diff --git a/packages/account/tests/account.spec.ts b/packages/account/tests/account.spec.ts new file mode 100644 index 000000000..056e22686 --- /dev/null +++ b/packages/account/tests/account.spec.ts @@ -0,0 +1,1536 @@ +import { walletContracts } from '@0xsequence/abi' +import { commons, v1, v2 } from '@0xsequence/core' +import { migrator } from '@0xsequence/migration' +import { NetworkConfig } from '@0xsequence/network' +import { LocalRelayer, Relayer } from '@0xsequence/relayer' +import { tracker, trackers } from '@0xsequence/sessions' +import { Orchestrator } from '@0xsequence/signhub' +import * as utils from '@0xsequence/tests' +import { Wallet } from '@0xsequence/wallet' +import * as chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { ethers } from 'ethers' +import hardhat from 'hardhat' + +import { Account } from '../src/account' +import { AccountOrchestratorWrapper } from '../src/orchestrator/wrapper' + +const { expect } = chai.use(chaiAsPromised) + +const deterministic = false + +describe('Account', () => { + let provider1: ethers.providers.JsonRpcProvider + let provider2: ethers.providers.JsonRpcProvider + + let signer1: ethers.Signer + let signer2: ethers.Signer + + let contexts: commons.context.VersionedContext + let networks: NetworkConfig[] + + let tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker + + let defaultArgs: { + contexts: commons.context.VersionedContext + networks: NetworkConfig[] + tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker + } + + let defaultTx: commons.transaction.Transaction + + const createNestedAccount = async (entropy: string, bootstrapInner = true, bootstrapOuter = true) => { + const signer = randomWallet(entropy) + + const configInner = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + const accountInner = await Account.new({ + ...defaultArgs, + config: configInner, + orchestrator: new Orchestrator([signer]) + }) + if (bootstrapInner) { + await accountInner.doBootstrap(networks[0].chainId) + } + + const configOuter = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: accountInner.address, weight: 1 }] + } + const accountOuter = await Account.new({ + ...defaultArgs, + config: configOuter, + orchestrator: new Orchestrator([new AccountOrchestratorWrapper(accountInner)]) + }) + if (bootstrapOuter) { + await accountOuter.doBootstrap(networks[0].chainId) + } + + return { signer, accountInner, accountOuter } + } + + const getEth = async (address: string, signer?: ethers.Signer) => { + if (signer === undefined) { + // Do both networks + await getEth(address, signer1) + await getEth(address, signer2) + return + } + // Signer sends the address some ETH for defaultTx use + const tx = await signer.sendTransaction({ + to: address, + value: 10 // Should be plenty + }) + await tx.wait() + } + + before(async () => { + provider1 = new ethers.providers.Web3Provider(hardhat.network.provider as any) + provider2 = new ethers.providers.JsonRpcProvider('http://127.0.0.1:7048') + + // TODO: Implement migrations on local config tracker + tracker = new trackers.local.LocalConfigTracker(provider1) + + signer1 = provider1.getSigner() + signer2 = provider2.getSigner() + + networks = [ + { + chainId: 31337, + name: 'hardhat', + provider: provider1, + rpcUrl: '', + relayer: new LocalRelayer(signer1), + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + { + chainId: 31338, + name: 'hardhat2', + provider: provider2, + rpcUrl: 'http://127.0.0.1:7048', + relayer: new LocalRelayer(signer2), + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + } + ] + + const context1 = utils.context.deploySequenceContexts(signer1) + const context2 = utils.context.deploySequenceContexts(signer2) + expect(await context1).to.deep.equal(await context2) + contexts = await context1 + + defaultArgs = { + contexts, + networks, + tracker + } + + defaultTx = { + to: await signer1.getAddress(), + value: 1 + } + }) + + describe('New account', () => { + it('Should create a new account', async () => { + const signer = randomWallet('Should create a new account') + const config = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + + const account = await Account.new({ + ...defaultArgs, + config, + orchestrator: new Orchestrator([signer]) + }) + + expect(account).to.be.instanceOf(Account) + expect(account.address).to.not.be.undefined + + await getEth(account.address) + const tx = await account.sendTransaction([defaultTx], networks[0].chainId) + expect(tx).to.not.be.undefined + + const status = await account.status(networks[0].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.version).to.equal(2) + }) + + it('Should create new nested accounts', async () => { + const { accountInner, accountOuter } = await createNestedAccount('create new nested accounts', false, false) + + await getEth(accountOuter.address) + await accountOuter.sendTransaction([defaultTx], networks[0].chainId) + + const statusOuter = await accountOuter.status(networks[0].chainId) + + expect(statusOuter.fullyMigrated).to.be.true + expect(statusOuter.onChain.deployed).to.be.true + expect(statusOuter.onChain.version).to.equal(2) + + const statusInner = await accountInner.status(networks[0].chainId) + expect(statusInner.fullyMigrated).to.be.true + expect(statusInner.onChain.deployed).to.be.true + expect(statusInner.onChain.version).to.equal(2) + }) + + it('Should send tx on nested accounts', async () => { + const { accountInner, accountOuter } = await createNestedAccount('sent tx on nested accounts', true, true) + + await getEth(accountOuter.address) + await accountOuter.sendTransaction([defaultTx], networks[0].chainId) + + const statusOuter = await accountOuter.status(networks[0].chainId) + + expect(statusOuter.fullyMigrated).to.be.true + expect(statusOuter.onChain.deployed).to.be.true + expect(statusOuter.onChain.version).to.equal(2) + + const statusInner = await accountInner.status(networks[0].chainId) + expect(statusInner.fullyMigrated).to.be.true + expect(statusInner.onChain.deployed).to.be.true + expect(statusInner.onChain.version).to.equal(2) + }) + + it('Should send transactions on multiple networks', async () => { + const signer = randomWallet('Should send transactions on multiple networks') + const config = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + + const account = await Account.new({ + ...defaultArgs, + config, + orchestrator: new Orchestrator([signer]) + }) + + await getEth(account.address) + await account.sendTransaction([defaultTx], networks[0].chainId) + await account.sendTransaction([defaultTx], networks[1].chainId) + + const status1 = await account.status(networks[0].chainId) + const status2 = await account.status(networks[1].chainId) + + expect(status1.fullyMigrated).to.be.true + expect(status1.onChain.deployed).to.be.true + expect(status1.onChain.version).to.equal(2) + + expect(status2.fullyMigrated).to.be.true + expect(status2.onChain.deployed).to.be.true + expect(status2.onChain.version).to.equal(2) + }) + + it('Should create a new account with many signers', async () => { + const signers = new Array(24).fill(0).map(() => randomWallet('Should create a new account with many signers')) + const config = { + threshold: 3, + checkpoint: Math.floor(now() / 1000), + signers: signers.map(signer => ({ + address: signer.address, + weight: 1 + })) + } + + const rsigners = signers.sort(() => randomFraction('Should create a new account with many signers 2') - 0.5) + const account = await Account.new({ + ...defaultArgs, + config, + orchestrator: new Orchestrator(rsigners.slice(0, 4)) + }) + + await getEth(account.address) + await account.sendTransaction([defaultTx], networks[0].chainId) + + const status = await account.status(networks[0].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.version).to.equal(2) + }) + + it('Should sign and validate a message', async () => { + const signer = randomWallet('Should sign and validate a message') + const config = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + + const account = await Account.new({ + ...defaultArgs, + config, + orchestrator: new Orchestrator([signer]) + }) + + await account.doBootstrap(networks[0].chainId) + + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = await account.signMessage(msg, networks[0].chainId) + + const valid = await commons.EIP1271.isValidEIP1271Signature( + account.address, + ethers.utils.keccak256(msg), + sig, + networks[0].provider! + ) + + expect(valid).to.be.true + }) + + it('Should sign and validate a message with nested account', async () => { + const { accountOuter } = await createNestedAccount('sign and validate nested') + + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = await accountOuter.signMessage(msg, networks[0].chainId) + + const valid = await commons.EIP1271.isValidEIP1271Signature( + accountOuter.address, + ethers.utils.keccak256(msg), + sig, + networks[0].provider! + ) + + expect(valid).to.be.true + }) + + it('Should update account to new configuration', async () => { + const signer = randomWallet('Should update account to new configuration') + const simpleConfig1 = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + const config1 = v2.config.ConfigCoder.fromSimple(simpleConfig1) + + const account = await Account.new({ + ...defaultArgs, + config: simpleConfig1, + orchestrator: new Orchestrator([signer]) + }) + + const signer2a = randomWallet('Should update account to new configuration 2') + const signer2b = randomWallet('Should update account to new configuration 3') + + const simpleConfig2 = { + threshold: 4, + checkpoint: Math.floor(now() / 1000) + 1, + signers: [ + { + address: signer2a.address, + weight: 2 + }, + { + address: signer2b.address, + weight: 2 + } + ] + } + + const config2 = v2.config.ConfigCoder.fromSimple(simpleConfig2) + await account.updateConfig(config2) + + const status2 = await account.status(networks[0].chainId) + expect(status2.fullyMigrated).to.be.true + expect(status2.onChain.deployed).to.be.false + expect(status2.onChain.version).to.equal(2) + expect(status2.onChain.imageHash).to.deep.equal(v2.config.ConfigCoder.imageHashOf(config1)) + expect(status2.imageHash).to.deep.equal(v2.config.ConfigCoder.imageHashOf(config2)) + }) + + it('Should sign and validate a message without being deployed', async () => { + const signer = randomWallet('Should sign and validate a message without being deployed') + const config = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + + const account = await Account.new({ + ...defaultArgs, + config, + orchestrator: new Orchestrator([signer]) + }) + + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = await account.signMessage(msg, networks[0].chainId, 'eip6492') + + const valid = await account.reader(networks[0].chainId).isValidSignature(account.address, ethers.utils.keccak256(msg), sig) + + expect(valid).to.be.true + }) + + it('Should sign and validate a message without being deployed with nested account', async () => { + const { accountOuter } = await createNestedAccount('sign and validate nested undeployed', true, false) + + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = await accountOuter.signMessage(msg, networks[0].chainId, 'eip6492') + + const valid = await accountOuter + .reader(networks[0].chainId) + .isValidSignature(accountOuter.address, ethers.utils.keccak256(msg), sig) + + expect(valid).to.be.true + }) + + it('Should sign and validate a message with undeployed nested account and signer', async () => { + // Testing that an undeployed account doesn't error as other signer can satisfy threshold + const signerA = randomWallet('Nested account signer A') + const signerB = randomWallet('Nested account signer B') + + const configInner = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signerA.address, weight: 1 }] + } + const accountInner = await Account.new({ + ...defaultArgs, + config: configInner, + orchestrator: new Orchestrator([signerA]) + }) // Undeployed + + const configOuter = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [ + { address: accountInner.address, weight: 1 }, + { address: signerB.address, weight: 1 } + ] + } + const accountOuter = await Account.new({ + ...defaultArgs, + config: configOuter, + orchestrator: new Orchestrator([new AccountOrchestratorWrapper(accountInner), signerB]) + }) + await accountOuter.doBootstrap(networks[0].chainId) + + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = await accountOuter.signMessage(msg, networks[0].chainId) + + const valid = await accountOuter + .reader(networks[0].chainId) + .isValidSignature(accountOuter.address, ethers.utils.keccak256(msg), sig) + + expect(valid).to.be.true + }) + + it('Should refuse to sign when not deployed', async () => { + const signer = randomWallet('Should refuse to sign when not deployed') + const config = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + + const account = await Account.new({ + ...defaultArgs, + config, + orchestrator: new Orchestrator([signer]) + }) + + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = account.signMessage(msg, networks[0].chainId, 'throw') + + expect(sig).to.be.rejected + }) + + it('Should refuse to sign when not deployed (nested)', async () => { + const { accountOuter } = await createNestedAccount('refuse to sign undeployed', false, false) + + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = accountOuter.signMessage(msg, networks[0].chainId, 'eip6492') // Note EIP-6492 throws when nested not deployed + + expect(sig).to.be.rejected + }) + + describe('After upgrading', () => { + let account: Account + + let signer1: ethers.Wallet + let signer2a: ethers.Wallet + let signer2b: ethers.Wallet + let signerIndex = 1 + + beforeEach(async () => { + signer1 = randomWallet(`After upgrading ${signerIndex++}`) + const simpleConfig1 = { + threshold: 1, + checkpoint: Math.floor(now() / 1000) + 1, + signers: [{ address: signer1.address, weight: 1 }] + } + + account = await Account.new({ + ...defaultArgs, + config: simpleConfig1, + orchestrator: new Orchestrator([signer1]) + }) + await getEth(account.address) + + signer2a = randomWallet(`After upgrading ${signerIndex++}`) + signer2b = randomWallet(`After upgrading ${signerIndex++}`) + + const simpleConfig2 = { + threshold: 4, + checkpoint: await account.status(0).then(s => ethers.BigNumber.from(s.checkpoint).add(1)), + signers: [ + { + address: signer2a.address, + weight: 2 + }, + { + address: signer2b.address, + weight: 2 + } + ] + } + + const config2 = v2.config.ConfigCoder.fromSimple(simpleConfig2) + await account.updateConfig(config2) + account.setOrchestrator(new Orchestrator([signer2a, signer2b])) + }) + + it('Should send a transaction', async () => { + const tx = await account.sendTransaction([defaultTx], networks[0].chainId) + expect(tx).to.not.be.undefined + + const status = await account.status(networks[0].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.imageHash).to.equal(status.imageHash) + }) + + it('Should send a transaction on nested account', async () => { + const configOuter = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: account.address, weight: 1 }] + } + const accountOuter = await Account.new({ + ...defaultArgs, + config: configOuter, + orchestrator: new Orchestrator([new AccountOrchestratorWrapper(account)]) + }) + + await accountOuter.doBootstrap(networks[0].chainId) + + const tx = await accountOuter.sendTransaction([], networks[0].chainId) + expect(tx).to.not.be.undefined + + const statusOuter = await accountOuter.status(networks[0].chainId) + expect(statusOuter.fullyMigrated).to.be.true + expect(statusOuter.onChain.deployed).to.be.true + expect(statusOuter.onChain.imageHash).to.equal(statusOuter.imageHash) + + const status = await account.status(networks[0].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.imageHash).to.equal(status.imageHash) + }) + + it('Should send a transaction on undeployed nested account', async () => { + const configOuter = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: account.address, weight: 1 }] + } + const accountOuter = await Account.new({ + ...defaultArgs, + config: configOuter, + orchestrator: new Orchestrator([new AccountOrchestratorWrapper(account)]) + }) + + await getEth(accountOuter.address) + const tx = await accountOuter.sendTransaction([defaultTx], networks[0].chainId) + expect(tx).to.not.be.undefined + + const status = await account.status(networks[0].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.imageHash).to.equal(status.imageHash) + }) + + it('Should sign a message', async () => { + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = await account.signMessage(msg, networks[0].chainId) + + const canOnchainValidate = await account.status(networks[0].chainId).then(s => s.canOnchainValidate) + expect(canOnchainValidate).to.be.false + await account.doBootstrap(networks[0].chainId) + + const valid = await commons.EIP1271.isValidEIP1271Signature( + account.address, + ethers.utils.keccak256(msg), + sig, + networks[0].provider! + ) + + expect(valid).to.be.true + }) + + it('Should fail to use old signer', async () => { + account.setOrchestrator(new Orchestrator([signer1])) + const tx = account.sendTransaction([defaultTx], networks[0].chainId) + await expect(tx).to.be.rejected + }) + + it('Should send a transaction on a different network', async () => { + const tx = await account.sendTransaction([defaultTx], networks[1].chainId) + expect(tx).to.not.be.undefined + + const status = await account.status(networks[1].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.imageHash).to.equal(status.imageHash) + }) + + describe('After reloading the account', () => { + beforeEach(async () => { + account = new Account({ + ...defaultArgs, + address: account.address, + orchestrator: new Orchestrator([signer2a, signer2b]) + }) + await getEth(account.address) + }) + + it('Should send a transaction', async () => { + const tx = await account.sendTransaction([defaultTx], networks[0].chainId) + expect(tx).to.not.be.undefined + + const status = await account.status(networks[0].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.imageHash).to.equal(status.imageHash) + }) + + it('Should sign a message', async () => { + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = await account.signMessage(msg, networks[0].chainId) + + const canOnchainValidate = await account.status(networks[0].chainId).then(s => s.canOnchainValidate) + expect(canOnchainValidate).to.be.false + await account.doBootstrap(networks[0].chainId) + + const valid = await commons.EIP1271.isValidEIP1271Signature( + account.address, + ethers.utils.keccak256(msg), + sig, + networks[0].provider! + ) + + expect(valid).to.be.true + }) + }) + + describe('After updating the config again', () => { + let signer3a: ethers.Wallet + let signer3b: ethers.Wallet + let signer3c: ethers.Wallet + let signerIndex = 1 + + let config3: v2.config.WalletConfig + + beforeEach(async () => { + signer3a = randomWallet(`After updating the config again ${signerIndex++}`) + signer3b = randomWallet(`After updating the config again ${signerIndex++}`) + signer3c = randomWallet(`After updating the config again ${signerIndex++}`) + + const simpleConfig3 = { + threshold: 5, + checkpoint: await account.status(0).then(s => ethers.BigNumber.from(s.checkpoint).add(1)), + signers: [ + { + address: signer3a.address, + weight: 2 + }, + { + address: signer3b.address, + weight: 2 + }, + { + address: signer3c.address, + weight: 1 + } + ] + } + + config3 = v2.config.ConfigCoder.fromSimple(simpleConfig3) + + await account.updateConfig(config3) + account.setOrchestrator(new Orchestrator([signer3a, signer3b, signer3c])) + }) + + it('Should update account status', async () => { + const status = await account.status(networks[0].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.false + expect(status.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(config3)) + expect(status.presignedConfigurations.length).to.equal(2) + }) + + it('Should send a transaction', async () => { + const tx = await account.sendTransaction([defaultTx], networks[0].chainId) + expect(tx).to.not.be.undefined + + const status = await account.status(networks[0].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.imageHash).to.equal(status.imageHash) + }) + + it('Should sign a message', async () => { + const msg = ethers.utils.toUtf8Bytes('Hello World') + const sig = await account.signMessage(msg, networks[0].chainId) + + const canOnchainValidate = await account.status(networks[0].chainId).then(s => s.canOnchainValidate) + expect(canOnchainValidate).to.be.false + await account.doBootstrap(networks[0].chainId) + + const status = await account.status(networks[0].chainId) + expect(status.onChain.imageHash).to.not.equal(status.imageHash) + + const valid = await commons.EIP1271.isValidEIP1271Signature( + account.address, + ethers.utils.keccak256(msg), + sig, + networks[0].provider! + ) + + expect(valid).to.be.true + }) + }) + + describe('After sending a transaction', () => { + beforeEach(async () => { + await account.sendTransaction([defaultTx], networks[0].chainId) + }) + + it('Should send a transaction in a different network', async () => { + const tx = await account.sendTransaction([defaultTx], networks[1].chainId) + expect(tx).to.not.be.undefined + + const status = await account.status(networks[1].chainId) + expect(status.fullyMigrated).to.be.true + expect(status.onChain.deployed).to.be.true + expect(status.onChain.imageHash).to.equal(status.imageHash) + }) + + it('Should send a second transaction', async () => { + const tx = await account.sendTransaction([defaultTx], networks[0].chainId) + expect(tx).to.not.be.undefined + }) + + let signerIndex = 1 + it('Should update the configuration again', async () => { + const signer2a = randomWallet(`Should update the configuration again ${signerIndex++}`) + const signer2b = randomWallet(`Should update the configuration again ${signerIndex++}`) + const signer2c = randomWallet(`Should update the configuration again ${signerIndex++}`) + + const simpleConfig2 = { + threshold: 6, + checkpoint: await account.status(0).then(s => ethers.BigNumber.from(s.checkpoint).add(1)), + signers: [ + { + address: signer2a.address, + weight: 3 + }, + { + address: signer2b.address, + weight: 3 + }, + { + address: signer2c.address, + weight: 3 + } + ] + } + + const ogOnchainImageHash = await account.status(0).then(s => s.onChain.imageHash) + const imageHash1 = await account.status(0).then(s => s.imageHash) + + const config2 = v2.config.ConfigCoder.fromSimple(simpleConfig2) + await account.updateConfig(config2) + + const status1 = await account.status(networks[0].chainId) + const status2 = await account.status(networks[1].chainId) + + expect(status1.fullyMigrated).to.be.true + expect(status1.onChain.deployed).to.be.true + expect(status1.onChain.imageHash).to.equal(imageHash1) + expect(status1.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(config2)) + expect(status1.presignedConfigurations.length).to.equal(1) + + expect(status2.fullyMigrated).to.be.true + expect(status2.onChain.deployed).to.be.false + expect(status2.onChain.imageHash).to.equal(ogOnchainImageHash) + expect(status2.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(config2)) + expect(status2.presignedConfigurations.length).to.equal(2) + }) + }) + }) + }) + + describe('Migrated wallet', () => { + it('Should migrate undeployed account', async () => { + // Old account may be an address that's not even deployed + const signer1 = randomWallet('Should migrate undeployed account') + + const simpleConfig = { + threshold: 1, + checkpoint: 0, + signers: [ + { + address: signer1.address, + weight: 1 + } + ] + } + + const config = v1.config.ConfigCoder.fromSimple(simpleConfig) + const configv2 = v2.config.ConfigCoder.fromSimple(simpleConfig) + + const imageHash = v1.config.ConfigCoder.imageHashOf(config) + const address = commons.context.addressOf(contexts[1], imageHash) + + // Sessions server MUST have information about the old wallet + // in production this is retrieved from SequenceUtils contract + await tracker.saveCounterfactualWallet({ config, context: [contexts[1]] }) + + // Importing the account should work! + const account = new Account({ ...defaultArgs, address, orchestrator: new Orchestrator([signer1]) }) + + const status = await account.status(0) + expect(status.fullyMigrated).to.be.false + expect(status.onChain.deployed).to.be.false + expect(status.onChain.imageHash).to.equal(imageHash) + expect(status.imageHash).to.equal(imageHash) + expect(status.version).to.equal(1) + + // Sending a transaction should fail (not fully migrated) + await getEth(account.address) + await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected + + // Should sign migration using the account + await account.signAllMigrations(c => c) + + const status2 = await account.status(networks[0].chainId) + expect(status2.fullyMigrated).to.be.true + expect(status2.onChain.deployed).to.be.false + expect(status2.onChain.imageHash).to.equal(imageHash) + expect(status2.onChain.version).to.equal(1) + expect(status2.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status2.version).to.equal(2) + + // Send a transaction + const tx = await account.sendTransaction([defaultTx], networks[0].chainId) + expect(tx).to.not.be.undefined + + const status3 = await account.status(networks[0].chainId) + expect(status3.fullyMigrated).to.be.true + expect(status3.onChain.deployed).to.be.true + expect(status3.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status3.onChain.version).to.equal(2) + expect(status3.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status3.version).to.equal(2) + + // Send another transaction on another chain + const tx2 = await account.sendTransaction([defaultTx], networks[1].chainId) + expect(tx2).to.not.be.undefined + + const status4 = await account.status(networks[1].chainId) + expect(status4.fullyMigrated).to.be.true + expect(status4.onChain.deployed).to.be.true + expect(status4.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status4.onChain.version).to.equal(2) + expect(status4.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status4.version).to.equal(2) + }) + + it('Should migrate a half-deployed account', async () => { + // Old account created with 3 signers, and already deployed + // in one of the chains + const signer1 = randomWallet('Should migrate a half-deployed account') + const signer2 = randomWallet('Should migrate a half-deployed account 2') + const signer3 = randomWallet('Should migrate a half-deployed account 3') + + const simpleConfig = { + threshold: 2, + checkpoint: 0, + signers: [ + { + address: signer1.address, + weight: 1 + }, + { + address: signer2.address, + weight: 1 + }, + { + address: signer3.address, + weight: 1 + } + ] + } + + const config = v1.config.ConfigCoder.fromSimple(simpleConfig) + const imageHash = v1.config.ConfigCoder.imageHashOf(config) + const address = commons.context.addressOf(contexts[1], imageHash) + + // Deploy the wallet on network 0 + const deployTx = Wallet.buildDeployTransaction(contexts[1], imageHash) + await (networks[0].relayer! as Relayer).relay({ + ...deployTx, + chainId: networks[0].chainId, + intent: { + id: '0x00', + wallet: address + } + }) + + // Feed all information to sequence-sessions + // (on prod this would be imported from SequenceUtils) + await tracker.saveCounterfactualWallet({ config, context: Object.values(contexts) }) + + // Importing the account should work! + const account = new Account({ + ...defaultArgs, + address, + orchestrator: new Orchestrator([signer1, signer3]) + }) + + // Status on network 0 should be deployed, network 1 not + // both should not be migrated, and use the original imageHash + const status1 = await account.status(networks[0].chainId) + expect(status1.fullyMigrated).to.be.false + expect(status1.onChain.deployed).to.be.true + expect(status1.onChain.imageHash).to.equal(imageHash) + expect(status1.onChain.version).to.equal(1) + expect(status1.imageHash).to.equal(imageHash) + expect(status1.version).to.equal(1) + + const status2 = await account.status(networks[1].chainId) + expect(status2.fullyMigrated).to.be.false + expect(status2.onChain.deployed).to.be.false + expect(status2.onChain.imageHash).to.equal(imageHash) + expect(status2.onChain.version).to.equal(1) + expect(status2.imageHash).to.equal(imageHash) + expect(status2.version).to.equal(1) + + // Signing transactions (on both networks) and signing messages should fail + await getEth(account.address) + await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected + await expect(account.sendTransaction([defaultTx], networks[1].chainId)).to.be.rejected + await expect(account.signMessage('0x00', networks[0].chainId)).to.be.rejected + await expect(account.signMessage('0x00', networks[1].chainId)).to.be.rejected + + await account.signAllMigrations(c => c) + + // Sign a transaction on network 0 and network 1, both should work + // and should take the wallet on-chain up to speed + const configv2 = v2.config.ConfigCoder.fromSimple(simpleConfig) + + const tx1 = await account.sendTransaction([defaultTx], networks[0].chainId) + expect(tx1).to.not.be.undefined + + const status1b = await account.status(networks[0].chainId) + expect(status1b.fullyMigrated).to.be.true + expect(status1b.onChain.deployed).to.be.true + expect(status1b.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status1b.onChain.version).to.equal(2) + expect(status1b.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status1b.version).to.equal(2) + + const tx2 = await account.sendTransaction([defaultTx], networks[1].chainId) + expect(tx2).to.not.be.undefined + + const status2b = await account.status(networks[1].chainId) + expect(status2b).to.be.deep.equal(status1b) + }) + + it('Should migrate an upgraded wallet', async () => { + const signer1 = randomWallet('Should migrate an upgraded wallet') + const signer2 = randomWallet('Should migrate an upgraded wallet 2') + const signer3 = randomWallet('Should migrate an upgraded wallet 3') + const signer4 = randomWallet('Should migrate an upgraded wallet 4') + + const simpleConfig1a = { + threshold: 3, + checkpoint: 0, + signers: [ + { + address: signer1.address, + weight: 2 + }, + { + address: signer2.address, + weight: 2 + }, + { + address: signer3.address, + weight: 2 + } + ] + } + + const config1a = v1.config.ConfigCoder.fromSimple(simpleConfig1a) + const imageHash1a = v1.config.ConfigCoder.imageHashOf(config1a) + const address = commons.context.addressOf(contexts[1], imageHash1a) + + const simpleConfig1b = { + threshold: 3, + checkpoint: 0, + signers: [ + { + address: signer1.address, + weight: 2 + }, + { + address: signer2.address, + weight: 2 + }, + { + address: signer4.address, + weight: 2 + } + ] + } + + const config1b = v1.config.ConfigCoder.fromSimple(simpleConfig1b) + const imageHash1b = v1.config.ConfigCoder.imageHashOf(config1b) + + // Update wallet to config 1b (on network 0) + const wallet = new Wallet({ + coders: { + signature: v1.signature.SignatureCoder, + config: v1.config.ConfigCoder + }, + context: contexts[1], + config: config1a, + chainId: networks[0].chainId, + address, + orchestrator: new Orchestrator([signer1, signer3]), + relayer: (networks[0].relayer as Relayer)!, + provider: networks[0].provider! + }) + + const utx = await wallet.buildUpdateConfigurationTransaction(config1b) + const signed = await wallet.signTransactionBundle(utx) + const decorated = await wallet.decorateTransactions(signed) + await (networks[0].relayer as Relayer).relay(decorated) + + // Importing the account should work! + const account = new Account({ + ...defaultArgs, + address, + orchestrator: new Orchestrator([signer1, signer3]) + }) + + // Feed the tracker with all the data + await tracker.saveCounterfactualWallet({ config: config1a, context: [contexts[1]] }) + await tracker.saveWalletConfig({ config: config1b }) + + // Status on network 0 should be deployed, network 1 not + // and the configuration on network 0 should be the B one + const status1 = await account.status(networks[0].chainId) + expect(status1.fullyMigrated).to.be.false + expect(status1.onChain.deployed).to.be.true + expect(status1.onChain.imageHash).to.equal(imageHash1b) + expect(status1.onChain.version).to.equal(1) + expect(status1.imageHash).to.equal(imageHash1b) + + const status2 = await account.status(networks[1].chainId) + expect(status2.fullyMigrated).to.be.false + expect(status2.onChain.deployed).to.be.false + expect(status2.onChain.imageHash).to.equal(imageHash1a) + expect(status2.onChain.version).to.equal(1) + expect(status2.imageHash).to.equal(imageHash1a) + + // Signing transactions (on both networks) and signing messages should fail + await getEth(account.address) + await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected + await expect(account.sendTransaction([defaultTx], networks[1].chainId)).to.be.rejected + await expect(account.signMessage('0x00', networks[0].chainId)).to.be.rejected + await expect(account.signMessage('0x00', networks[1].chainId)).to.be.rejected + + // Sign all migrations should only have signers1 and 2 + // so the migration should only be available on network 1 (the one not updated) + await account.signAllMigrations(c => c) + + const config2a = v2.config.ConfigCoder.fromSimple(simpleConfig1a) + const config2b = v2.config.ConfigCoder.fromSimple(simpleConfig1b) + const imageHash2a = v2.config.ConfigCoder.imageHashOf(config2a) + + const status1b = await account.status(networks[0].chainId) + expect(status1b.fullyMigrated).to.be.false + expect(status1b.onChain.deployed).to.be.true + expect(status1b.onChain.imageHash).to.equal(imageHash1b) + expect(status1b.onChain.version).to.equal(1) + expect(status1b.imageHash).to.equal(imageHash1b) + expect(status1b.version).to.equal(1) + + const status2b = await account.status(networks[1].chainId) + expect(status2b.fullyMigrated).to.be.true + expect(status2b.onChain.deployed).to.be.false + expect(status2b.onChain.imageHash).to.equal(imageHash1a) + expect(status2b.onChain.version).to.equal(1) + expect(status2b.imageHash).to.equal(imageHash2a) + expect(status2b.version).to.equal(2) + + // Sending a transaction should work for network 1 + // but fail for network 0, same with signing messages + await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected + await expect(account.sendTransaction([defaultTx], networks[1].chainId)).to.be.fulfilled + + await expect(account.signMessage('0x00', networks[0].chainId)).to.be.rejected + await expect(account.signMessage('0x00', networks[1].chainId)).to.be.fulfilled + + // Signing another migration with signers1 and 2 should put both in sync + account.setOrchestrator(new Orchestrator([signer1, signer2])) + await account.signAllMigrations(c => c) + + await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.fulfilled + await expect(account.sendTransaction([defaultTx], networks[1].chainId)).to.be.fulfilled + + await expect(account.signMessage('0x00', networks[0].chainId)).to.be.fulfilled + await expect(account.signMessage('0x00', networks[1].chainId)).to.be.fulfilled + + const status1c = await account.status(networks[0].chainId) + const status2c = await account.status(networks[1].chainId) + + expect(status1c.fullyMigrated).to.be.true + expect(status2c.fullyMigrated).to.be.true + + // Configs are still different! + expect(status1c.imageHash).to.not.equal(status2c.imageHash) + + const simpleConfig4 = { + threshold: 2, + checkpoint: 1, + signers: [ + { + address: signer1.address, + weight: 1 + }, + { + address: signer2.address, + weight: 1 + }, + { + address: signer4.address, + weight: 1 + } + ] + } + + const config4 = v2.config.ConfigCoder.fromSimple(simpleConfig4) + + await account.updateConfig(config4) + + const status1d = await account.status(networks[0].chainId) + const status2d = await account.status(networks[1].chainId) + + // Configs are now the same! + expect(status1d.imageHash).to.be.equal(status2d.imageHash) + }) + + it('Should edit the configuration during the migration', async () => { + // Old account may be an address that's not even deployed + const signer1 = randomWallet('Should edit the configuration during the migration') + const signer2 = randomWallet('Should edit the configuration during the migration 2') + + const simpleConfig1 = { + threshold: 1, + checkpoint: 0, + signers: [ + { + address: signer1.address, + weight: 1 + } + ] + } + + const simpleConfig2 = { + threshold: 1, + checkpoint: 0, + signers: [ + { + address: signer2.address, + weight: 1 + } + ] + } + + const config = v1.config.ConfigCoder.fromSimple(simpleConfig1) + const configv2 = v2.config.ConfigCoder.fromSimple(simpleConfig2) + + const imageHash = v1.config.ConfigCoder.imageHashOf(config) + const address = commons.context.addressOf(contexts[1], imageHash) + + // Sessions server MUST have information about the old wallet + // in production this is retrieved from SequenceUtils contract + await tracker.saveCounterfactualWallet({ config, context: [contexts[1]] }) + + // Importing the account should work! + const orchestrator = new Orchestrator([signer1]) + const account = new Account({ ...defaultArgs, address, orchestrator: orchestrator }) + + const status = await account.status(0) + expect(status.fullyMigrated).to.be.false + expect(status.onChain.deployed).to.be.false + expect(status.onChain.imageHash).to.equal(imageHash) + expect(status.imageHash).to.equal(imageHash) + expect(status.version).to.equal(1) + + // Sending a transaction should fail (not fully migrated) + await getEth(account.address) + await expect(account.sendTransaction([defaultTx], networks[0].chainId)).to.be.rejected + + // Should sign migration using the account + await account.signAllMigrations(c => { + expect(v1.config.ConfigCoder.imageHashOf(c as any)).to.equal(v1.config.ConfigCoder.imageHashOf(config)) + return configv2 + }) + + const status2 = await account.status(networks[0].chainId) + expect(status2.fullyMigrated).to.be.true + expect(status2.onChain.deployed).to.be.false + expect(status2.onChain.imageHash).to.equal(imageHash) + expect(status2.onChain.version).to.equal(1) + expect(status2.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status2.version).to.equal(2) + + // Send a transaction + orchestrator.setSigners([signer2]) + const tx = await account.sendTransaction([defaultTx], networks[0].chainId) + expect(tx).to.not.be.undefined + + const status3 = await account.status(networks[0].chainId) + expect(status3.fullyMigrated).to.be.true + expect(status3.onChain.deployed).to.be.true + expect(status3.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status3.onChain.version).to.equal(2) + expect(status3.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status3.version).to.equal(2) + + // Send another transaction on another chain + const tx2 = await account.sendTransaction([defaultTx], networks[1].chainId) + expect(tx2).to.not.be.undefined + + const status4 = await account.status(networks[1].chainId) + expect(status4.fullyMigrated).to.be.true + expect(status4.onChain.deployed).to.be.true + expect(status4.onChain.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status4.onChain.version).to.equal(2) + expect(status4.imageHash).to.equal(v2.config.ConfigCoder.imageHashOf(configv2)) + expect(status4.version).to.equal(2) + }) + + context('Signing messages', async () => { + context('After migrating', async () => { + let account: Account + let imageHash: string + + beforeEach(async () => { + // Old account may be an address that's not even deployed + const signer1 = randomWallet( + 'Signing messages - After migrating' + account?.address ?? '' // Append prev address to entropy to avoid collisions + ) + + const simpleConfig = { + threshold: 1, + checkpoint: 0, + signers: [ + { + address: signer1.address, + weight: 1 + } + ] + } + + const config = v1.config.ConfigCoder.fromSimple(simpleConfig) + imageHash = v1.config.ConfigCoder.imageHashOf(config) + const address = commons.context.addressOf(contexts[1], imageHash) + + // Sessions server MUST have information about the old wallet + // in production this is retrieved from SequenceUtils contract + await tracker.saveCounterfactualWallet({ config, context: [contexts[1]] }) + + account = new Account({ ...defaultArgs, address, orchestrator: new Orchestrator([signer1]) }) + + // Should sign migration using the account + await account.signAllMigrations(c => c) + }) + + it('Should validate a message signed by undeployed migrated wallet', async () => { + const msg = ethers.utils.toUtf8Bytes('I like that you are reading our tests') + const sig = await account.signMessage(msg, networks[0].chainId, 'eip6492') + + const valid = await account + .reader(networks[0].chainId) + .isValidSignature(account.address, ethers.utils.keccak256(msg), sig) + + expect(valid).to.be.true + }) + + it('Should reject a message signed by undeployed migrated wallet (if set the throw)', async () => { + const msg = ethers.utils.toUtf8Bytes('I do not know what to write here anymore') + const sig = account.signMessage(msg, networks[0].chainId, 'throw') + + await expect(sig).to.be.rejected + }) + + it('Should return an invalid signature by undeployed migrated wallet (if set to ignore)', async () => { + const msg = ethers.utils.toUtf8Bytes('Sending a hug') + const sig = await account.signMessage(msg, networks[0].chainId, 'ignore') + + const valid = await account + .reader(networks[0].chainId) + .isValidSignature(account.address, ethers.utils.keccak256(msg), sig) + + expect(valid).to.be.false + }) + + it('Should validate a message signed by deployed migrated wallet (deployed with v1)', async () => { + const deployTx = Wallet.buildDeployTransaction(contexts[1], imageHash) + await signer1.sendTransaction({ + to: deployTx.entrypoint, + data: commons.transaction.encodeBundleExecData(deployTx) + }) + + expect(await networks[0].provider!.getCode(account.address).then(c => ethers.utils.arrayify(c).length)).to.not.equal(0) + + const msg = ethers.utils.toUtf8Bytes('Everything seems to be working fine so far') + const sig = await account.signMessage(msg, networks[0].chainId, 'eip6492') + + const valid = await account + .reader(networks[0].chainId) + .isValidSignature(account.address, ethers.utils.keccak256(msg), sig) + + expect(valid).to.be.true + }) + + it('Should fail to sign a message signed by deployed migrated wallet (deployed with v1) if throw', async () => { + const deployTx = Wallet.buildDeployTransaction(contexts[1], imageHash) + await signer1.sendTransaction({ + to: deployTx.entrypoint, + data: commons.transaction.encodeBundleExecData(deployTx) + }) + + expect(await networks[0].provider!.getCode(account.address).then(c => ethers.utils.arrayify(c).length)).to.not.equal(0) + + const msg = ethers.utils.toUtf8Bytes('Everything seems to be working fine so far') + const sig = account.signMessage(msg, networks[0].chainId, 'throw') + expect(sig).to.be.rejected + }) + + it('Should return an invalid signature by deployed migrated wallet (deployed with v1) if ignore', async () => { + const deployTx = Wallet.buildDeployTransaction(contexts[1], imageHash) + await signer1.sendTransaction({ + to: deployTx.entrypoint, + data: commons.transaction.encodeBundleExecData(deployTx) + }) + + expect(await networks[0].provider!.getCode(account.address).then(c => ethers.utils.arrayify(c).length)).to.not.equal(0) + + const msg = ethers.utils.toUtf8Bytes('Everything seems to be working fine so far') + const sig = await account.signMessage(msg, networks[0].chainId, 'ignore') + const valid = await account + .reader(networks[0].chainId) + .isValidSignature(account.address, ethers.utils.keccak256(msg), sig) + + expect(valid).to.be.false + }) + }) + }) + }) + + describe('Nonce selection', async () => { + let signer: ethers.Wallet + let account: Account + + let getNonce: (response: ethers.providers.TransactionResponse) => { space: ethers.BigNumber; nonce: ethers.BigNumber } + + before(async () => { + const mainModule = new ethers.utils.Interface(walletContracts.mainModule.abi) + + getNonce = ({ data }) => { + const [_, encoded] = mainModule.decodeFunctionData('execute', data) + const [space, nonce] = commons.transaction.decodeNonce(encoded) + return { space, nonce } + } + + signer = randomWallet('Nonce selection') + + const config = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + + account = await Account.new({ + ...defaultArgs, + config, + orchestrator: new Orchestrator([signer]) + }) + + // use a deployed account, otherwise we end up testing the decorated bundle nonce + const response = await account.sendTransaction([], networks[0].chainId) + await response?.wait() + + await getEth(account.address, signer1) + await getEth(account.address, signer2) + }) + + it('Should use explicitly set nonces', async () => { + let response = await account.sendTransaction( + { to: await signer1.getAddress(), value: 1 }, + networks[0].chainId, + undefined, + undefined, + undefined, + { nonceSpace: 6492 } + ) + if (!response) { + throw new Error('expected response') + } + + let { space, nonce } = getNonce(response) + + expect(space.eq(6492)).to.be.true + expect(nonce.eq(0)).to.be.true + + await response.wait() + + response = await account.sendTransaction( + { to: await signer1.getAddress(), value: 1 }, + networks[0].chainId, + undefined, + undefined, + undefined, + { nonceSpace: 6492 } + ) + if (!response) { + throw new Error('expected response') + } + + const encoded = getNonce(response) + space = encoded.space + nonce = encoded.nonce + + expect(space.eq(6492)).to.be.true + expect(nonce.eq(1)).to.be.true + }) + + it('Should select random nonces by default', async () => { + let response = await account.sendTransaction({ to: await signer1.getAddress(), value: 1 }, networks[0].chainId) + if (!response) { + throw new Error('expected response') + } + + const { space: firstSpace, nonce: firstNonce } = getNonce(response) + + expect(firstSpace.eq(0)).to.be.false + expect(firstNonce.eq(0)).to.be.true + + // not necessary, parallel execution is ok: + // await response.wait() + + response = await account.sendTransaction({ to: await signer1.getAddress(), value: 1 }, networks[0].chainId) + if (!response) { + throw new Error('expected response') + } + + const { space: secondSpace, nonce: secondNonce } = getNonce(response) + + expect(secondSpace.eq(0)).to.be.false + expect(secondNonce.eq(0)).to.be.true + + expect(secondSpace.eq(firstSpace)).to.be.false + }) + + it('Should respect the serial option', async () => { + let response = await account.sendTransaction( + { to: await signer1.getAddress(), value: 1 }, + networks[0].chainId, + undefined, + undefined, + undefined, + { serial: true } + ) + if (!response) { + throw new Error('expected response') + } + + let { space, nonce } = getNonce(response) + + expect(space.eq(0)).to.be.true + expect(nonce.eq(0)).to.be.true + + await response.wait() + + response = await account.sendTransaction( + { to: await signer1.getAddress(), value: 1 }, + networks[0].chainId, + undefined, + undefined, + undefined, + { serial: true } + ) + if (!response) { + throw new Error('expected response') + } + + const encoded = getNonce(response) + space = encoded.space + nonce = encoded.nonce + + expect(space.eq(0)).to.be.true + expect(nonce.eq(1)).to.be.true + }) + }) +}) + +let nowCalls = 0 +export function now(): number { + if (deterministic) { + return Date.parse('2023-02-14T00:00:00.000Z') + 1000 * nowCalls++ + } else { + return Date.now() + } +} + +export function randomWallet(entropy: number | string): ethers.Wallet { + return new ethers.Wallet(randomBytes(32, entropy)) +} + +export function randomFraction(entropy: number | string): number { + const bytes = randomBytes(7, entropy) + bytes[0] &= 0x1f + return bytes.reduce((sum, byte) => 256 * sum + byte) / Number.MAX_SAFE_INTEGER +} + +export function randomBytes(length: number, entropy: number | string): Uint8Array { + if (deterministic) { + let bytes = '' + while (bytes.length < 2 * length) { + bytes += ethers.utils.id(`${bytes}${entropy}`).slice(2) + } + return ethers.utils.arrayify(`0x${bytes.slice(0, 2 * length)}`) + } else { + return ethers.utils.randomBytes(length) + } +} diff --git a/packages/account/tests/signer.spec.ts b/packages/account/tests/signer.spec.ts new file mode 100644 index 000000000..cdc8aede4 --- /dev/null +++ b/packages/account/tests/signer.spec.ts @@ -0,0 +1,896 @@ +import { commons, v1, v2 } from '@0xsequence/core' +import { migrator } from '@0xsequence/migration' +import { NetworkConfig } from '@0xsequence/network' +import { FeeOption, FeeQuote, LocalRelayer, LocalRelayerOptions, Relayer, proto } from '@0xsequence/relayer' +import { tracker, trackers } from '@0xsequence/sessions' +import { Orchestrator } from '@0xsequence/signhub' +import * as utils from '@0xsequence/tests' +import { Wallet } from '@0xsequence/wallet' +import * as chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { ethers } from 'ethers' +import hardhat from 'hardhat' + +import { Account } from '../src/account' +import { now, randomWallet } from './account.spec' +import { createERC20 } from '@0xsequence/tests/src/tokens/erc20' + +const { expect } = chai.use(chaiAsPromised) + +describe('Account signer', () => { + let provider1: ethers.providers.JsonRpcProvider + let provider2: ethers.providers.JsonRpcProvider + + let signer1: ethers.Signer + let signer2: ethers.Signer + + let contexts: commons.context.VersionedContext + let networks: NetworkConfig[] + + let tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker + + let defaultArgs: { + contexts: commons.context.VersionedContext + networks: NetworkConfig[] + tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker + } + + before(async () => { + provider1 = new ethers.providers.Web3Provider(hardhat.network.provider as any) + provider2 = new ethers.providers.JsonRpcProvider('http://127.0.0.1:7048') + + // TODO: Implement migrations on local config tracker + tracker = new trackers.local.LocalConfigTracker(provider1) as any + + networks = [ + { + chainId: 31337, + name: 'hardhat', + provider: provider1, + rpcUrl: '', + relayer: new LocalRelayer(provider1.getSigner()), + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + { + chainId: 31338, + name: 'hardhat2', + provider: provider2, + rpcUrl: 'http://127.0.0.1:7048', + relayer: new LocalRelayer(provider2.getSigner()), + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + } + ] + + signer1 = provider1.getSigner() + signer2 = provider2.getSigner() + + contexts = await utils.context.deploySequenceContexts(signer1) + const context2 = await utils.context.deploySequenceContexts(signer2) + + expect(contexts).to.deep.equal(context2) + + defaultArgs = { + contexts, + networks, + tracker + } + }) + + describe('with new account', () => { + var account: Account + var config: any + var accountSigner: ethers.Wallet + + beforeEach(async () => { + accountSigner = randomWallet('Should create a new account') + config = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: accountSigner.address, weight: 1 }] + } + + account = await Account.new({ + ...defaultArgs, + config, + orchestrator: new Orchestrator([accountSigner]) + }) + }) + ;[31337, 31338].map((chainId: number) => { + context(`for chain ${chainId}`, () => { + it('should send transaction', async () => { + const signer = account.getSigner(chainId) + + const res = await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + }) + + it('should send batch transaction', async () => { + const signer = account.getSigner(chainId) + + const res = await signer.sendTransaction([ + { + to: ethers.Wallet.createRandom().address + }, + { + to: ethers.Wallet.createRandom().address + } + ]) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + }) + + it('should send two transactions (one has deploy)', async () => { + const signer = account.getSigner(chainId) + + expect(await signer.provider.getCode(account.address)).to.equal('0x') + + await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(await signer.provider.getCode(account.address)).to.not.equal('0x') + + const res = await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + }) + + it('should fail to sign message because not deployed', async () => { + const signer = account.getSigner(chainId) + + await expect(signer.signMessage(ethers.utils.randomBytes(32))).to.be.rejectedWith('Wallet cannot validate onchain') + }) + + it('should sign message after deployment', async () => { + const signer = account.getSigner(chainId) + + await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(await signer.provider.getCode(account.address)).to.not.equal('0x') + + const signature = await signer.signMessage(ethers.utils.randomBytes(32)) + expect(signature).to.exist + expect(signature).to.not.equal('0x') + }) + + it('should sign a message (undeployed) when using EIP6492', async () => { + const signer = account.getSigner(chainId, { cantValidateBehavior: 'eip6492' }) + + const signature = await signer.signMessage(ethers.utils.randomBytes(32)) + expect(signature).to.exist + expect(signature).to.not.equal('0x') + }) + + it('should return account address', async () => { + expect(account.address).to.equal(await account.getSigner(chainId).getAddress()) + }) + + it('should return chainId', async () => { + expect(chainId).to.equal(await account.getSigner(chainId).getChainId()) + }) + + it('should call select fee even if there is no fee', async () => { + let callsToSelectFee = 0 + + const tx = { + to: ethers.Wallet.createRandom().address + } + + const signer = account.getSigner(chainId, { + selectFee: async (txs: any, options: FeeOption[]) => { + callsToSelectFee++ + expect(txs).to.deep.equal(tx) + expect(options).to.deep.equal([]) + return undefined + } + }) + + const res = await signer.sendTransaction(tx) + + expect(callsToSelectFee).to.equal(1) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + }) + + describe('select fee', () => { + var account: never + var getAccount: (feeOptions: FeeOption[], feeQuote: FeeQuote) => Promise + + beforeEach(async () => { + class LocalRelayerWithFee extends LocalRelayer { + constructor( + options: LocalRelayerOptions | ethers.Signer, + public feeOptions: FeeOption[], + public quote: FeeQuote + ) { + super(options) + } + + async getFeeOptions( + _address: string, + ..._transactions: commons.transaction.Transaction[] + ): Promise<{ options: FeeOption[] }> { + return { options: this.feeOptions, quote: this.quote } as any + } + + async getFeeOptionsRaw( + _entrypoint: string, + _data: ethers.utils.BytesLike, + _options?: { simulate?: boolean } + ): Promise<{ options: FeeOption[] }> { + return { options: this.feeOptions, quote: this.quote } as any + } + + async gasRefundOptions( + _address: string, + ..._transactions: commons.transaction.Transaction[] + ): Promise { + return this.feeOptions + } + + async relay( + signedTxs: commons.transaction.IntendedTransactionBundle, + quote?: FeeQuote | undefined, + waitForReceipt?: boolean | undefined + ): Promise> { + expect(quote).to.equal(this.quote) + return super.relay(signedTxs, quote, waitForReceipt) + } + } + + getAccount = async (feeOptions: FeeOption[], feeQuote: FeeQuote) => { + return Account.new({ + ...defaultArgs, + networks: defaultArgs.networks.map(n => { + return { + ...n, + relayer: new LocalRelayerWithFee(chainId === 31337 ? signer1 : signer2, feeOptions, feeQuote) + } + }), + config, + orchestrator: new Orchestrator([accountSigner]) + }) + } + }) + + it('should automatically select native fee', async () => { + const feeOptions: FeeOption[] = [ + { + token: { + chainId, + name: 'native', + symbol: 'ETH', + type: proto.FeeTokenType.UNKNOWN, + logoURL: '' + }, + to: ethers.Wallet.createRandom().address, + value: '12', + gasLimit: 100000 + } + ] + + const feeQuote: FeeQuote = { + _tag: 'FeeQuote', + _quote: ethers.utils.randomBytes(99) + } + + const account = await getAccount(feeOptions, feeQuote) + const signer = account.getSigner(chainId) + + await (chainId === 31337 ? signer1 : signer2).sendTransaction({ + to: account.address, + value: 12 + }) + + const res = await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + }) + + it('should reject if balance is not enough', async () => { + const feeOptions: FeeOption[] = [ + { + token: { + chainId, + name: 'native', + symbol: 'ETH', + type: proto.FeeTokenType.UNKNOWN, + logoURL: '' + }, + to: ethers.Wallet.createRandom().address, + value: ethers.utils.parseEther('12').toString(), + gasLimit: 100000 + } + ] + + const feeQuote: FeeQuote = { + _tag: 'FeeQuote', + _quote: ethers.utils.randomBytes(99) + } + + const account = await getAccount(feeOptions, feeQuote) + const signer = account.getSigner(chainId) + + await (chainId === 31337 ? signer1 : signer2).sendTransaction({ + to: account.address, + value: 11 + }) + + const res = signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.be.rejectedWith('No fee option available - not enough balance') + }) + + it('should automatically select ERC20 fee', async () => { + const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18) + + const recipient = ethers.Wallet.createRandom().address + const feeOptions: FeeOption[] = [ + { + token: { + chainId, + name: 'TEST', + symbol: 'TEST', + type: proto.FeeTokenType.ERC20_TOKEN, + logoURL: '', + contractAddress: token.address + }, + to: recipient, + value: ethers.utils.parseEther('250').toString(), + gasLimit: 400000 + } + ] + + const feeQuote: FeeQuote = { + _tag: 'FeeQuote', + _quote: ethers.utils.randomBytes(99) + } + + const account = await getAccount(feeOptions, feeQuote) + const signer = account.getSigner(chainId) + + await token.mint(account.address, ethers.utils.parseEther('6000')) + + const res = await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + expect(await token.balanceOf(recipient)).to.deep.equal(ethers.utils.parseEther('250')) + }) + + it('should reject ERC20 fee if not enough balance', async () => { + const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18) + + const recipient = ethers.Wallet.createRandom().address + const feeOptions: FeeOption[] = [ + { + token: { + chainId, + name: 'TEST', + symbol: 'TEST', + type: proto.FeeTokenType.ERC20_TOKEN, + logoURL: '', + contractAddress: token.address + }, + to: recipient, + value: ethers.utils.parseEther('250').toString(), + gasLimit: 400000 + } + ] + + const feeQuote: FeeQuote = { + _tag: 'FeeQuote', + _quote: ethers.utils.randomBytes(99) + } + + const account = await getAccount(feeOptions, feeQuote) + const signer = account.getSigner(chainId) + + const res = signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.be.rejectedWith('No fee option available - not enough balance') + }) + + it('should automatically select ERC20 fee if user has no ETH', async () => { + const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18) + + const recipient = ethers.Wallet.createRandom().address + const feeOptions: FeeOption[] = [ + { + token: { + chainId, + name: 'native', + symbol: 'ETH', + type: proto.FeeTokenType.UNKNOWN, + logoURL: '' + }, + to: recipient, + value: ethers.utils.parseEther('12').toString(), + gasLimit: 100000 + }, + { + token: { + chainId, + name: 'TEST', + symbol: 'TEST', + type: proto.FeeTokenType.ERC20_TOKEN, + logoURL: '', + contractAddress: token.address + }, + to: recipient, + value: ethers.utils.parseEther('11').toString(), + gasLimit: 400000 + } + ] + + const feeQuote: FeeQuote = { + _tag: 'FeeQuote', + _quote: ethers.utils.randomBytes(99) + } + + const account = await getAccount(feeOptions, feeQuote) + const signer = account.getSigner(chainId) + + await token.mint(account.address, ethers.utils.parseEther('11')) + + const res = await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + expect(await token.balanceOf(recipient)).to.deep.equal(ethers.utils.parseEther('11')) + }) + + it('should select fee using callback (first option)', async () => { + const recipient = ethers.Wallet.createRandom().address + + const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18) + + const feeOptions: FeeOption[] = [ + { + token: { + chainId, + name: 'native', + symbol: 'ETH', + type: proto.FeeTokenType.UNKNOWN, + logoURL: '' + }, + to: recipient, + value: '5', + gasLimit: 100000 + }, + { + token: { + chainId, + name: 'TEST', + symbol: 'TEST', + type: proto.FeeTokenType.ERC20_TOKEN, + logoURL: '', + contractAddress: token.address + }, + to: recipient, + value: ethers.utils.parseEther('11').toString(), + gasLimit: 400000 + } + ] + + const feeQuote: FeeQuote = { + _tag: 'FeeQuote', + _quote: ethers.utils.randomBytes(99) + } + + const account = await getAccount(feeOptions, feeQuote) + const signer = account.getSigner(chainId, { + selectFee: async (_txs: any, options: FeeOption[]) => { + expect(options).to.deep.equal(feeOptions) + return options[0] + } + }) + + await (chainId === 31337 ? signer1 : signer2).sendTransaction({ + to: account.address, + value: 5 + }) + + const res = await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + expect(await signer.provider.getBalance(recipient)).to.deep.equal(ethers.BigNumber.from('5')) + expect(await token.balanceOf(recipient)).to.deep.equal(ethers.utils.parseEther('0')) + }) + + it('should select fee using callback (second option)', async () => { + const recipient = ethers.Wallet.createRandom().address + + const token = await createERC20(chainId === 31337 ? signer1 : signer2, 'Test Token', 'TEST', 18) + + const feeOptions: FeeOption[] = [ + { + token: { + chainId, + name: 'native', + symbol: 'ETH', + type: proto.FeeTokenType.UNKNOWN, + logoURL: '' + }, + to: recipient, + value: '5', + gasLimit: 100000 + }, + { + token: { + chainId, + name: 'TEST', + symbol: 'TEST', + type: proto.FeeTokenType.ERC20_TOKEN, + logoURL: '', + contractAddress: token.address + }, + to: recipient, + value: ethers.utils.parseEther('11').toString(), + gasLimit: 400000 + } + ] + + const feeQuote: FeeQuote = { + _tag: 'FeeQuote', + _quote: ethers.utils.randomBytes(99) + } + + const account = await getAccount(feeOptions, feeQuote) + const signer = account.getSigner(chainId, { + selectFee: async (_txs: any, options: FeeOption[]) => { + expect(options).to.deep.equal(feeOptions) + return options[1] + } + }) + + await token.mint(account.address, ethers.utils.parseEther('11')) + + const res = await signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + expect(res).to.exist + expect(res.hash).to.exist + + expect(await signer.provider.getTransaction(res.hash)).to.exist + expect(await signer.provider.getBalance(recipient)).to.deep.equal(ethers.BigNumber.from('0')) + expect(await token.balanceOf(recipient)).to.deep.equal(ethers.utils.parseEther('11')) + }) + }) + }) + + it('should send transactions on multiple nonce spaces one by one', async () => { + const signer1 = account.getSigner(chainId, { nonceSpace: '0x01' }) + const signer2 = account.getSigner(chainId, { nonceSpace: 2 }) + const randomSpace = ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12))) + const signer3 = account.getSigner(chainId, { + nonceSpace: randomSpace + }) + const signer4 = account.getSigner(chainId, { nonceSpace: '0x04' }) + const signer5 = account.getSigner(chainId, { nonceSpace: '0xffffffffffffffffffffffffffffffffffffffff' }) + + await signer1.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + await signer2.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + await signer3.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + await signer4.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + await signer5.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + // Should have used all spaces + const wallet = account.walletForStatus(chainId, await account.status(chainId)) + + const nonceSpace1 = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace1.toString()).to.equal('1') + + const nonceSpace2 = await wallet.getNonce(2).then(r => ethers.BigNumber.from(r)) + expect(nonceSpace2.toString()).to.equal('1') + + const nonceSpace3 = await wallet.getNonce(randomSpace).then(r => ethers.BigNumber.from(r)) + expect(nonceSpace3.toString()).to.equal('1') + + const nonceSpace4 = await wallet.getNonce('0x04').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace4.toString()).to.equal('1') + + const nonceSpace5 = await wallet + .getNonce('0xffffffffffffffffffffffffffffffffffffffff') + .then(r => ethers.BigNumber.from(r)) + expect(nonceSpace5.toString()).to.equal('1') + + // Unused space should have nonce 0 + const nonceSpace6 = await wallet.getNonce('0x06').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace6.toString()).to.equal('0') + + // Using a space should consume it + await signer1.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + const nonceSpace1b = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace1b.toString()).to.equal('2') + }) + + // Skip if using external network (chainId 31338) + // it randomly fails using node 20, it does not seem to be a bug + // on sequence.js, instead the external node returns empty data when calling + // `getNonce()`, when it should return a value + ;(chainId === 31338 ? describe.skip : describe)('multiple nonce spaces', async () => { + it('should send transactions on multiple nonce spaces at once', async () => { + const signer1 = account.getSigner(chainId, { nonceSpace: '0x01' }) + const signer2 = account.getSigner(chainId, { nonceSpace: 2 }) + const randomSpace = ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12))) + const signer3 = account.getSigner(chainId, { + nonceSpace: randomSpace + }) + const signer4 = account.getSigner(chainId, { nonceSpace: '0x04' }) + const signer5 = account.getSigner(chainId, { nonceSpace: '0xffffffffffffffffffffffffffffffffffffffff' }) + + const results = await Promise.all([ + signer1.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer2.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer3.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer4.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer5.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + ]) + + expect(results).to.have.lengthOf(5) + expect(results[0]).to.exist + expect(results[0].hash).to.exist + expect(results[1]).to.exist + expect(results[1].hash).to.exist + expect(results[2]).to.exist + expect(results[2].hash).to.exist + expect(results[3]).to.exist + expect(results[3].hash).to.exist + expect(results[4]).to.exist + expect(results[4].hash).to.exist + + // hashes should be different + for (let i = 0; i < results.length; i++) { + for (let j = i + 1; j < results.length; j++) { + expect(results[i].hash).to.not.equal(results[j].hash) + } + } + + // Should have used all spaces + const wallet = account.walletForStatus(chainId, await account.status(chainId)) + + const nonceSpace1 = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace1.toString()).to.equal('1') + + const nonceSpace2 = await wallet.getNonce(2).then(r => ethers.BigNumber.from(r)) + expect(nonceSpace2.toString()).to.equal('1') + + const nonceSpace3 = await wallet.getNonce(randomSpace).then(r => ethers.BigNumber.from(r)) + expect(nonceSpace3.toString()).to.equal('1') + + const nonceSpace4 = await wallet.getNonce('0x04').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace4.toString()).to.equal('1') + + const nonceSpace5 = await wallet + .getNonce('0xffffffffffffffffffffffffffffffffffffffff') + .then(r => ethers.BigNumber.from(r)) + expect(nonceSpace5.toString()).to.equal('1') + + // Unused space should have nonce 0 + const nonceSpace6 = await wallet.getNonce('0x06').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace6.toString()).to.equal('0') + + // Using a space should consume it + await signer1.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + const nonceSpace1b = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace1b.toString()).to.equal('2') + }) + + it('should send 100 parallel transactions using different spaces', async () => { + const signers = new Array(100).fill(0).map(() => + account.getSigner(chainId, { + nonceSpace: ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12))) + }) + ) + + // Send a random transaction on each one of them + await Promise.all( + signers.map(signer => + signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + ) + ) + + // Send another + await Promise.all( + signers.map(signer => + signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + ) + ) + + /// ... and another + await Promise.all( + signers.map(signer => + signer.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + ) + ) + }) + + it('should send multiple transactions on multiple nonce spaces at once', async () => { + const signer1 = account.getSigner(chainId, { nonceSpace: '0x01' }) + const signer2 = account.getSigner(chainId, { nonceSpace: 2 }) + const randomSpace = ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12))) + + const signer3 = account.getSigner(chainId, { + nonceSpace: randomSpace + }) + const signer4 = account.getSigner(chainId, { nonceSpace: '0x04' }) + const signer5 = account.getSigner(chainId, { nonceSpace: '0xffffffffffffffffffffffffffffffffffffffff' }) + + await Promise.all([ + signer1.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer2.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer3.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer4.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer5.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + ]) + + const results = await Promise.all([ + signer1.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer2.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer3.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer4.sendTransaction({ + to: ethers.Wallet.createRandom().address + }), + signer5.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + ]) + + expect(results).to.have.lengthOf(5) + expect(results[0]).to.exist + expect(results[0].hash).to.exist + expect(results[1]).to.exist + expect(results[1].hash).to.exist + expect(results[2]).to.exist + expect(results[2].hash).to.exist + expect(results[3]).to.exist + expect(results[3].hash).to.exist + expect(results[4]).to.exist + expect(results[4].hash).to.exist + + // hashes should be different + for (let i = 0; i < results.length; i++) { + for (let j = i + 1; j < results.length; j++) { + expect(results[i].hash).to.not.equal(results[j].hash) + } + } + + // Should have used all spaces + const wallet = account.walletForStatus(chainId, await account.status(chainId)) + + const nonceSpace2 = await wallet.getNonce(2).then(r => ethers.BigNumber.from(r)) + expect(nonceSpace2.toString()).to.equal('2') + + const nonceSpace1 = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace1.toString()).to.equal('2') + + const nonceSpace3 = await wallet.getNonce(randomSpace).then(r => ethers.BigNumber.from(r)) + expect(nonceSpace3.toString()).to.equal('2') + + const nonceSpace4 = await wallet.getNonce('0x04').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace4.toString()).to.equal('2') + + const nonceSpace5 = await wallet + .getNonce('0xffffffffffffffffffffffffffffffffffffffff') + .then(r => ethers.BigNumber.from(r)) + expect(nonceSpace5.toString()).to.equal('2') + + // Unused space should have nonce 0 + const nonceSpace6 = await wallet.getNonce('0x06').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace6.toString()).to.equal('0') + + // Using a space should consume it + await signer1.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + const nonceSpace1b = await wallet.getNonce('0x01').then(r => ethers.BigNumber.from(r)) + expect(nonceSpace1b.toString()).to.equal('3') + }) + }) + }) + }) +}) diff --git a/packages/api/CHANGELOG.md b/packages/api/CHANGELOG.md new file mode 100644 index 000000000..abd71e793 --- /dev/null +++ b/packages/api/CHANGELOG.md @@ -0,0 +1,1733 @@ +# @0xsequence/api + +## 1.10.8 + +### Patch Changes + +- update metadata bindings + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia + +## 1.10.3 + +### Patch Changes + +- typing fix + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants + +## 1.9.36 + +### Patch Changes + +- guard: export client + +## 1.9.35 + +### Patch Changes + +- guard: update bindings + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email + +## 1.9.33 + +### Patch Changes + +- waas: umd build + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes + +## 1.9.30 + +### Patch Changes + +- update + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore + +## 1.9.23 + +### Patch Changes + +- update api client bindings + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings + +## 1.9.21 + +### Patch Changes + +- api client bindings + +## 1.9.20 + +### Patch Changes + +- api client bindings update + +## 1.9.19 + +### Patch Changes + +- waas update + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client + +## 1.9.8 + +### Patch Changes + +- waas client update + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer + +## 1.9.6 + +### Patch Changes + +- waas package update + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia + +## 1.9.1 + +### Patch Changes + +- analytics fix + +## 1.9.0 + +### Minor Changes + +- waas release + +## 1.8.8 + +### Patch Changes + +- update metadata bindings + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested + +## 1.8.1 + +### Patch Changes + +- update to analytics provider + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks + +## 1.6.3 + +### Patch Changes + +- network list update + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods + +## 1.4.2 + +### Patch Changes + +- guard: update bindings + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic + +## 1.4.0 + +### Minor Changes + +- project access key support + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions + +## 1.1.11 + +### Patch Changes + +- add homeverse configs + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object + +## 0.43.28 + +### Patch Changes + +- update api bindings + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM + +## 0.43.22 + +### Patch Changes + +- add zkevm chain + +## 0.43.21 + +### Patch Changes + +- api: update client bindings + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings + +## 0.43.19 + +### Patch Changes + +- session proof update + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods + +## 0.43.14 + +### Patch Changes + +- bump + +## 0.43.13 + +### Patch Changes + +- update rpc bindings + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter + +## 0.43.10 + +### Patch Changes + +- various improvements + +## 0.43.9 + +### Patch Changes + +- update deps + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings + +## 0.42.6 + +### Patch Changes + +- api bindings update + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options + +## 0.42.3 + +### Patch Changes + +- update api bindings + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' + +## 0.41.3 + +### Patch Changes + +- api bindings update + +## 0.41.2 + +### Patch Changes + +- api bindings update + +## 0.41.1 + +### Patch Changes + +- update default networks + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain + +## 0.40.5 + +### Patch Changes + +- api: update bindings + +## 0.40.4 + +### Patch Changes + +- add unreal transport + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option + +## 0.39.4 + +### Patch Changes + +- api: update client bindings + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider + +## 0.39.2 + +### Patch Changes + +- update umd name + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) + +## 0.36.7 + +### Patch Changes + +- fix missing break + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation + +## 0.35.10 + +### Patch Changes + +- upgrade deps + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +## 0.33.1 + +### Patch Changes + +- update bindings + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +## 0.29.9 + +### Patch Changes + +- update client + +## 0.29.8 + +### Patch Changes + +- update api + +## 0.29.4 + +### Patch Changes + +- api: update rpc bindings + +## 0.29.1 + +### Patch Changes + +- metadata: ContractInfo.decimals is now optional, i.e. may be undefined + + api: new APIs for user storage and isUsingGoogleMail + +## 0.29.0 + +### Minor Changes + +- major architectural changes in Sequence design + + - only one API instance, API is no longer a per-chain service + - separate per-chain indexer service, API no longer handles indexing + - single contract metadata service, API no longer serves metadata + + chaind package has been removed, indexer and metadata packages have been added + + stronger typing with new explicit ChainId type + + multicall fixes and improvements + + forbid "wait" transactions in sendTransactionBatch calls + +## 0.28.0 + +### Minor Changes + +- extension provider + +## 0.27.0 + +### Minor Changes + +- Add requireFreshSigner lib to sessions + +## 0.25.1 + +### Patch Changes + +- Fix build typescrypt issue + +## 0.25.0 + +### Minor Changes + +- 10c8af8: Add estimator package + Fix multicall few calls bug + +## 0.24.0 + +### Minor Changes + +- pass wallet config and nonce to GetMetaTxnNetworkFeeOptions + +## 0.23.0 + +### Minor Changes + +- - relayer: offer variety of gas fee options from the relayer service" + +## 0.22.2 + +### Patch Changes + +- e1c109e: Fix authProof on expired sessions + +## 0.22.1 + +### Patch Changes + +- transport session cache + +## 0.22.0 + +### Minor Changes + +- e667b65: Expose all relayer options on networks + +## 0.21.5 + +### Patch Changes + +- Give priority to metaTxnId returned by relayer + +## 0.21.4 + +### Patch Changes + +- Add has enough signers method + +## 0.21.3 + +### Patch Changes + +- add window session cache + +## 0.21.2 + +### Patch Changes + +- exception handlind in relayer + +## 0.21.0 + +### Minor Changes + +- - fix gas estimation on wallets with large number of signers + - update to session handling and wallet config construction upon auth + +## 0.20.0 + +### Minor Changes + +- revert JWT request piggybacking + +## 0.19.3 + +### Patch Changes + +- jwtAuth visibility, package version sync + +## 0.19.0 + +### Minor Changes + +- - provider, improve dapp / wallet transport io + +## 0.18.0 + +### Minor Changes + +- relayer improvements and pending transaction handling + +## 0.17.0 + +### Minor Changes + +- ArcadeumAPIClient no longer exposes jwtAuth + +## 0.16.1 + +### Patch Changes + +- api: add legacy types for bw compat + +## 0.16.0 + +### Minor Changes + +- relayer as its own service separate from chaind + +## 0.15.1 + +### Patch Changes + +- update api clients + +## 0.15.0 + +### Patch Changes + +- - update chaind and api bindings + - replace EstimateMetaTxnGasReceipt with UpdateMetaTxnGasLimits and GetMetaTxnNetworkFeeOptions + +## 0.14.3 + +### Patch Changes + +- Fix 0xSequence relayer dependencies + +## 0.14.2 + +### Patch Changes + +- Add debug logs to rpc-relayer + +## 0.14.1 + +### Patch Changes + +- update api client + +## 0.14.0 + +### Minor Changes + +- update sequence utils finder which includes optimization + +## 0.13.0 + +### Minor Changes + +- Update SequenceUtils deployed contract + +## 0.12.1 + +### Patch Changes + +- npm bump + +## 0.12.0 + +### Minor Changes + +- provider: improvements to window transport + +## 0.11.4 + +### Patch Changes + +- update api client + +## 0.11.3 + +### Patch Changes + +- improve openWindow state options handling + +## 0.11.2 + +### Patch Changes + +- Fix multicall proxy scopes + +## 0.11.1 + +### Patch Changes + +- Add support for dynamic and nested signatures + +## 0.11.0 + +### Minor Changes + +- Update wallet context to 1.7 contracts + +## 0.10.9 + +### Patch Changes + +- add support for public addresses as signers in session.open + +## 0.10.8 + +### Patch Changes + +- Multicall production configuration + +## 0.10.7 + +### Patch Changes + +- allow provider transport to force disconnect + +## 0.10.6 + +### Patch Changes + +- - fix getWalletState method + +## 0.10.5 + +### Patch Changes + +- update relayer gas refund options + +## 0.10.4 + +### Patch Changes + +- Update api proto + +## 0.10.3 + +### Patch Changes + +- Fix loading config cross-chain + +## 0.10.2 + +### Patch Changes + +- - message digest fix + +## 0.10.1 + +### Patch Changes + +- upgrade deps + +## 0.10.0 + +### Minor Changes + +- Deployed new contracts with ERC1271 signer support + +## 0.9.6 + +### Patch Changes + +- Update ABIs for latest sequence contracts + +## 0.9.5 + +### Patch Changes + +- Implemented session class + +## 0.9.3 + +### Patch Changes + +- - minor improvements + +## 0.9.2 + +### Patch Changes + +- - Update api client + +## 0.9.1 + +### Patch Changes + +- - patch bump + +## 0.9.0 + +### Minor Changes + +- - provider transport hardening + +## 0.8.5 + +### Patch Changes + +- - use latest wallet-contracts + +## 0.8.4 + +### Patch Changes + +- - minor improvements, name updates and comments + +## 0.8.3 + +### Patch Changes + +- - refinements + + - normalize signer address in config + + - provider: getWalletState() method to WalletProvider + +## 0.8.2 + +### Patch Changes + +- - field rename and ethauth dependency bump + +## 0.8.1 + +### Patch Changes + +- - variety of optimizations + +## 0.8.0 + +### Minor Changes + +- - changeset fix + +## 0.7.0 + +### Patch Changes + +- 6f11ed7: sequence.js, init release diff --git a/packages/api/README.md b/packages/api/README.md new file mode 100644 index 000000000..6ac423e4d --- /dev/null +++ b/packages/api/README.md @@ -0,0 +1,4 @@ +@0xsequence/api +=============== + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/api/src/api.gen.ts b/packages/api/src/api.gen.ts new file mode 100644 index 000000000..09dc0423b --- /dev/null +++ b/packages/api/src/api.gen.ts @@ -0,0 +1,1745 @@ +/* eslint-disable */ +// sequence-api v0.4.0 da72de09959c34a964bb84662ed6bd510f78f5cb +// -- +// Code generated by webrpc-gen@v0.18.6 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=api.ridl -target=typescript -client -out=./clients/api.gen.ts + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.4.0' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = 'da72de09959c34a964bb84662ed6bd510f78f5cb' + +// +// Types +// + +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC' +} + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface RuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + checks: RuntimeChecks + numTxnsRelayed: { [key: string]: NumTxnsRelayed } +} + +export interface NumTxnsRelayed { + chainID: number + prev: number + current: number + period: number +} + +export interface RuntimeChecks {} + +export interface SequenceContext { + factory: string + mainModule: string + mainModuleUpgradable: string + guestModule: string + utils: string +} + +export interface User { + address: string + username: string + avatar: string + bio: string + location: string + locale: string + backup?: boolean + backupConfirmed?: boolean + maxInvites?: number + updatedAt?: string + createdAt?: string +} + +export interface WalletBackup { + accountAddress: string + secretHash: string + encryptedWallet: string + userConfirmed: boolean + updatedAt?: string + createdAt?: string +} + +export interface Friend { + id: number + userAddress: string + friendAddress: string + nickname: string + user?: User + createdAt?: string +} + +export interface InviteCode { + usesLeft: number + ownerAccount: string + email?: string + url: string + createdAt?: string + expiresAt?: string +} + +export interface InviteCodeAccount { + claimedByUserAddress: string + claimedAt?: string +} + +export interface InviteInfo { + expiryInHours: number + max: number + invites: Array +} + +export interface ContractCall { + signature: string + function: string + args: Array +} + +export interface TupleComponent { + name?: string + type: string + value: any +} + +export interface Transaction { + delegateCall: boolean + revertOnError: boolean + gasLimit: string + target: string + value: string + data: string + call?: ContractCall +} + +export interface UserStorage { + userAddress: string + key: string + value: any +} + +export interface Token { + chainId: number + contractAddress: string + tokenId?: string +} + +export interface Price { + value: number + currency: string +} + +export interface TokenPrice { + token: Token + price?: Price + price24hChange?: Price + floorPrice: Price + buyPrice: Price + sellPrice: Price + updatedAt: string +} + +export interface ExchangeRate { + name: string + symbol: string + value: number + vsCurrency: string + currencyType: string +} + +export interface LinkedWallet { + id: number + walletAddress: string + linkedWalletAddress: string + createdAt?: string +} + +export interface Page { + pageSize?: number + page?: number + totalRecords?: number + column?: string + before?: any + after?: any + sort?: Array + more?: boolean +} + +export interface SortBy { + column: string + order: SortOrder +} + +export interface NftCheckoutParams { + name: string + imageUrl: string + network: string + recipientAddress: string + blockchainNftId: string + contractAddress: string + quantity: number + decimals?: number +} + +export interface NftCheckout { + token: string + expiresAt: string + orderId: string +} + +export interface SardineOrder { + id: string + createdAt?: string + referenceId: string + status: string + fiatCurrency: string + fiatExchangeRateUSD: number + transactionId: string + expiresAt?: string + total: number + subTotal: number + transactionFee: number + networkFee: number + paymentCurrency?: string + paymentMethodType?: string + transactionType: string + name: string + price: number + imageUrl: string + contractAddress?: string + transactionHash?: string + recipientAddress: string +} + +export interface API { + ping(headers?: object, signal?: AbortSignal): Promise + version(headers?: object, signal?: AbortSignal): Promise + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + clock(headers?: object, signal?: AbortSignal): Promise + getSequenceContext(headers?: object, signal?: AbortSignal): Promise + getAuthToken(args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise + getAuthToken2(args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise + sendPasswordlessLink( + args: SendPasswordlessLinkArgs, + headers?: object, + signal?: AbortSignal + ): Promise + friendList(args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise + getFriendByAddress(args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise + searchFriends(args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise + addFriend(args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise + updateFriendNickname( + args: UpdateFriendNicknameArgs, + headers?: object, + signal?: AbortSignal + ): Promise + removeFriend(args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise + contractCall(args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise + decodeContractCall(args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise + lookupContractCallSelectors( + args: LookupContractCallSelectorsArgs, + headers?: object, + signal?: AbortSignal + ): Promise + userStorageFetch(args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise + userStorageSave(args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise + userStorageDelete(args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise + userStorageFetchAll(args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise + getMoonpayLink(args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise + getSardineClientToken(headers?: object, signal?: AbortSignal): Promise + getSardineNFTCheckoutToken( + args: GetSardineNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getSardineNFTCheckoutOrderStatus( + args: GetSardineNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal + ): Promise + resolveENSAddress(args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise + isValidSignature(args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise + isValidMessageSignature( + args: IsValidMessageSignatureArgs, + headers?: object, + signal?: AbortSignal + ): Promise + isValidTypedDataSignature( + args: IsValidTypedDataSignatureArgs, + headers?: object, + signal?: AbortSignal + ): Promise + isValidETHAuthProof(args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise + getCoinPrices(args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise + getCollectiblePrices( + args: GetCollectiblePricesArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getExchangeRate(args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise + memoryStore(args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise + memoryLoad(args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise + getInviteInfo(headers?: object, signal?: AbortSignal): Promise + isValidAccessCode(args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise + internalClaimAccessCode( + args: InternalClaimAccessCodeArgs, + headers?: object, + signal?: AbortSignal + ): Promise + blockNumberAtTime(args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise + paperSessionSecret(args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise + paperSessionSecret2(args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise + linkWallet(args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise + getLinkedWallets(args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise +} + +export interface PingArgs {} + +export interface PingReturn { + status: boolean +} +export interface VersionArgs {} + +export interface VersionReturn { + version: Version +} +export interface RuntimeStatusArgs {} + +export interface RuntimeStatusReturn { + status: RuntimeStatus +} +export interface ClockArgs {} + +export interface ClockReturn { + serverTime: string +} +export interface GetSequenceContextArgs {} + +export interface GetSequenceContextReturn { + data: SequenceContext +} +export interface GetAuthTokenArgs { + ewtString: string + testnetMode?: boolean +} + +export interface GetAuthTokenReturn { + status: boolean + jwtToken: string + address: string + user?: User +} +export interface GetAuthToken2Args { + ewtString: string + chainID: string +} + +export interface GetAuthToken2Return { + status: boolean + jwtToken: string + address: string + user?: User +} +export interface SendPasswordlessLinkArgs { + email: string + redirectUri: string + intent: string +} + +export interface SendPasswordlessLinkReturn { + status: boolean +} +export interface FriendListArgs { + nickname?: string + page?: Page +} + +export interface FriendListReturn { + page: Page + friends: Array +} +export interface GetFriendByAddressArgs { + friendAddress: string +} + +export interface GetFriendByAddressReturn { + status: boolean + friend: Friend +} +export interface SearchFriendsArgs { + filterUsername: string + page?: Page +} + +export interface SearchFriendsReturn { + friends: Array +} +export interface AddFriendArgs { + friendAddress: string + optionalNickname?: string +} + +export interface AddFriendReturn { + status: boolean + friend?: Friend +} +export interface UpdateFriendNicknameArgs { + friendAddress: string + nickname: string +} + +export interface UpdateFriendNicknameReturn { + status: boolean + friend?: Friend +} +export interface RemoveFriendArgs { + friendAddress: string +} + +export interface RemoveFriendReturn { + status: boolean +} +export interface ContractCallArgs { + chainID: string + contract: string + inputExpr: string + outputExpr: string + args: Array +} + +export interface ContractCallReturn { + returns: Array +} +export interface DecodeContractCallArgs { + callData: string +} + +export interface DecodeContractCallReturn { + call: ContractCall +} +export interface LookupContractCallSelectorsArgs { + selectors: Array +} + +export interface LookupContractCallSelectorsReturn { + signatures: Array> +} +export interface UserStorageFetchArgs { + key: string +} + +export interface UserStorageFetchReturn { + object: any +} +export interface UserStorageSaveArgs { + key: string + object: any +} + +export interface UserStorageSaveReturn { + ok: boolean +} +export interface UserStorageDeleteArgs { + key: string +} + +export interface UserStorageDeleteReturn { + ok: boolean +} +export interface UserStorageFetchAllArgs { + keys?: Array +} + +export interface UserStorageFetchAllReturn { + objects: { [key: string]: any } +} +export interface GetMoonpayLinkArgs { + url: string +} + +export interface GetMoonpayLinkReturn { + signedUrl: string +} +export interface GetSardineClientTokenArgs {} + +export interface GetSardineClientTokenReturn { + token: string +} +export interface GetSardineNFTCheckoutTokenArgs { + params: NftCheckoutParams +} + +export interface GetSardineNFTCheckoutTokenReturn { + resp: NftCheckout +} +export interface GetSardineNFTCheckoutOrderStatusArgs { + orderId: string +} + +export interface GetSardineNFTCheckoutOrderStatusReturn { + resp: SardineOrder +} +export interface ResolveENSAddressArgs { + ens: string +} + +export interface ResolveENSAddressReturn { + address: string + ok: boolean +} +export interface IsValidSignatureArgs { + chainId: string + walletAddress: string + digest: string + signature: string +} + +export interface IsValidSignatureReturn { + isValid: boolean +} +export interface IsValidMessageSignatureArgs { + chainId: string + walletAddress: string + message: string + signature: string +} + +export interface IsValidMessageSignatureReturn { + isValid: boolean +} +export interface IsValidTypedDataSignatureArgs { + chainId: string + walletAddress: string + typedData: any + signature: string +} + +export interface IsValidTypedDataSignatureReturn { + isValid: boolean +} +export interface IsValidETHAuthProofArgs { + chainId: string + walletAddress: string + ethAuthProofString: string +} + +export interface IsValidETHAuthProofReturn { + isValid: boolean +} +export interface GetCoinPricesArgs { + tokens: Array +} + +export interface GetCoinPricesReturn { + tokenPrices: Array +} +export interface GetCollectiblePricesArgs { + tokens: Array +} + +export interface GetCollectiblePricesReturn { + tokenPrices: Array +} +export interface GetExchangeRateArgs { + toCurrency: string +} + +export interface GetExchangeRateReturn { + exchangeRate: ExchangeRate +} +export interface MemoryStoreArgs { + key: string + value: string +} + +export interface MemoryStoreReturn { + ok: boolean +} +export interface MemoryLoadArgs { + key: string +} + +export interface MemoryLoadReturn { + value: string +} +export interface GetInviteInfoArgs {} + +export interface GetInviteInfoReturn { + inviteInfo: InviteInfo +} +export interface IsValidAccessCodeArgs { + accessCode: string +} + +export interface IsValidAccessCodeReturn { + status: boolean +} +export interface InternalClaimAccessCodeArgs { + address: string + accessCode: string +} + +export interface InternalClaimAccessCodeReturn { + status: boolean +} +export interface BlockNumberAtTimeArgs { + chainId: number + timestamps: Array +} + +export interface BlockNumberAtTimeReturn { + blocks: Array +} +export interface PaperSessionSecretArgs { + chainName: string + contractAddress: string + paramsJson: string + contractType: string +} + +export interface PaperSessionSecretReturn { + secret: string +} +export interface PaperSessionSecret2Args { + chainName: string + contractAddress: string + paramsJson: string + abi: string +} + +export interface PaperSessionSecret2Return { + secret: string +} +export interface LinkWalletArgs { + chainId: string + walletAddress: string + ethAuthProofString: string + linkedWalletMessage: string + linkedWalletSignature: string +} + +export interface LinkWalletReturn { + status: boolean + linkedWalletAddress: string +} +export interface GetLinkedWalletsArgs { + walletAddress: string +} + +export interface GetLinkedWalletsReturn { + linkedWallets: Array +} + +// +// Client +// +export class API implements API { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/API/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + version: _data.version + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + clock = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Clock'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + serverTime: _data.serverTime + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + data: _data.data + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getAuthToken = (args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetAuthToken'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + jwtToken: _data.jwtToken, + address: _data.address, + user: _data.user + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getAuthToken2 = (args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetAuthToken2'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + jwtToken: _data.jwtToken, + address: _data.address, + user: _data.user + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + sendPasswordlessLink = ( + args: SendPasswordlessLinkArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('SendPasswordlessLink'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + friendList = (args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('FriendList'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + friends: >_data.friends + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getFriendByAddress = ( + args: GetFriendByAddressArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetFriendByAddress'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + friend: _data.friend + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + searchFriends = (args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SearchFriends'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + friends: >_data.friends + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + addFriend = (args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddFriend'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + friend: _data.friend + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + updateFriendNickname = ( + args: UpdateFriendNicknameArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('UpdateFriendNickname'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + friend: _data.friend + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + removeFriend = (args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RemoveFriend'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + contractCall = (args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ContractCall'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + returns: >_data.returns + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + decodeContractCall = ( + args: DecodeContractCallArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('DecodeContractCall'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + call: _data.call + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + lookupContractCallSelectors = ( + args: LookupContractCallSelectorsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('LookupContractCallSelectors'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + signatures: >>_data.signatures + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + userStorageFetch = (args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UserStorageFetch'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + object: _data.object + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + userStorageSave = (args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UserStorageSave'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + userStorageDelete = (args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UserStorageDelete'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + userStorageFetchAll = ( + args: UserStorageFetchAllArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('UserStorageFetchAll'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + objects: <{ [key: string]: any }>_data.objects + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getMoonpayLink = (args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetMoonpayLink'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + signedUrl: _data.signedUrl + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getSardineClientToken = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetSardineClientToken'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + token: _data.token + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getSardineNFTCheckoutToken = ( + args: GetSardineNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetSardineNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + resp: _data.resp + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getSardineNFTCheckoutOrderStatus = ( + args: GetSardineNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetSardineNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + resp: _data.resp + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + resolveENSAddress = (args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ResolveENSAddress'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + address: _data.address, + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + isValidSignature = (args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('IsValidSignature'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + isValid: _data.isValid + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + isValidMessageSignature = ( + args: IsValidMessageSignatureArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('IsValidMessageSignature'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + isValid: _data.isValid + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + isValidTypedDataSignature = ( + args: IsValidTypedDataSignatureArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('IsValidTypedDataSignature'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + isValid: _data.isValid + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + isValidETHAuthProof = ( + args: IsValidETHAuthProofArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('IsValidETHAuthProof'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + isValid: _data.isValid + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getCoinPrices = (args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetCoinPrices'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + tokenPrices: >_data.tokenPrices + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getCollectiblePrices = ( + args: GetCollectiblePricesArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetCollectiblePrices'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + tokenPrices: >_data.tokenPrices + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getExchangeRate = (args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetExchangeRate'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + exchangeRate: _data.exchangeRate + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + memoryStore = (args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('MemoryStore'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + memoryLoad = (args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('MemoryLoad'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + value: _data.value + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getInviteInfo = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetInviteInfo'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + inviteInfo: _data.inviteInfo + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + isValidAccessCode = (args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('IsValidAccessCode'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + internalClaimAccessCode = ( + args: InternalClaimAccessCodeArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('InternalClaimAccessCode'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + blockNumberAtTime = (args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('BlockNumberAtTime'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + blocks: >_data.blocks + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + paperSessionSecret = ( + args: PaperSessionSecretArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('PaperSessionSecret'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + secret: _data.secret + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + paperSessionSecret2 = ( + args: PaperSessionSecret2Args, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('PaperSessionSecret2'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + secret: _data.secret + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + linkWallet = (args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('LinkWallet'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + linkedWalletAddress: _data.linkedWalletAddress + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getLinkedWallets = (args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetLinkedWallets'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + linkedWallets: >_data.linkedWallets + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + return { + method: 'POST', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body || {}), + signal + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then(text => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}` + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = 'endpoint error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = 'request failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = 'bad route', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = 'bad method', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = 'bad request', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = 'bad response', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = 'server panic', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = 'internal error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = 'client disconnected', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = 'stream lost', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = 'stream finished', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export class UnauthorizedError extends WebrpcError { + constructor( + name: string = 'Unauthorized', + code: number = 1000, + message: string = 'Unauthorized access', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedError.prototype) + } +} + +export class PermissionDeniedError extends WebrpcError { + constructor( + name: string = 'PermissionDenied', + code: number = 1001, + message: string = 'Permission denied', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, PermissionDeniedError.prototype) + } +} + +export class SessionExpiredError extends WebrpcError { + constructor( + name: string = 'SessionExpired', + code: number = 1002, + message: string = 'Session expired', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, SessionExpiredError.prototype) + } +} + +export class AbortedError extends WebrpcError { + constructor( + name: string = 'Aborted', + code: number = 1005, + message: string = 'Request aborted', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AbortedError.prototype) + } +} + +export class InvalidArgumentError extends WebrpcError { + constructor( + name: string = 'InvalidArgument', + code: number = 2000, + message: string = 'Invalid argument', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidArgumentError.prototype) + } +} + +export class UnavailableError extends WebrpcError { + constructor( + name: string = 'Unavailable', + code: number = 2002, + message: string = 'Unavailable resource', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnavailableError.prototype) + } +} + +export class QueryFailedError extends WebrpcError { + constructor( + name: string = 'QueryFailed', + code: number = 2003, + message: string = 'Query failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QueryFailedError.prototype) + } +} + +export class NotFoundError extends WebrpcError { + constructor( + name: string = 'NotFound', + code: number = 3000, + message: string = 'Resource not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NotFoundError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Unauthorized = 'Unauthorized', + PermissionDenied = 'PermissionDenied', + SessionExpired = 'SessionExpired', + Aborted = 'Aborted', + InvalidArgument = 'InvalidArgument', + Unavailable = 'Unavailable', + QueryFailed = 'QueryFailed', + NotFound = 'NotFound' +} + +const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1000]: UnauthorizedError, + [1001]: PermissionDeniedError, + [1002]: SessionExpiredError, + [1005]: AbortedError, + [2000]: InvalidArgumentError, + [2002]: UnavailableError, + [2003]: QueryFailedError, + [3000]: NotFoundError +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts new file mode 100644 index 000000000..0384ad4af --- /dev/null +++ b/packages/api/src/index.ts @@ -0,0 +1,38 @@ +export * from './api.gen' + +import { API as ApiRpc } from './api.gen' + +const fetch = typeof global === 'object' ? global.fetch : window.fetch + +export class SequenceAPIClient extends ApiRpc { + constructor( + hostname: string, + public projectAccessKey?: string, + public jwtAuth?: string + ) { + super(hostname.endsWith('/') ? hostname.slice(0, -1) : hostname, fetch) + this.fetch = this._fetch + } + + _fetch = (input: RequestInfo, init?: RequestInit): Promise => { + // automatically include jwt and access key auth header to requests + // if its been set on the api client + const headers: { [key: string]: any } = {} + + const jwtAuth = this.jwtAuth + const projectAccessKey = this.projectAccessKey + + if (jwtAuth && jwtAuth.length > 0) { + headers['Authorization'] = `BEARER ${jwtAuth}` + } + + if (projectAccessKey && projectAccessKey.length > 0) { + headers['X-Access-Key'] = projectAccessKey + } + + // before the request is made + init!.headers = { ...init!.headers, ...headers } + + return fetch(input, init) + } +} diff --git a/packages/auth/README.md b/packages/auth/README.md new file mode 100644 index 000000000..33f707235 --- /dev/null +++ b/packages/auth/README.md @@ -0,0 +1,4 @@ +@0xsequence/auth +================ + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/auth/hardhat.config.js b/packages/auth/hardhat.config.js new file mode 100644 index 000000000..eaca50531 --- /dev/null +++ b/packages/auth/hardhat.config.js @@ -0,0 +1,15 @@ +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: '0.7.6', + + networks: { + hardhat: { + chainId: 31337, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + } + } + } +} diff --git a/packages/auth/src/authorization.ts b/packages/auth/src/authorization.ts new file mode 100644 index 000000000..103c2b2a7 --- /dev/null +++ b/packages/auth/src/authorization.ts @@ -0,0 +1,81 @@ +import { ethers } from 'ethers' +import { ETHAuth, Proof } from '@0xsequence/ethauth' +import { ChainIdLike, toChainIdNumber } from '@0xsequence/network' +import { TypedData } from '@0xsequence/utils' +import { Signer } from '@0xsequence/wallet' +import { Account } from '@0xsequence/account' +import { DEFAULT_SESSION_EXPIRATION } from './services' + +export interface AuthorizationOptions { + // app name string, ie 'Skyweaver' + app?: string + + // origin hostname of encoded in the message, ie. 'play.skyweaver.net' + origin?: string + + // expiry in seconds encoded in the message + expiry?: number + + // nonce for the authorization request + nonce?: number +} + +export interface ETHAuthProof { + // eip712 typed-data payload for ETHAuth domain as input + typedData: TypedData + + // signature encoded in an ETHAuth proof string + proofString: string +} + +// signAuthorization will perform an EIP712 typed-data message signing of ETHAuth domain via the provided +// Signer and authorization options. +export const signAuthorization = async ( + signer: Signer | Account, + chainId: ChainIdLike, + options: AuthorizationOptions +): Promise => { + const address = ethers.utils.getAddress(await signer.getAddress()) + if (!address || address === '' || address === '0x') { + throw ErrAccountIsRequired + } + + const proof = new Proof() + proof.address = address + + if (!options || !options.app || options.app === '') { + throw new AuthError('authorization options requires app to be set') + } + proof.claims.app = options.app + proof.claims.ogn = options.origin + proof.claims.n = options.nonce + + proof.setExpiryIn(options.expiry ? Math.max(options.expiry, 200) : DEFAULT_SESSION_EXPIRATION) + + const typedData = proof.messageTypedData() + + const chainIdNumber = toChainIdNumber(chainId) + + proof.signature = await (signer instanceof Account + ? // Account can sign EIP-6492 signatures, so it doesn't require deploying the wallet + signer.signTypedData(typedData.domain, typedData.types, typedData.message, chainIdNumber, 'eip6492') + : signer.signTypedData(typedData.domain, typedData.types, typedData.message, chainIdNumber)) + + const ethAuth = new ETHAuth() + const proofString = await ethAuth.encodeProof(proof, true) + + return { + typedData, + proofString + } +} + +// TODO: review...... +export class AuthError extends Error { + constructor(message?: string) { + super(message) + this.name = 'AuthError' + } +} + +export const ErrAccountIsRequired = new AuthError('auth error: account address is empty') diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts new file mode 100644 index 000000000..af64af8df --- /dev/null +++ b/packages/auth/src/index.ts @@ -0,0 +1,3 @@ +export * from './authorization' +export * from './session' +export * from './proof' diff --git a/packages/auth/src/proof.ts b/packages/auth/src/proof.ts new file mode 100644 index 000000000..23051fde6 --- /dev/null +++ b/packages/auth/src/proof.ts @@ -0,0 +1,16 @@ +import { commons } from '@0xsequence/core' +import { Proof, ValidatorFunc } from '@0xsequence/ethauth' +import { tracker } from '@0xsequence/sessions' +import { ethers } from 'ethers' + +export const ValidateSequenceWalletProof = ( + readerFor: (chainId: number) => commons.reader.Reader, + tracker: tracker.ConfigTracker, + context: commons.context.WalletContext +): ValidatorFunc => { + return async (_provider: ethers.providers.JsonRpcProvider, chainId: number, proof: Proof): Promise<{ isValid: boolean }> => { + const digest = proof.messageDigest() + const isValid = await readerFor(chainId).isValidSignature(proof.address, digest, proof.signature) + return { isValid } + } +} diff --git a/packages/auth/src/services.ts b/packages/auth/src/services.ts new file mode 100644 index 000000000..6db53a216 --- /dev/null +++ b/packages/auth/src/services.ts @@ -0,0 +1,337 @@ +import { Account } from '@0xsequence/account' +import { SequenceAPIClient } from '@0xsequence/api' +import { ETHAuth, Proof } from '@0xsequence/ethauth' +import { Indexer, SequenceIndexer } from '@0xsequence/indexer' +import { SequenceMetadata } from '@0xsequence/metadata' +import { ChainIdLike, findNetworkConfig } from '@0xsequence/network' +import { getEthersConnectionInfo } from '@0xsequence/utils' +import { ethers } from 'ethers' + +export type SessionMeta = { + // name of the app requesting the session, used with ETHAuth + name: string + + // expiration in seconds for a session before it expires, used with ETHAuth + expiration?: number +} + +export type ServicesSettings = { + metadata: SessionMeta + sequenceApiUrl: string + sequenceApiChainId: ethers.BigNumberish + sequenceMetadataUrl: string +} + +export type SessionJWT = { + token: string + expiration: number +} + +export type SessionJWTPromise = { + token: Promise + expiration: number +} + +export type ProofStringPromise = { + proofString: Promise + expiration: number +} + +// Default session expiration of ETHAuth token (1 week) +export const DEFAULT_SESSION_EXPIRATION = 60 * 60 * 24 * 7 + +// Long session expiration of ETHAuth token (~1 year) +export const LONG_SESSION_EXPIRATION = 3e7 + +const EXPIRATION_JWT_MARGIN = 60 // seconds + +export class Services { + _initialAuthRequest: Promise + + // proof strings are indexed by account address and app name, see getProofStringKey() + private readonly proofStrings: Map = new Map() + + private onAuthCallbacks: ((result: PromiseSettledResult) => void)[] = [] + + private apiClient: SequenceAPIClient | undefined + private metadataClient: SequenceMetadata | undefined + private indexerClients: Map = new Map() + + private projectAccessKey?: string + + constructor( + public readonly account: Account, + public readonly settings: ServicesSettings, + public readonly status: { + jwt?: SessionJWTPromise + metadata?: SessionMeta + } = {}, + projectAccessKey?: string + ) { + this.projectAccessKey = projectAccessKey + } + + private now(): number { + return Math.floor(Date.now() / 1000) + } + + get expiration(): number { + return Math.max(this.settings.metadata.expiration ?? DEFAULT_SESSION_EXPIRATION, 120) + } + + onAuth(cb: (result: PromiseSettledResult) => void) { + this.onAuthCallbacks.push(cb) + return () => (this.onAuthCallbacks = this.onAuthCallbacks.filter(c => c !== cb)) + } + + async dump(): Promise<{ + jwt?: SessionJWT + metadata?: SessionMeta + }> { + if (!this.status.jwt) return { metadata: this.settings.metadata } + + return { + jwt: { + token: await this.status.jwt.token, + expiration: this.status.jwt.expiration + }, + metadata: this.status.metadata + } + } + + auth(maxTries: number = 5): Promise { + if (this._initialAuthRequest) return this._initialAuthRequest + + this._initialAuthRequest = (async () => { + const url = this.settings.sequenceApiUrl + if (!url) throw Error('No sequence api url') + + let jwtAuth: string | undefined + for (let i = 1; ; i++) { + try { + jwtAuth = (await this.getJWT(true)).token + break + } catch (error) { + if (i === maxTries) { + console.error(`couldn't authenticate after ${maxTries} attempts`, error) + throw error + } + } + } + + return new SequenceAPIClient(url, undefined, jwtAuth) + })() + + return this._initialAuthRequest + } + + private async getJWT(tryAuth: boolean): Promise { + const url = this.settings.sequenceApiUrl + if (!url) throw Error('No sequence api url') + + // check if we already have or are waiting for a token + if (this.status.jwt) { + const jwt = this.status.jwt + const token = await jwt.token + + if (this.now() < jwt.expiration) { + return { token, expiration: jwt.expiration } + } + + // token expired, delete it and get a new one + this.status.jwt = undefined + } + + if (!tryAuth) { + throw new Error('no auth token in memory') + } + + const proofStringKey = this.getProofStringKey() + const { proofString, expiration } = this.getProofString(proofStringKey) + + const jwt = { + token: proofString + .then(async proofString => { + const api = new SequenceAPIClient(url) + + const authResp = await api.getAuthToken({ ewtString: proofString }) + + if (authResp?.status === true && authResp.jwtToken.length !== 0) { + return authResp.jwtToken + } else { + if (!(await this.isProofStringValid(proofString))) { + this.proofStrings.delete(proofStringKey) + } + throw new Error('no auth token from server') + } + }) + .catch(reason => { + this.status.jwt = undefined + throw reason + }), + expiration + } + + this.status.jwt = jwt + + jwt.token + .then(token => { + this.onAuthCallbacks.forEach(cb => { + try { + cb({ status: 'fulfilled', value: token }) + } catch {} + }) + }) + .catch((reason: any) => { + this.onAuthCallbacks.forEach(cb => { + try { + cb({ status: 'rejected', reason }) + } catch {} + }) + }) + + const token = await jwt.token + return { token, expiration } + } + + private getProofStringKey(): string { + return `${this.account.address} - ${this.settings.metadata.name}` + } + + private async isProofStringValid(proofString: string): Promise { + try { + const ethAuth = new ETHAuth() + const chainId = ethers.BigNumber.from(this.settings.sequenceApiChainId) + const network = findNetworkConfig(this.account.networks, chainId) + if (!network) throw Error('No network found') + ethAuth.chainId = chainId.toNumber() + + // TODO: Modify ETHAuth so it can take a provider instead of a url + // ----- + // Can't pass jwt here since this is used for getting the jwt + ethAuth.provider = new ethers.providers.StaticJsonRpcProvider( + getEthersConnectionInfo(network.rpcUrl, this.projectAccessKey), + { + name: '', + chainId: chainId.toNumber() + } + ) + + await ethAuth.decodeProof(proofString) + + return true + } catch { + return false + } + } + + async getAPIClient(tryAuth: boolean = true): Promise { + if (!this.apiClient) { + const url = this.settings.sequenceApiUrl + if (!url) throw Error('No sequence api url') + + const jwtAuth = (await this.getJWT(tryAuth)).token + this.apiClient = new SequenceAPIClient(url, undefined, jwtAuth) + } + + return this.apiClient + } + + async getMetadataClient(tryAuth: boolean = true): Promise { + if (!this.metadataClient) { + const jwtAuth = (await this.getJWT(tryAuth)).token + this.metadataClient = new SequenceMetadata(this.settings.sequenceMetadataUrl, undefined, jwtAuth) + } + + return this.metadataClient + } + + async getIndexerClient(chainId: ChainIdLike, tryAuth: boolean = true): Promise { + const network = findNetworkConfig(this.account.networks, chainId) + if (!network) { + throw Error(`No network for chain ${chainId}`) + } + + if (!this.indexerClients.has(network.chainId)) { + if (network.indexer) { + this.indexerClients.set(network.chainId, network.indexer) + } else if (network.indexerUrl) { + const jwtAuth = (await this.getJWT(tryAuth)).token + this.indexerClients.set(network.chainId, new SequenceIndexer(network.indexerUrl, undefined, jwtAuth)) + } else { + throw Error(`No indexer url for chain ${chainId}`) + } + } + + return this.indexerClients.get(network.chainId)! + } + + private getProofString(key: string): ProofStringPromise { + // check if we already have or are waiting for a proof string + if (this.proofStrings.has(key)) { + const proofString = this.proofStrings.get(key)! + + if (this.now() < proofString.expiration) { + return proofString + } + + // proof string expired, delete it and make a new one + this.proofStrings.delete(key) + } + + const proof = new Proof({ + address: this.account.address + }) + + proof.claims.app = this.settings.metadata.name + if (typeof window === 'object') { + proof.claims.ogn = window.location.origin + } + proof.setExpiryIn(this.expiration) + + const ethAuth = new ETHAuth() + const chainId = ethers.BigNumber.from(this.settings.sequenceApiChainId) + const network = findNetworkConfig(this.account.networks, chainId) + if (!network) throw Error('No network found') + ethAuth.chainId = chainId.toNumber() + // TODO: Modify ETHAuth so it can take a provider instead of a url + // ----- + // Can't pass jwt here since this is used for getting the jwt + ethAuth.provider = new ethers.providers.StaticJsonRpcProvider( + getEthersConnectionInfo(network.rpcUrl, this.projectAccessKey), + { + name: '', + chainId: chainId.toNumber() + } + ) + + const expiration = this.now() + this.expiration - EXPIRATION_JWT_MARGIN + + const proofString = { + proofString: Promise.resolve( + // NOTICE: TODO: Here we ask the account to sign the message + // using whatever configuration we have ON-CHAIN, this means + // that the account will still use the v1 wallet, even if the migration + // was signed. + // + // This works for Sequence webapp v1 -> v2 because all v1 configurations share the same formula + // (torus + guard), but if we ever decide to allow cross-device login, then it will not work, because + // those other signers may not be part of the configuration. + // + this.account.signDigest(proof.messageDigest(), this.settings.sequenceApiChainId, true, 'eip6492') + ) + .then(s => { + proof.signature = s + return ethAuth.encodeProof(proof, true) + }) + .catch(reason => { + this.proofStrings.delete(key) + throw reason + }), + expiration + } + + this.proofStrings.set(key, proofString) + return proofString + } +} diff --git a/packages/auth/src/session.ts b/packages/auth/src/session.ts new file mode 100644 index 000000000..84820df9a --- /dev/null +++ b/packages/auth/src/session.ts @@ -0,0 +1,397 @@ +import { ChainId, NetworkConfig, allNetworks, findNetworkConfig } from '@0xsequence/network' +import { jwtDecodeClaims } from '@0xsequence/utils' +import { Account } from '@0xsequence/account' +import { ethers } from 'ethers' +import { tracker, trackers } from '@0xsequence/sessions' +import { Orchestrator, SignatureOrchestrator, signers } from '@0xsequence/signhub' +import { migrator } from '@0xsequence/migration' +import { commons, universal, v1 } from '@0xsequence/core' +import { Services, ServicesSettings, SessionJWT, SessionMeta } from './services' + +export interface SessionDumpV1 { + config: Omit & { address?: string } + jwt?: SessionJWT + metadata: SessionMeta +} + +export interface SessionDumpV2 { + version: 2 + address: string + jwt?: SessionJWT + metadata?: SessionMeta +} + +export function isSessionDumpV1(obj: any): obj is SessionDumpV1 { + return obj.config && obj.metadata && obj.version === undefined +} + +export function isSessionDumpV2(obj: any): obj is SessionDumpV2 { + return obj.version === 2 && obj.address +} + +// These chains are always validated for migrations +// if they are not available, the login will fail +export const CRITICAL_CHAINS = [1, 137] + +export type SessionSettings = { + services?: ServicesSettings + contexts: commons.context.VersionedContext + networks: NetworkConfig[] + tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker +} + +export const SessionSettingsDefault: SessionSettings = { + contexts: commons.context.defaultContexts, + networks: allNetworks, + tracker: new trackers.remote.RemoteConfigTracker('https://sessions.sequence.app') +} + +export class Session { + constructor( + public networks: NetworkConfig[], + public contexts: commons.context.VersionedContext, + public account: Account, + public services?: Services + ) {} + + async dump(): Promise { + const base = { + version: 2 as const, + address: this.account.address + } + + if (this.services) { + return { + ...base, + ...(await this.services.dump()) + } + } + + return base + } + + static async singleSigner(args: { + settings?: Partial + signer: ethers.Signer | signers.SapientSigner | string + selectWallet?: (wallets: string[]) => Promise + onAccountAddress?: (address: string) => void + onMigration?: (account: Account) => Promise + editConfigOnMigration?: (config: commons.config.Config) => commons.config.Config + projectAccessKey: string + }): Promise { + let { signer } = args + + if (typeof signer === 'string') { + signer = new ethers.Wallet(signer) + } + + const orchestrator = new Orchestrator([signer]) + const referenceSigner = await signer.getAddress() + const threshold = 1 + const addSigners = [ + { + weight: 1, + address: referenceSigner + } + ] + + const selectWallet = + args.selectWallet || + (async (wallets: string[]) => { + if (wallets.length === 0) return undefined + + // Find a wallet that was originally created + // as a 1/1 of the reference signer + const tracker = args.settings?.tracker ?? SessionSettingsDefault.tracker + + const configs = await Promise.all( + wallets.map(async wallet => { + const imageHash = await tracker.imageHashOfCounterfactualWallet({ wallet }) + + return { + wallet, + config: imageHash && (await tracker.configOfImageHash({ imageHash: imageHash.imageHash })) + } + }) + ) + + for (const config of configs) { + if (!config.config) { + continue + } + + const coder = universal.genericCoderFor(config.config.version) + const signers = coder.config.signersOf(config.config) + + if (signers.length === 1 && signers[0].address === referenceSigner) { + return config.wallet + } + } + + return undefined + }) + + return Session.open({ + ...args, + orchestrator, + referenceSigner, + threshold, + addSigners, + selectWallet + }) + } + + static async open(args: { + settings?: Partial + orchestrator: SignatureOrchestrator + addSigners?: commons.config.SimpleSigner[] + referenceSigner: string + threshold?: ethers.BigNumberish + selectWallet: (wallets: string[]) => Promise + onAccountAddress?: (address: string) => void + editConfigOnMigration?: (config: commons.config.Config) => commons.config.Config + onMigration?: (account: Account) => Promise + projectAccessKey?: string + }): Promise { + const { + referenceSigner, + threshold, + addSigners, + selectWallet, + onAccountAddress, + settings, + editConfigOnMigration, + onMigration, + orchestrator, + projectAccessKey + } = args + + const { contexts, networks, tracker, services } = { ...SessionSettingsDefault, ...settings } + + // The reference network is mainnet, if mainnet is not available, we use the first network + const referenceChainId = + findNetworkConfig(networks, settings?.services?.sequenceApiChainId ?? ChainId.MAINNET)?.chainId ?? networks[0]?.chainId + if (!referenceChainId) throw Error('No reference chain found') + + const foundWallets = await tracker.walletsOfSigner({ signer: referenceSigner }) + const selectedWallet = await selectWallet(foundWallets.map(w => w.wallet)) + + let account: Account + + if (selectedWallet) { + onAccountAddress?.(selectedWallet) + + // existing account, lets update it + account = new Account({ + address: selectedWallet, + tracker, + networks, + contexts, + orchestrator, + projectAccessKey + }) + + // Get the latest configuration of the wallet (on the reference chain) + // now this configuration should be of the latest version, so we can start + // manipulating it. + + // NOTICE: We are performing the wallet update on a single chain, assuming that + // all other networks have the same configuration. This is not always true. + if (addSigners && addSigners.length > 0) { + // New wallets never need migrations + // (because we create them on the latest version) + let status = await account.status(referenceChainId) + + // If the wallet was created originally on v2, then we can skip + // the migration checks all together. + if (status.original.version !== status.version || account.version !== status.version) { + // Account may not have been migrated yet, so we need to check + // if it has been migrated and if not, migrate it (in all chains) + const { migratedAllChains: isFullyMigrated, failedChains } = await account.isMigratedAllChains() + + // Failed chains must not contain mainnet or polygon, otherwise we cannot proceed. + if (failedChains.some(c => CRITICAL_CHAINS.includes(c))) { + throw Error(`Failed to fetch account status on ${failedChains.join(', ')}`) + } + + if (!isFullyMigrated) { + // This is an oportunity for whoever is opening the session to + // feed the orchestrator with more signers, so that the migration + // can be completed. + if (onMigration && !(await onMigration(account))) { + throw Error('Migration cancelled, cannot open session') + } + + const { failedChains } = await account.signAllMigrations(editConfigOnMigration || (c => c)) + if (failedChains.some(c => CRITICAL_CHAINS.includes(c))) { + throw Error(`Failed to sign migrations on ${failedChains.join(', ')}`) + } + + // If we are using a dedupped tracker we need to invalidate the cache + // otherwise we run the risk of not seeing the signed migrations reflected. + if (trackers.isDedupedTracker(tracker)) { + tracker.invalidateCache() + } + + let isFullyMigrated2: boolean + ;[isFullyMigrated2, status] = await Promise.all([ + account.isMigratedAllChains().then(r => r.migratedAllChains), + account.status(referenceChainId) + ]) + + if (!isFullyMigrated2) throw Error('Failed to migrate account') + } + } + + // NOTICE: We only need to do this because the API will not be able to + // validate the v2 signature (if the account has an onchain version of 1) + // we could speed this up by sending the migration alongside the jwt request + // and letting the API validate it offchain. + if (status.onChain.version !== status.version) { + await account.doBootstrap(referenceChainId, undefined, status) + } + + const prevConfig = status.config + const nextConfig = account.coders.config.editConfig(prevConfig, { + add: addSigners, + threshold + }) + + // Only update the onchain config if the imageHash has changed + if (account.coders.config.imageHashOf(prevConfig) !== account.coders.config.imageHashOf(nextConfig)) { + const newConfig = account.coders.config.editConfig(nextConfig, { + checkpoint: account.coders.config.checkpointOf(prevConfig).add(1) + }) + + await account.updateConfig(newConfig) + } + } + } else { + if (!addSigners || addSigners.length === 0) { + throw Error('Cannot create new account without signers') + } + + if (!threshold) { + throw Error('Cannot create new account without threshold') + } + + // fresh account + account = await Account.new({ + config: { threshold, checkpoint: 0, signers: addSigners }, + tracker, + contexts, + orchestrator, + networks, + projectAccessKey + }) + + onAccountAddress?.(account.address) + + // sign a digest and send it to the tracker + // otherwise the tracker will not know about this account + await account.publishWitness() + + // safety check, the remove tracker should be able to find + // this account for the reference signer + const foundWallets = await tracker.walletsOfSigner({ signer: referenceSigner, noCache: true }) + if (!foundWallets.some(w => w.wallet === account.address)) { + throw Error('Account not found on tracker') + } + } + + let servicesObj: Services | undefined + + if (services) { + servicesObj = new Services(account, services) + servicesObj.auth() // fire and forget + + servicesObj.onAuth(result => { + if (result.status === 'fulfilled') { + account.setJwt(result.value) + } + }) + } + + return new Session(networks, contexts, account, servicesObj) + } + + static async load(args: { + settings?: Partial + orchestrator: SignatureOrchestrator + dump: SessionDumpV1 | SessionDumpV2 + editConfigOnMigration: (config: commons.config.Config) => commons.config.Config + onMigration?: (account: Account) => Promise + }): Promise { + const { dump, settings, editConfigOnMigration, onMigration, orchestrator } = args + const { contexts, networks, tracker, services } = { ...SessionSettingsDefault, ...settings } + + let account: Account + + if (isSessionDumpV1(dump)) { + // Old configuration format used to also contain an "address" field + // but if it doesn't, it means that it was a "counterfactual" account + // not yet updated, so we need to compute the address + const oldAddress = + dump.config.address || + commons.context.addressOf(contexts[1], v1.config.ConfigCoder.imageHashOf({ ...dump.config, version: 1 })) + + const jwtExpired = (dump.jwt?.expiration ?? 0) < Math.floor(Date.now() / 1000) + + account = new Account({ + address: oldAddress, + tracker, + networks, + contexts, + orchestrator, + jwt: jwtExpired ? undefined : dump.jwt?.token + }) + + // TODO: This property may not hold if the user adds a new network + if (!(await account.isMigratedAllChains().then(r => r.migratedAllChains))) { + // This is an oportunity for whoever is opening the session to + // feed the orchestrator with more signers, so that the migration + // can be completed. + if (onMigration && !(await onMigration(account))) { + throw Error('Migration cancelled, cannot open session') + } + + console.log('Migrating account...') + await account.signAllMigrations(editConfigOnMigration) + if (!(await account.isMigratedAllChains().then(r => r.migratedAllChains))) throw Error('Failed to migrate account') + } + + // We may need to update the JWT if the account has been migrated + } else if (isSessionDumpV2(dump)) { + const jwtExpired = (dump.jwt?.expiration ?? 0) < Math.floor(Date.now() / 1000) + + account = new Account({ + address: dump.address, + tracker, + networks, + contexts, + orchestrator, + jwt: jwtExpired ? undefined : dump.jwt?.token + }) + } else { + throw Error('Invalid dump format') + } + + let servicesObj: Services | undefined + + if (services) { + servicesObj = new Services( + account, + services, + dump.jwt && { + jwt: { + token: Promise.resolve(dump.jwt.token), + expiration: dump.jwt.expiration ?? jwtDecodeClaims(dump.jwt.token).exp + }, + metadata: dump.metadata + } + ) + } + + return new Session(networks, contexts, account, servicesObj) + } +} diff --git a/packages/auth/tests/session.spec.ts b/packages/auth/tests/session.spec.ts new file mode 100644 index 000000000..8e0c4091d --- /dev/null +++ b/packages/auth/tests/session.spec.ts @@ -0,0 +1,1424 @@ +import { Account } from '@0xsequence/account' +import { commons, v1, v2 } from '@0xsequence/core' +import { ETHAuth, Proof } from '@0xsequence/ethauth' +import { migrator } from '@0xsequence/migration' +import { NetworkConfig } from '@0xsequence/network' +import { LocalRelayer } from '@0xsequence/relayer' +import { tracker, trackers } from '@0xsequence/sessions' +import { Orchestrator, SignatureOrchestrator } from '@0xsequence/signhub' +import * as utils from '@0xsequence/tests' +import { CallReceiverMock, HookCallerMock } from '@0xsequence/wallet-contracts' +import * as chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { ethers, Signer as AbstractSigner } from 'ethers' +import * as mockServer from 'mockttp' +import { Session, SessionDumpV1, SessionSettings, ValidateSequenceWalletProof } from '../src' +import { delay, mockDate } from './utils' + +const CallReceiverMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/CallReceiverMock.sol/CallReceiverMock.json') +const HookCallerMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/HookCallerMock.sol/HookCallerMock.json') + +const { expect } = chai.use(chaiAsPromised) + +const deterministic = false + +type EthereumInstance = { + chainId?: number + providerUrl?: string + provider?: ethers.providers.JsonRpcProvider + signer?: AbstractSigner +} + +class CountingSigner extends AbstractSigner { + private _signingRequests: number = 0 + + constructor(private readonly signer: AbstractSigner) { + super() + } + + get signingRequests(): number { + return this._signingRequests + } + + getAddress(): Promise { + return this.signer.getAddress() + } + + signMessage(message: ethers.Bytes | string): Promise { + this._signingRequests++ + return this.signer.signMessage(message) + } + + signTransaction(transaction: ethers.utils.Deferrable): Promise { + this._signingRequests++ + return this.signer.signTransaction(transaction) + } + + connect(provider: ethers.providers.Provider): ethers.Signer { + return this.signer.connect(provider) + } +} + +describe('Wallet integration', function () { + const ethnode: EthereumInstance = {} + + let relayer: LocalRelayer + let callReceiver: CallReceiverMock + let hookCaller: HookCallerMock + + let contexts: commons.context.VersionedContext + let networks: NetworkConfig[] + + let tracker: tracker.ConfigTracker & migrator.PresignedMigrationTracker + let orchestrator: SignatureOrchestrator + let simpleSettings: SessionSettings + + before(async () => { + // Provider from hardhat without a server instance + ethnode.providerUrl = `http://127.0.0.1:9546/` + ethnode.provider = new ethers.providers.JsonRpcProvider(ethnode.providerUrl) + + const chainId = (await ethnode.provider.getNetwork()).chainId + ethnode.signer = ethnode.provider.getSigner() + ethnode.chainId = chainId + + // Deploy local relayer + relayer = new LocalRelayer(ethnode.signer) + + networks = [ + { + name: 'local', + chainId, + provider: ethnode.provider, + isDefaultChain: true, + relayer, + rpcUrl: '', + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + } + ] as NetworkConfig[] + + contexts = await utils.context.deploySequenceContexts(ethnode.signer) + + // Deploy call receiver mock + callReceiver = (await new ethers.ContractFactory( + CallReceiverMockArtifact.abi, + CallReceiverMockArtifact.bytecode, + ethnode.signer + ).deploy()) as CallReceiverMock + + // Deploy hook caller mock + hookCaller = (await new ethers.ContractFactory( + HookCallerMockArtifact.abi, + HookCallerMockArtifact.bytecode, + ethnode.signer + ).deploy()) as HookCallerMock + + tracker = new trackers.local.LocalConfigTracker(ethnode.provider!) + orchestrator = new Orchestrator([]) + + simpleSettings = { + contexts, + networks, + tracker, + services: { + metadata: { + name: 'test' + }, + sequenceApiUrl: '', + sequenceApiChainId: chainId, + sequenceMetadataUrl: '' + } + } + }) + + it('Should open a new session', async () => { + const referenceSigner = randomWallet('Should open a new session') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + orchestrator, + settings: simpleSettings, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async ws => { + expect(ws.length).to.equal(0) + return undefined + }, + editConfigOnMigration: config => config + }) + + expect(session.account.address).to.not.equal(ethers.constants.AddressZero) + + const status = await session.account.status(networks[0].chainId) + + expect(v2.config.isWalletConfig(status.config)).to.equal(true) + const configv2 = status.config as v2.config.WalletConfig + + expect(ethers.BigNumber.from(configv2.threshold)).to.deep.equal(ethers.BigNumber.from(1)) + expect(v2.config.isSignerLeaf(configv2.tree)).to.equal(true) + + const leaf = configv2.tree as v2.config.SignerLeaf + expect(leaf.address).to.equal(referenceSigner.address) + expect(ethers.BigNumber.from(leaf.weight)).to.deep.equal(ethers.BigNumber.from(1)) + + await session.account.sendTransaction({ to: referenceSigner.address }, networks[0].chainId) + }) + + it('Should dump and load a session', async () => { + const referenceSigner = randomWallet('Should dump and load a session') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async ws => { + expect(ws.length).to.equal(0) + return undefined + }, + editConfigOnMigration: config => config + }) + + const dump = await session.dump() + + const session2 = await Session.load({ + settings: simpleSettings, + orchestrator, + dump, + editConfigOnMigration: config => config + }) + + await session.account.sendTransaction({ to: referenceSigner.address }, networks[0].chainId) + + expect(session.account.address).to.equal(session2.account.address) + }) + + it('Should open an existing session', async () => { + const referenceSigner = randomWallet('Should open an existing session') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async ws => ws[0] ?? undefined, + editConfigOnMigration: config => config + }) + + const newSigner = randomWallet('Should open an existing session 2') + const session2 = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner.address, weight: 1 }], + threshold: 2, + selectWallet: async ws => { + expect(ws.length).to.equal(1) + return ws[0] + }, + editConfigOnMigration: config => config + }) + + const newConfig = (await session2.account.status(networks[0].chainId).then(s => s.config)) as v2.config.WalletConfig + + expect(session2.account.address).to.equal(session.account.address) + expect(ethers.BigNumber.from(newConfig.threshold)).to.deep.equal(ethers.BigNumber.from(2)) + + const newSigners = v2.config.signersOf(newConfig.tree).map(s => s.address) + expect(newSigners.length).to.equal(2) + expect(newSigners).to.include(newSigner.address) + expect(newSigners).to.include(referenceSigner.address) + expect(ethers.BigNumber.from((newConfig.tree as any).left.weight)).to.deep.equal(ethers.BigNumber.from(1)) + expect(ethers.BigNumber.from((newConfig.tree as any).right.weight)).to.deep.equal(ethers.BigNumber.from(1)) + }) + + it('Should create a new account if selectWallet returns undefined', async () => { + const referenceSigner = randomWallet('Should create a new account if selectWallet returns undefined') + orchestrator.setSigners([referenceSigner]) + + const oldSession = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const newSigner = randomWallet('Should create a new account if selectWallet returns undefined 2') + const newSession = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [ + { address: referenceSigner.address, weight: 1 }, + { address: newSigner.address, weight: 1 } + ], + threshold: 1, + selectWallet: async wallets => { + expect(wallets.length).to.equal(1) + return undefined + }, + editConfigOnMigration: config => config + }) + + expect(newSession.account.address).to.not.equal(oldSession.account.address) + }) + + it('Should select between two wallets using selectWallet', async () => { + const referenceSigner = randomWallet('Should select between two wallets using selectWallet') + orchestrator.setSigners([referenceSigner]) + + const oldSession1 = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const oldSession2 = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 2 }], + threshold: 2, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const newSigner = randomWallet('Should select between two wallets using selectWallet 2') + const newSession1 = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async wallets => { + expect(wallets.length).to.equal(2) + expect(wallets).to.include(oldSession1.account.address) + expect(wallets).to.include(oldSession2.account.address) + return oldSession1.account.address + }, + editConfigOnMigration: config => config + }) + + expect(newSession1.account.address).to.equal(oldSession1.account.address) + + const newSession2 = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async wallets => { + expect(wallets.length).to.equal(2) + expect(wallets).to.include(oldSession1.account.address) + expect(wallets).to.include(oldSession2.account.address) + return oldSession2.account.address + }, + editConfigOnMigration: config => config + }) + + expect(newSession2.account.address).to.equal(oldSession2.account.address) + + await newSession1.account.sendTransaction([], networks[0].chainId) + await newSession2.account.sendTransaction([], networks[0].chainId) + }) + + it('Should re-open a session after sending a transaction', async () => { + const referenceSigner = randomWallet('Should re-open a session after sending a transaction') + const signer1 = randomWallet('Should re-open a session after sending a transaction 2') + orchestrator.setSigners([referenceSigner, signer1]) + + const session = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [ + { + address: referenceSigner.address, + weight: 1 + }, + { + address: signer1.address, + weight: 1 + } + ], + threshold: 2, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await session.account.sendTransaction([], networks[0].chainId) + + const signer2 = randomWallet('Should re-open a session after sending a transaction 3') + + const newSession = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: signer2.address, weight: 1 }], + threshold: 2, + selectWallet: async wallets => { + expect(wallets.length).to.equal(1) + return wallets[0] + }, + editConfigOnMigration: config => config + }) + + expect(newSession.account.address).to.equal(session.account.address) + + await newSession.account.sendTransaction([], networks[0].chainId) + }) + + describe('Migrate sessions', () => { + let ogAccount: Account + let referenceSigner: ethers.Wallet + let referenceSignerIndex = 1 + let v1SessionDump: SessionDumpV1 + + beforeEach(async () => { + // Create a wallet using v1 + referenceSigner = randomWallet(`Migrate sessions ${referenceSignerIndex++}`) + orchestrator.setSigners([referenceSigner]) + + ogAccount = await Account.new({ + config: { threshold: 1, checkpoint: 0, signers: [{ address: referenceSigner.address, weight: 1 }] }, + tracker, + contexts: { 1: contexts[1] }, + orchestrator, + networks, + migrations: { + 0: { + version: 1, + configCoder: v1.config.ConfigCoder, + signatureCoder: v1.signature.SignatureCoder + } as any + } + }) + + await ogAccount.publishWitness() + + v1SessionDump = { + config: { + threshold: 1, + signers: [{ address: referenceSigner.address, weight: 1 }] + }, + metadata: { + name: 'Test' + } + } + }) + + it('Should open and migrate old session, without dump', async () => { + const newSigner = randomWallet('Should open and migrate old session, without dump') + orchestrator.setSigners([referenceSigner, newSigner]) + + const newSession = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async wallets => { + expect(wallets.length).to.equal(1) + return wallets[0] + }, + editConfigOnMigration: config => config + }) + + expect(newSession.account.address).to.equal(ogAccount.address) + const status = await newSession.account.status(networks[0].chainId) + expect(status.version).to.equal(2) + expect(status.fullyMigrated).to.be.true + + await newSession.account.sendTransaction([], networks[0].chainId) + }) + + it('Should open and migrate dump', async () => { + const newSession = await Session.load({ + settings: simpleSettings, + orchestrator, + dump: v1SessionDump, + editConfigOnMigration: config => config + }) + + expect(newSession.account.address).to.equal(ogAccount.address) + + const status = await newSession.account.status(networks[0].chainId) + expect(status.version).to.equal(2) + expect(status.fullyMigrated).to.be.true + + await newSession.account.sendTransaction([], networks[0].chainId) + }) + + describe('After updating old wallet', () => { + let newSignerIndex = 1 + + beforeEach(async () => { + const status = await ogAccount.status(networks[0].chainId) + const wallet = ogAccount.walletForStatus(networks[0].chainId, status) + + const newSigner = randomWallet(`After updating old wallet ${newSignerIndex++}`) + orchestrator.setSigners([referenceSigner, newSigner]) + + const uptx = await wallet.buildUpdateConfigurationTransaction({ + threshold: 2, + signers: [ + { address: referenceSigner.address, weight: 1 }, + { address: newSigner.address, weight: 1 } + ] + } as v1.config.WalletConfig) + + const suptx = await wallet.signTransactionBundle(uptx) + await wallet.relayer?.relay(suptx) + + v1SessionDump = { + ...v1SessionDump, + config: { + ...v1SessionDump.config, + address: wallet.address + } + } + }) + + it('Should open and migrate old session', async () => { + const newSigner2 = randomWallet('Should open and migrate old session') + + const newSession = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner2.address, weight: 1 }], + threshold: 2, + selectWallet: async wallets => { + expect(wallets.length).to.equal(1) + return wallets[0] + }, + editConfigOnMigration: config => config + }) + + expect(newSession.account.address).to.equal(ogAccount.address) + const status = await newSession.account.status(networks[0].chainId) + expect(status.version).to.equal(2) + expect(status.fullyMigrated).to.be.true + + orchestrator.setSigners([referenceSigner, newSigner2]) + await newSession.account.sendTransaction([], networks[0].chainId) + }) + + it('Should open and migrate dump', async () => { + const newSession = await Session.load({ + settings: simpleSettings, + orchestrator, + dump: v1SessionDump, + editConfigOnMigration: config => config + }) + + expect(newSession.account.address).to.equal(ogAccount.address) + + const status = await newSession.account.status(networks[0].chainId) + expect(status.version).to.equal(2) + expect(status.fullyMigrated).to.be.true + + await newSession.account.sendTransaction([], networks[0].chainId) + }) + }) + }) + + describe('JWT Auth', () => { + let server: mockServer.Mockttp + let fakeJwt: string + let fakeJwtIndex = 1 + let proofAddress: string + + let delayMs: number = 0 + let totalCount: number = 0 + let recoverCount: { [address: string]: number } = {} + + let alwaysFail: boolean = false + + const sequenceApiUrl = 'http://127.0.0.1:8099' + let settings: SessionSettings + + beforeEach(() => { + settings = { + ...simpleSettings, + services: { + ...simpleSettings.services!, + sequenceApiUrl + } + } + + fakeJwt = ethers.utils.hexlify(randomBytes(64, `JWT Auth ${fakeJwtIndex++}`)) + + server = mockServer.getLocal() + server.start(8099) + server.forPost('/rpc/API/GetAuthToken').thenCallback(async request => { + if (delayMs !== 0) await delay(delayMs) + + const validator = ValidateSequenceWalletProof( + () => new commons.reader.OnChainReader(networks[0].provider!), + tracker, + contexts[2] + ) + + const ethauth = new ETHAuth(validator) + + ethauth.chainId = ethnode.chainId! + ethauth.configJsonRpcProvider(ethnode.providerUrl!) + + totalCount++ + + if (alwaysFail) return { statusCode: 400 } + + try { + const proof = await ethauth.decodeProof((await request.body.getJson())!['ewtString']) + proofAddress = ethers.utils.getAddress(proof.address) + + if (recoverCount[proofAddress]) { + recoverCount[proofAddress]++ + } else { + recoverCount[proofAddress] = 1 + } + + return { + statusCode: 200, + body: JSON.stringify({ + status: true, + jwtToken: fakeJwt + }) + } + } catch { + if (recoverCount['error']) { + recoverCount['error']++ + } else { + recoverCount['error'] = 1 + } + + return { + statusCode: 401 + } + } + }) + }) + + afterEach(() => { + server.stop() + delayMs = 0 + totalCount = 0 + recoverCount = {} + alwaysFail = false + }) + + it('Should get JWT token', async () => { + const referenceSigner = randomWallet('Should get JWT token') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await session.services?.auth() + expect(totalCount).to.equal(1) + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + expect(proofAddress).to.equal(session.account.address) + }) + + it('Should get JWT after updating session', async () => { + const referenceSigner = randomWallet('Should get JWT after updating session') + orchestrator.setSigners([referenceSigner]) + + await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const newSigner = randomWallet('Should get JWT after updating session 2') + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async ws => ws[0], + editConfigOnMigration: config => config + }) + + await session.services?.auth() + + expect(totalCount).to.equal(1) + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + expect(proofAddress).to.equal(session.account.address) + }) + + it('Should get JWT during first session creation', async () => { + const referenceSigner = randomWallet('Should get JWT during first session creation') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await session.services?._initialAuthRequest + + expect(totalCount).to.equal(1) + expect(recoverCount[session.account.address]).to.equal(1) + + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + }) + + it('Should get JWT during session opening', async () => { + delayMs = 500 + + const referenceSigner = randomWallet('Should get JWT during session opening - 1') + orchestrator.setSigners([referenceSigner]) + + let session = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await expect(session.services?._initialAuthRequest).to.be.rejected + + const newSigner = randomWallet('Should get JWT during session opening 2') + orchestrator.setSigners([referenceSigner, newSigner]) + + session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner.address, weight: 1 }], + threshold: 2, + selectWallet: async ws => { + expect(ws.length).to.equal(1) + return ws[0] + }, + editConfigOnMigration: config => config + }) + + await session.services?._initialAuthRequest + + expect(totalCount).to.equal(1) + expect(recoverCount[session.account.address]).to.equal(1) + + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + }) + + it('Should get API with lazy JWT during first session creation', async () => { + const referenceSigner = randomWallet('Should get API with lazy JWT during first session creation') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const api = await session.services?.getAPIClient() + + expect(totalCount).to.equal(1) + expect(recoverCount[session.account.address]).to.equal(1) + + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + + server.forPost('/rpc/API/FriendList').thenCallback(async request => { + const hasToken = request.headers['authorization']!.includes(fakeJwt) + return { statusCode: hasToken ? 200 : 401, body: JSON.stringify({}) } + }) + + await api!.friendList({ page: {} }) + }) + + it('Should get API with lazy JWT during session opening', async () => { + delayMs = 500 + const referenceSigner = randomWallet('Should get API with lazy JWT during session opening') + orchestrator.setSigners([referenceSigner]) + + await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const newSigner = randomWallet('Should get API with lazy JWT during session opening 2') + orchestrator.setSigners([referenceSigner, newSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner.address, weight: 1 }], + threshold: 2, + selectWallet: async ws => ws[0], + editConfigOnMigration: config => config + }) + + const api = await session.services?.getAPIClient() + + expect(totalCount).to.equal(1) + expect(recoverCount[session.account.address]).to.equal(1) + + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + + server.forPost('/rpc/API/FriendList').thenCallback(async request => { + const hasToken = request.headers['authorization']!.includes(fakeJwt) + return { statusCode: hasToken ? 200 : 401, body: JSON.stringify({}) } + }) + + await api!.friendList({ page: {} }) + }) + + it('Should call callbacks on JWT token', async () => { + const referenceSigner = randomWallet('Should call callbacks on JWT token') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + let calledCallback = 0 + session.services?.onAuth(() => calledCallback++) + + await session.services?._initialAuthRequest + + expect(calledCallback).to.equal(1) + }) + + it('Should call callbacks on JWT token (on open only once)', async () => { + delayMs = 500 + + const referenceSigner = randomWallet('Should call callbacks on JWT token (on open only once)') + orchestrator.setSigners([referenceSigner]) + + await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const newSigner = randomWallet('Should call callbacks on JWT token (on open only once) 2') + orchestrator.setSigners([referenceSigner, newSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [ + { address: referenceSigner.address, weight: 1 }, + { address: newSigner.address, weight: 1 } + ], + threshold: 2, + selectWallet: async ws => ws[0], + editConfigOnMigration: config => config + }) + + let calledCallback = 0 + session.services?.onAuth(() => calledCallback++) + + await session.services?._initialAuthRequest + + expect(calledCallback).to.equal(1) + }) + + it('Should retry 5 times retrieving the JWT token', async () => { + delayMs = 1000 + const referenceSigner = randomWallet('Should retry 5 times retrieving the JWT token') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + alwaysFail = true + await expect(session.services?.auth()).to.be.rejected + expect(totalCount).to.equal(5) + expect(session.services?.status.jwt).to.be.undefined + }) + + it('Should get API with JWT already present', async () => { + delayMs = 500 + + const referenceSigner = randomWallet('Should get API with JWT already present') + orchestrator.setSigners([referenceSigner]) + + await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const newSigner = randomWallet('Should get API with JWT already present 2') + orchestrator.setSigners([referenceSigner, newSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: newSigner.address, weight: 1 }], + threshold: 2, + selectWallet: async ws => ws[0], + editConfigOnMigration: config => config + }) + + await session.services?._initialAuthRequest + const totalCountBefore = totalCount + + // This should use the already existing JWT + const api = await session.services?.getAPIClient() + + expect(totalCount).to.equal(totalCountBefore) + expect(recoverCount[session.account.address]).to.equal(1) + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + + server.forPost('/rpc/API/FriendList').thenCallback(async request => { + const hasToken = request.headers['authorization']!.includes(fakeJwt) + return { statusCode: hasToken ? 200 : 401, body: JSON.stringify({}) } + }) + + await api!.friendList({ page: {} }) + }) + + it('Should fail to get API with false tryAuth and no JWT', async () => { + const referenceSigner = randomWallet('Should fail to get API with false tryAuth and no JWT') + orchestrator.setSigners([referenceSigner]) + + alwaysFail = true + + const session = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await expect(session.services?._initialAuthRequest).to.be.rejected + + alwaysFail = false + + const apiPromise = session.services?.getAPIClient(false) + + await expect(apiPromise).to.be.rejected + + expect(totalCount).to.equal(0) + expect(session.services?.status.jwt).to.be.undefined + }) + + it('Should fail to get API without api url', async () => { + const referenceSigner = randomWallet('Should fail to get API without api url') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + const apiPromise = session.services?.getAPIClient() + + await expect(apiPromise).to.be.rejected + + expect(totalCount).to.equal(0) + expect(session.services?.status.jwt?.token).to.be.undefined + }) + + it('Should fail to get JWT with no api configured', async () => { + const referenceSigner = randomWallet('Should fail to get JWT with no api configured') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: simpleSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await expect(session.services?.auth()).to.be.rejected + + expect(totalCount).to.equal(0) + expect(session.services?.status.jwt?.token).to.be.undefined + }) + + it('Should reuse outstanding JWT requests', async () => { + const referenceSigner = new CountingSigner(randomWallet('Should reuse outstanding JWT requests')) + orchestrator.setSigners([referenceSigner]) + + alwaysFail = true + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: await referenceSigner.getAddress(), + addSigners: [{ address: await referenceSigner.getAddress(), weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + // 1 signing request is made to publish signers + expect(referenceSigner.signingRequests).to.equal(1) + + const signingRequestsBefore = referenceSigner.signingRequests + + await expect(session.services?._initialAuthRequest).to.be.rejected + + alwaysFail = false + totalCount = 0 + + // Create a bunch of API clients concurrently + const requests: any[] = [] + while (requests.length < 10) { + requests.push(session.services?.getAPIClient()) + } + await expect(Promise.all(requests)).to.be.fulfilled + + expect(totalCount).to.equal(1) + expect(referenceSigner.signingRequests).to.equal(signingRequestsBefore + 1) + }) + + it('Should reuse existing proof signatures', async () => { + const referenceSigner = new CountingSigner(randomWallet('Should reuse existing proof signatures')) + orchestrator.setSigners([referenceSigner]) + + alwaysFail = true + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: await referenceSigner.getAddress(), + addSigners: [{ address: await referenceSigner.getAddress(), weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + // 1 signing request is made to publish signers + expect(referenceSigner.signingRequests).to.equal(1) + + const signingRequestsBefore = referenceSigner.signingRequests + + await expect(session.services?._initialAuthRequest).to.be.rejected + + totalCount = 0 + + // Create a bunch of API clients sequentially + for (let i = 0; i < 10; i++) { + await expect(session.services?.getAPIClient()).to.be.rejected + } + + expect(totalCount).to.equal(10) + expect(referenceSigner.signingRequests).to.equal(signingRequestsBefore + 1) + }) + + it('Should neither re-authenticate nor retry if request succeeds', async () => { + const referenceSigner = new CountingSigner(randomWallet('Should neither re-authenticate nor retry if request succeeds')) + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings, + orchestrator, + referenceSigner: await referenceSigner.getAddress(), + addSigners: [{ address: await referenceSigner.getAddress(), weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await session.services?._initialAuthRequest + + const api = await session.services?.getAPIClient() + + const okResponses = [true] + server.forPost('/rpc/API/FriendList').thenCallback(async () => { + return { statusCode: okResponses.shift() ? 200 : 401, body: JSON.stringify({}) } + }) + + totalCount = 0 + + await expect(api!.friendList({ page: {} })).to.be.fulfilled + + // no re-authentication since it succeeded + expect(totalCount).to.equal(0) + }) + + describe('With expiration', () => { + let resetDateMock: Function | undefined + + const setDate = (seconds: number) => { + if (resetDateMock) resetDateMock() + const newMockDate = new Date() + newMockDate.setTime(seconds * 1000) + resetDateMock = mockDate(newMockDate) + } + + afterEach(() => { + if (resetDateMock) resetDateMock() + }) + + it('Should request a new JWT after expiration', async () => { + const baseTime = 1613579057 + setDate(baseTime) + + const referenceSigner = randomWallet('Should request a new JWT after expiration') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: { + ...settings, + services: { + ...settings.services!, + metadata: { + name: 'Test', + expiration: 240 + } + } + }, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await session.services?._initialAuthRequest + + expect(totalCount).to.equal(1) + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + expect(session.services?.status.jwt?.expiration).to.equal(baseTime + 240 - 60) + + // Force expire (1 hour) + const newBaseTime = baseTime + 60 * 60 + setDate(newBaseTime) + + fakeJwt = ethers.utils.hexlify(randomBytes(96, 'Should request a new JWT after expiration 2')) + + await session.services?.getAPIClient() + + expect(totalCount).to.equal(2) + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + expect(session.services?.status.jwt?.expiration).to.equal(newBaseTime + 240 - 60) + }) + + it('Should force min expiration time', async () => { + const baseTime = 1613579057 + setDate(baseTime) + + const referenceSigner = randomWallet('Should force min expiration time') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: { + ...settings, + services: { + ...settings.services!, + metadata: { + name: 'Test', + expiration: 1 + } + } + }, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => undefined, + editConfigOnMigration: config => config + }) + + await session.services?._initialAuthRequest + + expect(totalCount).to.equal(1) + expect(await session.services?.status.jwt?.token).to.equal(fakeJwt) + expect(session.services?.status.jwt?.expiration).to.equal(baseTime + 120 - 60) + }) + }) + }) + + describe('ETHAuth proof validation', () => { + it('Should validate an ETHAuth signature by an undeployed wallet', async () => { + const signer = randomWallet('Should validate an ETHAuth signature by an undeployed wallet') + const config = { + threshold: 1, + checkpoint: Math.floor(now() / 1000), + signers: [{ address: signer.address, weight: 1 }] + } + const account = await Account.new({ + config, + tracker, + contexts, + orchestrator: new Orchestrator([signer]), + networks + }) + + // begin by setting the parameters of the ETHAuth proof + const proof = new Proof({ address: account.address }) + proof.claims.app = 'Should validate an ETHAuth signature by an undeployed wallet' + proof.claims.iat = Math.floor(now() / 1000) // seconds since epoch, or better yet, proof.setIssuedAtNow() + proof.claims.exp = proof.claims.iat + 3600 // seconds since epoch, or better yet, proof.setExpiryIn(3600) + + // create an EIP-6492-compatible ETHAuth proof signature of the proof's message digest + proof.signature = await account.signDigest(proof.messageDigest(), ethnode.chainId!, true, 'eip6492') + // an EIP-6492 signature for an undeployed wallet always ends with the EIP-6492 suffix + expect(proof.signature.endsWith(commons.EIP6492.EIP_6492_SUFFIX.slice(2))).to.be.true + + // create an EIP-6492-aware ETHAuth proof validator + const validator = ValidateSequenceWalletProof( + () => new commons.reader.OnChainReader(ethnode.provider!), + tracker, + contexts[2] + ) + const ethauth = new ETHAuth(validator) + await ethauth.configJsonRpcProvider(ethnode.providerUrl!) + + // proofs can be encoded to and decoded from strings like so + const proofString = await ethauth.encodeProof(proof) + const decodedProof = await ethauth.decodeProof(proofString) + + // decoded proofs can be validated like so + expect(ethauth.validateProof(decodedProof)).to.eventually.be.true + }) + }) + describe('session without services', () => { + let noServiceSettings: SessionSettings + + before(() => { + noServiceSettings = { + ...simpleSettings, + services: undefined + } + }) + + it('should open a session without services', async () => { + const referenceSigner = randomWallet('should open a session without services') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: noServiceSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => { + return undefined + }, + editConfigOnMigration: config => config + }) + + expect(session.services).to.be.undefined + }) + + it('should dump a session without services', async () => { + const referenceSigner = randomWallet('should dump a session without services') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: noServiceSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => { + return undefined + }, + editConfigOnMigration: config => config + }) + + const dump = await session.dump() + expect(dump).to.not.be.undefined + expect(dump.jwt).to.be.undefined + expect(dump.metadata).to.be.undefined + }) + + it('should load dump without services', async () => { + const referenceSigner = randomWallet('should load dump without services') + orchestrator.setSigners([referenceSigner]) + + const session = await Session.open({ + settings: noServiceSettings, + orchestrator, + referenceSigner: referenceSigner.address, + addSigners: [{ address: referenceSigner.address, weight: 1 }], + threshold: 1, + selectWallet: async () => { + return undefined + }, + editConfigOnMigration: config => config + }) + + const dump = await session.dump() + const newSession = await Session.load({ + orchestrator, + settings: noServiceSettings, + dump: dump, + editConfigOnMigration: config => config + }) + + expect(newSession.services).to.be.undefined + }) + }) + + describe('single signer session', () => { + it('should create a new single signer session', async () => { + const signer = randomWallet('should create a new single signer session') + + const session = await Session.singleSigner({ + settings: simpleSettings, + signer: signer + }) + + expect(session.account.address).to.not.be.undefined + + const status = await session.account.status(networks[0].chainId) + const config = status.config as v2.config.WalletConfig + + expect(config.threshold).to.equal(1) + expect(v2.config.isSignerLeaf(config.tree)).to.be.true + expect(config.tree as v2.config.SignerLeaf).to.deep.equal({ + weight: 1, + address: signer.address + }) + }) + + it('should open same single signer session twice', async () => { + const signer = randomWallet('should open same single signer session twice') + + const session1 = await Session.singleSigner({ + settings: simpleSettings, + signer: signer + }) + + const address1 = session1.account.address + const status1 = await session1.account.status(networks[0].chainId) + + const session2 = await Session.singleSigner({ + settings: simpleSettings, + signer: signer + }) + + const address2 = session2.account.address + const status2 = await session2.account.status(networks[0].chainId) + + expect(address1).to.equal(address2) + + // should not change the config! + expect(status1.config).to.deep.equal(status2.config) + }) + + it('should send a transaction from a single signer session', async () => { + const signer = randomWallet('should send a transaction from a single signer session') + + const session = await Session.singleSigner({ + settings: simpleSettings, + signer: signer + }) + + const receipt = await session.account.sendTransaction( + { + to: ethers.Wallet.createRandom().address + }, + networks[0].chainId + ) + + expect(receipt.hash).to.not.be.undefined + }) + }) +}) + +let nowCalls = 0 +function now(): number { + if (deterministic) { + return Date.parse('2023-02-14T00:00:00.000Z') + 1000 * nowCalls++ + } else { + return Date.now() + } +} + +function randomWallet(entropy: number | string): ethers.Wallet { + return new ethers.Wallet(randomBytes(32, entropy)) +} + +function randomBytes(length: number, entropy: number | string): Uint8Array { + if (deterministic) { + let bytes = '' + while (bytes.length < 2 * length) { + bytes += ethers.utils.id(`${bytes}${entropy}`).slice(2) + } + return ethers.utils.arrayify(`0x${bytes.slice(0, 2 * length)}`) + } else { + return ethers.utils.randomBytes(length) + } +} diff --git a/packages/auth/tests/utils/index.ts b/packages/auth/tests/utils/index.ts new file mode 100644 index 000000000..8c4c6f999 --- /dev/null +++ b/packages/auth/tests/utils/index.ts @@ -0,0 +1,33 @@ +export function delay(time: number): Promise { + return new Promise(solve => setTimeout(solve, time)) +} + +/** + * @param {Date} expected The date to which we want to freeze time + * @returns {Function} Call to remove Date mocking + */ +export const mockDate = (expected: Date): (() => void) => { + const _Date = Date + + // If any Date or number is passed to the constructor + // use that instead of our mocked date + function MockDate(mockOverride?: Date | number) { + return new _Date(mockOverride || expected) + } + + MockDate.UTC = _Date.UTC + MockDate.parse = _Date.parse + MockDate.now = () => expected.getTime() + // Give our mock Date has the same prototype as Date + // Some libraries rely on this to identify Date objects + MockDate.prototype = _Date.prototype + + // Our mock is not a full implementation of Date + // Types will not match but it's good enough for our tests + global.Date = MockDate as any + + // Callback function to remove the Date mock + return () => { + global.Date = _Date + } +} diff --git a/packages/core/src/commons/config.ts b/packages/core/src/commons/config.ts new file mode 100644 index 000000000..2529b8f82 --- /dev/null +++ b/packages/core/src/commons/config.ts @@ -0,0 +1,67 @@ +import { ethers } from 'ethers' +import { WalletContext } from './context' +import * as transaction from './transaction' + +export type Config = { + version: number +} + +export type SimpleSigner = { address: string; weight: ethers.BigNumberish } + +export type SimpleConfig = { + threshold: ethers.BigNumberish + checkpoint: ethers.BigNumberish + signers: SimpleSigner[] + subdigests?: string[] +} + +export interface ConfigCoder { + imageHashOf: (config: T) => string + hasSubdigest: (config: T, subdigest: string) => boolean + + isWalletConfig: (config: Config) => config is T + + checkpointOf: (config: T) => ethers.BigNumber + + fromSimple: (config: SimpleConfig) => T + + signersOf: (config: T) => { address: string; weight: number }[] + + toJSON: (config: T) => string + fromJSON: (json: string) => T + + isComplete: (config: T) => boolean + + editConfig: ( + config: T, + action: { + add?: SimpleSigner[] + remove?: string[] + threshold?: ethers.BigNumberish + checkpoint?: ethers.BigNumberish + } + ) => T + + buildStubSignature: (config: T, overrides: Map) => string + + // isValid: (config: T) => boolean + + // TODO: This may not be the best place for this + // maybe it could go in the migration classes? + update: { + isKindUsed: boolean + + buildTransaction: ( + address: string, + config: T, + context: WalletContext, + kind?: 'first' | 'later' | undefined + ) => transaction.TransactionBundle + + decodeTransaction: (tx: transaction.TransactionBundle) => { + address: string + newImageHash: string + kind: 'first' | 'later' | undefined + } + } +} diff --git a/packages/core/src/commons/context.ts b/packages/core/src/commons/context.ts new file mode 100644 index 000000000..9868e42a3 --- /dev/null +++ b/packages/core/src/commons/context.ts @@ -0,0 +1,112 @@ +import { ethers } from 'ethers' +import { allVersions } from '..' + +import { DeployedWalletContext as context1 } from '../v1' +import { DeployedWalletContext as context2 } from '../v2' + +export type WalletContext = { + version: number + factory: string + mainModule: string + mainModuleUpgradable: string + guestModule: string + + walletCreationCode: string +} + +export function addressOf(context: WalletContext, imageHash: ethers.BytesLike) { + const codeHash = ethers.utils.keccak256( + ethers.utils.solidityPack(['bytes', 'bytes32'], [context.walletCreationCode, ethers.utils.hexZeroPad(context.mainModule, 32)]) + ) + + const hash = ethers.utils.keccak256( + ethers.utils.solidityPack(['bytes1', 'address', 'bytes32', 'bytes32'], ['0xff', context.factory, imageHash, codeHash]) + ) + + return ethers.utils.getAddress(ethers.utils.hexDataSlice(hash, 12)) +} + +export async function isValidCounterfactual( + wallet: string, + digest: ethers.BytesLike, + signature: ethers.BytesLike, + chainId: ethers.BigNumberish, + provider: ethers.providers.Provider, + contexts: { [key: number]: WalletContext } +) { + // We don't know the version of the signature + // so we need to try all of them + const res = await Promise.all( + allVersions.map(async version => { + try { + const decoded = version.signature.SignatureCoder.decode(ethers.utils.hexlify(signature)) + + const recovered1 = await version.signature.SignatureCoder.recover( + decoded as any, + { + address: wallet, + digest: ethers.utils.hexlify(digest), + chainId + }, + provider + ) + + const imageHash = version.config.ConfigCoder.imageHashOf(recovered1.config as any) + const counterfactualAddress = addressOf(contexts[version.version], imageHash) + + if (counterfactualAddress.toLowerCase() === wallet.toLowerCase()) { + return true + } + + // chainId=0 means no chainId, so the signature is valid for all chains + // we need to check that case too + const recovered2 = await version.signature.SignatureCoder.recover( + decoded as any, + { + address: wallet, + digest: ethers.utils.hexlify(digest), + chainId + }, + provider + ) + + const imageHash2 = version.config.ConfigCoder.imageHashOf(recovered2.config as any) + const counterfactualAddress2 = addressOf(contexts[version.version], imageHash2) + + return counterfactualAddress2.toLowerCase() === wallet.toLowerCase() + } catch {} + + // We most likely failed to decode the signature + return false + }) + ) + + return res.some(r => r) +} + +export type VersionedContext = { [key: number]: WalletContext } + +export function isValidVersionedContext(contexts: VersionedContext): boolean { + // number of keys is the number of versions + const versions = Object.keys(contexts).length + + // check that all versions exist and are valid + for (let i = 1; i <= versions; i++) { + const context = contexts[i] + if (!context || context.version !== i) { + return false + } + } + + return true +} + +export function latestContext(contexts: VersionedContext): WalletContext { + const versions = Object.keys(contexts).length + return contexts[versions] +} + +export const defaultContexts: VersionedContext = { + 1: context1, + 2: context2 +} diff --git a/packages/core/src/commons/index.ts b/packages/core/src/commons/index.ts new file mode 100644 index 000000000..7bc6db71b --- /dev/null +++ b/packages/core/src/commons/index.ts @@ -0,0 +1,10 @@ +export * as config from './config' +export * as signature from './signature' +export * as context from './context' +export * as signer from './signer' +export * as EIP1271 from './validateEIP1271' +export * as transaction from './transaction' +export * as reader from './reader' +export * as EIP6492 from './validateEIP6492' + +export * from './orchestrator' diff --git a/packages/core/src/commons/orchestrator.ts b/packages/core/src/commons/orchestrator.ts new file mode 100644 index 000000000..cb0d73165 --- /dev/null +++ b/packages/core/src/commons/orchestrator.ts @@ -0,0 +1,42 @@ +import { ethers } from 'ethers' +import { commons } from '..' +import { Config } from './config' + +/** + * Request metadata, used by the wallet to pass additional information through the orchestrator. + */ +export type WalletSignRequestMetadata = { + address: string + digest: ethers.utils.BytesLike + chainId: ethers.BigNumberish + + config: Config + + parts?: Map + + // TODO: We can add a "percentage" field to the orchestrator to indicate + // how close are we to the threshold. This can be used to display + // a progress bar or something similar. + + message?: ethers.utils.BytesLike + transactions?: commons.transaction.Transaction[] + + // This is used only when a Sequence wallet is nested in another Sequence wallet + // it contains the original metadata of the parent wallet. + parent?: WalletSignRequestMetadata + + decorate?: boolean + cantValidateBehavior?: 'ignore' | 'eip6492' | 'throw' +} + +export function isWalletSignRequestMetadata(obj: any): obj is WalletSignRequestMetadata { + return obj && obj.address && obj.digest && obj.chainId !== undefined && obj.config +} + +/** + * Request metadata, used by the wallet to pass additional information through the orchestrator. + */ +export type WalletDeployMetadata = { + includeChildren?: boolean // Whether to include children in deployment, default false + ignoreDeployed?: boolean // Whether to ignore already deployed wallets, default false +} diff --git a/packages/core/src/commons/reader.ts b/packages/core/src/commons/reader.ts new file mode 100644 index 000000000..99af855bc --- /dev/null +++ b/packages/core/src/commons/reader.ts @@ -0,0 +1,93 @@ +import { walletContracts } from '@0xsequence/abi' +import { ethers } from 'ethers' +import { commons } from '..' +import { validateEIP6492Offchain } from './validateEIP6492' + +/** + * Provides stateful information about the wallet. + */ +export interface Reader { + isDeployed(wallet: string): Promise + implementation(wallet: string): Promise + imageHash(wallet: string): Promise + nonce(wallet: string, space: ethers.BigNumberish): Promise + isValidSignature(wallet: string, digest: ethers.BytesLike, signature: ethers.BytesLike): Promise +} + +/** + * The OnChainReader class fetches on-chain data from a wallet. + * It is used to understand the "real" state of the wallet contract on-chain. + */ +export class OnChainReader implements Reader { + // Simple cache to avoid re-fetching the same data + private isDeployedCache: Set = new Set() + + constructor(public readonly provider: ethers.providers.Provider) {} + + private module(address: string) { + return new ethers.Contract( + address, + [...walletContracts.mainModuleUpgradable.abi, ...walletContracts.mainModule.abi, ...walletContracts.erc1271.abi], + this.provider + ) + } + + async isDeployed(wallet: string): Promise { + // This is safe to cache because the wallet cannot be undeployed once deployed + if (this.isDeployedCache.has(wallet)) { + return true + } + + const code = await this.provider.getCode(wallet).then(c => ethers.utils.arrayify(c)) + const isDeployed = code.length !== 0 + if (isDeployed) { + this.isDeployedCache.add(wallet) + } + + return isDeployed + } + + async implementation(wallet: string): Promise { + const position = ethers.utils.defaultAbiCoder.encode(['address'], [wallet]) + const val = await this.provider.getStorageAt(wallet, position).then(c => ethers.utils.arrayify(c)) + + if (val.length === 20) { + return ethers.utils.getAddress(ethers.utils.hexlify(val)) + } + + if (val.length === 32) { + return ethers.utils.defaultAbiCoder.decode(['address'], val)[0] + } + + return undefined + } + + async imageHash(wallet: string): Promise { + try { + const imageHash = await this.module(wallet).imageHash() + return imageHash + } catch {} + + return undefined + } + + async nonce(wallet: string, space: ethers.BigNumberish = 0): Promise { + try { + const nonce = await this.module(wallet).readNonce(space) + return nonce + } catch (e) { + if (!(await this.isDeployed(wallet))) { + return 0 + } + + throw e + } + } + + // We use the EIP-6492 validator contract to check the signature + // this means that if the wallet is not deployed, then the signature + // must be prefixed with a transaction that deploys the wallet + async isValidSignature(wallet: string, digest: ethers.BytesLike, signature: ethers.BytesLike): Promise { + return validateEIP6492Offchain(this.provider, wallet, digest, signature) + } +} diff --git a/packages/core/src/commons/signature.ts b/packages/core/src/commons/signature.ts new file mode 100644 index 000000000..e54dc4167 --- /dev/null +++ b/packages/core/src/commons/signature.ts @@ -0,0 +1,71 @@ +import { ethers } from 'ethers' +import * as config from './config' + +export type SignaturePart = { + signature: string + isDynamic: boolean +} + +export type Signature = { + version: number + config: T + subdigest: string + payload?: SignedPayload +} + +export type UnrecoveredSignature = { + version: number +} + +export type SignedPayload = { + message?: ethers.BytesLike + digest: string + chainId: ethers.BigNumberish + address: string +} + +export interface SignatureCoder< + Y extends config.Config = config.Config, + T extends Signature = Signature, + Z extends UnrecoveredSignature = UnrecoveredSignature +> { + decode: (data: string) => Z + encode: (data: T | Z | ethers.BytesLike) => string + + trim: (data: string) => Promise + + recover: (data: Z, payload: SignedPayload, provider: ethers.providers.Provider) => Promise + + supportsNoChainId: boolean + + encodeSigners: ( + config: Y, + signatures: Map, + subdigests: string[], + chainId: ethers.BigNumberish + ) => { + encoded: string + weight: ethers.BigNumber + } + + hasEnoughSigningPower: (config: Y, signatures: Map) => boolean + + chainSignatures: (main: T | Z | ethers.BytesLike, suffixes: (T | Z | ethers.BytesLike)[]) => string + + hashSetImageHash: (imageHash: string) => string + + signaturesOf: (config: Y) => { address: string; signature: string }[] + + signaturesOfDecoded: (decoded: Z) => string[] +} + +export function subdigestOf(payload: SignedPayload) { + return ethers.utils.solidityKeccak256( + ['bytes', 'uint256', 'address', 'bytes32'], + ['0x1901', payload.chainId, payload.address, payload.digest] + ) +} + +export function isSignedPayload(payload: any): payload is SignedPayload { + return payload.digest !== undefined && payload.chainId !== undefined && payload.address !== undefined +} diff --git a/packages/core/src/commons/signer.ts b/packages/core/src/commons/signer.ts new file mode 100644 index 000000000..4e146c7a0 --- /dev/null +++ b/packages/core/src/commons/signer.ts @@ -0,0 +1,73 @@ +import { ethers } from 'ethers' +import { isValidEIP1271Signature } from './validateEIP1271' + +export enum SigType { + EIP712 = 1, + ETH_SIGN = 2, + WALLET_BYTES32 = 3 +} + +export function canRecover(signature: ethers.BytesLike) { + const bytes = ethers.utils.arrayify(signature) + const type = bytes[bytes.length - 1] + + return type === SigType.EIP712 || type === SigType.ETH_SIGN +} + +export function recoverSigner(digest: ethers.BytesLike, signature: ethers.BytesLike) { + const bytes = ethers.utils.arrayify(signature) + const digestBytes = ethers.utils.arrayify(digest) + + // type is last byte + const type = bytes[bytes.length - 1] + + // Split r:s:v + const r = ethers.utils.hexlify(bytes.slice(0, 32)) + const s = ethers.utils.hexlify(bytes.slice(32, 64)) + const v = ethers.BigNumber.from(bytes.slice(64, 65)).toNumber() + + const splitSignature = { r, s, v } + + if (type === SigType.EIP712) { + return ethers.utils.recoverAddress(digestBytes, splitSignature) + } + + if (type === SigType.ETH_SIGN) { + return ethers.utils.recoverAddress(ethers.utils.hashMessage(digestBytes), splitSignature) + } + + throw new Error(`Unsupported signature type: ${type}`) +} + +export function isValidSignature( + address: string, + digest: ethers.BytesLike, + signature: ethers.BytesLike, + provider: ethers.providers.Provider +) { + const bytes = ethers.utils.arrayify(signature) + + // type is last byte + const type = bytes[bytes.length - 1] + + if (type === SigType.EIP712 || type === SigType.ETH_SIGN) { + return address === recoverSigner(digest, signature) + } + + if (type === SigType.WALLET_BYTES32) { + return isValidEIP1271Signature(address, ethers.utils.hexlify(digest), bytes.slice(0, -1), provider) + } + + throw new Error(`Unsupported signature type: ${type}`) +} + +export function tryRecoverSigner(digest: ethers.BytesLike, signature: ethers.BytesLike): string | undefined { + const bytes = ethers.utils.arrayify(signature) + if (bytes.length !== 66) return undefined + + try { + return recoverSigner(digest, bytes) + } catch {} + + return undefined +} diff --git a/packages/core/src/commons/transaction.ts b/packages/core/src/commons/transaction.ts new file mode 100644 index 000000000..a8495dab0 --- /dev/null +++ b/packages/core/src/commons/transaction.ts @@ -0,0 +1,322 @@ +import { BigNumberish, BytesLike, ethers } from 'ethers' +import { subdigestOf } from './signature' +import { walletContracts } from '@0xsequence/abi' + +export interface Transaction { + to: string + value?: BigNumberish + data?: BytesLike + gasLimit?: BigNumberish + delegateCall?: boolean + revertOnError?: boolean +} + +export interface SimulatedTransaction extends Transaction { + succeeded: boolean + executed: boolean + gasUsed: number + gasLimit: number + result?: string + reason?: string +} + +export interface TransactionEncoded { + delegateCall: boolean + revertOnError: boolean + gasLimit: BigNumberish + target: string + value: BigNumberish + data: BytesLike +} + +export type Transactionish = + | ethers.providers.TransactionRequest + | ethers.providers.TransactionRequest[] + | Transaction + | Transaction[] + +export interface TransactionResponse extends ethers.providers.TransactionResponse { + receipt?: R +} + +export type TransactionBundle = { + entrypoint: string + transactions: Transaction[] + nonce?: BigNumberish +} + +export type IntendedTransactionBundle = TransactionBundle & { + chainId: BigNumberish + intent: { + id: string + wallet: string + } +} + +export type SignedTransactionBundle = IntendedTransactionBundle & { + signature: string + nonce: BigNumberish +} + +export type RelayReadyTransactionBundle = SignedTransactionBundle | IntendedTransactionBundle + +export const MetaTransactionsType = `tuple( + bool delegateCall, + bool revertOnError, + uint256 gasLimit, + address target, + uint256 value, + bytes data +)[]` + +export function intendTransactionBundle( + bundle: TransactionBundle, + wallet: string, + chainId: BigNumberish, + id: string +): IntendedTransactionBundle { + return { + ...bundle, + chainId, + intent: { id: id, wallet } + } +} + +export function intendedTransactionID(bundle: IntendedTransactionBundle) { + return ethers.utils.keccak256( + ethers.utils.defaultAbiCoder.encode( + ['address', 'uint256', 'bytes32'], + [bundle.intent.wallet, bundle.chainId, bundle.intent.id] + ) + ) +} + +export function unpackMetaTransactionsData(data: BytesLike): [ethers.BigNumber, TransactionEncoded[]] { + const res = ethers.utils.defaultAbiCoder.decode(['uint256', MetaTransactionsType], data) + if (res.length !== 2 || !res[0] || !res[1]) throw new Error('Invalid meta transaction data') + return [res[0], res[1]] +} + +export function packMetaTransactionsData(nonce: ethers.BigNumberish, txs: Transaction[]): string { + return ethers.utils.defaultAbiCoder.encode(['uint256', MetaTransactionsType], [nonce, sequenceTxAbiEncode(txs)]) +} + +export function digestOfTransactions(nonce: BigNumberish, txs: Transaction[]) { + return ethers.utils.keccak256(packMetaTransactionsData(nonce, txs)) +} + +export function subdigestOfTransactions( + address: string, + chainId: BigNumberish, + nonce: ethers.BigNumberish, + txs: Transaction[] +): string { + return subdigestOf({ address, chainId, digest: digestOfTransactions(nonce, txs) }) +} + +export function subdigestOfGuestModuleTransactions(guestModule: string, chainId: BigNumberish, txs: Transaction[]): string { + return subdigestOf({ + address: guestModule, + chainId, + digest: ethers.utils.keccak256( + ethers.utils.defaultAbiCoder.encode(['string', MetaTransactionsType], ['guest:', sequenceTxAbiEncode(txs)]) + ) + }) +} + +export function toSequenceTransactions( + wallet: string, + txs: (Transaction | ethers.providers.TransactionRequest)[] +): { nonce?: ethers.BigNumberish; transaction: Transaction }[] { + return txs.map(tx => toSequenceTransaction(wallet, tx)) +} + +export function toSequenceTransaction( + wallet: string, + tx: ethers.providers.TransactionRequest +): { nonce?: ethers.BigNumberish; transaction: Transaction } { + if (tx.to && tx.to !== ethers.constants.AddressZero) { + return { + nonce: tx.nonce, + transaction: { + delegateCall: false, + revertOnError: false, + gasLimit: tx.gasLimit || 0, + to: tx.to, + value: tx.value || 0, + data: tx.data || '0x' + } + } + } else { + const walletInterface = new ethers.utils.Interface(walletContracts.mainModule.abi) + const data = walletInterface.encodeFunctionData(walletInterface.getFunction('createContract'), [tx.data]) + + return { + nonce: tx.nonce, + transaction: { + delegateCall: false, + revertOnError: false, + gasLimit: tx.gasLimit, + to: wallet, + value: tx.value || 0, + data: data + } + } + } +} + +export function isSequenceTransaction(tx: any): tx is Transaction { + return tx.delegateCall !== undefined || tx.revertOnError !== undefined +} + +export function hasSequenceTransactions(txs: any[]): txs is Transaction[] { + return txs.every(isSequenceTransaction) +} + +// TODO: We may be able to remove this if we make Transaction === TransactionEncoded +export function sequenceTxAbiEncode(txs: Transaction[]): TransactionEncoded[] { + return txs.map(t => ({ + delegateCall: t.delegateCall === true, + revertOnError: t.revertOnError === true, + gasLimit: t.gasLimit !== undefined ? t.gasLimit : ethers.constants.Zero, + target: t.to ?? ethers.constants.AddressZero, + value: t.value !== undefined ? t.value : ethers.constants.Zero, + data: t.data !== undefined ? t.data : [] + })) +} + +export function fromTxAbiEncode(txs: TransactionEncoded[]): Transaction[] { + return txs.map(t => ({ + delegateCall: t.delegateCall, + revertOnError: t.revertOnError, + gasLimit: t.gasLimit, + to: t.target, + value: t.value, + data: t.data + })) +} + +// export function appendNonce(txs: Transaction[], nonce: BigNumberish): Transaction[] { +// return txs.map((t: Transaction) => ({ ...t, nonce })) +// } + +export function encodeNonce(space: BigNumberish, nonce: BigNumberish): ethers.BigNumber { + const bspace = ethers.BigNumber.from(space) + const bnonce = ethers.BigNumber.from(nonce) + + const shl = ethers.constants.Two.pow(ethers.BigNumber.from(96)) + + if (!bnonce.div(shl).eq(ethers.constants.Zero)) { + throw new Error('Space already encoded') + } + + return bnonce.add(bspace.mul(shl)) +} + +export function decodeNonce(nonce: BigNumberish): [ethers.BigNumber, ethers.BigNumber] { + const bnonce = ethers.BigNumber.from(nonce) + const shr = ethers.constants.Two.pow(ethers.BigNumber.from(96)) + + return [bnonce.div(shr), bnonce.mod(shr)] +} + +export function fromTransactionish(wallet: string, transaction: Transactionish): Transaction[] { + if (Array.isArray(transaction)) { + if (hasSequenceTransactions(transaction)) { + return transaction + } else { + const stx = toSequenceTransactions(wallet, transaction) + return stx.map(t => t.transaction) + } + } else if (isSequenceTransaction(transaction)) { + return [transaction] + } else { + return [toSequenceTransaction(wallet, transaction).transaction] + } +} + +export function isTransactionBundle(cand: any): cand is TransactionBundle { + return ( + cand !== undefined && + cand.entrypoint !== undefined && + cand.chainId !== undefined && + cand.transactions !== undefined && + cand.nonce !== undefined && + cand.intent !== undefined && + cand.intent.id !== undefined && + cand.intent.wallet !== undefined && + Array.isArray(cand.transactions) && + (cand).transactions.reduce((p, c) => p && isSequenceTransaction(c), true) + ) +} + +export function isSignedTransactionBundle(cand: any): cand is SignedTransactionBundle { + return cand !== undefined && cand.signature !== undefined && cand.signature !== '' && isTransactionBundle(cand) +} + +export function encodeBundleExecData(bundle: TransactionBundle): string { + const walletInterface = new ethers.utils.Interface(walletContracts.mainModule.abi) + return walletInterface.encodeFunctionData( + walletInterface.getFunction('execute'), + isSignedTransactionBundle(bundle) + ? [ + // Signed transaction bundle has all 3 parameters + sequenceTxAbiEncode(bundle.transactions), + bundle.nonce, + bundle.signature + ] + : [ + // Unsigned bundle may be a GuestModule call, so signature and nonce are missing + sequenceTxAbiEncode(bundle.transactions), + 0, + [] + ] + ) +} + +// TODO: Use Sequence ABI package +export const selfExecuteSelector = '0x61c2926c' +export const selfExecuteAbi = `tuple( + bool delegateCall, + bool revertOnError, + uint256 gasLimit, + address target, + uint256 value, + bytes data +)[]` + +// Splits Sequence batch transactions into individual parts +export const unwind = (wallet: string, transactions: Transaction[]): Transaction[] => { + const unwound: Transaction[] = [] + + const walletInterface = new ethers.utils.Interface(walletContracts.mainModule.abi) + + for (const tx of transactions) { + const txData = ethers.utils.arrayify(tx.data || '0x') + + if (tx.to === wallet && ethers.utils.hexlify(txData.slice(0, 4)) === selfExecuteSelector) { + // Decode as selfExecute call + const data = txData.slice(4) + const decoded = ethers.utils.defaultAbiCoder.decode([selfExecuteAbi], data)[0] + unwound.push( + ...unwind( + tx.to, + decoded.map((d: TransactionEncoded) => ({ ...d, to: d.target })) + ) + ) + } else { + try { + const innerTransactions = walletInterface.decodeFunctionData('execute', txData)[0] + const unwoundTransactions = unwind( + wallet, + innerTransactions.map((tx: TransactionEncoded) => ({ ...tx, to: tx.target })) + ) + unwound.push(...unwoundTransactions) + } catch { + unwound.push(tx) + } + } + } + + return unwound +} diff --git a/packages/core/src/commons/validateEIP1271.ts b/packages/core/src/commons/validateEIP1271.ts new file mode 100644 index 000000000..d71049182 --- /dev/null +++ b/packages/core/src/commons/validateEIP1271.ts @@ -0,0 +1,38 @@ +import { ethers } from 'ethers' + +const EIP1271_MAGIC_VALUE = '0x1626ba7e' + +const EIP1271_ABI = [ + { + inputs: [ + { + internalType: 'bytes32', + type: 'bytes32' + }, + { + internalType: 'bytes', + type: 'bytes' + } + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + type: 'bytes4' + } + ], + stateMutability: 'view', + type: 'function' + } +] + +export async function isValidEIP1271Signature( + address: string, + digest: string, + signature: ethers.BytesLike, + provider: ethers.providers.Provider +): Promise { + const contract = new ethers.Contract(address, EIP1271_ABI, provider) + const result = await contract.isValidSignature(digest, signature) + return result === EIP1271_MAGIC_VALUE +} diff --git a/packages/core/src/commons/validateEIP6492.ts b/packages/core/src/commons/validateEIP6492.ts new file mode 100644 index 000000000..478c5786d --- /dev/null +++ b/packages/core/src/commons/validateEIP6492.ts @@ -0,0 +1,197 @@ +import { ethers } from 'ethers' + +/* Source of Offchain EIP-6492 validation: + +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +// As per ERC-1271 +interface IERC1271Wallet { + function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4 magicValue); +} + +error ERC1271Revert(bytes error); +error ERC6492DeployFailed(bytes error); + +contract UniversalSigValidator { + bytes32 private constant ERC6492_DETECTION_SUFFIX = 0x6492649264926492649264926492649264926492649264926492649264926492; + bytes4 private constant ERC1271_SUCCESS = 0x1626ba7e; + + function isValidSigImpl( + address _signer, + bytes32 _hash, + bytes calldata _signature, + bool allowSideEffects, + bool deployAlreadyDeployed + ) public returns (bool) { + uint contractCodeLen = address(_signer).code.length; + bytes memory sigToValidate; + // The order here is striclty defined in https://eips.ethereum.org/EIPS/eip-6492 + // - ERC-6492 suffix check and verification first, while being permissive in case the contract is already deployed; if the contract is deployed we will check the sig against the deployed version, this allows 6492 signatures to still be validated while taking into account potential key rotation + // - ERC-1271 verification if there's contract code + // - finally, ecrecover + bool isCounterfactual = bytes32(_signature[_signature.length-32:_signature.length]) == ERC6492_DETECTION_SUFFIX; + if (isCounterfactual) { + address create2Factory; + bytes memory factoryCalldata; + (create2Factory, factoryCalldata, sigToValidate) = abi.decode(_signature[0:_signature.length-32], (address, bytes, bytes)); + + if (contractCodeLen == 0 || deployAlreadyDeployed) { + (bool success, bytes memory err) = create2Factory.call(factoryCalldata); + if (!success) revert ERC6492DeployFailed(err); + } + } else { + sigToValidate = _signature; + } + + // Try ERC-1271 verification + if (isCounterfactual || contractCodeLen > 0) { + try IERC1271Wallet(_signer).isValidSignature(_hash, sigToValidate) returns (bytes4 magicValue) { + bool isValid = magicValue == ERC1271_SUCCESS; + + // EXPERIMENTAL: This is not part of the EIP-6492 spec *yet* + // but it may be useful to retry the call making the factory call + // even if the wallet is already deployed, in case the wallet + // needs to perform some sort of migration or onchain key rotation + if (!isValid && !deployAlreadyDeployed && contractCodeLen > 0) { + return isValidSigImpl(_signer, _hash, _signature, allowSideEffects, true); + } + + if (contractCodeLen == 0 && isCounterfactual && !allowSideEffects) { + // if the call had side effects we need to return the + // result using a `revert` (to undo the state changes) + assembly { + mstore(0, isValid) + revert(31, 1) + } + } + + return isValid; + } catch (bytes memory err) { + // EXPERIMENTAL: This is not part of the EIP-6492 spec *yet* + // but it may be useful to retry the call making the factory call + // even if the wallet is already deployed, in case the wallet + // needs to perform some sort of migration or onchain key rotation + if (!deployAlreadyDeployed && contractCodeLen > 0) { + return isValidSigImpl(_signer, _hash, _signature, allowSideEffects, true); + } + + revert ERC1271Revert(err); + } + } + + // ecrecover verification + require(_signature.length == 65, 'SignatureValidator#recoverSigner: invalid signature length'); + bytes32 r = bytes32(_signature[0:32]); + bytes32 s = bytes32(_signature[32:64]); + uint8 v = uint8(_signature[64]); + + if (v != 27 && v != 28) { + revert('SignatureValidator: invalid signature v value'); + } + + return ecrecover(_hash, v, r, s) == _signer; + } + + function isValidSigWithSideEffects( + address _signer, + bytes32 _hash, + bytes calldata _signature + ) external returns (bool) { + return this.isValidSigImpl(_signer, _hash, _signature, true, false); + } + + function isValidSig( + address _signer, + bytes32 _hash, + bytes calldata _signature + ) external returns (bool) { + try this.isValidSigImpl(_signer, _hash, _signature, false, false) returns (bool isValid) { + return isValid; + } catch (bytes memory error) { + // in order to avoid side effects from the contract getting deployed, the entire call will revert with a single byte result + uint len = error.length; + if (len == 1) { + return error[0] == 0x01; + // all other errors are simply forwarded, but in custom formats so that nothing else can revert with a single byte in the call + } else { + assembly { revert(error, len) } + } + } + } + + // NOTICE: These functions aren't part of the standard + // they are helpers that behave like the above functions + // but they don't revert on failure, instead they return false + + function isValidSigNoThrow( + address _signer, + bytes32 _hash, + bytes calldata _signature + ) external returns (bool) { + try this.isValidSigImpl(_signer, _hash, _signature, false, false) returns (bool isValid) { + return isValid; + } catch (bytes memory error) { + // in order to avoid side effects from the contract getting deployed, the entire call will revert with a single byte result + uint len = error.length; + if (len == 1) { + return error[0] == 0x01; + // all other errors are simply forwarded, but in custom formats so that nothing else can revert with a single byte in the call + } else { + // Ignore all other errors and return false + return false; + } + } + } + + function isValidSigWithSideEffectsNoThrow( + address _signer, + bytes32 _hash, + bytes calldata _signature + ) external returns (bool) { + try this.isValidSigImpl(_signer, _hash, _signature, true, false) returns (bool isValid) { + return isValid; + } catch (bytes memory error) { + // Ignore all errors and return false + return false; + } + } +} + +// this is a helper so we can perform validation in a single eth_call without pre-deploying a singleton +contract ValidateSigOffchain { + constructor (address _signer, bytes32 _hash, bytes memory _signature) { + UniversalSigValidator validator = new UniversalSigValidator(); + bool isValidSig = validator.isValidSigWithSideEffects(_signer, _hash, _signature); + assembly { + mstore(0, isValidSig) + return(31, 1) + } + } +} +*/ + +export const EIP_6492_OFFCHAIN_DEPLOY_CODE = + '0x608060405234801561001057600080fd5b5060405161124a38038061124a83398101604081905261002f91610124565b600060405161003d906100dd565b604051809103906000f080158015610059573d6000803e3d6000fd5b5090506000816001600160a01b0316638f0684308686866040518463ffffffff1660e01b815260040161008e939291906101fb565b6020604051808303816000875af11580156100ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d19190610244565b9050806000526001601ff35b610fdc8061026e83390190565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561011b578181015183820152602001610103565b50506000910152565b60008060006060848603121561013957600080fd5b83516001600160a01b038116811461015057600080fd5b6020850151604086015191945092506001600160401b038082111561017457600080fd5b818601915086601f83011261018857600080fd5b81518181111561019a5761019a6100ea565b604051601f8201601f19908116603f011681019083821181831017156101c2576101c26100ea565b816040528281528960208487010111156101db57600080fd5b6101ec836020830160208801610100565b80955050505050509250925092565b60018060a01b0384168152826020820152606060408201526000825180606084015261022e816080850160208701610100565b601f01601f191691909101608001949350505050565b60006020828403121561025657600080fd5b8151801515811461026657600080fd5b939250505056fe608060405234801561001057600080fd5b50610fbc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806376be4cea1161005057806376be4cea146100a65780638f068430146100b957806398ef1ed8146100cc57600080fd5b80631c6453271461006c5780633d787b6314610093575b600080fd5b61007f61007a366004610ad4565b6100df565b604051901515815260200160405180910390f35b61007f6100a1366004610ad4565b61023d565b61007f6100b4366004610b3e565b61031e565b61007f6100c7366004610ad4565b6108e1565b61007f6100da366004610ad4565b61096e565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea9061012890889088908890889088908190600401610bc3565b6020604051808303816000875af1925050508015610181575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261017e91810190610c45565b60015b610232573d8080156101af576040519150601f19603f3d011682016040523d82523d6000602084013e6101b4565b606091505b508051600181900361022757816000815181106101d3576101d3610c69565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0100000000000000000000000000000000000000000000000000000000000000149250610235915050565b600092505050610235565b90505b949350505050565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea906102879088908890889088906001908990600401610bc3565b6020604051808303816000875af19250505080156102e0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526102dd91810190610c45565b60015b610232573d80801561030e576040519150601f19603f3d011682016040523d82523d6000602084013e610313565b606091505b506000915050610235565b600073ffffffffffffffffffffffffffffffffffffffff87163b6060827f64926492649264926492649264926492649264926492649264926492649264928888610369602082610c98565b610375928b9290610cd8565b61037e91610d02565b1490508015610484576000606089828a610399602082610c98565b926103a693929190610cd8565b8101906103b39190610e18565b955090925090508415806103c45750865b1561047d576000808373ffffffffffffffffffffffffffffffffffffffff16836040516103f19190610eb2565b6000604051808303816000865af19150503d806000811461042e576040519150601f19603f3d011682016040523d82523d6000602084013e610433565b606091505b50915091508161047a57806040517f9d0d6e2d0000000000000000000000000000000000000000000000000000000081526004016104719190610f18565b60405180910390fd5b50505b50506104be565b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294505050505b80806104ca5750600083115b156106bb576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90610523908c908690600401610f2b565b602060405180830381865afa92505050801561057a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261057791810190610f44565b60015b61060f573d8080156105a8576040519150601f19603f3d011682016040523d82523d6000602084013e6105ad565b606091505b50851580156105bc5750600084115b156105db576105d08b8b8b8b8b600161031e565b9450505050506108d7565b806040517f6f2a95990000000000000000000000000000000000000000000000000000000081526004016104719190610f18565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f1626ba7e000000000000000000000000000000000000000000000000000000001480158161065f575086155b801561066b5750600085115b1561068b5761067f8c8c8c8c8c600161031e565b955050505050506108d7565b841580156106965750825b80156106a0575087155b156106af57806000526001601ffd5b94506108d79350505050565b6041871461074b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5369676e617475726556616c696461746f72237265636f7665725369676e657260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610471565b600061075a6020828a8c610cd8565b61076391610d02565b90506000610775604060208b8d610cd8565b61077e91610d02565b905060008a8a604081811061079557610795610c69565b919091013560f81c915050601b81148015906107b557508060ff16601c14155b15610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5369676e617475726556616c696461746f723a20696e76616c6964207369676e60448201527f617475726520762076616c7565000000000000000000000000000000000000006064820152608401610471565b6040805160008152602081018083528e905260ff831691810191909152606081018490526080810183905273ffffffffffffffffffffffffffffffffffffffff8e169060019060a0016020604051602081039080840390855afa1580156108ad573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161496505050505050505b9695505050505050565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea9061092b9088908890889088906001908990600401610bc3565b6020604051808303816000875af115801561094a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102329190610c45565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea906109b790889088908890889088908190600401610bc3565b6020604051808303816000875af1925050508015610a10575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610a0d91810190610c45565b60015b610232573d808015610a3e576040519150601f19603f3d011682016040523d82523d6000602084013e610a43565b606091505b5080516001819003610a6257816000815181106101d3576101d3610c69565b8082fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610a8857600080fd5b50565b60008083601f840112610a9d57600080fd5b50813567ffffffffffffffff811115610ab557600080fd5b602083019150836020828501011115610acd57600080fd5b9250929050565b60008060008060608587031215610aea57600080fd5b8435610af581610a66565b935060208501359250604085013567ffffffffffffffff811115610b1857600080fd5b610b2487828801610a8b565b95989497509550505050565b8015158114610a8857600080fd5b60008060008060008060a08789031215610b5757600080fd5b8635610b6281610a66565b955060208701359450604087013567ffffffffffffffff811115610b8557600080fd5b610b9189828a01610a8b565b9095509350506060870135610ba581610b30565b91506080870135610bb581610b30565b809150509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201528360a0820152838560c0830137600060c085830181019190915292151560608201529015156080820152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909101019392505050565b600060208284031215610c5757600080fd5b8151610c6281610b30565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81810381811115610cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60008085851115610ce857600080fd5b83861115610cf557600080fd5b5050820193919092039150565b80356020831015610cd2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610d7e57600080fd5b813567ffffffffffffffff80821115610d9957610d99610d3e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610ddf57610ddf610d3e565b81604052838152866020858801011115610df857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610e2d57600080fd5b8335610e3881610a66565b9250602084013567ffffffffffffffff80821115610e5557600080fd5b610e6187838801610d6d565b93506040860135915080821115610e7757600080fd5b50610e8486828701610d6d565b9150509250925092565b60005b83811015610ea9578181015183820152602001610e91565b50506000910152565b60008251610ec4818460208701610e8e565b9190910192915050565b60008151808452610ee6816020860160208601610e8e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610c626020830184610ece565b8281526040602082015260006102356040830184610ece565b600060208284031215610f5657600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610c6257600080fdfea26469706673582212201a72aed4b15ffb05b6502997a9bb655992e06590bd26b336dfbb153d7ff6f34b64736f6c63430008120033' +export const EIP_6492_SUFFIX = '0x6492649264926492649264926492649264926492649264926492649264926492' + +// TODO: This is a length payload, we can lower the load by deploying +// the contract on some of the popular chains, and calling the contract +// if the provider is one of those chains +export async function validateEIP6492Offchain( + provider: ethers.providers.Provider, + signer: string, + hash: ethers.utils.BytesLike, + signature: ethers.utils.BytesLike +): Promise { + return ( + '0x01' === + (await provider.call({ + data: ethers.utils.concat([ + EIP_6492_OFFCHAIN_DEPLOY_CODE, + new ethers.utils.AbiCoder().encode(['address', 'bytes32', 'bytes'], [signer, hash, signature]) + ]) + })) + ) +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 000000000..3d153a1ce --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,11 @@ +export * as v1 from './v1' +export * as v2 from './v2' +export * as commons from './commons' +export * as universal from './universal' + +import * as v1 from './v1' +import * as v2 from './v2' + +export { VERSION } from './version' + +export const allVersions = [v1, v2] diff --git a/packages/core/src/universal/index.ts b/packages/core/src/universal/index.ts new file mode 100644 index 000000000..54e70287c --- /dev/null +++ b/packages/core/src/universal/index.ts @@ -0,0 +1,25 @@ +import { commons, v1, v2 } from '..' + +export const ALL_CODERS = [ + { config: v1.config.ConfigCoder, signature: v1.signature.SignatureCoder }, + { config: v2.config.ConfigCoder, signature: v2.signature.SignatureCoder } +] + +export function coderFor(version: number) { + const index = version - 1 + if (index < 0 || index >= ALL_CODERS.length) { + throw new Error(`No coder for version: ${version}`) + } + + return ALL_CODERS[index] +} + +/** + * Same as `coderFor` but returns `generic` coders without versioned types. + */ +export function genericCoderFor(version: number): { + config: commons.config.ConfigCoder + signature: commons.signature.SignatureCoder +} { + return coderFor(version) +} diff --git a/packages/core/src/v1/config.ts b/packages/core/src/v1/config.ts new file mode 100644 index 000000000..859474b27 --- /dev/null +++ b/packages/core/src/v1/config.ts @@ -0,0 +1,221 @@ +import { ethers } from 'ethers' +import { walletContracts } from '@0xsequence/abi' +import { commons } from '..' +import { encodeSigners } from './signature' +import { SimpleConfig } from '../commons/config' + +export type AddressMember = { + weight: ethers.BigNumberish + address: string + signature?: string +} + +export type WalletConfig = commons.config.Config & { + threshold: ethers.BigNumberish + signers: AddressMember[] +} + +export const ConfigCoder: commons.config.ConfigCoder = { + isWalletConfig: (config: commons.config.Config): config is WalletConfig => { + return ( + config.version === 1 && (config as WalletConfig).threshold !== undefined && (config as WalletConfig).signers !== undefined + ) + }, + + imageHashOf: (config: WalletConfig): string => { + return config.signers.reduce( + (imageHash, signer) => + ethers.utils.keccak256( + ethers.utils.defaultAbiCoder.encode(['bytes32', 'uint8', 'address'], [imageHash, signer.weight, signer.address]) + ), + ethers.utils.solidityPack(['uint256'], [config.threshold]) + ) + }, + + hasSubdigest: (_walletConfig: WalletConfig, _subdigest: string): boolean => { + // v1 does not support explicit subdigests + return false + }, + + isComplete: (_config: WalletConfig): boolean => { + // v1 does not support incomplete configs + return true + }, + + checkpointOf: (_config: WalletConfig): ethers.BigNumber => { + return ethers.BigNumber.from(0) + }, + + signersOf: (config: WalletConfig): { address: string; weight: number }[] => { + return config.signers.map(s => ({ address: s.address, weight: ethers.BigNumber.from(s.weight).toNumber() })) + }, + + fromSimple: (config: SimpleConfig): WalletConfig => { + if (!ethers.constants.Zero.eq(config.checkpoint)) { + throw new Error('v1 wallet config does not support checkpoint') + } + + if (config.subdigests && config.subdigests.length > 0) { + throw new Error('v1 wallet config does not support subdigests') + } + + return { + version: 1, + threshold: config.threshold, + signers: config.signers + } + }, + + update: { + isKindUsed: true, + + buildTransaction: ( + wallet: string, + config: WalletConfig, + context: commons.context.WalletContext, + kind?: 'first' | 'later' | undefined + ): commons.transaction.TransactionBundle => { + const module = new ethers.utils.Interface([...walletContracts.mainModule.abi, ...walletContracts.mainModuleUpgradable.abi]) + + const transactions: commons.transaction.Transaction[] = [] + + if (!kind || kind === 'first') { + transactions.push({ + to: wallet, + data: module.encodeFunctionData(module.getFunction('updateImplementation'), [context.mainModuleUpgradable]), + gasLimit: 0, + delegateCall: false, + revertOnError: true, + value: 0 + }) + } + + transactions.push({ + to: wallet, + data: module.encodeFunctionData(module.getFunction('updateImageHash'), [ConfigCoder.imageHashOf(config)]), + gasLimit: 0, + delegateCall: false, + revertOnError: true, + value: 0 + }) + + return { + entrypoint: wallet, + transactions + } + }, + decodeTransaction: function (tx: commons.transaction.TransactionBundle): { + address: string + newImageHash: string + kind: 'first' | 'later' | undefined + } { + throw new Error('Function not implemented.') + } + }, + + toJSON: function (config: WalletConfig): string { + const plainMembers = config.signers.map(signer => { + return { + weight: ethers.BigNumber.from(signer.weight).toString(), + address: signer.address + } + }) + + return JSON.stringify({ + version: config.version, + threshold: ethers.BigNumber.from(config.threshold).toString(), + signers: plainMembers + }) + }, + + fromJSON: function (json: string): WalletConfig { + const parsed = JSON.parse(json) + + const signers = parsed.signers.map((signer: any) => { + return { + weight: ethers.BigNumber.from(signer.weight), + address: signer.address + } + }) + + return { + version: parsed.version, + threshold: ethers.BigNumber.from(parsed.threshold), + signers + } + }, + + editConfig: function ( + config: WalletConfig, + action: { + add?: commons.config.SimpleSigner[] + remove?: string[] + threshold?: ethers.BigNumberish + checkpoint?: ethers.BigNumberish + } + ): WalletConfig { + const newSigners = config.signers.slice() + + if (action.checkpoint && !ethers.constants.Zero.eq(action.checkpoint)) { + throw new Error('v1 wallet config does not support checkpoint') + } + + if (action.add) { + for (const signer of action.add) { + if (newSigners.find(s => s.address === signer.address)) { + continue + } + + newSigners.push({ + weight: signer.weight, + address: signer.address + }) + } + } + + if (action.remove) { + for (const address of action.remove) { + const index = newSigners.findIndex(signer => signer.address === address) + if (index >= 0) { + newSigners.splice(index, 1) + } + } + } + + return { + version: config.version, + threshold: action.threshold ?? config.threshold, + signers: newSigners + } + }, + + buildStubSignature: function (config: WalletConfig, overrides: Map) { + const parts = new Map() + + for (const [signer, signature] of overrides.entries()) { + parts.set(signer, { signature, isDynamic: true }) + + const { encoded, weight } = encodeSigners(config, parts, [], 0) + + if (weight.gte(config.threshold)) { + return encoded + } + } + + const signers = config.signers + + for (const { address } of signers.sort(({ weight: a }, { weight: b }) => ethers.BigNumber.from(a).sub(b).toNumber())) { + const signature = + '0x4e82f02f388a12b5f9d29eaf2452dd040c0ee5804b4e504b4dd64e396c6c781f2c7624195acba242dd825bfd25a290912e3c230841fd55c9a734c4de8d9899451b02' + parts.set(address, { signature, isDynamic: false }) + + const { encoded, weight } = encodeSigners(config, parts, [], 0) + + if (weight.gte(config.threshold)) { + return encoded + } + } + + return encodeSigners(config, parts, [], 0).encoded + } +} diff --git a/packages/core/src/v1/index.ts b/packages/core/src/v1/index.ts new file mode 100644 index 000000000..57ae48ed8 --- /dev/null +++ b/packages/core/src/v1/index.ts @@ -0,0 +1,15 @@ +import { WalletContext } from '../commons/context' + +export * as config from './config' +export * as signature from './signature' + +export const version = 1 + +export const DeployedWalletContext: WalletContext = { + version: version, + factory: '0xf9D09D634Fb818b05149329C1dcCFAeA53639d96', + guestModule: '0x02390F3E6E5FD1C6786CB78FD3027C117a9955A7', + mainModule: '0xd01F11855bCcb95f88D7A48492F66410d4637313', + mainModuleUpgradable: '0x7EFE6cE415956c5f80C6530cC6cc81b4808F6118', + walletCreationCode: '0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3' +} diff --git a/packages/core/src/v1/signature.ts b/packages/core/src/v1/signature.ts new file mode 100644 index 000000000..628b0c2e6 --- /dev/null +++ b/packages/core/src/v1/signature.ts @@ -0,0 +1,256 @@ +import { ethers } from 'ethers' +import * as base from '../commons/signature' +import { AddressMember, WalletConfig } from './config' +import { isValidSignature, recoverSigner } from '../commons/signer' + +export enum SignaturePartType { + EOASignature = 0, + Address = 1, + DynamicSignature = 2 +} + +export type Signature = base.Signature + +export type UnrecoveredSignatureMember = { + unrecovered: true + weight: ethers.BigNumberish + signature: string + address?: string + isDynamic: boolean +} + +export type UnrecoveredMember = AddressMember | UnrecoveredSignatureMember + +export type UnrecoveredSignature = base.UnrecoveredSignature & { + threshold: ethers.BigNumberish + signers: UnrecoveredMember[] +} + +export function isAddressMember(member: any): member is AddressMember { + return (member as AddressMember).address !== undefined && !isUnrecoveredSignatureMember(member) +} + +export function isUnrecoveredSignatureMember(member: any): member is UnrecoveredSignatureMember { + return ( + (member as UnrecoveredSignatureMember).signature !== undefined && + (member as UnrecoveredSignatureMember).weight !== undefined && + (member as UnrecoveredSignatureMember).isDynamic !== undefined + ) +} + +export function isUnrecoveredSignature(signature: Signature | UnrecoveredSignature): signature is UnrecoveredSignature { + return (signature as UnrecoveredSignature).threshold !== undefined && (signature as UnrecoveredSignature).signers !== undefined +} + +export function decodeSignature(signature: ethers.BytesLike): UnrecoveredSignature { + const bytes = ethers.utils.arrayify(signature) + + const threshold = (bytes[0] << 8) | bytes[1] + const signers: UnrecoveredMember[] = [] + + for (let i = 2; i < bytes.length; ) { + const type = bytes[i++] + const weight = bytes[i++] + + switch (type) { + case SignaturePartType.EOASignature: + signers.push({ + unrecovered: true, + weight, + signature: ethers.utils.hexlify(bytes.slice(i, i + 66)), + isDynamic: false + }) + i += 66 + break + + case SignaturePartType.Address: + signers.push({ + weight, + address: ethers.utils.getAddress(ethers.utils.hexlify(bytes.slice(i, i + 20))) + }) + i += 20 + break + + case SignaturePartType.DynamicSignature: + const address = ethers.utils.getAddress(ethers.utils.hexlify(bytes.slice(i, i + 20))) + i += 20 + + const size = (bytes[i] << 8) | bytes[i + 1] + i += 2 + + signers.push({ + unrecovered: true, + weight, + signature: ethers.utils.hexlify(bytes.slice(i, i + size)), + address, + isDynamic: true + }) + i += size + break + + default: + throw new Error(`Unknown signature part type: ${type}`) + } + } + + return { version: 1, threshold, signers } +} + +export function encodeSignature(signature: Signature | UnrecoveredSignature | ethers.BytesLike): string { + if (ethers.utils.isBytesLike(signature)) return ethers.utils.hexlify(signature) + + const { signers, threshold } = isUnrecoveredSignature(signature) ? signature : signature.config + + const encodedSigners = signers.map(s => { + if (isAddressMember(s)) { + return ethers.utils.solidityPack(['uint8', 'uint8', 'address'], [SignaturePartType.Address, s.weight, s.address]) + } + + if (s.isDynamic) { + const bytes = ethers.utils.arrayify(s.signature) + return ethers.utils.solidityPack( + ['uint8', 'uint8', 'address', 'uint16', 'bytes'], + [SignaturePartType.DynamicSignature, s.weight, s.address, bytes.length, bytes] + ) + } + + return ethers.utils.solidityPack(['uint8', 'uint8', 'bytes'], [SignaturePartType.EOASignature, s.weight, s.signature]) + }) + + return ethers.utils.solidityPack(['uint16', ...new Array(encodedSigners.length).fill('bytes')], [threshold, ...encodedSigners]) +} + +export async function recoverSignature( + data: UnrecoveredSignature, + payload: base.SignedPayload, + provider: ethers.providers.Provider +): Promise { + const subdigest = base.subdigestOf(payload) + const signers = await Promise.all( + data.signers.map(async s => { + if (isAddressMember(s)) { + return s + } + + if (s.isDynamic) { + if (!s.address) throw new Error('Dynamic signature part must have address') + if (!isValidSignature(s.address, subdigest, s.signature, provider)) { + throw new Error(`Invalid dynamic signature part ${s.address}`) + } + + return { address: s.address, weight: s.weight, signature: s.signature } + } else { + const address = recoverSigner(subdigest, s.signature) + return { address, weight: s.weight, signature: s.signature } + } + }) + ) + + return { + version: 1, + payload, + subdigest, + config: { + version: 1, + threshold: data.threshold, + signers + } + } +} + +export function encodeSigners( + config: WalletConfig, + signatures: Map, + subdigests: string[], + _: ethers.BigNumberish +): { encoded: string; weight: ethers.BigNumber } { + if (subdigests.length !== 0) { + throw new Error('Explicit subdigests not supported on v1') + } + + let weight = ethers.BigNumber.from(0) + const parts = config.signers.map(s => { + if (!signatures.has(s.address)) { + return s + } + + const signature = signatures.get(s.address)! + const bytes = ethers.utils.arrayify(signature.signature) + + weight = weight.add(s.weight) + + if (signature.isDynamic || bytes.length !== 66) { + return { + ...s, + isDynamic: true, + signature: signature.signature, + address: s.address + } + } + + return { + ...s, + isDynamic: false, + signature: signature.signature + } + }) + + const encoded = encodeSignature({ version: 1, threshold: config.threshold, signers: parts }) + return { encoded, weight } +} + +export const SignatureCoder: base.SignatureCoder = { + decode: (data: string): UnrecoveredSignature => { + return decodeSignature(data) + }, + + encode: (data: Signature | UnrecoveredSignature | ethers.BytesLike): string => { + return encodeSignature(data) + }, + + trim: async (data: string): Promise => { + return data + }, + + supportsNoChainId: true, + + recover: (data: UnrecoveredSignature, payload: base.SignedPayload, provider: ethers.providers.Provider): Promise => { + return recoverSignature(data, payload, provider) + }, + + encodeSigners: ( + config: WalletConfig, + signatures: Map, + subdigests: string[], + chainId: ethers.BigNumberish + ): { + encoded: string + weight: ethers.BigNumber + } => { + return encodeSigners(config, signatures, subdigests, chainId) + }, + + hasEnoughSigningPower: (config: WalletConfig, signatures: Map): boolean => { + const { weight } = SignatureCoder.encodeSigners(config, signatures, [], 0) + return weight.gte(config.threshold) + }, + + chainSignatures: ( + _main: Signature | UnrecoveredSignature | ethers.BytesLike, + _suffix: (Signature | UnrecoveredSignature | ethers.BytesLike)[] + ): string => { + throw new Error('Signature chaining not supported on v1') + }, + + hashSetImageHash: function (_imageHash: string): string { + throw new Error('Image hash not supported on v1') + }, + + signaturesOf(config: WalletConfig): { address: string; signature: string }[] { + return config.signers.filter(s => s.signature !== undefined).map(s => ({ address: s.address, signature: s.signature! })) + }, + + signaturesOfDecoded: function (data: UnrecoveredSignature): string[] { + return data.signers.map(s => s.signature).filter(s => s !== undefined) as string[] + } +} diff --git a/packages/core/src/v2/chained.ts b/packages/core/src/v2/chained.ts new file mode 100644 index 000000000..9240aee75 --- /dev/null +++ b/packages/core/src/v2/chained.ts @@ -0,0 +1,23 @@ +import { ethers } from 'ethers' + +// = keccak256("SetImageHash(bytes32 imageHash)") +export const SetImageHashPrefix = '0x8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d1' + +export function hashSetImageHash(imageHash: string): string { + return ethers.utils.keccak256(messageSetImageHash(imageHash)) +} + +export function messageSetImageHash(imageHash: string) { + return ethers.utils.solidityPack(['bytes32', 'bytes32'], [SetImageHashPrefix, imageHash]) +} + +export function decodeMessageSetImageHash(message: ethers.BytesLike): string | undefined { + const arr = ethers.utils.arrayify(message) + if (arr.length !== 64) return undefined + if (ethers.utils.hexlify(arr.slice(0, 32)) !== SetImageHashPrefix) return undefined + return ethers.utils.hexlify(arr.slice(32, 64)) +} + +export function isMessageSetImageHash(message: ethers.BytesLike): boolean { + return decodeMessageSetImageHash(message) !== undefined +} diff --git a/packages/core/src/v2/config.ts b/packages/core/src/v2/config.ts new file mode 100644 index 000000000..968e265ea --- /dev/null +++ b/packages/core/src/v2/config.ts @@ -0,0 +1,620 @@ +import { ethers } from 'ethers' +import { walletContracts } from '@0xsequence/abi' +import { commons } from '..' +import { encodeSigners } from './signature' +import { SimpleConfig } from '../commons/config' + +// +// Tree typings - leaves +// + +export type SignerLeaf = { + address: string + weight: ethers.BigNumberish + signature?: string +} + +export type SubdigestLeaf = { + subdigest: string +} + +export type NestedLeaf = { + tree: Topology + weight: ethers.BigNumberish + threshold: ethers.BigNumberish +} + +// This is an unknown node +// it means the tree has a branch +// but we don't know what the content +export type NodeLeaf = { + nodeHash: string +} + +export type Leaf = SignerLeaf | SubdigestLeaf | NestedLeaf | NodeLeaf + +export function isSignerLeaf(leaf: any): leaf is SignerLeaf { + return (leaf as SignerLeaf).address !== undefined && (leaf as SignerLeaf).weight !== undefined +} + +export function isSubdigestLeaf(leaf: any): leaf is SubdigestLeaf { + return (leaf as SubdigestLeaf).subdigest !== undefined && (leaf as SignerLeaf).address === undefined +} + +export function topologyToJSON(tree: Topology): string { + if (isNode(tree)) { + return JSON.stringify({ + left: topologyToJSON(tree.left), + right: topologyToJSON(tree.right) + }) + } + + if (isNestedLeaf(tree)) { + return JSON.stringify({ + weight: ethers.BigNumber.from(tree.weight).toString(), + threshold: ethers.BigNumber.from(tree.threshold).toString(), + tree: topologyToJSON(tree.tree) + }) + } + + if (isSignerLeaf(tree)) { + return JSON.stringify({ + address: tree.address, + weight: ethers.BigNumber.from(tree.weight).toString() + }) + } + + return JSON.stringify(tree) +} + +export function topologyFromJSON(json: string | object): Topology { + const parsed = typeof json === 'string' ? JSON.parse(json) : json + + if (parsed.left !== undefined && parsed.right !== undefined) { + return { + left: topologyFromJSON(parsed.left), + right: topologyFromJSON(parsed.right) + } + } + + if (parsed.weight !== undefined && parsed.threshold !== undefined && parsed.tree !== undefined) { + return { + weight: ethers.BigNumber.from(parsed.weight), + threshold: ethers.BigNumber.from(parsed.threshold), + tree: topologyFromJSON(parsed.tree) + } + } + + if (parsed.address !== undefined && parsed.weight !== undefined) { + return { + address: parsed.address, + weight: ethers.BigNumber.from(parsed.weight) + } + } + + return parsed +} + +export function isNestedLeaf(leaf: any): leaf is NestedLeaf { + return ( + (leaf as NestedLeaf).tree !== undefined && + (leaf as NestedLeaf).weight !== undefined && + (leaf as NestedLeaf).threshold !== undefined + ) +} + +export function isNodeLeaf(leaf: any): leaf is NodeLeaf { + return (leaf as NodeLeaf).nodeHash !== undefined +} + +export function isLeaf(leaf: any): leaf is Leaf { + return isSignerLeaf(leaf) || isSubdigestLeaf(leaf) || isNestedLeaf(leaf) || isNodeLeaf(leaf) +} + +// +// Tree typings - nodes +// + +export type Node = { + left: Node | Leaf + right: Node | Leaf +} + +export type Topology = Node | Leaf + +export function isNode(node: any): node is Node { + return (node as Node).left !== undefined && (node as Node).right !== undefined +} + +export function isTopology(topology: any): topology is Topology { + return isNode(topology) || isLeaf(topology) +} + +export function encodeSignerLeaf(leaf: SignerLeaf): string { + return ethers.utils.solidityPack(['uint96', 'address'], [leaf.weight, leaf.address]) +} + +export function decodeSignerLeaf(encoded: string): SignerLeaf { + const bytes = ethers.utils.arrayify(encoded) + + if (bytes.length !== 32) { + throw new Error('Invalid encoded string length') + } + + const weight = ethers.BigNumber.from(bytes.slice(0, 12)) + const address = ethers.utils.getAddress(ethers.utils.hexlify(bytes.slice(12))) + + return { weight, address } +} + +export function isEncodedSignerLeaf(encoded: string): boolean { + const bytes = ethers.utils.arrayify(encoded) + + if (bytes.length !== 32) { + return false + } + + const prefix = bytes.slice(0, 11) + return prefix.every(byte => byte === 0) +} + +export function hashNode(node: Node | Leaf): string { + if (isSignerLeaf(node)) { + return encodeSignerLeaf(node) + } + + if (isSubdigestLeaf(node)) { + return ethers.utils.solidityKeccak256(['string', 'bytes32'], ['Sequence static digest:\n', node.subdigest]) + } + + if (isNestedLeaf(node)) { + const nested = hashNode(node.tree) + return ethers.utils.solidityKeccak256( + ['string', 'bytes32', 'uint256', 'uint256'], + ['Sequence nested config:\n', nested, node.threshold, node.weight] + ) + } + + if (isNodeLeaf(node)) { + return node.nodeHash + } + + return ethers.utils.solidityKeccak256(['bytes32', 'bytes32'], [hashNode(node.left), hashNode(node.right)]) +} + +export function leftFace(topology: Topology): Topology[] { + const stack: Topology[] = [] + + let prev = topology + while (!isLeaf(prev)) { + stack.unshift(prev.right) + prev = prev.left + } + + stack.unshift(prev) + + return stack +} + +// +// Wallet config types +// + +export type WalletConfig = commons.config.Config & { + threshold: ethers.BigNumberish + checkpoint: ethers.BigNumberish + tree: Topology +} + +export function isWalletConfig(config: any): config is WalletConfig { + return ( + (config as WalletConfig).threshold !== undefined && + (config as WalletConfig).checkpoint !== undefined && + (config as WalletConfig).tree !== undefined && + (config as WalletConfig).version !== undefined && + (config as WalletConfig).version === 2 + ) +} + +export function imageHash(config: WalletConfig): string { + return ethers.utils.solidityKeccak256( + ['bytes32', 'uint256'], + [ethers.utils.solidityKeccak256(['bytes32', 'uint256'], [hashNode(config.tree), config.threshold]), config.checkpoint] + ) +} + +// +// Simple wallet config types +// (used for building and reading merkle configs) +// +// dev: `members` is a flat representation of the tree +// it keeps relevant structure like 'nested trees' but +// it ignores the tree structure +// +// + +export type SimpleNestedMember = { + threshold: ethers.BigNumberish + weight: ethers.BigNumberish + members: SimpleConfigMember[] +} + +export type SimpleConfigMember = SubdigestLeaf | SignerLeaf | SimpleNestedMember + +export type SimpleWalletConfig = { + threshold: ethers.BigNumberish + checkpoint: ethers.BigNumberish + members: SimpleConfigMember[] +} + +export function isSimpleNestedMember(member: any): member is SimpleNestedMember { + return ( + (member as SimpleNestedMember).threshold !== undefined && + (member as SimpleNestedMember).weight !== undefined && + (member as SimpleNestedMember).members !== undefined + ) +} + +export function topologyToMembers(tree: Topology): SimpleConfigMember[] { + if (isSignerLeaf(tree) || isSubdigestLeaf(tree)) { + return [tree] + } + + if (isNestedLeaf(tree)) { + return [ + { + threshold: tree.threshold, + weight: tree.weight, + members: topologyToMembers(tree.tree) + } + ] + } + + if (isNodeLeaf(tree)) { + // we don't know the content of this node + // so we omit it + return [] + } + + return [...topologyToMembers(tree.left), ...topologyToMembers(tree.right)] +} + +export function hasUnknownNodes(tree: Topology): boolean { + if (isNodeLeaf(tree)) { + return true + } + + if (isNode(tree)) { + return hasUnknownNodes(tree.left) || hasUnknownNodes(tree.right) + } + + return false +} + +export function toSimpleWalletConfig(config: WalletConfig): SimpleWalletConfig { + return { + threshold: config.threshold, + checkpoint: config.checkpoint, + members: topologyToMembers(config.tree) + } +} + +export type TopologyBuilder = (members: SimpleConfigMember[]) => Topology + +const membersAsTopologies = (members: SimpleConfigMember[], builder: TopologyBuilder): Topology[] => { + return members.map(member => { + if (isSimpleNestedMember(member)) { + return { + tree: builder(member.members), + threshold: member.threshold, + weight: member.weight + } + } + + return member + }) +} + +export function legacyTopologyBuilder(members: SimpleConfigMember[]): Topology { + if (members.length === 0) { + throw new Error('Empty members array') + } + + const asTopologies = membersAsTopologies(members, legacyTopologyBuilder) + return asTopologies.reduce((acc, member) => { + return { + left: acc, + right: member + } + }) +} + +export function merkleTopologyBuilder(members: SimpleConfigMember[]): Topology { + if (members.length === 0) { + throw new Error('Empty members array') + } + + const leaves = membersAsTopologies(members, merkleTopologyBuilder) + for (let s = leaves.length; s > 1; s = s / 2) { + for (let i = 0; i < s / 2; i++) { + const j1 = i * 2 + const j2 = j1 + 1 + + if (j2 >= s) { + leaves[i] = leaves[j1] + } else { + leaves[i] = { + left: leaves[j1], + right: leaves[j2] + } + } + } + } + + return leaves[0] +} + +export function optimized2SignersTopologyBuilder(members: SimpleConfigMember[]): Topology { + if (members.length > 8) { + return merkleTopologyBuilder(members) + } + + return legacyTopologyBuilder(members) +} + +export function toWalletConfig( + simpleWalletConfig: SimpleWalletConfig, + builder: TopologyBuilder = optimized2SignersTopologyBuilder +): WalletConfig { + return { + version: 2, + threshold: simpleWalletConfig.threshold, + checkpoint: simpleWalletConfig.checkpoint, + tree: builder(simpleWalletConfig.members) + } +} + +export function hasSubdigest(tree: Topology, subdigest: string): boolean { + if (isSubdigestLeaf(tree)) { + return tree.subdigest === subdigest + } + + if (isNode(tree)) { + return hasSubdigest(tree.left, subdigest) || hasSubdigest(tree.right, subdigest) + } + + return false +} + +export function signersOf(tree: Topology): { address: string; weight: number }[] { + const stack: Topology[] = [tree] + const signers = new Set<{ address: string; weight: number }>() + + while (stack.length > 0) { + const node = stack.pop() + + if (isNestedLeaf(node)) { + stack.push(node.tree) + } else if (isNode(node)) { + stack.push(node.left) + stack.push(node.right) + } else if (isSignerLeaf(node)) { + signers.add({ address: node.address, weight: ethers.BigNumber.from(node.weight).toNumber() }) + } + } + + return Array.from(signers) +} + +export function isComplete(tree: Topology): boolean { + if (isNode(tree)) { + return isComplete(tree.left) && isComplete(tree.right) + } + + return !isNodeLeaf(tree) +} + +export const ConfigCoder: commons.config.ConfigCoder = { + isWalletConfig: (config: commons.config.Config): config is WalletConfig => { + return config.version === 2 && (config as WalletConfig).threshold !== undefined && (config as WalletConfig).tree !== undefined + }, + + imageHashOf: (config: WalletConfig): string => { + return imageHash(config) + }, + + hasSubdigest: (config: WalletConfig, subdigest: string): boolean => { + return hasSubdigest(config.tree, subdigest) + }, + + checkpointOf: (config: WalletConfig): ethers.BigNumber => { + return ethers.BigNumber.from(config.checkpoint) + }, + + signersOf: (config: WalletConfig): { address: string; weight: number }[] => { + return signersOf(config.tree) + }, + + fromSimple: (config: SimpleConfig): WalletConfig => { + return toWalletConfig({ + ...config, + members: [...config.signers, ...(config.subdigests ?? []).map(subdigest => ({ subdigest }))] + }) + }, + + isComplete: (config: WalletConfig): boolean => { + return isComplete(config.tree) + }, + + // isValid = (config: WalletConfig): boolean {} + /** + * + * Notice: context and kind are ignored because v2 + * doesn't need to manually update the implementation before + * a configuration update, it's automatically done by the contract. + * + */ + update: { + isKindUsed: true, + + buildTransaction: ( + wallet: string, + config: WalletConfig, + _context: commons.context.WalletContext, + _kind?: 'first' | 'later' | undefined + ): commons.transaction.TransactionBundle => { + const module = new ethers.utils.Interface(walletContracts.mainModuleUpgradable.abi) + + return { + entrypoint: wallet, + transactions: [ + { + to: wallet, + data: module.encodeFunctionData(module.getFunction('updateImageHash'), [ConfigCoder.imageHashOf(config)]), + gasLimit: 0, + delegateCall: false, + revertOnError: true, + value: 0 + } + ] + } + }, + decodeTransaction: function (tx: commons.transaction.TransactionBundle): { + address: string + newImageHash: string + kind: 'first' | 'later' | undefined + } { + const module = new ethers.utils.Interface(walletContracts.mainModuleUpgradable.abi) + + if (tx.transactions.length !== 1) { + throw new Error('Invalid transaction bundle, expected 1 transaction') + } + + const data = tx.transactions[0].data + if (!data) { + throw new Error('Invalid transaction bundle, expected data') + } + + const decoded = module.decodeFunctionData(module.getFunction('updateImageHash'), data) + if (!decoded) { + throw new Error('Invalid transaction bundle, expected valid data') + } + + if (tx.transactions[0].to !== tx.entrypoint) { + throw new Error('Invalid transaction bundle, expected to be sent to entrypoint') + } + + if (tx.transactions[0].delegateCall) { + throw new Error('Invalid transaction bundle, expected not to be a delegateCall') + } + + if (!tx.transactions[0].revertOnError) { + throw new Error('Invalid transaction bundle, expected revertOnError') + } + + if (!ethers.constants.Zero.eq(tx.transactions[0]?.value ?? 0)) { + throw new Error('Invalid transaction bundle, expected value to be 0') + } + + if (!ethers.constants.Zero.eq(tx.transactions[0]?.gasLimit ?? 0)) { + throw new Error('Invalid transaction bundle, expected value to be 0') + } + + return { + address: tx.entrypoint, + newImageHash: decoded[0], + kind: undefined + } + } + }, + + toJSON: function (config: WalletConfig): string { + return JSON.stringify({ + version: config.version, + threshold: ethers.BigNumber.from(config.threshold).toString(), + checkpoint: ethers.BigNumber.from(config.checkpoint).toString(), + tree: topologyToJSON(config.tree) + }) + }, + + fromJSON: function (json: string): WalletConfig { + const config = JSON.parse(json) + return { + version: config.version, + threshold: ethers.BigNumber.from(config.threshold), + checkpoint: ethers.BigNumber.from(config.checkpoint), + tree: topologyFromJSON(config.tree) + } + }, + + editConfig: function ( + config: WalletConfig, + action: { + add?: commons.config.SimpleSigner[] + remove?: string[] + threshold?: ethers.BigNumberish + checkpoint?: ethers.BigNumberish + } + ): WalletConfig { + const members = topologyToMembers(config.tree) + + if (action.add) { + for (const signer of action.add) { + if (members.find(s => isSignerLeaf(s) && s.address === signer.address)) { + continue + } + + members.push({ + address: signer.address, + weight: signer.weight + }) + } + } + + if (action.remove) { + for (const address of action.remove) { + const index = members.findIndex(s => isSignerLeaf(s) && s.address === address) + if (index >= 0) { + members.splice(index, 1) + } + } + } + + return { + version: config.version, + threshold: action.threshold ?? config.threshold, + checkpoint: action.checkpoint ?? config.checkpoint, + tree: optimized2SignersTopologyBuilder(members) + } + }, + + buildStubSignature: function (config: WalletConfig, overrides: Map) { + const parts = new Map() + + for (const [signer, signature] of overrides.entries()) { + parts.set(signer, { signature, isDynamic: true }) + + const { encoded, weight } = encodeSigners(config, parts, [], 0) + + if (weight.gte(config.threshold)) { + return encoded + } + } + + const signers = signersOf(config.tree) + + for (const { address } of signers.sort(({ weight: a }, { weight: b }) => a - b)) { + const signature = + '0x4e82f02f388a12b5f9d29eaf2452dd040c0ee5804b4e504b4dd64e396c6c781f2c7624195acba242dd825bfd25a290912e3c230841fd55c9a734c4de8d9899451b02' + parts.set(address, { signature, isDynamic: false }) + + const { encoded, weight } = encodeSigners(config, parts, [], 0) + + if (weight.gte(config.threshold)) { + return encoded + } + } + + return encodeSigners(config, parts, [], 0).encoded + } +} diff --git a/packages/core/src/v2/context.ts b/packages/core/src/v2/context.ts new file mode 100644 index 000000000..6092201d1 --- /dev/null +++ b/packages/core/src/v2/context.ts @@ -0,0 +1,5 @@ +import { WalletContext as BaseContext } from '../commons/context' + +export type WalletContext = BaseContext & { + version: 2 +} diff --git a/packages/core/src/v2/index.ts b/packages/core/src/v2/index.ts new file mode 100644 index 000000000..f921265a4 --- /dev/null +++ b/packages/core/src/v2/index.ts @@ -0,0 +1,25 @@ +import { WalletContext } from '../commons/context' + +export * as config from './config' +export * as signature from './signature' +export * as context from './context' +export * as chained from './chained' + +import { ConfigCoder } from './config' +import { SignatureCoder } from './signature' + +export const coders = { + config: ConfigCoder, + signature: SignatureCoder +} + +export const version = 2 + +export const DeployedWalletContext: WalletContext = { + version: version, + factory: '0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A', + guestModule: '0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE', + mainModule: '0xfBf8f1A5E00034762D928f46d438B947f5d4065d', + mainModuleUpgradable: '0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911', + walletCreationCode: '0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3' +} diff --git a/packages/core/src/v2/signature.ts b/packages/core/src/v2/signature.ts new file mode 100644 index 000000000..2fa5415e5 --- /dev/null +++ b/packages/core/src/v2/signature.ts @@ -0,0 +1,977 @@ +import { BigNumberish, ethers } from 'ethers' +import { isValidSignature, recoverSigner, tryRecoverSigner } from '../commons/signer' +import { + hashNode, + isNestedLeaf, + isNode, + isNodeLeaf, + isSignerLeaf, + isSubdigestLeaf, + Leaf, + WalletConfig, + SignerLeaf, + Topology, + imageHash, + NodeLeaf, + decodeSignerLeaf, + isEncodedSignerLeaf +} from './config' +import * as base from '../commons/signature' +import { hashSetImageHash } from './chained' + +export enum SignatureType { + Legacy = 0, + Dynamic = 1, + NoChainIdDynamic = 2, + Chained = 3 +} + +export enum SignaturePartType { + Signature = 0, + Address = 1, + DynamicSignature = 2, + Node = 3, + Branch = 4, + Subdigest = 5, + Nested = 6 +} + +export const SignaturePartTypeLength = 66 + +export type SignatureLeaf = SignerLeaf & { + signature: string + isDynamic: boolean +} + +export type UnrecoveredSignatureLeaf = Omit & + Pick, 'address'> & { + unrecovered: true + } + +export type UnrecoveredNestedLeaf = { + tree: UnrecoveredTopology + weight: BigNumberish + threshold: BigNumberish +} + +export type UnrecoveredLeaf = UnrecoveredNestedLeaf | UnrecoveredSignatureLeaf | Leaf + +export type UnrecoveredNode = { + left: UnrecoveredNode | UnrecoveredLeaf + right: UnrecoveredNode | UnrecoveredLeaf +} + +export type UnrecoveredTopology = UnrecoveredNode | UnrecoveredLeaf + +export function isUnrecoveredNode(node: UnrecoveredTopology): node is UnrecoveredNode { + return (node as UnrecoveredNode).left !== undefined && (node as UnrecoveredNode).right !== undefined +} + +export function isUnrecoveredNestedLeaf(leaf: UnrecoveredTopology): leaf is UnrecoveredNestedLeaf { + return (leaf as UnrecoveredNestedLeaf).tree !== undefined +} + +export function isUnrecoveredSignatureLeaf(leaf: UnrecoveredTopology): leaf is UnrecoveredSignatureLeaf { + return ( + (leaf as UnrecoveredSignatureLeaf).unrecovered && + (leaf as UnrecoveredSignatureLeaf).signature !== undefined && + (leaf as UnrecoveredSignatureLeaf).isDynamic !== undefined + ) +} + +export function decodeSignatureTree(body: ethers.BytesLike): UnrecoveredTopology { + let arr = ethers.utils.arrayify(body) + + let pointer: undefined | (Omit & Pick, 'right'>) + + const append = (prevPointer: typeof pointer, node: UnrecoveredNode | UnrecoveredLeaf): typeof pointer => { + if (!prevPointer) { + return { + left: node + } + } + + if (!prevPointer.right) { + return { + left: prevPointer.left, + right: node + } + } + + return { + left: prevPointer as Required, + right: node + } + } + + while (arr.length > 0) { + const type = arr[0] as SignaturePartType + arr = arr.slice(1) + + switch (type) { + case SignaturePartType.Signature: + { + const weight = arr[0] + const signature = ethers.utils.hexlify(arr.slice(1, SignaturePartTypeLength + 1)) + + pointer = append(pointer, { + signature, + weight, + unrecovered: true, + isDynamic: false + }) + arr = arr.slice(SignaturePartTypeLength + 1) + } + break + + case SignaturePartType.Address: + { + const weight = arr[0] + const address = ethers.utils.getAddress(ethers.utils.hexlify(arr.slice(1, 21))) + + pointer = append(pointer, { + address, + weight + }) + arr = arr.slice(21) + } + break + + case SignaturePartType.DynamicSignature: + { + const weight = arr[0] + const address = ethers.utils.getAddress(ethers.utils.hexlify(arr.slice(1, 21))) + const size = (arr[21] << 16) | (arr[22] << 8) | arr[23] + const signature = ethers.utils.hexlify(arr.slice(24, 24 + size)) + + pointer = append(pointer, { + address, + signature, + weight, + unrecovered: true, + isDynamic: true + }) + arr = arr.slice(24 + size) + } + break + + case SignaturePartType.Node: + { + const nodeHash = ethers.utils.hexlify(arr.slice(0, 32)) + + pointer = append(pointer, { nodeHash }) + arr = arr.slice(32) + } + break + + case SignaturePartType.Branch: + { + const size = (arr[0] << 16) | (arr[1] << 8) | arr[2] + const branch = decodeSignatureTree(arr.slice(3, 3 + size)) + + pointer = append(pointer, branch) + arr = arr.slice(3 + size) + } + break + + case SignaturePartType.Subdigest: + { + const subdigest = ethers.utils.hexlify(arr.slice(0, 32)) + + pointer = append(pointer, { subdigest }) + arr = arr.slice(32) + } + break + + case SignaturePartType.Nested: + { + const weight = arr[0] + const threshold = (arr[1] << 8) | arr[2] + const size = (arr[3] << 16) | (arr[4] << 8) | arr[5] + + const tree = decodeSignatureTree(arr.slice(6, 6 + size)) + + pointer = append(pointer, { + weight, + threshold, + tree + }) + arr = arr.slice(6 + size) + } + break + + default: + throw new Error(`Unknown signature part type: ${type}: ${ethers.utils.hexlify(arr)}`) + } + } + + if (!pointer) { + throw new Error('Empty signature tree') + } + + if (pointer.right) { + return pointer as Required + } + + return pointer.left +} + +export class InvalidSignatureLeafError extends Error { + constructor(public leaf: UnrecoveredLeaf) { + super(`Invalid signature leaf: ${JSON.stringify(leaf)}`) + } +} + +export async function recoverTopology( + unrecovered: UnrecoveredTopology, + subdigest: string, + provider: ethers.providers.Provider +): Promise { + if (isUnrecoveredNode(unrecovered)) { + const [left, right] = await Promise.all([ + recoverTopology(unrecovered.left, subdigest, provider), + recoverTopology(unrecovered.right, subdigest, provider) + ]) + + return { left, right } + } + + if (isUnrecoveredNestedLeaf(unrecovered)) { + return { + weight: unrecovered.weight, + threshold: unrecovered.threshold, + tree: await recoverTopology(unrecovered.tree, subdigest, provider) + } + } + + if (isUnrecoveredSignatureLeaf(unrecovered)) { + if (unrecovered.isDynamic) { + if (!unrecovered.address) { + throw new Error('Dynamic signature leaf without address') + } + + const isValid = await isValidSignature(unrecovered.address, subdigest, unrecovered.signature, provider) + if (!isValid) { + throw new InvalidSignatureLeafError(unrecovered) + } + + return { + weight: unrecovered.weight, + address: unrecovered.address!, + signature: unrecovered.signature, + subdigest + } + } else { + return { + weight: unrecovered.weight, + address: recoverSigner(subdigest, unrecovered.signature), + signature: unrecovered.signature, + subdigest + } + } + } + + return unrecovered +} + +// TODO: It should be possible to re-use encodeSignatureTree +// and avoid duplicating this logic +export const partEncoder = { + concat: (a: ethers.BytesLike, b: ethers.BytesLike) => { + return ethers.utils.solidityPack(['bytes', 'bytes'], [a, b]) + }, + node: (nodeHash: ethers.BytesLike): string => { + return ethers.utils.solidityPack(['uint8', 'bytes32'], [SignaturePartType.Node, nodeHash]) + }, + branch: (tree: ethers.BytesLike): string => { + const arr = ethers.utils.arrayify(tree) + return ethers.utils.solidityPack(['uint8', 'uint24', 'bytes'], [SignaturePartType.Branch, arr.length, arr]) + }, + nested: (weight: ethers.BigNumberish, threshold: ethers.BigNumberish, tree: ethers.BytesLike): string => { + const arr = ethers.utils.arrayify(tree) + return ethers.utils.solidityPack( + ['uint8', 'uint8', 'uint16', 'uint24', 'bytes'], + [SignaturePartType.Nested, weight, threshold, arr.length, arr] + ) + }, + subdigest: (subdigest: ethers.BytesLike): string => { + return ethers.utils.solidityPack(['uint8', 'bytes32'], [SignaturePartType.Subdigest, subdigest]) + }, + signature: (weight: ethers.BigNumberish, signature: ethers.BytesLike): string => { + return ethers.utils.solidityPack(['uint8', 'uint8', 'bytes'], [SignaturePartType.Signature, weight, signature]) + }, + dynamicSignature: (weight: ethers.BigNumberish, address: ethers.BytesLike, signature: ethers.BytesLike): string => { + const arrSignature = ethers.utils.arrayify(signature) + return ethers.utils.solidityPack( + ['uint8', 'uint8', 'address', 'uint24', 'bytes'], + [SignaturePartType.DynamicSignature, weight, address, arrSignature.length, arrSignature] + ) + }, + address: (weight: ethers.BigNumberish, address: ethers.BytesLike): string => { + return ethers.utils.solidityPack(['uint8', 'uint8', 'address'], [SignaturePartType.Address, weight, address]) + } +} + +export type EncodingOptions = { + forceDynamicEncoding?: boolean + disableTrim?: boolean +} + +export function encodeSigners( + config: WalletConfig, + parts: Map, + subdigests: string[], + chainId: ethers.BigNumberish, + options: EncodingOptions = {} +): { + encoded: string + weight: ethers.BigNumber +} { + const tree = encodeTree(config.tree, parts, subdigests, options) + + if (ethers.BigNumber.from(chainId).isZero()) { + return { + encoded: ethers.utils.solidityPack( + ['uint8', 'uint16', 'uint32', 'bytes'], + [SignatureType.NoChainIdDynamic, config.threshold, config.checkpoint, tree.encoded] + ), + weight: tree.weight + } + } + + if (ethers.BigNumber.from(config.threshold).gt(255)) { + return { + encoded: ethers.utils.solidityPack( + ['uint8', 'uint16', 'uint32', 'bytes'], + [SignatureType.Dynamic, config.threshold, config.checkpoint, tree.encoded] + ), + weight: tree.weight + } + } + + return { + encoded: ethers.utils.solidityPack( + ['uint8', 'uint8', 'uint32', 'bytes'], + [SignatureType.Legacy, config.threshold, config.checkpoint, tree.encoded] + ), + weight: tree.weight + } +} + +export function encodeTree( + topology: Topology, + parts: Map, + subdigests: string[], + options: EncodingOptions = {} +): { + encoded: string + weight: ethers.BigNumber +} { + const trim = !options.disableTrim + + if (isNode(topology)) { + const left = encodeTree(topology.left, parts, subdigests) + const right = encodeTree(topology.right, parts, subdigests) + + const isLeftSigner = isSignerLeaf(topology.left) + const isRightSigner = isSignerLeaf(topology.right) + + if (trim && left.weight.eq(0) && right.weight.eq(0) && !isLeftSigner && !isRightSigner) { + return { + // We don't need to include anything for this node + // just the hash will be enough + encoded: partEncoder.node(hashNode(topology)), + weight: ethers.constants.Zero + } + } + + if (trim && right.weight.eq(0) && !isRightSigner) { + return { + // The right node doesn't have any weight + // but we still need to include the left node encoded + encoded: partEncoder.concat(left.encoded, partEncoder.node(hashNode(topology.right))), + weight: left.weight + } + } + + if (trim && left.weight.eq(0) && !isLeftSigner) { + return { + // The left node doesn't have any weight + // we can just append its hash, but for the right node + // we need to create a new "branch" + encoded: partEncoder.concat(partEncoder.node(hashNode(topology.left)), partEncoder.branch(right.encoded)), + weight: right.weight + } + } + + return { + // Both nodes have weight, we need to include both + // the right one must be a branch + encoded: partEncoder.concat(left.encoded, partEncoder.branch(right.encoded)), + weight: left.weight.add(right.weight) + } + } + + if (isNestedLeaf(topology)) { + const tree = encodeTree(topology.tree, parts, subdigests) + + if (trim && tree.weight.eq(0)) { + return { + encoded: partEncoder.node(hashNode(topology)), + weight: ethers.constants.Zero + } + } + + return { + encoded: partEncoder.nested(topology.weight, topology.threshold, tree.encoded), + weight: tree.weight + } + } + + if (isNodeLeaf(topology)) { + return { + encoded: partEncoder.node(hashNode(topology)), + weight: ethers.constants.Zero + } + } + + if (isSubdigestLeaf(topology)) { + const include = subdigests.includes(topology.subdigest) + return { + encoded: partEncoder.subdigest(topology.subdigest), + weight: include ? ethers.constants.MaxUint256 : ethers.constants.Zero + } + } + + if (isSignerLeaf(topology)) { + const include = parts.has(topology.address) + + if (include) { + const part = parts.get(topology.address)! + const signature = part.signature + + if (options.forceDynamicEncoding || part.isDynamic) { + return { + encoded: partEncoder.dynamicSignature(topology.weight, topology.address, signature), + weight: ethers.BigNumber.from(topology.weight) + } + } else { + return { + encoded: partEncoder.signature(topology.weight, signature), + weight: ethers.BigNumber.from(topology.weight) + } + } + } else { + return { + encoded: partEncoder.address(topology.weight, topology.address), + weight: ethers.constants.Zero + } + } + } + + throw new Error(`Invalid topology - unknown error: ${JSON.stringify(topology)}`) +} + +export type UnrecoveredConfig = { + tree: UnrecoveredTopology + threshold: ethers.BigNumberish + checkpoint: ethers.BigNumberish +} + +export type UnrecoveredSignature = base.UnrecoveredSignature & { + type: SignatureType + decoded: UnrecoveredConfig +} + +export type Signature = base.Signature & { + type: SignatureType +} + +export type UnrecoveredChainedSignature = UnrecoveredSignature & { + suffix: (UnrecoveredSignature | UnrecoveredChainedSignature)[] +} + +export type ChainedSignature = Signature & { + suffix: (Signature | ChainedSignature)[] +} + +export function deepestConfigOfSignature(signature: Signature | ChainedSignature): WalletConfig { + return isChainedSignature(signature) + ? deepestConfigOfSignature(signature.suffix[signature.suffix.length - 1]) + : signature.config +} + +export function isUnrecoveredSignature(sig: any): sig is UnrecoveredSignature { + return sig.type !== undefined && sig.decoded !== undefined && sig.version !== undefined && sig.version === 2 +} + +export function isUnrecoveredChainedSignature(sig: any): sig is UnrecoveredChainedSignature { + return sig.suffix !== undefined && Array.isArray(sig.suffix) && sig.suffix.every(isUnrecoveredSignature) +} + +export function isSignature(sig: any): sig is Signature { + return ( + sig.type !== undefined && + sig.config !== undefined && + sig.digest !== undefined && + sig.version !== undefined && + sig.version === 2 + ) +} + +export function isChainedSignature(sig: any): sig is ChainedSignature { + return sig.chain !== undefined && Array.isArray(sig.chain) && sig.chain.every(isSignature) +} + +export function decodeSignature(signature: ethers.BytesLike): UnrecoveredSignature | UnrecoveredChainedSignature { + const bytes = ethers.utils.arrayify(signature) + const type = bytes[0] + + switch (type) { + case SignatureType.Legacy: + return { version: 2, type: SignatureType.Legacy, decoded: decodeSignatureBody(bytes) } + + case SignatureType.Dynamic: + return { version: 2, type: SignatureType.Dynamic, decoded: decodeSignatureBody(bytes.slice(1)) } + + case SignatureType.NoChainIdDynamic: + return { version: 2, type: SignatureType.NoChainIdDynamic, decoded: decodeSignatureBody(bytes.slice(1)) } + + case SignatureType.Chained: + return decodeChainedSignature(bytes) + + default: + throw new Error(`Invalid signature type: ${type}`) + } +} + +export function decodeSignatureBody(signature: ethers.BytesLike): UnrecoveredConfig { + const bytes = ethers.utils.arrayify(signature) + + const threshold = (bytes[0] << 8) | bytes[1] + const checkpoint = (bytes[2] << 24) | (bytes[3] << 16) | (bytes[4] << 8) | bytes[5] + + const tree = decodeSignatureTree(bytes.slice(6)) + + return { threshold, checkpoint, tree } +} + +export function decodeChainedSignature(signature: ethers.BytesLike): UnrecoveredChainedSignature { + const arr = ethers.utils.arrayify(signature) + const type = arr[0] + + if (type !== SignatureType.Chained) { + throw new Error(`Expected chained signature type: ${type}`) + } + + const chain: (UnrecoveredSignature | UnrecoveredChainedSignature)[] = [] + let index = 1 + + while (index < arr.length) { + const size = (arr[index] << 16) | (arr[index + 1] << 8) | arr[index + 2] + index += 3 + + const sig = decodeSignature(arr.slice(index, index + size)) + chain.push(sig) + + index += size + } + + const main = chain[0] + if (isUnrecoveredChainedSignature(main)) { + throw new Error(`Expected first link of chained signature to be a simple signature (not chained)`) + } + + const suffix = chain.slice(1) + + return { ...main, suffix } +} + +export function setImageHashStruct(imageHash: string) { + return ethers.utils.solidityPack( + ['bytes32', 'bytes32'], + [ethers.utils.solidityKeccak256(['string'], ['SetImageHash(bytes32 imageHash)']), imageHash] + ) +} + +export async function recoverSignature( + signature: UnrecoveredSignature | UnrecoveredChainedSignature, + payload: base.SignedPayload | { subdigest: string }, + provider: ethers.providers.Provider +): Promise { + const signedPayload = (payload as { subdigest: string }).subdigest === undefined ? (payload as base.SignedPayload) : undefined + + const isNoChainId = signature.type === SignatureType.NoChainIdDynamic + if (isNoChainId && signedPayload) { + signedPayload.chainId = 0 + } + + const subdigest = signedPayload ? base.subdigestOf(signedPayload) : (payload as { subdigest: string }).subdigest + + if (!isUnrecoveredChainedSignature(signature)) { + const tree = await recoverTopology(signature.decoded.tree, subdigest, provider) + return { version: 2, type: signature.type, subdigest, config: { version: 2, ...signature.decoded, tree } } + } + + if (!base.isSignedPayload(signedPayload)) { + throw new Error(`Chained signature recovery requires detailed signed payload, subdigest is not enough`) + } + + const result: (Signature | ChainedSignature)[] = [] + let mutatedPayload = signedPayload + + // Recover the chain of signatures + // NOTICE: Remove the suffix from the "first" siganture + // otherwise we recurse infinitely + for (const sig of [{ ...signature, suffix: undefined }, ...signature.suffix]) { + const recovered = await recoverSignature(sig, mutatedPayload, provider) + result.unshift(recovered) + + const nextMessage = setImageHashStruct(imageHash(deepestConfigOfSignature(recovered))) + + mutatedPayload = { + ...mutatedPayload, + message: nextMessage, + digest: ethers.utils.keccak256(nextMessage) + } + } + + const main = result[0] + const suffix = result.slice(1) + + return { ...main, suffix } +} + +export function encodeChain(main: ethers.BytesLike, suffix: ethers.BytesLike[]): string { + const allSignatures = [main, ...(suffix || [])] + const encodedMap = allSignatures.map(s => ethers.utils.arrayify(encodeSignature(s))) + + const body = ethers.utils.solidityPack( + encodedMap.map(() => ['uint24', 'bytes']).flat(), + encodedMap.map(s => [s.length, s]).flat() + ) + + return ethers.utils.solidityPack(['uint8', 'bytes'], [SignatureType.Chained, body]) +} + +export function encodeSignature( + decoded: UnrecoveredChainedSignature | ChainedSignature | UnrecoveredSignature | Signature | ethers.BytesLike +): string { + if (ethers.utils.isBytesLike(decoded)) return ethers.utils.hexlify(decoded) + + if (isUnrecoveredChainedSignature(decoded) || isChainedSignature(decoded)) { + return encodeChain(encodeSignature(decoded), (decoded.suffix || []).map(encodeSignature)) + } + + const body = isUnrecoveredSignature(decoded) ? decoded.decoded : decoded.config + + switch (decoded.type) { + case SignatureType.Legacy: + if (ethers.BigNumber.from(body.threshold).gt(255)) { + throw new Error(`Legacy signature threshold is too large: ${body.threshold} (max 255)`) + } + + return encodeSignatureBody(body) + + case SignatureType.NoChainIdDynamic: + case SignatureType.Dynamic: + return ethers.utils.solidityPack(['uint8', 'bytes'], [decoded.type, encodeSignatureBody(body)]) + + case SignatureType.Chained: + throw new Error(`Unreachable code: Chained signature should be handled above`) + + default: + throw new Error(`Invalid signature type: ${decoded.type}`) + } +} + +export function encodeSignatureBody(decoded: WalletConfig | UnrecoveredConfig): string { + return ethers.utils.solidityPack( + ['uint16', 'uint32', 'bytes'], + [decoded.threshold, decoded.checkpoint, encodeSignatureTree(decoded.tree)] + ) +} + +export function encodeSignatureTree(tree: UnrecoveredTopology | Topology): string { + if (isNode(tree) || isUnrecoveredNode(tree)) { + const encodedRight = ethers.utils.arrayify(encodeSignatureTree(tree.right)) + const encodedLeft = ethers.utils.arrayify(encodeSignatureTree(tree.left)) + const isBranching = isNode(tree.right) || isUnrecoveredNode(tree.right) + + if (isBranching) { + return ethers.utils.solidityPack( + ['bytes', 'uint8', 'uint24', 'bytes'], + [encodedLeft, SignaturePartType.Branch, encodedRight.length, encodedRight] + ) + } else { + return ethers.utils.solidityPack(['bytes', 'bytes'], [encodedLeft, encodedRight]) + } + } + + if (isNestedLeaf(tree) || isUnrecoveredNestedLeaf(tree)) { + const nested = ethers.utils.arrayify(encodeSignatureTree(tree.tree)) + + return ethers.utils.solidityPack( + ['uint8', 'uint8', 'uint16', 'uint24', 'bytes'], + [SignaturePartType.Nested, tree.weight, tree.threshold, nested.length, nested] + ) + } + + if (isUnrecoveredSignatureLeaf(tree) || (isSignerLeaf(tree) && tree.signature !== undefined)) { + const signature = ethers.utils.arrayify(tree.signature!) + + if ((tree as { isDynamic?: boolean }).isDynamic || signature.length !== SignaturePartTypeLength) { + if (!tree.address) throw new Error(`Dynamic signature leaf must have address`) + return ethers.utils.solidityPack( + ['uint8', 'uint8', 'address', 'uint24', 'bytes'], + [SignaturePartType.DynamicSignature, tree.weight, tree.address, signature.length, signature] + ) + } else { + return ethers.utils.solidityPack(['uint8', 'uint8', 'bytes'], [SignaturePartType.Signature, tree.weight, signature]) + } + } + + if (isSignerLeaf(tree)) { + return ethers.utils.solidityPack(['uint8', 'uint8', 'address'], [SignaturePartType.Address, tree.weight, tree.address]) + } + + if (isNodeLeaf(tree)) { + return ethers.utils.solidityPack(['uint8', 'bytes32'], [SignaturePartType.Node, tree.nodeHash]) + } + + if (isSubdigestLeaf(tree)) { + return ethers.utils.solidityPack(['uint8', 'bytes32'], [SignaturePartType.Subdigest, tree.subdigest]) + } + + throw new Error(`Unknown signature tree type: ${tree}`) +} + +export function signaturesOf(topology: Topology): { address: string; signature: string }[] { + if (isNode(topology)) { + return [...signaturesOf(topology.left), ...signaturesOf(topology.right)] + } + + if (isNestedLeaf(topology)) { + return signaturesOf(topology.tree) + } + + if (isSignerLeaf(topology) && topology.signature) { + return [{ address: topology.address, signature: topology.signature }] + } + + return [] +} + +export function signaturesOfDecoded(utopology: UnrecoveredTopology): string[] { + if (isUnrecoveredNode(utopology)) { + return [...signaturesOfDecoded(utopology.left), ...signaturesOfDecoded(utopology.right)] + } + + if (isUnrecoveredNestedLeaf(utopology)) { + return signaturesOfDecoded(utopology.tree) + } + + if (isUnrecoveredSignatureLeaf(utopology)) { + return [utopology.signature] + } + + return [] +} + +export function subdigestsOfDecoded(utopology: UnrecoveredTopology): string[] { + if (isUnrecoveredNode(utopology)) { + return [...subdigestsOfDecoded(utopology.left), ...subdigestsOfDecoded(utopology.right)] + } + + if (isUnrecoveredNestedLeaf(utopology)) { + return subdigestsOfDecoded(utopology.tree) + } + + if (isSubdigestLeaf(utopology)) { + return [utopology.subdigest] + } + + return [] +} + +export async function trimSignature(signature: string | UnrecoveredSignature): Promise { + const decoded = typeof signature === 'string' ? decodeSignature(signature) : signature + + if (isUnrecoveredChainedSignature(decoded)) { + // We need to trim every suffix AND the main signature + const trimmed = await Promise.all([ + trimSignature({ ...decoded, suffix: undefined } as UnrecoveredSignature), + ...decoded.suffix.map(s => trimSignature(s)) + ]) + + return encodeChain(trimmed[0], trimmed.slice(1)) + } + + const { trimmed } = await trimUnrecoveredTree(decoded.decoded.tree) + return encodeSignature({ ...decoded, decoded: { ...decoded.decoded, tree: trimmed } }) +} + +export async function trimUnrecoveredTree( + tree: UnrecoveredTopology, + trimStaticDigest: boolean = true +): Promise<{ + weight: number + trimmed: UnrecoveredTopology +}> { + if (isUnrecoveredNode(tree)) { + const [left, right] = await Promise.all([trimUnrecoveredTree(tree.left), trimUnrecoveredTree(tree.right)]) + + if (left.weight === 0 && right.weight === 0) { + try { + // If both weights are 0 then it means we don't have any signatures yet + // because of that, we should be able to "recover" the tree with any subdigest + // and still get the valid node hash (there shouldn't be any signatures to verify) + const recovered = await recoverTopology(tree, ethers.constants.HashZero, undefined as any) + + return { + weight: 0, + trimmed: { + nodeHash: hashNode(recovered) + } as NodeLeaf + } + } catch { + // If something fails it's more likely because some signatures have sneaked in + // in that case we should keep this node + } + } else { + return { + weight: left.weight + right.weight, + trimmed: { + left: left.trimmed, + right: right.trimmed + } as UnrecoveredNode + } + } + } + + if (isUnrecoveredNestedLeaf(tree)) { + const trimmed = await trimUnrecoveredTree(tree.tree) + + if (trimmed.weight === 0) { + try { + // If the nested leaf is empty, we can recover it with any subdigest + // and still get the valid node hash (there shouldn't be any signatures to verify) + const recovered = await recoverTopology(tree, ethers.constants.HashZero, undefined as any) + + return { + weight: 0, + trimmed: { + nodeHash: hashNode(recovered) + } as NodeLeaf + } + } catch { + // If something fails it's more likely because some signatures have sneaked in + // in that case we should keep this node + } + } + + return { + weight: trimmed.weight, + trimmed: { + weight: tree.weight, + threshold: tree.threshold, + tree: trimmed.trimmed + } as UnrecoveredNestedLeaf + } + } + + // Hash nodes can be encoded as signer leaves if they have a weight below + // 256, most likely the are signer leaves wrongly encoded + if (isNodeLeaf(tree) && isEncodedSignerLeaf(tree.nodeHash)) { + return { + weight: 0, + trimmed: { + ...decodeSignerLeaf(tree.nodeHash) + } as SignerLeaf + } + } + + if (isUnrecoveredSignatureLeaf(tree) || (isSignerLeaf(tree) && tree.signature !== undefined)) { + return { + weight: ethers.BigNumber.from(tree.weight).toNumber(), + trimmed: tree + } + } + + if (!trimStaticDigest && isSubdigestLeaf(tree)) { + return { + weight: +Infinity, + trimmed: tree + } + } + + return { + weight: 0, + trimmed: tree + } +} + +export const SignatureCoder: base.SignatureCoder = { + decode: (data: string): UnrecoveredSignature => { + return decodeSignature(data) + }, + + encode: (data: Signature | UnrecoveredSignature): string => { + return encodeSignature(data) + }, + + trim: (data: string): Promise => { + return trimSignature(data) + }, + + supportsNoChainId: true, + + recover: ( + data: UnrecoveredSignature | UnrecoveredChainedSignature, + payload: base.SignedPayload, + provider: ethers.providers.Provider + ): Promise => { + return recoverSignature(data, payload, provider) + }, + + encodeSigners: ( + config: WalletConfig, + signatures: Map, + subdigests: string[], + chainId: ethers.BigNumberish + ): { + encoded: string + weight: ethers.BigNumber + } => { + return encodeSigners(config, signatures, subdigests, chainId) + }, + + hasEnoughSigningPower: (config: WalletConfig, signatures: Map): boolean => { + const { weight } = SignatureCoder.encodeSigners(config, signatures, [], 0) + return weight.gte(config.threshold) + }, + + chainSignatures: ( + main: Signature | UnrecoveredSignature | UnrecoveredChainedSignature | ethers.BytesLike, + suffix: (Signature | UnrecoveredSignature | UnrecoveredChainedSignature | ethers.BytesLike)[] + ): string => { + // Notice: v2 expects suffix to be reversed + // that being: from signed to current imageHash + const reversed = suffix.reverse() + const mraw = ethers.utils.isBytesLike(main) ? main : encodeSignature(main) + const sraw = reversed.map(s => (ethers.utils.isBytesLike(s) ? s : encodeSignature(s))) + return encodeChain(mraw, sraw) + }, + + hashSetImageHash: function (imageHash: string): string { + return hashSetImageHash(imageHash) + }, + + signaturesOf(config: WalletConfig): { address: string; signature: string }[] { + return signaturesOf(config.tree) + }, + + signaturesOfDecoded: function (data: UnrecoveredSignature): string[] { + return signaturesOfDecoded(data.decoded.tree) + } +} diff --git a/packages/core/tests/v2/config.spec.ts b/packages/core/tests/v2/config.spec.ts new file mode 100644 index 000000000..c9f88535c --- /dev/null +++ b/packages/core/tests/v2/config.spec.ts @@ -0,0 +1,512 @@ +import { expect } from 'chai' +import { config } from '../../src/v2' + +const sampleTree1: config.Topology = { + left: { + address: '0x07ab71Fe97F9122a2dBE3797aa441623f5a59DB1', + weight: 2 + }, + right: { + left: { + left: { + subdigest: '0xb374baf809e388014912ca7020c8ef51ad68591db3f010f9e35a77c15d4d6bed' + }, + right: { + subdigest: '0x787c83a19321fc70f8653f8faa39cce60bf26cac51c25df1b0634eb7ddbe0c60' + } + }, + right: { + address: '0xdafea492d9c6733ae3d56b7ed1adb60692c98bc5', + weight: 1 + } + } +} + +const sampleTree2: config.Topology = { + left: { + left: { + left: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000000' + }, + right: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000001' + } + }, + right: { + left: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000002' + }, + right: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000003' + } + } + }, + right: { + left: { + left: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000004' + }, + right: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000005' + } + }, + right: { + left: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000006' + }, + right: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000007' + } + } + } +} + +const sampleTree3: config.Topology = { + left: { + tree: { + left: { + address: '0x07ab71Fe97F9122a2dBE3797aa441623f5a59DB1', + weight: 2 + }, + right: { + left: { + subdigest: '0x0000000000000000000000000000000000000000000000000000000000000006' + }, + right: { + subdigest: '0x787c83a19321fc70f8653f8faa39cce60bf26cac51c25df10000000000000000' + } + } + }, + weight: 90, + threshold: 2 + }, + right: { + left: { + left: { + subdigest: '0xb374baf809e388014912ca7020c8ef51ad68591db3f010f9e35a77c15d4d6bed' + }, + right: { + subdigest: '0x787c83a19321fc70f8653f8faa39cce60bf26cac51c25df1b0634eb7ddbe0c60' + } + }, + right: { + address: '0xdafea492d9c6733ae3d56b7ed1adb60692c98bc5', + weight: 1 + } + } +} + +describe('v2 config utils', () => { + describe('Detect different leaves', () => { + it('Should detect signer leaf', () => { + const leaf: config.Leaf = { + address: '0x07ab71Fe97F9122a2dBE3797aa441623f5a59DB1', + weight: 2 + } + + expect(config.isLeaf(leaf)).to.be.true + expect(config.isSignerLeaf(leaf)).to.be.true + expect(config.isTopology(leaf)).to.be.true + expect(config.isNode(leaf)).to.be.false + expect(config.isSubdigestLeaf(leaf)).to.be.false + expect(config.isNestedLeaf(leaf)).to.be.false + }) + + it('Should detect subdigest leaf', () => { + const leaf: config.Leaf = { + subdigest: '0x787c83a19321fc70f8653f8faa39cce60bf26cac51c25df1b0634eb7ddbe0c60' + } + + expect(config.isLeaf(leaf)).to.be.true + expect(config.isSubdigestLeaf(leaf)).to.be.true + expect(config.isTopology(leaf)).to.be.true + expect(config.isNode(leaf)).to.be.false + expect(config.isSignerLeaf(leaf)).to.be.false + expect(config.isNestedLeaf(leaf)).to.be.false + }) + + it('Should detect nested leaf', () => { + const leaf: config.Leaf = { + tree: sampleTree1, + weight: 90, + threshold: 2 + } + + expect(config.isLeaf(leaf)).to.be.true + expect(config.isNestedLeaf(leaf)).to.be.true + expect(config.isTopology(leaf)).to.be.true + expect(config.isNode(leaf)).to.be.false + expect(config.isSignerLeaf(leaf)).to.be.false + expect(config.isSubdigestLeaf(leaf)).to.be.false + }) + + it('Should detect node', () => { + expect(config.isTopology(sampleTree1)).to.be.true + expect(config.isNode(sampleTree1)).to.be.true + expect(config.isLeaf(sampleTree1)).to.be.false + expect(config.isNestedLeaf(sampleTree1)).to.be.false + expect(config.isSignerLeaf(sampleTree1)).to.be.false + expect(config.isSubdigestLeaf(sampleTree1)).to.be.false + }) + }) + + describe('Hash leaves', () => { + it('Hash signer leaf', () => { + const hash = config.hashNode({ + address: '0x07ab71Fe97F9122a2dBE3797aa441623f5a59DB1', + weight: 129 + }) + + expect(hash).to.equal(`0x00000000000000000000008107ab71fe97f9122a2dbe3797aa441623f5a59db1`) + }) + + it('Hash subdigest', () => { + const hash = config.hashNode({ + subdigest: '0xb38b3da0ef56c3094675167fed4a263c3346b325dddb6e56a3eb9a10ed7539ed' + }) + + expect(hash).to.equal(`0x7cf15e50f6d44f71912ca6575b7fd911a5c6f19d0195692c7d35a102ad5ae98b`) + }) + + it('Hash nested leaf', () => { + const hash = config.hashNode({ + tree: sampleTree1, + weight: 90, + threshold: 211 + }) + + expect(hash).to.equal(`0x6cca65d12b31379a7b429e43443969524821e57d2c6a7fafae8e30bd31a5295b`) + }) + + it('Hash node', () => { + const tree = { + left: { + address: '0x07ab71Fe97F9122a2dBE3797aa441623f5a59DB1', + weight: 129 + }, + right: { + subdigest: '0x787c83a19321fc70f8653f8faa39cce60bf26cac51c25df1b0634eb7ddbe0c60' + } + } + + const hash = config.hashNode(tree) + expect(hash).to.equal(`0x47dcfac6c5622054a0ac762baa1a5eb10705484ea1e000869bbc11a093bec97e`) + }) + }) + + it('Read left face of tree', () => { + const leftFace1 = config.leftFace(sampleTree1) + expect(leftFace1.length).to.equal(2) + expect(leftFace1[0]).to.deep.equal(sampleTree1['left']) + expect(leftFace1[1]).to.deep.equal(sampleTree1['right']) + + const leftFace2 = config.leftFace(sampleTree2) + expect(leftFace2.length).to.equal(4) + expect(leftFace2[0]).to.deep.equal(sampleTree2['left']['left']['left']) + expect(leftFace2[1]).to.deep.equal(sampleTree2['left']['left']['right']) + expect(leftFace2[2]).to.deep.equal(sampleTree2['left']['right']) + expect(leftFace2[3]).to.deep.equal(sampleTree2['right']) + + const leftFace3 = config.leftFace(sampleTree3) + expect(leftFace3.length).to.equal(2) + expect(leftFace3[0]).to.deep.equal(sampleTree3['left']) + expect(leftFace3[1]).to.deep.equal(sampleTree3['right']) + }) + + describe('Simplify configurations', () => { + it('Should simplify configuration', () => { + const simplifiedConfig1 = config.toSimpleWalletConfig({ + version: 2, + tree: sampleTree1, + threshold: 11, + checkpoint: 999999 + }) + + expect(simplifiedConfig1).to.deep.equal({ + checkpoint: 999999, + threshold: 11, + members: [ + sampleTree1['left'], + sampleTree1['right']['left']['left'], + sampleTree1['right']['left']['right'], + sampleTree1['right']['right'] + ] + }) + + const simplifiedConfig2 = config.toSimpleWalletConfig({ + version: 2, + tree: sampleTree2, + threshold: 1, + checkpoint: 2 + }) + + expect(simplifiedConfig2).to.deep.equal({ + checkpoint: 2, + threshold: 1, + members: [ + sampleTree2['left']['left']['left'], + sampleTree2['left']['left']['right'], + sampleTree2['left']['right']['left'], + sampleTree2['left']['right']['right'], + sampleTree2['right']['left']['left'], + sampleTree2['right']['left']['right'], + sampleTree2['right']['right']['left'], + sampleTree2['right']['right']['right'] + ] + }) + + const simplifiedConfig3 = config.toSimpleWalletConfig({ + version: 2, + tree: sampleTree3, + threshold: 2, + checkpoint: 3 + }) + + expect(simplifiedConfig3).to.deep.equal({ + checkpoint: 3, + threshold: 2, + members: [ + { + threshold: sampleTree3['left']['threshold'], + weight: sampleTree3['left']['weight'], + members: [ + sampleTree3['left']['tree']['left'], + sampleTree3['left']['tree']['right']['left'], + sampleTree3['left']['tree']['right']['right'] + ] + }, + sampleTree3['right']['left']['left'], + sampleTree3['right']['left']['right'], + sampleTree3['right']['right'] + ] + }) + }) + }) + + describe('Build configurations', async () => { + it('Build legacy configuration', () => { + const legacyConfig1 = config.toWalletConfig( + { + members: [ + sampleTree1['left'], + sampleTree1['right']['left']['left'], + sampleTree1['right']['left']['right'], + sampleTree1['right']['right'] + ], + threshold: 11, + checkpoint: 999999 + }, + config.legacyTopologyBuilder + ) + + expect(legacyConfig1).to.deep.equal({ + version: 2, + checkpoint: 999999, + threshold: 11, + tree: { + left: { + left: { + left: sampleTree1['left'], + right: sampleTree1['right']['left']['left'] + }, + right: sampleTree1['right']['left']['right'] + }, + right: sampleTree1['right']['right'] + } + }) + + const legacyConfig2 = config.toWalletConfig({ + members: [ + sampleTree2['left']['left']['left'], + sampleTree2['left']['left']['right'], + sampleTree2['left']['right']['left'], + sampleTree2['left']['right']['right'], + sampleTree2['right']['left']['left'], + sampleTree2['right']['left']['right'], + sampleTree2['right']['right']['left'], + sampleTree2['right']['right']['right'] + ], + threshold: 1, + checkpoint: 2 + }) + + expect(legacyConfig2).to.deep.equal({ + version: 2, + checkpoint: 2, + threshold: 1, + tree: { + left: { + left: { + left: { + left: { + left: { + left: { + left: sampleTree2['left']['left']['left'], + right: sampleTree2['left']['left']['right'] + }, + right: sampleTree2['left']['right']['left'] + }, + right: sampleTree2['left']['right']['right'] + }, + right: sampleTree2['right']['left']['left'] + }, + right: sampleTree2['right']['left']['right'] + }, + right: sampleTree2['right']['right']['left'] + }, + right: sampleTree2['right']['right']['right'] + } + }) + + const legacyConfig3 = config.toWalletConfig({ + members: [ + { + threshold: sampleTree3['left']['threshold'], + weight: sampleTree3['left']['weight'], + members: [ + sampleTree3['left']['tree']['left'], + sampleTree3['left']['tree']['right']['left'], + sampleTree3['left']['tree']['right']['right'] + ] + }, + sampleTree3['right']['left']['left'], + sampleTree3['right']['left']['right'], + sampleTree3['right']['right'] + ], + threshold: 2, + checkpoint: 3 + }) + + expect(legacyConfig3).to.deep.equal({ + version: 2, + checkpoint: 3, + threshold: 2, + tree: { + left: { + left: { + left: { + weight: sampleTree3['left']['weight'], + threshold: sampleTree3['left']['threshold'], + tree: { + left: { + left: sampleTree3['left']['tree']['left'], + right: sampleTree3['left']['tree']['right']['left'] + }, + right: sampleTree3['left']['tree']['right']['right'] + } + }, + right: sampleTree3['right']['left']['left'] + }, + right: sampleTree3['right']['left']['right'] + }, + right: sampleTree3['right']['right'] + } + }) + }) + + it('Build merkle configuration', () => { + const merkleConfig1 = config.toWalletConfig( + { + members: [ + sampleTree1['left'], + sampleTree1['right']['left']['left'], + sampleTree1['right']['left']['right'], + sampleTree1['right']['right'] + ], + threshold: 11, + checkpoint: 999999 + }, + config.merkleTopologyBuilder + ) + + expect(merkleConfig1).to.deep.equal({ + version: 2, + checkpoint: 999999, + threshold: 11, + tree: { + left: { + left: sampleTree1['left'], + right: sampleTree1['right']['left']['left'] + }, + right: { + left: sampleTree1['right']['left']['right'], + right: sampleTree1['right']['right'] + } + } + }) + + const merkleConfig2 = config.toWalletConfig( + { + members: [ + sampleTree2['left']['left']['left'], + sampleTree2['left']['left']['right'], + sampleTree2['left']['right']['left'], + sampleTree2['left']['right']['right'], + sampleTree2['right']['left']['left'], + sampleTree2['right']['left']['right'], + sampleTree2['right']['right']['left'], + sampleTree2['right']['right']['right'] + ], + threshold: 1, + checkpoint: 2 + }, + config.merkleTopologyBuilder + ) + + expect(merkleConfig2).to.deep.equal({ + version: 2, + checkpoint: 2, + threshold: 1, + tree: sampleTree2 + }) + + const merkleConfig3 = config.toWalletConfig( + { + members: [ + { + threshold: sampleTree3['left']['threshold'], + weight: sampleTree3['left']['weight'], + members: [ + sampleTree3['left']['tree']['left'], + sampleTree3['left']['tree']['right']['left'], + sampleTree3['left']['tree']['right']['right'] + ] + }, + sampleTree3['right']['left']['left'], + sampleTree3['right']['left']['right'], + sampleTree3['right']['right'] + ], + threshold: 2, + checkpoint: 3 + }, + config.merkleTopologyBuilder + ) + + expect(merkleConfig3).to.deep.equal({ + version: 2, + checkpoint: 3, + threshold: 2, + tree: { + left: { + left: { + weight: sampleTree3['left']['weight'], + threshold: sampleTree3['left']['threshold'], + tree: { + left: { + left: sampleTree3['left']['tree']['left'], + right: sampleTree3['left']['tree']['right']['left'] + }, + right: sampleTree3['left']['tree']['right']['right'] + } + }, + right: sampleTree3['right']['left']['left'] + }, + right: { + left: sampleTree3['right']['left']['right'], + right: sampleTree3['right']['right'] + } + } + }) + }) + }) +}) diff --git a/packages/core/tests/v2/signature.spec.ts b/packages/core/tests/v2/signature.spec.ts new file mode 100644 index 000000000..1c4ac2d52 --- /dev/null +++ b/packages/core/tests/v2/signature.spec.ts @@ -0,0 +1,603 @@ +import { expect } from 'chai' +import { ethers } from 'ethers' +import { decodeSignature, encodeSignature, SignaturePartType, SignatureType } from '../../src/v2/signature' + +const sampleSignature1 = + '0x0001636911b800019fa7b7e8ed25088c413074818ac10ab3bbcddb120bbec85083f3ba254e5547d953fe615a6474fd365326244dedd7afa3911ad39c956ca096d721064d6b29055d1b02' +const sampleSignature2 = + '0x000263691389034a062f86183c9d46e129f0331f2a42f6ba22a3525a46ecd197fa23d177d75f2d040000a0033fce59919d0a4ee44a8066a3b1d0083760d89a06ae89edadf8a58e0e5c5ac5040400007b01016ffeccf6f31e0a469d55dede5651d34a6ecd9fc500017052a0438a13da22242bcd20c219630d839c364cd2b6042add1bee32774c37d72ba2ace8b7a79c95a536d4c0fed3fe05883c6e1188a4191a91623a903e4ec21c1b0203ad5831467806b6edd059ff5ac9809f2bb6e80512ceb5d466a67251ffb842fae1040000c50314b729622595218cdbef06c630daeea028e25e8ca048d97bc170d75feb9066ad0400007f030c8c0bb7e8c5ec8eed444ae25f3a1796597bcfacf5f6b758ae4fadd6fc416f560400005a0001e7618f1b7b012d7fc48f518f498bb6823dc2a8308984287501873cb535b6d5bf526fb91a220297f461ac5a2434d0e8e768c3bf166c329366ddc885bf2e1676271c0201014ef7ec718f66ae3920ea119b9d7ddf39337601f703fdea4c5fb23fb3cc2b2360057abef1ff7e7195acbdc4db555c27cc588a4585a6' +const sampleSignature3 = + '0x0003636916740101a653f5900ef5c538142cd8aef1ce750390b29a3e0101a54e174d851bcffe8c1332c00e23156b4982204d0400002c0101ddfba5791de0b8da80d46b43915ae34c4876c4f80101f50834aa68dec4d9d151b1ff1c509c81431ddc450400008a0101e8e7c96af0d472a8d0e60e86009a97290fbc0f6d010188a175d23b41252823e7fd88297754f5c580c4ff0400005a0101653ca45307922091337376cb305485c0d889a7a10001d9b2a3142267255c50581c8023648916a3e8c3ae7ca50f6752b6874a20e76e496b30c4e1b653691b3ae9fea40a66966f3d1f2a35cedb52fbf07ae09269fb3c8e1b02040001180101a18522682c76e7e4083fcef379839347a533f782010159d7eb9085272adb317893df26e7f39dcfdda1ba0400002c0101c31ee68141cb47d2b260fe5a6e48b37d021d8f190101947ee7254d4de72f7a1b2e70ed3f8e8ae6510d77040000b8000147f646e6d13434b2df65fc1ab9086264bed1030e485e3513ed01686d03d127df510efc468bbeedde677c3af1fda7b0dbffc7186e07203eb09718cc256cf6b5d11b020101ce1977029e9398ec9f45327c81cf7a557f5d30b80400005a01010b6a69349728615d6e1c8d4fd133e49aafd5b91b0001aaac151a6ad4bf7f966db203164551a7c3c3969d15666dd2c75202231623f5ee2059711c84d2f216126bf3dc6cc63223eba079262e73c58da4f97583747c790b1c02' +const sampleSignature4 = + '0x00010000000203f6dc189f16bb65c588ccd5c63aa805bcbeb6e90dd8a049cfba0936050f299087060400020000c3037c989a96925302993812c1ec3924bce3ba2ca0e8f7e3655e30f5b24d965aa18b040000880001a73ce16a9cc7075c18bd2b4fd2649812fecb51460353a55bf62f821bf884443a169e0d0e04113d7ef2c2d15f1ecf46531f291259542065c556f0e721a82b3c581b02000193f1f388009f68763df43632153155960ea6604723bb517e90788822ff21e38722be4387e8f67c0db677b74d9a0c2a804183e6a3eebd2ba53dbfc54432f1a10f1b020101907c144d2490f49838c6499507ee5914f4a22b5b' +const sampleSignature5 = + '0x020001636a2c7d032b4c067647ee1f154214b4ad83bbbe7e57a528ca0df587e34ded382ca7348c100400006703c702696d354063d18d750cc686a1f356e503f85516c54375ef5878250a22758704000042054cd7065b01927d3429db64e0a7ec956fa5506dab23fa37c767eb4375fab7898b032acf6636e813600f741841733e57a7e0cb4131f3c68db7ba7014fb94525f5de20302c10a9634e89b4293346a7408364eeece764491bd465d043f7c826518c2bc9501011a9bd9f98e2c0c81bcf51da26c3a7cfcc18c43b4030c389524f715de03757bcbc7a084f52c5d54def431bb8080a18d0075e26b859c0101379b2a7a384376b420d3d19c5c5717abaad3a969' +const sampleSignature6 = + '0x010002636a33a501012093ec341be249baa0c8afa35fef368a90a483900201cd907cf455a1a00a4ebe37ef5f4bb7abc3770a6900004228230cc5c4ee221c093054fef22c12d534f4d63782bc94a160c2f781cef142e019b84d82070b67cb750ec9ba46ae49e6687591810099f6e58811fbe35ea3db451c0202014bffabff5819087514d8db622543c3d0d89cd64d000042844e002b27098ba6144bc9eb7950cd20a4062d265bdd042bffbb7ec8405caf7f60f1c5bdcd8ea4f4acee17d5ac9eac6bcdb40a20a41796d40a153278ab062b211c020101e8c4a6eb40ece266c7a58670493ee0727be4d20a' + +describe('v2 signature utils', () => { + describe('Decode signatures', () => { + it('Decode simple signature', () => { + const decoded = decodeSignature(sampleSignature1) + + expect(decoded).to.deep.equal({ + version: 2, + type: SignatureType.Legacy, + decoded: { + threshold: 1, + checkpoint: 1667830200, + tree: { + isDynamic: false, + signature: + '0x9fa7b7e8ed25088c413074818ac10ab3bbcddb120bbec85083f3ba254e5547d953fe615a6474fd365326244dedd7afa3911ad39c956ca096d721064d6b29055d1b02', + unrecovered: true, + weight: 1 + } + } + }) + }) + + it('Decode trimmed 2/N with 31 signers', () => { + /** + 0x9ce037be2c62dfec86f2cf5339f773b8fc22da992b9e33ee8ee050676a1fef48', + ├─ 0xcc049b7ee4891eb306511fb4019c104766fb97c73097a6ddd73858c1ba200292', + │ ├─ 0x4a062f86183c9d46e129f0331f2a42f6ba22a3525a46ecd197fa23d177d75f2d', + │ │ ├─ 0xe66f95b2257d7765d2af2a44f85bf9c9ecd220c686943595f4c7b87f42214b78', + │ │ │ ├─ 0xfccac93b8e71891c0647977a42447b037574deaa9d4cf7a6a6e6fd9275b75a5d', + │ │ │ │ ├─ weight: 1 - address: 0x39bc8F324dB1d2356E084b8c504F972f4A774fB2', + │ │ │ │ └─ weight: 1 - address: 0xb2C7368fA82d1Fd633f79FA9BcBE923cB1b84e4f', + │ │ │ └─ 0x85dab8bdc832396fb5f6f3dc3d86e589a6358edde9d5dfb567199ba81328f429', + │ │ │ ├─ weight: 1 - address: 0xAc9a3035638E36300DCd6e89cf7D3861bbb8dd1F', + │ │ │ └─ weight: 1 - address: 0x7Fb579CE8378EbcB953c6b1159cFF1d2DEEb6f74', + │ │ └─ 0xc0a464e50c14c3c9be84fcf19726f39298b1101b62da1ea093d058f574dc4075', + │ │ ├─ 0xa2ba648e377ddd25ccc5d55db2eaf2031d713ea63456cf60dbd88acb4fb9b826', + │ │ │ ├─ weight: 1 - address: 0x5dfc6cA7841DF26872BeF07C68fc18031908480c', + │ │ │ └─ weight: 1 - address: 0xA3B58D5778F59cF331693618f5E11b901029C3DE', + │ │ └─ 0x6ec7200199b3dad7a17e09b5a04df6518bc3eefecd59b6509f47bc478325384b', + │ │ ├─ weight: 1 - address: 0xAD4d6101f2fFda7C39D039d4c496B9005AaDBFaA', + │ │ └─ weight: 1 - address: 0x204De2Fa1FF302345CFd53bE37a5234c606783d8', + │ └─ 0x326e14238f8038db10e675efdf0c7648f8066c6a064738b73ec1db63a904c26c', + │ ├─ 0x3fce59919d0a4ee44a8066a3b1d0083760d89a06ae89edadf8a58e0e5c5ac504', + │ │ ├─ 0xa13a367336b680c598ffcc7738b9b18135000db5be559f35262b28e1701bb9a3', + │ │ │ ├─ weight: 1 - address: 0xD6BE598eD22A999f51BDCFD484454319CCe32b92', + │ │ │ └─ weight: 1 - address: 0x3347821222470CD136bAac735bf59A1734A80B83', + │ │ └─ 0x14b13f254e58655bf2d4dce5c7e3ec0566a4e025a70d1fc0d41a08e675c86358', + │ │ ├─ weight: 1 - address: 0x0aE2D84a35Eb1fD2B78dF00940A84c6a4954B4A6', + │ │ └─ weight: 1 - address: 0x598fD5791971eb873FA8147B1BdF3207068F7E56', + │ └─ 0xa507ba934d99995d74786ac057b7c2cd9e22ac9d4c3aee6739e0cc0d308065db', + │ ├─ 0x1df893b2ba851550922f4c3c6f60608f6c70fbe1f47670eaf9f5c3a6edbcd400', + │ │ ├─ weight: 1 - address: 0x6FFEcCF6F31e0a469D55DEdE5651D34A6ECd9FC5', + │ │ └─ weight: 1 - address: 0xE8D34A3999375ef56CD8eB41AC678f5332F7F223', + │ └─ 0xad5831467806b6edd059ff5ac9809f2bb6e80512ceb5d466a67251ffb842fae1', + │ ├─ weight: 1 - address: 0x103dD4E217C422839F3D4b1897C3b1100184d962', + │ └─ weight: 1 - address: 0x5adDAfA4498f9F54af54B8CD8a86728818Df911f', + └─ 0xb7a09a95298cc9bbeeb3c8fbe1f46d158976de898ca42470d0da75cea7be9b43', + ├─ 0x2ac4cc831b29dd447dc2d95a203a7b146ffbb8b9cf3fd0022d15bd0a490bc557', + │ ├─ 0x14b729622595218cdbef06c630daeea028e25e8ca048d97bc170d75feb9066ad', + │ │ ├─ 0xd08870ce28971831b6320b00d017b4351c75ca68432721c6e50145fc320bd900', + │ │ │ ├─ weight: 1 - address: 0x8881DFDBb650d55A440e7F40c3Fc890D327cE35C', + │ │ │ └─ weight: 1 - address: 0x133BC159421310c81E1045ba1e1f8fac34e2c5bB', + │ │ └─ 0x99a7e698bb471ec55f01f14f21a20d23b2f3c142fabe99b3294c526b50207a13', + │ │ ├─ weight: 1 - address: 0xCA9Ed033CB7E9D905942866cD2E593aEB2e05731', + │ │ └─ weight: 1 - address: 0x96613Fda8926dB718719c3c1CE9DaeeddbC520F1', + │ └─ 0xd508a67420b9138396432c9d6a89735a4f1bddf3800ce175fe54f5f80eea6fc7', + │ ├─ 0x0c8c0bb7e8c5ec8eed444ae25f3a1796597bcfacf5f6b758ae4fadd6fc416f56', + │ │ ├─ weight: 1 - address: 0x6d0fDa7520Bb48B6948f77214EE7411636853f30', + │ │ └─ weight: 1 - address: 0x1252c641DC898449490C7F145598b5A70c6738de', + │ └─ 0xc6eb96ebf4f10c3073d6b680efcb57d636b83fe5bc92912ae7c300d9e9cb232a', + │ ├─ weight: 1 - address: 0x3B69bC115e6D79E8adBD011020676750B169bEDd', + │ └─ weight: 1 - address: 0x4ef7Ec718f66ae3920ea119b9d7DDF39337601f7', + └─ 0xfdea4c5fb23fb3cc2b2360057abef1ff7e7195acbdc4db555c27cc588a4585a6', + ├─ 0x33b6f5aa2e0cc8d120a1ec31e74095d978b88fce7c34030579c1ea1ef372c4ad', + │ ├─ 0x5885c583c79ef1fe29477fcb82c7053518a99bedf73ebbf1948a160bdb8e2c0f', + │ │ ├─ weight: 1 - address: 0x89eD176B654F09024a8EFb0F9576D05f614E6f77', + │ │ └─ weight: 1 - address: 0xe8a3eb4CbEFF970eBd44e862f788C4CDB64009c1', + │ └─ 0x367a80d6704d73c6777aae2c7ed880a0536520df2d3a3f3a3a17d22925842833', + │ ├─ weight: 1 - address: 0x2C170AfE2D6c8489e4A272370DA494856E39BBDb', + │ └─ weight: 1 - address: 0x6c32dd456D1DD14d91739f777D37378D243AfF93', + └─ 0x6b8ac6478e09f9c92bed9532e1bdb2a2eefcfad542a6d5573bb16df0e50f7bdb', + ├─ 0x7206ea506e442d2a7ca309d52e4ebe6f0b8982261dbd45e87490bd86cfe77a2a', + │ ├─ weight: 1 - address: 0x72D0f36D4a0f18E22E7Ffd955C69C55D632d13Ae', + │ └─ weight: 1 - address: 0xfa79D7198d04b384735b8a24dE92014ECD59f777', + └─ weight: 1 - address: 0xFE3de6DF80c5890bAdBC24c1b4256A6c6E311933' + */ + + const decoded = decodeSignature(sampleSignature2) + + expect(decoded).to.deep.equal({ + version: 2, + type: SignatureType.Legacy, + decoded: { + threshold: 2, + checkpoint: 1667830665, + tree: { + left: { + left: { + nodeHash: '0x4a062f86183c9d46e129f0331f2a42f6ba22a3525a46ecd197fa23d177d75f2d' + }, + right: { + left: { + nodeHash: '0x3fce59919d0a4ee44a8066a3b1d0083760d89a06ae89edadf8a58e0e5c5ac504' + }, + right: { + left: { + left: { + address: '0x6FFEcCF6F31e0a469D55DEdE5651D34A6ECd9FC5', + weight: 1 + }, + right: { + // signature for: 0xE8D34A3999375ef56CD8eB41AC678f5332F7F223 + signature: + '0x7052a0438a13da22242bcd20c219630d839c364cd2b6042add1bee32774c37d72ba2ace8b7a79c95a536d4c0fed3fe05883c6e1188a4191a91623a903e4ec21c1b02', + weight: 1, + unrecovered: true, + isDynamic: false + } + }, + right: { + nodeHash: '0xad5831467806b6edd059ff5ac9809f2bb6e80512ceb5d466a67251ffb842fae1' + } + } + } + }, + right: { + left: { + left: { + nodeHash: '0x14b729622595218cdbef06c630daeea028e25e8ca048d97bc170d75feb9066ad' + }, + right: { + left: { + nodeHash: '0x0c8c0bb7e8c5ec8eed444ae25f3a1796597bcfacf5f6b758ae4fadd6fc416f56' + }, + right: { + left: { + // signature for: 0x3B69bC115e6D79E8adBD011020676750B169bEDd + signature: + '0xe7618f1b7b012d7fc48f518f498bb6823dc2a8308984287501873cb535b6d5bf526fb91a220297f461ac5a2434d0e8e768c3bf166c329366ddc885bf2e1676271c02', + weight: 1, + unrecovered: true, + isDynamic: false + }, + right: { + address: '0x4ef7Ec718f66ae3920ea119b9d7DDF39337601f7', + weight: 1 + } + } + } + }, + right: { + nodeHash: '0xfdea4c5fb23fb3cc2b2360057abef1ff7e7195acbdc4db555c27cc588a4585a6' + } + } + } + } + }) + }) + + it('Decode non-trimmed 3/N with 16 signers', () => { + /** + 0x0bd27b4a9a6a160ae92f5dc27a5d20156e81b049e451cc226db03be9454a9dbe', + ├─ 0xa9b9bb8f341ef4cba67d42b2c588d99f700a451f208d1d7ecb23d017ab23c3c5', + │ ├─ 0x24ac1effef0566192cd4ad878bc135c7d649b4989507f284fe5c66dae01117d3', + │ │ ├─ 0x67dff26d956ede906bbd0692a0cd573a78c7e345d54ccc93e2383337b4a46660', + │ │ │ ├─ weight: 1 - address: 0xA653F5900Ef5c538142Cd8Aef1CE750390B29a3E', + │ │ │ └─ weight: 1 - address: 0xA54e174d851bCFFE8C1332C00e23156B4982204D', + │ │ └─ 0x211bbe1253185da2e1f353cfb210c48378521ebfb3e103e18459e6aa9143848f', + │ │ ├─ weight: 1 - address: 0xDdfbA5791dE0b8Da80d46B43915Ae34C4876C4F8', + │ │ └─ weight: 1 - address: 0xF50834aa68DEc4D9D151b1ff1c509C81431DDC45', + │ └─ 0x0888e3e8bb7be34c21de30730e8f9cd91d03222bfea229eeabab03f3aa2183e0', + │ ├─ 0x360fe86d2a78344c383256a5509dac30c5046dd38cf6bfc54a880ac4f7e604ed', + │ │ ├─ weight: 1 - address: 0xe8e7C96aF0D472a8D0E60E86009a97290Fbc0F6d', + │ │ └─ weight: 1 - address: 0x88a175d23b41252823e7fD88297754f5C580c4Ff', + │ └─ 0x1235b94db1f48cebb5ebec7d345033d92801312f13086c1a79d032e703525bea', + │ ├─ weight: 1 - address: 0x653cA45307922091337376Cb305485c0D889A7A1', + │ └─ weight: 1 - address: 0xCf8BF768E2b69953577e1FF16b147c773faEc959', + └─ 0x86c8fbddf975589fecf3e2a5a543a916dedcf80aeb12f32abc26586110449059', + ├─ 0xcb4f6042dd1421bc59313c5a8e806514c2fbad361e706e6ec36a4dd6b815e03a', + │ ├─ 0x63fa3b020293428bfee299769b520e08641c66299922077cc91abd2ff31920f6', + │ │ ├─ weight: 1 - address: 0xa18522682c76e7e4083fCEF379839347a533f782', + │ │ └─ weight: 1 - address: 0x59d7eb9085272AdB317893Df26E7F39dCfdDa1bA', + │ └─ 0x4dc9c2311b9bfddc117ef646088b22d4a9548d9651a93c8246f7ad33acdf9431', + │ ├─ weight: 1 - address: 0xC31Ee68141cB47d2B260fE5A6e48b37d021D8F19', + │ └─ weight: 1 - address: 0x947EE7254D4dE72F7A1B2e70ed3f8E8aE6510D77', + └─ 0x7fe1e93c3a299dd8f6ebc06d4c94e5df6423b4ce919367f83f8c672e5e17cba8', + ├─ 0x8d0659c89c7f8de17801cf0178f4d32550b095187afac0d6b733797af881b41b', + │ ├─ weight: 1 - address: 0xb92E451800D78AA8f8492fFEA1a5afc77774f880', + │ └─ weight: 1 - address: 0xCE1977029e9398Ec9F45327c81cf7a557F5D30b8', + └─ 0xe4eaf15623516afc250692b6f8888be93638077ae5c78d95b01b7bf99b56cb67', + ├─ weight: 1 - address: 0x0b6a69349728615d6e1C8d4FD133e49AafD5b91b', + └─ weight: 1 - address: 0x8245B0c0C4319523c2D2616F86EBd02DaDA2FBD3' + */ + + const decoded = decodeSignature(sampleSignature3) + + expect(decoded).to.deep.equal({ + version: 2, + type: SignatureType.Legacy, + decoded: { + checkpoint: 1667831412, + threshold: 3, + tree: { + left: { + left: { + left: { + left: { + address: '0xA653F5900Ef5c538142Cd8Aef1CE750390B29a3E', + weight: 1 + }, + right: { + address: '0xA54e174d851bCFFE8C1332C00e23156B4982204D', + weight: 1 + } + }, + right: { + left: { + address: '0xDdfbA5791dE0b8Da80d46B43915Ae34C4876C4F8', + weight: 1 + }, + right: { + address: '0xF50834aa68DEc4D9D151b1ff1c509C81431DDC45', + weight: 1 + } + } + }, + right: { + left: { + left: { + address: '0xe8e7C96aF0D472a8D0E60E86009a97290Fbc0F6d', + weight: 1 + }, + right: { + address: '0x88a175d23b41252823e7fD88297754f5C580c4Ff', + weight: 1 + } + }, + right: { + left: { + address: '0x653cA45307922091337376Cb305485c0D889A7A1', + weight: 1 + }, + right: { + // address: '0xCf8BF768E2b69953577e1FF16b147c773faEc959', + signature: + '0xd9b2a3142267255c50581c8023648916a3e8c3ae7ca50f6752b6874a20e76e496b30c4e1b653691b3ae9fea40a66966f3d1f2a35cedb52fbf07ae09269fb3c8e1b02', + isDynamic: false, + unrecovered: true, + weight: 1 + } + } + } + }, + right: { + left: { + left: { + left: { + address: '0xa18522682c76e7e4083fCEF379839347a533f782', + weight: 1 + }, + right: { + address: '0x59d7eb9085272AdB317893Df26E7F39dCfdDa1bA', + weight: 1 + } + }, + right: { + left: { + address: '0xC31Ee68141cB47d2B260fE5A6e48b37d021D8F19', + weight: 1 + }, + right: { + address: '0x947EE7254D4dE72F7A1B2e70ed3f8E8aE6510D77', + weight: 1 + } + } + }, + right: { + left: { + left: { + // address: '0xb92E451800D78AA8f8492fFEA1a5afc77774f880', + signature: + '0x47f646e6d13434b2df65fc1ab9086264bed1030e485e3513ed01686d03d127df510efc468bbeedde677c3af1fda7b0dbffc7186e07203eb09718cc256cf6b5d11b02', + unrecovered: true, + isDynamic: false, + weight: 1 + }, + right: { + address: '0xCE1977029e9398Ec9F45327c81cf7a557F5D30b8', + weight: 1 + } + }, + right: { + left: { + address: '0x0b6a69349728615d6e1C8d4FD133e49AafD5b91b', + weight: 1 + }, + right: { + // address: '0x8245B0c0C4319523c2D2616F86EBd02DaDA2FBD3', + signature: + '0xaaac151a6ad4bf7f966db203164551a7c3c3969d15666dd2c75202231623f5ee2059711c84d2f216126bf3dc6cc63223eba079262e73c58da4f97583747c790b1c02', + unrecovered: true, + isDynamic: false, + weight: 1 + } + } + } + } + } + } + }) + }) + + it('Decode signature with nested trees', () => { + /** + 0xc62c3d8ab0422ccbab7339f13b987179c2583743b8af4728cd49b146c710c5c6', + ├─ 0xf6dc189f16bb65c588ccd5c63aa805bcbeb6e90dd8a049cfba0936050f299087', + │ ├─ 0x59276a9b2f7b735fd033d13fdfcf01391f6c112dc48418107c47faa292cda138', + │ │ ├─ 0x52b68b273da79cbad184ab5dc8e89825b373ab9af6ee97e0c556d3829126ba7c', + │ │ │ ├─ weight: 1 - address: 0xb159d82f98490c5Db1dB71b76bbb2C3a86DEce0C', + │ │ │ └─ weight: 1 - address: 0x29Fc57a0eb82688ad558A572C9E23e94243dB4d3', + │ │ └─ weight: 1 - address: 0x0B2b3abA8538639E6D9c1B1200942FA00148ABCB', + │ └─ weight: 1 - address: 0x3314715F5EE607A8988EC4c43351910CD6c76AE5', + └─ 0xd9b2fcc7c63fceaea59b7423cfda5e01307139ac078c2a1695fef1f9a4d9f50a', + └─ threshold: 2 - weight: 4', + ├─ 0x3c8cb8e47389edeee921bdb2efa8a8e664ef38790cfb4230ee51d5314e3a37d3', + │ ├─ 0x7c989a96925302993812c1ec3924bce3ba2ca0e8f7e3655e30f5b24d965aa18b', + │ │ ├─ weight: 1 - address: 0x711dD9c6D02010ABEfd5a4587298CB6a230d3877', + │ │ └─ weight: 1 - address: 0x05ead11721299d471d4e83b51ebfeB87F24A96c5', + │ └─ 0xfeac20f352af0c03f48d1eaeeacbde8e86b391bf97dd83665c218271da447be2', + │ ├─ weight: 1 - address: 0x4Faade320BBE1B9E31803A8A104305c3B5D5cC7E', + │ └─ weight: 1 - address: 0xE403b05AA84848604B40aFDbfE4977e9Be4ECCa9', + └─ weight: 1 - address: 0x907c144D2490f49838c6499507EE5914f4A22b5B' + */ + + const decoded = decodeSignature(sampleSignature4) + + expect(decoded).to.deep.equal({ + version: 2, + type: SignatureType.Legacy, + decoded: { + threshold: 1, + checkpoint: 2, + tree: { + left: { + nodeHash: '0xf6dc189f16bb65c588ccd5c63aa805bcbeb6e90dd8a049cfba0936050f299087' + }, + right: { + weight: 4, + threshold: 2, + tree: { + left: { + left: { + nodeHash: '0x7c989a96925302993812c1ec3924bce3ba2ca0e8f7e3655e30f5b24d965aa18b' + }, + right: { + left: { + signature: + '0xa73ce16a9cc7075c18bd2b4fd2649812fecb51460353a55bf62f821bf884443a169e0d0e04113d7ef2c2d15f1ecf46531f291259542065c556f0e721a82b3c581b02', + weight: 1, + unrecovered: true, + isDynamic: false + }, + right: { + signature: + '0x93f1f388009f68763df43632153155960ea6604723bb517e90788822ff21e38722be4387e8f67c0db677b74d9a0c2a804183e6a3eebd2ba53dbfc54432f1a10f1b02', + weight: 1, + unrecovered: true, + isDynamic: false + } + } + }, + right: { + address: '0x907c144D2490f49838c6499507EE5914f4A22b5B', + weight: 1 + } + } + } + } + } + }) + }) + + it('Decode static subdigests signature', () => { + /* + 0xd039f8f363eec6e6580c04fba1dfa1a7586827d884cb4d98ed667e131a01c268', + ├─ 0x73c9ee2e965c95b829c86ef4849dbf2f0410f4ac4380d2fc58f9246f9d84d0d0', + │ ├─ 0x73b96511a817fcf95200cd76af547a767c2faea2d52aa9e759f2a8ced75c7c67', + │ │ ├─ 0x9be568b9b969ab8d1012696c56ff89db394dcac9881bef5e361a4ffed446d6f6', + │ │ │ ├─ 0x1915fb45c54b103485bf50f1afb0fa6a70c1546211c48d15480ecc991765ba7f', + │ │ │ │ ├─ X 0x2b4c067647ee1f154214b4ad83bbbe7e57a528ca0df587e34ded382ca7348c10', + │ │ │ │ │ ├─ 0xd82efd7c2419e1ce6ec9de6f51051f6376773cd727c032cd15823755f19e4356', + │ │ │ │ │ │ ├─ subDigest: 0xd151a051d91288c5c5f4688ec5c6f0977f41535747293bcdc6859885e2e3c8f9', + │ │ │ │ │ │ └─ subDigest: 0x746fba99dcf684e2b9eb7dceace9d00b1988c5ad13fb46bb7c6272b8dac15821', + │ │ │ │ │ └─ 0xbff3206ad6a9cb35896c77f154b2aa4f72b709c9f4ec756d0da521163b3bcb61', + │ │ │ │ │ ├─ subDigest: 0xd5f94f3099a2c78c8687c81e7e29a2193a7003383989be621ab864efead521dc', + │ │ │ │ │ └─ subDigest: 0x6f5f1a3fb35d99dbf84a5f23713fd168231dddf6589a990378b83cf03f02d9f0', + │ │ │ │ └─ 0x798573e5ebb023632eafafce765fe8227f302a6db5e4c123a5a997c593471749', + │ │ │ │ ├─ X 0xc702696d354063d18d750cc686a1f356e503f85516c54375ef5878250a227587', + │ │ │ │ │ ├─ subDigest: 0xced8ceaa611754f0824a3066c4e53a1e78113dad5d8c63985b076eba2912bf09', + │ │ │ │ │ └─ subDigest: 0x00b43843c7c77215b123e3471be7532c64180d872e2dd68cd739bb7f1bcca725', + │ │ │ │ └─ 0x47344ce248ff726cf13c68d1e4bb7f2ab3a0b52d0668e240ed0925877ac62a88', + │ │ │ │ ├─ -> subDigest: 0x4cd7065b01927d3429db64e0a7ec956fa5506dab23fa37c767eb4375fab7898b', + │ │ │ │ └─ X (hashed) subDigest: 0xc0b21c4464a6acf6d8451d3a077bb3ebaa3953bd2e01609dec557af47239c012', + │ │ │ └─ X 0x02c10a9634e89b4293346a7408364eeece764491bd465d043f7c826518c2bc95', + │ │ │ ├─ subDigest: 0xae6b3762bab90dcc5eccbb3a8d1f5f8d9d974b2458403779ff998636c99ec15e', + │ │ │ └─ subDigest: 0x5c9de17d821a60f691929cd6d475d155a27e4d3ce0c79b4412a8e5e50c0e4f1e', + │ │ └─ X weight: 1 - address: 0x1A9bD9f98E2C0C81BcF51DA26c3a7CFcC18c43B4', + │ └─ X 0x0c389524f715de03757bcbc7a084f52c5d54def431bb8080a18d0075e26b859c', + │ ├─ weight: 1 - address: 0xEdAE5e1bF8D80e20C9008479A07400e84BC1af9D', + │ └─ weight: 1 - address: 0xBf31A9f466Fc2844CDE7F12c87dc3e6676c8D0b2', + └─ X weight: 1 - address: 0x379b2A7A384376B420D3D19c5c5717ABAaD3a969' + */ + const decoded = decodeSignature(sampleSignature5) + + expect(decoded).to.deep.equal({ + version: 2, + type: SignatureType.NoChainIdDynamic, + decoded: { + threshold: 1, + checkpoint: 1667902589, + tree: { + left: { + left: { + left: { + left: { + left: { + nodeHash: '0x2b4c067647ee1f154214b4ad83bbbe7e57a528ca0df587e34ded382ca7348c10' + }, + right: { + left: { + nodeHash: '0xc702696d354063d18d750cc686a1f356e503f85516c54375ef5878250a227587' + }, + right: { + left: { + subdigest: '0x4cd7065b01927d3429db64e0a7ec956fa5506dab23fa37c767eb4375fab7898b' + }, + right: { + nodeHash: '0x2acf6636e813600f741841733e57a7e0cb4131f3c68db7ba7014fb94525f5de2' + } + } + } + }, + right: { + nodeHash: '0x02c10a9634e89b4293346a7408364eeece764491bd465d043f7c826518c2bc95' + } + }, + right: { + address: '0x1A9bD9f98E2C0C81BcF51DA26c3a7CFcC18c43B4', + weight: 1 + } + }, + right: { + nodeHash: '0x0c389524f715de03757bcbc7a084f52c5d54def431bb8080a18d0075e26b859c' + } + }, + right: { + address: '0x379b2A7A384376B420D3D19c5c5717ABAaD3a969', + weight: 1 + } + } + } + }) + }) + + it('Decode dynamic signatures', () => { + /* + 0xe916ef5f1e4c38acd77f793ab9fe6696272541dce1fc84ffb712e2faccd4be07', + ├─ 0x8554edff027c3cb80d02e3e233a778c85165fbc2c813e8b4148339f8cda1cfd1', + │ ├─ 0xd871650a4a126ee8112934486f91f28f4da3e64474d66c778d1f2bd84b6f9ec7', + │ │ ├─ weight: 1 - address: 0x2093ec341be249BAA0c8aFA35fEF368a90a48390', + │ │ └─ weight: 1 - address: 0xCd907CF455A1A00a4ebE37Ef5F4BB7aBc3770A69', + │ └─ weight: 1 - address: 0x4bfFABff5819087514d8dB622543c3d0d89cD64D', + └─ weight: 1 - address: 0xe8C4a6EB40EcE266C7a58670493eE0727be4D20A' + */ + + const decoded = decodeSignature(sampleSignature6) + + expect(decoded).to.deep.equal({ + version: 2, + type: SignatureType.Dynamic, + decoded: { + threshold: 2, + checkpoint: 1667904421, + tree: { + left: { + left: { + left: { + address: '0x2093ec341be249BAA0c8aFA35fEF368a90a48390', + weight: 1 + }, + right: { + address: '0xCd907CF455A1A00a4ebE37Ef5F4BB7aBc3770A69', + signature: + '0x28230cc5c4ee221c093054fef22c12d534f4d63782bc94a160c2f781cef142e019b84d82070b67cb750ec9ba46ae49e6687591810099f6e58811fbe35ea3db451c02', + weight: 1, + isDynamic: true, + unrecovered: true + } + }, + right: { + address: '0x4bfFABff5819087514d8dB622543c3d0d89cD64D', + signature: + '0x844e002b27098ba6144bc9eb7950cd20a4062d265bdd042bffbb7ec8405caf7f60f1c5bdcd8ea4f4acee17d5ac9eac6bcdb40a20a41796d40a153278ab062b211c02', + weight: 1, + isDynamic: true, + unrecovered: true + } + }, + right: { + address: '0xe8C4a6EB40EcE266C7a58670493eE0727be4D20A', + weight: 1 + } + } + } + }) + }) + + it('Fail to decode invalid signature part type', () => { + const invalidSignature = ethers.utils.solidityPack( + ['bytes', 'uint8'], + ['0x0001ffffffff', Object.keys(SignaturePartType).length / 2] + ) + + expect(() => decodeSignature(invalidSignature)).to.throw( + `Unknown signature part type: ${Object.keys(SignaturePartType).length / 2}: 0x` + ) + }) + + it('Fail to decode empty tree signature', () => { + const invalidSignature = '0x0001ffffffff' + + expect(() => decodeSignature(invalidSignature)).to.throw('Empty signature tree') + }) + }) + + describe('Encode signatures', () => { + describe('Encode decoded signatures', () => { + it('Re-encode simple signature', () => { + const decoded = decodeSignature(sampleSignature1) + const reEncoded = encodeSignature(decoded) + expect(reEncoded).to.equal(sampleSignature1) + expect(decoded).to.deep.equal(decodeSignature(reEncoded)) + }) + + it('Re-encode trimmed 2/N with 31 signers', () => { + const decoded = decodeSignature(sampleSignature2) + const reEncoded = encodeSignature(decoded) + + expect(decoded).to.deep.equal(decodeSignature(reEncoded)) + expect(reEncoded).to.equal(sampleSignature2) + }) + + it('Re-encode non-trimmed 3/N with 16 signers', () => { + const decoded = decodeSignature(sampleSignature3) + const reEncoded = encodeSignature(decoded) + + expect(decoded).to.deep.equal(decodeSignature(reEncoded)) + expect(reEncoded).to.equal(sampleSignature3) + }) + + it('Re-encode signature with nested trees', () => { + const decoded = decodeSignature(sampleSignature4) + const reEncoded = encodeSignature(decoded) + + expect(decoded).to.deep.equal(decodeSignature(reEncoded)) + expect(reEncoded).to.equal(sampleSignature4) + }) + + it('Re-encode static subdigests signature', () => { + const decoded = decodeSignature(sampleSignature5) + const reEncoded = encodeSignature(decoded) + + expect(decoded).to.deep.equal(decodeSignature(reEncoded)) + expect(reEncoded).to.equal(sampleSignature5) + }) + + it('Re-encode dynamic signatures', () => { + const decoded = decodeSignature(sampleSignature6) + const reEncoded = encodeSignature(decoded) + + expect(decoded).to.deep.equal(decodeSignature(reEncoded)) + expect(reEncoded).to.equal(sampleSignature6) + }) + }) + }) +}) diff --git a/packages/deployer/.gitignore b/packages/deployer/.gitignore new file mode 100644 index 000000000..b8e5877ec --- /dev/null +++ b/packages/deployer/.gitignore @@ -0,0 +1,4 @@ +config/PROD.env +cache +artifacts/build-info +artifacts/**/*.dbg.json diff --git a/packages/deployer/README.md b/packages/deployer/README.md new file mode 100644 index 000000000..1c58d69d4 --- /dev/null +++ b/packages/deployer/README.md @@ -0,0 +1,60 @@ +@0xsequence/deployer +==================== + +Deploy contracts using a universal deployer via CREATE2, allowing contracts to have the same address on any EVM chain. + +UniversalDeployer works in both Web Browsers and Nodejs. + +For more info, see [0xsequence project page](https://github.com/0xsequence/sequence.js). + +# How to use + +1. `yarn add @0xsequence/deployer` +1. Import UniversalDeployer into script +2. Create UniversalDeployer instance +3. Deploy contracts + +An `instance` number can be passed if multiple instance of the same contract need to be deployed on the same chain. The default instance number is 0, if none is passed. + +```typescript +... +import { UniversalDeployer } from '@0xsequence/deployer' + +const provider = new Web3Provider(web3.currentProvider) +const universalDeployer = new UniversalDeployer(network.name, provider) + +const main = async () => { + await universalDeployer.deploy('Factory', FactoryFactory) + await universalDeployer.deploy('MainModuleUpgradable', MainModuleUpgradableFactory) + await universalDeployer.deploy('GuestModule', GuestModuleFactory) + + prompt.start(`writing deployment information to ${network.name}.json`) + await universalDeployer.registerDeployment() + + // or, await universalDeployer.getDeployment() + + prompt.succeed() +} + +main() +``` + +You can also pass transaction parameters explicitly : + +```typescript +... + +const main = async () => { + await universalDeployer.deploy('WalletFactory', FactoryFactory, {gasLimit: 1000000} ) + await universalDeployer.deploy('MainModuleUpgradable', MainModuleUpgradableFactory, {gasPrice: new BigNumber(10).pow(9)}) +} + +``` + +--- + +## License + +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +Copyright (c) 2018-present Horizon Blockchain Games Inc. diff --git a/packages/deployer/artifacts/contracts/NanoUniversalDeployer.sol/NanoUniversalDeployer.json b/packages/deployer/artifacts/contracts/NanoUniversalDeployer.sol/NanoUniversalDeployer.json new file mode 100644 index 000000000..3c7fe11b1 --- /dev/null +++ b/packages/deployer/artifacts/contracts/NanoUniversalDeployer.sol/NanoUniversalDeployer.json @@ -0,0 +1,28 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "NanoUniversalDeployer", + "sourceName": "contracts/NanoUniversalDeployer.sol", + "abi": [ + { + "anonymous": true, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "Deploy", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + } + ], + "bytecode": "0x6080604052348015600f57600080fd5b5060a580601d6000396000f3fe60a06020601f3690810182900490910282016040526080818152600092839283918190838280828437600092018290525084519495509392505060208401905034f56040805173ffffffffffffffffffffffffffffffffffffffff83168152905191935081900360200190a0505000fea26469706673582212207457f4b6f392e3ba295b33e363360d55f06ead85ec96165a406e7b0231ab668464736f6c63430007060033", + "deployedBytecode": "0x60a06020601f3690810182900490910282016040526080818152600092839283918190838280828437600092018290525084519495509392505060208401905034f56040805173ffffffffffffffffffffffffffffffffffffffff83168152905191935081900360200190a0505000fea26469706673582212207457f4b6f392e3ba295b33e363360d55f06ead85ec96165a406e7b0231ab668464736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/deployer/artifacts/contracts/UniversalDeployer2.sol/UniversalDeployer2.json b/packages/deployer/artifacts/contracts/UniversalDeployer2.sol/UniversalDeployer2.json new file mode 100644 index 000000000..b56022dc0 --- /dev/null +++ b/packages/deployer/artifacts/contracts/UniversalDeployer2.sol/UniversalDeployer2.json @@ -0,0 +1,42 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "UniversalDeployer2", + "sourceName": "contracts/UniversalDeployer2.sol", + "abi": [ + { + "anonymous": true, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "Deploy", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_creationCode", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_instance", + "type": "uint256" + } + ], + "name": "deploy", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5061013d806100206000396000f3fe60806040526004361061001e5760003560e01c80639c4ae2d014610023575b600080fd5b6100cb6004803603604081101561003957600080fd5b81019060208101813564010000000081111561005457600080fd5b82018360208201111561006657600080fd5b8035906020019184600183028401116401000000008311171561008857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506100cd915050565b005b60008183516020850134f56040805173ffffffffffffffffffffffffffffffffffffffff83168152905191925081900360200190a050505056fea264697066735822122033609f614f03931b92d88c309d698449bb77efcd517328d341fa4f923c5d8c7964736f6c63430007060033", + "deployedBytecode": "0x60806040526004361061001e5760003560e01c80639c4ae2d014610023575b600080fd5b6100cb6004803603604081101561003957600080fd5b81019060208101813564010000000081111561005457600080fd5b82018360208201111561006657600080fd5b8035906020019184600183028401116401000000008311171561008857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506100cd915050565b005b60008183516020850134f56040805173ffffffffffffffffffffffffffffffffffffffff83168152905191925081900360200190a050505056fea264697066735822122033609f614f03931b92d88c309d698449bb77efcd517328d341fa4f923c5d8c7964736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/packages/deployer/config/PROD.env.sample b/packages/deployer/config/PROD.env.sample new file mode 100644 index 000000000..f7afe8cd9 --- /dev/null +++ b/packages/deployer/config/PROD.env.sample @@ -0,0 +1,2 @@ +ETH_MNEMONIC="" +INFURA_API_KEY="" diff --git a/packages/deployer/contracts/NanoUniversalDeployer.sol b/packages/deployer/contracts/NanoUniversalDeployer.sol new file mode 100644 index 000000000..6419b9168 --- /dev/null +++ b/packages/deployer/contracts/NanoUniversalDeployer.sol @@ -0,0 +1,12 @@ +pragma solidity ^0.7.6; + +contract NanoUniversalDeployer { + event Deploy(address _addr) anonymous; + + fallback() external payable { + address addr; + bytes memory code = msg.data; + assembly { addr := create2(callvalue(), add(code, 32), mload(code), 0) } + emit Deploy(addr); + } +} \ No newline at end of file diff --git a/packages/deployer/contracts/UniversalDeployer2.sol b/packages/deployer/contracts/UniversalDeployer2.sol new file mode 100644 index 000000000..a25edfeeb --- /dev/null +++ b/packages/deployer/contracts/UniversalDeployer2.sol @@ -0,0 +1,16 @@ +pragma solidity ^0.7.6; + +contract UniversalDeployer2 { + event Deploy(address _addr) anonymous; + + /** + * @notice will deploy a contract via create2 + * @param _creationCode Creation code of contract to deploy + * @param _instance Instance number of contract to deploy + */ + function deploy(bytes memory _creationCode, uint256 _instance) public payable { + address addr; + assembly { addr := create2(callvalue(), add(_creationCode, 32), mload(_creationCode), _instance) } + emit Deploy(addr); + } +} \ No newline at end of file diff --git a/packages/deployer/hardhat.config.ts b/packages/deployer/hardhat.config.ts new file mode 100644 index 000000000..13afd3834 --- /dev/null +++ b/packages/deployer/hardhat.config.ts @@ -0,0 +1,31 @@ +// import '@nomiclabs/hardhat-truffle5' +import { networkConfig } from './src/utils/configLoader' + +const ganacheNetwork = { + url: 'http://127.0.0.1:8545', + blockGasLimit: 6000000000 +} + +module.exports = { + solidity: { + version: '0.7.6', + settings: { + optimizer: { + enabled: true, + runs: 100000, + details: { + yul: true + } + } + } + }, + paths: { + tests: './src/tests' + }, + networks: { + goerli: networkConfig('goerli'), + mumbai: networkConfig('mumbai'), + matic: networkConfig('matic'), + ganache: ganacheNetwork + } +} diff --git a/packages/deployer/src/UniversalDeployer.ts b/packages/deployer/src/UniversalDeployer.ts new file mode 100644 index 000000000..598bc4611 --- /dev/null +++ b/packages/deployer/src/UniversalDeployer.ts @@ -0,0 +1,207 @@ +import * as fs from 'fs' +import { ethers, ContractFactory, ContractTransaction } from 'ethers' +import { promisify, isNode } from '@0xsequence/utils' +import { UniversalDeployer2__factory } from './typings/contracts' +import { + EOA_UNIVERSAL_DEPLOYER_ADDRESS, + UNIVERSAL_DEPLOYER_ADDRESS, + UNIVERSAL_DEPLOYER_2_ADDRESS, + UNIVERSAL_DEPLOYER_FUNDING, + UNIVERSAL_DEPLOYER_TX, + UNIVERSAL_DEPLOYER_2_BYTECODE +} from './constants' +import { ContractInstance } from './types' +import { createLogger, Logger } from './utils/logger' + +let prompt: Logger +createLogger().then(logger => (prompt = logger)) + +ethers.utils.Logger.setLogLevel(ethers.utils.Logger.levels.OFF) + +export class UniversalDeployer { + private deployedInstances: ContractInstance[] = [] + private signer: ethers.Signer + + constructor( + public networkName: string, + public provider: ethers.providers.JsonRpcProvider, + public signerOverride?: ethers.Signer + ) { + this.signer = signerOverride || provider.getSigner() + } + + deploy = async ( + contractAlias: string, + contractFactory: new (signer: ethers.Signer) => T, + txParams?: ethers.providers.TransactionRequest, + instance?: number | ethers.BigNumber, + ...args: Parameters + ): Promise => { + try { + // Deploy universal deployer 2 if not yet deployed on chain_id + const universalDeployer2Code = await this.provider.getCode(UNIVERSAL_DEPLOYER_2_ADDRESS) + if (universalDeployer2Code === '0x') await this.deployUniversalDeployer2(txParams) + + // Deploying contract + prompt.start(`Deploying ${contractAlias}`) + const factory = new contractFactory(this.signer) + const deployTx = await factory.getDeployTransaction(...args) + + // Make sure instance number is specified + const instanceNumber = instance !== undefined ? instance : 0 + + // Verify if contract already deployed + const contractAddress = await this.addressOf(contractFactory, instanceNumber, ...args) + const contractCode = await this.provider.getCode(contractAddress) + + const deployer = UniversalDeployer2__factory.connect(UNIVERSAL_DEPLOYER_2_ADDRESS, this.signer) + + if (contractCode === '0x') { + // Deploy contract if not already deployed + const tx = (await deployer.functions.deploy(deployTx.data!, instanceNumber, txParams)) as ContractTransaction + await tx.wait() + + // Verify that the deployment was successful since tx won't revert + const postDeployCode = await this.provider.getCode(contractAddress) + postDeployCode === '0x' ? prompt.fail(contractAddress) : prompt.succeed() + } else { + prompt.warn(`ALREADY DEPLOYED: ${contractAlias}`) + } + + const contract = factory.attach(contractAddress) + this.deployedInstances.push({ contractAlias, contract }) + + return contract + } catch (error) { + throw new Error(`CONTRACT DEPLOY FAILED: ${error}`) + } + } + + deployUniversalDeployer = async (txParams?: ethers.providers.TransactionRequest) => { + if ((await this.provider.getBalance(EOA_UNIVERSAL_DEPLOYER_ADDRESS)) < UNIVERSAL_DEPLOYER_FUNDING) { + prompt.start("Funding universal deployer's EOA") + const tx = await this.signer.sendTransaction({ + to: EOA_UNIVERSAL_DEPLOYER_ADDRESS, + value: UNIVERSAL_DEPLOYER_FUNDING, + ...txParams + }) + const receipt = await tx.wait() + if (receipt.status !== 1) { + prompt.fail('txn receipt status failed') + } else { + prompt.succeed() + } + } + + prompt.start('Deploying universal deployer contract') + const tx2 = await this.provider.sendTransaction(UNIVERSAL_DEPLOYER_TX) + // await tx2.wait() + + // const universalDeployerCodeCheck = await this.provider.getCode(UNIVERSAL_DEPLOYER_ADDRESS) + // if (universalDeployerCodeCheck === '0x') { + // prompt.fail(UNIVERSAL_DEPLOYER_ADDRESS) + // } else { + // prompt.succeed() + // } + prompt.succeed() + } + + // Deploy universal deployer via universal deployer 1 + deployUniversalDeployer2 = async (txParams?: ethers.providers.TransactionRequest) => { + const universalDeployerCode = await this.provider.getCode(UNIVERSAL_DEPLOYER_ADDRESS) + if (universalDeployerCode === '0x') { + await this.deployUniversalDeployer(txParams) + } else { + ;('ALREADY DEPLOYED') + } + + // NOTE: in case the getCode below fails, double check the UNIVERSAL_DEPLOYER_2_ADDRESS address + // which is emitted from the deployer 1 contract creation logs. This address may change if + // the UNIVERSAL_DEPLOYER_2_BYTECODE changes of the deployer -- which should never really happen. + + prompt.start('Deploying universal deployer 2 contract') + const tx = (await this.signer.sendTransaction({ + to: UNIVERSAL_DEPLOYER_ADDRESS, + data: UNIVERSAL_DEPLOYER_2_BYTECODE, + ...txParams + })) as ContractTransaction + await tx.wait() + + // const universalDeployer2CodeCheck = await this.provider.getCode(UNIVERSAL_DEPLOYER_2_ADDRESS) + // if (universalDeployer2CodeCheck === '0x') { + // prompt.fail(UNIVERSAL_DEPLOYER_2_ADDRESS) + // } else { + // prompt.succeed() + // } + prompt.succeed() + } + + getDeployment = () => { + return this.deployedInstances.reduce( + (list, instance) => { + const { contract, contractAlias } = instance + list[contractAlias] = contract + return list + }, + {} as { [key: string]: ethers.Contract | { address: string } } + ) + } + + getDeploymentList = () => + this.deployedInstances.map(({ contract, contractAlias }) => { + if (contract as ethers.Contract) { + return { + contractName: contractAlias, + address: contract.address + // abi: contract.interface.abi + } + } else { + return { + contractName: contractAlias, + address: contract.address + } + } + }) + + registerDeployment = async (filePath?: string) => { + if (!isNode()) { + throw new Error('registerDeployment cannot be run in a browser. Node is required. Try the getDeployment() method.') + } + + return promisify(fs.writeFile)( + filePath ? filePath : `./networks/${this.networkName}.json`, + JSON.stringify(this.getDeployment(), null, 2), + { flag: 'w+' } + ) + } + + manualDeploymentRegistration = (contractAlias: string, address: string) => { + this.deployedInstances.push({ + contractAlias, + contract: { address: address } + }) + } + + addressOf = async ( + contractFactory: new (signer: ethers.Signer) => T, + contractInstance: number | ethers.BigNumber, + ...args: Parameters + ): Promise => { + const factory = new contractFactory(this.signer) + const deployTx = await factory.getDeployTransaction(...args) + const deployData = deployTx.data + + const codeHash = ethers.utils.keccak256(ethers.utils.solidityPack(['bytes'], [deployData])) + + const salt = ethers.utils.solidityPack(['uint256'], [contractInstance]) + + const hash = ethers.utils.keccak256( + ethers.utils.solidityPack( + ['bytes1', 'address', 'bytes32', 'bytes32'], + ['0xff', UNIVERSAL_DEPLOYER_2_ADDRESS, salt, codeHash] + ) + ) + + return ethers.utils.getAddress(ethers.utils.hexDataSlice(hash, 12)) + } +} diff --git a/packages/deployer/src/constants.ts b/packages/deployer/src/constants.ts new file mode 100644 index 000000000..9fded9dcd --- /dev/null +++ b/packages/deployer/src/constants.ts @@ -0,0 +1,18 @@ +import { BigNumber } from 'ethers' + +export const EOA_UNIVERSAL_DEPLOYER_ADDRESS: string = '0x9c5a87452d4FAC0cbd53BDCA580b20A45526B3AB' +export const UNIVERSAL_DEPLOYER_ADDRESS: string = '0x1b926fbb24a9f78dcdd3272f2d86f5d0660e59c0' +export const UNIVERSAL_DEPLOYER_2_ADDRESS: string = '0x8a5bc19e22d6ad55a2c763b93a75d09f321fe764' +export const UNIVERSAL_DEPLOYER_FUNDING: BigNumber = BigNumber.from(300).mul(BigNumber.from(10).pow(14)) +export const UNIVERSAL_DEPLOYER_TX: string = + '0xf9010880852416b84e01830222e08080b8b66080604052348015600f57600080fd5b50609980601d6000396000f3fe60a06020601f369081018290049091028201604052608081815260009260609284918190838280828437600092018290525084519495509392505060208401905034f5604080516001600160a01b0383168152905191935081900360200190a0505000fea26469706673582212205a310755225e3c740b2f013fb6343f4c205e7141fcdf15947f5f0e0e818727fb64736f6c634300060a00331ca01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820' + +// expected bytecode for the universal deployer 2. If this changes for whatever reason then the universal +// deployer's addresses of contracts it's deployed will change, and so will UNIVERSAL_DEPLOYER_2_ADDRESS. +// +// do not change this value. it is here to integrity check within the UniversalDeployer. if you do change +// it however, then make sure to also update UNIVERSAL_DEPLOYER_2_ADDRESS. +// +// this value was originally copied from typings/contracts/factories/UniversalDeployer2__factory.ts +export const UNIVERSAL_DEPLOYER_2_BYTECODE = + '0x608060405234801561001057600080fd5b5061013d806100206000396000f3fe60806040526004361061001e5760003560e01c80639c4ae2d014610023575b600080fd5b6100cb6004803603604081101561003957600080fd5b81019060208101813564010000000081111561005457600080fd5b82018360208201111561006657600080fd5b8035906020019184600183028401116401000000008311171561008857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506100cd915050565b005b60008183516020850134f56040805173ffffffffffffffffffffffffffffffffffffffff83168152905191925081900360200190a050505056fea264697066735822122033609f614f03931b92d88c309d698449bb77efcd517328d341fa4f923c5d8c7964736f6c63430007060033' diff --git a/packages/deployer/src/index.ts b/packages/deployer/src/index.ts new file mode 100644 index 000000000..155d24c68 --- /dev/null +++ b/packages/deployer/src/index.ts @@ -0,0 +1,3 @@ +export { UniversalDeployer } from './UniversalDeployer' +export * from './constants' +export * from './types' diff --git a/packages/deployer/src/types.ts b/packages/deployer/src/types.ts new file mode 100644 index 000000000..69b31aec4 --- /dev/null +++ b/packages/deployer/src/types.ts @@ -0,0 +1,15 @@ +import { Contract } from 'ethers' + +export interface FactoryDeployedContract { + address: string +} + +export interface ContractInstance { + contractAlias: string + contract: Contract | { address: string } +} + +export interface ContractInfo { + contractName: string + contractAlias?: string +} diff --git a/packages/deployer/src/typings/contracts/NanoUniversalDeployer.ts b/packages/deployer/src/typings/contracts/NanoUniversalDeployer.ts new file mode 100644 index 000000000..9f8504028 --- /dev/null +++ b/packages/deployer/src/typings/contracts/NanoUniversalDeployer.ts @@ -0,0 +1,60 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { BaseContract, Signer, utils } from 'ethers' +import type { EventFragment } from '@ethersproject/abi' +import type { Listener, Provider } from '@ethersproject/providers' +import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from './common' + +export interface NanoUniversalDeployerInterface extends utils.Interface { + functions: {} + + events: { + 'Deploy(address)': EventFragment + } + + getEvent(nameOrSignatureOrTopic: 'Deploy'): EventFragment +} + +export interface DeployEventObject { + _addr: string +} +export type DeployEvent = TypedEvent<[string], DeployEventObject> + +export type DeployEventFilter = TypedEventFilter + +export interface NanoUniversalDeployer extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this + attach(addressOrName: string): this + deployed(): Promise + + interface: NanoUniversalDeployerInterface + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise> + + listeners(eventFilter?: TypedEventFilter): Array> + listeners(eventName?: string): Array + removeAllListeners(eventFilter: TypedEventFilter): this + removeAllListeners(eventName?: string): this + off: OnEvent + on: OnEvent + once: OnEvent + removeListener: OnEvent + + functions: {} + + callStatic: {} + + filters: { + 'Deploy(address)'(_addr?: null): DeployEventFilter + Deploy(_addr?: null): DeployEventFilter + } + + estimateGas: {} + + populateTransaction: {} +} diff --git a/packages/deployer/src/typings/contracts/UniversalDeployer2.ts b/packages/deployer/src/typings/contracts/UniversalDeployer2.ts new file mode 100644 index 000000000..cf2db74ce --- /dev/null +++ b/packages/deployer/src/typings/contracts/UniversalDeployer2.ts @@ -0,0 +1,109 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + PayableOverrides, + PopulatedTransaction, + Signer, + utils +} from 'ethers' +import type { FunctionFragment, Result, EventFragment } from '@ethersproject/abi' +import type { Listener, Provider } from '@ethersproject/providers' +import type { TypedEventFilter, TypedEvent, TypedListener, OnEvent, PromiseOrValue } from './common' + +export interface UniversalDeployer2Interface extends utils.Interface { + functions: { + 'deploy(bytes,uint256)': FunctionFragment + } + + getFunction(nameOrSignatureOrTopic: 'deploy'): FunctionFragment + + encodeFunctionData(functionFragment: 'deploy', values: [PromiseOrValue, PromiseOrValue]): string + + decodeFunctionResult(functionFragment: 'deploy', data: BytesLike): Result + + events: { + 'Deploy(address)': EventFragment + } + + getEvent(nameOrSignatureOrTopic: 'Deploy'): EventFragment +} + +export interface DeployEventObject { + _addr: string +} +export type DeployEvent = TypedEvent<[string], DeployEventObject> + +export type DeployEventFilter = TypedEventFilter + +export interface UniversalDeployer2 extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this + attach(addressOrName: string): this + deployed(): Promise + + interface: UniversalDeployer2Interface + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise> + + listeners(eventFilter?: TypedEventFilter): Array> + listeners(eventName?: string): Array + removeAllListeners(eventFilter: TypedEventFilter): this + removeAllListeners(eventName?: string): this + off: OnEvent + on: OnEvent + once: OnEvent + removeListener: OnEvent + + functions: { + deploy( + _creationCode: PromiseOrValue, + _instance: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise + } + + deploy( + _creationCode: PromiseOrValue, + _instance: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise + + callStatic: { + deploy( + _creationCode: PromiseOrValue, + _instance: PromiseOrValue, + overrides?: CallOverrides + ): Promise + } + + filters: { + 'Deploy(address)'(_addr?: null): DeployEventFilter + Deploy(_addr?: null): DeployEventFilter + } + + estimateGas: { + deploy( + _creationCode: PromiseOrValue, + _instance: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise + } + + populateTransaction: { + deploy( + _creationCode: PromiseOrValue, + _instance: PromiseOrValue, + overrides?: PayableOverrides & { from?: PromiseOrValue } + ): Promise + } +} diff --git a/packages/deployer/src/typings/contracts/common.ts b/packages/deployer/src/typings/contracts/common.ts new file mode 100644 index 000000000..5d37e711b --- /dev/null +++ b/packages/deployer/src/typings/contracts/common.ts @@ -0,0 +1,32 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { Listener } from '@ethersproject/providers' +import type { Event, EventFilter } from 'ethers' + +export interface TypedEvent = any, TArgsObject = any> extends Event { + args: TArgsArray & TArgsObject +} + +export interface TypedEventFilter<_TEvent extends TypedEvent> extends EventFilter {} + +export interface TypedListener { + (...listenerArg: [...__TypechainArgsArray, TEvent]): void +} + +type __TypechainArgsArray = T extends TypedEvent ? U : never + +export interface OnEvent { + (eventFilter: TypedEventFilter, listener: TypedListener): TRes + (eventName: string, listener: Listener): TRes +} + +export type MinEthersFactory = { + deploy(...a: ARGS[]): Promise +} + +export type GetContractTypeFromFactory = F extends MinEthersFactory ? C : never + +export type GetARGsTypeFromFactory = F extends MinEthersFactory ? Parameters : never + +export type PromiseOrValue = T | Promise diff --git a/packages/deployer/src/typings/contracts/factories/NanoUniversalDeployer__factory.ts b/packages/deployer/src/typings/contracts/factories/NanoUniversalDeployer__factory.ts new file mode 100644 index 000000000..bcecf7001 --- /dev/null +++ b/packages/deployer/src/typings/contracts/factories/NanoUniversalDeployer__factory.ts @@ -0,0 +1,67 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from 'ethers' +import type { Provider, TransactionRequest } from '@ethersproject/providers' +import type { PromiseOrValue } from '../common' +import type { NanoUniversalDeployer, NanoUniversalDeployerInterface } from '../NanoUniversalDeployer' + +const _abi = [ + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'Deploy', + type: 'event' + }, + { + stateMutability: 'payable', + type: 'fallback' + } +] + +const _bytecode = + '0x6080604052348015600f57600080fd5b5060a580601d6000396000f3fe60a06020601f3690810182900490910282016040526080818152600092839283918190838280828437600092018290525084519495509392505060208401905034f56040805173ffffffffffffffffffffffffffffffffffffffff83168152905191935081900360200190a0505000fea26469706673582212207457f4b6f392e3ba295b33e363360d55f06ead85ec96165a406e7b0231ab668464736f6c63430007060033' + +type NanoUniversalDeployerConstructorParams = [signer?: Signer] | ConstructorParameters + +const isSuperArgs = (xs: NanoUniversalDeployerConstructorParams): xs is ConstructorParameters => + xs.length > 1 + +export class NanoUniversalDeployer__factory extends ContractFactory { + constructor(...args: NanoUniversalDeployerConstructorParams) { + if (isSuperArgs(args)) { + super(...args) + } else { + super(_abi, _bytecode, args[0]) + } + } + + override deploy(overrides?: Overrides & { from?: PromiseOrValue }): Promise { + return super.deploy(overrides || {}) as Promise + } + override getDeployTransaction(overrides?: Overrides & { from?: PromiseOrValue }): TransactionRequest { + return super.getDeployTransaction(overrides || {}) + } + override attach(address: string): NanoUniversalDeployer { + return super.attach(address) as NanoUniversalDeployer + } + override connect(signer: Signer): NanoUniversalDeployer__factory { + return super.connect(signer) as NanoUniversalDeployer__factory + } + + static readonly bytecode = _bytecode + static readonly abi = _abi + static createInterface(): NanoUniversalDeployerInterface { + return new utils.Interface(_abi) as NanoUniversalDeployerInterface + } + static connect(address: string, signerOrProvider: Signer | Provider): NanoUniversalDeployer { + return new Contract(address, _abi, signerOrProvider) as NanoUniversalDeployer + } +} diff --git a/packages/deployer/src/typings/contracts/factories/UniversalDeployer2__factory.ts b/packages/deployer/src/typings/contracts/factories/UniversalDeployer2__factory.ts new file mode 100644 index 000000000..67cf2eb00 --- /dev/null +++ b/packages/deployer/src/typings/contracts/factories/UniversalDeployer2__factory.ts @@ -0,0 +1,81 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from 'ethers' +import type { Provider, TransactionRequest } from '@ethersproject/providers' +import type { PromiseOrValue } from '../common' +import type { UniversalDeployer2, UniversalDeployer2Interface } from '../UniversalDeployer2' + +const _abi = [ + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'Deploy', + type: 'event' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_creationCode', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_instance', + type: 'uint256' + } + ], + name: 'deploy', + outputs: [], + stateMutability: 'payable', + type: 'function' + } +] + +const _bytecode = + '0x608060405234801561001057600080fd5b5061013d806100206000396000f3fe60806040526004361061001e5760003560e01c80639c4ae2d014610023575b600080fd5b6100cb6004803603604081101561003957600080fd5b81019060208101813564010000000081111561005457600080fd5b82018360208201111561006657600080fd5b8035906020019184600183028401116401000000008311171561008857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506100cd915050565b005b60008183516020850134f56040805173ffffffffffffffffffffffffffffffffffffffff83168152905191925081900360200190a050505056fea264697066735822122033609f614f03931b92d88c309d698449bb77efcd517328d341fa4f923c5d8c7964736f6c63430007060033' + +type UniversalDeployer2ConstructorParams = [signer?: Signer] | ConstructorParameters + +const isSuperArgs = (xs: UniversalDeployer2ConstructorParams): xs is ConstructorParameters => + xs.length > 1 + +export class UniversalDeployer2__factory extends ContractFactory { + constructor(...args: UniversalDeployer2ConstructorParams) { + if (isSuperArgs(args)) { + super(...args) + } else { + super(_abi, _bytecode, args[0]) + } + } + + override deploy(overrides?: Overrides & { from?: PromiseOrValue }): Promise { + return super.deploy(overrides || {}) as Promise + } + override getDeployTransaction(overrides?: Overrides & { from?: PromiseOrValue }): TransactionRequest { + return super.getDeployTransaction(overrides || {}) + } + override attach(address: string): UniversalDeployer2 { + return super.attach(address) as UniversalDeployer2 + } + override connect(signer: Signer): UniversalDeployer2__factory { + return super.connect(signer) as UniversalDeployer2__factory + } + + static readonly bytecode = _bytecode + static readonly abi = _abi + static createInterface(): UniversalDeployer2Interface { + return new utils.Interface(_abi) as UniversalDeployer2Interface + } + static connect(address: string, signerOrProvider: Signer | Provider): UniversalDeployer2 { + return new Contract(address, _abi, signerOrProvider) as UniversalDeployer2 + } +} diff --git a/packages/deployer/src/typings/contracts/factories/index.ts b/packages/deployer/src/typings/contracts/factories/index.ts new file mode 100644 index 000000000..e460629dd --- /dev/null +++ b/packages/deployer/src/typings/contracts/factories/index.ts @@ -0,0 +1,5 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export { NanoUniversalDeployer__factory } from './NanoUniversalDeployer__factory' +export { UniversalDeployer2__factory } from './UniversalDeployer2__factory' diff --git a/packages/deployer/src/typings/contracts/index.ts b/packages/deployer/src/typings/contracts/index.ts new file mode 100644 index 000000000..087a970c9 --- /dev/null +++ b/packages/deployer/src/typings/contracts/index.ts @@ -0,0 +1,8 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +export type { NanoUniversalDeployer } from './NanoUniversalDeployer' +export type { UniversalDeployer2 } from './UniversalDeployer2' +export * as factories from './factories' +export { NanoUniversalDeployer__factory } from './factories/NanoUniversalDeployer__factory' +export { UniversalDeployer2__factory } from './factories/UniversalDeployer2__factory' diff --git a/packages/deployer/src/utils/configLoader.ts b/packages/deployer/src/utils/configLoader.ts new file mode 100644 index 000000000..35f67c524 --- /dev/null +++ b/packages/deployer/src/utils/configLoader.ts @@ -0,0 +1,49 @@ +import * as dotenv from 'dotenv' +import * as path from 'path' +import { HttpNetworkConfig, HttpNetworkHDAccountsConfig } from 'hardhat/types/config' +import { ethers } from 'ethers' + +type EthereumNetworksTypes = 'rinkeby' | 'ropsten' | 'kovan' | 'goerli' | 'mainnet' | 'mumbai' | 'matic' + +export const getEnvConfig = (env: string) => { + const envFile = path.resolve(__dirname, `../../config/${env}.env`) + const envLoad = dotenv.config({ path: envFile }) + + if (envLoad.error) { + console.warn('No config found, using default') + return { ETH_MNEMONIC: ethers.Wallet.createRandom().mnemonic.phrase } + } + + return envLoad.parsed || {} +} + +export const networkConfig = (network: EthereumNetworksTypes): HttpNetworkConfig => { + const config = getEnvConfig('PROD') + const networkConfig: HttpNetworkConfig = { + url: (function (network) { + switch (network) { + case 'mumbai': + return 'https://rpc-mumbai.matic.today/' + + case 'matic': + return 'https://rpc-mainnet.matic.network' + + default: + return `https://${network}.infura.io/v3/${config['INFURA_API_KEY']}` + } + })(network), + accounts: { + mnemonic: config['ETH_MNEMONIC'], + initialIndex: 0, + count: 10, + path: `m/44'/60'/0'/0` + } as HttpNetworkHDAccountsConfig, + gas: 'auto', + gasPrice: 'auto', + gasMultiplier: 1, + timeout: 20000, + httpHeaders: {} + } + + return networkConfig +} diff --git a/packages/deployer/src/utils/logger.ts b/packages/deployer/src/utils/logger.ts new file mode 100644 index 000000000..17f7f3fd1 --- /dev/null +++ b/packages/deployer/src/utils/logger.ts @@ -0,0 +1,34 @@ +export interface Logger { + start(text?: string): void + stop(): void + succeed(text?: string): void + fail(text?: string): void + warn(text?: string): void + info(text?: string): void +} + +export const createLogger = async (): Promise => { + let startText = '' + return { + start: function (text: string = '') { + startText = text + console.warn(`[start] ${text}`) + }, + stop: function () { + console.warn(`[stop] ${startText}`) + startText = '' + }, + succeed: function (text: string = '') { + console.warn(`[success] ${startText} ${text}`) + }, + fail: function (text: string = '') { + console.warn(`[fail] ${startText} ${text}`) + }, + warn: function (text: string = '') { + console.warn(`[warn] ${startText} ${text}`) + }, + info: function (text: string = '') { + console.warn(`[info] ${startText} ${text}`) + } + } +} diff --git a/packages/deployer/tests/mock.spec.ts b/packages/deployer/tests/mock.spec.ts new file mode 100644 index 000000000..9ddc326c8 --- /dev/null +++ b/packages/deployer/tests/mock.spec.ts @@ -0,0 +1,3 @@ +describe('deployer', function () { + it('todo', () => {}) +}) diff --git a/packages/estimator/src/builds/MainModuleGasEstimation.ts b/packages/estimator/src/builds/MainModuleGasEstimation.ts new file mode 100644 index 000000000..63e4b2fc4 --- /dev/null +++ b/packages/estimator/src/builds/MainModuleGasEstimation.ts @@ -0,0 +1,854 @@ +export const mainModuleGasEstimation = { + _format: 'hh-sol-artifact-1', + contractName: 'MainModuleGasEstimation', + sourceName: 'contracts/modules/MainModuleGasEstimation.sol', + abi: [ + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_provided', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_current', + type: 'uint256' + } + ], + name: 'BadNonce', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'HookAlreadyExists', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'HookDoesNotExist', + type: 'error' + }, + { + inputs: [], + name: 'ImageHashIsZero', + type: 'error' + }, + { + inputs: [ + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'InvalidImplementation', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'address', + name: '_addr', + type: 'address' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidNestedSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'bytes32', + name: '_s', + type: 'bytes32' + } + ], + name: 'InvalidSValue', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_flag', + type: 'uint256' + } + ], + name: 'InvalidSignatureFlag', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidSignatureLength', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes1', + name: '_type', + type: 'bytes1' + } + ], + name: 'InvalidSignatureType', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_v', + type: 'uint256' + } + ], + name: 'InvalidVValue', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: 'threshold', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_weight', + type: 'uint256' + } + ], + name: 'LowWeightChainedSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_index', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_requested', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_available', + type: 'uint256' + } + ], + name: 'NotEnoughGas', + type: 'error' + }, + { + inputs: [ + { + internalType: 'address', + name: '_sender', + type: 'address' + }, + { + internalType: 'address', + name: '_self', + type: 'address' + } + ], + name: 'OnlySelfAuth', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'SignerIsAddress0', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_type', + type: 'uint256' + }, + { + internalType: 'bool', + name: '_recoverMode', + type: 'bool' + } + ], + name: 'UnsupportedSignatureType', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_current', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_prev', + type: 'uint256' + } + ], + name: 'WrongChainedCheckpointOrder', + type: 'error' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + name: 'CreatedContract', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: 'newImageHash', + type: 'bytes32' + } + ], + name: 'ImageHashUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'newImplementation', + type: 'address' + } + ], + name: 'ImplementationUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + indexed: false, + internalType: 'uint256', + name: '_newNonce', + type: 'uint256' + } + ], + name: 'NonceChange', + type: 'event' + }, + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + } + ], + name: 'TxExecuted', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'bytes', + name: '_reason', + type: 'bytes' + } + ], + name: 'TxFailed', + type: 'event' + }, + { + stateMutability: 'payable', + type: 'fallback' + }, + { + inputs: [], + name: 'SET_IMAGE_HASH_TYPE_HASH', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + }, + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'addHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_code', + type: 'bytes' + } + ], + name: 'createContract', + outputs: [ + { + internalType: 'address', + name: 'addr', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + }, + { + internalType: 'uint256', + name: '_nonce', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'execute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [], + name: 'imageHash', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signatures', + type: 'bytes' + } + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_data', + type: 'bytes' + }, + { + internalType: 'bytes', + name: '_signatures', + 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: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155BatchReceived', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC721Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'readHook', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + } + ], + name: 'readNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'removeHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'selfExecute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'signatureRecovery', + outputs: [ + { + internalType: 'uint256', + name: 'threshold', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'weight', + type: 'uint256' + }, + { + internalType: 'bytes32', + name: 'imageHash', + type: 'bytes32' + }, + { + internalType: 'bytes32', + name: 'subDigest', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: 'checkpoint', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_interfaceID', + type: 'bytes4' + } + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + } + ], + name: 'updateImageHash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'updateImplementation', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + stateMutability: 'payable', + type: 'receive' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b50612daa806100206000396000f3fe6080604052600436106101485760003560e01c806357c56d6b116100c057806390042baf11610074578063b93ea7ad11610059578063b93ea7ad146104da578063bc197c81146104fa578063f23a6e61146105425761014f565b806390042baf146104b2578063affed0e0146104c55761014f565b80637a9a1628116100a55780637a9a16281461042a578063853c50681461044a5780638c3f5563146104925761014f565b806357c56d6b146103d657806361c2926c1461040a5761014f565b80631a9b23371161011757806329561426116100fc57806329561426146103735780634fcf3eca1461039357806351605d80146103b35761014f565b80631a9b23371461030e57806320c13b0b146103535761014f565b806301ffc9a714610223578063025b22bc14610258578063150b7a02146102785780631626ba7e146102ee5761014f565b3661014f57005b600061017e6000357fffffffff0000000000000000000000000000000000000000000000000000000016610588565b905073ffffffffffffffffffffffffffffffffffffffff811615610221576000808273ffffffffffffffffffffffffffffffffffffffff166000366040516101c79291906122da565b600060405180830381855af49150503d8060008114610202576040519150601f19603f3d011682016040523d82523d6000602084013e610207565b606091505b50915091508161021957805160208201fd5b805160208201f35b005b34801561022f57600080fd5b5061024361023e366004612318565b6105dc565b60405190151581526020015b60405180910390f35b34801561026457600080fd5b5061022161027336600461235e565b6105e7565b34801561028457600080fd5b506102bd6102933660046123c2565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161024f565b3480156102fa57600080fd5b506102bd610309366004612431565b610639565b34801561031a57600080fd5b5061032e610329366004612318565b610686565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161024f565b34801561035f57600080fd5b506102bd61036e36600461247d565b610691565b34801561037f57600080fd5b5061022161038e3660046124e9565b6106f6565b34801561039f57600080fd5b506102216103ae366004612318565b610740565b3480156103bf57600080fd5b506103c861086f565b60405190815260200161024f565b3480156103e257600080fd5b506103c87f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b34801561041657600080fd5b50610221610425366004612547565b61089e565b34801561043657600080fd5b50610221610445366004612589565b610924565b34801561045657600080fd5b5061046a610465366004612431565b6109ba565b604080519586526020860194909452928401919091526060830152608082015260a00161024f565b34801561049e57600080fd5b506103c86104ad3660046124e9565b610b82565b61032e6104c0366004612621565b610bae565b3480156104d157600080fd5b506103c8610c4a565b3480156104e657600080fd5b506102216104f53660046126f0565b610c56565b34801561050657600080fd5b506102bd610515366004612725565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561054e57600080fd5b506102bd61055d3660046127e0565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60006105d67fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610d9b565b92915050565b60006105d682610df9565b33301461062d576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b61063681610e55565b50565b600080610647858585610f10565b509050801561067957507f1626ba7e00000000000000000000000000000000000000000000000000000000905061067f565b50600090505b9392505050565b60006105d682610588565b6000806106b686866040516106a79291906122da565b60405180910390208585610f10565b50905080156106e857507f20c13b0b0000000000000000000000000000000000000000000000000000000090506106ee565b50600090505b949350505050565b333014610737576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b61063681610f4e565b333014610781576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b600061078c82610588565b73ffffffffffffffffffffffffffffffffffffffff16036107fd576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000082166004820152602401610624565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff00000000000000000000000000000000000000000000000000000000841682840152825180830384018152606090920190925280519101206000905550565b60006108997fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85490565b905090565b3330146108df576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b600061091283836040516020016108f7929190612a00565b60405160208183030381529060405280519060200120610fde565b905061091f818484611063565b505050565b61092d836111c1565b60008061096585888860405160200161094893929190612a48565b604051602081830303815290604052805190602001208585610f10565b91509150816109a6578084846040517f8f4a234f00000000000000000000000000000000000000000000000000000000815260040161062493929190612a6b565b6109b1818888611063565b50505050505050565b600080600080600080878760008181106109d6576109d6612a85565b909101357fff00000000000000000000000000000000000000000000000000000000000000169150819050610a2c57610a0e89610fde565b9250610a1b8389896112ca565b92985090965094509150610b779050565b7fff0000000000000000000000000000000000000000000000000000000000000081811601610a6b57610a5e89610fde565b9250610a1b83898961131b565b7ffe000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610abd57610a5e89611347565b7ffd000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610b2157610b118989896113b4565b9550955095509550955050610b77565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff0000000000000000000000000000000000000000000000000000000000000082166004820152602401610624565b939792965093509350565b60006105d67f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610d9b565b6000333014610bf1576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b81516020830134f060405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b60006108996000610b82565b333014610c97576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b6000610ca283610588565b73ffffffffffffffffffffffffffffffffffffffff1614610d13576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000083166004820152602401610624565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401528251808303840181526060909201909252805191012073ffffffffffffffffffffffffffffffffffffffff821690555050565b6000808383604051602001610dba929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610e4c57506001919050565b6105d682611531565b73ffffffffffffffffffffffffffffffffffffffff81163b610ebb576040517f0c76093700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610624565b610ec3813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b6000806000806000610f238888886109ba565b50965091945092509050828210801590610f415750610f4181611672565b9450505050935093915050565b80610f85576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fae7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa90602001610f05565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b818110156111ba573684848381811061108257611082612a85565b90506020028101906110949190612ab4565b90506040810135805a10156110e95782815a6040517f2bb3e3ba000000000000000000000000000000000000000000000000000000008152600481019390935260248301919091526044820152606401610624565b60006110f86020840184612af2565b1561113757611130611110608085016060860161235e565b831561111c578361111e565b5a5b61112b60a0870187612b0d565b61167d565b9050611172565b61116f61114a608085016060860161235e565b6080850135841561115b578461115d565b5a5b61116a60a0880188612b0d565b611698565b90505b801561118e5760405188815260200160405180910390a06111af565b6111af6111a16040850160208601612af2565b896111aa6116b5565b6116d4565b505050600101611067565b5050505050565b606081901c6bffffffffffffffffffffffff821660006111e083610b82565b90508181141580156111f0575060005b15611238576040517f9b6514f4000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260448101829052606401610624565b604080517f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e60208083019190915281830186905282518083038401815260609092019092528051910120600183019081905560408051858152602081018390527f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881910160405180910390a15050505050565b60008080806112e5876112e0876006818b612b72565b611720565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b600080808061133687611331876001818b612b72565b6112ca565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601611046565b6000808080806004600188013560e81c826113cf8383612bcb565b90506113e18b61046583868d8f612b72565b939b50919950975095509350878710156114395761140181848b8d612b72565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016106249493929190612bde565b8092505b888310156115235760038301928a013560e81c915061145c8383612bcb565b9050600061147e61146c88611bb6565b8c8c8790869261046593929190612b72565b939c50919a50985090915050888810156114d65761149e82858c8e612b72565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016106249493929190612bde565b848110611519576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610624565b935091508161143d565b505050939792965093509350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba500000000000000000000000000000000000000000000000000000000014806115c457507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061161057507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b8061165c57507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561166957506001919050565b6105d682611bea565b60006105d682611c46565b60006040518284823760008084838989f49695505050505050565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b82156116e257805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051611713929190612c05565b60405180910390a1505050565b60008060005b83811015611bad57600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81016117c757601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff0000000000000000000000000000000000000000168117856117ad57806117bc565b60008681526020829052604090205b955050505050611726565b8061185d5760018201918681013560f81c9060430160006117f38a6117ee84888c8e612b72565b611c5f565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff821617866118425780611851565b60008781526020829052604090205b96505050505050611726565b60028103611985576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506118d68b848c8c8a9086926118d193929190612b72565b611f22565b61191e578a836118e883898d8f612b72565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016106249493929190612c79565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617876119695780611978565b60008881526020829052604090205b9750505050505050611726565b600381036119b8576020820191860135836119a057806119af565b60008481526020829052604090205b93505050611726565b60048103611a04576003808301928781013560e81c91908201016000806119e58b6112e085898d8f612b72565b6000988952602052604090972096909701965090935061172692505050565b60068103611b0c5760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff169150809650819250505060008186019050600080611a728d8d8d8b9087926112e093929190612b72565b93985088939092509050848210611a8857988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a9052835180840390910181526098909201909252805191012089611aee5780611afd565b60008a81526020829052604090205b99505050505050505050611726565b60058103611b78576020820191860135878103611b47577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b6000611b52826120cf565b905084611b5f5780611b6e565b60008581526020829052604090205b9450505050611726565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610624565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d160009081526020829052604081206105d6565b60007ffda4dd44000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601611c3d57506001919050565b6105d68261210a565b6000611c5182612166565b806105d65750600192915050565b600060428214611c9f5782826040517f2ee17a3d000000000000000000000000000000000000000000000000000000008152600401610624929190612cb9565b6000611cb8611caf600185612ccd565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115611d2c578686826040517fad4aac7600000000000000000000000000000000000000000000000000000000815260040161062493929190612ce0565b8260ff16601b14158015611d4457508260ff16601c14155b15611d81578686846040517fe578897e00000000000000000000000000000000000000000000000000000000815260040161062493929190612d04565b60018403611dee576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa158015611ddd573d6000803e3d6000fd5b505050602060405103519450611ec6565b60028403611e8b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a001611dbb565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016106249493929190612d2b565b73ffffffffffffffffffffffffffffffffffffffff8516611f175786866040517f6c1719d2000000000000000000000000000000000000000000000000000000008152600401610624929190612cb9565b505050509392505050565b6000808383611f32600182612ccd565b818110611f4157611f41612a85565b919091013560f81c9150506001811480611f5b5750600281145b15611fa0578473ffffffffffffffffffffffffffffffffffffffff16611f82878686611c5f565b73ffffffffffffffffffffffffffffffffffffffff161491506120c6565b6003810361208b5773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e8786600087611fd4600182612ccd565b92611fe193929190612b72565b6040518463ffffffff1660e01b8152600401611fff93929190612a6b565b602060405180830381865afa15801561201c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120409190612d57565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e000000000000000000000000000000000000000000000000000000001491506120c6565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016106249493929190612d2b565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801611046565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161215d57506001919050565b6105d682612199565b600081158015906105d65750507fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8541490565b60007fae9fa280000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016121ec57506001919050565b6105d68260007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e00000000000000000000000000000000000000000000000000000000148061228357507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b1561229057506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146105d6565b8183823760009101908152919050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461063657600080fd5b60006020828403121561232a57600080fd5b813561067f816122ea565b803573ffffffffffffffffffffffffffffffffffffffff8116811461235957600080fd5b919050565b60006020828403121561237057600080fd5b61067f82612335565b60008083601f84011261238b57600080fd5b50813567ffffffffffffffff8111156123a357600080fd5b6020830191508360208285010111156123bb57600080fd5b9250929050565b6000806000806000608086880312156123da57600080fd5b6123e386612335565b94506123f160208701612335565b935060408601359250606086013567ffffffffffffffff81111561241457600080fd5b61242088828901612379565b969995985093965092949392505050565b60008060006040848603121561244657600080fd5b83359250602084013567ffffffffffffffff81111561246457600080fd5b61247086828701612379565b9497909650939450505050565b6000806000806040858703121561249357600080fd5b843567ffffffffffffffff808211156124ab57600080fd5b6124b788838901612379565b909650945060208701359150808211156124d057600080fd5b506124dd87828801612379565b95989497509550505050565b6000602082840312156124fb57600080fd5b5035919050565b60008083601f84011261251457600080fd5b50813567ffffffffffffffff81111561252c57600080fd5b6020830191508360208260051b85010111156123bb57600080fd5b6000806020838503121561255a57600080fd5b823567ffffffffffffffff81111561257157600080fd5b61257d85828601612502565b90969095509350505050565b6000806000806000606086880312156125a157600080fd5b853567ffffffffffffffff808211156125b957600080fd5b6125c589838a01612502565b90975095506020880135945060408801359150808211156125e557600080fd5b5061242088828901612379565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561263357600080fd5b813567ffffffffffffffff8082111561264b57600080fd5b818401915084601f83011261265f57600080fd5b813581811115612671576126716125f2565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156126b7576126b76125f2565b816040528281528760208487010111156126d057600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000806040838503121561270357600080fd5b823561270e816122ea565b915061271c60208401612335565b90509250929050565b60008060008060008060008060a0898b03121561274157600080fd5b61274a89612335565b975061275860208a01612335565b9650604089013567ffffffffffffffff8082111561277557600080fd5b6127818c838d01612502565b909850965060608b013591508082111561279a57600080fd5b6127a68c838d01612502565b909650945060808b01359150808211156127bf57600080fd5b506127cc8b828c01612379565b999c989b5096995094979396929594505050565b60008060008060008060a087890312156127f957600080fd5b61280287612335565b955061281060208801612335565b94506040870135935060608701359250608087013567ffffffffffffffff81111561283a57600080fd5b61284689828a01612379565b979a9699509497509295939492505050565b8035801515811461235957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b878110156129f357828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4188360301811261290a57600080fd5b870160c061291782612858565b15158652612926878301612858565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff612958828501612335565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261299e57600080fd5b90920187810192903567ffffffffffffffff8111156129bc57600080fd5b8036038413156129cb57600080fd5b82828901526129dd8389018286612868565b9c89019c975050509286019250506001016128cb565b5091979650505050505050565b60408152600560408201527f73656c663a00000000000000000000000000000000000000000000000000000060608201526080602082015260006106ee6080830184866128b1565b838152604060208201526000612a626040830184866128b1565b95945050505050565b838152604060208201526000612a62604083018486612868565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112612ae857600080fd5b9190910192915050565b600060208284031215612b0457600080fd5b61067f82612858565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612b4257600080fd5b83018035915067ffffffffffffffff821115612b5d57600080fd5b6020019150368190038213156123bb57600080fd5b60008085851115612b8257600080fd5b83861115612b8f57600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105d6576105d6612b9c565b606081526000612bf2606083018688612868565b6020830194909452506040015292915050565b82815260006020604081840152835180604085015260005b81811015612c3957858101830151858201606001528201612c1d565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000612caf606083018486612868565b9695505050505050565b6020815260006106ee602083018486612868565b818103818111156105d6576105d6612b9c565b604081526000612cf4604083018587612868565b9050826020830152949350505050565b604081526000612d18604083018587612868565b905060ff83166020830152949350505050565b606081526000612d3f606083018688612868565b60208301949094525090151560409091015292915050565b600060208284031215612d6957600080fd5b815161067f816122ea56fea2646970667358221220d1c64e83cb54c2e1824f98a6e0664734329329620cf112737055416b4d68ea6a64736f6c63430008110033', + deployedBytecode: + '0x6080604052600436106101485760003560e01c806357c56d6b116100c057806390042baf11610074578063b93ea7ad11610059578063b93ea7ad146104da578063bc197c81146104fa578063f23a6e61146105425761014f565b806390042baf146104b2578063affed0e0146104c55761014f565b80637a9a1628116100a55780637a9a16281461042a578063853c50681461044a5780638c3f5563146104925761014f565b806357c56d6b146103d657806361c2926c1461040a5761014f565b80631a9b23371161011757806329561426116100fc57806329561426146103735780634fcf3eca1461039357806351605d80146103b35761014f565b80631a9b23371461030e57806320c13b0b146103535761014f565b806301ffc9a714610223578063025b22bc14610258578063150b7a02146102785780631626ba7e146102ee5761014f565b3661014f57005b600061017e6000357fffffffff0000000000000000000000000000000000000000000000000000000016610588565b905073ffffffffffffffffffffffffffffffffffffffff811615610221576000808273ffffffffffffffffffffffffffffffffffffffff166000366040516101c79291906122da565b600060405180830381855af49150503d8060008114610202576040519150601f19603f3d011682016040523d82523d6000602084013e610207565b606091505b50915091508161021957805160208201fd5b805160208201f35b005b34801561022f57600080fd5b5061024361023e366004612318565b6105dc565b60405190151581526020015b60405180910390f35b34801561026457600080fd5b5061022161027336600461235e565b6105e7565b34801561028457600080fd5b506102bd6102933660046123c2565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161024f565b3480156102fa57600080fd5b506102bd610309366004612431565b610639565b34801561031a57600080fd5b5061032e610329366004612318565b610686565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161024f565b34801561035f57600080fd5b506102bd61036e36600461247d565b610691565b34801561037f57600080fd5b5061022161038e3660046124e9565b6106f6565b34801561039f57600080fd5b506102216103ae366004612318565b610740565b3480156103bf57600080fd5b506103c861086f565b60405190815260200161024f565b3480156103e257600080fd5b506103c87f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b34801561041657600080fd5b50610221610425366004612547565b61089e565b34801561043657600080fd5b50610221610445366004612589565b610924565b34801561045657600080fd5b5061046a610465366004612431565b6109ba565b604080519586526020860194909452928401919091526060830152608082015260a00161024f565b34801561049e57600080fd5b506103c86104ad3660046124e9565b610b82565b61032e6104c0366004612621565b610bae565b3480156104d157600080fd5b506103c8610c4a565b3480156104e657600080fd5b506102216104f53660046126f0565b610c56565b34801561050657600080fd5b506102bd610515366004612725565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561054e57600080fd5b506102bd61055d3660046127e0565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60006105d67fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610d9b565b92915050565b60006105d682610df9565b33301461062d576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b61063681610e55565b50565b600080610647858585610f10565b509050801561067957507f1626ba7e00000000000000000000000000000000000000000000000000000000905061067f565b50600090505b9392505050565b60006105d682610588565b6000806106b686866040516106a79291906122da565b60405180910390208585610f10565b50905080156106e857507f20c13b0b0000000000000000000000000000000000000000000000000000000090506106ee565b50600090505b949350505050565b333014610737576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b61063681610f4e565b333014610781576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b600061078c82610588565b73ffffffffffffffffffffffffffffffffffffffff16036107fd576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000082166004820152602401610624565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff00000000000000000000000000000000000000000000000000000000841682840152825180830384018152606090920190925280519101206000905550565b60006108997fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85490565b905090565b3330146108df576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b600061091283836040516020016108f7929190612a00565b60405160208183030381529060405280519060200120610fde565b905061091f818484611063565b505050565b61092d836111c1565b60008061096585888860405160200161094893929190612a48565b604051602081830303815290604052805190602001208585610f10565b91509150816109a6578084846040517f8f4a234f00000000000000000000000000000000000000000000000000000000815260040161062493929190612a6b565b6109b1818888611063565b50505050505050565b600080600080600080878760008181106109d6576109d6612a85565b909101357fff00000000000000000000000000000000000000000000000000000000000000169150819050610a2c57610a0e89610fde565b9250610a1b8389896112ca565b92985090965094509150610b779050565b7fff0000000000000000000000000000000000000000000000000000000000000081811601610a6b57610a5e89610fde565b9250610a1b83898961131b565b7ffe000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610abd57610a5e89611347565b7ffd000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610b2157610b118989896113b4565b9550955095509550955050610b77565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff0000000000000000000000000000000000000000000000000000000000000082166004820152602401610624565b939792965093509350565b60006105d67f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610d9b565b6000333014610bf1576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b81516020830134f060405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b60006108996000610b82565b333014610c97576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610624565b6000610ca283610588565b73ffffffffffffffffffffffffffffffffffffffff1614610d13576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000083166004820152602401610624565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401528251808303840181526060909201909252805191012073ffffffffffffffffffffffffffffffffffffffff821690555050565b6000808383604051602001610dba929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610e4c57506001919050565b6105d682611531565b73ffffffffffffffffffffffffffffffffffffffff81163b610ebb576040517f0c76093700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610624565b610ec3813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b6000806000806000610f238888886109ba565b50965091945092509050828210801590610f415750610f4181611672565b9450505050935093915050565b80610f85576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fae7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa90602001610f05565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b818110156111ba573684848381811061108257611082612a85565b90506020028101906110949190612ab4565b90506040810135805a10156110e95782815a6040517f2bb3e3ba000000000000000000000000000000000000000000000000000000008152600481019390935260248301919091526044820152606401610624565b60006110f86020840184612af2565b1561113757611130611110608085016060860161235e565b831561111c578361111e565b5a5b61112b60a0870187612b0d565b61167d565b9050611172565b61116f61114a608085016060860161235e565b6080850135841561115b578461115d565b5a5b61116a60a0880188612b0d565b611698565b90505b801561118e5760405188815260200160405180910390a06111af565b6111af6111a16040850160208601612af2565b896111aa6116b5565b6116d4565b505050600101611067565b5050505050565b606081901c6bffffffffffffffffffffffff821660006111e083610b82565b90508181141580156111f0575060005b15611238576040517f9b6514f4000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260448101829052606401610624565b604080517f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e60208083019190915281830186905282518083038401815260609092019092528051910120600183019081905560408051858152602081018390527f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881910160405180910390a15050505050565b60008080806112e5876112e0876006818b612b72565b611720565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b600080808061133687611331876001818b612b72565b6112ca565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601611046565b6000808080806004600188013560e81c826113cf8383612bcb565b90506113e18b61046583868d8f612b72565b939b50919950975095509350878710156114395761140181848b8d612b72565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016106249493929190612bde565b8092505b888310156115235760038301928a013560e81c915061145c8383612bcb565b9050600061147e61146c88611bb6565b8c8c8790869261046593929190612b72565b939c50919a50985090915050888810156114d65761149e82858c8e612b72565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016106249493929190612bde565b848110611519576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610624565b935091508161143d565b505050939792965093509350565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba500000000000000000000000000000000000000000000000000000000014806115c457507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061161057507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b8061165c57507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561166957506001919050565b6105d682611bea565b60006105d682611c46565b60006040518284823760008084838989f49695505050505050565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b82156116e257805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051611713929190612c05565b60405180910390a1505050565b60008060005b83811015611bad57600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81016117c757601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff0000000000000000000000000000000000000000168117856117ad57806117bc565b60008681526020829052604090205b955050505050611726565b8061185d5760018201918681013560f81c9060430160006117f38a6117ee84888c8e612b72565b611c5f565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff821617866118425780611851565b60008781526020829052604090205b96505050505050611726565b60028103611985576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506118d68b848c8c8a9086926118d193929190612b72565b611f22565b61191e578a836118e883898d8f612b72565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016106249493929190612c79565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617876119695780611978565b60008881526020829052604090205b9750505050505050611726565b600381036119b8576020820191860135836119a057806119af565b60008481526020829052604090205b93505050611726565b60048103611a04576003808301928781013560e81c91908201016000806119e58b6112e085898d8f612b72565b6000988952602052604090972096909701965090935061172692505050565b60068103611b0c5760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff169150809650819250505060008186019050600080611a728d8d8d8b9087926112e093929190612b72565b93985088939092509050848210611a8857988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a9052835180840390910181526098909201909252805191012089611aee5780611afd565b60008a81526020829052604090205b99505050505050505050611726565b60058103611b78576020820191860135878103611b47577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b6000611b52826120cf565b905084611b5f5780611b6e565b60008581526020829052604090205b9450505050611726565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610624565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d160009081526020829052604081206105d6565b60007ffda4dd44000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601611c3d57506001919050565b6105d68261210a565b6000611c5182612166565b806105d65750600192915050565b600060428214611c9f5782826040517f2ee17a3d000000000000000000000000000000000000000000000000000000008152600401610624929190612cb9565b6000611cb8611caf600185612ccd565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115611d2c578686826040517fad4aac7600000000000000000000000000000000000000000000000000000000815260040161062493929190612ce0565b8260ff16601b14158015611d4457508260ff16601c14155b15611d81578686846040517fe578897e00000000000000000000000000000000000000000000000000000000815260040161062493929190612d04565b60018403611dee576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa158015611ddd573d6000803e3d6000fd5b505050602060405103519450611ec6565b60028403611e8b576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a001611dbb565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016106249493929190612d2b565b73ffffffffffffffffffffffffffffffffffffffff8516611f175786866040517f6c1719d2000000000000000000000000000000000000000000000000000000008152600401610624929190612cb9565b505050509392505050565b6000808383611f32600182612ccd565b818110611f4157611f41612a85565b919091013560f81c9150506001811480611f5b5750600281145b15611fa0578473ffffffffffffffffffffffffffffffffffffffff16611f82878686611c5f565b73ffffffffffffffffffffffffffffffffffffffff161491506120c6565b6003810361208b5773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e8786600087611fd4600182612ccd565b92611fe193929190612b72565b6040518463ffffffff1660e01b8152600401611fff93929190612a6b565b602060405180830381865afa15801561201c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120409190612d57565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e000000000000000000000000000000000000000000000000000000001491506120c6565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016106249493929190612d2b565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801611046565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161215d57506001919050565b6105d682612199565b600081158015906105d65750507fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8541490565b60007fae9fa280000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016121ec57506001919050565b6105d68260007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e00000000000000000000000000000000000000000000000000000000148061228357507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b1561229057506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146105d6565b8183823760009101908152919050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461063657600080fd5b60006020828403121561232a57600080fd5b813561067f816122ea565b803573ffffffffffffffffffffffffffffffffffffffff8116811461235957600080fd5b919050565b60006020828403121561237057600080fd5b61067f82612335565b60008083601f84011261238b57600080fd5b50813567ffffffffffffffff8111156123a357600080fd5b6020830191508360208285010111156123bb57600080fd5b9250929050565b6000806000806000608086880312156123da57600080fd5b6123e386612335565b94506123f160208701612335565b935060408601359250606086013567ffffffffffffffff81111561241457600080fd5b61242088828901612379565b969995985093965092949392505050565b60008060006040848603121561244657600080fd5b83359250602084013567ffffffffffffffff81111561246457600080fd5b61247086828701612379565b9497909650939450505050565b6000806000806040858703121561249357600080fd5b843567ffffffffffffffff808211156124ab57600080fd5b6124b788838901612379565b909650945060208701359150808211156124d057600080fd5b506124dd87828801612379565b95989497509550505050565b6000602082840312156124fb57600080fd5b5035919050565b60008083601f84011261251457600080fd5b50813567ffffffffffffffff81111561252c57600080fd5b6020830191508360208260051b85010111156123bb57600080fd5b6000806020838503121561255a57600080fd5b823567ffffffffffffffff81111561257157600080fd5b61257d85828601612502565b90969095509350505050565b6000806000806000606086880312156125a157600080fd5b853567ffffffffffffffff808211156125b957600080fd5b6125c589838a01612502565b90975095506020880135945060408801359150808211156125e557600080fd5b5061242088828901612379565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561263357600080fd5b813567ffffffffffffffff8082111561264b57600080fd5b818401915084601f83011261265f57600080fd5b813581811115612671576126716125f2565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156126b7576126b76125f2565b816040528281528760208487010111156126d057600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000806040838503121561270357600080fd5b823561270e816122ea565b915061271c60208401612335565b90509250929050565b60008060008060008060008060a0898b03121561274157600080fd5b61274a89612335565b975061275860208a01612335565b9650604089013567ffffffffffffffff8082111561277557600080fd5b6127818c838d01612502565b909850965060608b013591508082111561279a57600080fd5b6127a68c838d01612502565b909650945060808b01359150808211156127bf57600080fd5b506127cc8b828c01612379565b999c989b5096995094979396929594505050565b60008060008060008060a087890312156127f957600080fd5b61280287612335565b955061281060208801612335565b94506040870135935060608701359250608087013567ffffffffffffffff81111561283a57600080fd5b61284689828a01612379565b979a9699509497509295939492505050565b8035801515811461235957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b878110156129f357828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4188360301811261290a57600080fd5b870160c061291782612858565b15158652612926878301612858565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff612958828501612335565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe101811261299e57600080fd5b90920187810192903567ffffffffffffffff8111156129bc57600080fd5b8036038413156129cb57600080fd5b82828901526129dd8389018286612868565b9c89019c975050509286019250506001016128cb565b5091979650505050505050565b60408152600560408201527f73656c663a00000000000000000000000000000000000000000000000000000060608201526080602082015260006106ee6080830184866128b1565b838152604060208201526000612a626040830184866128b1565b95945050505050565b838152604060208201526000612a62604083018486612868565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112612ae857600080fd5b9190910192915050565b600060208284031215612b0457600080fd5b61067f82612858565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612b4257600080fd5b83018035915067ffffffffffffffff821115612b5d57600080fd5b6020019150368190038213156123bb57600080fd5b60008085851115612b8257600080fd5b83861115612b8f57600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105d6576105d6612b9c565b606081526000612bf2606083018688612868565b6020830194909452506040015292915050565b82815260006020604081840152835180604085015260005b81811015612c3957858101830151858201606001528201612c1d565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000612caf606083018486612868565b9695505050505050565b6020815260006106ee602083018486612868565b818103818111156105d6576105d6612b9c565b604081526000612cf4604083018587612868565b9050826020830152949350505050565b604081526000612d18604083018587612868565b905060ff83166020830152949350505050565b606081526000612d3f606083018688612868565b60208301949094525090151560409091015292915050565b600060208284031215612d6957600080fd5b815161067f816122ea56fea2646970667358221220d1c64e83cb54c2e1824f98a6e0664734329329620cf112737055416b4d68ea6a64736f6c63430008110033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/estimator/src/builds/index.ts b/packages/estimator/src/builds/index.ts new file mode 100644 index 000000000..630bef12c --- /dev/null +++ b/packages/estimator/src/builds/index.ts @@ -0,0 +1 @@ +export * from './MainModuleGasEstimation' diff --git a/packages/estimator/src/estimator.ts b/packages/estimator/src/estimator.ts new file mode 100644 index 000000000..0705cea53 --- /dev/null +++ b/packages/estimator/src/estimator.ts @@ -0,0 +1,15 @@ +import { ethers } from 'ethers' +import { commons, v2 } from '@0xsequence/core' + +export interface Estimator { + estimateGasLimits( + address: string, + config: v2.config.WalletConfig, + context: commons.context.WalletContext, + nonce: ethers.BigNumberish, + ...transactions: commons.transaction.Transaction[] + ): Promise<{ + transactions: commons.transaction.Transaction[] + total: ethers.BigNumber + }> +} diff --git a/packages/estimator/src/index.ts b/packages/estimator/src/index.ts new file mode 100644 index 000000000..690fbfbe0 --- /dev/null +++ b/packages/estimator/src/index.ts @@ -0,0 +1,3 @@ +export * from './overwriter-estimator' +export * from './overwriter-sequence-estimator' +export * from './estimator' diff --git a/packages/estimator/src/overwriter-estimator.ts b/packages/estimator/src/overwriter-estimator.ts new file mode 100644 index 000000000..e442ffe83 --- /dev/null +++ b/packages/estimator/src/overwriter-estimator.ts @@ -0,0 +1,137 @@ +import { ethers } from 'ethers' +import { getEthersConnectionInfo, isBigNumberish, Optionals } from '@0xsequence/utils' + +const GasEstimator = require('@0xsequence/wallet-contracts/artifacts/contracts/modules/utils/GasEstimator.sol/GasEstimator.json') + +function toQuantity(number: ethers.BigNumberish | string): string { + if (isBigNumberish(number)) { + return ethers.BigNumber.from(number).toHexString() + } + + return number +} + +function tryDecodeError(bytes: ethers.BytesLike): string { + try { + return ethers.utils.toUtf8String('0x' + ethers.utils.hexlify(bytes).substr(138)) + } catch (e) { + return 'UNKNOWN_ERROR' + } +} + +function toHexNumber(number: ethers.BigNumberish): string { + return ethers.BigNumber.from(number).toHexString() +} + +export type OverwriterEstimatorOptions = { + rpc: string | ethers.providers.JsonRpcProvider + dataZeroCost?: number + dataOneCost?: number + baseCost?: number +} + +export const OverwriterEstimatorDefaults: Required> = { + dataZeroCost: 4, + dataOneCost: 16, + baseCost: 21000 +} + +export class OverwriterEstimator { + public provider: ethers.providers.JsonRpcProvider + public options: Required + + constructor(options: OverwriterEstimatorOptions) { + this.provider = + typeof options.rpc === 'string' + ? new ethers.providers.StaticJsonRpcProvider(getEthersConnectionInfo(options.rpc)) + : options.rpc + this.options = { ...OverwriterEstimatorDefaults, ...options } + } + + txBaseCost(data: ethers.BytesLike): number { + const bytes = ethers.utils.arrayify(data) + return bytes + .reduce((p, c) => (c == 0 ? p.add(this.options.dataZeroCost) : p.add(this.options.dataOneCost)), ethers.constants.Zero) + .add(this.options.baseCost) + .toNumber() + } + + async estimate(args: { + to: string + from?: string + data?: ethers.BytesLike + gasPrice?: ethers.BigNumberish + gas?: ethers.BigNumberish + overwrites?: { + [address: string]: { + code?: string + balance?: ethers.BigNumberish + nonce?: ethers.BigNumberish + stateDiff?: { + key: string + value: string + }[] + state?: { + key: string + value: string + }[] + } + } + blockTag?: string | ethers.BigNumberish + }): Promise { + const blockTag = args.blockTag ? toQuantity(args.blockTag) : 'latest' + const data = args.data ? args.data : [] + const from = args.from ? ethers.utils.getAddress(args.from) : ethers.Wallet.createRandom().address + + const gasEstimatorInterface = new ethers.utils.Interface(GasEstimator.abi) + const encodedEstimate = gasEstimatorInterface.encodeFunctionData('estimate', [args.to, data]) + + const providedOverwrites = args.overwrites + ? Object.keys(args.overwrites).reduce((p, a) => { + const address = ethers.utils.getAddress(a) + const o = args.overwrites![a] + + if (address === from) { + throw Error("Can't overwrite from address values") + } + + return { + ...p, + [address]: { + code: o.code ? ethers.utils.hexlify(o.code) : undefined, + nonce: o.nonce ? toHexNumber(o.nonce) : undefined, + balance: o.balance ? toHexNumber(o.balance) : undefined, + state: o.state ? o.state : undefined, + stateDiff: o.stateDiff ? o.stateDiff : undefined + } + } + }, {}) + : {} + + const overwrites = { + ...providedOverwrites, + [from]: { + code: GasEstimator.deployedBytecode + } + } + + const response = await this.provider.send('eth_call', [ + { + to: from, + data: encodedEstimate, + gasPrice: args.gasPrice, + gas: args.gas + }, + blockTag, + overwrites + ]) + + const decoded = gasEstimatorInterface.decodeFunctionResult('estimate', response) + + if (!decoded.success) { + throw Error(`Failed gas estimation with ${tryDecodeError(decoded.result)}`) + } + + return ethers.BigNumber.from(decoded.gas).add(this.txBaseCost(data)) + } +} diff --git a/packages/estimator/src/overwriter-sequence-estimator.ts b/packages/estimator/src/overwriter-sequence-estimator.ts new file mode 100644 index 000000000..7404de191 --- /dev/null +++ b/packages/estimator/src/overwriter-sequence-estimator.ts @@ -0,0 +1,139 @@ +import { OverwriterEstimator } from './overwriter-estimator' +import { walletContracts } from '@0xsequence/abi' +import { ethers, utils } from 'ethers' +import { Estimator } from './estimator' +import { commons, v2 } from '@0xsequence/core' +import { mainModuleGasEstimation } from './builds' + +export class OverwriterSequenceEstimator implements Estimator { + constructor(public estimator: OverwriterEstimator) {} + + async estimateGasLimits( + address: string, + config: v2.config.WalletConfig, + context: commons.context.WalletContext, + nonce: ethers.BigNumberish, + ...transactions: commons.transaction.Transaction[] + ): Promise<{ transactions: commons.transaction.Transaction[]; total: ethers.BigNumber }> { + const walletInterface = new utils.Interface(walletContracts.mainModule.abi) + + const allSigners = await Promise.all( + v2.config.signersOf(config.tree).map(async (s, i) => ({ + index: i, + address: s.address, + weight: ethers.BigNumber.from(s.weight), + isEOA: await this.estimator.provider.getCode(s.address).then(c => ethers.utils.arrayify(c).length === 0) + })) + ) + + let totalWeight = 0 + + // Pick NOT EOA signers until we reach the threshold + // if we can't reach the threshold, then we'll use the lowest weight EOA signers + // TODO: if EOAs have the same weight, then we should pick the ones further apart from each other (in the tree) + const designatedSigners = allSigners + .sort((a, b) => { + if (a.isEOA && !b.isEOA) return 1 + if (!a.isEOA && b.isEOA) return -1 + if (a.weight.eq(b.weight)) return a.index - b.index + return a.weight.sub(b.weight).toNumber() + }) + .filter(s => { + if (totalWeight >= (config.threshold as number)) { + return false + } else { + totalWeight += s.weight.toNumber() + return true + } + }) + + // Generate a fake signature, meant to resemble the final signature of the transaction + // this "fake" signature is provided to compute a more accurate gas estimation + const fakeSignatures = new Map() + for (const s of designatedSigners) { + if (s.isEOA) { + fakeSignatures.set(s.address, { + signature: (await ethers.Wallet.createRandom().signMessage('')) + '02', + isDynamic: false + }) + } else { + // Assume a 2/3 nested contract signature + const signer1 = ethers.Wallet.createRandom() + const signer2 = ethers.Wallet.createRandom() + const signer3 = ethers.Wallet.createRandom() + + const nestedSignature = v2.signature.encodeSigners( + v2.config.ConfigCoder.fromSimple({ + threshold: 2, + checkpoint: 0, + signers: [ + { + address: signer1.address, + weight: 1 + }, + { + address: signer2.address, + weight: 1 + }, + { + address: signer3.address, + weight: 1 + } + ] + }), + new Map([ + [signer1.address, { signature: (await signer1.signMessage('')) + '02', isDynamic: false }], + [signer2.address, { signature: (await signer2.signMessage('')) + '02', isDynamic: false }] + ]), + [], + 0 + ) + + fakeSignatures.set(s.address, { + signature: nestedSignature.encoded + '03', + isDynamic: true + }) + } + } + + const stubSignature = v2.signature.encodeSigners(config, fakeSignatures, [], 0).encoded + + // Use the provided nonce + // TODO: Maybe ignore if this fails on the MainModuleGasEstimation + // it could help reduce the edge cases for when the gas estimation fails + const encoded = commons.transaction.sequenceTxAbiEncode(transactions) + + const sequenceOverwrites = { + [context.mainModule]: { + code: mainModuleGasEstimation.deployedBytecode + }, + [context.mainModuleUpgradable]: { + code: mainModuleGasEstimation.deployedBytecode + } + } + + const estimates = await Promise.all([ + ...encoded.map(async (_, i) => { + return this.estimator.estimate({ + to: address, + data: walletInterface.encodeFunctionData(walletInterface.getFunction('execute'), [ + encoded.slice(0, i), + nonce, + stubSignature + ]), + overwrites: sequenceOverwrites + }) + }), + this.estimator.estimate({ + to: address, // Compute full gas estimation with all transaction + data: walletInterface.encodeFunctionData(walletInterface.getFunction('execute'), [encoded, nonce, stubSignature]), + overwrites: sequenceOverwrites + }) + ]) + + return { + transactions: transactions.map((t, i) => ({ ...t, gasLimit: estimates[i + 1].sub(estimates[i]) })), + total: estimates[estimates.length - 1] + } + } +} diff --git a/packages/estimator/tests/estimator.spec.ts b/packages/estimator/tests/estimator.spec.ts new file mode 100644 index 000000000..f9095991d --- /dev/null +++ b/packages/estimator/tests/estimator.spec.ts @@ -0,0 +1,44 @@ +import { ethers } from 'ethers' + +import { CallReceiverMock } from '@0xsequence/wallet-contracts' +import { OverwriterEstimator } from '@0xsequence/estimator' +import { encodeData } from '@0xsequence/wallet/tests/utils' +import { expect } from 'chai' + +const CallReceiverMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/CallReceiverMock.sol/CallReceiverMock.json') + +describe('estimator', function () { + let url: string + let provider: ethers.providers.JsonRpcProvider + let callReceiver: CallReceiverMock + + let estimator: OverwriterEstimator + + before(async () => { + url = 'http://127.0.0.1:10045/' + provider = new ethers.providers.JsonRpcProvider(url) + + callReceiver = (await new ethers.ContractFactory( + CallReceiverMockArtifact.abi, + CallReceiverMockArtifact.bytecode, + provider.getSigner() + ).deploy()) as unknown as CallReceiverMock + + estimator = new OverwriterEstimator({ rpc: url }) + }) + + beforeEach(async () => { + await callReceiver.setRevertFlag(false) + await callReceiver.testCall(0, []) + }) + + it('should estimate the gas of a single call', async () => { + const gas = await estimator.estimate({ + to: callReceiver.address, + data: await encodeData(callReceiver, 'testCall', 1, '0x112233') + }) + const tx = await (await callReceiver.testCall(1, '0x112233')).wait() + expect(gas.toNumber()).to.be.above(tx.gasUsed.toNumber()) + expect(gas.toNumber()).to.be.approximately(tx.gasUsed.toNumber(), 5000) + }) +}) diff --git a/packages/estimator/tests/sequence-estimator.spec.ts b/packages/estimator/tests/sequence-estimator.spec.ts new file mode 100644 index 000000000..5d447d44c --- /dev/null +++ b/packages/estimator/tests/sequence-estimator.spec.ts @@ -0,0 +1,319 @@ +import { CallReceiverMock, HookCallerMock } from '@0xsequence/wallet-contracts' + +import { LocalRelayer } from '@0xsequence/relayer' +import { ethers } from 'ethers' + +import { configureLogger } from '@0xsequence/utils' +import { commons, v2 } from '@0xsequence/core' + +import chaiAsPromised from 'chai-as-promised' +import * as chai from 'chai' + +import { SequenceOrchestratorWrapper, Wallet, WalletV2 } from '@0xsequence/wallet' +import { OverwriterSequenceEstimator } from '../src' +import { OverwriterEstimator } from '../dist/0xsequence-estimator.cjs' +import { encodeData } from '@0xsequence/wallet/tests/utils' +import { context } from '@0xsequence/tests' +import { Orchestrator } from '@0xsequence/signhub' + +const CallReceiverMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/CallReceiverMock.sol/CallReceiverMock.json') +const HookCallerMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/HookCallerMock.sol/HookCallerMock.json') + +const { expect } = chai.use(chaiAsPromised) + +configureLogger({ logLevel: 'DEBUG', silence: false }) + +describe('Wallet integration', function () { + let relayer: LocalRelayer + let callReceiver: CallReceiverMock + let hookCaller: HookCallerMock + + let contexts: Awaited> + let provider: ethers.providers.JsonRpcProvider + let signers: ethers.Signer[] + + let estimator: OverwriterSequenceEstimator + + before(async () => { + const url = 'http://127.0.0.1:10045/' + provider = new ethers.providers.JsonRpcProvider(url) + + signers = new Array(8).fill(0).map((_, i) => provider.getSigner(i)) + + contexts = await context.deploySequenceContexts(signers[0]) + relayer = new LocalRelayer(signers[0]) + + // Deploy call receiver mock + callReceiver = (await new ethers.ContractFactory( + CallReceiverMockArtifact.abi, + CallReceiverMockArtifact.bytecode, + signers[0] + ).deploy({ gasLimit: 1000000 })) as CallReceiverMock + + // Deploy hook caller mock + hookCaller = (await new ethers.ContractFactory( + HookCallerMockArtifact.abi, + HookCallerMockArtifact.bytecode, + signers[0] + ).deploy({ gasLimit: 1000000 })) as HookCallerMock + + // Deploy local relayer + relayer = new LocalRelayer({ signer: signers[0] }) + + // Create gas estimator + estimator = new OverwriterSequenceEstimator(new OverwriterEstimator({ rpc: provider })) + }) + + beforeEach(async () => { + await callReceiver.setRevertFlag(false) + await callReceiver.testCall(0, []) + }) + + describe('estimate gas of transactions', () => { + const options = [ + { + name: 'single signer wallet', + getWallet: async () => { + // const pk = ethers.utils.randomBytes(32) + // const wallet = await Wallet.singleOwner(pk, context) + // return wallet.connect(ethnode.provider, relayer) + const signer = ethers.Wallet.createRandom() + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ weight: 1, address: signer.address }] + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator([signer]), + chainId: provider.network.chainId + }) + } + }, + { + name: 'multiple signers wallet', + getWallet: async () => { + const signers = new Array(4).fill(0).map(() => ethers.Wallet.createRandom()) + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 3, + checkpoint: 100, + signers: signers.map(s => ({ weight: 1, address: s.address })) + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator([signers[0], signers[1], signers[2]]), + chainId: provider.network.chainId + }) + } + }, + // TODO: This test fails because the gas estimation uses signers that are packed together + // in the tree, we need to modify the estimator so it picks a sparse set of signers + // { + // name: 'many multiple signers wallet', + // getWallet: async () => { + // const signers = new Array(111).fill(0).map(() => ethers.Wallet.createRandom()) + + // const config = v2.config.ConfigCoder.fromSimple({ + // threshold: 11, + // checkpoint: 100, + // signers: signers.map(s => ({ weight: 1, address: s.address })) + // }) + + // console.log(JSON.stringify(config, null, 2)) + + // return Wallet.newWallet({ + // context: contexts[2], + // coders: v2.coders, + // config, + // provider, + // relayer, + // orchestrator: new Orchestrator(signers.slice(0, 12)), + // chainId: provider.network.chainId + // }) + // } + // }, + { + name: 'nested wallet', + getWallet: async () => { + const EOAsigners = new Array(3).fill(0).map(() => ethers.Wallet.createRandom()) + + const nestedSigners = new Array(3).fill(0).map(() => ethers.Wallet.createRandom()) + const nestedConfig = v2.config.ConfigCoder.fromSimple({ + threshold: 2, + checkpoint: 0, + signers: nestedSigners.map(s => ({ weight: 1, address: s.address })) + }) + + const nestedWallet = Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config: nestedConfig, + provider, + relayer, + orchestrator: new Orchestrator([nestedSigners[0], nestedSigners[1]]), + chainId: provider.network.chainId + }) + + await nestedWallet.deploy() + + const signers = [nestedWallet, ...EOAsigners] + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 3, + checkpoint: 0, + signers: signers.map(s => ({ weight: 1, address: s.address })) + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator([new SequenceOrchestratorWrapper(nestedWallet), EOAsigners[0], EOAsigners[1]]), + chainId: provider.network.chainId + }) + } + }, + { + name: 'asymetrical signers wallet', + getWallet: async () => { + const signersA = new Array(5).fill(0).map(() => ethers.Wallet.createRandom()) + const signersB = new Array(6).fill(0).map(() => ethers.Wallet.createRandom()) + + const signers = [...signersA, ...signersB] + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 5, + checkpoint: 0, + signers: signers.map((s, i) => ({ weight: i <= signersA.length ? 1 : 10, address: s.address })) + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator(signersA), + chainId: provider.network.chainId + }) + } + } + ] + + options.map(o => { + describe(`with ${o.name}`, () => { + let wallet: WalletV2 + + beforeEach(async () => { + wallet = await o.getWallet() + }) + + describe('with deployed wallet', () => { + let txs: commons.transaction.Transaction[] + + beforeEach(async () => { + await callReceiver.testCall(0, []) + await wallet.deploy() + }) + + describe('a single transaction', () => { + beforeEach(async () => { + txs = [ + { + delegateCall: false, + revertOnError: false, + gasLimit: 0, + to: callReceiver.address, + value: ethers.constants.Zero, + data: await encodeData(callReceiver, 'testCall', 14442, '0x112233') + } + ] + }) + + it('should use estimated gas for a single transaction', async () => { + const estimation = await estimator.estimateGasLimits(wallet.address, wallet.config, wallet.context, 0, ...txs) + const realTx = await (await wallet.sendTransaction(estimation.transactions)).wait(1) + + expect(realTx.gasUsed.toNumber()).to.be.approximately(estimation.total.toNumber(), 10000) + expect(realTx.gasUsed.toNumber()).to.be.below(estimation.total.toNumber()) + + expect((await callReceiver.lastValA()).toNumber()).to.equal(14442) + }) + + it('should predict gas usage for a single transaction', async () => { + const estimation = await estimator.estimateGasLimits(wallet.address, wallet.config, wallet.context, 0, ...txs) + const realTx = await (await wallet.sendTransaction(txs)).wait(1) + + expect(realTx.gasUsed.toNumber()).to.be.approximately(estimation.total.toNumber(), 10000) + expect(realTx.gasUsed.toNumber()).to.be.below(estimation.total.toNumber()) + + expect((await callReceiver.lastValA()).toNumber()).to.equal(14442) + }) + + it('should use estimated gas for a single failing transaction', async () => { + await callReceiver.setRevertFlag(true) + const estimation = await estimator.estimateGasLimits(wallet.address, wallet.config, wallet.context, 0, ...txs) + const realTx = await (await wallet.sendTransaction(estimation.transactions)).wait(1) + + expect(realTx.gasUsed.toNumber()).to.be.approximately(estimation.total.toNumber(), 10000) + expect(realTx.gasUsed.toNumber()).to.be.below(estimation.total.toNumber()) + + expect((await callReceiver.lastValA()).toNumber()).to.equal(0) + }) + }) + + describe('a batch of transactions', () => { + let valB: Uint8Array + + beforeEach(async () => { + await callReceiver.setRevertFlag(true) + valB = ethers.utils.randomBytes(99) + + txs = [ + { + delegateCall: false, + revertOnError: false, + gasLimit: 0, + to: callReceiver.address, + value: ethers.constants.Zero, + data: await encodeData(callReceiver, 'setRevertFlag', false) + }, + { + delegateCall: false, + revertOnError: true, + gasLimit: 0, + to: callReceiver.address, + value: ethers.constants.Zero, + data: await encodeData(callReceiver, 'testCall', 2, valB) + } + ] + }) + + it('should use estimated gas for a batch of transactions', async () => { + const estimation = await estimator.estimateGasLimits(wallet.address, wallet.config, wallet.context, 0, ...txs) + const realTx = await (await wallet.sendTransaction(estimation.transactions)).wait(1) + + expect(realTx.gasUsed.toNumber()).to.be.approximately(estimation.total.toNumber(), 30000) + expect(realTx.gasUsed.toNumber()).to.be.below(estimation.total.toNumber()) + + expect(ethers.utils.hexlify(await callReceiver.lastValB())).to.equal(ethers.utils.hexlify(valB)) + }) + }) + }) + }) + }) + }) +}) diff --git a/packages/guard/CHANGELOG.md b/packages/guard/CHANGELOG.md new file mode 100644 index 000000000..7f3a52142 --- /dev/null +++ b/packages/guard/CHANGELOG.md @@ -0,0 +1,2159 @@ +# @0xsequence/guard + +## 1.10.8 + +### Patch Changes + +- update metadata bindings +- Updated dependencies + - @0xsequence/account@1.10.8 + - @0xsequence/core@1.10.8 + - @0xsequence/signhub@1.10.8 + - @0xsequence/utils@1.10.8 + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client +- Updated dependencies + - @0xsequence/account@1.10.7 + - @0xsequence/core@1.10.7 + - @0xsequence/signhub@1.10.7 + - @0xsequence/utils@1.10.7 + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/account@1.10.6 + - @0xsequence/core@1.10.6 + - @0xsequence/signhub@1.10.6 + - @0xsequence/utils@1.10.6 + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet +- Updated dependencies + - @0xsequence/account@1.10.5 + - @0xsequence/core@1.10.5 + - @0xsequence/signhub@1.10.5 + - @0xsequence/utils@1.10.5 + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia +- Updated dependencies + - @0xsequence/account@1.10.4 + - @0xsequence/core@1.10.4 + - @0xsequence/signhub@1.10.4 + - @0xsequence/utils@1.10.4 + +## 1.10.3 + +### Patch Changes + +- typing fix +- Updated dependencies + - @0xsequence/account@1.10.3 + - @0xsequence/core@1.10.3 + - @0xsequence/signhub@1.10.3 + - @0xsequence/utils@1.10.3 + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client +- Updated dependencies + - @0xsequence/account@1.10.2 + - @0xsequence/core@1.10.2 + - @0xsequence/signhub@1.10.2 + - @0xsequence/utils@1.10.2 + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/account@1.10.1 + - @0xsequence/core@1.10.1 + - @0xsequence/signhub@1.10.1 + - @0xsequence/utils@1.10.1 + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +### Patch Changes + +- Updated dependencies + - @0xsequence/account@1.10.0 + - @0xsequence/core@1.10.0 + - @0xsequence/signhub@1.10.0 + - @0xsequence/utils@1.10.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants +- Updated dependencies + - @0xsequence/account@1.9.37 + - @0xsequence/core@1.9.37 + - @0xsequence/signhub@1.9.37 + - @0xsequence/utils@1.9.37 + +## 1.9.36 + +### Patch Changes + +- guard: export client +- Updated dependencies + - @0xsequence/account@1.9.36 + - @0xsequence/core@1.9.36 + - @0xsequence/signhub@1.9.36 + - @0xsequence/utils@1.9.36 + +## 1.9.35 + +### Patch Changes + +- guard: update bindings +- Updated dependencies + - @0xsequence/account@1.9.35 + - @0xsequence/core@1.9.35 + - @0xsequence/signhub@1.9.35 + - @0xsequence/utils@1.9.35 + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email +- Updated dependencies + - @0xsequence/account@1.9.34 + - @0xsequence/core@1.9.34 + - @0xsequence/signhub@1.9.34 + - @0xsequence/utils@1.9.34 + +## 1.9.33 + +### Patch Changes + +- waas: umd build +- Updated dependencies + - @0xsequence/account@1.9.33 + - @0xsequence/core@1.9.33 + - @0xsequence/signhub@1.9.33 + - @0xsequence/utils@1.9.33 + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings +- Updated dependencies + - @0xsequence/account@1.9.32 + - @0xsequence/core@1.9.32 + - @0xsequence/signhub@1.9.32 + - @0xsequence/utils@1.9.32 + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes +- Updated dependencies + - @0xsequence/account@1.9.31 + - @0xsequence/core@1.9.31 + - @0xsequence/signhub@1.9.31 + - @0xsequence/utils@1.9.31 + +## 1.9.30 + +### Patch Changes + +- update +- Updated dependencies + - @0xsequence/account@1.9.30 + - @0xsequence/core@1.9.30 + - @0xsequence/signhub@1.9.30 + - @0xsequence/utils@1.9.30 + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain +- Updated dependencies + - @0xsequence/account@1.9.29 + - @0xsequence/core@1.9.29 + - @0xsequence/signhub@1.9.29 + - @0xsequence/utils@1.9.29 + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree +- Updated dependencies + - @0xsequence/account@1.9.28 + - @0xsequence/core@1.9.28 + - @0xsequence/signhub@1.9.28 + - @0xsequence/utils@1.9.28 + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.9.27 + - @0xsequence/core@1.9.27 + - @0xsequence/signhub@1.9.27 + - @0xsequence/utils@1.9.27 + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 +- Updated dependencies + - @0xsequence/account@1.9.26 + - @0xsequence/core@1.9.26 + - @0xsequence/signhub@1.9.26 + - @0xsequence/utils@1.9.26 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types +- Updated dependencies + - @0xsequence/account@1.9.25 + - @0xsequence/core@1.9.25 + - @0xsequence/signhub@1.9.25 + - @0xsequence/utils@1.9.25 + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore +- Updated dependencies + - @0xsequence/account@1.9.24 + - @0xsequence/core@1.9.24 + - @0xsequence/signhub@1.9.24 + - @0xsequence/utils@1.9.24 + +## 1.9.23 + +### Patch Changes + +- update api client bindings +- Updated dependencies + - @0xsequence/account@1.9.23 + - @0xsequence/core@1.9.23 + - @0xsequence/signhub@1.9.23 + - @0xsequence/utils@1.9.23 + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings +- Updated dependencies + - @0xsequence/account@1.9.22 + - @0xsequence/core@1.9.22 + - @0xsequence/signhub@1.9.22 + - @0xsequence/utils@1.9.22 + +## 1.9.21 + +### Patch Changes + +- api client bindings +- Updated dependencies + - @0xsequence/account@1.9.21 + - @0xsequence/core@1.9.21 + - @0xsequence/signhub@1.9.21 + - @0xsequence/utils@1.9.21 + +## 1.9.20 + +### Patch Changes + +- api client bindings update +- Updated dependencies + - @0xsequence/account@1.9.20 + - @0xsequence/core@1.9.20 + - @0xsequence/signhub@1.9.20 + - @0xsequence/utils@1.9.20 + +## 1.9.19 + +### Patch Changes + +- waas update +- Updated dependencies + - @0xsequence/account@1.9.19 + - @0xsequence/core@1.9.19 + - @0xsequence/signhub@1.9.19 + - @0xsequence/utils@1.9.19 + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions +- Updated dependencies + - @0xsequence/account@1.9.18 + - @0xsequence/core@1.9.18 + - @0xsequence/signhub@1.9.18 + - @0xsequence/utils@1.9.18 + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia +- Updated dependencies + - @0xsequence/account@1.9.17 + - @0xsequence/core@1.9.17 + - @0xsequence/signhub@1.9.17 + - @0xsequence/utils@1.9.17 + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions +- Updated dependencies + - @0xsequence/account@1.9.16 + - @0xsequence/core@1.9.16 + - @0xsequence/signhub@1.9.16 + - @0xsequence/utils@1.9.16 + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix +- Updated dependencies + - @0xsequence/account@1.9.15 + - @0xsequence/core@1.9.15 + - @0xsequence/signhub@1.9.15 + - @0xsequence/utils@1.9.15 + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.9.14 + - @0xsequence/core@1.9.14 + - @0xsequence/signhub@1.9.14 + - @0xsequence/utils@1.9.14 + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency +- Updated dependencies + - @0xsequence/account@1.9.13 + - @0xsequence/core@1.9.13 + - @0xsequence/signhub@1.9.13 + - @0xsequence/utils@1.9.13 + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.9.12 + - @0xsequence/core@1.9.12 + - @0xsequence/signhub@1.9.12 + - @0xsequence/utils@1.9.12 + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings +- Updated dependencies + - @0xsequence/account@1.9.11 + - @0xsequence/core@1.9.11 + - @0xsequence/signhub@1.9.11 + - @0xsequence/utils@1.9.11 + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings +- Updated dependencies + - @0xsequence/account@1.9.10 + - @0xsequence/core@1.9.10 + - @0xsequence/signhub@1.9.10 + - @0xsequence/utils@1.9.10 + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client +- Updated dependencies + - @0xsequence/account@1.9.9 + - @0xsequence/core@1.9.9 + - @0xsequence/signhub@1.9.9 + - @0xsequence/utils@1.9.9 + +## 1.9.8 + +### Patch Changes + +- waas client update +- Updated dependencies + - @0xsequence/account@1.9.8 + - @0xsequence/core@1.9.8 + - @0xsequence/signhub@1.9.8 + - @0xsequence/utils@1.9.8 + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer +- Updated dependencies + - @0xsequence/account@1.9.7 + - @0xsequence/core@1.9.7 + - @0xsequence/signhub@1.9.7 + - @0xsequence/utils@1.9.7 + +## 1.9.6 + +### Patch Changes + +- waas package update +- Updated dependencies + - @0xsequence/account@1.9.6 + - @0xsequence/core@1.9.6 + - @0xsequence/signhub@1.9.6 + - @0xsequence/utils@1.9.6 + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key +- Updated dependencies + - @0xsequence/account@1.9.5 + - @0xsequence/core@1.9.5 + - @0xsequence/signhub@1.9.5 + - @0xsequence/utils@1.9.5 + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency +- Updated dependencies + - @0xsequence/account@1.9.4 + - @0xsequence/core@1.9.4 + - @0xsequence/signhub@1.9.4 + - @0xsequence/utils@1.9.4 + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it +- Updated dependencies + - @0xsequence/account@1.9.3 + - @0xsequence/core@1.9.3 + - @0xsequence/signhub@1.9.3 + - @0xsequence/utils@1.9.3 + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia +- Updated dependencies + - @0xsequence/account@1.9.2 + - @0xsequence/core@1.9.2 + - @0xsequence/signhub@1.9.2 + - @0xsequence/utils@1.9.2 + +## 1.9.1 + +### Patch Changes + +- analytics fix +- Updated dependencies + - @0xsequence/account@1.9.1 + - @0xsequence/core@1.9.1 + - @0xsequence/signhub@1.9.1 + - @0xsequence/utils@1.9.1 + +## 1.9.0 + +### Minor Changes + +- waas release + +### Patch Changes + +- Updated dependencies + - @0xsequence/account@1.9.0 + - @0xsequence/core@1.9.0 + - @0xsequence/signhub@1.9.0 + - @0xsequence/utils@1.9.0 + +## 1.8.8 + +### Patch Changes + +- update metadata bindings +- Updated dependencies + - @0xsequence/account@1.8.8 + - @0xsequence/core@1.8.8 + - @0xsequence/signhub@1.8.8 + - @0xsequence/utils@1.8.8 + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 +- Updated dependencies + - @0xsequence/account@1.8.7 + - @0xsequence/core@1.8.7 + - @0xsequence/signhub@1.8.7 + - @0xsequence/utils@1.8.7 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof +- Updated dependencies + - @0xsequence/account@1.8.6 + - @0xsequence/core@1.8.6 + - @0xsequence/signhub@1.8.6 + - @0xsequence/utils@1.8.6 + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof +- Updated dependencies + - @0xsequence/account@1.8.5 + - @0xsequence/core@1.8.5 + - @0xsequence/signhub@1.8.5 + - @0xsequence/utils@1.8.5 + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list +- Updated dependencies + - @0xsequence/account@1.8.4 + - @0xsequence/core@1.8.4 + - @0xsequence/signhub@1.8.4 + - @0xsequence/utils@1.8.4 + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support +- Updated dependencies + - @0xsequence/account@1.8.3 + - @0xsequence/core@1.8.3 + - @0xsequence/signhub@1.8.3 + - @0xsequence/utils@1.8.3 + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested +- Updated dependencies + - @0xsequence/account@1.8.2 + - @0xsequence/core@1.8.2 + - @0xsequence/signhub@1.8.2 + - @0xsequence/utils@1.8.2 + +## 1.8.1 + +### Patch Changes + +- update to analytics provider +- Updated dependencies + - @0xsequence/account@1.8.1 + - @0xsequence/core@1.8.1 + - @0xsequence/signhub@1.8.1 + - @0xsequence/utils@1.8.1 + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +### Patch Changes + +- Updated dependencies + - @0xsequence/account@1.8.0 + - @0xsequence/core@1.8.0 + - @0xsequence/signhub@1.8.0 + - @0xsequence/utils@1.8.0 + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.7.2 + - @0xsequence/core@1.7.2 + - @0xsequence/signhub@1.7.2 + - @0xsequence/utils@1.7.2 + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI +- Updated dependencies + - @0xsequence/account@1.7.1 + - @0xsequence/core@1.7.1 + - @0xsequence/signhub@1.7.1 + - @0xsequence/utils@1.7.1 + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.7.0 + - @0xsequence/core@1.7.0 + - @0xsequence/signhub@1.7.0 + - @0xsequence/utils@1.7.0 + +## 1.6.3 + +### Patch Changes + +- network list update +- Updated dependencies + - @0xsequence/account@1.6.3 + - @0xsequence/core@1.6.3 + - @0xsequence/signhub@1.6.3 + - @0xsequence/utils@1.6.3 + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.6.2 + - @0xsequence/core@1.6.2 + - @0xsequence/signhub@1.6.2 + - @0xsequence/utils@1.6.2 + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.6.1 + - @0xsequence/core@1.6.1 + - @0xsequence/signhub@1.6.1 + - @0xsequence/utils@1.6.1 + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.6.0 + - @0xsequence/core@1.6.0 + - @0xsequence/signhub@1.6.0 + - @0xsequence/utils@1.6.0 + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.5.0 + - @0xsequence/core@1.5.0 + - @0xsequence/signhub@1.5.0 + - @0xsequence/utils@1.5.0 + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata +- Updated dependencies + - @0xsequence/account@1.4.9 + - @0xsequence/core@1.4.9 + - @0xsequence/signhub@1.4.9 + - @0xsequence/utils@1.4.9 + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners +- Updated dependencies + - @0xsequence/account@1.4.8 + - @0xsequence/core@1.4.8 + - @0xsequence/signhub@1.4.8 + - @0xsequence/utils@1.4.8 + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings +- Updated dependencies + - @0xsequence/account@1.4.7 + - @0xsequence/core@1.4.7 + - @0xsequence/signhub@1.4.7 + - @0xsequence/utils@1.4.7 + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings +- Updated dependencies + - @0xsequence/account@1.4.6 + - @0xsequence/core@1.4.6 + - @0xsequence/signhub@1.4.6 + - @0xsequence/utils@1.4.6 + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.4.5 + - @0xsequence/core@1.4.5 + - @0xsequence/signhub@1.4.5 + - @0xsequence/utils@1.4.5 + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.4.4 + - @0xsequence/core@1.4.4 + - @0xsequence/signhub@1.4.4 + - @0xsequence/utils@1.4.4 + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods +- Updated dependencies + - @0xsequence/account@1.4.3 + - @0xsequence/core@1.4.3 + - @0xsequence/signhub@1.4.3 + - @0xsequence/utils@1.4.3 + +## 1.4.2 + +### Patch Changes + +- guard: update bindings +- Updated dependencies + - @0xsequence/account@1.4.2 + - @0xsequence/core@1.4.2 + - @0xsequence/signhub@1.4.2 + - @0xsequence/utils@1.4.2 + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/account@1.4.1 + - @0xsequence/core@1.4.1 + - @0xsequence/signhub@1.4.1 + - @0xsequence/utils@1.4.1 + +## 1.4.0 + +### Minor Changes + +- project access key support + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.4.0 + - @0xsequence/signhub@1.4.0 + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.3.0 + - @0xsequence/signhub@1.3.0 + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.2.9 + - @0xsequence/signhub@1.2.9 + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key +- Updated dependencies + - @0xsequence/core@1.2.8 + - @0xsequence/signhub@1.2.8 + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients +- Updated dependencies + - @0xsequence/core@1.2.7 + - @0xsequence/signhub@1.2.7 + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider +- Updated dependencies + - @0xsequence/core@1.2.6 + - @0xsequence/signhub@1.2.6 + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes +- Updated dependencies + - @0xsequence/core@1.2.5 + - @0xsequence/signhub@1.2.5 + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.2.4 + - @0xsequence/signhub@1.2.4 + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce +- Updated dependencies + - @0xsequence/core@1.2.3 + - @0xsequence/signhub@1.2.3 + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.2.2 + - @0xsequence/signhub@1.2.2 + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available +- Updated dependencies + - @0xsequence/core@1.2.1 + - @0xsequence/signhub@1.2.1 + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.2.0 + - @0xsequence/signhub@1.2.0 + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering +- Updated dependencies + - @0xsequence/core@1.1.15 + - @0xsequence/signhub@1.1.15 + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError +- Updated dependencies + - @0xsequence/core@1.1.14 + - @0xsequence/signhub@1.1.14 + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.1.13 + - @0xsequence/signhub@1.1.13 + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions +- Updated dependencies + - @0xsequence/core@1.1.12 + - @0xsequence/signhub@1.1.12 + +## 1.1.11 + +### Patch Changes + +- add homeverse configs +- Updated dependencies + - @0xsequence/core@1.1.11 + - @0xsequence/signhub@1.1.11 + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send +- Updated dependencies + - @0xsequence/core@1.1.10 + - @0xsequence/signhub@1.1.10 + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client +- Updated dependencies + - @0xsequence/core@1.1.9 + - @0xsequence/signhub@1.1.9 + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter +- Updated dependencies + - @0xsequence/core@1.1.8 + - @0xsequence/signhub@1.1.8 + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow +- Updated dependencies + - @0xsequence/core@1.1.7 + - @0xsequence/signhub@1.1.7 + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters +- Updated dependencies + - @0xsequence/core@1.1.6 + - @0xsequence/signhub@1.1.6 + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions +- Updated dependencies + - @0xsequence/core@1.1.5 + - @0xsequence/signhub@1.1.5 + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.1.4 + - @0xsequence/signhub@1.1.4 + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.1.3 + - @0xsequence/signhub@1.1.3 + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes +- Updated dependencies + - @0xsequence/core@1.1.2 + - @0xsequence/signhub@1.1.2 + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.1.1 + - @0xsequence/signhub@1.1.1 + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.1.0 + - @0xsequence/signhub@1.1.0 + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.0.5 + - @0xsequence/signhub@1.0.5 + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId +- Updated dependencies + - @0xsequence/core@1.0.4 + - @0xsequence/signhub@1.0.4 + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers +- Updated dependencies + - @0xsequence/core@1.0.3 + - @0xsequence/signhub@1.0.3 + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods +- Updated dependencies + - @0xsequence/core@1.0.2 + - @0xsequence/signhub@1.0.2 + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet +- Updated dependencies + - @0xsequence/core@1.0.1 + - @0xsequence/signhub@1.0.1 + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.0.0 + - @0xsequence/signhub@1.0.0 + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object + +## 0.43.28 + +### Patch Changes + +- update api bindings + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM + +## 0.43.22 + +### Patch Changes + +- add zkevm chain + +## 0.43.21 + +### Patch Changes + +- api: update client bindings + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings + +## 0.43.19 + +### Patch Changes + +- session proof update + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods + +## 0.43.14 + +### Patch Changes + +- bump + +## 0.43.13 + +### Patch Changes + +- update rpc bindings + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter + +## 0.43.10 + +### Patch Changes + +- various improvements + +## 0.43.9 + +### Patch Changes + +- update deps + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings + +## 0.42.6 + +### Patch Changes + +- api bindings update + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options + +## 0.42.3 + +### Patch Changes + +- update api bindings + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' + +## 0.41.3 + +### Patch Changes + +- api bindings update + +## 0.41.2 + +### Patch Changes + +- api bindings update + +## 0.41.1 + +### Patch Changes + +- update default networks + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain + +## 0.40.5 + +### Patch Changes + +- api: update bindings + +## 0.40.4 + +### Patch Changes + +- add unreal transport + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option + +## 0.39.4 + +### Patch Changes + +- api: update client bindings + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider + +## 0.39.2 + +### Patch Changes + +- update umd name + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) + +## 0.36.7 + +### Patch Changes + +- fix missing break + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation + +## 0.35.10 + +### Patch Changes + +- upgrade deps + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +## 0.29.8 + +### Patch Changes + +- update api + +## 0.28.0 + +### Minor Changes + +- extension provider + +## 0.27.0 + +### Minor Changes + +- Add requireFreshSigner lib to sessions + +## 0.25.1 + +### Patch Changes + +- Fix build typescrypt issue + +## 0.25.0 + +### Minor Changes + +- 10c8af8: Add estimator package + Fix multicall few calls bug + +## 0.23.0 + +### Minor Changes + +- - relayer: offer variety of gas fee options from the relayer service" + +## 0.22.2 + +### Patch Changes + +- e1c109e: Fix authProof on expired sessions + +## 0.22.1 + +### Patch Changes + +- transport session cache + +## 0.22.0 + +### Minor Changes + +- e667b65: Expose all relayer options on networks + +## 0.21.5 + +### Patch Changes + +- Give priority to metaTxnId returned by relayer + +## 0.21.4 + +### Patch Changes + +- Add has enough signers method + +## 0.21.3 + +### Patch Changes + +- add window session cache + +## 0.21.2 + +### Patch Changes + +- exception handlind in relayer + +## 0.21.0 + +### Minor Changes + +- - fix gas estimation on wallets with large number of signers + - update to session handling and wallet config construction upon auth + +## 0.19.3 + +### Patch Changes + +- jwtAuth visibility, package version sync + +## 0.19.0 + +### Minor Changes + +- - provider, improve dapp / wallet transport io + +## 0.18.0 + +### Minor Changes + +- relayer improvements and pending transaction handling + +## 0.16.0 + +### Minor Changes + +- relayer as its own service separate from chaind + +## 0.15.1 + +### Patch Changes + +- update api clients + +## 0.14.3 + +### Patch Changes + +- Fix 0xSequence relayer dependencies + +## 0.14.2 + +### Patch Changes + +- Add debug logs to rpc-relayer + +## 0.14.0 + +### Minor Changes + +- update sequence utils finder which includes optimization + +## 0.13.0 + +### Minor Changes + +- Update SequenceUtils deployed contract + +## 0.12.1 + +### Patch Changes + +- npm bump + +## 0.12.0 + +### Minor Changes + +- provider: improvements to window transport + +## 0.11.4 + +### Patch Changes + +- update api client + +## 0.11.3 + +### Patch Changes + +- improve openWindow state options handling + +## 0.11.2 + +### Patch Changes + +- Fix multicall proxy scopes + +## 0.11.1 + +### Patch Changes + +- Add support for dynamic and nested signatures + +## 0.11.0 + +### Minor Changes + +- Update wallet context to 1.7 contracts + +## 0.10.9 + +### Patch Changes + +- add support for public addresses as signers in session.open + +## 0.10.8 + +### Patch Changes + +- Multicall production configuration + +## 0.10.7 + +### Patch Changes + +- allow provider transport to force disconnect + +## 0.10.6 + +### Patch Changes + +- - fix getWalletState method + +## 0.10.5 + +### Patch Changes + +- update relayer gas refund options + +## 0.10.4 + +### Patch Changes + +- Update api proto + +## 0.10.3 + +### Patch Changes + +- Fix loading config cross-chain + +## 0.10.2 + +### Patch Changes + +- - message digest fix + +## 0.10.1 + +### Patch Changes + +- upgrade deps + +## 0.10.0 + +### Minor Changes + +- Deployed new contracts with ERC1271 signer support + +## 0.9.6 + +### Patch Changes + +- Update ABIs for latest sequence contracts + +## 0.9.3 + +### Patch Changes + +- - minor improvements + +## 0.9.1 + +### Patch Changes + +- - patch bump + +## 0.9.0 + +### Minor Changes + +- - provider transport hardening + +## 0.8.5 + +### Patch Changes + +- - use latest wallet-contracts + +## 0.8.4 + +### Patch Changes + +- - minor improvements, name updates and comments + +## 0.8.3 + +### Patch Changes + +- - refinements + + - normalize signer address in config + + - provider: getWalletState() method to WalletProvider + +## 0.8.2 + +### Patch Changes + +- - field rename and ethauth dependency bump + +## 0.8.1 + +### Patch Changes + +- - variety of optimizations + +## 0.8.0 + +### Minor Changes + +- - changeset fix + +## 0.7.0 + +### Patch Changes + +- 6f11ed7: sequence.js, init release diff --git a/packages/guard/README.md b/packages/guard/README.md new file mode 100644 index 000000000..9da6b41be --- /dev/null +++ b/packages/guard/README.md @@ -0,0 +1,4 @@ +@0xsequence/guard +================= + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/guard/src/guard.gen.ts b/packages/guard/src/guard.gen.ts new file mode 100644 index 000000000..519740c29 --- /dev/null +++ b/packages/guard/src/guard.gen.ts @@ -0,0 +1,814 @@ +/* eslint-disable */ +// sequence-guard v0.4.0 5b203e30a5c79b2b9a37483ce17500a51b94ebe1 +// -- +// Code generated by webrpc-gen@v0.18.6 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=guard.ridl -target=typescript -client -out=./clients/guard.gen.ts + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.4.0' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = '5b203e30a5c79b2b9a37483ce17500a51b94ebe1' + +// +// Types +// + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface RuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string +} + +export interface WalletConfig { + address: string + content: string +} + +export interface WalletSigner { + address: string + weight: number +} + +export interface SignRequest { + chainId: number + msg: string + auxData: string +} + +export interface OwnershipProof { + wallet: string + timestamp: number + signer: string + signature: string +} + +export interface AuthToken { + id: string + token: string +} + +export interface RecoveryCode { + code: string + used: boolean +} + +export interface Guard { + ping(headers?: object, signal?: AbortSignal): Promise + version(headers?: object, signal?: AbortSignal): Promise + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + getSignerConfig(args: GetSignerConfigArgs, headers?: object, signal?: AbortSignal): Promise + sign(args: SignArgs, headers?: object, signal?: AbortSignal): Promise + signWith(args: SignWithArgs, headers?: object, signal?: AbortSignal): Promise + patch(args: PatchArgs, headers?: object, signal?: AbortSignal): Promise + authMethods(args: AuthMethodsArgs, headers?: object, signal?: AbortSignal): Promise + setPIN(args: SetPINArgs, headers?: object, signal?: AbortSignal): Promise + resetPIN(args: ResetPINArgs, headers?: object, signal?: AbortSignal): Promise + createTOTP(args: CreateTOTPArgs, headers?: object, signal?: AbortSignal): Promise + commitTOTP(args: CommitTOTPArgs, headers?: object, signal?: AbortSignal): Promise + resetTOTP(args: ResetTOTPArgs, headers?: object, signal?: AbortSignal): Promise + reset2FA(args: Reset2FAArgs, headers?: object, signal?: AbortSignal): Promise + recoveryCodes(args: RecoveryCodesArgs, headers?: object, signal?: AbortSignal): Promise + resetRecoveryCodes(args: ResetRecoveryCodesArgs, headers?: object, signal?: AbortSignal): Promise +} + +export interface PingArgs {} + +export interface PingReturn { + status: boolean +} +export interface VersionArgs {} + +export interface VersionReturn { + version: Version +} +export interface RuntimeStatusArgs {} + +export interface RuntimeStatusReturn { + status: RuntimeStatus +} +export interface GetSignerConfigArgs { + signer: string +} + +export interface GetSignerConfigReturn { + signerConfig: WalletConfig +} +export interface SignArgs { + request: SignRequest + token?: AuthToken +} + +export interface SignReturn { + sig: string +} +export interface SignWithArgs { + signer: string + request: SignRequest + token?: AuthToken +} + +export interface SignWithReturn { + sig: string +} +export interface PatchArgs { + signer: string + chainId: number + secret: string +} + +export interface PatchReturn { + txs: any +} +export interface AuthMethodsArgs { + proof?: OwnershipProof +} + +export interface AuthMethodsReturn { + methods: Array + active: boolean +} +export interface SetPINArgs { + pin: string + timestamp: number + signature: string +} + +export interface SetPINReturn {} +export interface ResetPINArgs { + timestamp: number + signature: string +} + +export interface ResetPINReturn {} +export interface CreateTOTPArgs { + timestamp: number + signature: string +} + +export interface CreateTOTPReturn { + uri: string +} +export interface CommitTOTPArgs { + token: string +} + +export interface CommitTOTPReturn { + codes: Array +} +export interface ResetTOTPArgs { + timestamp: number + signature: string +} + +export interface ResetTOTPReturn {} +export interface Reset2FAArgs { + code: string + proof?: OwnershipProof +} + +export interface Reset2FAReturn {} +export interface RecoveryCodesArgs { + timestamp: number + signature: string +} + +export interface RecoveryCodesReturn { + codes: Array +} +export interface ResetRecoveryCodesArgs { + timestamp: number + signature: string +} + +export interface ResetRecoveryCodesReturn { + codes: Array +} + +// +// Client +// +export class Guard implements Guard { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Guard/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + version: _data.version + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getSignerConfig = (args: GetSignerConfigArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetSignerConfig'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + signerConfig: _data.signerConfig + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + sign = (args: SignArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Sign'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + sig: _data.sig + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + signWith = (args: SignWithArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SignWith'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + sig: _data.sig + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + patch = (args: PatchArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Patch'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + txs: _data.txs + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + authMethods = (args: AuthMethodsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AuthMethods'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + methods: >_data.methods, + active: _data.active + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + setPIN = (args: SetPINArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SetPIN'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + resetPIN = (args: ResetPINArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ResetPIN'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + createTOTP = (args: CreateTOTPArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('CreateTOTP'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + uri: _data.uri + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + commitTOTP = (args: CommitTOTPArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('CommitTOTP'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + codes: >_data.codes + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + resetTOTP = (args: ResetTOTPArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ResetTOTP'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + reset2FA = (args: Reset2FAArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Reset2FA'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + recoveryCodes = (args: RecoveryCodesArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RecoveryCodes'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + codes: >_data.codes + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + resetRecoveryCodes = ( + args: ResetRecoveryCodesArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ResetRecoveryCodes'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + codes: >_data.codes + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + return { + method: 'POST', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body || {}), + signal + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then(text => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}` + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = 'endpoint error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = 'request failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = 'bad route', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = 'bad method', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = 'bad request', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = 'bad response', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = 'server panic', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = 'internal error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = 'client disconnected', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = 'stream lost', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = 'stream finished', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export class UnauthorizedError extends WebrpcError { + constructor( + name: string = 'Unauthorized', + code: number = 1000, + message: string = 'Unauthorized access', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedError.prototype) + } +} + +export class SessionExpiredError extends WebrpcError { + constructor( + name: string = 'SessionExpired', + code: number = 1002, + message: string = 'Session expired', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, SessionExpiredError.prototype) + } +} + +export class AbortedError extends WebrpcError { + constructor( + name: string = 'Aborted', + code: number = 1005, + message: string = 'Request aborted', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AbortedError.prototype) + } +} + +export class InvalidArgumentError extends WebrpcError { + constructor( + name: string = 'InvalidArgument', + code: number = 2001, + message: string = 'Invalid argument', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidArgumentError.prototype) + } +} + +export class UnavailableError extends WebrpcError { + constructor( + name: string = 'Unavailable', + code: number = 2002, + message: string = 'Unavailable resource', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnavailableError.prototype) + } +} + +export class QueryFailedError extends WebrpcError { + constructor( + name: string = 'QueryFailed', + code: number = 2003, + message: string = 'Query failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QueryFailedError.prototype) + } +} + +export class ValidationFailedError extends WebrpcError { + constructor( + name: string = 'ValidationFailed', + code: number = 2004, + message: string = 'Validation Failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ValidationFailedError.prototype) + } +} + +export class NotFoundError extends WebrpcError { + constructor( + name: string = 'NotFound', + code: number = 3000, + message: string = 'Resource not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NotFoundError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Unauthorized = 'Unauthorized', + SessionExpired = 'SessionExpired', + Aborted = 'Aborted', + InvalidArgument = 'InvalidArgument', + Unavailable = 'Unavailable', + QueryFailed = 'QueryFailed', + ValidationFailed = 'ValidationFailed', + NotFound = 'NotFound' +} + +const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1000]: UnauthorizedError, + [1002]: SessionExpiredError, + [1005]: AbortedError, + [2001]: InvalidArgumentError, + [2002]: UnavailableError, + [2003]: QueryFailedError, + [2004]: ValidationFailedError, + [3000]: NotFoundError +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/guard/src/index.ts b/packages/guard/src/index.ts new file mode 100644 index 000000000..d4a9b72a0 --- /dev/null +++ b/packages/guard/src/index.ts @@ -0,0 +1,2 @@ +export { Guard } from './guard.gen' +export * from './signer' diff --git a/packages/guard/src/signer.ts b/packages/guard/src/signer.ts new file mode 100644 index 000000000..ba0c5288a --- /dev/null +++ b/packages/guard/src/signer.ts @@ -0,0 +1,294 @@ +import { Account } from '@0xsequence/account' +import { commons, universal } from '@0xsequence/core' +import { signers, Status } from '@0xsequence/signhub' +import { encodeTypedDataDigest, TypedData } from '@0xsequence/utils' +import { BytesLike, ethers, TypedDataDomain } from 'ethers' +import { AuthMethodsReturn, Guard, RecoveryCode as GuardRecoveryCode } from './guard.gen' + +const fetch = typeof global === 'object' ? global.fetch : window.fetch + +export class GuardSigner implements signers.SapientSigner { + private guard: Guard + + constructor( + public readonly address: string, + public readonly url: string, + public readonly appendSuffix: boolean = false + ) { + this.guard = new Guard(url, fetch) + } + + async getAddress(): Promise { + return this.address + } + + async buildDeployTransaction(_metadata: object): Promise { + return undefined + } + + async predecorateSignedTransactions(_metadata: object): Promise { + return [] + } + + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + _metadata: object + ): Promise { + return bundle + } + + async sign(message: BytesLike, metadata: object): Promise { + if (!commons.isWalletSignRequestMetadata(metadata)) { + throw new Error('expected sequence signature request metadata') + } + + const guardTotpCode = (metadata as { guardTotpCode?: string }).guardTotpCode + + // Building auxData, notice: this uses the old v1 format + // TODO: We should update the guard API so we can pass the metadata directly + const coder = universal.genericCoderFor(metadata.config.version) + const { encoded } = coder.signature.encodeSigners(metadata.config, metadata.parts ?? new Map(), [], metadata.chainId) + + return ( + await this.guard.signWith({ + signer: this.address, + request: { + msg: ethers.utils.hexlify(message), + auxData: this.packMsgAndSig(metadata.address, metadata.digest, encoded, metadata.chainId), + chainId: ethers.BigNumber.from(metadata.chainId).toNumber() + }, + token: guardTotpCode ? { id: AuthMethod.TOTP, token: guardTotpCode } : undefined + }) + ).sig + } + + notifyStatusChange(_id: string, _status: Status, _metadata: object): void {} + + async getAuthMethods(proof: OwnershipProof): Promise<{ methods: AuthMethod[]; active: boolean }> { + let response: AuthMethodsReturn + + if ('jwt' in proof) { + response = await this.guard.authMethods({}, { Authorization: `BEARER ${proof.jwt}` }) + } else { + const signedProof = await signOwnershipProof(proof) + + response = await this.guard.authMethods({ + proof: { + wallet: signedProof.walletAddress, + timestamp: signedProof.timestamp.getTime(), + signer: signedProof.signerAddress, + signature: signedProof.signature + } + }) + } + + return { ...response, methods: response.methods.map(parseAuthMethod) } + } + + async setPin(pin: string | undefined, proof: AuthUpdateProof): Promise { + const signedProof = await signAuthUpdateProof(proof) + + if (pin === undefined) { + await this.guard.resetPIN( + { timestamp: signedProof.timestamp.getTime(), signature: signedProof.signature }, + { Authorization: `BEARER ${proof.jwt}` } + ) + } else { + await this.guard.setPIN( + { pin, timestamp: signedProof.timestamp.getTime(), signature: signedProof.signature }, + { Authorization: `BEARER ${proof.jwt}` } + ) + } + } + + resetPin(proof: AuthUpdateProof): Promise { + return this.setPin(undefined, proof) + } + + async createTotp(proof: AuthUpdateProof): Promise { + const signedProof = await signAuthUpdateProof(proof) + + const { uri } = await this.guard.createTOTP( + { timestamp: signedProof.timestamp.getTime(), signature: signedProof.signature }, + { Authorization: `BEARER ${proof.jwt}` } + ) + + return new URL(uri) + } + + async commitTotp(token: string, jwt: string): Promise { + const { codes } = await this.guard.commitTOTP({ token }, { Authorization: `BEARER ${jwt}` }) + return codes + } + + async resetTotp(proof: AuthUpdateProof): Promise { + const signedProof = await signAuthUpdateProof(proof) + + await this.guard.resetTOTP( + { timestamp: signedProof.timestamp.getTime(), signature: signedProof.signature }, + { Authorization: `BEARER ${proof.jwt}` } + ) + } + + async reset2fa(recoveryCode: string, proof: OwnershipProof): Promise { + if ('jwt' in proof) { + await this.guard.reset2FA({ code: recoveryCode }, { Authorization: `BEARER ${proof.jwt}` }) + } else { + const signedProof = await signOwnershipProof(proof) + + await this.guard.reset2FA({ + code: recoveryCode, + proof: { + wallet: signedProof.walletAddress, + timestamp: signedProof.timestamp.getTime(), + signer: signedProof.signerAddress, + signature: signedProof.signature + } + }) + } + } + + async getRecoveryCodes(proof: AuthUpdateProof): Promise { + const signedProof = await signAuthUpdateProof(proof) + + const { codes } = await this.guard.recoveryCodes( + { timestamp: signedProof.timestamp.getTime(), signature: signedProof.signature }, + { Authorization: `BEARER ${proof.jwt}` } + ) + + return codes + } + + async resetRecoveryCodes(proof: AuthUpdateProof): Promise { + const signedProof = await signAuthUpdateProof(proof) + + const { codes } = await this.guard.resetRecoveryCodes( + { timestamp: signedProof.timestamp.getTime(), signature: signedProof.signature }, + { Authorization: `BEARER ${proof.jwt}` } + ) + + return codes + } + + private packMsgAndSig(address: string, msg: BytesLike, sig: BytesLike, chainId: ethers.BigNumberish): string { + return ethers.utils.defaultAbiCoder.encode(['address', 'uint256', 'bytes', 'bytes'], [address, chainId, msg, sig]) + } + + suffix(): BytesLike { + return this.appendSuffix ? [3] : [] + } +} + +export type RecoveryCode = GuardRecoveryCode + +export enum AuthMethod { + PIN = 'PIN', + TOTP = 'TOTP' +} + +function parseAuthMethod(method: string): AuthMethod { + switch (method) { + case AuthMethod.PIN: + case AuthMethod.TOTP: + return method + default: + throw new Error(`unknown auth method '${method}'`) + } +} + +export type SignedOwnershipProof = { + walletAddress: string + timestamp: Date + signerAddress: string + signature: string +} + +export type OwnershipProof = + | SignedOwnershipProof + | { jwt: string } + | { + walletAddress: string + signer: ethers.Signer | signers.SapientSigner + } + +export function isSignedOwnershipProof(proof: OwnershipProof): proof is SignedOwnershipProof { + return 'signerAddress' in proof && typeof proof.signerAddress === 'string' +} + +export async function signOwnershipProof(proof: Exclude): Promise { + if (isSignedOwnershipProof(proof)) { + return proof + } else { + const signer = signers.isSapientSigner(proof.signer) ? proof.signer : new signers.SignerWrapper(proof.signer) + const signerAddress = await signer.getAddress() + const timestamp = new Date() + const typedData = getOwnershipProofTypedData(proof.walletAddress, timestamp) + const digest = encodeTypedDataDigest(typedData) + + return { + walletAddress: proof.walletAddress, + timestamp, + signerAddress, + signature: ethers.utils.hexlify(await signer.sign(digest, {})) + } + } +} + +export type AuthUpdateProof = { jwt: string } & ({ timestamp: Date; signature: string } | { wallet: Account }) + +async function signAuthUpdateProof(proof: AuthUpdateProof): Promise<{ jwt: string; timestamp: Date; signature: string }> { + if ('wallet' in proof) { + const timestamp = new Date() + const typedData = getAuthUpdateProofTypedData(timestamp) + + const signature = await proof.wallet.signTypedData( + typedData.domain, + typedData.types, + typedData.message, + typedData.domain.chainId ?? 1, + 'eip6492' + ) + + return { jwt: proof.jwt, timestamp, signature } + } else { + return proof + } +} + +export function getOwnershipProofTypedData(wallet: string, timestamp: Date): TypedData { + return { + domain, + types: { + AuthMethods: [ + { name: 'wallet', type: 'address' }, + { name: 'timestamp', type: 'string' } + ] + }, + message: { + wallet: ethers.utils.getAddress(wallet), + timestamp: toUTCString(timestamp) + } + } +} + +export function getAuthUpdateProofTypedData(timestamp: Date): TypedData { + return { + domain, + types: { + AuthUpdate: [{ name: 'timestamp', type: 'string' }] + }, + message: { + timestamp: toUTCString(timestamp) + } + } +} + +const domain: TypedDataDomain = { + name: 'Sequence Guard', + version: '1', + chainId: 1 +} + +function toUTCString(date: Date): string { + return date.toUTCString().replace('GMT', 'UTC') +} diff --git a/packages/indexer/CHANGELOG.md b/packages/indexer/CHANGELOG.md new file mode 100644 index 000000000..5eac945aa --- /dev/null +++ b/packages/indexer/CHANGELOG.md @@ -0,0 +1,1358 @@ +# @0xsequence/indexer + +## 1.10.8 + +### Patch Changes + +- update metadata bindings + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia + +## 1.10.3 + +### Patch Changes + +- typing fix + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants + +## 1.9.36 + +### Patch Changes + +- guard: export client + +## 1.9.35 + +### Patch Changes + +- guard: update bindings + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email + +## 1.9.33 + +### Patch Changes + +- waas: umd build + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes + +## 1.9.30 + +### Patch Changes + +- update + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore + +## 1.9.23 + +### Patch Changes + +- update api client bindings + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings + +## 1.9.21 + +### Patch Changes + +- api client bindings + +## 1.9.20 + +### Patch Changes + +- api client bindings update + +## 1.9.19 + +### Patch Changes + +- waas update + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client + +## 1.9.8 + +### Patch Changes + +- waas client update + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer + +## 1.9.6 + +### Patch Changes + +- waas package update + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia + +## 1.9.1 + +### Patch Changes + +- analytics fix + +## 1.9.0 + +### Minor Changes + +- waas release + +## 1.8.8 + +### Patch Changes + +- update metadata bindings + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested + +## 1.8.1 + +### Patch Changes + +- update to analytics provider + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks + +## 1.6.3 + +### Patch Changes + +- network list update + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods + +## 1.4.2 + +### Patch Changes + +- guard: update bindings + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic + +## 1.4.0 + +### Minor Changes + +- project access key support + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions + +## 1.1.11 + +### Patch Changes + +- add homeverse configs + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object + +## 0.43.28 + +### Patch Changes + +- update api bindings + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM + +## 0.43.22 + +### Patch Changes + +- add zkevm chain + +## 0.43.21 + +### Patch Changes + +- api: update client bindings + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings + +## 0.43.19 + +### Patch Changes + +- session proof update + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods + +## 0.43.14 + +### Patch Changes + +- bump + +## 0.43.13 + +### Patch Changes + +- update rpc bindings + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter + +## 0.43.10 + +### Patch Changes + +- various improvements + +## 0.43.9 + +### Patch Changes + +- update deps + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings + +## 0.42.6 + +### Patch Changes + +- api bindings update + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options + +## 0.42.3 + +### Patch Changes + +- update api bindings + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' + +## 0.41.3 + +### Patch Changes + +- api bindings update + +## 0.41.2 + +### Patch Changes + +- api bindings update + +## 0.41.1 + +### Patch Changes + +- update default networks + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain + +## 0.40.5 + +### Patch Changes + +- api: update bindings + +## 0.40.4 + +### Patch Changes + +- add unreal transport + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option + +## 0.39.4 + +### Patch Changes + +- api: update client bindings + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider + +## 0.39.2 + +### Patch Changes + +- update umd name + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) + +## 0.36.7 + +### Patch Changes + +- fix missing break + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation + +## 0.35.10 + +### Patch Changes + +- upgrade deps + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +## 0.29.8 + +### Patch Changes + +- update api + +## 0.29.3 + +### Patch Changes + +- indexer: add bridge contract types + +## 0.29.0 + +### Minor Changes + +- major architectural changes in Sequence design + + - only one API instance, API is no longer a per-chain service + - separate per-chain indexer service, API no longer handles indexing + - single contract metadata service, API no longer serves metadata + + chaind package has been removed, indexer and metadata packages have been added + + stronger typing with new explicit ChainId type + + multicall fixes and improvements + + forbid "wait" transactions in sendTransactionBatch calls diff --git a/packages/indexer/README.md b/packages/indexer/README.md new file mode 100644 index 000000000..dfffc4c7a --- /dev/null +++ b/packages/indexer/README.md @@ -0,0 +1,4 @@ +@0xsequence/indexer +=================== + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/indexer/src/index.ts b/packages/indexer/src/index.ts new file mode 100644 index 000000000..544c2ce4b --- /dev/null +++ b/packages/indexer/src/index.ts @@ -0,0 +1,38 @@ +export * from './indexer.gen' + +import { Indexer as IndexerRpc } from './indexer.gen' + +const fetch = typeof global === 'object' ? global.fetch : window.fetch + +export class SequenceIndexer extends IndexerRpc { + constructor( + hostname: string, + public projectAccessKey?: string, + public jwtAuth?: string + ) { + super(hostname.endsWith('/') ? hostname.slice(0, -1) : hostname, fetch) + this.fetch = this._fetch + } + + _fetch = (input: RequestInfo, init?: RequestInit): Promise => { + // automatically include jwt and access key auth header to requests + // if its been set on the api client + const headers: { [key: string]: any } = {} + + const jwtAuth = this.jwtAuth + const projectAccessKey = this.projectAccessKey + + if (jwtAuth && jwtAuth.length > 0) { + headers['Authorization'] = `BEARER ${jwtAuth}` + } + + if (projectAccessKey && projectAccessKey.length > 0) { + headers['X-Access-Key'] = projectAccessKey + } + + // before the request is made + init!.headers = { ...init!.headers, ...headers } + + return fetch(input, init) + } +} diff --git a/packages/metadata/CHANGELOG.md b/packages/metadata/CHANGELOG.md new file mode 100644 index 000000000..8ae80f3bc --- /dev/null +++ b/packages/metadata/CHANGELOG.md @@ -0,0 +1,1366 @@ +# @0xsequence/metadata + +## 1.10.8 + +### Patch Changes + +- update metadata bindings + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia + +## 1.10.3 + +### Patch Changes + +- typing fix + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants + +## 1.9.36 + +### Patch Changes + +- guard: export client + +## 1.9.35 + +### Patch Changes + +- guard: update bindings + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email + +## 1.9.33 + +### Patch Changes + +- waas: umd build + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes + +## 1.9.30 + +### Patch Changes + +- update + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore + +## 1.9.23 + +### Patch Changes + +- update api client bindings + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings + +## 1.9.21 + +### Patch Changes + +- api client bindings + +## 1.9.20 + +### Patch Changes + +- api client bindings update + +## 1.9.19 + +### Patch Changes + +- waas update + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client + +## 1.9.8 + +### Patch Changes + +- waas client update + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer + +## 1.9.6 + +### Patch Changes + +- waas package update + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia + +## 1.9.1 + +### Patch Changes + +- analytics fix + +## 1.9.0 + +### Minor Changes + +- waas release + +## 1.8.8 + +### Patch Changes + +- update metadata bindings + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested + +## 1.8.1 + +### Patch Changes + +- update to analytics provider + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks + +## 1.6.3 + +### Patch Changes + +- network list update + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods + +## 1.4.2 + +### Patch Changes + +- guard: update bindings + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic + +## 1.4.0 + +### Minor Changes + +- project access key support + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions + +## 1.1.11 + +### Patch Changes + +- add homeverse configs + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object + +## 0.43.28 + +### Patch Changes + +- update api bindings + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM + +## 0.43.22 + +### Patch Changes + +- add zkevm chain + +## 0.43.21 + +### Patch Changes + +- api: update client bindings + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings + +## 0.43.19 + +### Patch Changes + +- session proof update + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods + +## 0.43.14 + +### Patch Changes + +- bump + +## 0.43.13 + +### Patch Changes + +- update rpc bindings + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter + +## 0.43.10 + +### Patch Changes + +- various improvements + +## 0.43.9 + +### Patch Changes + +- update deps + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings + +## 0.42.6 + +### Patch Changes + +- api bindings update + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options + +## 0.42.3 + +### Patch Changes + +- update api bindings + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' + +## 0.41.3 + +### Patch Changes + +- api bindings update + +## 0.41.2 + +### Patch Changes + +- api bindings update + +## 0.41.1 + +### Patch Changes + +- update default networks + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain + +## 0.40.5 + +### Patch Changes + +- api: update bindings + +## 0.40.4 + +### Patch Changes + +- add unreal transport + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option + +## 0.39.4 + +### Patch Changes + +- api: update client bindings + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider + +## 0.39.2 + +### Patch Changes + +- update umd name + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) + +## 0.36.7 + +### Patch Changes + +- fix missing break + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation + +## 0.35.10 + +### Patch Changes + +- upgrade deps + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +## 0.31.3 + +### Patch Changes + +- update metadata bindings + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +## 0.29.8 + +### Patch Changes + +- update api + +## 0.29.1 + +### Patch Changes + +- metadata: ContractInfo.decimals is now optional, i.e. may be undefined + + api: new APIs for user storage and isUsingGoogleMail + +## 0.29.0 + +### Minor Changes + +- major architectural changes in Sequence design + + - only one API instance, API is no longer a per-chain service + - separate per-chain indexer service, API no longer handles indexing + - single contract metadata service, API no longer serves metadata + + chaind package has been removed, indexer and metadata packages have been added + + stronger typing with new explicit ChainId type + + multicall fixes and improvements + + forbid "wait" transactions in sendTransactionBatch calls diff --git a/packages/metadata/README.md b/packages/metadata/README.md new file mode 100644 index 000000000..9939fb8b1 --- /dev/null +++ b/packages/metadata/README.md @@ -0,0 +1,4 @@ +@0xsequence/metadata +==================== + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/metadata/src/index.ts b/packages/metadata/src/index.ts new file mode 100644 index 000000000..383ee3920 --- /dev/null +++ b/packages/metadata/src/index.ts @@ -0,0 +1,68 @@ +export * from './metadata.gen' + +import { Metadata as MetadataRpc, Collections as CollectionsRpc } from './metadata.gen' + +const fetch = typeof global === 'object' ? global.fetch : window.fetch + +export class SequenceMetadata extends MetadataRpc { + constructor( + hostname: string = 'https://metadata.sequence.app', + public projectAccessKey?: string, + public jwtAuth?: string + ) { + super(hostname.endsWith('/') ? hostname.slice(0, -1) : hostname, fetch) + this.fetch = this._fetch + } + + _fetch = (input: RequestInfo, init?: RequestInit): Promise => { + // automatically include jwt and access key auth header to requests + // if its been set on the client + const headers: { [key: string]: any } = {} + + const jwtAuth = this.jwtAuth + const projectAccessKey = this.projectAccessKey + + if (jwtAuth && jwtAuth.length > 0) { + headers['Authorization'] = `BEARER ${jwtAuth}` + } + + if (projectAccessKey && projectAccessKey.length > 0) { + headers['X-Access-Key'] = projectAccessKey + } + + // before the request is made + init!.headers = { ...init!.headers, ...headers } + + return fetch(input, init) + } +} + +export class SequenceCollections extends CollectionsRpc { + constructor( + hostname: string = 'https://metadata.sequence.app', + public jwtAuth?: string + ) { + super(hostname.endsWith('/') ? hostname.slice(0, -1) : hostname, fetch) + this.fetch = this._fetch + } + + _fetch = (input: RequestInfo, init?: RequestInit): Promise => { + // automatically include jwt auth header to requests + // if its been set on the client + const headers: { [key: string]: any } = {} + + const jwtAuth = this.jwtAuth + + if (jwtAuth && jwtAuth.length > 0) { + headers['Authorization'] = `BEARER ${jwtAuth}` + } + + // before the request is made + init!.headers = { ...init!.headers, ...headers } + + return fetch(input, init) + } + + // TODO: add uploadAsset() method similar to, + // https://github.com/0xsequence/go-sequence/blob/master/metadata/collections.go#L52 +} diff --git a/packages/metadata/src/metadata.gen.ts b/packages/metadata/src/metadata.gen.ts new file mode 100644 index 000000000..a827de36b --- /dev/null +++ b/packages/metadata/src/metadata.gen.ts @@ -0,0 +1,2384 @@ +/* eslint-disable */ +// sequence-metadata v0.4.0 d5ad7dcea438ee205efb2a08dcfde61c2226625d +// -- +// Code generated by webrpc-gen@v0.18.6 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=metadata.ridl -target=typescript -client -out=./clients/metadata.gen.ts + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.4.0' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = 'd5ad7dcea438ee205efb2a08dcfde61c2226625d' + +// +// Types +// + +export enum ContractType { + UNKNOWN = 'UNKNOWN', + ERC20 = 'ERC20', + ERC721 = 'ERC721', + ERC1155 = 'ERC1155' +} + +export enum PropertyType { + INT = 'INT', + STRING = 'STRING', + ARRAY = 'ARRAY', + GENERIC = 'GENERIC' +} + +export enum SwapType { + UNKNOWN = 'UNKNOWN', + BUY = 'BUY', + SELL = 'SELL' +} + +export enum TaskStatus { + PENDING = 'PENDING', + PAUSED = 'PAUSED', + FAILED = 'FAILED', + COMPLETED = 'COMPLETED', + DISABLED = 'DISABLED' +} + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface RuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + checks: RuntimeChecks +} + +export interface RuntimeChecks {} + +export interface ContractIndex { + collectionId?: number + chainId: number + address: string + type: ContractType + metadata: { [key: string]: any } + contentHash: number + deployed: boolean + bytecodeHash: string + notFound: boolean + updatedAt: string +} + +export interface TokenIndex { + key: string + chainId: number + contractAddress: string + tokenId: string + metadata: { [key: string]: any } + notFound?: boolean + lastFetched?: string + fetchCount?: number + updatedAt: string +} + +export interface ContractInfo { + chainId: number + address: string + name: string + type: string + symbol: string + decimals?: number + logoURI: string + deployed: boolean + bytecodeHash: string + extensions: ContractInfoExtensions + updatedAt: string +} + +export interface ContractInfoExtensions { + link: string + description: string + ogImage: string + originChainId: number + originAddress: string + blacklist: boolean + verified: boolean + verifiedBy: string + featured: boolean +} + +export interface TokenMetadata { + tokenId: string + name: string + description?: string + image?: string + video?: string + audio?: string + properties?: { [key: string]: any } + attributes: Array<{ [key: string]: any }> + image_data?: string + external_url?: string + background_color?: string + animation_url?: string + decimals?: number + updatedAt?: string + assets?: Array +} + +export interface PropertyFilter { + name: string + type: PropertyType + min?: number + max?: number + values?: Array +} + +export interface Filter { + text?: string + properties?: Array +} + +export interface Collection { + id: number + projectId: number + metadata: CollectionMetadata + private: boolean + revealKey?: string + createdAt?: string + updatedAt?: string + deletedAt?: string + baseURIs?: CollectionBaseURIs + assets?: Array +} + +export interface CollectionMetadata { + name: string + description?: string + image?: string + external_link?: string + properties?: { [key: string]: any } + attributes?: Array<{ [key: string]: any }> +} + +export interface CollectionBaseURIs { + contractMetadataURI: string + tokenMetadataURI: string +} + +export interface Asset { + id: number + collectionId: number + tokenId?: string + url?: string + metadataField: string + name?: string + filesize?: number + mimeType?: string + width?: number + height?: number + updatedAt?: string +} + +export interface Token { + collectionId: number + tokenId: string + metadata: TokenMetadata + private: boolean + updatedAt?: string +} + +export interface GetNiftyswapUnitPricesRequest { + swapType: SwapType + ids: Array + amounts: Array +} + +export interface GetNiftyswapUnitPricesResponse { + unitPrice: string + unitAmount: string + availableAmount: string +} + +export interface Page { + page?: number + column?: string + before?: any + after?: any + pageSize?: number + more?: boolean +} + +export interface TaskRunner { + id: number + workGroup: string + runAt: string +} + +export interface Task { + id: number + queue: string + status?: TaskStatus + try: number + runAt?: string + lastRanAt?: string + createdAt?: string + payload: Array + hash?: string +} + +export interface Metadata { + ping(headers?: object, signal?: AbortSignal): Promise + version(headers?: object, signal?: AbortSignal): Promise + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + getTokenMetadata(args: GetTokenMetadataArgs, headers?: object, signal?: AbortSignal): Promise + refreshTokenMetadata( + args: RefreshTokenMetadataArgs, + headers?: object, + signal?: AbortSignal + ): Promise + enqueueTokensForRefresh( + args: EnqueueTokensForRefreshArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getTokenRefreshStatus( + args: GetTokenRefreshStatusArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getTokenRefreshResult( + args: GetTokenRefreshResultArgs, + headers?: object, + signal?: AbortSignal + ): Promise + cancelRefreshJob(args: CancelRefreshJobArgs, headers?: object, signal?: AbortSignal): Promise + getTokenMetadataBatch( + args: GetTokenMetadataBatchArgs, + headers?: object, + signal?: AbortSignal + ): Promise + searchTokenMetadata(args: SearchTokenMetadataArgs, headers?: object, signal?: AbortSignal): Promise + searchTokenIDs(args: SearchTokenIDsArgs, headers?: object, signal?: AbortSignal): Promise + tokenCollectionFilters( + args: TokenCollectionFiltersArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getContractInfo(args: GetContractInfoArgs, headers?: object, signal?: AbortSignal): Promise + getContractInfoBatch( + args: GetContractInfoBatchArgs, + headers?: object, + signal?: AbortSignal + ): Promise + searchContractInfo(args: SearchContractInfoArgs, headers?: object, signal?: AbortSignal): Promise + searchContractInfoBatch( + args: SearchContractInfoBatchArgs, + headers?: object, + signal?: AbortSignal + ): Promise + searchMetadata(args: SearchMetadataArgs, headers?: object, signal?: AbortSignal): Promise + searchTokens(args: SearchTokensArgs, headers?: object, signal?: AbortSignal): Promise + searchContracts(args: SearchContractsArgs, headers?: object, signal?: AbortSignal): Promise + getNiftyswapTokenQuantity( + args: GetNiftyswapTokenQuantityArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getNiftyswapUnitPrices( + args: GetNiftyswapUnitPricesArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getNiftyswapUnitPricesWithQuantities( + args: GetNiftyswapUnitPricesWithQuantitiesArgs, + headers?: object, + signal?: AbortSignal + ): Promise + addContractToMintMonitor( + args: AddContractToMintMonitorArgs, + headers?: object, + signal?: AbortSignal + ): Promise + removeContractFromMintMonitor( + args: RemoveContractFromMintMonitorArgs, + headers?: object, + signal?: AbortSignal + ): Promise + mintMonitorJobStatus( + args: MintMonitorJobStatusArgs, + headers?: object, + signal?: AbortSignal + ): Promise + mintMonitorTriggerJob( + args: MintMonitorTriggerJobArgs, + headers?: object, + signal?: AbortSignal + ): Promise + syncContractTokens(args: SyncContractTokensArgs, headers?: object, signal?: AbortSignal): Promise + abortContractSync(args: AbortContractSyncArgs, headers?: object, signal?: AbortSignal): Promise + contractSyncJobStatus( + args: ContractSyncJobStatusArgs, + headers?: object, + signal?: AbortSignal + ): Promise + directoryGetNetworks( + args: DirectoryGetNetworksArgs, + headers?: object, + signal?: AbortSignal + ): Promise + directoryGetCollections( + args: DirectoryGetCollectionsArgs, + headers?: object, + signal?: AbortSignal + ): Promise + directorySearchCollections( + args: DirectorySearchCollectionsArgs, + headers?: object, + signal?: AbortSignal + ): Promise +} + +export interface PingArgs {} + +export interface PingReturn { + status: boolean +} +export interface VersionArgs {} + +export interface VersionReturn { + version: Version +} +export interface RuntimeStatusArgs {} + +export interface RuntimeStatusReturn { + status: RuntimeStatus +} +export interface GetTokenMetadataArgs { + chainID: string + contractAddress: string + tokenIDs: Array +} + +export interface GetTokenMetadataReturn { + tokenMetadata: Array +} +export interface RefreshTokenMetadataArgs { + chainID: string + contractAddress: string + tokenIDs?: Array + refreshAll?: boolean +} + +export interface RefreshTokenMetadataReturn { + taskId: number +} +export interface EnqueueTokensForRefreshArgs { + chainID: string + contractAddress: string + tokenIDs?: Array + refreshAll?: boolean +} + +export interface EnqueueTokensForRefreshReturn { + taskId: number +} +export interface GetTokenRefreshStatusArgs { + taskId: number +} + +export interface GetTokenRefreshStatusReturn { + status?: TaskStatus +} +export interface GetTokenRefreshResultArgs { + taskId: number +} + +export interface GetTokenRefreshResultReturn { + status?: TaskStatus + tokens: { [key: string]: boolean } + failureReasons: { [key: string]: string } +} +export interface CancelRefreshJobArgs { + taskId: number +} + +export interface CancelRefreshJobReturn { + ok: boolean +} +export interface GetTokenMetadataBatchArgs { + chainID: string + contractTokenMap: { [key: string]: Array } +} + +export interface GetTokenMetadataBatchReturn { + contractTokenMetadata: { [key: string]: Array } +} +export interface SearchTokenMetadataArgs { + chainID: string + contractAddress: string + filter: Filter + page?: Page +} + +export interface SearchTokenMetadataReturn { + page: Page + tokenMetadata: Array +} +export interface SearchTokenIDsArgs { + chainID: string + contractAddress: string + filter: Filter + page?: Page +} + +export interface SearchTokenIDsReturn { + page: Page + tokenIds: Array +} +export interface TokenCollectionFiltersArgs { + chainID: string + contractAddress: string +} + +export interface TokenCollectionFiltersReturn { + filters: Array +} +export interface GetContractInfoArgs { + chainID: string + contractAddress: string +} + +export interface GetContractInfoReturn { + contractInfo: ContractInfo +} +export interface GetContractInfoBatchArgs { + chainID: string + contractAddresses: Array +} + +export interface GetContractInfoBatchReturn { + contractInfoMap: { [key: string]: ContractInfo } +} +export interface SearchContractInfoArgs { + contractAddress: string +} + +export interface SearchContractInfoReturn { + contractInfoList: Array +} +export interface SearchContractInfoBatchArgs { + contractAddresses: Array +} + +export interface SearchContractInfoBatchReturn { + contractInfoByChain: { [key: string]: Array } +} +export interface SearchMetadataArgs { + filter: string + chainID?: string + types?: Array + excludeTokenMetadata?: boolean +} + +export interface SearchMetadataReturn { + tokenMetadata: Array + contractInfo: Array +} +export interface SearchTokensArgs { + q: string + chainID?: string + page?: Page +} + +export interface SearchTokensReturn { + tokenMetadata: Array + nextPage: Page +} +export interface SearchContractsArgs { + q: string + chainID?: string + chainIDs?: Array + types?: Array + page?: Page +} + +export interface SearchContractsReturn { + contractInfo: Array + nextPage: Page +} +export interface GetNiftyswapTokenQuantityArgs { + chainID: string + contractAddress: string + tokenIDs: Array +} + +export interface GetNiftyswapTokenQuantityReturn { + quantity: { [key: string]: string } +} +export interface GetNiftyswapUnitPricesArgs { + chainID: string + contractAddress: string + req: GetNiftyswapUnitPricesRequest + fresh: boolean +} + +export interface GetNiftyswapUnitPricesReturn { + prices: { [key: string]: string } +} +export interface GetNiftyswapUnitPricesWithQuantitiesArgs { + chainID: string + contractAddress: string + req: GetNiftyswapUnitPricesRequest + fresh: boolean +} + +export interface GetNiftyswapUnitPricesWithQuantitiesReturn { + prices: { [key: string]: GetNiftyswapUnitPricesResponse } +} +export interface AddContractToMintMonitorArgs { + chainID: string + contractAddress: string +} + +export interface AddContractToMintMonitorReturn { + ok: boolean +} +export interface RemoveContractFromMintMonitorArgs { + chainID: string + contractAddress: string +} + +export interface RemoveContractFromMintMonitorReturn { + ok: boolean +} +export interface MintMonitorJobStatusArgs { + chainID: string + contractAddress: string +} + +export interface MintMonitorJobStatusReturn { + task: Task +} +export interface MintMonitorTriggerJobArgs { + chainID: string + contractAddress: string +} + +export interface MintMonitorTriggerJobReturn { + ok: boolean +} +export interface SyncContractTokensArgs { + chainID: string + contractAddress: string +} + +export interface SyncContractTokensReturn { + taskID: number +} +export interface AbortContractSyncArgs { + taskID: number +} + +export interface AbortContractSyncReturn { + ok: boolean +} +export interface ContractSyncJobStatusArgs { + taskID: number +} + +export interface ContractSyncJobStatusReturn { + refreshTask: Task + syncTask: Task +} +export interface DirectoryGetNetworksArgs { + includeTestnets?: boolean + onlyFeatured?: boolean +} + +export interface DirectoryGetNetworksReturn { + networks: Array +} +export interface DirectoryGetCollectionsArgs { + chainId?: number + includeTestnets?: boolean + onlyFeatured?: boolean + page?: Page +} + +export interface DirectoryGetCollectionsReturn { + collections: Array + page: Page +} +export interface DirectorySearchCollectionsArgs { + query: string + chainId?: number + includeTestnets?: boolean + onlyFeatured?: boolean + page?: Page +} + +export interface DirectorySearchCollectionsReturn { + collections: Array + page: Page +} + +export interface Collections { + createCollection(args: CreateCollectionArgs, headers?: object, signal?: AbortSignal): Promise + getCollection(args: GetCollectionArgs, headers?: object, signal?: AbortSignal): Promise + listCollections(args: ListCollectionsArgs, headers?: object, signal?: AbortSignal): Promise + updateCollection(args: UpdateCollectionArgs, headers?: object, signal?: AbortSignal): Promise + deleteCollection(args: DeleteCollectionArgs, headers?: object, signal?: AbortSignal): Promise + publishCollection(args: PublishCollectionArgs, headers?: object, signal?: AbortSignal): Promise + unpublishCollection(args: UnpublishCollectionArgs, headers?: object, signal?: AbortSignal): Promise + createToken(args: CreateTokenArgs, headers?: object, signal?: AbortSignal): Promise + getToken(args: GetTokenArgs, headers?: object, signal?: AbortSignal): Promise + listTokens(args: ListTokensArgs, headers?: object, signal?: AbortSignal): Promise + updateToken(args: UpdateTokenArgs, headers?: object, signal?: AbortSignal): Promise + deleteToken(args: DeleteTokenArgs, headers?: object, signal?: AbortSignal): Promise + createAsset(args: CreateAssetArgs, headers?: object, signal?: AbortSignal): Promise + getAsset(args: GetAssetArgs, headers?: object, signal?: AbortSignal): Promise + updateAsset(args: UpdateAssetArgs, headers?: object, signal?: AbortSignal): Promise + deleteAsset(args: DeleteAssetArgs, headers?: object, signal?: AbortSignal): Promise +} + +export interface CreateCollectionArgs { + projectId?: number + collection: Collection +} + +export interface CreateCollectionReturn { + collection: Collection +} +export interface GetCollectionArgs { + projectId?: number + collectionId: number +} + +export interface GetCollectionReturn { + collection: Collection +} +export interface ListCollectionsArgs { + projectId?: number + page?: Page +} + +export interface ListCollectionsReturn { + page: Page + collections: Array +} +export interface UpdateCollectionArgs { + projectId?: number + collection: Collection +} + +export interface UpdateCollectionReturn { + collection: Collection +} +export interface DeleteCollectionArgs { + projectId?: number + collectionId: number +} + +export interface DeleteCollectionReturn { + status: boolean +} +export interface PublishCollectionArgs { + projectId?: number + collectionId: number + recursive?: boolean +} + +export interface PublishCollectionReturn { + collection: Collection +} +export interface UnpublishCollectionArgs { + projectId?: number + collectionId: number +} + +export interface UnpublishCollectionReturn { + collection: Collection +} +export interface CreateTokenArgs { + projectId?: number + collectionId: number + token: TokenMetadata + private?: boolean +} + +export interface CreateTokenReturn { + token: TokenMetadata + assets: Array +} +export interface GetTokenArgs { + projectId?: number + collectionId: number + tokenId: string +} + +export interface GetTokenReturn { + token: TokenMetadata + assets: Array +} +export interface ListTokensArgs { + projectId?: number + collectionId: number + page?: Page +} + +export interface ListTokensReturn { + page: Page + tokens: Array +} +export interface UpdateTokenArgs { + projectId?: number + collectionId: number + tokenId: string + token: TokenMetadata + private?: boolean +} + +export interface UpdateTokenReturn { + token: TokenMetadata +} +export interface DeleteTokenArgs { + projectId?: number + collectionId: number + tokenId: string +} + +export interface DeleteTokenReturn { + status: boolean +} +export interface CreateAssetArgs { + projectId?: number + asset: Asset +} + +export interface CreateAssetReturn { + asset: Asset +} +export interface GetAssetArgs { + projectId?: number + assetId: number +} + +export interface GetAssetReturn { + asset: Asset +} +export interface UpdateAssetArgs { + projectId?: number + asset: Asset +} + +export interface UpdateAssetReturn { + asset: Asset +} +export interface DeleteAssetArgs { + projectId?: number + assetId: number +} + +export interface DeleteAssetReturn { + status: boolean +} + +export interface Admin { + addContractsToTokenDirectory( + args: AddContractsToTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal + ): Promise + removeContractsFromTokenDirectory( + args: RemoveContractsFromTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal + ): Promise + modifyFeatureIndex(args: ModifyFeatureIndexArgs, headers?: object, signal?: AbortSignal): Promise + getFeatureIndex(args: GetFeatureIndexArgs, headers?: object, signal?: AbortSignal): Promise + listTokenDirectory(args: ListTokenDirectoryArgs, headers?: object, signal?: AbortSignal): Promise + linkCollection(args: LinkCollectionArgs, headers?: object, signal?: AbortSignal): Promise + listLinkedContracts(args: ListLinkedContractsArgs, headers?: object, signal?: AbortSignal): Promise +} + +export interface AddContractsToTokenDirectoryArgs { + contracts: Array + featureIndexes: Array +} + +export interface AddContractsToTokenDirectoryReturn { + ok: boolean +} +export interface RemoveContractsFromTokenDirectoryArgs { + chainHandle: string + contracts: Array +} + +export interface RemoveContractsFromTokenDirectoryReturn { + ok: boolean +} +export interface ModifyFeatureIndexArgs { + chainHandle: string + contractAddress: string + featured: number +} + +export interface ModifyFeatureIndexReturn { + ok: boolean +} +export interface GetFeatureIndexArgs { + chainHandle: string + contractAddress: string +} + +export interface GetFeatureIndexReturn { + featured: number +} +export interface ListTokenDirectoryArgs { + chainID?: number + includeTestnets?: boolean + onlyFeatured?: boolean + page?: Page +} + +export interface ListTokenDirectoryReturn { + page: Page + collections: Array +} +export interface LinkCollectionArgs { + projectId: number + chainID: number + contractAddress: string + collectionId?: number +} + +export interface LinkCollectionReturn { + ok: boolean +} +export interface ListLinkedContractsArgs { + projectId: number + collectionId?: number + page?: Page +} + +export interface ListLinkedContractsReturn { + collections: Array + page: Page +} + +// +// Client +// +export class Metadata implements Metadata { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Metadata/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + version: _data.version + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getTokenMetadata = (args: GetTokenMetadataArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTokenMetadata'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + tokenMetadata: >_data.tokenMetadata + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + refreshTokenMetadata = ( + args: RefreshTokenMetadataArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('RefreshTokenMetadata'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + taskId: _data.taskId + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + enqueueTokensForRefresh = ( + args: EnqueueTokensForRefreshArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('EnqueueTokensForRefresh'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + taskId: _data.taskId + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getTokenRefreshStatus = ( + args: GetTokenRefreshStatusArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenRefreshStatus'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getTokenRefreshResult = ( + args: GetTokenRefreshResultArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenRefreshResult'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + tokens: <{ [key: string]: boolean }>_data.tokens, + failureReasons: <{ [key: string]: string }>_data.failureReasons + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + cancelRefreshJob = (args: CancelRefreshJobArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('CancelRefreshJob'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getTokenMetadataBatch = ( + args: GetTokenMetadataBatchArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetTokenMetadataBatch'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + contractTokenMetadata: <{ [key: string]: Array }>_data.contractTokenMetadata + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + searchTokenMetadata = ( + args: SearchTokenMetadataArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('SearchTokenMetadata'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + tokenMetadata: >_data.tokenMetadata + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + searchTokenIDs = (args: SearchTokenIDsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SearchTokenIDs'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + tokenIds: >_data.tokenIds + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + tokenCollectionFilters = ( + args: TokenCollectionFiltersArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('TokenCollectionFilters'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + filters: >_data.filters + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getContractInfo = (args: GetContractInfoArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetContractInfo'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + contractInfo: _data.contractInfo + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getContractInfoBatch = ( + args: GetContractInfoBatchArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetContractInfoBatch'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + contractInfoMap: <{ [key: string]: ContractInfo }>_data.contractInfoMap + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + searchContractInfo = ( + args: SearchContractInfoArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('SearchContractInfo'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + contractInfoList: >_data.contractInfoList + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + searchContractInfoBatch = ( + args: SearchContractInfoBatchArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('SearchContractInfoBatch'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + contractInfoByChain: <{ [key: string]: Array }>_data.contractInfoByChain + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + searchMetadata = (args: SearchMetadataArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SearchMetadata'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + tokenMetadata: >_data.tokenMetadata, + contractInfo: >_data.contractInfo + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + searchTokens = (args: SearchTokensArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SearchTokens'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + tokenMetadata: >_data.tokenMetadata, + nextPage: _data.nextPage + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + searchContracts = (args: SearchContractsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SearchContracts'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + contractInfo: >_data.contractInfo, + nextPage: _data.nextPage + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getNiftyswapTokenQuantity = ( + args: GetNiftyswapTokenQuantityArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetNiftyswapTokenQuantity'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + quantity: <{ [key: string]: string }>_data.quantity + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getNiftyswapUnitPrices = ( + args: GetNiftyswapUnitPricesArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetNiftyswapUnitPrices'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + prices: <{ [key: string]: string }>_data.prices + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getNiftyswapUnitPricesWithQuantities = ( + args: GetNiftyswapUnitPricesWithQuantitiesArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetNiftyswapUnitPricesWithQuantities'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + prices: <{ [key: string]: GetNiftyswapUnitPricesResponse }>_data.prices + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + addContractToMintMonitor = ( + args: AddContractToMintMonitorArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('AddContractToMintMonitor'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + removeContractFromMintMonitor = ( + args: RemoveContractFromMintMonitorArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('RemoveContractFromMintMonitor'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + mintMonitorJobStatus = ( + args: MintMonitorJobStatusArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('MintMonitorJobStatus'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + task: _data.task + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + mintMonitorTriggerJob = ( + args: MintMonitorTriggerJobArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('MintMonitorTriggerJob'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + syncContractTokens = ( + args: SyncContractTokensArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('SyncContractTokens'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + taskID: _data.taskID + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + abortContractSync = (args: AbortContractSyncArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AbortContractSync'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + contractSyncJobStatus = ( + args: ContractSyncJobStatusArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ContractSyncJobStatus'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + refreshTask: _data.refreshTask, + syncTask: _data.syncTask + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + directoryGetNetworks = ( + args: DirectoryGetNetworksArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('DirectoryGetNetworks'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + networks: >_data.networks + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + directoryGetCollections = ( + args: DirectoryGetCollectionsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('DirectoryGetCollections'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + collections: >_data.collections, + page: _data.page + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + directorySearchCollections = ( + args: DirectorySearchCollectionsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('DirectorySearchCollections'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + collections: >_data.collections, + page: _data.page + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} +export class Collections implements Collections { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Collections/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + createCollection = (args: CreateCollectionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('CreateCollection'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + collection: _data.collection + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getCollection = (args: GetCollectionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetCollection'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + collection: _data.collection + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + listCollections = (args: ListCollectionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ListCollections'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + collections: >_data.collections + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + updateCollection = (args: UpdateCollectionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateCollection'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + collection: _data.collection + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + deleteCollection = (args: DeleteCollectionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('DeleteCollection'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + publishCollection = (args: PublishCollectionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('PublishCollection'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + collection: _data.collection + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + unpublishCollection = ( + args: UnpublishCollectionArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('UnpublishCollection'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + collection: _data.collection + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + createToken = (args: CreateTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('CreateToken'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + token: _data.token, + assets: >_data.assets + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getToken = (args: GetTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetToken'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + token: _data.token, + assets: >_data.assets + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + listTokens = (args: ListTokensArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ListTokens'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + tokens: >_data.tokens + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + updateToken = (args: UpdateTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateToken'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + token: _data.token + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + deleteToken = (args: DeleteTokenArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('DeleteToken'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + createAsset = (args: CreateAssetArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('CreateAsset'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + asset: _data.asset + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getAsset = (args: GetAssetArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetAsset'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + asset: _data.asset + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + updateAsset = (args: UpdateAssetArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateAsset'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + asset: _data.asset + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + deleteAsset = (args: DeleteAssetArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('DeleteAsset'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} +export class Admin implements Admin { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Admin/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + addContractsToTokenDirectory = ( + args: AddContractsToTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('AddContractsToTokenDirectory'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + removeContractsFromTokenDirectory = ( + args: RemoveContractsFromTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('RemoveContractsFromTokenDirectory'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + modifyFeatureIndex = ( + args: ModifyFeatureIndexArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ModifyFeatureIndex'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getFeatureIndex = (args: GetFeatureIndexArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetFeatureIndex'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + featured: _data.featured + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + listTokenDirectory = ( + args: ListTokenDirectoryArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ListTokenDirectory'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + collections: >_data.collections + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + linkCollection = (args: LinkCollectionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('LinkCollection'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + ok: _data.ok + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + listLinkedContracts = ( + args: ListLinkedContractsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ListLinkedContracts'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + collections: >_data.collections, + page: _data.page + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + return { + method: 'POST', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body || {}), + signal + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then(text => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}` + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = 'endpoint error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = 'request failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = 'bad route', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = 'bad method', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = 'bad request', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = 'bad response', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = 'server panic', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = 'internal error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = 'client disconnected', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = 'stream lost', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = 'stream finished', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export class UnauthorizedError extends WebrpcError { + constructor( + name: string = 'Unauthorized', + code: number = 1000, + message: string = 'Unauthorized access', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedError.prototype) + } +} + +export class PermissionDeniedError extends WebrpcError { + constructor( + name: string = 'PermissionDenied', + code: number = 1001, + message: string = 'Permission denied', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, PermissionDeniedError.prototype) + } +} + +export class SessionExpiredError extends WebrpcError { + constructor( + name: string = 'SessionExpired', + code: number = 1002, + message: string = 'Session expired', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, SessionExpiredError.prototype) + } +} + +export class MethodNotFoundError extends WebrpcError { + constructor( + name: string = 'MethodNotFound', + code: number = 1003, + message: string = 'Method not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, MethodNotFoundError.prototype) + } +} + +export class RequestConflictError extends WebrpcError { + constructor( + name: string = 'RequestConflict', + code: number = 1004, + message: string = 'Conflict with target resource', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, RequestConflictError.prototype) + } +} + +export class FailError extends WebrpcError { + constructor( + name: string = 'Fail', + code: number = 1005, + message: string = 'Request Failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, FailError.prototype) + } +} + +export class GeoblockedError extends WebrpcError { + constructor( + name: string = 'Geoblocked', + code: number = 1006, + message: string = 'Geoblocked region', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, GeoblockedError.prototype) + } +} + +export class TimeoutError extends WebrpcError { + constructor( + name: string = 'Timeout', + code: number = 2000, + message: string = 'Request timed out', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, TimeoutError.prototype) + } +} + +export class InvalidArgumentError extends WebrpcError { + constructor( + name: string = 'InvalidArgument', + code: number = 2001, + message: string = 'Invalid argument', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidArgumentError.prototype) + } +} + +export class RequiredArgumentError extends WebrpcError { + constructor( + name: string = 'RequiredArgument', + code: number = 2002, + message: string = 'Required argument missing', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, RequiredArgumentError.prototype) + } +} + +export class QueryFailedError extends WebrpcError { + constructor( + name: string = 'QueryFailed', + code: number = 2003, + message: string = 'Query failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QueryFailedError.prototype) + } +} + +export class ValidationFailedError extends WebrpcError { + constructor( + name: string = 'ValidationFailed', + code: number = 2004, + message: string = 'Validation failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ValidationFailedError.prototype) + } +} + +export class RateLimitedError extends WebrpcError { + constructor( + name: string = 'RateLimited', + code: number = 2005, + message: string = 'Rate limited', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, RateLimitedError.prototype) + } +} + +export class NotFoundError extends WebrpcError { + constructor( + name: string = 'NotFound', + code: number = 3000, + message: string = 'Resource not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NotFoundError.prototype) + } +} + +export class ProjectNotFoundError extends WebrpcError { + constructor( + name: string = 'ProjectNotFound', + code: number = 3002, + message: string = 'Project not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ProjectNotFoundError.prototype) + } +} + +export class ChainNotFoundError extends WebrpcError { + constructor( + name: string = 'ChainNotFound', + code: number = 3003, + message: string = 'Chain not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ChainNotFoundError.prototype) + } +} + +export class TokenDirectoryDisabledError extends WebrpcError { + constructor( + name: string = 'TokenDirectoryDisabled', + code: number = 4001, + message: string = 'Token Directory is disabled', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, TokenDirectoryDisabledError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Unauthorized = 'Unauthorized', + PermissionDenied = 'PermissionDenied', + SessionExpired = 'SessionExpired', + MethodNotFound = 'MethodNotFound', + RequestConflict = 'RequestConflict', + Fail = 'Fail', + Geoblocked = 'Geoblocked', + Timeout = 'Timeout', + InvalidArgument = 'InvalidArgument', + RequiredArgument = 'RequiredArgument', + QueryFailed = 'QueryFailed', + ValidationFailed = 'ValidationFailed', + RateLimited = 'RateLimited', + NotFound = 'NotFound', + ProjectNotFound = 'ProjectNotFound', + ChainNotFound = 'ChainNotFound', + TokenDirectoryDisabled = 'TokenDirectoryDisabled' +} + +const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1000]: UnauthorizedError, + [1001]: PermissionDeniedError, + [1002]: SessionExpiredError, + [1003]: MethodNotFoundError, + [1004]: RequestConflictError, + [1005]: FailError, + [1006]: GeoblockedError, + [2000]: TimeoutError, + [2001]: InvalidArgumentError, + [2002]: RequiredArgumentError, + [2003]: QueryFailedError, + [2004]: ValidationFailedError, + [2005]: RateLimitedError, + [3000]: NotFoundError, + [3002]: ProjectNotFoundError, + [3003]: ChainNotFoundError, + [4001]: TokenDirectoryDisabledError +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/migration/src/defaults.ts b/packages/migration/src/defaults.ts new file mode 100644 index 000000000..ad2078e23 --- /dev/null +++ b/packages/migration/src/defaults.ts @@ -0,0 +1,6 @@ +import { v1v2 } from './migrations' +import { Migrations } from './migrator' + +export const DefaultMigrations: Migrations = { + 1: v1v2 +} diff --git a/packages/migration/src/index.ts b/packages/migration/src/index.ts new file mode 100644 index 000000000..6f0c97c5f --- /dev/null +++ b/packages/migration/src/index.ts @@ -0,0 +1,4 @@ +export * as version from './version' +export * as migration from './migrations' +export * as migrator from './migrator' +export * as defaults from './defaults' diff --git a/packages/migration/src/migrations/index.ts b/packages/migration/src/migrations/index.ts new file mode 100644 index 000000000..97b91e601 --- /dev/null +++ b/packages/migration/src/migrations/index.ts @@ -0,0 +1,25 @@ +import { commons } from '@0xsequence/core' +import { UnsignedMigration } from '../migrator' +import { Migration_v1v2 } from './migration_01_02' + +// = uint160(keccak256("org.sequence.sdk.migration.space.nonce")) +export const MIGRATION_NONCE_SPACE = '0xa04263acf755e8bd19c0d7e20eea39a9ff3729eb' + +export interface Migration

{ + version: number + + buildTransaction: (address: string, contexts: commons.context.VersionedContext, newConfig: P | C) => UnsignedMigration + + decodeTransaction: ( + tx: commons.transaction.TransactionBundle, + contexts: commons.context.VersionedContext + ) => { + address: string + newImageHash: string + } + + configCoder: commons.config.ConfigCoder + signatureCoder: commons.signature.SignatureCoder, commons.signature.UnrecoveredSignature> +} + +export const v1v2 = new Migration_v1v2() diff --git a/packages/migration/src/migrations/migration_01_02.ts b/packages/migration/src/migrations/migration_01_02.ts new file mode 100644 index 000000000..cbd7a0701 --- /dev/null +++ b/packages/migration/src/migrations/migration_01_02.ts @@ -0,0 +1,113 @@ +import { commons, v1, v2 } from '@0xsequence/core' +import { ethers } from 'ethers' + +import { Migration, MIGRATION_NONCE_SPACE } from '.' +import { walletContracts } from '@0xsequence/abi' +import { UnsignedMigration } from '../migrator' + +export class Migration_v1v2 implements Migration { + version = 2 + + configCoder = v2.config.ConfigCoder + signatureCoder = v2.signature.SignatureCoder + + buildTransaction( + address: string, + contexts: commons.context.VersionedContext, + newConfig: v1.config.WalletConfig | v2.config.WalletConfig + ): UnsignedMigration { + // If new config is not v2, then we need to convert it to v2 + if (!v2.config.ConfigCoder.isWalletConfig(newConfig)) { + const v2Config = v2.config.toWalletConfig({ + threshold: newConfig.threshold, + members: newConfig.signers, + checkpoint: 0 + }) + + return this.buildTransaction(address, contexts, v2Config) + } + + const context = contexts[2] + const contract = new ethers.utils.Interface(walletContracts.mainModule.abi) + + // WARNING: v1 wallets CAN NOT use v2 configurations so we ALWAYS need to update + // both the implementation and the configuration at the same time + + const updateBundle = v2.config.ConfigCoder.update.buildTransaction(address, newConfig, context, 'first') + + const tx = { + entrypoint: address, + nonce: commons.transaction.encodeNonce(MIGRATION_NONCE_SPACE, 0), + transactions: [ + { + to: address, + value: 0, + gasLimit: 0, + revertOnError: true, + delegateCall: false, + data: contract.encodeFunctionData(contract.getFunction('updateImplementation'), [context.mainModuleUpgradable]) + }, + ...updateBundle.transactions + ] + } + + return { + tx, + fromVersion: this.version - 1, + toVersion: this.version, + toConfig: newConfig + } + } + + decodeTransaction( + tx: commons.transaction.TransactionBundle, + contexts: commons.context.VersionedContext + ): { + address: string + newImageHash: string + } { + const address = tx.entrypoint + + if (tx.transactions.length < 2) { + throw new Error('Invalid transaction bundle size') + } + + if (!tx.nonce || !commons.transaction.encodeNonce(MIGRATION_NONCE_SPACE, 0).eq(tx.nonce)) { + throw new Error('Invalid transaction bundle nonce') + } + + if ( + tx.transactions[0].to !== address || + tx.transactions[1].to !== address || + tx.transactions[0].delegateCall || + tx.transactions[1].delegateCall || + !tx.transactions[0].revertOnError || + !tx.transactions[1].revertOnError || + (tx.transactions[0].value && !ethers.constants.Zero.eq(tx.transactions[0].value)) || + (tx.transactions[1].value && !ethers.constants.Zero.eq(tx.transactions[1].value)) || + (tx.transactions[0].gasLimit && !ethers.constants.Zero.eq(tx.transactions[0].gasLimit)) || + (tx.transactions[1].gasLimit && !ethers.constants.Zero.eq(tx.transactions[1].gasLimit)) + ) { + throw new Error('Invalid transaction bundle format') + } + + const context = contexts[2] + const contract = new ethers.utils.Interface(walletContracts.mainModule.abi) + + const data1 = ethers.utils.hexlify(tx.transactions[0].data || []) + const expectData1 = ethers.utils.hexlify( + contract.encodeFunctionData(contract.getFunction('updateImplementation'), [context.mainModuleUpgradable]) + ) + + if (data1 !== expectData1) { + throw new Error('Invalid new implementation on transaction') + } + + const decoded2 = v2.config.ConfigCoder.update.decodeTransaction({ entrypoint: address, transactions: [tx.transactions[1]] }) + if (decoded2.address !== address) { + throw new Error('Invalid transaction bundle address') + } + + return decoded2 + } +} diff --git a/packages/migration/src/migrator.ts b/packages/migration/src/migrator.ts new file mode 100644 index 000000000..379197f25 --- /dev/null +++ b/packages/migration/src/migrator.ts @@ -0,0 +1,123 @@ +import { commons } from '@0xsequence/core' +import { Wallet } from '@0xsequence/wallet' +import { ethers } from 'ethers' + +import { Migration } from './migrations' + +export type UnsignedMigration = { + tx: commons.transaction.TransactionBundle + fromVersion: number + toVersion: number + toConfig: commons.config.Config +} + +export type SignedMigration = Omit & { + tx: commons.transaction.SignedTransactionBundle +} + +export interface PresignedMigrationTracker { + getMigration( + address: string, + fromImageHash: string, + fromVersion: number, + chainId: ethers.BigNumberish + ): Promise + + saveMigration(address: string, signed: SignedMigration, contexts: commons.context.VersionedContext): Promise +} + +export type Migrations = { [version: number]: Migration } + +function validateMigrations(migrations: Migrations) { + for (const [version, migration] of Object.entries(migrations)) { + if (version !== String(migration.version - 1)) { + throw new Error(`Migration with key ${version} has version ${migration.version}, expected version to be key + 1`) + } + } +} + +export class Migrator { + constructor( + public readonly tracker: PresignedMigrationTracker, + public readonly migrations: Migrations, + public readonly contexts: commons.context.VersionedContext + ) { + validateMigrations(migrations) + } + + lastMigration(): Migration { + let last: Migration | undefined + for (const migration of Object.values(this.migrations)) { + if (last === undefined || migration.version > last.version) { + last = migration + } + } + if (last === undefined) { + throw new Error('No migrations') + } + return last + } + + async getAllMigratePresignedTransaction(args: { + address: string + fromImageHash: string + fromVersion: number + chainId: ethers.BigNumberish + }): Promise<{ + lastVersion: number + lastImageHash: string + signedMigrations: SignedMigration[] + missing: boolean + }> { + const { address, fromImageHash, fromVersion, chainId } = args + + let fih = fromImageHash + let fversion = fromVersion + + const versions = Object.values(this.contexts) + const migs: SignedMigration[] = [] + + for (let i = 1; i < versions.length; i++) { + const mig = await this.tracker.getMigration(address, fih, fversion, chainId) + if (!mig) return { signedMigrations: migs, missing: true, lastImageHash: fih, lastVersion: fversion } + + migs.push(mig) + + const migration = this.migrations[fversion] + if (!migration) { + throw new Error(`No migration found for version ${fversion}`) + } + + const decoded = migration.decodeTransaction(mig.tx, this.contexts) + if (decoded.address !== address) { + throw new Error(`Migration transaction address does not match expected address`) + } + + fih = decoded.newImageHash + fversion += 1 + } + + return { signedMigrations: migs, missing: false, lastImageHash: fih, lastVersion: fversion } + } + + async signNextMigration( + address: string, + fromVersion: number, + wallet: Wallet, + nextConfig: commons.config.Config + ): Promise { + const migration = this.migrations[fromVersion] + + if (!migration) { + return undefined + } + + const unsignedMigration = migration.buildTransaction(address, this.contexts, nextConfig) + const signedBundle = await wallet.signTransactionBundle(unsignedMigration.tx) + + return { + ...unsignedMigration, + tx: signedBundle + } + } +} diff --git a/packages/migration/src/version.ts b/packages/migration/src/version.ts new file mode 100644 index 000000000..d67a0fdeb --- /dev/null +++ b/packages/migration/src/version.ts @@ -0,0 +1,30 @@ +import { ethers } from 'ethers' +import { commons } from '@0xsequence/core' + +export function counterfactualVersion( + address: string, + firstImageHash: string, + versions: commons.context.WalletContext[] +): number { + for (let i = 0; i < versions.length; i++) { + if (commons.context.addressOf(versions[i], firstImageHash) === address) { + return versions[i].version + } + } + + // if we can't find the version then either the address is invalid, + // the version is not in VersionedContext, or the firstImageHash is not correct + throw new Error('Could not find version for counterfactual address') +} + +export interface Version< + C extends commons.config.Config, + S extends commons.signature.Signature, + U extends commons.signature.UnrecoveredSignature +> { + version: number + coders: { + config: commons.config.ConfigCoder + signature: commons.signature.SignatureCoder + } +} diff --git a/packages/multicall/README.md b/packages/multicall/README.md new file mode 100644 index 000000000..7a16973da --- /dev/null +++ b/packages/multicall/README.md @@ -0,0 +1,169 @@ +@0xsequence/multicall +===================== + +An Ethereum provider wrapper that aggregates multiple operations in one, reducing the network load +on clients and servers. The project aims to be plug-and-play with existing ether.js integrations. + +For more info see [0xsequence project page](https://github.com/0xsequence/sequence.js). + +Inspired by MakerDAO [Multicall.js](https://github.com/makerdao/multicall.js). + +## Installation + +`yarn add @0xsequence/multicall` + +or + +`npm install --save @0xsequence/multicall` + +## Usage + +Sequence Multicall works by implementing `ethers.Provider` and wrapping an existing `ethers.Provider`; this +wrapped provider can transparently aggregate supported JSON-RPC calls. + +```ts +import { providers } from '@0xsequence/multicall' +import { providers as ethersProviders } from 'ethers' + +// MulticallProvider can wrap and extend with multicall functionality +// any ethers.js provider, it's not limited to JsonRpcProvider +const provider = new providers.MulticallProvider(new ethersProviders.JsonRpcProvider("https://cloudflare-eth.com/")) +``` + +### Making aggregated calls + +Multicall leverages RPC calls' asynchronous nature to perform the aggregation; it implements a buffer +with a configurable 50ms delay and aggregates all operations received within that window. + +Explicit usage of the functionality can be forced by making multiple calls using `Promise.all`. + +```ts +// Both requests are aggregated into a single RPC call +const [balance, supply] = await Promise.all([ + provider.getBalance("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"), + dai.totalSupply() +]) +``` + +Methods can also be aggregated without using `Promise.all`, as long as there are no `await` in between calls. + +```ts +// DON'T +const balance = await provider.getBalance("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") +const supply = await dai.totalSupply() + +// DO +const balancePromise = provider.getBalance("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2") +const supplyPromise = dai.totalSupply() + +const balance = await balancePromise +const supply = await supplyPromise +``` + +## Using the provider + +The `MulticallProvider` instance can be used in any context where an ethers.Provider is expected, including +contract interfaces, middlewares, or libraries; all calls to the same provider are candidates for aggregation. + +```ts +// Uses a single JSON-RPC call + +const abi = [ + "function balanceOf(address owner) view returns (uint256)", + "function totalSupply() view returns (uint256)", + "function symbol() view returns (string)", +] + +const uni = new ethers.Contract("0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", abi, provider) +const dai = new ethers.Contract("0x6B175474E89094C44Da98b954EedeAC495271d0F", abi, provider) + +const uniTotalSupplyPromise = uni.totalSupply() + +const [totalSupply, balance, daiSymbol, uniSymbol] = await Promise.all([ + dai.totalSupply(), + dai.balanceOf("0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B"), + dai.symbol(), + uni.symbol() +]) + +const uniTotalSupply = await uniTotalSupplyPromise +``` + + +### Supported methods + +The following JSON-RPC methods are supported for call aggregation: + +-------------------------------------------------------------------------------------------------------------------- +| Method | Supported | Implemented | Notes | +|-----------------|-----------|-------------|----------------------------------------------------------------------| +| eth_call | Yes | Yes | Requests containing `from`, `gasPrice` or `value` aren't aggregated. | +| eth_getBalance | Yes | Yes | | +| eth_getCode | Yes | Yes | | +| eth_blockNumber | Yes | No | | +-------------------------------------------------------------------------------------------------------------------- + +All other RPC methods that are part of the standard are forwarded to the parent provider without any modifications. + +> ⚠️ Using mixed blocktags will make some calls skip aggregation. + + +### Error handling + +The multicall wrapper is designed to work with any exiting ether.js integration transparently; this includes error +handling for cases when multicall fails, is wrongly configured, or the contract does not support it. + +JSON-RPC Calls are forwarded to the parent provider on any of the following cases: +- Multicall contract is not deployed on the given network +- Individual call fails (only failed calls are forwarded) +- Batch call fails (all calls are forwarded) +- Invalid RPC Call (invalid address, etc.) +- Mixed blocktags within a batch +- Unsupported special parameters (see supported methods) +- Unsupported method + + +## Configuration + +The MulticallProvider comes with a pre-defined configuration; it's ready to work out-of-the-box on +the networks: Mainnet, Ropsten, Kovan, Rinkeby, Görli, and Matic (Mainnet). + +```ts +DEFAULT_CONF = { + batchSize: 50, + timeWindow: 50, // ms + contract: "0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E" +} +``` +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Parameter | Required | Description | +|------------|----------|------------------------------------------------------------------------------------------------------------------------------------------------------| +| batchSize | Yes | Defines the maximum number of calls to batch into a single JSON-RPC call. | +| timeWindow | Yes | Defines the time each call is held on buffer waiting for subsequent calls before aggregation, use 0 for "next js tick". | +| contract | Yes | Instance of MultiCallUtils contract, see: https://github.com/0xsequence/wallet-contracts/blob/master/src/contracts/modules/utils/MultiCallUtils.sol | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + + +### Supported networks + +The utility contract is `0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E`, it has been deployed using an [Universal Deployer](https://gist.github.com/Agusx1211/de05dabf918d448d315aa018e2572031) and it uses the same address on all networks. It can be used on any of these chains without configuration changes. + +------------------------------------------------------------------------------------ +| Network | Address | Deployed | +|:-------------------------|:-------------------------------------------|:---------| +| Mainnet | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Görli | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Ropsten | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Rinkeby | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Kovan | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Polygon | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Mumbai (Polygon testnet) | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Arbitrum One | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Arbitrum testnet | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Arbitrum Görli testnet | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| Avalanche | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +| BSC | 0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E | Yes | +------------------------------------------------------------------------------------ + +It can be deployed on any network that supports the `CREATE2` opcode. See https://blockscan.com/address/0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E for live list. + diff --git a/packages/multicall/src/constants.ts b/packages/multicall/src/constants.ts new file mode 100644 index 000000000..624c345ed --- /dev/null +++ b/packages/multicall/src/constants.ts @@ -0,0 +1,5 @@ +export enum JsonRpcMethod { + ethCall = 'eth_call', + ethGetBalance = 'eth_getBalance', + ethGetCode = 'eth_getCode' +} diff --git a/packages/multicall/src/index.ts b/packages/multicall/src/index.ts new file mode 100644 index 000000000..a8b96096c --- /dev/null +++ b/packages/multicall/src/index.ts @@ -0,0 +1,2 @@ +export { Multicall } from './multicall' +export * as providers from './providers' diff --git a/packages/multicall/src/multicall.ts b/packages/multicall/src/multicall.ts new file mode 100644 index 000000000..be217f950 --- /dev/null +++ b/packages/multicall/src/multicall.ts @@ -0,0 +1,321 @@ +import { BigNumber, ethers } from 'ethers' +import { walletContracts } from '@0xsequence/abi' +import { JsonRpcMethod } from './constants' +import { BlockTag, eqBlockTag, parseBlockTag, partition, safeSolve } from './utils' +import { promisify, getRandomInt } from '@0xsequence/utils' +import { JsonRpcVersion, JsonRpcRequest, JsonRpcResponseCallback, JsonRpcHandlerFunc } from '@0xsequence/network' + +export type MulticallOptions = { + // number of calls to enqueue before calling. + batchSize: number + + // number of calls to batch within a time window (in milliseconds). If 0, will disable timeWindow. + timeWindow: number + + // contract is the address of the Sequence MultiCallUtils smart contract where + // the batched multicall is sent to an Ethereum node. + contract: string + + // logs details about aggregated calls + verbose: boolean +} + +type QueueEntry = { + request: JsonRpcRequest + callback: JsonRpcResponseCallback + next: JsonRpcHandlerFunc + error?: boolean + result?: JsonRpcResponseCallback +} + +const DefaultMulticallOptions = { + batchSize: 50, + timeWindow: 50, + // SequenceUtils: v2 + contract: '0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6', + verbose: false +} + +export class Multicall { + public static DefaultOptions = { ...DefaultMulticallOptions } + + readonly batchableJsonRpcMethods = [JsonRpcMethod.ethCall, JsonRpcMethod.ethGetCode, JsonRpcMethod.ethGetBalance] + + readonly multicallInterface = new ethers.utils.Interface(walletContracts.sequenceUtils.abi) + + public options: MulticallOptions + + constructor(options?: Partial) { + this.options = options ? { ...Multicall.DefaultOptions, ...options } : Multicall.DefaultOptions + if (this.options.batchSize <= 0) throw new Error(`Invalid batch size of ${this.options.batchSize}`) + } + + private timeout: NodeJS.Timeout | undefined + private queue = [] as QueueEntry[] + + scheduleExecution = () => { + if (this.queue.length > 0) { + if (this.timeout) clearTimeout(this.timeout) + this.timeout = setTimeout(this.run, this.options.timeWindow) + } + } + + handle = (next: JsonRpcHandlerFunc, request: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + // Schedule for batching and return + if (this.batchableJsonRpcMethods.find(m => m === request.method)) { + this.queue.push({ + request: request, + callback: callback, + next: next + }) + if (this.options.verbose) console.log('Scheduling call', request.method) + this.scheduleExecution() + return + } + + if (this.options.verbose) console.log('Forwarded call', request.method) + + // Move to next handler + return next(request, callback) + } + + run = async () => { + /* eslint-disable no-var */ + if (this.options.verbose) console.log('Processing multicall') + + // Read items from queue + const limit = Math.min(this.options.batchSize, this.queue.length) + if (limit === 0) { + if (this.options.verbose) console.log('Skip multicall, empty queue') + return + } + + // Skip multicall on single item + if (limit === 1) { + this.forward(this.queue[0]) + this.queue = [] + if (this.options.verbose) console.log('Skip multicall, single item') + return + } + + if (this.options.verbose) console.log('Resolving', limit) + + // Get batch from queue + var items = this.queue.slice(0, limit) + + // Update queue + this.queue = limit === this.queue.length ? [] : this.queue.slice(limit) + if (this.options.verbose) console.log('Updated queue', this.queue.length) + + if (this.queue.length !== 0) { + if (this.options.verbose) console.log('Scheduling next batch') + this.scheduleExecution() + } + + // Get next candidate + const next = items[0].next as JsonRpcHandlerFunc + let blockTag: BlockTag | undefined + + // Partition incompatible calls + var [items, discartItems] = partition(items, item => { + try { + // Mixed next callbacks + if (item.next !== next) return false + + switch (item.request.method) { + case JsonRpcMethod.ethCall: + // Unsupported eth_call parameters + if (item.request.params![0].from || item.request.params![0].gasPrice || item.request.params![0].value) { + return false + } + case JsonRpcMethod.ethGetBalance: + case JsonRpcMethod.ethGetCode: + // Mixed blockTags + const itemBlockTag = parseBlockTag(item.request.params![1]) + if (blockTag === undefined) blockTag = itemBlockTag + if (!eqBlockTag(itemBlockTag, blockTag)) return false + } + + return true + } catch { + return false + } + }) + + // Forward discarted items + // end execution if no items remain + if (discartItems.length !== 0) { + if (this.options.verbose) console.log('Forwarding incompatible calls', discartItems.length) + this.forward(discartItems) + if (items.length === 0) { + if (this.options.verbose) console.log('Skip multicall, all calls are incompatible') + return + } + } + + // Aggregate all calls + let callParams = items.map(v => { + try { + switch (v.request.method) { + case JsonRpcMethod.ethCall: + return { + delegateCall: false, + revertOnError: false, + target: v.request.params![0].to, + data: v.request.params![0].data, + gasLimit: v.request.params![0].gas ? v.request.params![0].gas : 0, + value: 0 + } + case JsonRpcMethod.ethGetCode: + return { + delegateCall: false, + revertOnError: false, + target: this.options.contract, + gasLimit: 0, + value: 0, + data: this.multicallInterface.encodeFunctionData(this.multicallInterface.getFunction('callCode'), [ + v.request.params![0] + ]) + } + case JsonRpcMethod.ethGetBalance: + return { + delegateCall: false, + revertOnError: false, + target: this.options.contract, + gasLimit: 0, + value: 0, + data: this.multicallInterface.encodeFunctionData(this.multicallInterface.getFunction('callBalanceOf'), [ + v.request.params![0] + ]) + } + default: + return null + } + } catch { + return null + } + }) + + // Filter calls with enconding errors and forward items + var [items, discartItems] = partition(items, (_, i: number) => callParams[i] !== undefined) + callParams = callParams.filter(c => c) + + if (discartItems.length !== 0) { + if (this.options.verbose) console.log('Forwarding calls on error', discartItems.length) + this.forward(discartItems) + if (items.length === 0) { + if (this.options.verbose) console.log('Skip multicall, all calls had encoding errors') + return + } + } + + // Encode multicall + let encodedCall: string + try { + if (this.options.verbose) console.log('Encoding multicall') + encodedCall = this.multicallInterface.encodeFunctionData(this.multicallInterface.getFunction('multiCall'), [callParams]) + } catch (err) { + if (this.options.verbose) console.warn('Error encoding multicall, forwarding one by one', err) + this.forward(items) + return + } + + // Forward single multicall rpc call + const reqId = getRandomInt() + + // TODO: fix types below.. + + const res = await safeSolve( + // @ts-ignore + promisify(next)({ + id: reqId!, + jsonrpc: JsonRpcVersion!, + method: JsonRpcMethod.ethCall!, + params: [ + { + to: this.options.contract!, + value: 0, + data: encodedCall! + }, + BigNumber.isBigNumber(blockTag) ? blockTag.toNumber() : blockTag + ] + // @ts-ignore + }), + e => ({ + jsonrpc: JsonRpcVersion!, + id: reqId!, + result: undefined, + error: e! + }) + ) + + // Error calling multicall + // Forward all calls to middleware + // @ts-ignore + if (res.error) { + if (this.options.verbose) console.warn('Error calling multicall, forwarding one by one', res.error) + return this.forward(items) + } + + // Decode result from multicall + let decoded: ethers.utils.Result + try { + // @ts-ignore + decoded = this.multicallInterface.decodeFunctionResult(this.multicallInterface.getFunction('multiCall'), res.result) + } catch (err) { + if (this.options.verbose) console.warn('Error decoding multicall result, forwarding one by one', err) + this.forward(items) + return + } + + // Send results for each request + // errors fallback through the middleware + if (this.options.verbose) console.log('Got response for', items.length) + items.forEach((item, index) => { + if (!decoded[0][index]) { + if (this.options.verbose) console.warn(`Multicall error for ${item.request.method} not found`) + this.forward(item) + } else { + switch (item.request.method) { + case JsonRpcMethod.ethCall: + item.callback(undefined, { + jsonrpc: item.request.jsonrpc!, + id: item.request.id!, + result: decoded[1][index] + }) + break + case JsonRpcMethod.ethGetCode: + item.callback(undefined, { + jsonrpc: item.request.jsonrpc!, + id: item.request.id!, + result: ethers.utils.defaultAbiCoder.decode(['bytes'], decoded[1][index])[0] + }) + break + case JsonRpcMethod.ethGetBalance: + item.callback(undefined, { + jsonrpc: item.request.jsonrpc!, + id: item.request.id!, + result: ethers.utils.defaultAbiCoder.decode(['uint256'], decoded[1][index])[0] + }) + break + } + } + }) + } + + private forward(entries: QueueEntry[] | QueueEntry) { + if (Array.isArray(entries)) { + entries.forEach(e => e.next(e.request, e.callback)) + } else { + entries.next(entries.request, entries.callback) + } + } + + static isMulticall(cand: any): cand is Multicall { + return cand && cand.handle !== undefined && cand.conf !== undefined && Multicall.isMulticallOptions(cand.options) + } + + static isMulticallOptions(cand: any): cand is MulticallOptions { + return cand !== undefined && cand.batchSize !== undefined && cand.timeWindow !== undefined && cand.contract !== undefined + } +} diff --git a/packages/multicall/src/providers/external-provider.ts b/packages/multicall/src/providers/external-provider.ts new file mode 100644 index 000000000..e9390369d --- /dev/null +++ b/packages/multicall/src/providers/external-provider.ts @@ -0,0 +1,44 @@ +import { providers } from 'ethers' +import { Multicall, MulticallOptions } from '../multicall' +import { JsonRpcRequest, JsonRpcResponseCallback } from '@0xsequence/network' + +type ExternalProvider = providers.ExternalProvider + +export class MulticallExternalProvider implements ExternalProvider { + private multicall: Multicall + + constructor( + private provider: providers.ExternalProvider, + multicall?: Multicall | Partial + ) { + this.multicall = Multicall.isMulticall(multicall) ? multicall : new Multicall(multicall!) + + if (provider.send) { + const next = async (req: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + provider.send!(req, callback) + } + + ;(this as any).send = (request: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + this.multicall.handle(next, request, callback) + } + } + + if (provider.sendAsync) { + const next = async (req: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + provider.sendAsync!(req, callback) + } + + ;(this as any).sendAsync = (request: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + this.multicall.handle(next, request, callback) + } + } + } + + public get isMetaMask() { + return this.provider.isMetaMask + } + + public get isStatus() { + return this.provider.isStatus + } +} diff --git a/packages/multicall/src/providers/index.ts b/packages/multicall/src/providers/index.ts new file mode 100644 index 000000000..45ab3938e --- /dev/null +++ b/packages/multicall/src/providers/index.ts @@ -0,0 +1,3 @@ +export * from './provider' +export * from './external-provider' +export * from './provider-middleware' diff --git a/packages/multicall/src/providers/provider-middleware.ts b/packages/multicall/src/providers/provider-middleware.ts new file mode 100644 index 000000000..0bda937aa --- /dev/null +++ b/packages/multicall/src/providers/provider-middleware.ts @@ -0,0 +1,11 @@ +import { Multicall, MulticallOptions } from '../multicall' +import { JsonRpcRequest, JsonRpcResponseCallback, JsonRpcHandlerFunc, JsonRpcMiddleware } from '@0xsequence/network' + +export const multicallMiddleware = + (multicall?: Multicall | Partial): JsonRpcMiddleware => + (next: JsonRpcHandlerFunc) => { + const lib = Multicall.isMulticall(multicall) ? multicall : new Multicall(multicall!) + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + return lib.handle(next, request, callback) + } + } diff --git a/packages/multicall/src/providers/provider.ts b/packages/multicall/src/providers/provider.ts new file mode 100644 index 000000000..199ddf5d4 --- /dev/null +++ b/packages/multicall/src/providers/provider.ts @@ -0,0 +1,119 @@ +import { ethers, BigNumber, utils } from 'ethers' +import { promisify, getRandomInt } from '@0xsequence/utils' +import { Multicall, MulticallOptions } from '../multicall' +import { JsonRpcMethod } from '../constants' +import { JsonRpcVersion, JsonRpcRequest, JsonRpcResponseCallback } from '@0xsequence/network' + +export const ProxyMethods = [ + 'getNetwork', + 'getBlockNumber', + 'getGasPrice', + 'getTransactionCount', + 'getStorageAt', + 'sendTransaction', + 'estimateGas', + 'getBlock', + 'getTransaction', + 'getTransactionReceipt', + 'getLogs', + 'emit', + 'litenerCount', + 'addListener', + 'removeListener', + 'waitForTransaction', + 'detectNetwork', + 'getBlockWithTransactions' +] + +export class MulticallProvider extends ethers.providers.BaseProvider { + private multicall: Multicall + + constructor( + private provider: ethers.providers.Provider, + multicall?: Multicall | Partial + ) { + super(provider.getNetwork()) + + this.listenerCount = provider.listenerCount.bind(provider) + this.multicall = Multicall.isMulticall(multicall) ? multicall : new Multicall(multicall) + + ProxyMethods.forEach(m => { + if ((provider as any)[m] !== undefined) { + ;(this as any)[m] = (...args: any) => (provider as any)[m](...args) + } + }) + } + + getResolver = async (name: string | Promise) => { + const provider = this.provider as ethers.providers.BaseProvider + + if (provider.getResolver) { + const ogResolver = await provider.getResolver(await name) + if (!ogResolver) return null + return new ethers.providers.Resolver(this as any, ogResolver.address, ogResolver.name) + } + + return provider.getResolver(await name) + } + + next = async (req: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + try { + switch (req.method) { + case JsonRpcMethod.ethCall: + this.callback(req, callback, await this.provider.call(req.params![0], req.params![1])) + break + + case JsonRpcMethod.ethGetCode: + this.callback(req, callback, await this.provider.getCode(req.params![0], req.params![1])) + break + + case JsonRpcMethod.ethGetBalance: + this.callback(req, callback, await this.provider.getBalance(req.params![0], req.params![1])) + break + } + } catch (e) { + this.callback(req, callback, undefined, e) + } + } + + private callback(req: JsonRpcRequest, callback: JsonRpcResponseCallback, resp: any, err?: any) { + callback(err, { + jsonrpc: JsonRpcVersion, + id: req.id!, + result: resp, + error: err + }) + } + + async call( + transaction: utils.Deferrable, + blockTag?: string | number | Promise + ): Promise { + return this.rpcCall(JsonRpcMethod.ethCall, transaction, blockTag) + } + + async getCode( + addressOrName: string | Promise, + blockTag?: string | number | Promise + ): Promise { + return this.rpcCall(JsonRpcMethod.ethGetCode, addressOrName, blockTag) + } + + async getBalance( + addressOrName: string | Promise, + blockTag?: string | number | Promise + ): Promise { + return this.rpcCall(JsonRpcMethod.ethGetBalance, addressOrName, blockTag) + } + + async rpcCall(method: string, ...params: any[]): Promise { + const reqId = getRandomInt() + const resp = await promisify(this.multicall.handle)(this.next, { + jsonrpc: JsonRpcVersion, + id: reqId, + method: method, + params: params + }) + return resp!.result + } +} diff --git a/packages/multicall/src/types.ts b/packages/multicall/src/types.ts new file mode 100644 index 000000000..7d665bb12 --- /dev/null +++ b/packages/multicall/src/types.ts @@ -0,0 +1,8 @@ +export type Call = () => Promise + +export type CallResult = { + call: Call + success: boolean + result: Array + outputs?: Array +} diff --git a/packages/multicall/src/utils.ts b/packages/multicall/src/utils.ts new file mode 100644 index 000000000..48557bbc5 --- /dev/null +++ b/packages/multicall/src/utils.ts @@ -0,0 +1,47 @@ +import { BigNumber, BigNumberish } from 'ethers' + +export async function safeSolve(promise: Promise, def: T | ((e: any) => T)): Promise { + try { + return await promise + } catch (e) { + const d = def instanceof Function ? def(e) : def + return d + } +} + +export function partition(array: T[], callback: (v: T, i: number) => boolean): [T[], T[]] { + return array.reduce( + function (result, element, i) { + callback(element, i) ? result[0].push(element) : result[1].push(element) + return result + }, + [[] as any[], [] as any[]] + ) +} + +export type BlockTag = 'earliest' | 'latest' | 'pending' | BigNumber + +export function parseBlockTag(cand: string | BigNumberish | undefined): BlockTag { + if (cand === undefined) return 'latest' + + switch (cand) { + case 'earliest': + case 'latest': + case 'pending': + return cand + } + + return BigNumber.from(cand) +} + +export function eqBlockTag(a: BlockTag, b: BlockTag): boolean { + if (a === b) return true + + if (BigNumber.isBigNumber(a)) { + if (BigNumber.isBigNumber(b)) return a.eq(b) + return false + } + + if (BigNumber.isBigNumber(b)) return false + return a === b +} diff --git a/packages/multicall/tests/multicall.spec.ts b/packages/multicall/tests/multicall.spec.ts new file mode 100644 index 000000000..0a00f9767 --- /dev/null +++ b/packages/multicall/tests/multicall.spec.ts @@ -0,0 +1,600 @@ +import { ethers, providers, Signer } from 'ethers' +import * as Ganache from 'ganache' +import { CallReceiverMock } from '@0xsequence/wallet-contracts' +import { JsonRpcRouter, JsonRpcExternalProvider } from '@0xsequence/network' + +import chaiAsPromised from 'chai-as-promised' +import * as chai from 'chai' +import { MulticallExternalProvider, multicallMiddleware, MulticallProvider } from '../src/providers' +import { SpyProxy } from './utils' +import { getRandomInt } from '@0xsequence/utils' +import { JsonRpcMethod } from '../src/constants' +import { MulticallOptions, Multicall } from '../src/multicall' + +const { JsonRpcEngine } = require('json-rpc-engine') + +const { providerAsMiddleware, providerFromEngine } = require('eth-json-rpc-middleware') + +const CallReceiverMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/CallReceiverMock.sol/CallReceiverMock.json') +const SequenceUtilsArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/modules/utils/SequenceUtils.sol/SequenceUtils.json') + +import Web3 from 'web3' +const { expect } = chai.use(chaiAsPromised) + +const GANACHE_PORT = 38546 + +type GanacheInstance = { + server?: any + serverUri?: string + provider?: providers.JsonRpcProvider + spyProxy?: providers.JsonRpcProvider + signer?: Signer + chainId?: number +} + +describe('Multicall integration', function () { + const ganache: GanacheInstance = {} + let provider: ethers.providers.Provider + let brokenProvider: ethers.providers.Provider + + let callMock: CallReceiverMock + + let utilsContract: ethers.Contract + + let callCounter = 0 + let accounts: { account: ethers.Wallet; secretKey: string; balance: string }[] + + before(async () => { + accounts = Array(5) + .fill(0) + .map(() => { + const account = ethers.Wallet.createRandom() + return { + account: account, + secretKey: account.privateKey, + balance: ethers.utils.hexlify(ethers.utils.randomBytes(9)) + } + }) + + // Deploy Ganache test env + ganache.chainId = 1337 + ganache.server = Ganache.server({ + chain: { + chainId: ganache.chainId, + networkId: ganache.chainId + }, + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee', + accounts: accounts, + logging: { + verbose: false, + debug: false, + logger: undefined + } + }) + + // TODO: use hardhat instead like in wallet/wallet.spec.ts + + await ganache.server.listen(GANACHE_PORT) + ganache.serverUri = `http://127.0.0.1:${GANACHE_PORT}/` + ganache.provider = new providers.JsonRpcProvider(ganache.serverUri) + ganache.signer = ganache.provider.getSigner() + + utilsContract = await new ethers.ContractFactory( + SequenceUtilsArtifact.abi, + SequenceUtilsArtifact.bytecode, + ganache.signer + ).deploy(ethers.constants.AddressZero, ethers.constants.AddressZero) + + // Create provider + ganache.spyProxy = SpyProxy( + ganache.provider, + { + prop: 'call', + func: ganache.provider.call, + callback: () => { + callCounter++ + } + }, + { + prop: 'getCode', + func: ganache.provider.getCode, + callback: () => { + callCounter++ + } + }, + { + prop: 'getBalance', + func: ganache.provider.getBalance, + callback: () => { + callCounter++ + } + }, + { + prop: 'send', + func: ganache.provider.send, + callback: (method: string, _: any[]) => { + switch (method) { + case JsonRpcMethod.ethCall: + case JsonRpcMethod.ethGetCode: + case JsonRpcMethod.ethGetBalance: + callCounter++ + } + } + } + ) + + callMock = await createCallMock() + }) + + async function createCallMock() { + return (await new ethers.ContractFactory( + CallReceiverMockArtifact.abi, + CallReceiverMockArtifact.bytecode, + ganache.signer + ).deploy()) as unknown as CallReceiverMock + } + + const options = [ + { + name: 'Ether.js provider wrapper', + provider: (options?: Partial) => new MulticallProvider(ganache.spyProxy!, options) + }, + { + name: 'Json Rpc Router (Sequence)', + provider: (options?: Partial) => + new providers.Web3Provider( + new JsonRpcRouter([multicallMiddleware(options)], new JsonRpcExternalProvider(ganache.spyProxy!)) + ) + }, + { + name: 'Ether.js external provider wrapper', + provider: (conf?: Partial) => + new providers.Web3Provider(new MulticallExternalProvider(new JsonRpcExternalProvider(ganache.spyProxy!), conf)) + }, + { + name: 'Provider Engine (json-rpc-engine)', + provider: (conf?: Partial) => { + const engine = new JsonRpcEngine() + + engine.push(providerAsMiddleware(new MulticallExternalProvider(new JsonRpcExternalProvider(ganache.spyProxy!), conf))) + + return new ethers.providers.Web3Provider(providerFromEngine(engine)) + } + }, + { + name: 'Web3 external provider wrapper', + provider: (conf?: Partial) => { + const web3HttpProvider = new Web3.providers.HttpProvider(ganache.serverUri!) + const spyHttpProvider = SpyProxy(web3HttpProvider, { + prop: 'send', + func: web3HttpProvider.send, + callback: (p: any) => { + switch (p.method) { + case JsonRpcMethod.ethCall: + case JsonRpcMethod.ethGetCode: + case JsonRpcMethod.ethGetBalance: + callCounter++ + } + } + }) + return new providers.Web3Provider(new MulticallExternalProvider(spyHttpProvider as any, conf)) + } + }, + { + name: 'Ether.js provider wrapper (without proxy)', + provider: (options?: Partial) => new MulticallProvider(ganache.provider!, options), + ignoreCount: true + }, + { + name: 'Json Rpc Router (Sequence) (without proxy)', + provider: (options?: Partial) => + new providers.Web3Provider( + new JsonRpcRouter([multicallMiddleware(options)], new JsonRpcExternalProvider(ganache.provider!)) + ), + ignoreCount: true + }, + { + name: 'Ether.js external provider wrapper (without proxy)', + provider: (conf?: Partial) => + new providers.Web3Provider(new MulticallExternalProvider(new JsonRpcExternalProvider(ganache.provider!), conf)), + ignoreCount: true + }, + { + name: 'Provider Engine (json-rpc-engine) (without proxy)', + provider: (conf?: Partial) => { + const engine = new JsonRpcEngine() + + engine.push(providerAsMiddleware(new MulticallExternalProvider(new JsonRpcExternalProvider(ganache.provider!), conf))) + + return new ethers.providers.Web3Provider(providerFromEngine(engine)) + }, + ignoreCount: true + }, + { + name: 'Web3 external provider wrapper (without proxy)', + provider: (conf?: Partial) => { + const web3HttpProvider = new Web3.providers.HttpProvider(ganache.serverUri!) + const spyHttpProvider = SpyProxy(web3HttpProvider, { + prop: 'send', + func: web3HttpProvider.send, + callback: (p: any) => { + switch (p.method) { + case JsonRpcMethod.ethCall: + case JsonRpcMethod.ethGetCode: + case JsonRpcMethod.ethGetBalance: + callCounter++ + } + } + }) + return new providers.Web3Provider(new MulticallExternalProvider(web3HttpProvider as any, conf)) + }, + ignoreCount: true + } + ] + + beforeEach(() => { + callCounter = 0 + }) + + after(async () => { + ganache.server.close() + }) + + options.map(option => { + context(option.name, () => { + beforeEach(() => { + provider = option.provider({ contract: utilsContract.address, timeWindow: 500 }) + }) + + describe('Aggregate calls', async () => { + it('Should aggregate two calls', async () => { + await callMock.testCall(848487868126387, '0x001122') + + const multiCallMock = callMock.connect(provider) + const promiseA = multiCallMock.lastValA() + const promiseB = multiCallMock.lastValB() + + expect((await promiseA).toString()).to.equal('848487868126387') + expect(await promiseB).to.equal('0x001122') + + if (option.ignoreCount) return + expect(callCounter).to.equal(1) + }) + it('Should aggregate three calls', async () => { + const callMockB = await createCallMock() + + const randomData1 = ethers.utils.hexlify(ethers.utils.randomBytes(33)) + const randomData2 = ethers.utils.hexlify(ethers.utils.randomBytes(42)) + + await callMock.testCall(55122, randomData1) + await callMockB.testCall(2, randomData2) + + const multiCallMock = callMock.connect(provider) + const multiCallMockB = callMockB.connect(provider) + + const promiseA = multiCallMock.lastValA() + + const [valB, valC] = await Promise.all([multiCallMock.lastValB(), multiCallMockB.lastValB()]) + + expect((await promiseA).toString()).to.equal('55122') + expect(valB).to.equal(randomData1) + expect(valC).to.equal(randomData2) + + if (option.ignoreCount) return + expect(callCounter).to.equal(1) + }) + it('Should aggregate 62 calls in two batches', async () => { + const callMocks = await Promise.all( + Array(62) + .fill(0) + .map(() => createCallMock()) + ) + + const randomValues = Array(62) + .fill(0) + .map(() => ethers.utils.hexlify(ethers.utils.randomBytes(getRandomInt(0, 41)))) + await Promise.all(randomValues.map((v, i) => callMocks[i].testCall(0, v))) + + const values = await Promise.all(callMocks.map(c => c.connect(provider).lastValB())) + values.forEach((v, i) => expect(v).to.equal(randomValues[i])) + + if (option.ignoreCount) return + expect(callCounter).to.equal(2) + }) + it('Should aggregate in three batches :: queue > batch after first run', async () => { + const numberOfCalls = Multicall.DefaultOptions.batchSize * 2 + 2 + const mid = numberOfCalls / 2 // Split Promise.all to not break RPC calls + + let callMocks = await Promise.all( + Array(mid) + .fill(0) + .map(() => createCallMock()) + ) + callMocks = [ + ...callMocks, + ...(await Promise.all( + Array(mid) + .fill(0) + .map(() => createCallMock()) + )) + ] + + const randomValues = Array(numberOfCalls) + .fill(0) + .map(() => ethers.utils.hexlify(ethers.utils.randomBytes(getRandomInt(0, 41)))) + await Promise.all(randomValues.slice(0, mid).map((v, i) => callMocks[i].testCall(0, v))) + await Promise.all(randomValues.slice(mid).map((v, i) => callMocks[i + mid].testCall(0, v))) + + const values = await Promise.all(callMocks.map(c => c.connect(provider).lastValB())) + values.forEach((v, i) => expect(v).to.equal(randomValues[i])) + + if (option.ignoreCount) return + expect(callCounter).to.equal(3) + }) + it('Should call eth_getCode', async () => { + const code = await Promise.all([provider.getCode(callMock.address), provider.getCode(utilsContract.address)]) + + if (!option.ignoreCount) expect(callCounter).to.equal(1) + + const rawCode = await Promise.all([ + ganache.provider!.getCode(callMock.address), + ganache.provider!.getCode(utilsContract.address) + ]) + + expect(rawCode[0]).to.equal(code[0]) + expect(rawCode[1]).to.equal(code[1]) + }) + it('Should mix eth_getCode and eth_call', async () => { + await callMock.testCall(0, '0x9952') + + const multiCallMock = callMock.connect(provider) + const promiseA = provider.getCode(callMock.address) + const promiseB = multiCallMock.lastValB() + + expect(await promiseA).to.equal(await ganache.provider!.getCode(callMock.address)) + expect(await promiseB).to.equal('0x9952') + + if (option.ignoreCount) return + expect(callCounter).to.equal(1) + }) + it('Should call eth_getBalance', async () => { + const randomAddress = ethers.Wallet.createRandom().address + + const balances = await Promise.all([ + provider.getBalance(accounts[2].account.address), + provider.getBalance(accounts[1].account.address), + provider.getBalance(accounts[2].account.address), + provider.getBalance(randomAddress) + ]) + + if (!option.ignoreCount) expect(callCounter).to.equal(1) + + // expect(callCounter).to.equal(1) + const rawBalances = await Promise.all([ + ganache.provider!.getBalance(accounts[2].account.address), + ganache.provider!.getBalance(accounts[1].account.address), + ganache.provider!.getBalance(accounts[2].account.address), + ganache.provider!.getBalance(randomAddress) + ]) + + rawBalances.forEach((bal, i) => { + expect(balances[i].toHexString()).to.equal(bal.toHexString()) + }) + }) + it('Should call eth_getBalance and eth_getCode', async () => { + const promiseA = provider.getCode(callMock.address) + const promiseB = await provider.getBalance(accounts[3].account.address) + + expect(await promiseA).to.equal(await ganache.provider!.getCode(callMock.address)) + expect(promiseB.toHexString()).to.equal((await ganache.provider!.getBalance(accounts[3].account.address)).toHexString()) + + if (option.ignoreCount) return + expect(callCounter).to.equal(1) + }) + }) + describe('Handle errors', async () => { + it('Should not retry after failing to execute single call (not multicalled)', async () => { + const callMockB = await createCallMock() + + await callMockB.setRevertFlag(true) + + const multiCallMockB = callMockB.connect(provider) + + // await expect(multiCallMockB.callStatic.testCall(1, "0x1122")).to.be.rejectedWith('VM Exception while processing transaction: revert CallReceiverMock#testCall: REVERT_FLAG') + await expect(multiCallMockB.callStatic.testCall(1, '0x1122')).to.be.rejectedWith(/Transaction reverted/) + + if (option.ignoreCount) return + expect(callCounter).to.equal(1) + }) + it('Should retry after failing to execute using batch', async () => { + const callMockB = await createCallMock() + + await callMockB.setRevertFlag(true) + + const multiCallMockB = callMockB.connect(provider) + + // await expect(Promise.all([ + // multiCallMockB.callStatic.testCall(1, "0x1122"), + // multiCallMockB.callStatic.testCall(2, "0x1122") + // ])).to.be.rejectedWith('VM Exception while processing transaction: revert CallReceiverMock#testCall: REVERT_FLAG') + await expect( + Promise.all([multiCallMockB.callStatic.testCall(1, '0x1122'), multiCallMockB.callStatic.testCall(2, '0x1122')]) + ).to.be.rejectedWith(/Transaction reverted/) + + if (option.ignoreCount) return + expect(callCounter).to.equal(3) + }) + + it('Should call getStorageAt', async () => { + const random = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + await callMock.testCall(random, '0x00') + const storageAt = ethers.utils.hexZeroPad(await provider.getStorageAt(callMock.address, 0), 32) + expect(storageAt).to.equal(ethers.utils.defaultAbiCoder.encode(['bytes32'], [random])) + }) + + it('Should call getStorageAt with padding', async () => { + const val = '0x001a6077bf4f6eae0b4d9158b68bc770c97e5ef19efffcfa28aec2bce13cae24' + await callMock.testCall(val, '0x00') + const storageAt = ethers.utils.hexZeroPad(await provider.getStorageAt(callMock.address, 0), 32) + expect(storageAt).to.equal(ethers.utils.defaultAbiCoder.encode(['bytes32'], [val])) + }) + + it('Should detect network', async () => { + const net = await (provider as ethers.providers.BaseProvider).detectNetwork() + expect(net.chainId).to.equal(1337) + }) + + // TODO: fix this test, its breaking on macOS node v15.12.0 + /*it("Should execute batch with errors on it", async () => { + const callMockB = await createCallMock() + + callMockB.testCall(1, "0x1122") + + await callMockB.setRevertFlag(true) + + const multiCallMockB = callMockB.connect(provider) + + const errorPromise = multiCallMockB.callStatic.testCall(1, "0x1122") + + const res = await Promise.all([ + provider.getCode(multiCallMockB.address), + multiCallMockB.lastValB() + ]) + + await expect(errorPromise).to.be.rejected + + expect(res[0].length).to.not.equal(0) + expect(res[1]).to.equal("0x1122") + expect(callCounter).to.equal(2) + })*/ + + const brokenProviderOptions = [ + { + name: 'non-deployed util contract', + overhead: 0, + brokenProvider: (getProvider: (options?: Partial) => providers.Provider) => + getProvider({ + contract: '' + }) + }, + { + name: 'EOA address as util contract', + overhead: 1, + brokenProvider: (getProvider: (options?: Partial) => providers.Provider) => + getProvider({ + contract: ethers.Wallet.createRandom().address + }) + }, + { + name: 'Broken contract as util contract', + overhead: 1, + brokenProvider: (getProvider: (options?: Partial) => providers.Provider) => + getProvider({ + contract: callMock.address + }) + }, + { + name: 'invalid address as util contract', + overhead: 0, + brokenProvider: (getProvider: (options?: Partial) => providers.Provider) => + getProvider({ + contract: 'This is not a valid address' + }) + } + ] + + brokenProviderOptions.map(brokenOption => + context(brokenOption.name, () => { + beforeEach(() => { + brokenProvider = brokenOption.brokenProvider(option.provider) + }) + + it('Should fallback to provider if multicall fails eth_getCode', async () => { + const code = await Promise.all([ + brokenProvider.getCode(callMock.address), + brokenProvider.getCode(utilsContract.address) + ]) + + if (!option.ignoreCount) expect(callCounter).to.equal(2 + brokenOption.overhead) + const rawCode = await Promise.all([ + ganache.provider!.getCode(callMock.address), + ganache.provider!.getCode(utilsContract.address) + ]) + + expect(rawCode[0]).to.equal(code[0]) + expect(rawCode[1]).to.equal(code[1]) + }) + + it('Should fallback to provider if multicall fails eth_call', async () => { + await callMock.testCall(848487868126387, '0x001122') + + const multiCallMock = callMock.connect(brokenProvider) + const promiseA = multiCallMock.lastValA() + const promiseB = multiCallMock.lastValB() + + expect((await promiseA).toString()).to.equal('848487868126387') + expect(await promiseB).to.equal('0x001122') + + if (option.ignoreCount) return + expect(callCounter).to.equal(3) + }) + + it('Should fallback to provider if multicall fails eth_call and eth_getCode', async () => { + await callMock.testCall(848487868126387, '0x001122') + + const multiCallMock = callMock.connect(brokenProvider) + const promiseA = multiCallMock.lastValA() + const promiseB = multiCallMock.lastValB() + const promiseC = brokenProvider.getCode(callMock.address) + + expect((await promiseA).toString()).to.equal('848487868126387') + expect(await promiseB).to.equal('0x001122') + expect(await promiseC).to.equal(await provider.getCode(callMock.address)) + + if (option.ignoreCount) return + expect(callCounter).to.equal(4 + brokenOption.overhead) + }) + + it('Should fallback to provider if multicall fails eth_getBalance', async () => { + const randomAddress = ethers.Wallet.createRandom().address + + const balances = await Promise.all([ + brokenProvider.getBalance(accounts[2].account.address), + brokenProvider.getBalance(accounts[1].account.address), + brokenProvider.getBalance(accounts[2].account.address), + brokenProvider.getBalance(randomAddress) + ]) + + if (!option.ignoreCount) expect(callCounter).to.equal(4 + brokenOption.overhead) + + // expect(callCounter).to.equal(1) + const rawBalances = await Promise.all([ + ganache.provider!.getBalance(accounts[2].account.address), + ganache.provider!.getBalance(accounts[1].account.address), + ganache.provider!.getBalance(accounts[2].account.address), + ganache.provider!.getBalance(randomAddress) + ]) + + rawBalances.forEach((bal, i) => { + expect(balances[i].toHexString()).to.equal(bal.toHexString()) + }) + }) + + it('Should fallback to provider if multicall fails eth_getBalance and eth_getCode', async () => { + const promiseA = brokenProvider.getCode(callMock.address) + const promiseB = await brokenProvider.getBalance(accounts[3].account.address) + + expect(await promiseA).to.equal(await ganache.provider!.getCode(callMock.address)) + expect(promiseB.toHexString()).to.equal( + (await ganache.provider!.getBalance(accounts[3].account.address)).toHexString() + ) + + if (option.ignoreCount) return + expect(callCounter).to.equal(2 + brokenOption.overhead) + }) + }) + ) + }) + }) + }) +}) diff --git a/packages/multicall/tests/utils/index.ts b/packages/multicall/tests/utils/index.ts new file mode 100644 index 000000000..be4c722d7 --- /dev/null +++ b/packages/multicall/tests/utils/index.ts @@ -0,0 +1,33 @@ +export type SpyProxyHooks any> = { + prop: keyof K + func: T + callback: (...params: Parameters) => boolean | void +} + +export const SpyProxy = (obj: T, ...hooks: SpyProxyHooks any>[]): T => { + const handler = { + get: function (target: T, prop: keyof T, receiver: any) { + if (target[prop] instanceof Function) { + return (...p: any): any => { + if ( + !hooks + .filter(h => h.prop === prop) + .map(f => f.callback(...p)) + .reduce((p, c) => p || c, false) + ) { + return (obj[prop] as unknown as Function)(...p) + } + } + } + + if (Object.getPrototypeOf(obj)[prop] !== null) { + return obj[prop] + } + + return Reflect.get(target, prop, receiver) + } + } + + // @ts-ignore + return new Proxy(obj, handler) +} diff --git a/packages/network/CHANGELOG.md b/packages/network/CHANGELOG.md new file mode 100644 index 000000000..5e924927e --- /dev/null +++ b/packages/network/CHANGELOG.md @@ -0,0 +1,2749 @@ +# @0xsequence/network + +## 1.10.8 + +### Patch Changes + +- update metadata bindings +- Updated dependencies + - @0xsequence/core@1.10.8 + - @0xsequence/indexer@1.10.8 + - @0xsequence/relayer@1.10.8 + - @0xsequence/utils@1.10.8 + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client +- Updated dependencies + - @0xsequence/core@1.10.7 + - @0xsequence/indexer@1.10.7 + - @0xsequence/relayer@1.10.7 + - @0xsequence/utils@1.10.7 + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/core@1.10.6 + - @0xsequence/indexer@1.10.6 + - @0xsequence/relayer@1.10.6 + - @0xsequence/utils@1.10.6 + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet +- Updated dependencies + - @0xsequence/core@1.10.5 + - @0xsequence/indexer@1.10.5 + - @0xsequence/relayer@1.10.5 + - @0xsequence/utils@1.10.5 + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia +- Updated dependencies + - @0xsequence/core@1.10.4 + - @0xsequence/indexer@1.10.4 + - @0xsequence/relayer@1.10.4 + - @0xsequence/utils@1.10.4 + +## 1.10.3 + +### Patch Changes + +- typing fix +- Updated dependencies + - @0xsequence/core@1.10.3 + - @0xsequence/indexer@1.10.3 + - @0xsequence/relayer@1.10.3 + - @0xsequence/utils@1.10.3 + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client +- Updated dependencies + - @0xsequence/core@1.10.2 + - @0xsequence/indexer@1.10.2 + - @0xsequence/relayer@1.10.2 + - @0xsequence/utils@1.10.2 + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/core@1.10.1 + - @0xsequence/indexer@1.10.1 + - @0xsequence/relayer@1.10.1 + - @0xsequence/utils@1.10.1 + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.10.0 + - @0xsequence/indexer@1.10.0 + - @0xsequence/relayer@1.10.0 + - @0xsequence/utils@1.10.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants +- Updated dependencies + - @0xsequence/core@1.9.37 + - @0xsequence/indexer@1.9.37 + - @0xsequence/relayer@1.9.37 + - @0xsequence/utils@1.9.37 + +## 1.9.36 + +### Patch Changes + +- guard: export client +- Updated dependencies + - @0xsequence/core@1.9.36 + - @0xsequence/indexer@1.9.36 + - @0xsequence/relayer@1.9.36 + - @0xsequence/utils@1.9.36 + +## 1.9.35 + +### Patch Changes + +- guard: update bindings +- Updated dependencies + - @0xsequence/core@1.9.35 + - @0xsequence/indexer@1.9.35 + - @0xsequence/relayer@1.9.35 + - @0xsequence/utils@1.9.35 + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email +- Updated dependencies + - @0xsequence/core@1.9.34 + - @0xsequence/indexer@1.9.34 + - @0xsequence/relayer@1.9.34 + - @0xsequence/utils@1.9.34 + +## 1.9.33 + +### Patch Changes + +- waas: umd build +- Updated dependencies + - @0xsequence/core@1.9.33 + - @0xsequence/indexer@1.9.33 + - @0xsequence/relayer@1.9.33 + - @0xsequence/utils@1.9.33 + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings +- Updated dependencies + - @0xsequence/core@1.9.32 + - @0xsequence/indexer@1.9.32 + - @0xsequence/relayer@1.9.32 + - @0xsequence/utils@1.9.32 + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes +- Updated dependencies + - @0xsequence/core@1.9.31 + - @0xsequence/indexer@1.9.31 + - @0xsequence/relayer@1.9.31 + - @0xsequence/utils@1.9.31 + +## 1.9.30 + +### Patch Changes + +- update +- Updated dependencies + - @0xsequence/core@1.9.30 + - @0xsequence/indexer@1.9.30 + - @0xsequence/relayer@1.9.30 + - @0xsequence/utils@1.9.30 + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain +- Updated dependencies + - @0xsequence/core@1.9.29 + - @0xsequence/indexer@1.9.29 + - @0xsequence/relayer@1.9.29 + - @0xsequence/utils@1.9.29 + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree +- Updated dependencies + - @0xsequence/core@1.9.28 + - @0xsequence/indexer@1.9.28 + - @0xsequence/relayer@1.9.28 + - @0xsequence/utils@1.9.28 + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.9.27 + - @0xsequence/indexer@1.9.27 + - @0xsequence/relayer@1.9.27 + - @0xsequence/utils@1.9.27 + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 +- Updated dependencies + - @0xsequence/core@1.9.26 + - @0xsequence/indexer@1.9.26 + - @0xsequence/relayer@1.9.26 + - @0xsequence/utils@1.9.26 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types +- Updated dependencies + - @0xsequence/core@1.9.25 + - @0xsequence/indexer@1.9.25 + - @0xsequence/relayer@1.9.25 + - @0xsequence/utils@1.9.25 + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore +- Updated dependencies + - @0xsequence/core@1.9.24 + - @0xsequence/indexer@1.9.24 + - @0xsequence/relayer@1.9.24 + - @0xsequence/utils@1.9.24 + +## 1.9.23 + +### Patch Changes + +- update api client bindings +- Updated dependencies + - @0xsequence/core@1.9.23 + - @0xsequence/indexer@1.9.23 + - @0xsequence/relayer@1.9.23 + - @0xsequence/utils@1.9.23 + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings +- Updated dependencies + - @0xsequence/core@1.9.22 + - @0xsequence/indexer@1.9.22 + - @0xsequence/relayer@1.9.22 + - @0xsequence/utils@1.9.22 + +## 1.9.21 + +### Patch Changes + +- api client bindings +- Updated dependencies + - @0xsequence/core@1.9.21 + - @0xsequence/indexer@1.9.21 + - @0xsequence/relayer@1.9.21 + - @0xsequence/utils@1.9.21 + +## 1.9.20 + +### Patch Changes + +- api client bindings update +- Updated dependencies + - @0xsequence/core@1.9.20 + - @0xsequence/indexer@1.9.20 + - @0xsequence/relayer@1.9.20 + - @0xsequence/utils@1.9.20 + +## 1.9.19 + +### Patch Changes + +- waas update +- Updated dependencies + - @0xsequence/core@1.9.19 + - @0xsequence/indexer@1.9.19 + - @0xsequence/relayer@1.9.19 + - @0xsequence/utils@1.9.19 + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions +- Updated dependencies + - @0xsequence/core@1.9.18 + - @0xsequence/indexer@1.9.18 + - @0xsequence/relayer@1.9.18 + - @0xsequence/utils@1.9.18 + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia +- Updated dependencies + - @0xsequence/core@1.9.17 + - @0xsequence/indexer@1.9.17 + - @0xsequence/relayer@1.9.17 + - @0xsequence/utils@1.9.17 + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions +- Updated dependencies + - @0xsequence/core@1.9.16 + - @0xsequence/indexer@1.9.16 + - @0xsequence/relayer@1.9.16 + - @0xsequence/utils@1.9.16 + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix +- Updated dependencies + - @0xsequence/core@1.9.15 + - @0xsequence/indexer@1.9.15 + - @0xsequence/relayer@1.9.15 + - @0xsequence/utils@1.9.15 + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.9.14 + - @0xsequence/indexer@1.9.14 + - @0xsequence/relayer@1.9.14 + - @0xsequence/utils@1.9.14 + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency +- Updated dependencies + - @0xsequence/core@1.9.13 + - @0xsequence/indexer@1.9.13 + - @0xsequence/relayer@1.9.13 + - @0xsequence/utils@1.9.13 + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.9.12 + - @0xsequence/indexer@1.9.12 + - @0xsequence/relayer@1.9.12 + - @0xsequence/utils@1.9.12 + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings +- Updated dependencies + - @0xsequence/core@1.9.11 + - @0xsequence/indexer@1.9.11 + - @0xsequence/relayer@1.9.11 + - @0xsequence/utils@1.9.11 + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings +- Updated dependencies + - @0xsequence/core@1.9.10 + - @0xsequence/indexer@1.9.10 + - @0xsequence/relayer@1.9.10 + - @0xsequence/utils@1.9.10 + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client +- Updated dependencies + - @0xsequence/core@1.9.9 + - @0xsequence/indexer@1.9.9 + - @0xsequence/relayer@1.9.9 + - @0xsequence/utils@1.9.9 + +## 1.9.8 + +### Patch Changes + +- waas client update +- Updated dependencies + - @0xsequence/core@1.9.8 + - @0xsequence/indexer@1.9.8 + - @0xsequence/relayer@1.9.8 + - @0xsequence/utils@1.9.8 + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer +- Updated dependencies + - @0xsequence/core@1.9.7 + - @0xsequence/indexer@1.9.7 + - @0xsequence/relayer@1.9.7 + - @0xsequence/utils@1.9.7 + +## 1.9.6 + +### Patch Changes + +- waas package update +- Updated dependencies + - @0xsequence/core@1.9.6 + - @0xsequence/indexer@1.9.6 + - @0xsequence/relayer@1.9.6 + - @0xsequence/utils@1.9.6 + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key +- Updated dependencies + - @0xsequence/core@1.9.5 + - @0xsequence/indexer@1.9.5 + - @0xsequence/relayer@1.9.5 + - @0xsequence/utils@1.9.5 + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency +- Updated dependencies + - @0xsequence/core@1.9.4 + - @0xsequence/indexer@1.9.4 + - @0xsequence/relayer@1.9.4 + - @0xsequence/utils@1.9.4 + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it +- Updated dependencies + - @0xsequence/core@1.9.3 + - @0xsequence/indexer@1.9.3 + - @0xsequence/relayer@1.9.3 + - @0xsequence/utils@1.9.3 + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia +- Updated dependencies + - @0xsequence/core@1.9.2 + - @0xsequence/indexer@1.9.2 + - @0xsequence/relayer@1.9.2 + - @0xsequence/utils@1.9.2 + +## 1.9.1 + +### Patch Changes + +- analytics fix +- Updated dependencies + - @0xsequence/core@1.9.1 + - @0xsequence/indexer@1.9.1 + - @0xsequence/relayer@1.9.1 + - @0xsequence/utils@1.9.1 + +## 1.9.0 + +### Minor Changes + +- waas release + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.9.0 + - @0xsequence/indexer@1.9.0 + - @0xsequence/relayer@1.9.0 + - @0xsequence/utils@1.9.0 + +## 1.8.8 + +### Patch Changes + +- update metadata bindings +- Updated dependencies + - @0xsequence/core@1.8.8 + - @0xsequence/indexer@1.8.8 + - @0xsequence/relayer@1.8.8 + - @0xsequence/utils@1.8.8 + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 +- Updated dependencies + - @0xsequence/core@1.8.7 + - @0xsequence/indexer@1.8.7 + - @0xsequence/relayer@1.8.7 + - @0xsequence/utils@1.8.7 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof +- Updated dependencies + - @0xsequence/core@1.8.6 + - @0xsequence/indexer@1.8.6 + - @0xsequence/relayer@1.8.6 + - @0xsequence/utils@1.8.6 + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof +- Updated dependencies + - @0xsequence/core@1.8.5 + - @0xsequence/indexer@1.8.5 + - @0xsequence/relayer@1.8.5 + - @0xsequence/utils@1.8.5 + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list +- Updated dependencies + - @0xsequence/core@1.8.4 + - @0xsequence/indexer@1.8.4 + - @0xsequence/relayer@1.8.4 + - @0xsequence/utils@1.8.4 + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support +- Updated dependencies + - @0xsequence/core@1.8.3 + - @0xsequence/indexer@1.8.3 + - @0xsequence/relayer@1.8.3 + - @0xsequence/utils@1.8.3 + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested +- Updated dependencies + - @0xsequence/core@1.8.2 + - @0xsequence/indexer@1.8.2 + - @0xsequence/relayer@1.8.2 + - @0xsequence/utils@1.8.2 + +## 1.8.1 + +### Patch Changes + +- update to analytics provider +- Updated dependencies + - @0xsequence/core@1.8.1 + - @0xsequence/indexer@1.8.1 + - @0xsequence/relayer@1.8.1 + - @0xsequence/utils@1.8.1 + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.8.0 + - @0xsequence/indexer@1.8.0 + - @0xsequence/relayer@1.8.0 + - @0xsequence/utils@1.8.0 + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.7.2 + - @0xsequence/indexer@1.7.2 + - @0xsequence/relayer@1.7.2 + - @0xsequence/utils@1.7.2 + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI +- Updated dependencies + - @0xsequence/core@1.7.1 + - @0xsequence/indexer@1.7.1 + - @0xsequence/relayer@1.7.1 + - @0xsequence/utils@1.7.1 + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.7.0 + - @0xsequence/indexer@1.7.0 + - @0xsequence/relayer@1.7.0 + - @0xsequence/utils@1.7.0 + +## 1.6.3 + +### Patch Changes + +- network list update +- Updated dependencies + - @0xsequence/core@1.6.3 + - @0xsequence/indexer@1.6.3 + - @0xsequence/relayer@1.6.3 + - @0xsequence/utils@1.6.3 + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.6.2 + - @0xsequence/indexer@1.6.2 + - @0xsequence/relayer@1.6.2 + - @0xsequence/utils@1.6.2 + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.6.1 + - @0xsequence/indexer@1.6.1 + - @0xsequence/relayer@1.6.1 + - @0xsequence/utils@1.6.1 + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.6.0 + - @0xsequence/indexer@1.6.0 + - @0xsequence/relayer@1.6.0 + - @0xsequence/utils@1.6.0 + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.5.0 + - @0xsequence/indexer@1.5.0 + - @0xsequence/relayer@1.5.0 + - @0xsequence/utils@1.5.0 + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata +- Updated dependencies + - @0xsequence/core@1.4.9 + - @0xsequence/indexer@1.4.9 + - @0xsequence/relayer@1.4.9 + - @0xsequence/utils@1.4.9 + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners +- Updated dependencies + - @0xsequence/core@1.4.8 + - @0xsequence/indexer@1.4.8 + - @0xsequence/relayer@1.4.8 + - @0xsequence/utils@1.4.8 + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings +- Updated dependencies + - @0xsequence/core@1.4.7 + - @0xsequence/indexer@1.4.7 + - @0xsequence/relayer@1.4.7 + - @0xsequence/utils@1.4.7 + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings +- Updated dependencies + - @0xsequence/core@1.4.6 + - @0xsequence/indexer@1.4.6 + - @0xsequence/relayer@1.4.6 + - @0xsequence/utils@1.4.6 + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.4.5 + - @0xsequence/indexer@1.4.5 + - @0xsequence/relayer@1.4.5 + - @0xsequence/utils@1.4.5 + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.4.4 + - @0xsequence/indexer@1.4.4 + - @0xsequence/relayer@1.4.4 + - @0xsequence/utils@1.4.4 + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods +- Updated dependencies + - @0xsequence/core@1.4.3 + - @0xsequence/indexer@1.4.3 + - @0xsequence/relayer@1.4.3 + - @0xsequence/utils@1.4.3 + +## 1.4.2 + +### Patch Changes + +- guard: update bindings +- Updated dependencies + - @0xsequence/core@1.4.2 + - @0xsequence/indexer@1.4.2 + - @0xsequence/relayer@1.4.2 + - @0xsequence/utils@1.4.2 + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.4.1 + - @0xsequence/indexer@1.4.1 + - @0xsequence/relayer@1.4.1 + - @0xsequence/utils@1.4.1 + +## 1.4.0 + +### Minor Changes + +- project access key support + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.4.0 + - @0xsequence/indexer@1.4.0 + - @0xsequence/relayer@1.4.0 + - @0xsequence/utils@1.4.0 + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.3.0 + - @0xsequence/indexer@1.3.0 + - @0xsequence/relayer@1.3.0 + - @0xsequence/utils@1.3.0 + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.2.9 + - @0xsequence/indexer@1.2.9 + - @0xsequence/relayer@1.2.9 + - @0xsequence/utils@1.2.9 + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key +- Updated dependencies + - @0xsequence/core@1.2.8 + - @0xsequence/indexer@1.2.8 + - @0xsequence/relayer@1.2.8 + - @0xsequence/utils@1.2.8 + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients +- Updated dependencies + - @0xsequence/core@1.2.7 + - @0xsequence/indexer@1.2.7 + - @0xsequence/relayer@1.2.7 + - @0xsequence/utils@1.2.7 + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider +- Updated dependencies + - @0xsequence/core@1.2.6 + - @0xsequence/indexer@1.2.6 + - @0xsequence/relayer@1.2.6 + - @0xsequence/utils@1.2.6 + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes +- Updated dependencies + - @0xsequence/core@1.2.5 + - @0xsequence/indexer@1.2.5 + - @0xsequence/relayer@1.2.5 + - @0xsequence/utils@1.2.5 + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.2.4 + - @0xsequence/indexer@1.2.4 + - @0xsequence/relayer@1.2.4 + - @0xsequence/utils@1.2.4 + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce +- Updated dependencies + - @0xsequence/core@1.2.3 + - @0xsequence/indexer@1.2.3 + - @0xsequence/relayer@1.2.3 + - @0xsequence/utils@1.2.3 + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.2.2 + - @0xsequence/indexer@1.2.2 + - @0xsequence/relayer@1.2.2 + - @0xsequence/utils@1.2.2 + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available +- Updated dependencies + - @0xsequence/core@1.2.1 + - @0xsequence/indexer@1.2.1 + - @0xsequence/relayer@1.2.1 + - @0xsequence/utils@1.2.1 + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.2.0 + - @0xsequence/indexer@1.2.0 + - @0xsequence/relayer@1.2.0 + - @0xsequence/utils@1.2.0 + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering +- Updated dependencies + - @0xsequence/core@1.1.15 + - @0xsequence/indexer@1.1.15 + - @0xsequence/relayer@1.1.15 + - @0xsequence/utils@1.1.15 + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError +- Updated dependencies + - @0xsequence/core@1.1.14 + - @0xsequence/indexer@1.1.14 + - @0xsequence/relayer@1.1.14 + - @0xsequence/utils@1.1.14 + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.1.13 + - @0xsequence/indexer@1.1.13 + - @0xsequence/relayer@1.1.13 + - @0xsequence/utils@1.1.13 + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions +- Updated dependencies + - @0xsequence/core@1.1.12 + - @0xsequence/indexer@1.1.12 + - @0xsequence/relayer@1.1.12 + - @0xsequence/utils@1.1.12 + +## 1.1.11 + +### Patch Changes + +- add homeverse configs +- Updated dependencies + - @0xsequence/core@1.1.11 + - @0xsequence/indexer@1.1.11 + - @0xsequence/relayer@1.1.11 + - @0xsequence/utils@1.1.11 + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send +- Updated dependencies + - @0xsequence/core@1.1.10 + - @0xsequence/indexer@1.1.10 + - @0xsequence/relayer@1.1.10 + - @0xsequence/utils@1.1.10 + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client +- Updated dependencies + - @0xsequence/core@1.1.9 + - @0xsequence/indexer@1.1.9 + - @0xsequence/relayer@1.1.9 + - @0xsequence/utils@1.1.9 + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter +- Updated dependencies + - @0xsequence/core@1.1.8 + - @0xsequence/indexer@1.1.8 + - @0xsequence/relayer@1.1.8 + - @0xsequence/utils@1.1.8 + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow +- Updated dependencies + - @0xsequence/core@1.1.7 + - @0xsequence/indexer@1.1.7 + - @0xsequence/relayer@1.1.7 + - @0xsequence/utils@1.1.7 + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters +- Updated dependencies + - @0xsequence/core@1.1.6 + - @0xsequence/indexer@1.1.6 + - @0xsequence/relayer@1.1.6 + - @0xsequence/utils@1.1.6 + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions +- Updated dependencies + - @0xsequence/core@1.1.5 + - @0xsequence/indexer@1.1.5 + - @0xsequence/relayer@1.1.5 + - @0xsequence/utils@1.1.5 + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.1.4 + - @0xsequence/indexer@1.1.4 + - @0xsequence/relayer@1.1.4 + - @0xsequence/utils@1.1.4 + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.1.3 + - @0xsequence/indexer@1.1.3 + - @0xsequence/relayer@1.1.3 + - @0xsequence/utils@1.1.3 + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes +- Updated dependencies + - @0xsequence/core@1.1.2 + - @0xsequence/indexer@1.1.2 + - @0xsequence/relayer@1.1.2 + - @0xsequence/utils@1.1.2 + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.1.1 + - @0xsequence/indexer@1.1.1 + - @0xsequence/relayer@1.1.1 + - @0xsequence/utils@1.1.1 + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.1.0 + - @0xsequence/indexer@1.1.0 + - @0xsequence/relayer@1.1.0 + - @0xsequence/utils@1.1.0 + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/core@1.0.5 + - @0xsequence/indexer@1.0.5 + - @0xsequence/relayer@1.0.5 + - @0xsequence/utils@1.0.5 + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId +- Updated dependencies + - @0xsequence/core@1.0.4 + - @0xsequence/indexer@1.0.4 + - @0xsequence/relayer@1.0.4 + - @0xsequence/utils@1.0.4 + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers +- Updated dependencies + - @0xsequence/core@1.0.3 + - @0xsequence/indexer@1.0.3 + - @0xsequence/relayer@1.0.3 + - @0xsequence/utils@1.0.3 + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods +- Updated dependencies + - @0xsequence/core@1.0.2 + - @0xsequence/indexer@1.0.2 + - @0xsequence/relayer@1.0.2 + - @0xsequence/utils@1.0.2 + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet +- Updated dependencies + - @0xsequence/core@1.0.1 + - @0xsequence/indexer@1.0.1 + - @0xsequence/relayer@1.0.1 + - @0xsequence/utils@1.0.1 + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +### Patch Changes + +- Updated dependencies + - @0xsequence/core@1.0.0 + - @0xsequence/indexer@1.0.0 + - @0xsequence/relayer@1.0.0 + - @0xsequence/utils@1.0.0 + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer +- Updated dependencies + - @0xsequence/indexer@0.43.34 + - @0xsequence/provider@0.43.34 + - @0xsequence/relayer@0.43.34 + - @0xsequence/utils@0.43.34 + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler +- Updated dependencies + - @0xsequence/indexer@0.43.33 + - @0xsequence/provider@0.43.33 + - @0xsequence/relayer@0.43.33 + - @0xsequence/utils@0.43.33 + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network +- Updated dependencies + - @0xsequence/indexer@0.43.32 + - @0xsequence/provider@0.43.32 + - @0xsequence/relayer@0.43.32 + - @0xsequence/utils@0.43.32 + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect +- Updated dependencies + - @0xsequence/indexer@0.43.31 + - @0xsequence/provider@0.43.31 + - @0xsequence/relayer@0.43.31 + - @0xsequence/utils@0.43.31 + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet +- Updated dependencies + - @0xsequence/indexer@0.43.30 + - @0xsequence/provider@0.43.30 + - @0xsequence/relayer@0.43.30 + - @0xsequence/utils@0.43.30 + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object +- Updated dependencies + - @0xsequence/indexer@0.43.29 + - @0xsequence/provider@0.43.29 + - @0xsequence/relayer@0.43.29 + - @0xsequence/utils@0.43.29 + +## 0.43.28 + +### Patch Changes + +- update api bindings +- Updated dependencies + - @0xsequence/indexer@0.43.28 + - @0xsequence/provider@0.43.28 + - @0xsequence/relayer@0.43.28 + - @0xsequence/utils@0.43.28 + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method +- Updated dependencies + - @0xsequence/indexer@0.43.27 + - @0xsequence/provider@0.43.27 + - @0xsequence/relayer@0.43.27 + - @0xsequence/utils@0.43.27 + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum +- Updated dependencies + - @0xsequence/indexer@0.43.26 + - @0xsequence/provider@0.43.26 + - @0xsequence/relayer@0.43.26 + - @0xsequence/utils@0.43.26 + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks +- Updated dependencies + - @0xsequence/indexer@0.43.25 + - @0xsequence/provider@0.43.25 + - @0xsequence/relayer@0.43.25 + - @0xsequence/utils@0.43.25 + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm +- Updated dependencies + - @0xsequence/indexer@0.43.24 + - @0xsequence/provider@0.43.24 + - @0xsequence/relayer@0.43.24 + - @0xsequence/utils@0.43.24 + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM +- Updated dependencies + - @0xsequence/indexer@0.43.23 + - @0xsequence/provider@0.43.23 + - @0xsequence/relayer@0.43.23 + - @0xsequence/utils@0.43.23 + +## 0.43.22 + +### Patch Changes + +- add zkevm chain +- Updated dependencies + - @0xsequence/indexer@0.43.22 + - @0xsequence/provider@0.43.22 + - @0xsequence/relayer@0.43.22 + - @0xsequence/utils@0.43.22 + +## 0.43.21 + +### Patch Changes + +- api: update client bindings +- Updated dependencies + - @0xsequence/indexer@0.43.21 + - @0xsequence/provider@0.43.21 + - @0xsequence/relayer@0.43.21 + - @0xsequence/utils@0.43.21 + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings +- Updated dependencies + - @0xsequence/indexer@0.43.20 + - @0xsequence/provider@0.43.20 + - @0xsequence/relayer@0.43.20 + - @0xsequence/utils@0.43.20 + +## 0.43.19 + +### Patch Changes + +- session proof update +- Updated dependencies + - @0xsequence/indexer@0.43.19 + - @0xsequence/provider@0.43.19 + - @0xsequence/relayer@0.43.19 + - @0xsequence/utils@0.43.19 + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening +- Updated dependencies + - @0xsequence/indexer@0.43.18 + - @0xsequence/provider@0.43.18 + - @0xsequence/relayer@0.43.18 + - @0xsequence/utils@0.43.18 + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined +- Updated dependencies + - @0xsequence/indexer@0.43.17 + - @0xsequence/provider@0.43.17 + - @0xsequence/relayer@0.43.17 + - @0xsequence/utils@0.43.17 + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use +- Updated dependencies + - @0xsequence/indexer@0.43.16 + - @0xsequence/provider@0.43.16 + - @0xsequence/relayer@0.43.16 + - @0xsequence/utils@0.43.16 + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods +- Updated dependencies + - @0xsequence/indexer@0.43.15 + - @0xsequence/provider@0.43.15 + - @0xsequence/relayer@0.43.15 + - @0xsequence/utils@0.43.15 + +## 0.43.14 + +### Patch Changes + +- bump +- Updated dependencies + - @0xsequence/indexer@0.43.14 + - @0xsequence/provider@0.43.14 + - @0xsequence/relayer@0.43.14 + - @0xsequence/utils@0.43.14 + +## 0.43.13 + +### Patch Changes + +- update rpc bindings +- Updated dependencies + - @0xsequence/indexer@0.43.13 + - @0xsequence/provider@0.43.13 + - @0xsequence/relayer@0.43.13 + - @0xsequence/utils@0.43.13 + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method +- Updated dependencies + - @0xsequence/indexer@0.43.12 + - @0xsequence/provider@0.43.12 + - @0xsequence/relayer@0.43.12 + - @0xsequence/utils@0.43.12 + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter +- Updated dependencies +- Updated dependencies + - @0xsequence/indexer@0.43.11 + - @0xsequence/provider@0.43.11 + - @0xsequence/relayer@0.43.11 + - @0xsequence/utils@0.43.11 + +## 0.43.10 + +### Patch Changes + +- various improvements +- Updated dependencies + - @0xsequence/indexer@0.43.10 + - @0xsequence/provider@0.43.10 + - @0xsequence/relayer@0.43.10 + - @0xsequence/utils@0.43.10 + +## 0.43.9 + +### Patch Changes + +- update deps +- Updated dependencies + - @0xsequence/indexer@0.43.9 + - @0xsequence/provider@0.43.9 + - @0xsequence/relayer@0.43.9 + - @0xsequence/utils@0.43.9 + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching +- Updated dependencies + - @0xsequence/indexer@0.43.8 + - @0xsequence/provider@0.43.8 + - @0xsequence/relayer@0.43.8 + - @0xsequence/utils@0.43.8 + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init +- Updated dependencies + - @0xsequence/utils@0.43.7 + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings +- Updated dependencies + - @0xsequence/utils@0.43.6 + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message +- Updated dependencies +- Updated dependencies + - @0xsequence/utils@0.43.5 + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build +- Updated dependencies + - @0xsequence/utils@0.43.4 + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/utils@0.43.3 + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked +- Updated dependencies + - @0xsequence/utils@0.43.2 + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep +- Updated dependencies + - @0xsequence/utils@0.43.1 + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +### Patch Changes + +- Updated dependencies + - @0xsequence/utils@0.43.0 + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider +- Updated dependencies + - @0xsequence/utils@0.42.10 + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions +- Updated dependencies + - @0xsequence/utils@0.42.9 + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin +- Updated dependencies + - @0xsequence/utils@0.42.8 + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings +- Updated dependencies + - @0xsequence/utils@0.42.7 + +## 0.42.6 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/utils@0.42.6 + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure +- Updated dependencies + - @0xsequence/utils@0.42.5 + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options +- Updated dependencies + - @0xsequence/utils@0.42.4 + +## 0.42.3 + +### Patch Changes + +- update api bindings +- Updated dependencies + - @0xsequence/utils@0.42.3 + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network +- Updated dependencies + - @0xsequence/utils@0.42.2 + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter +- Updated dependencies + - @0xsequence/utils@0.42.1 + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/utils@0.42.0 + +## 0.41.3 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/utils@0.41.3 + +## 0.41.2 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/utils@0.41.2 + +## 0.41.1 + +### Patch Changes + +- update default networks +- Updated dependencies + - @0xsequence/utils@0.41.1 + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/utils@0.41.0 + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain +- Updated dependencies + - @0xsequence/utils@0.40.6 + +## 0.40.5 + +### Patch Changes + +- api: update bindings +- Updated dependencies + - @0xsequence/utils@0.40.5 + +## 0.40.4 + +### Patch Changes + +- add unreal transport +- Updated dependencies + - @0xsequence/utils@0.40.4 + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type +- Updated dependencies + - @0xsequence/utils@0.40.3 + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method +- Updated dependencies + - @0xsequence/utils@0.40.2 + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet +- Updated dependencies + - @0xsequence/utils@0.40.1 + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +### Patch Changes + +- Updated dependencies + - @0xsequence/utils@0.40.0 + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings +- Updated dependencies + - @0xsequence/utils@0.39.6 + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option +- Updated dependencies + - @0xsequence/utils@0.39.5 + +## 0.39.4 + +### Patch Changes + +- api: update client bindings +- Updated dependencies + - @0xsequence/utils@0.39.4 + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider +- Updated dependencies + - @0xsequence/utils@0.39.3 + +## 0.39.2 + +### Patch Changes + +- update umd name +- Updated dependencies + - @0xsequence/utils@0.39.2 + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp +- Updated dependencies +- Updated dependencies + - @0xsequence/utils@0.39.1 + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +### Patch Changes + +- Updated dependencies + - @0xsequence/utils@0.39.0 + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount +- Updated dependencies + - @0xsequence/utils@0.38.2 + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings +- Updated dependencies + - @0xsequence/utils@0.38.1 + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +### Patch Changes + +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/utils@0.38.0 + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. +- Updated dependencies + - @0xsequence/utils@0.37.1 + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +### Patch Changes + +- Updated dependencies +- Updated dependencies + - @0xsequence/utils@0.37.0 + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints +- Updated dependencies + - @0xsequence/utils@0.36.13 + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token +- Updated dependencies +- Updated dependencies + - @0xsequence/utils@0.36.12 + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler +- Updated dependencies + - @0xsequence/utils@0.36.11 + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect +- Updated dependencies + - @0xsequence/utils@0.36.10 + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements +- Updated dependencies + - @0xsequence/utils@0.36.9 + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) +- Updated dependencies + - @0xsequence/utils@0.36.8 + +## 0.36.7 + +### Patch Changes + +- fix missing break +- Updated dependencies + - @0xsequence/utils@0.36.7 + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support +- Updated dependencies + - @0xsequence/utils@0.36.6 + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit +- Updated dependencies + - @0xsequence/utils@0.36.5 + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains +- Updated dependencies + - @0xsequence/utils@0.36.4 + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods +- Updated dependencies + - @0xsequence/utils@0.36.3 + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode +- Updated dependencies + - @0xsequence/utils@0.36.2 + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields +- Updated dependencies + - @0xsequence/utils@0.36.1 + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +### Patch Changes + +- Updated dependencies + - @0xsequence/utils@0.36.0 + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils +- Updated dependencies + - @0xsequence/utils@0.35.12 + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation +- Updated dependencies + - @0xsequence/utils@0.35.11 + +## 0.35.10 + +### Patch Changes + +- upgrade deps +- Updated dependencies + - @0xsequence/utils@0.35.10 + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance +- Updated dependencies + - @0xsequence/utils@0.35.9 + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements +- Updated dependencies + - @0xsequence/utils@0.35.8 + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs +- Updated dependencies + - @0xsequence/utils@0.35.7 + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler +- Updated dependencies + - @0xsequence/utils@0.35.6 + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation +- Updated dependencies + - @0xsequence/utils@0.35.5 + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window +- Updated dependencies + - @0xsequence/utils@0.35.4 + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode +- Updated dependencies + - @0xsequence/utils@0.35.3 + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref +- Updated dependencies + - @0xsequence/utils@0.35.2 + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too +- Updated dependencies + - @0xsequence/utils@0.35.1 + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +### Patch Changes + +- Updated dependencies + - @0xsequence/utils@0.35.0 + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +### Patch Changes + +- Updated dependencies + - @0xsequence/utils@0.34.0 + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +### Patch Changes + +- Updated dependencies + - @0xsequence/utils@0.31.0 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +### Patch Changes + +- Updated dependencies + - @0xsequence/utils@0.30.0 + +## 0.29.8 + +### Patch Changes + +- update api +- Updated dependencies [undefined] + - @0xsequence/utils@0.29.8 + +## 0.29.6 + +### Patch Changes + +- auth: pass testnetMode flag depending on network + +## 0.29.0 + +### Minor Changes + +- major architectural changes in Sequence design + + - only one API instance, API is no longer a per-chain service + - separate per-chain indexer service, API no longer handles indexing + - single contract metadata service, API no longer serves metadata + + chaind package has been removed, indexer and metadata packages have been added + + stronger typing with new explicit ChainId type + + multicall fixes and improvements + + forbid "wait" transactions in sendTransactionBatch calls + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.29.0 + +## 0.28.0 + +### Minor Changes + +- extension provider + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.28.0 + +## 0.27.0 + +### Minor Changes + +- Add requireFreshSigner lib to sessions + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.27.0 + +## 0.25.1 + +### Patch Changes + +- Fix build typescrypt issue +- Updated dependencies [undefined] + - @0xsequence/utils@0.25.1 + +## 0.25.0 + +### Minor Changes + +- 10c8af8: Add estimator package + Fix multicall few calls bug + +### Patch Changes + +- Updated dependencies [10c8af8] + - @0xsequence/utils@0.25.0 + +## 0.23.0 + +### Minor Changes + +- - relayer: offer variety of gas fee options from the relayer service" + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.23.0 + +## 0.22.2 + +### Patch Changes + +- e1c109e: Fix authProof on expired sessions +- Updated dependencies [e1c109e] + - @0xsequence/utils@0.22.2 + +## 0.22.1 + +### Patch Changes + +- transport session cache +- Updated dependencies [undefined] + - @0xsequence/utils@0.22.1 + +## 0.22.0 + +### Minor Changes + +- e667b65: Expose all relayer options on networks + +### Patch Changes + +- Updated dependencies [e667b65] + - @0xsequence/utils@0.22.0 + +## 0.21.5 + +### Patch Changes + +- Give priority to metaTxnId returned by relayer +- Updated dependencies [undefined] + - @0xsequence/utils@0.21.5 + +## 0.21.4 + +### Patch Changes + +- Add has enough signers method +- Updated dependencies [undefined] + - @0xsequence/utils@0.21.4 + +## 0.21.3 + +### Patch Changes + +- add window session cache +- Updated dependencies [undefined] + - @0xsequence/utils@0.21.3 + +## 0.21.2 + +### Patch Changes + +- exception handlind in relayer +- Updated dependencies [undefined] + - @0xsequence/utils@0.21.2 + +## 0.21.0 + +### Minor Changes + +- - fix gas estimation on wallets with large number of signers + - update to session handling and wallet config construction upon auth + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.21.0 + +## 0.19.3 + +### Patch Changes + +- jwtAuth visibility, package version sync +- Updated dependencies [undefined] + - @0xsequence/utils@0.19.3 + +## 0.19.0 + +### Minor Changes + +- - provider, improve dapp / wallet transport io + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.19.0 + +## 0.18.0 + +### Minor Changes + +- relayer improvements and pending transaction handling + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.18.0 + +## 0.16.0 + +### Minor Changes + +- relayer as its own service separate from chaind + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.16.0 + +## 0.15.1 + +### Patch Changes + +- update api clients +- Updated dependencies [undefined] + - @0xsequence/utils@0.15.1 + +## 0.14.3 + +### Patch Changes + +- Fix 0xSequence relayer dependencies +- Updated dependencies [undefined] + - @0xsequence/utils@0.14.3 + +## 0.14.2 + +### Patch Changes + +- Add debug logs to rpc-relayer +- Updated dependencies [undefined] + - @0xsequence/utils@0.14.2 + +## 0.14.0 + +### Minor Changes + +- update sequence utils finder which includes optimization + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.14.0 + +## 0.13.0 + +### Minor Changes + +- Update SequenceUtils deployed contract + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.13.0 + +## 0.12.1 + +### Patch Changes + +- npm bump +- Updated dependencies [undefined] + - @0xsequence/utils@0.12.1 + +## 0.12.0 + +### Minor Changes + +- provider: improvements to window transport + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.12.0 + +## 0.11.4 + +### Patch Changes + +- update api client +- Updated dependencies [undefined] + - @0xsequence/utils@0.11.4 + +## 0.11.3 + +### Patch Changes + +- improve openWindow state options handling +- Updated dependencies [undefined] + - @0xsequence/utils@0.11.3 + +## 0.11.2 + +### Patch Changes + +- Fix multicall proxy scopes +- Updated dependencies [undefined] + - @0xsequence/utils@0.11.2 + +## 0.11.1 + +### Patch Changes + +- Add support for dynamic and nested signatures +- Updated dependencies [undefined] + - @0xsequence/utils@0.11.1 + +## 0.11.0 + +### Minor Changes + +- Update wallet context to 1.7 contracts + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.11.0 + +## 0.10.9 + +### Patch Changes + +- add support for public addresses as signers in session.open +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.9 + +## 0.10.8 + +### Patch Changes + +- Multicall production configuration +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.8 + +## 0.10.7 + +### Patch Changes + +- allow provider transport to force disconnect +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.7 + +## 0.10.6 + +### Patch Changes + +- - fix getWalletState method +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.6 + +## 0.10.5 + +### Patch Changes + +- update relayer gas refund options +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.5 + +## 0.10.4 + +### Patch Changes + +- Update api proto +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.4 + +## 0.10.3 + +### Patch Changes + +- Fix loading config cross-chain +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.3 + +## 0.10.2 + +### Patch Changes + +- - message digest fix +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.2 + +## 0.10.1 + +### Patch Changes + +- upgrade deps +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.1 + +## 0.10.0 + +### Minor Changes + +- Deployed new contracts with ERC1271 signer support + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.10.0 + +## 0.9.6 + +### Patch Changes + +- Update ABIs for latest sequence contracts +- Updated dependencies [undefined] + - @0xsequence/utils@0.9.6 + +## 0.9.5 + +### Patch Changes + +- Implemented session class +- Updated dependencies [undefined] + - @0xsequence/utils@0.9.5 + +## 0.9.3 + +### Patch Changes + +- - minor improvements +- Updated dependencies [undefined] + - @0xsequence/utils@0.9.3 + +## 0.9.1 + +### Patch Changes + +- - patch bump +- Updated dependencies [undefined] + - @0xsequence/utils@0.9.1 + +## 0.9.0 + +### Minor Changes + +- - provider transport hardening + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.9.0 + +## 0.8.5 + +### Patch Changes + +- - use latest wallet-contracts +- Updated dependencies [undefined] + - @0xsequence/utils@0.8.5 + +## 0.8.4 + +### Patch Changes + +- - minor improvements, name updates and comments +- Updated dependencies [undefined] + - @0xsequence/utils@0.8.4 + +## 0.8.3 + +### Patch Changes + +- - refinements + + - normalize signer address in config + + - provider: getWalletState() method to WalletProvider + +- Updated dependencies [undefined] + - @0xsequence/utils@0.8.3 + +## 0.8.2 + +### Patch Changes + +- - field rename and ethauth dependency bump +- Updated dependencies [undefined] + - @0xsequence/utils@0.8.2 + +## 0.8.1 + +### Patch Changes + +- - variety of optimizations +- Updated dependencies [undefined] + - @0xsequence/utils@0.8.1 + +## 0.8.0 + +### Minor Changes + +- - changeset fix + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/utils@0.8.0 + +## 0.7.1 + +### Patch Changes + +- 02377ab: Minor improvements +- 1fe4379: \* explicitly export types in 0xsequence meta-package + - introduce new `networksIndex` method in network package +- Updated dependencies [02377ab] + - @0xsequence/utils@0.7.1 + +## 0.7.0 + +### Patch Changes + +- 6f11ed7: sequence.js, init release +- Updated dependencies [6f11ed7] + - @0xsequence/utils@0.7.0 diff --git a/packages/network/README.md b/packages/network/README.md new file mode 100644 index 000000000..d0f9f960a --- /dev/null +++ b/packages/network/README.md @@ -0,0 +1,4 @@ +@0xsequence/network +=================== + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/network/constants/package.json b/packages/network/constants/package.json new file mode 100644 index 000000000..9cbfa6612 --- /dev/null +++ b/packages/network/constants/package.json @@ -0,0 +1,4 @@ +{ + "main": "dist/0xsequence-network-constants.cjs.js", + "module": "dist/0xsequence-network-constants.esm.js" +} diff --git a/packages/network/src/config.ts b/packages/network/src/config.ts new file mode 100644 index 000000000..e81b0740d --- /dev/null +++ b/packages/network/src/config.ts @@ -0,0 +1,128 @@ +import { BigNumberish, ethers, providers } from 'ethers' +import { Indexer } from '@0xsequence/indexer' +import { Relayer, RpcRelayerOptions } from '@0xsequence/relayer' +import { findNetworkConfig, stringTemplate, validateAndSortNetworks } from './utils' +import { isBigNumberish } from '@0xsequence/utils' +import { ChainId, NetworkMetadata, networks } from './constants' + +export type NetworkConfig = NetworkMetadata & { + rpcUrl: string + provider?: providers.Provider + indexerUrl?: string + indexer?: Indexer + relayer?: Relayer | RpcRelayerOptions + + // isDefaultChain identifies the default network. For example, a dapp may run on the Polygon + // network and may configure the wallet to use it as its main/default chain. + isDefaultChain?: boolean + + // Disabled / deprecated chain + disabled?: boolean +} + +type LegacyNetworkConfig = NetworkConfig & { isAuthChain?: boolean } + +export const indexerURL = (network: string) => stringTemplate('https://${network}-indexer.sequence.app', { network }) +export const relayerURL = (network: string) => stringTemplate('https://${network}-relayer.sequence.app', { network }) +export const nodesURL = (network: string) => stringTemplate('https://nodes.sequence.app/${network}', { network }) + +export function findSupportedNetwork(chainIdOrName: string | ChainIdLike): NetworkConfig | undefined { + return findNetworkConfig(allNetworks, chainIdOrName) +} + +export type ChainIdLike = NetworkConfig | BigNumberish + +export function toChainIdNumber(chainIdLike: ChainIdLike): ethers.BigNumber { + if (ethers.BigNumber.isBigNumber(chainIdLike)) { + return chainIdLike + } + + if (isBigNumberish(chainIdLike)) { + return ethers.BigNumber.from(chainIdLike) + } + + return ethers.BigNumber.from(chainIdLike.chainId) +} + +const createNetworkConfig = (chainId: ChainId, options?: { disabled?: boolean }): NetworkConfig => { + const network = networks[chainId] + + if (!network) { + throw new Error(`Network with chainId ${chainId} not found`) + } + + const rpcUrl = nodesURL(network.name) + + return { + ...network, + rpcUrl, + indexerUrl: indexerURL(network.name), + relayer: { + url: relayerURL(network.name), + provider: { + url: rpcUrl + } + }, + ...options + } +} + +export const hardhatNetworks = [ + { + ...networks[ChainId.HARDHAT], + rpcUrl: 'http://localhost:8545', + relayer: { + url: 'http://localhost:3000', + provider: { + url: 'http://localhost:8545' + } + } + }, + { + ...networks[ChainId.HARDHAT_2], + rpcUrl: 'http://localhost:9545', + relayer: { + url: 'http://localhost:3000', + provider: { + url: 'http://localhost:9545' + } + } + } +] + +export const allNetworks = validateAndSortNetworks([ + { ...createNetworkConfig(ChainId.POLYGON), isDefaultChain: true, isAuthChain: true } as LegacyNetworkConfig, + createNetworkConfig(ChainId.MAINNET), + createNetworkConfig(ChainId.BSC), + createNetworkConfig(ChainId.AVALANCHE), + createNetworkConfig(ChainId.ARBITRUM), + createNetworkConfig(ChainId.ARBITRUM_NOVA), + createNetworkConfig(ChainId.OPTIMISM), + createNetworkConfig(ChainId.OPTIMISM_SEPOLIA), + createNetworkConfig(ChainId.POLYGON_ZKEVM), + createNetworkConfig(ChainId.GNOSIS), + createNetworkConfig(ChainId.RINKEBY, { disabled: true }), + createNetworkConfig(ChainId.GOERLI, { disabled: true }), + createNetworkConfig(ChainId.SEPOLIA), + createNetworkConfig(ChainId.POLYGON_MUMBAI, { disabled: true }), + createNetworkConfig(ChainId.POLYGON_AMOY), + createNetworkConfig(ChainId.BSC_TESTNET), + createNetworkConfig(ChainId.ARBITRUM_SEPOLIA), + createNetworkConfig(ChainId.BASE), + createNetworkConfig(ChainId.BASE_SEPOLIA), + createNetworkConfig(ChainId.HOMEVERSE), + createNetworkConfig(ChainId.HOMEVERSE_TESTNET), + createNetworkConfig(ChainId.XAI), + createNetworkConfig(ChainId.XAI_SEPOLIA), + createNetworkConfig(ChainId.AVALANCHE_TESTNET), + createNetworkConfig(ChainId.ASTAR_ZKEVM), + createNetworkConfig(ChainId.ASTAR_ZKYOTO), + createNetworkConfig(ChainId.XR_SEPOLIA), + createNetworkConfig(ChainId.B3_SEPOLIA), + createNetworkConfig(ChainId.APECHAIN_TESTNET), + createNetworkConfig(ChainId.BLAST), + createNetworkConfig(ChainId.BLAST_SEPOLIA), + createNetworkConfig(ChainId.TELOS), + + ...hardhatNetworks +]) diff --git a/packages/network/src/constants.ts b/packages/network/src/constants.ts new file mode 100644 index 000000000..e1582836c --- /dev/null +++ b/packages/network/src/constants.ts @@ -0,0 +1,774 @@ +export enum ChainId { + // Ethereum + MAINNET = 1, + ROPSTEN = 3, // network is deprecated + RINKEBY = 4, // network is deprecated + GOERLI = 5, // network is deprecated + KOVAN = 42, // network is deprecated + SEPOLIA = 11155111, + + // Polygon + POLYGON = 137, + POLYGON_MUMBAI = 80001, // network is deprecated + POLYGON_ZKEVM = 1101, + POLYGON_AMOY = 80002, + + // BSC + BSC = 56, + BSC_TESTNET = 97, + + // Optimism + OPTIMISM = 10, + OPTIMISM_KOVAN = 69, // network is deprecated + OPTIMISM_GOERLI = 420, // network is deprecated + OPTIMISM_SEPOLIA = 11155420, + + // Arbitrum One + ARBITRUM = 42161, + ARBITRUM_GOERLI = 421613, // network is deprecated + ARBITRUM_SEPOLIA = 421614, + + // Arbitrum Nova + ARBITRUM_NOVA = 42170, + + // Avalanche + AVALANCHE = 43114, + AVALANCHE_TESTNET = 43113, + + // Gnosis Chain (XDAI) + GNOSIS = 100, + + // BASE + BASE = 8453, + BASE_GOERLI = 84531, // network is deprecated + BASE_SEPOLIA = 84532, + + // HOMEVERSE + HOMEVERSE_TESTNET = 40875, + HOMEVERSE = 19011, + + // Xai + XAI = 660279, + XAI_SEPOLIA = 37714555429, + + // Astar + ASTAR_ZKEVM = 3776, + ASTAR_ZKYOTO = 6038361, + + // XR + XR_SEPOLIA = 2730, + + // TELOS + TELOS = 40, + + // B3 Sepolia + B3_SEPOLIA = 1993, + + // APE Chain + APECHAIN_TESTNET = 33111, + + // Blast + BLAST = 81457, + BLAST_SEPOLIA = 168587773, + + // HARDHAT TESTNETS + HARDHAT = 31337, + HARDHAT_2 = 31338 +} + +export enum NetworkType { + MAINNET = 'mainnet', + TESTNET = 'testnet' +} + +export type BlockExplorerConfig = { + name?: string + rootUrl: string + addressUrl?: string + txnHashUrl?: string +} + +export interface NetworkMetadata { + chainId: ChainId + type?: NetworkType + name: string + title?: string + logoURI?: string + blockExplorer?: BlockExplorerConfig + ensAddress?: string + testnet?: boolean // Deprecated field, use type instead + deprecated?: boolean // The actual network is deprecated + nativeToken: { + symbol: string + name: string + decimals: number + } +} + +export const networks: Record = { + [ChainId.MAINNET]: { + chainId: ChainId.MAINNET, + type: NetworkType.MAINNET, + name: 'mainnet', + title: 'Ethereum', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.MAINNET}.webp`, + blockExplorer: { + name: 'Etherscan', + rootUrl: 'https://etherscan.io/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + }, + ensAddress: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e' + }, + [ChainId.ROPSTEN]: { + chainId: ChainId.ROPSTEN, + type: NetworkType.TESTNET, + name: 'ropsten', + title: 'Ropsten', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.ROPSTEN}.webp`, + testnet: true, + blockExplorer: { + name: 'Etherscan (Ropsten)', + rootUrl: 'https://ropsten.etherscan.io/' + }, + nativeToken: { + symbol: 'roETH', + name: 'Ropsten Ether', + decimals: 18 + }, + ensAddress: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', + deprecated: true + }, + [ChainId.RINKEBY]: { + chainId: ChainId.RINKEBY, + type: NetworkType.TESTNET, + name: 'rinkeby', + title: 'Rinkeby', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.RINKEBY}.webp`, + testnet: true, + blockExplorer: { + name: 'Etherscan (Rinkeby)', + rootUrl: 'https://rinkeby.etherscan.io/' + }, + nativeToken: { + symbol: 'rETH', + name: 'Rinkeby Ether', + decimals: 18 + }, + ensAddress: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', + deprecated: true + }, + [ChainId.GOERLI]: { + chainId: ChainId.GOERLI, + type: NetworkType.TESTNET, + name: 'goerli', + title: 'Goerli', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.GOERLI}.webp`, + testnet: true, + blockExplorer: { + name: 'Etherscan (Goerli)', + rootUrl: 'https://goerli.etherscan.io/' + }, + nativeToken: { + symbol: 'gETH', + name: 'Goerli Ether', + decimals: 18 + }, + ensAddress: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e', + deprecated: true + }, + [ChainId.KOVAN]: { + chainId: ChainId.KOVAN, + type: NetworkType.TESTNET, + name: 'kovan', + title: 'Kovan', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.KOVAN}.webp`, + testnet: true, + blockExplorer: { + name: 'Etherscan (Kovan)', + rootUrl: 'https://kovan.etherscan.io/' + }, + nativeToken: { + symbol: 'kETH', + name: 'Kovan Ether', + decimals: 18 + }, + deprecated: true + }, + [ChainId.SEPOLIA]: { + chainId: ChainId.SEPOLIA, + type: NetworkType.TESTNET, + name: 'sepolia', + title: 'Sepolia', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.SEPOLIA}.webp`, + testnet: true, + blockExplorer: { + name: 'Etherscan (Sepolia)', + rootUrl: 'https://sepolia.etherscan.io/' + }, + nativeToken: { + symbol: 'sETH', + name: 'Sepolia Ether', + decimals: 18 + } + }, + [ChainId.POLYGON]: { + chainId: ChainId.POLYGON, + type: NetworkType.MAINNET, + name: 'polygon', + title: 'Polygon', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.POLYGON}.webp`, + blockExplorer: { + name: 'Polygonscan', + rootUrl: 'https://polygonscan.com/' + }, + nativeToken: { + symbol: 'MATIC', + name: 'Polygon', + decimals: 18 + } + }, + [ChainId.POLYGON_MUMBAI]: { + chainId: ChainId.POLYGON_MUMBAI, + type: NetworkType.TESTNET, + name: 'mumbai', + title: 'Polygon Mumbai', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.POLYGON_MUMBAI}.webp`, + testnet: true, + blockExplorer: { + name: 'Polygonscan (Mumbai)', + rootUrl: 'https://mumbai.polygonscan.com/' + }, + nativeToken: { + symbol: 'mMATIC', + name: 'Mumbai Polygon', + decimals: 18 + }, + deprecated: true + }, + [ChainId.POLYGON_AMOY]: { + chainId: ChainId.POLYGON_AMOY, + type: NetworkType.TESTNET, + name: 'amoy', + title: 'Polygon Amoy', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.POLYGON_AMOY}.webp`, + testnet: true, + blockExplorer: { + name: 'OKLink (Amoy)', + rootUrl: 'https://www.oklink.com/amoy/' + }, + nativeToken: { + symbol: 'aMATIC', + name: 'Amoy Polygon', + decimals: 18 + } + }, + [ChainId.POLYGON_ZKEVM]: { + chainId: ChainId.POLYGON_ZKEVM, + type: NetworkType.MAINNET, + name: 'polygon-zkevm', + title: 'Polygon zkEVM', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.POLYGON_ZKEVM}.webp`, + blockExplorer: { + name: 'Polygonscan (zkEVM)', + rootUrl: 'https://zkevm.polygonscan.com/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.BSC]: { + chainId: ChainId.BSC, + type: NetworkType.MAINNET, + name: 'bsc', + title: 'BNB Smart Chain', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.BSC}.webp`, + blockExplorer: { + name: 'BSCScan', + rootUrl: 'https://bscscan.com/' + }, + nativeToken: { + symbol: 'BNB', + name: 'BNB', + decimals: 18 + } + }, + [ChainId.BSC_TESTNET]: { + chainId: ChainId.BSC_TESTNET, + type: NetworkType.TESTNET, + name: 'bsc-testnet', + title: 'BNB Smart Chain Testnet', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.BSC_TESTNET}.webp`, + testnet: true, + blockExplorer: { + name: 'BSCScan (Testnet)', + rootUrl: 'https://testnet.bscscan.com/' + }, + nativeToken: { + symbol: 'tBNB', + name: 'Testnet BNB', + decimals: 18 + } + }, + [ChainId.OPTIMISM]: { + chainId: ChainId.OPTIMISM, + type: NetworkType.MAINNET, + name: 'optimism', + title: 'Optimism', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.OPTIMISM}.webp`, + blockExplorer: { + name: 'Etherscan (Optimism)', + rootUrl: 'https://optimistic.etherscan.io/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.OPTIMISM_KOVAN]: { + chainId: ChainId.OPTIMISM_KOVAN, + type: NetworkType.TESTNET, + name: 'optimism-kovan', + title: 'Optimism Kovan', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.OPTIMISM_KOVAN}.webp`, + testnet: true, + blockExplorer: { + name: 'Etherscan (Optimism Kovan)', + rootUrl: 'https://kovan-optimistic.etherscan.io/' + }, + nativeToken: { + symbol: 'kETH', + name: 'Kovan Ether', + decimals: 18 + }, + deprecated: true + }, + [ChainId.OPTIMISM_GOERLI]: { + chainId: ChainId.OPTIMISM_GOERLI, + type: NetworkType.TESTNET, + name: 'optimism-goerli', + title: 'Optimism Goerli', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.OPTIMISM_GOERLI}.webp`, + testnet: true, + blockExplorer: { + name: 'Etherscan (Optimism Goerli)', + rootUrl: 'https://goerli-optimistic.etherscan.io/' + }, + nativeToken: { + symbol: 'gETH', + name: 'Goerli Ether', + decimals: 18 + }, + deprecated: true + }, + [ChainId.OPTIMISM_SEPOLIA]: { + chainId: ChainId.OPTIMISM_SEPOLIA, + type: NetworkType.TESTNET, + name: 'optimism-sepolia', + title: 'Optimism Sepolia', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.OPTIMISM_SEPOLIA}.webp`, + testnet: true, + blockExplorer: { + name: 'Etherscan (Optimism Sepolia)', + rootUrl: 'https://sepolia-optimistic.etherscan.io/' + }, + nativeToken: { + symbol: 'sETH', + name: 'Sepolia Ether', + decimals: 18 + } + }, + [ChainId.ARBITRUM]: { + chainId: ChainId.ARBITRUM, + type: NetworkType.MAINNET, + name: 'arbitrum', + title: 'Arbitrum One', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.ARBITRUM}.webp`, + blockExplorer: { + name: 'Arbiscan', + rootUrl: 'https://arbiscan.io/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.ARBITRUM_GOERLI]: { + chainId: ChainId.ARBITRUM_GOERLI, + type: NetworkType.TESTNET, + name: 'arbitrum-goerli', + title: 'Arbitrum Goerli', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.ARBITRUM_GOERLI}.webp`, + testnet: true, + blockExplorer: { + name: 'Arbiscan (Goerli Testnet)', + rootUrl: 'https://testnet.arbiscan.io/' + }, + nativeToken: { + symbol: 'gETH', + name: 'Goerli Ether', + decimals: 18 + }, + deprecated: true + }, + [ChainId.ARBITRUM_SEPOLIA]: { + chainId: ChainId.ARBITRUM_SEPOLIA, + type: NetworkType.TESTNET, + name: 'arbitrum-sepolia', + title: 'Arbitrum Sepolia', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.ARBITRUM_SEPOLIA}.webp`, + testnet: true, + blockExplorer: { + name: 'Arbiscan (Sepolia Testnet)', + rootUrl: 'https://sepolia.arbiscan.io/' + }, + nativeToken: { + symbol: 'sETH', + name: 'Sepolia Ether', + decimals: 18 + } + }, + [ChainId.ARBITRUM_NOVA]: { + chainId: ChainId.ARBITRUM_NOVA, + type: NetworkType.MAINNET, + name: 'arbitrum-nova', + title: 'Arbitrum Nova', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.ARBITRUM_NOVA}.webp`, + blockExplorer: { + name: 'Arbiscan Nova', + rootUrl: 'https://nova.arbiscan.io/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.AVALANCHE]: { + chainId: ChainId.AVALANCHE, + type: NetworkType.MAINNET, + name: 'avalanche', + title: 'Avalanche', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.AVALANCHE}.webp`, + blockExplorer: { + name: 'Snowtrace', + rootUrl: 'https://subnets.avax.network/c-chain/' + }, + nativeToken: { + symbol: 'AVAX', + name: 'AVAX', + decimals: 18 + } + }, + [ChainId.AVALANCHE_TESTNET]: { + chainId: ChainId.AVALANCHE_TESTNET, + type: NetworkType.TESTNET, + name: 'avalanche-testnet', + title: 'Avalanche Testnet', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.AVALANCHE_TESTNET}.webp`, + testnet: true, + blockExplorer: { + name: 'Snowtrace (Testnet)', + rootUrl: 'https://subnets-test.avax.network/c-chain/' + }, + nativeToken: { + symbol: 'tAVAX', + name: 'Testnet AVAX', + decimals: 18 + } + }, + [ChainId.GNOSIS]: { + chainId: ChainId.GNOSIS, + type: NetworkType.MAINNET, + name: 'gnosis', + title: 'Gnosis Chain', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.GNOSIS}.webp`, + blockExplorer: { + name: 'Gnosis Chain Explorer', + rootUrl: 'https://blockscout.com/xdai/mainnet/' + }, + nativeToken: { + symbol: 'XDAI', + name: 'XDAI', + decimals: 18 + } + }, + [ChainId.BASE]: { + chainId: ChainId.BASE, + type: NetworkType.MAINNET, + name: 'base', + title: 'Base (Coinbase)', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.BASE}.webp`, + blockExplorer: { + name: 'Base Explorer', + rootUrl: 'https://basescan.org/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.BASE_GOERLI]: { + chainId: ChainId.BASE_GOERLI, + type: NetworkType.TESTNET, + name: 'base-goerli', + title: 'Base Goerli', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.BASE_GOERLI}.webp`, + testnet: true, + blockExplorer: { + name: 'Base Goerli Explorer', + rootUrl: 'https://goerli.basescan.org/' + }, + nativeToken: { + symbol: 'gETH', + name: 'Goerli Ether', + decimals: 18 + }, + deprecated: true + }, + [ChainId.BASE_SEPOLIA]: { + chainId: ChainId.BASE_SEPOLIA, + type: NetworkType.TESTNET, + name: 'base-sepolia', + title: 'Base Sepolia', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.BASE_SEPOLIA}.webp`, + testnet: true, + blockExplorer: { + name: 'Base Sepolia Explorer', + rootUrl: 'https://base-sepolia.blockscout.com/' + }, + nativeToken: { + symbol: 'sETH', + name: 'Sepolia Ether', + decimals: 18 + } + }, + [ChainId.HOMEVERSE]: { + chainId: ChainId.HOMEVERSE, + type: NetworkType.MAINNET, + name: 'homeverse', + title: 'Oasys Homeverse', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.HOMEVERSE}.webp`, + blockExplorer: { + name: 'Oasys Homeverse Explorer', + rootUrl: 'https://explorer.oasys.homeverse.games/' + }, + nativeToken: { + symbol: 'OAS', + name: 'OAS', + decimals: 18 + } + }, + [ChainId.HOMEVERSE_TESTNET]: { + chainId: ChainId.HOMEVERSE_TESTNET, + type: NetworkType.TESTNET, + name: 'homeverse-testnet', + title: 'Oasys Homeverse Testnet', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.HOMEVERSE_TESTNET}.webp`, + testnet: true, + blockExplorer: { + name: 'Oasys Homeverse Explorer (Testnet)', + rootUrl: 'https://explorer.testnet.oasys.homeverse.games/' + }, + nativeToken: { + symbol: 'tOAS', + name: 'Testnet OAS', + decimals: 18 + } + }, + [ChainId.XAI]: { + chainId: ChainId.XAI, + type: NetworkType.MAINNET, + name: 'xai', + title: 'Xai', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.XAI}.webp`, + blockExplorer: { + name: 'Xai Explorer', + rootUrl: 'https://explorer.xai-chain.net/' + }, + nativeToken: { + symbol: 'XAI', + name: 'XAI', + decimals: 18 + } + }, + [ChainId.XAI_SEPOLIA]: { + chainId: ChainId.XAI_SEPOLIA, + type: NetworkType.TESTNET, + name: 'xai-sepolia', + title: 'Xai Sepolia', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.XAI_SEPOLIA}.webp`, + testnet: true, + blockExplorer: { + name: 'Xai Sepolia Explorer', + rootUrl: 'https://testnet-explorer-v2.xai-chain.net/' + }, + nativeToken: { + symbol: 'sXAI', + name: 'Sepolia XAI', + decimals: 18 + } + }, + [ChainId.ASTAR_ZKEVM]: { + chainId: ChainId.ASTAR_ZKEVM, + type: NetworkType.MAINNET, + name: 'astar-zkevm', + title: 'Astar zkEVM', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.ASTAR_ZKEVM}.webp`, + blockExplorer: { + name: 'Astar zkEVM Explorer', + rootUrl: 'https://astar-zkevm.explorer.startale.com/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.ASTAR_ZKYOTO]: { + chainId: ChainId.ASTAR_ZKYOTO, + type: NetworkType.TESTNET, + name: 'astar-zkyoto', + title: 'Astar zKyoto Testnet', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.ASTAR_ZKYOTO}.webp`, + testnet: true, + blockExplorer: { + name: 'Astar zKyoto Explorer', + rootUrl: 'https://astar-zkyoto.blockscout.com/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.XR_SEPOLIA]: { + chainId: ChainId.XR_SEPOLIA, + type: NetworkType.TESTNET, + name: 'xr-sepolia', + title: 'XR Sepolia', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.XR_SEPOLIA}.webp`, + testnet: true, + blockExplorer: { + name: 'XR Sepolia Explorer', + rootUrl: 'https://xr-sepolia-testnet.explorer.caldera.xyz/' + }, + nativeToken: { + symbol: 'tXR', + name: 'Sepolia XR', + decimals: 18 + } + }, + [ChainId.B3_SEPOLIA]: { + chainId: ChainId.B3_SEPOLIA, + type: NetworkType.TESTNET, + name: 'b3-sepolia', + title: 'B3 Sepolia', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.B3_SEPOLIA}.webp`, + testnet: true, + blockExplorer: { + name: 'B3 Sepolia Explorer', + rootUrl: 'https://sepolia.explorer.b3.fun/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.APECHAIN_TESTNET]: { + chainId: ChainId.APECHAIN_TESTNET, + type: NetworkType.TESTNET, + name: 'apechain-testnet', + title: 'APE Chain Testnet', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.APECHAIN_TESTNET}.webp`, + testnet: true, + blockExplorer: { + name: 'APE Chain Explorer', + rootUrl: 'https://curtis.explorer.caldera.xyz/' + }, + nativeToken: { + symbol: 'APE', + name: 'ApeCoin', + decimals: 18 + } + }, + [ChainId.BLAST]: { + chainId: ChainId.BLAST, + type: NetworkType.MAINNET, + name: 'blast', + title: 'Blast', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.BLAST}.webp`, + blockExplorer: { + name: 'Blast Explorer', + rootUrl: 'https://blastscan.io/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.BLAST_SEPOLIA]: { + chainId: ChainId.BLAST_SEPOLIA, + type: NetworkType.TESTNET, + name: 'blast-sepolia', + title: 'Blast Sepolia', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.BLAST_SEPOLIA}.webp`, + testnet: true, + blockExplorer: { + name: 'Blast Sepolia Explorer', + rootUrl: 'https://sepolia.blastexplorer.io/' + }, + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.TELOS]: { + chainId: ChainId.TELOS, + type: NetworkType.MAINNET, + name: 'telos', + title: 'Telos', + logoURI: `https://assets.sequence.info/images/networks/medium/${ChainId.TELOS}.webp`, + blockExplorer: { + name: 'Telos Explorer', + rootUrl: 'https://explorer.telos.net/network/' + }, + nativeToken: { + symbol: 'TLOS', + name: 'TLOS', + decimals: 18 + } + }, + + [ChainId.HARDHAT]: { + chainId: ChainId.HARDHAT, + name: 'hardhat', + title: 'Hardhat (local testnet)', + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + }, + [ChainId.HARDHAT_2]: { + chainId: ChainId.HARDHAT_2, + name: 'hardhat2', + title: 'Hardhat (local testnet)', + nativeToken: { + symbol: 'ETH', + name: 'Ether', + decimals: 18 + } + } +} diff --git a/packages/network/src/index.ts b/packages/network/src/index.ts new file mode 100644 index 000000000..c042b0908 --- /dev/null +++ b/packages/network/src/index.ts @@ -0,0 +1,5 @@ +export * from './constants' +export * from './config' +export * from './json-rpc' +export * from './json-rpc-provider' +export * from './utils' diff --git a/packages/network/src/json-rpc-provider.ts b/packages/network/src/json-rpc-provider.ts new file mode 100644 index 000000000..4c2404af0 --- /dev/null +++ b/packages/network/src/json-rpc-provider.ts @@ -0,0 +1,108 @@ +import { ethers } from 'ethers' +import { + JsonRpcRouter, + JsonRpcSender, + loggingProviderMiddleware, + EagerProvider, + SingleflightMiddleware, + CachedProvider, + JsonRpcMiddleware, + JsonRpcMiddlewareHandler +} from './json-rpc' +import { ChainId, networks } from './constants' + +export interface JsonRpcProviderOptions { + // .. + chainId?: number + + // .. + middlewares?: Array + + // .. + blockCache?: boolean | string[] +} + +// JsonRpcProvider with a middleware stack. By default it will use a simple caching middleware. +export class JsonRpcProvider extends ethers.providers.JsonRpcProvider { + private _chainId?: number + private _sender: JsonRpcSender + + constructor(url: ethers.utils.ConnectionInfo | string, options?: JsonRpcProviderOptions) { + super(url, options?.chainId) + + const chainId = options?.chainId + const middlewares = options?.middlewares + const blockCache = options?.blockCache + + this._chainId = chainId + + // NOTE: it will either use the middleware stack passed to the constructor + // or it will use the default caching middleware provider. It does not concat them, + // so if you set middlewares, make sure you set the caching middleware yourself if you'd + // like to keep using it. + const router = new JsonRpcRouter( + middlewares ?? [ + // loggingProviderMiddleware, + new EagerProvider({ chainId }), + new SingleflightMiddleware(), + new CachedProvider({ defaultChainId: chainId, blockCache: blockCache }) + ], + new JsonRpcSender(this.fetch, chainId) + ) + + this._sender = new JsonRpcSender(router, chainId) + } + + async getNetwork(): Promise { + const chainId = this._chainId + if (chainId) { + const network = networks[chainId as ChainId] + const name = network?.name || '' + const ensAddress = network?.ensAddress + return { + name: name, + chainId: chainId, + ensAddress: ensAddress + } + } else { + const chainIdHex = await this.send('eth_chainId', []) + this._chainId = ethers.BigNumber.from(chainIdHex).toNumber() + return this.getNetwork() + } + } + + send = (method: string, params: Array): Promise => { + return this._sender.send(method, params) + } + + private fetch = (method: string, params: Array): Promise => { + const request = { + method: method, + params: params, + id: this._nextId++, + jsonrpc: '2.0' + } + + const result = ethers.utils.fetchJson(this.connection, JSON.stringify(request), getResult).then( + result => { + return result + }, + error => { + throw error + } + ) + + return result + } +} + +function getResult(payload: { error?: { code?: number; data?: any; message?: string }; result?: any }): any { + if (payload.error) { + // @TODO: not any + const error: any = new Error(payload.error.message) + error.code = payload.error.code + error.data = payload.error.data + throw error + } + return payload.result +} diff --git a/packages/network/src/json-rpc/index.ts b/packages/network/src/json-rpc/index.ts new file mode 100644 index 000000000..6eceac084 --- /dev/null +++ b/packages/network/src/json-rpc/index.ts @@ -0,0 +1,5 @@ +export * from './types' +export * from './router' +export * from './sender' +export * from './middleware' +export * from './utils' diff --git a/packages/network/src/json-rpc/middleware/allow-provider.ts b/packages/network/src/json-rpc/middleware/allow-provider.ts new file mode 100644 index 000000000..5d5c624a6 --- /dev/null +++ b/packages/network/src/json-rpc/middleware/allow-provider.ts @@ -0,0 +1,42 @@ +import { + JsonRpcHandlerFunc, + JsonRpcRequest, + JsonRpcResponseCallback, + JsonRpcMiddleware, + JsonRpcMiddlewareHandler +} from '../types' + +export class AllowProvider implements JsonRpcMiddlewareHandler { + sendAsyncMiddleware: JsonRpcMiddleware + + private isAllowedFunc: (request: JsonRpcRequest) => boolean + + constructor(isAllowedFunc?: (request: JsonRpcRequest) => boolean) { + if (isAllowedFunc) { + this.isAllowedFunc = isAllowedFunc + } else { + this.isAllowedFunc = (request: JsonRpcRequest): boolean => true + } + + this.sendAsyncMiddleware = allowProviderMiddleware(this.isAllowedFunc) + } + + setIsAllowedFunc(fn: (request: JsonRpcRequest) => boolean) { + this.isAllowedFunc = fn + this.sendAsyncMiddleware = allowProviderMiddleware(this.isAllowedFunc) + } +} + +export const allowProviderMiddleware = + (isAllowed: (request: JsonRpcRequest) => boolean): JsonRpcMiddleware => + (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + // ensure precondition is met or do not allow the request to continue + if (!isAllowed(request)) { + throw new Error('allowProvider middleware precondition is unmet.') + } + + // request is allowed. keep going.. + next(request, callback, chainId) + } + } diff --git a/packages/network/src/json-rpc/middleware/cached-provider.ts b/packages/network/src/json-rpc/middleware/cached-provider.ts new file mode 100644 index 000000000..7ede68530 --- /dev/null +++ b/packages/network/src/json-rpc/middleware/cached-provider.ts @@ -0,0 +1,175 @@ +import { JsonRpcHandlerFunc, JsonRpcRequest, JsonRpcResponse, JsonRpcResponseCallback, JsonRpcMiddlewareHandler } from '../types' + +export interface CachedProviderOptions { + // defaultChainId passes a chainId to provider handler if one isn't passed. + // This is used in multi-chain mode + defaultChainId?: number + + // blockCache toggle, with option to pass specific set of methods to use with + // the block cache. + blockCache?: boolean | string[] +} + +export class CachedProvider implements JsonRpcMiddlewareHandler { + // cachableJsonRpcMethods which can be permanently cached for lifetime + // of the provider. + private cachableJsonRpcMethods = [ + 'net_version', + 'eth_chainId', + 'eth_accounts', + 'sequence_getWalletContext', + 'sequence_getNetworks' + ] + + // cachableJsonRpcMethodsByBlock which can be temporarily cached for a short + // period of time, essentially by block time. As we support chains fast blocks, + // we keep the values here cachable only for 1.5 seconds. This is still useful to + // memoize the calls within app-code that calls out to fetch these values within + // a short period of time. + private cachableJsonRpcMethodsByBlock: string[] = ['eth_call', 'eth_getCode'] + + // cache for life-time of provider (unless explicitly cleared) + private cache: { [key: string]: any } + + // cache by block, simulated by using a 1 second life-time + private cacheByBlock: { [key: string]: any } + private cacheByBlockResetLock: boolean = false + + // onUpdateCallback callback to be notified when cache values are set. + private onUpdateCallback?: (key?: string, value?: any) => void + + // defaultChainId is used for default chain select with used with multi-chain provider + readonly defaultChainId?: number + + constructor(options?: CachedProviderOptions) { + this.cache = {} + this.cacheByBlock = {} + this.defaultChainId = options?.defaultChainId + if (!options?.blockCache) { + this.cachableJsonRpcMethodsByBlock = [] + } else if (options?.blockCache !== true) { + this.cachableJsonRpcMethodsByBlock = options?.blockCache + } + } + + sendAsyncMiddleware = (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + // Respond early with cached result + if (this.cachableJsonRpcMethods.includes(request.method) || this.cachableJsonRpcMethodsByBlock.includes(request.method)) { + const key = this.cacheKey(request.method, request.params!, chainId || this.defaultChainId) + const result = this.getCacheValue(key) + if (result && result !== '') { + callback(undefined, { + jsonrpc: '2.0', + id: request.id!, + result: result + }) + return + } + } + + // Continue down the handler chain + next( + request, + (error: any, response?: JsonRpcResponse, chainId?: number) => { + // Store result in cache and continue + if ( + this.cachableJsonRpcMethods.includes(request.method) || + this.cachableJsonRpcMethodsByBlock.includes(request.method) + ) { + if (response && response.result && this.shouldCacheResponse(request, response)) { + // cache the value + const key = this.cacheKey(request.method, request.params!, chainId || this.defaultChainId) + + if (this.cachableJsonRpcMethods.includes(request.method)) { + this.setCacheValue(key, response.result) + } else { + this.setCacheByBlockValue(key, response.result) + } + } + } + + // Exec next handler + callback(error, response) + }, + chainId || this.defaultChainId + ) + } + } + + cacheKey = (method: string, params: any[], chainId?: number) => { + let key = '' + if (chainId) { + key = `${chainId}:${method}:` + } else { + key = `:${method}:` + } + if (!params || params.length === 0) { + return key + '[]' + } + return key + JSON.stringify(params) + } + + getCache = () => this.cache + + setCache = (cache: { [key: string]: any }) => { + this.cache = cache + if (this.onUpdateCallback) { + this.onUpdateCallback() + } + } + + getCacheValue = (key: string): any => { + if (this.cache[key]) { + return this.cache[key] + } + if (this.cacheByBlock[key]) { + return this.cacheByBlock[key] + } + return undefined + } + + setCacheValue = (key: string, value: any) => { + this.cache[key] = value + if (this.onUpdateCallback) { + this.onUpdateCallback(key, value) + } + } + + setCacheByBlockValue = (key: string, value: any) => { + this.cacheByBlock[key] = value + + // clear the cacheByBlock once every X period of time + if (!this.cacheByBlockResetLock) { + this.cacheByBlockResetLock = true + setTimeout(() => { + this.cacheByBlockResetLock = false + this.cacheByBlock = {} + }, 1500) // 1.5 second cache lifetime + } + } + + shouldCacheResponse = (request: JsonRpcRequest, response?: JsonRpcResponse): boolean => { + // skip if we do not have response result + if (!response || !response.result) { + return false + } + + // skip caching eth_getCode where resposne value is '0x' or empty + if (request.method === 'eth_getCode' && response.result.length <= 2) { + return false + } + + // all good -- signal to cache the result + return true + } + + onUpdate(callback: (key?: string, value?: any) => void) { + this.onUpdateCallback = callback + } + + clearCache = () => { + this.cache = {} + this.cacheByBlock = {} + } +} diff --git a/packages/network/src/json-rpc/middleware/eager-provider.ts b/packages/network/src/json-rpc/middleware/eager-provider.ts new file mode 100644 index 000000000..df85adc44 --- /dev/null +++ b/packages/network/src/json-rpc/middleware/eager-provider.ts @@ -0,0 +1,62 @@ +import { commons } from '@0xsequence/core' +import { ethers } from 'ethers' +import { JsonRpcHandlerFunc, JsonRpcRequest, JsonRpcResponseCallback, JsonRpcResponse, JsonRpcMiddlewareHandler } from '../types' + +// EagerProvider will eagerly respond to a provider request from pre-initialized data values. +// +// This is useful for saving a few remote calls for responses we're already expecting when +// communicating to a specific network provider. + +export type EagerProviderOptions = { + accountAddress?: string + chainId?: number + walletContext?: commons.context.VersionedContext +} + +export class EagerProvider implements JsonRpcMiddlewareHandler { + readonly options: EagerProviderOptions + + constructor(options: EagerProviderOptions) { + this.options = options + } + + sendAsyncMiddleware = (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + const { id, method } = request + + switch (method) { + case 'net_version': + if (this.options.chainId) { + callback(undefined, { jsonrpc: '2.0', id: id!, result: `${this.options.chainId}` }) + return + } + break + + case 'eth_chainId': + if (this.options.chainId) { + callback(undefined, { jsonrpc: '2.0', id: id!, result: ethers.utils.hexlify(this.options.chainId) }) + return + } + break + + case 'eth_accounts': + if (this.options.accountAddress) { + callback(undefined, { jsonrpc: '2.0', id: id!, result: [ethers.utils.getAddress(this.options.accountAddress)] }) + return + } + break + + case 'sequence_getWalletContext': + if (this.options.walletContext) { + callback(undefined, { jsonrpc: '2.0', id: id!, result: this.options.walletContext }) + return + } + break + + default: + } + + next(request, callback, chainId) + } + } +} diff --git a/packages/network/src/json-rpc/middleware/exception-provider.ts b/packages/network/src/json-rpc/middleware/exception-provider.ts new file mode 100644 index 000000000..570051a07 --- /dev/null +++ b/packages/network/src/json-rpc/middleware/exception-provider.ts @@ -0,0 +1,21 @@ +import { JsonRpcHandlerFunc, JsonRpcRequest, JsonRpcResponse, JsonRpcResponseCallback, JsonRpcMiddleware } from '../types' + +export const exceptionProviderMiddleware: JsonRpcMiddleware = (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + next( + request, + (error: any, response?: JsonRpcResponse) => { + if (!error && response && response.error) { + if (typeof response.error === 'string') { + throw new Error(response.error) + } else { + throw new Error(response.error.message) + } + } + + callback(error, response) + }, + chainId + ) + } +} diff --git a/packages/network/src/json-rpc/middleware/index.ts b/packages/network/src/json-rpc/middleware/index.ts new file mode 100644 index 000000000..2f292adab --- /dev/null +++ b/packages/network/src/json-rpc/middleware/index.ts @@ -0,0 +1,9 @@ +export { AllowProvider, allowProviderMiddleware } from './allow-provider' +export { CachedProvider } from './cached-provider' +export { EagerProvider } from './eager-provider' +export { exceptionProviderMiddleware } from './exception-provider' +export { loggingProviderMiddleware } from './logging-provider' +export { networkProviderMiddleware } from './network-provider' +export { PublicProvider } from './public-provider' +export { SigningProvider } from './signing-provider' +export { SingleflightMiddleware } from './singleflight' diff --git a/packages/network/src/json-rpc/middleware/logging-provider.ts b/packages/network/src/json-rpc/middleware/logging-provider.ts new file mode 100644 index 000000000..a64e78763 --- /dev/null +++ b/packages/network/src/json-rpc/middleware/logging-provider.ts @@ -0,0 +1,33 @@ +import { JsonRpcHandlerFunc, JsonRpcRequest, JsonRpcResponse, JsonRpcResponseCallback, JsonRpcMiddleware } from '../types' +import { logger } from '@0xsequence/utils' + +// TODO: rename to loggerMiddleware +export const loggingProviderMiddleware: JsonRpcMiddleware = (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + const chainIdLabel = chainId ? ` chainId:${chainId}` : '' + logger.info(`[provider request]${chainIdLabel} id:${request.id} method:${request.method} params:`, request.params) + + next( + request, + (error: any, response?: JsonRpcResponse) => { + if (error) { + logger.warn( + `[provider response]${chainIdLabel} id:${request.id} method:${request.method} params:`, + request.params, + `error:`, + error + ) + } else { + logger.info( + `[provider response]${chainIdLabel} id:${request.id} method:${request.method} params:`, + request.params, + `response:`, + response + ) + } + callback(error, response) + }, + chainId + ) + } +} diff --git a/packages/network/src/json-rpc/middleware/network-provider.ts b/packages/network/src/json-rpc/middleware/network-provider.ts new file mode 100644 index 000000000..75bba1007 --- /dev/null +++ b/packages/network/src/json-rpc/middleware/network-provider.ts @@ -0,0 +1,33 @@ +import { ethers } from 'ethers' +import { + JsonRpcHandlerFunc, + JsonRpcRequest, + JsonRpcResponseCallback, + JsonRpcMiddleware, + JsonRpcMiddlewareHandler +} from '../types' + +export const networkProviderMiddleware = + (getChainId: (request: JsonRpcRequest) => number): JsonRpcMiddleware => + (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + const networkChainId = getChainId(request) + + const { id, method } = request + + switch (method) { + case 'net_version': + callback(undefined, { jsonrpc: '2.0', id: id!, result: `${networkChainId}` }) + return + + case 'eth_chainId': + callback(undefined, { jsonrpc: '2.0', id: id!, result: ethers.utils.hexlify(networkChainId) }) + return + + default: + } + + // request is allowed. keep going.. + next(request, callback, chainId) + } + } diff --git a/packages/network/src/json-rpc/middleware/public-provider.ts b/packages/network/src/json-rpc/middleware/public-provider.ts new file mode 100644 index 000000000..7b0b1042e --- /dev/null +++ b/packages/network/src/json-rpc/middleware/public-provider.ts @@ -0,0 +1,56 @@ +import { providers } from 'ethers' +import { JsonRpcHandlerFunc, JsonRpcRequest, JsonRpcResponseCallback, JsonRpcMiddlewareHandler } from '../types' +import { SignerJsonRpcMethods } from './signing-provider' +import { logger } from '@0xsequence/utils' + +export class PublicProvider implements JsonRpcMiddlewareHandler { + private privateJsonRpcMethods = ['net_version', 'eth_chainId', 'eth_accounts', ...SignerJsonRpcMethods] + + private provider?: providers.JsonRpcProvider + private rpcUrl?: string + + constructor(rpcUrl?: string) { + if (rpcUrl) { + this.setRpcUrl(rpcUrl) + } + } + + sendAsyncMiddleware = (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + // When provider is configured, send non-private methods to our local public provider + if (this.provider && !this.privateJsonRpcMethods.includes(request.method)) { + this.provider + .send(request.method, request.params!) + .then(r => { + callback(undefined, { + jsonrpc: '2.0', + id: request.id!, + result: r + }) + }) + .catch(e => callback(e)) + return + } + + // Continue to next handler + logger.debug('[public-provider] sending request to signer window', request.method) + next(request, callback) + } + } + + getRpcUrl() { + return this.rpcUrl + } + + setRpcUrl(rpcUrl: string) { + if (!rpcUrl || rpcUrl === '') { + this.rpcUrl = undefined + this.provider = undefined + } else { + this.rpcUrl = rpcUrl + // TODO: maybe use @0xsequence/network JsonRpcProvider here instead, + // which supports better caching. + this.provider = new providers.JsonRpcProvider(rpcUrl) + } + } +} diff --git a/packages/network/src/json-rpc/middleware/signing-provider.ts b/packages/network/src/json-rpc/middleware/signing-provider.ts new file mode 100644 index 000000000..fab1bcccf --- /dev/null +++ b/packages/network/src/json-rpc/middleware/signing-provider.ts @@ -0,0 +1,51 @@ +import { JsonRpcHandlerFunc, JsonRpcRequest, JsonRpcResponseCallback, JsonRpcMiddlewareHandler, JsonRpcHandler } from '../types' + +export const SignerJsonRpcMethods = [ + 'personal_sign', + 'eth_sign', + 'eth_signTypedData', + 'eth_signTypedData_v4', + 'eth_sendTransaction', + 'eth_sendRawTransaction', + 'sequence_sign', // sequence-aware personal_sign + 'sequence_signTypedData_v4', // sequence-aware eth_signTypedData_v4 + + 'sequence_getWalletContext', + 'sequence_getWalletConfig', + 'sequence_getWalletState', + 'sequence_getNetworks', + 'sequence_updateConfig', + 'sequence_publishConfig', + 'sequence_gasRefundOptions', + 'sequence_getNonce', + 'sequence_relay', + + 'eth_decrypt', + 'eth_getEncryptionPublicKey', + 'wallet_addEthereumChain', + 'wallet_switchEthereumChain', + 'wallet_registerOnboarding', + 'wallet_watchAsset', + 'wallet_scanQRCode' +] + +export class SigningProvider implements JsonRpcMiddlewareHandler { + private provider: JsonRpcHandler + + constructor(provider: JsonRpcHandler) { + this.provider = provider + } + + sendAsyncMiddleware = (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + // Forward signing requests to the signing provider + if (SignerJsonRpcMethods.includes(request.method)) { + this.provider.sendAsync(request, callback, chainId) + return + } + + // Continue to next handler + next(request, callback, chainId) + } + } +} diff --git a/packages/network/src/json-rpc/middleware/singleflight.ts b/packages/network/src/json-rpc/middleware/singleflight.ts new file mode 100644 index 000000000..324a478fa --- /dev/null +++ b/packages/network/src/json-rpc/middleware/singleflight.ts @@ -0,0 +1,95 @@ +import { JsonRpcHandlerFunc, JsonRpcRequest, JsonRpcResponse, JsonRpcResponseCallback, JsonRpcMiddlewareHandler } from '../types' + +export class SingleflightMiddleware implements JsonRpcMiddlewareHandler { + private singleflightJsonRpcMethods = [ + 'eth_chainId', + 'net_version', + 'eth_call', + 'eth_getCode', + 'eth_blockNumber', + 'eth_getBalance', + 'eth_getStorageAt', + 'eth_getTransactionCount', + 'eth_getBlockTransactionCountByHash', + 'eth_getBlockTransactionCountByNumber', + 'eth_getUncleCountByBlockHash', + 'eth_getUncleCountByBlockNumber', + 'eth_getBlockByHash', + 'eth_getBlockByNumber', + 'eth_getTransactionByHash', + 'eth_getTransactionByBlockHashAndIndex', + 'eth_getTransactionByBlockNumberAndIndex', + 'eth_getTransactionReceipt', + 'eth_getUncleByBlockHashAndIndex', + 'eth_getUncleByBlockNumberAndIndex', + 'eth_getLogs' + ] + + inflight: { [key: string]: { id: number; callback: JsonRpcResponseCallback }[] } + + constructor() { + this.inflight = {} + } + + sendAsyncMiddleware = (next: JsonRpcHandlerFunc) => { + return (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + // continue to next handler if method isn't part of methods list + if (!this.singleflightJsonRpcMethods.includes(request.method)) { + next(request, callback, chainId) + return + } + + const key = this.requestKey(request.method, request.params || [], chainId) + + if (!this.inflight[key]) { + // first request -- init the empty list + this.inflight[key] = [] + } else { + // already in-flight, add the callback to the list and return + this.inflight[key].push({ id: request.id!, callback }) + return + } + + // Continue down the handler chain + next( + request, + (error: any, response?: JsonRpcResponse, chainId?: number) => { + // callback the original request + callback(error, response) + + // callback all other requests of the same kind in queue, with the + // same response result as from the first response. + for (let i = 0; i < this.inflight[key].length; i++) { + const sub = this.inflight[key][i] + if (error) { + sub.callback(error, response) + } else if (response) { + sub.callback(undefined, { + jsonrpc: '2.0', + id: sub.id, + result: response!.result + }) + } + } + + // clear request key + delete this.inflight[key] + }, + chainId + ) + } + } + + requestKey = (method: string, params: any[], chainId?: number) => { + let key = '' + if (chainId) { + key = `${chainId}:${method}:` + } else { + key = `:${method}:` + } + if (!params || params.length === 0) { + return key + '[]' + } + return key + JSON.stringify(params) + } +} diff --git a/packages/network/src/json-rpc/router.ts b/packages/network/src/json-rpc/router.ts new file mode 100644 index 000000000..26e8a1fa8 --- /dev/null +++ b/packages/network/src/json-rpc/router.ts @@ -0,0 +1,54 @@ +import { + JsonRpcHandlerFunc, + JsonRpcRequest, + JsonRpcResponseCallback, + JsonRpcHandler, + JsonRpcMiddleware, + JsonRpcMiddlewareHandler +} from './types' + +export class JsonRpcRouter implements JsonRpcHandler { + private sender: JsonRpcHandler + private handler: JsonRpcHandlerFunc + + constructor(middlewares: Array, sender: JsonRpcHandler) { + this.sender = sender + if (middlewares) { + this.setMiddleware(middlewares) + } + } + + setMiddleware(middlewares: Array) { + this.handler = createJsonRpcMiddlewareStack(middlewares, this.sender.sendAsync) + } + + sendAsync(request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) { + try { + this.handler(request, callback, chainId) + } catch (err) { + callback(err, undefined) + } + } +} + +export const createJsonRpcMiddlewareStack = ( + middlewares: Array, + handler: JsonRpcHandlerFunc +): JsonRpcHandlerFunc => { + if (middlewares.length === 0) return handler + + const toMiddleware = (v: any): JsonRpcMiddleware => { + if (v.sendAsyncMiddleware) { + return (v as JsonRpcMiddlewareHandler).sendAsyncMiddleware + } else { + return v + } + } + + let chain: JsonRpcHandlerFunc + chain = toMiddleware(middlewares[middlewares.length - 1])(handler) + for (let i = middlewares.length - 2; i >= 0; i--) { + chain = toMiddleware(middlewares[i])(chain) + } + return chain +} diff --git a/packages/network/src/json-rpc/sender.ts b/packages/network/src/json-rpc/sender.ts new file mode 100644 index 000000000..28ad94a05 --- /dev/null +++ b/packages/network/src/json-rpc/sender.ts @@ -0,0 +1,99 @@ +import { providers } from 'ethers' +import { + JsonRpcRequest, + JsonRpcResponse, + JsonRpcResponseCallback, + JsonRpcHandler, + JsonRpcFetchFunc, + JsonRpcRequestFunc, + JsonRpcVersion +} from './types' +import { isJsonRpcProvider, isJsonRpcHandler } from './utils' + +type ExternalProvider = providers.ExternalProvider + +let _nextId = 0 + +export class JsonRpcSender implements JsonRpcHandler { + readonly send: JsonRpcFetchFunc + readonly request: JsonRpcRequestFunc + readonly defaultChainId?: number + + constructor(provider: providers.JsonRpcProvider | JsonRpcHandler | JsonRpcFetchFunc, defaultChainId?: number) { + this.defaultChainId = defaultChainId + + if (isJsonRpcProvider(provider)) { + // we can ignore defaultChainId for JsonRpcProviders as they are already chain-bound + this.send = provider.send.bind(provider) + } else if (isJsonRpcHandler(provider)) { + this.send = (method: string, params?: Array, chainId?: number): Promise => { + return new Promise((resolve, reject) => { + provider.sendAsync( + { + // TODO: really shouldn't have to set these here? + jsonrpc: JsonRpcVersion, + id: ++_nextId, + method, + params + }, + (error: any, response?: JsonRpcResponse) => { + if (error) { + reject(error) + } else if (response) { + resolve(response.result) + } else { + resolve(undefined) + } + }, + chainId || this.defaultChainId + ) + }) + } + } else { + this.send = provider + } + + this.request = (request: { method: string; params?: any[] }, chainId?: number): Promise => { + return this.send(request.method, request.params, chainId) + } + } + + sendAsync = ( + request: JsonRpcRequest, + callback: JsonRpcResponseCallback | ((error: any, response: any) => void), + chainId?: number + ) => { + this.send(request.method, request.params, chainId || this.defaultChainId) + .then(r => { + callback(undefined, { + jsonrpc: '2.0', + id: request.id, + result: r + }) + }) + .catch(e => { + callback(e, undefined) + }) + } +} + +export class JsonRpcExternalProvider implements ExternalProvider, JsonRpcHandler { + constructor(private provider: providers.JsonRpcProvider) {} + + sendAsync = (request: JsonRpcRequest, callback: JsonRpcResponseCallback | ((error: any, response: any) => void)) => { + this.provider + .send(request.method, request.params!) + .then(r => { + callback(undefined, { + jsonrpc: '2.0', + id: request.id, + result: r + }) + }) + .catch(e => { + callback(e, undefined) + }) + } + + send = this.sendAsync +} diff --git a/packages/network/src/json-rpc/types.ts b/packages/network/src/json-rpc/types.ts new file mode 100644 index 000000000..cfe45f8fb --- /dev/null +++ b/packages/network/src/json-rpc/types.ts @@ -0,0 +1,39 @@ +export const JsonRpcVersion = '2.0' + +export interface JsonRpcRequest { + jsonrpc?: string + id?: number + method: string + params?: any[] +} + +export interface JsonRpcResponse { + jsonrpc: string + id: number + result: any + error?: ProviderRpcError +} + +export type JsonRpcResponseCallback = (error?: ProviderRpcError, response?: JsonRpcResponse) => void + +export type JsonRpcHandlerFunc = (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => void + +export interface JsonRpcHandler { + sendAsync: JsonRpcHandlerFunc +} + +export type JsonRpcFetchFunc = (method: string, params?: any[], chainId?: number) => Promise + +// EIP-1193 function signature +export type JsonRpcRequestFunc = (request: { method: string; params?: any[] }, chainId?: number) => Promise + +export type JsonRpcMiddleware = (next: JsonRpcHandlerFunc) => JsonRpcHandlerFunc + +export interface JsonRpcMiddlewareHandler { + sendAsyncMiddleware: JsonRpcMiddleware +} + +export interface ProviderRpcError extends Error { + code?: number + data?: { [key: string]: any } +} diff --git a/packages/network/src/json-rpc/utils.ts b/packages/network/src/json-rpc/utils.ts new file mode 100644 index 000000000..7d03f965f --- /dev/null +++ b/packages/network/src/json-rpc/utils.ts @@ -0,0 +1,17 @@ +import { providers } from 'ethers' +import { JsonRpcHandler } from './types' + +export function isJsonRpcProvider(cand: any): cand is providers.JsonRpcProvider { + return ( + cand !== undefined && + cand.send !== undefined && + cand.constructor.defaultUrl !== undefined && + cand.detectNetwork !== undefined && + cand.getSigner !== undefined && + cand.perform !== undefined + ) +} + +export function isJsonRpcHandler(cand: any): cand is JsonRpcHandler { + return cand !== undefined && cand.sendAsync !== undefined +} diff --git a/packages/network/src/utils.ts b/packages/network/src/utils.ts new file mode 100644 index 000000000..648eb9a69 --- /dev/null +++ b/packages/network/src/utils.ts @@ -0,0 +1,210 @@ +import { ethers, BigNumberish } from 'ethers' +import { ChainIdLike } from '.' +import { NetworkConfig } from './config' + +export function isNetworkConfig(cand: any): cand is NetworkConfig { + return cand && cand.chainId !== undefined && cand.name !== undefined && cand.rpcUrl !== undefined && cand.relayer !== undefined +} + +export const getChainId = (chainId: ChainIdLike): number => { + if (typeof chainId === 'number') { + return chainId + } + if ((chainId).chainId) { + return (chainId).chainId + } + return ethers.BigNumber.from(chainId as BigNumberish).toNumber() +} + +export const maybeChainId = (chainId?: ChainIdLike): number | undefined => { + if (!chainId) return undefined + return getChainId(chainId) +} + +export const isValidNetworkConfig = ( + networkConfig: NetworkConfig | NetworkConfig[], + raise: boolean = false, + skipRelayerCheck: boolean = false +): boolean => { + if (!networkConfig) throw new Error(`invalid network config: empty config`) + + const configs: NetworkConfig[] = [] + if (Array.isArray(networkConfig)) { + configs.push(...networkConfig) + } else { + configs.push(networkConfig) + } + + if (configs.length === 0) { + if (raise) throw new Error(`invalid network config: empty config`) + return false + } + + // Ensure distinct chainId configs + const chainIds = configs.map(c => c.chainId).sort() + const dupes = chainIds.filter((c, i) => chainIds.indexOf(c) !== i) + if (dupes.length > 0) { + if (raise) throw new Error(`invalid network config: duplicate chainIds ${dupes}`) + return false + } + + // Downcase all network names + configs.forEach(c => (c.name = c.name.toLowerCase())) + + // Ensure distinct network names + const names = configs.map(c => c.name).sort() + const nameDupes = names.filter((c, i) => names.indexOf(c) !== i) + if (nameDupes.length > 0) { + if (raise) throw new Error(`invalid network config: duplicate network names ${nameDupes}`) + return false + } + + // Ensure rpcUrl or provider is specified + // Ensure relayerUrl or relayer is specified + // Ensure one default chain + // Ensure one auth chain + let defaultChain = false + for (let i = 0; i < configs.length; i++) { + const c = configs[i] + if ((!c.rpcUrl || c.rpcUrl === '') && !c.provider) { + if (raise) throw new Error(`invalid network config for chainId ${c.chainId}: rpcUrl or provider must be provided`) + return false + } + if (!skipRelayerCheck) { + if (!c.relayer) { + if (raise) throw new Error(`invalid network config for chainId ${c.chainId}: relayer must be provided`) + return false + } + } + if (c.isDefaultChain) { + if (defaultChain) { + if (raise) + throw new Error(`invalid network config for chainId ${c.chainId}: DefaultChain is already set by another config`) + return false + } + defaultChain = true + } + } + + if (!defaultChain) { + if (raise) throw new Error(`invalid network config: DefaultChain must be set`) + return false + } + + return true +} + +export const ensureValidNetworks = (networks: NetworkConfig[], skipRelayerCheck: boolean = false): NetworkConfig[] => { + isValidNetworkConfig(networks, true, skipRelayerCheck) + return networks +} + +export const ensureUniqueNetworks = (networks: NetworkConfig[], raise: boolean = true): boolean => { + const chainIds = networks.map(c => c.chainId).sort() + const dupes = chainIds.filter((c, i) => chainIds.indexOf(c) !== i) + if (dupes.length > 0) { + if (raise) throw new Error(`invalid network config: duplicate chainIds ${dupes}`) + return false + } + return true +} + +export const updateNetworkConfig = (src: Partial, dest: NetworkConfig) => { + if (!src || !dest) return + + if (!src.chainId && !src.name) { + throw new Error('failed to update network config: source config is missing chainId or name') + } + if (src.chainId !== dest.chainId && src.name !== dest.name) { + throw new Error('failed to update network config: one of chainId or name must match') + } + + if (src.rpcUrl) { + dest.rpcUrl = src.rpcUrl + dest.provider = undefined + } + if (src.provider) { + dest.provider = src.provider + } + if (src.relayer) { + dest.relayer = src.relayer + } +} + +export const validateAndSortNetworks = (networks: NetworkConfig[]) => { + return ensureValidNetworks(sortNetworks(networks)) +} + +export const findNetworkConfig = (networks: NetworkConfig[], chainId: ChainIdLike): NetworkConfig | undefined => { + if (typeof chainId === 'string') { + if (chainId.startsWith('0x')) { + const id = ethers.BigNumber.from(chainId).toNumber() + return networks.find(n => n.chainId === id) + } else { + return networks.find(n => n.name === chainId || `${n.chainId}` === chainId) + } + } else if (typeof chainId === 'number') { + return networks.find(n => n.chainId === chainId) + } else if ((chainId).chainId) { + return networks.find(n => n.chainId === (chainId).chainId) + } else if (ethers.BigNumber.isBigNumber(chainId)) { + const id = chainId.toNumber() + return networks.find(n => n.chainId === id) + } else { + return undefined + } +} + +export const checkNetworkConfig = (network: NetworkConfig, chainId: string | number): boolean => { + if (!network) return false + if (network.name === chainId) return true + if (network.chainId === chainId) return true + return false +} + +export const networksIndex = (networks: NetworkConfig[]): { [key: string]: NetworkConfig } => { + const index: { [key: string]: NetworkConfig } = {} + for (let i = 0; i < networks.length; i++) { + index[networks[i].name] = networks[i] + } + return index +} + +// TODO: we should remove sortNetworks in the future but this is a breaking change for dapp integrations on older versions <-> wallet +// sortNetworks orders the network config list by: defaultChain, authChain, ..rest by chainId ascending numbers +export const sortNetworks = (networks: NetworkConfig[]): NetworkConfig[] => { + if (!networks) { + return [] + } + + const config = networks.sort((a, b) => { + if (a.chainId === b.chainId) return 0 + return a.chainId < b.chainId ? -1 : 1 + }) + + // DefaultChain goes first + const defaultConfigIdx = config.findIndex(c => c.isDefaultChain) + if (defaultConfigIdx > 0) config.splice(0, 0, config.splice(defaultConfigIdx, 1)[0]) + + return config +} + +export const stringTemplate = (sTemplate: string, mData: any) => { + if (typeof sTemplate === 'string') { + mData = mData ? mData : {} + return sTemplate.replace(/\$\{\s*([$#@\-\d\w]+)\s*\}/gim, function (fullMath, grp) { + let val = mData[grp] + if (typeof val === 'function') { + val = val() + } else if (val === null || val === undefined) { + val = '' + } else if (typeof val === 'object' || typeof val === 'symbol') { + val = val.toString() + } else { + val = val.valueOf() + } + return val + }) + } + return '' +} diff --git a/packages/provider/README.md b/packages/provider/README.md new file mode 100644 index 000000000..1145018ae --- /dev/null +++ b/packages/provider/README.md @@ -0,0 +1,4 @@ +@0xsequence/provider +==================== + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/provider/hardhat1.config.js b/packages/provider/hardhat1.config.js new file mode 100644 index 000000000..e88cf69ac --- /dev/null +++ b/packages/provider/hardhat1.config.js @@ -0,0 +1,16 @@ +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: '0.7.6', + + networks: { + hardhat: { + initialBaseFeePerGas: 1, + chainId: 31337, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + }, + }, + } +} diff --git a/packages/provider/hardhat2.config.js b/packages/provider/hardhat2.config.js new file mode 100644 index 000000000..981cb7ce0 --- /dev/null +++ b/packages/provider/hardhat2.config.js @@ -0,0 +1,16 @@ +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: '0.7.6', + + networks: { + hardhat: { + initialBaseFeePerGas: 1, + chainId: 31338, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + }, + }, + } +} diff --git a/packages/provider/src/analytics.ts b/packages/provider/src/analytics.ts new file mode 100644 index 000000000..54cb2832e --- /dev/null +++ b/packages/provider/src/analytics.ts @@ -0,0 +1,47 @@ +import { Databeat, Event as DatabeatEvent, Auth, isBrowser } from '@databeat/tracker' + +export enum EventType { + // Core types part of Databeat + INIT, + VIEW, + + // Provider specific + SIGN_MESSAGE_REQUEST, + SIGN_TYPED_DATA_REQUEST, + SEND_TRANSACTION_REQUEST +} + +export type EventTypes = keyof typeof EventType +export type Event = DatabeatEvent + +// Analytics sub-class to add some custom helper methods +export class Analytics extends Databeat {} + +// Setup analytics tracker +export const setupAnalytics = (projectAccessKey: string, server?: string) => { + if (!server) { + server = 'https://nodes.sequence.app' + } + + // disable tracking if projectAccessKey is not set + const noop = !projectAccessKey + + // auth + const auth: Auth = {} + if (projectAccessKey) { + auth.headers = { 'X-Access-Key': projectAccessKey } + } + + return new Analytics(server, auth, { + noop: noop, + defaultEnabled: true, + privacy: { userIdHash: true, userAgentSalt: false }, + initProps: () => { + if (!isBrowser()) { + return {} + } else { + return { origin: window.location.origin } + } + } + }) +} diff --git a/packages/provider/src/client.ts b/packages/provider/src/client.ts new file mode 100644 index 000000000..ea280f641 --- /dev/null +++ b/packages/provider/src/client.ts @@ -0,0 +1,535 @@ +import { JsonRpcRequest, JsonRpcResponse, NetworkConfig } from '@0xsequence/network' +import { + ConnectDetails, + ConnectOptions, + ItemStore, + MuxMessageProvider, + MuxTransportTemplate, + OpenWalletIntent, + OptionalChainId, + OptionalEIP6492, + ProviderTransport, + WalletEventTypes, + WalletSession, + isMuxTransportTemplate, + isProviderTransport, + messageToBytes +} from '.' +import { commons } from '@0xsequence/core' +import { TypedData } from '@0xsequence/utils' +import { toExtended } from './extended' +import { Analytics, setupAnalytics } from './analytics' +import { ethers } from 'ethers' + +import packageJson from '../package.json' + +/** + * This session class is meant to persist the state of the wallet connection + * whitin the dapp. This enables the client to retain the wallet address (and some more) + * even if the user refreshes the page. Otherwise we would have to open the popup again. + */ +export class SequenceClientSession { + static readonly SESSION_LOCALSTORE_KEY = '@sequence.session' + + constructor(private store: ItemStore) {} + + connectedSession(): Required { + const session = this.getSession() + + if (session && session.accountAddress && session.walletContext && session.networks) { + return { + accountAddress: session.accountAddress!, + walletContext: session.walletContext!, + networks: session.networks! + } + } + + throw new Error('Sequence session not connected') + } + + hasSession(): boolean { + return this.getSession()?.accountAddress !== undefined + } + + setSession(session: WalletSession) { + return this.store.setItem(SequenceClientSession.SESSION_LOCALSTORE_KEY, JSON.stringify(session)) + } + + getSession(): WalletSession | undefined { + const session = this.store.getItem(SequenceClientSession.SESSION_LOCALSTORE_KEY) + + if (session) { + return JSON.parse(session) + } + + return undefined + } + + async clearSession() { + return this.store.removeItem(SequenceClientSession.SESSION_LOCALSTORE_KEY) + } +} + +/** + * The wallet webapp doesn't really care what's the "default chain" for the user. + * so we don't even bother to send this information to the wallet. Instead, we + * track it locally using storage, that way the data stays always in sync. + */ +export class DefaultChainIdTracker { + static readonly SESSION_CHAIN_ID_KEY = '@sequence.session.defaultChainId' + + callbacks: ((chainId: number) => void)[] = [] + + constructor( + private store: ItemStore, + private startingChainId: number = 1 + ) { + store.onItemChange(DefaultChainIdTracker.SESSION_CHAIN_ID_KEY, (value: string | null) => { + if (value) { + const chainId = parseInt(value) + this.callbacks.forEach(cb => cb(chainId)) + } + }) + } + + onDefaultChainIdChanged(callback: (chainId: number) => void) { + this.callbacks.push(callback) + return () => { + this.callbacks = this.callbacks.filter(cb => cb !== callback) + } + } + + setDefaultChainId(chainId: number) { + if (chainId !== this.getDefaultChainId()) { + this.store.setItem(DefaultChainIdTracker.SESSION_CHAIN_ID_KEY, chainId.toString()) + } + } + + getDefaultChainId(): number { + const read = this.store.getItem(DefaultChainIdTracker.SESSION_CHAIN_ID_KEY) + + if (!read || read.length === 0) { + return this.startingChainId + } + + return parseInt(read) + } +} + +export type SequenceClientOptions = { + defaultChainId?: number + defaultEIP6492?: boolean + projectAccessKey?: string + analytics?: boolean +} + +/** + * This is a wallet client for sequence wallet-webapp. It connects using *some* transport + * and it allows to perform all sequence specific (or write) operations related to the wallet. + *s + * It doesn't implement a full ethereum Provider, it doesn't include read-only methods. + */ + +// TODO: rename Client to transport.. or something.. like SequenceTransport .. +export class SequenceClient { + private readonly session: SequenceClientSession + private readonly defaultChainId: DefaultChainIdTracker + private readonly callbacks: { [K in keyof WalletEventTypes]?: WalletEventTypes[K][] } = {} + + public readonly transport: ProviderTransport + + public readonly defaultEIP6492: boolean + public readonly projectAccessKey?: string + public readonly analytics?: Analytics + + constructor(transport: ProviderTransport | MuxTransportTemplate, store: ItemStore, options?: SequenceClientOptions) { + if (isMuxTransportTemplate(transport)) { + this.transport = MuxMessageProvider.new(transport) + } else if (isProviderTransport(transport)) { + this.transport = transport + } else { + throw new Error('Invalid transport') + } + + const defaultChainId = options?.defaultChainId + this.defaultEIP6492 = options?.defaultEIP6492 ?? false + + this.session = new SequenceClientSession(store) + this.defaultChainId = new DefaultChainIdTracker(store, defaultChainId) + + this.transport.on('accountsChanged', (accounts: string[]) => { + if (accounts.length > 1) { + console.warn('SequenceClient: wallet-webapp returned more than one account') + } + + this.callbacks.accountsChanged?.forEach(cb => cb(accounts)) + }) + + this.transport.on('connect', (response: ConnectDetails) => { + const chainIdHex = ethers.utils.hexValue(this.getChainId()) + this.callbacks.connect?.forEach(cb => + cb({ + ...response, + // Ignore the full connect response + // use the chainId defined locally + chainId: chainIdHex + }) + ) + }) + + this.transport.on('disconnect', (error, origin) => { + this.callbacks.disconnect?.forEach(cb => cb(error, origin)) + }) + + this.transport.on('networks', networks => { + this.callbacks.networks?.forEach(cb => cb(networks)) + }) + + this.transport.on('walletContext', context => { + this.callbacks.walletContext?.forEach(cb => cb(context)) + }) + + this.transport.on('open', info => { + this.callbacks.open?.forEach(cb => cb(info)) + }) + + this.transport.on('close', () => { + this.callbacks.close?.forEach(cb => cb()) + }) + + this.transport.on('chainChanged', (chainIdHex, origin) => { + this.callbacks.chainChanged?.forEach(cb => cb(chainIdHex, origin)) + }) + + // We don't listen for the transport chainChanged event + // instead we handle it locally, so we listen for changes in the store + this.defaultChainId.onDefaultChainIdChanged((chainId: number) => { + const chainIdHex = ethers.utils.hexValue(chainId) + this.callbacks.chainChanged?.forEach(cb => cb(chainIdHex)) + }) + + if (options?.projectAccessKey) { + this.projectAccessKey = options.projectAccessKey + } + if (this.projectAccessKey && options?.analytics) { + this.analytics = setupAnalytics(this.projectAccessKey) + } + + if (this.session.getSession()?.accountAddress) { + this.analytics?.identify(this.session.getSession()?.accountAddress?.toLowerCase()) + } + } + + // Callbacks + + registerCallback(eventName: K, callback: WalletEventTypes[K]) { + if (!this.callbacks[eventName]) { + this.callbacks[eventName] = [] + } + + this.callbacks[eventName]!.push(callback) + + return () => { + this.callbacks[eventName] = this.callbacks[eventName]!.filter(c => c !== callback) as any + } + } + + // Individual callbacks lead to more idiomatic code + + onOpen(callback: WalletEventTypes['open']) { + return this.registerCallback('open', callback) + } + + onClose(callback: WalletEventTypes['close']) { + return this.registerCallback('close', callback) + } + + onConnect(callback: WalletEventTypes['connect']) { + return this.registerCallback('connect', callback) + } + + onDisconnect(callback: WalletEventTypes['disconnect']) { + return this.registerCallback('disconnect', callback) + } + + onNetworks(callback: WalletEventTypes['networks']) { + return this.registerCallback('networks', callback) + } + + onAccountsChanged(callback: WalletEventTypes['accountsChanged']) { + return this.registerCallback('accountsChanged', callback) + } + + // @deprecated + onWalletContext(callback: WalletEventTypes['walletContext']) { + return this.registerCallback('walletContext', callback) + } + + onChainChanged(callback: WalletEventTypes['chainChanged']) { + return this.registerCallback('chainChanged', callback) + } + + onDefaultChainIdChanged(callback: WalletEventTypes['chainChanged']) { + return this.registerCallback('chainChanged', callback) + } + + getChainId(): number { + return this.defaultChainId.getDefaultChainId() + } + + setDefaultChainId(chainId: number) { + return this.defaultChainId.setDefaultChainId(chainId) + } + + // Proxy transport methods + + async openWallet(path?: string, intent?: OpenWalletIntent) { + this.transport.openWallet(path, intent, this.getChainId()) + await this.transport.waitUntilOpened() + return this.isOpened() + } + + closeWallet() { + return this.transport.closeWallet() + } + + isOpened(): boolean { + return this.transport.isOpened() + } + + isConnected(): boolean { + return this.session.hasSession() + } + + getSession(): WalletSession | undefined { + return this.session.getSession() + } + + // Basic API + getAddress(): string { + const session = this.session.connectedSession() + return session.accountAddress + } + + async connect(options: ConnectOptions): Promise { + if (options?.authorizeVersion === undefined) { + // Populate default authorize version if not provided + options.authorizeVersion = 2 + } + + if (options?.refresh === true) { + this.disconnect() + } + + options.projectAccessKey = this.projectAccessKey + + if (options) { + if (options.authorize) { + if (!options.app) { + throw new Error(`connecting with 'authorize' option also requires 'app' to be set`) + } + + if (options.authorizeVersion === undefined) { + options.authorizeVersion = 2 + } + } + } + + await this.openWallet(undefined, { + type: 'connect', + options: { ...options, networkId: this.getChainId(), clientVersion: packageJson.version } + }) + + const connectDetails = await this.transport.waitUntilConnected().catch((error): ConnectDetails => { + if (error instanceof Error) { + return { connected: false, error: error.message } + } else { + return { connected: false, error: JSON.stringify(error) } + } + }) + + // Normalize chainId into a decimal string + // TODO: Remove this once wallet-webapp returns chainId as a string + if (connectDetails.chainId) { + connectDetails.chainId = ethers.BigNumber.from(connectDetails.chainId).toString() + } + + if (connectDetails.connected) { + if (!connectDetails.session) { + throw new Error('impossible state, connect response is missing session') + } + + this.session.setSession(connectDetails.session) + + if (connectDetails.session?.accountAddress) { + this.analytics?.identify(connectDetails.session.accountAddress.toLowerCase()) + } + } + + return connectDetails + } + + disconnect() { + if (this.isOpened()) { + this.closeWallet() + } + + this.analytics?.reset() + + return this.session.clearSession() + } + + // Higher level API + + // Working with sendAsync is less idiomatic + // but transport uses it instead of send, so we wrap it + send(request: JsonRpcRequest, chainId?: number): Promise { + // Internally when sending requests we use `legacy_sign` + // to avoid the default EIP6492 behavior overriding an explicit + // "legacy sign" request, so we map the method here. + request.method = this.mapSignMethod(request.method) + + return new Promise((resolve, reject) => { + this.transport.sendAsync( + request, + (error, response) => { + if (error) { + reject(error) + } else if (response === undefined) { + reject(new Error(`Got undefined response for request: ${request}`)) + } else if (typeof response === 'object' && response.error) { + reject(response.error) + } else if (typeof response === 'object' && response.result) { + resolve(response.result) + } else { + reject(new Error(`Got invalid response for request: ${request}`)) + } + }, + chainId || this.getChainId() + ) + }) + } + + async getNetworks(pull?: boolean): Promise { + const connectedSession = this.session.connectedSession() + + if (pull) { + connectedSession.networks = await this.send({ method: 'sequence_getNetworks' }) + this.session.setSession(connectedSession) + } + + return connectedSession.networks + } + + // NOTICE: `legacy_sign` will get overriden by `send` + // it is done this way to ensure that: + // - `send` handles `personal_sign` as a request for the default sign method + // - explicit `personal_sign` is not replaced by `sequence_sign` (if default is EI6492) + private signMethod(options?: OptionalEIP6492) { + if (options?.eip6492 === undefined) { + return 'personal_sign' + } + + return options.eip6492 ? 'sequence_sign' : 'legacy_sign' + } + + private signTypedDataMethod(options?: OptionalEIP6492) { + if (options?.eip6492 === undefined) { + return 'eth_signTypedData_v4' + } + + return options.eip6492 ? 'sequence_signTypedData_v4' : 'legacy_signTypedData_v4' + } + + private mapSignMethod(method: string): string { + if (method === 'personal_sign') { + if (this.defaultEIP6492) { + return 'sequence_sign' + } else { + return 'personal_sign' + } + } + + if (method === 'eth_signTypedData_v4') { + if (this.defaultEIP6492) { + return 'sequence_signTypedData_v4' + } else { + return 'eth_signTypedData_v4' + } + } + + if (method === 'legacy_sign') { + return 'personal_sign' + } + + if (method === 'legacy_signTypedData_v4') { + return 'eth_signTypedData_v4' + } + + return method + } + + async signMessage(message: ethers.BytesLike, options?: OptionalEIP6492 & OptionalChainId): Promise { + const method = this.signMethod(options) + + this.analytics?.track({ event: 'SIGN_MESSAGE_REQUEST', props: { chainId: `${options?.chainId || this.getChainId()}` } }) + + // Serialize a BytesLike or string message into a hex string before sending + message = ethers.utils.hexlify(messageToBytes(message)) + + // Address is ignored by the wallet webapp + return this.send({ method, params: [message, this.getAddress()] }, options?.chainId) + } + + async signTypedData(typedData: TypedData, options?: OptionalEIP6492 & OptionalChainId): Promise { + const method = this.signTypedDataMethod(options) + + // TODO: Stop using ethers for this, this is the only place where we use it + // and it makes the client depend on ethers. + const encoded = ethers.utils._TypedDataEncoder.getPayload(typedData.domain, typedData.types, typedData.message) + + // The sign typed data will use one of the following chainIds, in order: + // - The one provided in the options + // - The one provided in the typedData.domain.chainId + // - The default chainId + + this.analytics?.track({ event: 'SIGN_TYPED_DATA_REQUEST', props: { chainId: `${options?.chainId || this.getChainId()}` } }) + + return this.send( + { method, params: [this.getAddress(), encoded] }, + options?.chainId || + (typedData.domain.chainId && ethers.BigNumber.from(typedData.domain.chainId).toNumber()) || + this.getChainId() + ) + } + + async sendTransaction( + tx: ethers.providers.TransactionRequest[] | ethers.providers.TransactionRequest, + options?: OptionalChainId + ): Promise { + const sequenceTxs = Array.isArray(tx) ? tx : [tx] + const extendedTxs = toExtended(sequenceTxs) + + this.analytics?.track({ event: 'SEND_TRANSACTION_REQUEST', props: { chainId: `${options?.chainId || this.getChainId()}` } }) + + return this.send({ method: 'eth_sendTransaction', params: [extendedTxs] }, options?.chainId) + } + + async getWalletContext(): Promise { + return this.send({ method: 'sequence_getWalletContext' }) + } + + async getOnchainWalletConfig(options?: OptionalChainId): Promise { + // NOTICE: sequence_getWalletConfig sends the chainId as a param + const res = await this.send( + { method: 'sequence_getWalletConfig', params: [options?.chainId || this.getChainId()] }, + options?.chainId + ) + return Array.isArray(res) ? res[0] : res + } + + // NOTICE: We are leaving out all the "regular" methods os a tipical + // JSON RPC Provider (eth_getBlockByNumber, eth_call, etc) + // wallet-webapp does implement them, but this client is meant to be + // exclusively used for Sequence specific methods +} diff --git a/packages/provider/src/eip191exceptions.ts b/packages/provider/src/eip191exceptions.ts new file mode 100644 index 000000000..af24a5315 --- /dev/null +++ b/packages/provider/src/eip191exceptions.ts @@ -0,0 +1,137 @@ +import { ethers } from 'ethers' + +export function messageIsExemptFromEIP191Prefix(message: Uint8Array): boolean { + return EIP_191_PREFIX_EXCEPTIONS.some(e => e.predicate(message)) +} + +const EIP_191_PREFIX_EXCEPTIONS: Array<{ + name: string + predicate: (message: Uint8Array) => boolean +}> = [ + // NOTE: Decentraland does not support 191 correctly. + { + name: 'Decentraland Exception', + predicate: isDecentralandLoginMessage + }, + + // NOTE: 0x v3 does not support 191 correctly. + // See https://gov.0x.org/t/zeip-proposal-fix-v3-eip-191-non-compliance-when-validating-eip-1271-signatures/3396 for more info. + { name: '0x v3 Exception', predicate: isZeroExV3Order } +] + +const DCL_REGEX = + /^Decentraland Login\nEphemeral address: 0x[a-fA-F0-9]{40}\nExpiration: (\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)((-(\d{2}):(\d{2})|Z)?)$/ +export function isDecentralandLoginMessage(bytes: Uint8Array): boolean { + try { + const stringified = ethers.utils.toUtf8String(bytes) + return DCL_REGEX.test(stringified) + } catch { + return false + } +} + +// try to interpret bytes as abi-encoded 0x v3 OrderWithHash - +// see https://github.com/0xProject/0x-protocol-specification/blob/master/v3/v3-specification.md +export function isZeroExV3Order(bytes: Uint8Array): boolean { + const abi = new ethers.utils.Interface(ZeroXV3EIP1271OrderWithHashAbi) + try { + abi.decodeFunctionData('OrderWithHash', bytes) + return true + } catch (err) { + // failed to decode ABI, so it's not a v3 order. + return false + } +} + +const ZeroXV3EIP1271OrderWithHashAbi = [ + { + inputs: [ + { + components: [ + { + internalType: 'address', + name: 'makerAddress', + type: 'address' + }, + { + internalType: 'address', + name: 'takerAddress', + type: 'address' + }, + { + internalType: 'address', + name: 'feeRecipientAddress', + type: 'address' + }, + { + internalType: 'address', + name: 'senderAddress', + type: 'address' + }, + { + internalType: 'uint256', + name: 'makerAssetAmount', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'takerAssetAmount', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'makerFee', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'takerFee', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'expirationTimeSeconds', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'salt', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'makerAssetData', + type: 'bytes' + }, + { + internalType: 'bytes', + name: 'takerAssetData', + type: 'bytes' + }, + { + internalType: 'bytes', + name: 'makerFeeAssetData', + type: 'bytes' + }, + { + internalType: 'bytes', + name: 'takerFeeAssetData', + type: 'bytes' + } + ], + internalType: 'struct IEIP1271Data.Order', + name: 'order', + type: 'tuple' + }, + { + internalType: 'bytes32', + name: 'orderHash', + type: 'bytes32' + } + ], + name: 'OrderWithHash', + outputs: [], + stateMutability: 'pure', + type: 'function' + } +] diff --git a/packages/provider/src/extended.ts b/packages/provider/src/extended.ts new file mode 100644 index 000000000..b8e15a5fc --- /dev/null +++ b/packages/provider/src/extended.ts @@ -0,0 +1,26 @@ +import { ethers } from 'ethers' + +export type ExtendedTransactionRequest = ethers.providers.TransactionRequest & { + auxiliary?: ethers.providers.TransactionRequest[] +} + +export function toExtended(transactions: ethers.providers.TransactionRequest[]): ExtendedTransactionRequest { + if (transactions.length === 0) { + throw new Error('No transaction provided') + } + + const [first, ...rest] = transactions + + return { + ...first, + auxiliary: rest + } +} + +export function fromExtended(transaction: ExtendedTransactionRequest): ethers.providers.TransactionRequest[] { + return [transaction, ...(transaction.auxiliary || [])] +} + +export function isExtended(transaction: ethers.providers.TransactionRequest): transaction is ExtendedTransactionRequest { + return (transaction as any).auxiliary !== undefined +} diff --git a/packages/provider/src/index.ts b/packages/provider/src/index.ts new file mode 100644 index 000000000..50e99d811 --- /dev/null +++ b/packages/provider/src/index.ts @@ -0,0 +1,8 @@ +export * from './transactions' +export * from './transports' +export * from './types' +export * from './provider' +export * from './utils' +export * from './client' +export * from './signer' +export * from './init' diff --git a/packages/provider/src/init.ts b/packages/provider/src/init.ts new file mode 100644 index 000000000..371acae3f --- /dev/null +++ b/packages/provider/src/init.ts @@ -0,0 +1,170 @@ +import { + CachedProvider, + ChainIdLike, + JsonRpcRouter, + JsonRpcSender, + NetworkConfig, + allNetworks, + exceptionProviderMiddleware, + findNetworkConfig, + loggingProviderMiddleware +} from '@0xsequence/network' +import { MuxTransportTemplate } from './transports' +import { ItemStore, useBestStore } from './utils' +import { ethers } from 'ethers' +import { SequenceClient } from './client' +import { SequenceProvider } from './provider' + +export interface ProviderConfig { + // The local storage dependency for the wallet provider, defaults to window.localStorage. + // For example, this option should be used when using React Native since window.localStorage is not available. + localStorage?: ItemStore + + // defaultNetwork is the primary network of a dapp and the default network a + // provider will communicate. Note: this setting is also configurable from the + // Wallet constructor's first argument. If both are specified, then they + // need to match + defaultNetwork?: ChainIdLike + + // defaultEIP6492 defines if EIP-6492 is enabled by default when signing messages. + defaultEIP6492?: boolean + + // networks is a configuration list of networks used by the wallet. This list + // is combined with the network list specified by sequence.js. + // notice that this can only replace the rpc urls on the dapp side, + // the networks on wallet-webapp side remain the same. + // + // NOTICE: It's not possible to define networks that aren't already + // defined in sequence.js. + networks?: Partial[] + + // transports for dapp to wallet jron-rpc communication + transports?: MuxTransportTemplate + + // analytics .... (default: true) + analytics?: boolean +} + +export const DefaultProviderConfig = { + transports: { + walletAppURL: 'https://sequence.app', + windowTransport: { enabled: true }, + proxyTransport: { enabled: false } + }, + + defaultNetwork: 1, + analytics: true +} + +let sequenceWalletProvider: SequenceProvider | undefined + +/** + * Initializes a wallet with the provided project access key and optional configuration. + * + * @param projectAccessKey - Access key for the project that can be obtained from Sequence Builder on sequence.build + * @param partialConfig - Optional partial configuration for the wallet. + * @returns The initialized wallet provider. + * @throws Error if projectAccessKey is not provided, empty string or is not string. + */ +export const initWallet = (projectAccessKey: string, partialConfig?: Partial) => { + if (!projectAccessKey || typeof projectAccessKey !== 'string') { + throw new Error('Please pass a projectAccessKey in initWallet.') + } + + if (sequenceWalletProvider) { + return sequenceWalletProvider + } + + // Combine both the provided config and the default config + const config = { + ...DefaultProviderConfig, + ...partialConfig, + transports: { + ...DefaultProviderConfig.transports, + ...partialConfig?.transports + } + } + + const rpcProviders: Record = {} + + // Find any new networks that aren't already defined in sequence.js + // and add them to the list of networks, (they must have a rpcUrl and chainId) + const newNetworks = (config.networks?.filter(n => { + n.rpcUrl !== undefined && n.chainId !== undefined && !allNetworks.find(an => an.chainId === n.chainId) + }) ?? []) as NetworkConfig[] + + // Override any information about the networks using the config + const combinedNetworks = allNetworks + .map(n => { + const network = config.networks?.find(cn => cn.chainId === n.chainId) + return network ? { ...n, ...network } : n + }) + .concat(newNetworks) + .map(network => { + // don't double-append in the case the user has already included their access key in the rpc URL + if (network.rpcUrl.includes(projectAccessKey)) { + return network + } + + // this will probably break non-sequence RPC provider URLs. + network.rpcUrl = network.rpcUrl + `/${projectAccessKey}` + return network + }) + + // This builds a "public rpc" on demand, we build them on demand because we don't want to + // generate a bunch of providers for networks that aren't used. + const providerForChainId = (chainId: number) => { + if (!rpcProviders[chainId]) { + const rpcUrl = combinedNetworks.find(n => n.chainId === chainId)?.rpcUrl + if (!rpcUrl) { + throw new Error(`no rpcUrl found for chainId: ${chainId}`) + } + + const baseProvider = new ethers.providers.JsonRpcProvider(rpcUrl) + const router = new JsonRpcRouter( + [loggingProviderMiddleware, exceptionProviderMiddleware, new CachedProvider()], + new JsonRpcSender(baseProvider) + ) + + rpcProviders[chainId] = new ethers.providers.Web3Provider(router, chainId) + } + + return rpcProviders[chainId] + } + + // This is the starting default network (as defined by the config) + // it can be later be changed using `wallet_switchEthereumChain` or some + // of the other methods on the provider. + const defaultNetwork = config.defaultNetwork ? findNetworkConfig(combinedNetworks, config.defaultNetwork)?.chainId : undefined + if (!defaultNetwork && config.defaultNetwork) { + throw new Error(`defaultNetwork not found for chainId: ${config.defaultNetwork}`) + } + + // Generate ItemStore + const itemStore = config.localStorage || useBestStore() + + // Create client, provider and return signer + const client = new SequenceClient(config.transports, itemStore, { + defaultChainId: defaultNetwork, + defaultEIP6492: config.defaultEIP6492, + projectAccessKey: projectAccessKey, + analytics: config.analytics + }) + + sequenceWalletProvider = new SequenceProvider(client, providerForChainId) + return sequenceWalletProvider +} + +export const unregisterWallet = () => { + if (!sequenceWalletProvider) return + sequenceWalletProvider.client.closeWallet() + sequenceWalletProvider.client.transport.unregister() + sequenceWalletProvider = undefined +} + +export const getWallet = () => { + if (!sequenceWalletProvider) { + throw new Error('Wallet has not been initialized, call sequence.initWallet(config) first.') + } + return sequenceWalletProvider +} diff --git a/packages/provider/src/provider.ts b/packages/provider/src/provider.ts new file mode 100644 index 000000000..0ebeb1bd6 --- /dev/null +++ b/packages/provider/src/provider.ts @@ -0,0 +1,524 @@ +import { ethers } from 'ethers' +import { SequenceClient } from './client' +import { ChainIdLike, NetworkConfig, allNetworks, findNetworkConfig } from '@0xsequence/network' +import { ConnectDetails, ConnectOptions, EIP1193Provider, OpenWalletIntent, OptionalChainIdLike, WalletSession } from './types' +import { commons } from '@0xsequence/core' +import { WalletUtils } from './utils/index' +import { SequenceSigner, SingleNetworkSequenceSigner } from './signer' + +export interface ISequenceProvider { + readonly _isSequenceProvider: true + + connect(options?: ConnectOptions): Promise + disconnect(): void + + isConnected(): boolean + getSession(): WalletSession | undefined + + listAccounts(): string[] + + // @deprecated use getSigner().getAddress() instead + getAddress(): string + + getNetworks(): Promise + getChainId(): number + + setDefaultChainId(chainId: ChainIdLike): void + + isOpened(): boolean + openWallet(path?: string, intent?: OpenWalletIntent): Promise + closeWallet(): void + + getProvider(): SequenceProvider + getProvider(chainId: ChainIdLike): SingleNetworkSequenceProvider + getProvider(chainId?: ChainIdLike): SequenceProvider | SingleNetworkSequenceProvider + + getSigner(): SequenceSigner + getSigner(chainId: ChainIdLike): SingleNetworkSequenceSigner + getSigner(chainId?: ChainIdLike): SequenceSigner | SingleNetworkSequenceSigner + + // @deprecated use getSigner().getWalletContext() instead + getWalletContext(): Promise + + // @deprecated use getSigner().getWalletConfig() instead + getWalletConfig(chainId?: ChainIdLike): Promise + + utils: WalletUtils +} + +export class SequenceProvider extends ethers.providers.BaseProvider implements ISequenceProvider, EIP1193Provider { + private readonly singleNetworkProviders: { [chainId: number]: SingleNetworkSequenceProvider } = {} + + readonly _isSequenceProvider = true + readonly utils: WalletUtils + + readonly signer: SequenceSigner + + constructor( + public readonly client: SequenceClient, + private readonly providerFor: (networkId: number) => ethers.providers.JsonRpcProvider, + public readonly networks: NetworkConfig[] = allNetworks + ) { + // We support a lot of networks + // but we start with the default one + super(client.getChainId()) + + // Emit events as defined by EIP-1193 + client.onConnect(details => { + this.emit('connect', details) + }) + + client.onDisconnect(error => { + this.emit('disconnect', error) + }) + + client.onDefaultChainIdChanged(chainId => { + this.emit('chainChanged', chainId) + }) + + client.onAccountsChanged(accounts => { + this.emit('accountsChanged', accounts) + }) + + // NOTICE: We don't emit 'open' and 'close' events + // because these are handled by the library, and they + // are not part of EIP-1193 + + // devs can still access them using + // client.onOpen() + // client.onClose() + + // Create a Sequence signer too + this.signer = new SequenceSigner(this.client, this) + + // Create a utils instance + this.utils = new WalletUtils(this.signer) + } + + getSigner(): SequenceSigner + getSigner(chainId: ChainIdLike): SingleNetworkSequenceSigner + getSigner(chainId?: ChainIdLike): SequenceSigner | SingleNetworkSequenceSigner + + getSigner(chainId?: ChainIdLike) { + return this.signer.getSigner(chainId) + } + + connect(options: ConnectOptions) { + return this.client.connect(options) + } + + disconnect() { + return this.client.disconnect() + } + + isConnected() { + return this.client.isConnected() + } + + getSession() { + return this.client.getSession() + } + + listAccounts(): string[] { + return [this.client.getAddress()] + } + + // @deprecated use getSigner() instead + getAddress() { + return this.client.getAddress() + } + + getNetworks(): Promise { + return this.client.getNetworks() + } + + getChainId(): number { + return this.client.getChainId() + } + + setDefaultChainId(chainId: ChainIdLike) { + return this.client.setDefaultChainId(this.toChainId(chainId)) + } + + isOpened(): boolean { + return this.client.isOpened() + } + + closeWallet(): void { + return this.client.closeWallet() + } + + getWalletContext(): Promise { + return this.client.getWalletContext() + } + + // @deprecated use getSigner() instead + async getWalletConfig(chainId?: ChainIdLike): Promise { + const useChainId = await this.useChainId(chainId) + return this.client.getOnchainWalletConfig({ chainId: useChainId }) + } + + authorize(options: ConnectOptions) { + // Just an alias for connect with authorize: true + return this.client.connect({ ...options, authorize: true }) + } + + async openWallet(path?: string, intent?: OpenWalletIntent) { + await this.client.openWallet(path, intent) + return true + } + + toChainId(chainId: ChainIdLike): number + toChainId(chainId?: ChainIdLike): number | undefined + + toChainId(chainId?: ChainIdLike) { + if (chainId === undefined) { + return undefined + } + + const resolved = findNetworkConfig(this.networks, chainId as ChainIdLike) + + if (!resolved) { + throw new Error(`Unsupported network ${chainId}`) + } + + return resolved.chainId + } + + /** + * Resolves the chainId to use for the given request. If no chainId is provided, + * it uses the chainId defined by the client (default chainId). This can be + * overriden to build a single-network SequenceProvider. + */ + protected async useChainId(chainId?: ChainIdLike): Promise { + return this.toChainId(chainId) || this.client.getChainId() + } + + /** + * This generates a provider that ONLY works for the given chainId. + * the generated provider can't switch networks, and can't handle requests + * for other networks. + */ + getProvider(): SequenceProvider + getProvider(chainId: ChainIdLike): SingleNetworkSequenceProvider + getProvider(chainId?: ChainIdLike): SequenceProvider | SingleNetworkSequenceProvider + + getProvider(chainId?: ChainIdLike) { + // The provider without a chainId is... this one + if (!chainId) { + return this + } + + const useChainId = this.toChainId(chainId) + + if (!this.singleNetworkProviders[useChainId]) { + this.singleNetworkProviders[useChainId] = new SingleNetworkSequenceProvider(this.client, this.providerFor, useChainId) + } + + return this.singleNetworkProviders[useChainId] + } + + /** + * This returns a subprovider, this is a regular non-sequence provider that + * can be used to fulfill read only requests on a given network. + */ + async _getSubprovider(chainId?: ChainIdLike): Promise { + const useChainId = await this.useChainId(chainId) + + // Whoever implements providerFrom should memoize the generated provider + // otherwise every instance of SequenceProvider will create a new subprovider + const provider = this.providerFor(useChainId) + + if (!provider) { + throw new Error(`Unsupported network ${useChainId}`) + } + + return provider + } + + async perform(method: string, params: any): Promise { + // First we check if the method should be handled by the client + if (method === 'eth_chainId') { + return ethers.utils.hexValue(await this.useChainId()) + } + + if (method === 'eth_accounts') { + return [this.client.getAddress()] + } + + if (method === 'wallet_switchEthereumChain') { + const args = params[0] as { chainId: string } | number | string + const chainId = normalizeChainId(args) + return this.setDefaultChainId(chainId) + } + + // Usually these methods aren't used by calling the provider + // but to maximize compatibility we support them too. + // The correct way of accessing these methods is by using .getSigner() + if ( + method === 'eth_sendTransaction' || + method === 'eth_sign' || + method === 'eth_signTypedData' || + method === 'eth_signTypedData_v4' || + method === 'personal_sign' || + // These methods will use EIP-6492 + // but this is handled directly by the wallet + method === 'sequence_sign' || + method === 'sequence_signTypedData_v4' + ) { + // We pass the chainId to the client, if we don't pass one + // the client will use its own default chainId + return this.client.send({ method, params }, this.getChainId()) + } + + // Forward call to the corresponding provider + // we use the provided chainId, or the default one provided by the client + const provider = await this._getSubprovider() + const prepared = provider.prepareRequest(method, params) ?? [method, params] + return provider.send(prepared[0], prepared[1]) + } + + send(method: string, params: any): Promise { + return this.perform(method, params) + } + + request(request: { method: string; params?: any[] | undefined }) { + return this.perform(request.method, request.params) + } + + async detectNetwork(): Promise { + const chainId = this.client.getChainId() + const network = findNetworkConfig(this.networks, chainId) + + if (!network) { + throw new Error(`Unknown network ${chainId}`) + } + + return network + } + + // Override most of the methods, so we add support for an optional chainId + // argument, which is used to select the provider to use. + // + // NOTICE: We could use generics to avoid repeating the same code + // but this would make the code harder to read, and it's not worth it + // since we only have a few methods to override. + + async waitForTransaction(transactionHash: string, confirmations?: number, timeout?: number, optionals?: OptionalChainIdLike) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.waitForTransaction(transactionHash, confirmations, timeout) + } + + async getBlockNumber(optionals?: OptionalChainIdLike) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getBlockNumber() + } + + async getGasPrice(optionals?: OptionalChainIdLike) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getGasPrice() + } + + async getBalance( + addressOrName: string | Promise, + blockTag?: ethers.providers.BlockTag | Promise, + optionals?: OptionalChainIdLike + ) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getBalance(addressOrName, blockTag) + } + + async getTransactionCount( + addressOrName: string | Promise, + blockTag?: ethers.providers.BlockTag | Promise, + optionals?: OptionalChainIdLike + ) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getTransactionCount(addressOrName, blockTag) + } + + async getCode( + addressOrName: string | Promise, + blockTag?: ethers.providers.BlockTag | Promise, + optionals?: OptionalChainIdLike + ) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getCode(addressOrName, blockTag) + } + + async getStorageAt( + addressOrName: string | Promise, + position: ethers.BigNumberish | Promise, + blockTag?: ethers.providers.BlockTag | Promise, + optionals?: OptionalChainIdLike + ) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getStorageAt(addressOrName, position, blockTag) + } + + async call( + transaction: ethers.utils.Deferrable, + blockTag?: ethers.providers.BlockTag | Promise, + optionals?: OptionalChainIdLike + ) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.call(transaction, blockTag) + } + + async estimateGas(transaction: ethers.utils.Deferrable, optionals?: OptionalChainIdLike) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.estimateGas(transaction) + } + + async getBlock( + blockHashOrBlockTag: ethers.providers.BlockTag | string | Promise, + optionals?: OptionalChainIdLike + ) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getBlock(blockHashOrBlockTag) + } + + async getTransaction(transactionHash: string | Promise, optionals?: OptionalChainIdLike) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getTransaction(transactionHash) + } + + async getLogs(filter: ethers.providers.Filter | Promise, optionals?: OptionalChainIdLike) { + const provider = await this._getSubprovider(optionals?.chainId) + return provider.getLogs(filter) + } + + // ENS methods + + async supportsENS(): Promise { + const networks = await this.getNetworks() + return networks.some(n => n.chainId === 1) + } + + async getResolver(name: string) { + if (!(await this.supportsENS())) { + return null + } + + // Resolver is always on the chainId 1 + const provider = await this._getSubprovider(1) + return provider.getResolver(name) + } + + async resolveName(name: string | Promise) { + if (ethers.utils.isAddress(await name)) { + return name + } + + if (!(await this.supportsENS())) { + return null + } + + // Resolver is always on the chainId 1 + const provider = await this._getSubprovider(1) + return provider.resolveName(name) + } + + async lookupAddress(address: string | Promise) { + if (!(await this.supportsENS())) { + return null + } + + // Resolver is always on the chainId 1 + const provider = await this._getSubprovider(1) + return provider.lookupAddress(address) + } + + async getAvatar(nameOrAddress: string) { + if (!(await this.supportsENS())) { + return null + } + + const provider = await this._getSubprovider(1) + return provider.getAvatar(nameOrAddress) + } + + static is = (provider: any): provider is SequenceProvider => { + return provider && typeof provider === 'object' && provider._isSequenceProvider === true + } +} + +function normalizeChainId(chainId: string | number | bigint | { chainId: string }): number { + if (typeof chainId === 'object') return normalizeChainId(chainId.chainId) + return ethers.BigNumber.from(chainId).toNumber() +} + +/** + * This is the same provider, but it only allows a single network at a time. + * the network defined by the constructor is the only one that can be used. + * + * Attempting to call any method with a different network will throw an error. + * Attempting to change the network of this provider will throw an error. + * + * NOTICE: These networks won't support ENS unless they are the mainnet. + */ +export class SingleNetworkSequenceProvider extends SequenceProvider { + readonly _isSingleNetworkSequenceProvider = true + + constructor( + client: SequenceClient, + providerFor: (networkId: number) => ethers.providers.JsonRpcProvider, + public readonly chainId: ChainIdLike + ) { + super(client, providerFor) + } + + private _useChainId(chainId?: ChainIdLike): number { + const provided = this.toChainId(chainId) + + if (provided && provided !== this.chainId) { + throw new Error(`This provider only supports the network ${this.chainId}, but ${provided} was requested.`) + } + + return provided || super.toChainId(this.chainId) + } + + protected useChainId(chainId?: ChainIdLike): Promise { + return Promise.resolve(this._useChainId(chainId)) + } + + getChainId(): number { + return super.toChainId(this.chainId) + } + + async getNetwork(): Promise { + const networks = await this.client.getNetworks() + const res = findNetworkConfig(networks, this.chainId) + + if (!res) { + throw new Error(`Unsupported network ${this.chainId}`) + } + + return res + } + + /** + * Override getProvider and getSigner so they always use `useChainId` + * this way they can't return providers and signers that can switch networks, + * or that don't match the chainId of this signer. + */ + getProvider(chainId?: ChainIdLike): SingleNetworkSequenceProvider { + if (this._useChainId(chainId) !== this.chainId) { + throw new Error(`Unreachable code`) + } + + return this + } + + getSigner(chainId?: ChainIdLike): SingleNetworkSequenceSigner { + return super.getSigner(this._useChainId(chainId)) + } + + setDefaultChainId(_chainId: ChainIdLike): void { + throw new Error(`This provider only supports the network ${this.chainId}; use the parent provider to switch networks.`) + } + + static is(cand: any): cand is SingleNetworkSequenceProvider { + return cand && typeof cand === 'object' && cand._isSingleNetworkSequenceProvider === true + } +} diff --git a/packages/provider/src/signer.ts b/packages/provider/src/signer.ts new file mode 100644 index 000000000..5e15dbb0c --- /dev/null +++ b/packages/provider/src/signer.ts @@ -0,0 +1,300 @@ +import { ethers } from 'ethers' + +import { SequenceProvider, SingleNetworkSequenceProvider } from './provider' +import { SequenceClient } from './client' +import { commons } from '@0xsequence/core' +import { ChainIdLike, NetworkConfig } from '@0xsequence/network' +import { resolveArrayProperties } from './utils' +import { WalletUtils } from './utils/index' +import { OptionalChainIdLike, OptionalEIP6492 } from './types' + +export interface ISequenceSigner extends ethers.Signer { + getProvider(): SequenceProvider + getProvider(chainId: ChainIdLike): SingleNetworkSequenceProvider + getProvider(chainId?: ChainIdLike): SequenceProvider | SingleNetworkSequenceProvider + + getSigner(): SequenceSigner + getSigner(chainId: ChainIdLike): SingleNetworkSequenceSigner + getSigner(chainId?: ChainIdLike): SequenceSigner | SingleNetworkSequenceSigner + + getWalletConfig(chainId?: ChainIdLike): Promise + getNetworks(): Promise + + signMessage(message: ethers.BytesLike, options?: OptionalChainIdLike & OptionalEIP6492): Promise + + signTypedData( + domain: ethers.TypedDataDomain, + types: Record>, + message: Record, + options?: OptionalChainIdLike & OptionalEIP6492 + ): Promise + + // sendTransaction takes an unsigned transaction, or list of unsigned transactions, and then has it signed by + // the signer, and finally sends it to the relayer for submission to an Ethereum network. + // It supports any kind of transaction, including regular ethers transactions, and Sequence transactions. + sendTransaction( + transaction: + | ethers.utils.Deferrable[] + | ethers.utils.Deferrable, + options?: OptionalChainIdLike + ): Promise + + utils: WalletUtils +} + +export class SequenceSigner implements ISequenceSigner { + private readonly singleNetworkSigners: { [chainId: number]: SingleNetworkSequenceSigner } = {} + + readonly _isSigner: boolean = true + readonly _isSequenceSigner: boolean = true + + get utils(): WalletUtils { + return this.provider.utils + } + + constructor( + public client: SequenceClient, + public provider: SequenceProvider + ) {} + + async getAddress(): Promise { + return this.client.getAddress() + } + + // This method shouldn't be used directly + // it exists to maintain compatibility with ethers.Signer + connect(provider: ethers.providers.Provider): SequenceSigner { + if (!SequenceProvider.is(provider)) { + throw new Error('SequenceSigner can only be connected to a SequenceProvider') + } + + return new SequenceSigner(this.client, provider) + } + + getSigner(): SequenceSigner + getSigner(chainId: ChainIdLike): SingleNetworkSequenceSigner + getSigner(chainId?: ChainIdLike): SingleNetworkSequenceSigner | SequenceSigner + + getSigner(chainId?: ChainIdLike): SingleNetworkSequenceSigner | SequenceSigner { + // The signer for the default network is this signer + if (!chainId) { + return this + } + + const useChainId = this.provider.toChainId(chainId) + + if (!this.singleNetworkSigners[useChainId]) { + this.singleNetworkSigners[useChainId] = new SingleNetworkSequenceSigner(this.client, this.provider, useChainId) + } + + return this.singleNetworkSigners[useChainId] + } + + /** + * Resolves the chainId to use for the given request. If no chainId is provided, + * it uses the chainId defined by the client (default chainId). This can be + * overriden to build a single-network SequenceProvider. + */ + protected useChainId(chainId?: ChainIdLike): number { + return this.provider.toChainId(chainId) || this.client.getChainId() + } + + async signMessage(message: ethers.BytesLike, options?: OptionalChainIdLike & OptionalEIP6492): Promise { + const { eip6492 = true } = options || {} + const chainId = this.useChainId(options?.chainId) + return this.client.signMessage(message, { eip6492, chainId }) + } + + async signTypedData( + domain: ethers.TypedDataDomain, + types: Record>, + message: Record, + options?: OptionalChainIdLike & OptionalEIP6492 + ): Promise { + const { eip6492 = true } = options || {} + const chainId = this.useChainId(options?.chainId) + return this.client.signTypedData({ domain, types, message }, { eip6492, chainId }) + } + + getProvider(): SequenceProvider + getProvider(chainId: ChainIdLike): SingleNetworkSequenceProvider + getProvider(chainId?: ChainIdLike): SingleNetworkSequenceProvider | SequenceProvider + + getProvider(chainId?: ChainIdLike): SingleNetworkSequenceProvider | SequenceProvider { + return this.provider.getProvider(chainId) + } + + async sendTransaction( + transaction: + | ethers.utils.Deferrable[] + | ethers.utils.Deferrable, + options?: OptionalChainIdLike + ) { + const chainId = this.useChainId(options?.chainId) + const resolved = await resolveArrayProperties(transaction) + const txHash = await this.client.sendTransaction(resolved, { chainId }) + const provider = this.getProvider(chainId) + + try { + return (await ethers.utils.poll( + async () => { + const tx = await provider.getTransaction(txHash) + return tx ? provider._wrapTransaction(tx, txHash) : undefined + }, + { onceBlock: provider } + )) as ethers.providers.TransactionResponse + } catch (err) { + err.transactionHash = txHash + throw err + } + } + + async getWalletConfig(chainId?: ChainIdLike | undefined): Promise { + const useChainId = this.useChainId(chainId) + return this.client.getOnchainWalletConfig({ chainId: useChainId }) + } + + getNetworks(): Promise { + return this.client.getNetworks() + } + + async getBalance(blockTag?: ethers.providers.BlockTag | undefined, optionals?: OptionalChainIdLike): Promise { + const provider = this.getProvider(optionals?.chainId) + return provider.getBalance(this.getAddress(), blockTag) + } + + async estimateGas( + transaction: ethers.utils.Deferrable, + optionals?: OptionalChainIdLike + ): Promise { + return this.getProvider(optionals?.chainId).estimateGas(transaction) + } + + async call( + transaction: ethers.utils.Deferrable, + blockTag?: ethers.providers.BlockTag | undefined, + optionals?: OptionalChainIdLike + ): Promise { + return this.getProvider(optionals?.chainId).call(transaction, blockTag) + } + + getChainId(): Promise { + return Promise.resolve(this.client.getChainId()) + } + + async getGasPrice(optionals?: OptionalChainIdLike): Promise { + return this.getProvider(optionals?.chainId).getGasPrice() + } + + async getFeeData(optionals?: OptionalChainIdLike): Promise { + return this.getProvider(optionals?.chainId).getFeeData() + } + + async resolveName(name: string): Promise { + const res = await this.provider.resolveName(name) + + // For some reason ethers.Signer expects this to return `string` + // but ethers.providers.Provider expects this to return `string | null`. + // The signer doesn't have any other source of information, so we'll + // fail if the provider doesn't return a result. + if (res === null) { + throw new Error(`ENS name not found: ${name}`) + } + + return res + } + + _checkProvider(_operation?: string | undefined): void { + // We always have a provider, so this is a noop + } + + populateTransaction( + _transaction: ethers.utils.Deferrable + ): Promise { + throw new Error('SequenceSigner does not support populateTransaction') + } + + checkTransaction( + _transaction: ethers.utils.Deferrable + ): ethers.utils.Deferrable { + throw new Error('SequenceSigner does not support checkTransaction') + } + + getTransactionCount(_blockTag?: ethers.providers.BlockTag | undefined): Promise { + // We could try returning the sequence nonce here + // but we aren't sure how ethers will use this nonce + throw new Error('SequenceSigner does not support getTransactionCount') + } + + signTransaction(_transaction: ethers.utils.Deferrable): Promise { + // We could implement signTransaction/sendTransaction here + // but first we need a way of serializing these signed transactions + // and it could lead to more trouble, because the dapp could try to send this transaction + // using a different provider, which would fail. + throw new Error('SequenceWallet does not support signTransaction, use sendTransaction instead.') + } + + static is(cand: any): cand is SequenceSigner { + return cand && typeof cand === 'object' && cand._isSequenceSigner === true + } +} + +/** + * This is the same provider, but it only allows a single network at a time. + * the network defined by the constructor is the only one that can be used. + * + * Attempting to call any method with a different network will throw an error. + * Attempting to change the network of this provider will throw an error. + * + * NOTICE: These networks won't support ENS unless they are the mainnet. + */ +export class SingleNetworkSequenceSigner extends SequenceSigner { + readonly _isSingleNetworkSequenceSigner = true + + constructor( + client: SequenceClient, + provider: SequenceProvider, + public readonly chainId: ChainIdLike + ) { + super(client, provider.getProvider(chainId)) + } + + private _useChainId(chainId?: ChainIdLike): number { + const provided = this.provider.toChainId(chainId) + + if (provided && provided !== this.chainId) { + throw new Error(`This signer only supports the network ${this.chainId}, but ${provided} was requested.`) + } + + return provided || this.provider.toChainId(this.chainId) + } + + protected useChainId(chainId?: ChainIdLike): number { + return this._useChainId(chainId) + } + + getChainId(): Promise { + return Promise.resolve(this.provider.toChainId(this.chainId)) + } + + /** + * Override getProvider and getSigner so they always use `useChainId` + * this way they can't return providers and signers that can switch networks, + * or that don't match the chainId of this signer. + */ + getProvider(chainId?: ChainIdLike): SingleNetworkSequenceProvider { + return super.getProvider(this._useChainId(chainId)) + } + + getSigner(chainId?: ChainIdLike | undefined): SingleNetworkSequenceSigner { + if (this._useChainId(chainId) !== this.chainId) { + throw new Error(`Unreachable code`) + } + + return this + } + + static is(cand: any): cand is SingleNetworkSequenceSigner { + return cand && typeof cand === 'object' && cand._isSingleNetworkSequenceSigner === true + } +} diff --git a/packages/provider/src/transactions.ts b/packages/provider/src/transactions.ts new file mode 100644 index 000000000..3b95b9017 --- /dev/null +++ b/packages/provider/src/transactions.ts @@ -0,0 +1,57 @@ +import { walletContracts } from '@0xsequence/abi' +import { commons } from '@0xsequence/core' +import { ethers } from 'ethers' + +const PROHIBITED_FUNCTIONS = new Map( + [ + 'addHook(bytes4,address)', + 'clearExtraImageHashes(bytes32[])', + 'removeHook(bytes4)', + 'setExtraImageHash(bytes32,uint256)', + 'updateIPFSRoot(bytes32)', + 'updateImageHash(bytes32)', + 'updateImageHashAndIPFS(bytes32,bytes32)', + 'updateImplementation(address)' + ].map(signature => [ethers.utils.keccak256(ethers.utils.toUtf8Bytes(signature)).slice(0, 10), signature]) +) + +export function validateTransactionRequest(wallet: string, transaction: commons.transaction.Transactionish) { + const transactions = commons.transaction.fromTransactionish(wallet, transaction) + const unwound = commons.transaction.unwind(wallet, transactions) + unwound.forEach(transaction => validateTransaction(wallet, transaction)) +} + +function validateTransaction(wallet: string, transaction: commons.transaction.Transaction) { + if (transaction.to.toLowerCase() === wallet.toLowerCase()) { + if (transaction.data) { + const data = ethers.utils.arrayify(transaction.data) + if (data.length >= 4 && !isCreateContractCall(data)) { + throw new Error('self calls are forbidden') + } + } + } + + if (transaction.delegateCall) { + throw new Error('delegate calls are forbidden') + } + + if (transaction.data) { + const data = ethers.utils.hexlify(transaction.data) + const selector = data.slice(0, 10) + const signature = PROHIBITED_FUNCTIONS.get(selector) + if (signature) { + const name = signature.slice(0, signature.indexOf('(')) + throw new Error(`${name} calls are forbidden`) + } + } +} + +function isCreateContractCall(data: ethers.BytesLike): boolean { + const walletInterface = new ethers.utils.Interface(walletContracts.mainModule.abi) + try { + walletInterface.decodeFunctionData('createContract', data) + return true + } catch { + return false + } +} diff --git a/packages/provider/src/transports/base-provider-transport.ts b/packages/provider/src/transports/base-provider-transport.ts new file mode 100644 index 000000000..033839535 --- /dev/null +++ b/packages/provider/src/transports/base-provider-transport.ts @@ -0,0 +1,415 @@ +import { EventEmitter2 as EventEmitter } from 'eventemitter2' + +import { + ProviderTransport, + ProviderMessage, + ProviderMessageRequest, + EventType, + ProviderEventTypes, + ProviderMessageResponse, + ProviderMessageResponseCallback, + OpenState, + OpenWalletIntent, + ConnectDetails, + WalletSession, + ProviderRpcError, + InitState, + TypedEventEmitter +} from '../types' + +import { NetworkConfig, JsonRpcRequest, JsonRpcResponseCallback } from '@0xsequence/network' +import { logger } from '@0xsequence/utils' +import { ethers } from 'ethers' +import { commons } from '@0xsequence/core' + +export const PROVIDER_OPEN_TIMEOUT = 30000 // in ms + +let _messageIdx = 0 + +export const nextMessageIdx = () => ++_messageIdx + +export abstract class BaseProviderTransport implements ProviderTransport { + protected pendingMessageRequests: ProviderMessageRequest[] = [] + protected responseCallbacks = new Map() + + protected state: OpenState + protected confirmationOnly: boolean = false + protected events: TypedEventEmitter = new EventEmitter() as TypedEventEmitter + + protected openPayload: { sessionId?: string; session?: WalletSession } | undefined + protected connectPayload: ConnectDetails | undefined + protected accountsChangedPayload: { accounts: string[]; origin?: string } | undefined + protected networksPayload: NetworkConfig[] | undefined + protected walletContextPayload: commons.context.VersionedContext | undefined + + protected _sessionId?: string + protected _init: InitState + protected _registered: boolean + + constructor() { + this.state = OpenState.CLOSED + this._registered = false + this._init = InitState.NIL + } + + get registered(): boolean { + return this._registered + } + + register() { + throw new Error('abstract method') + } + + unregister() { + throw new Error('abstract method') + } + + openWallet(path?: string, intent?: OpenWalletIntent, networkId?: string | number) { + throw new Error('abstract method') + } + + closeWallet() { + throw new Error('abstract method') + } + + isOpened(): boolean { + return this.registered && this.state === OpenState.OPENED + } + + isConnected(): boolean { + // if we're registered, and we have the account details, then we are connected + const session = this.openPayload?.session + return ( + this.registered && + session !== undefined && + !!session.accountAddress && + session.accountAddress.length === 42 && + !!session.networks && + session.networks.length > 0 + ) + } + + sendAsync = async (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + // here, we receive the message from the dapp provider call + + if (this.state === OpenState.CLOSED) { + // flag the wallet to auto-close once user submits input. ie. + // prompting to sign a message or transaction + this.confirmationOnly = true + } + + // open/focus the wallet. + // automatically open the wallet when a provider request makes it here. + // + // NOTE: if we're not signed in, then the provider will fail, users must first connect+sign in. + // + // TODO: how does this behave with a session has expired? + this.openWallet(undefined, { type: 'jsonRpcRequest', method: request.method }, chainId) + + // send message request, await, and then execute callback after receiving the response + try { + if (!this.isOpened()) { + await this.waitUntilOpened() // will throw on timeout + } + + const response = await this.sendMessageRequest({ + idx: nextMessageIdx(), + type: EventType.MESSAGE, + data: request, + chainId: chainId + }) + callback(undefined, response.data) + } catch (err) { + callback(err) + } + } + + // handleMessage will handle message received from the remote wallet + handleMessage(message: ProviderMessage) { + // init incoming for initial handshake with transport. + // always respond to INIT messages, e.g. on popup window reload + if (message.type === EventType.INIT) { + logger.debug('MessageProvider, received INIT message', message) + const { nonce } = message.data as { nonce: string } + if (!nonce || nonce.length == 0) { + logger.error('invalid init nonce') + return + } + this._init = InitState.OK + this.sendMessage({ + idx: -1, + type: EventType.INIT, + data: { + sessionId: this._sessionId, + nonce: nonce + } + }) + } + + if (this._init !== InitState.OK) { + // if provider is not init'd, then we drop any received messages. the only + // message we will process is of event type 'init', as our acknowledgement + return + } + + // message is either a notification, or its a ProviderMessageResponse + logger.debug('RECEIVED MESSAGE FROM WALLET', message.idx, message) + + const requestIdx = message.idx + const responseCallback = this.responseCallbacks.get(requestIdx) + if (requestIdx) { + this.responseCallbacks.delete(requestIdx) + } + + // OPEN response + // + // Flip opened flag, and flush the pending queue + if (message.type === EventType.OPEN && !this.isOpened()) { + if (this._sessionId && this._sessionId !== message.data?.sessionId) { + logger.debug('open event received from wallet, but does not match sessionId', this._sessionId) + return + } + + // check if open error occured due to invalid defaultNetworkId + if (message.data?.error) { + const err = new Error(`opening wallet failed: received ${message.data?.error}`) + logger.error(err) + this.close() + throw err + } + + // success! + this.state = OpenState.OPENED + this.openPayload = message.data + this.events.emit('open', this.openPayload!) + + // flush pending requests when connected + if (this.pendingMessageRequests.length !== 0) { + const pendingMessageRequests = this.pendingMessageRequests.splice(0, this.pendingMessageRequests.length) + + pendingMessageRequests.forEach(async pendingMessageRequest => { + this.sendMessage(pendingMessageRequest) + }) + } + + return + } + + // MESSAGE resposne + if (message.type === EventType.MESSAGE) { + // Require user confirmation, bring up wallet to prompt for input then close + // TODO: perhaps apply technique like in multicall to queue messages within + // a period of time, then close the window if responseCallbacks is empty, this is better. + if (this.confirmationOnly) { + setTimeout(() => { + if (this.responseCallbacks.size === 0) { + this.closeWallet() + } + }, 500) // TODO: be smarter about timer as we're processing the response callbacks.. + } + + if (!responseCallback) { + // NOTE: this would occur if 'idx' isn't set, which should never happen + // or when we register two handler, or duplicate messages with the same idx are sent, + // all of which should be prevented prior to getting to this point + throw new Error('impossible state') + } + + // Callback to original caller + if (responseCallback) { + this.events.emit('message', message) + responseCallback((message as ProviderMessageResponse).data.error, message) + return + } + } + + // ACCOUNTS_CHANGED -- when a user logs in or out + if (message.type === EventType.ACCOUNTS_CHANGED) { + this.accountsChangedPayload = { accounts: [] } + if (message.data && message.data.length > 0) { + this.accountsChangedPayload = { + accounts: [ethers.utils.getAddress(message.data[0])], + origin: message.origin + } + this.events.emit('accountsChanged', this.accountsChangedPayload.accounts, this.accountsChangedPayload.origin) + } else { + this.events.emit('accountsChanged', [], message.origin) + } + return + } + + // CHAIN_CHANGED -- when a user changes their default chain + if (message.type === EventType.CHAIN_CHANGED) { + this.events.emit('chainChanged', message.data, message.origin) + return + } + + // NOTIFY NETWORKS -- when a user connects or logs in + if (message.type === EventType.NETWORKS) { + this.networksPayload = message.data + this.events.emit('networks', this.networksPayload!) + return + } + + // NOTIFY WALLET_CONTEXT -- when a user connects or logs in + if (message.type === EventType.WALLET_CONTEXT) { + this.walletContextPayload = message.data + this.events.emit('walletContext', this.walletContextPayload!) + return + } + + // NOTIFY CLOSE -- when wallet instructs to close + if (message.type === EventType.CLOSE) { + if (this.state !== OpenState.CLOSED) { + this.close(message.data) + } + } + + // NOTIFY CONNECT -- when wallet instructs we've connected + if (message.type === EventType.CONNECT) { + this.connectPayload = message.data + this.events.emit('connect', this.connectPayload!) + } + + // NOTIFY DISCONNECT -- when wallet instructs to disconnect + if (message.type === EventType.DISCONNECT) { + if (this.isConnected()) { + this.events.emit('disconnect', message.data, message.origin) + this.close() + } + } + } + + // sendMessageRequest sends a ProviderMessageRequest over the wire to the wallet + sendMessageRequest = async (message: ProviderMessageRequest): Promise => { + return new Promise((resolve, reject) => { + if ((!message.idx || message.idx <= 0) && message.type !== 'init') { + reject(new Error('message idx not set')) + } + + const responseCallback: ProviderMessageResponseCallback = (error: ProviderRpcError, response?: ProviderMessageResponse) => { + if (error) { + reject(error) + } else if (response) { + resolve(response) + } else { + throw new Error('no valid response to return') + } + } + + const idx = message.idx + if (!this.responseCallbacks.get(idx)) { + this.responseCallbacks.set(idx, responseCallback) + } else { + reject(new Error('duplicate message idx, should never happen')) + } + + if (!this.isOpened()) { + logger.debug('pushing to pending requests', message) + this.pendingMessageRequests.push(message) + } else { + this.sendMessage(message) + } + }) + } + + sendMessage(message: ProviderMessage) { + throw new Error('abstract method') + } + + on(event: K, fn: ProviderEventTypes[K]) { + this.events.on(event, fn as any) + } + + once(event: K, fn: ProviderEventTypes[K]) { + this.events.once(event, fn as any) + } + + emit(event: K, ...args: Parameters): boolean { + return this.events.emit(event, ...(args as any)) + } + + waitUntilOpened = async (openTimeout = PROVIDER_OPEN_TIMEOUT): Promise => { + let opened = false + return Promise.race([ + new Promise((_, reject) => { + const timeout = setTimeout(() => { + clearTimeout(timeout) + // only emit close if the timeout wins the race + if (!opened) { + this.state = OpenState.CLOSED + this.events.emit('close', { code: 1005, message: 'opening wallet timed out' } as ProviderRpcError) + } + reject(new Error('opening wallet timed out')) + }, openTimeout) + }), + new Promise(resolve => { + if (this.isOpened()) { + opened = true + resolve(this.openPayload?.session) + return + } + this.events.once('open', (openInfo: { session?: WalletSession }) => { + this.openPayload = openInfo + opened = true + resolve(openInfo.session) + }) + }) + ]) + } + + waitUntilConnected = async (): Promise => { + await this.waitUntilOpened() + + const connect = new Promise(resolve => { + if (this.connectPayload) { + resolve(this.connectPayload) + return + } + + this.events.once('connect', connectDetails => { + this.connectPayload = connectDetails + resolve(connectDetails) + }) + }) + + const closeWallet = new Promise((_, reject) => { + this.events.once('close', error => { + if (error) { + reject(new Error(`wallet closed due to ${JSON.stringify(error)}`)) + } else { + reject(new Error(`user closed the wallet`)) + } + }) + }) + + return Promise.race([connect, closeWallet]) + } + + protected close(error?: ProviderRpcError) { + if (this.state === OpenState.CLOSED) return + + this.state = OpenState.CLOSED + this.confirmationOnly = false + this._sessionId = undefined + logger.info('closing wallet and flushing!') + + // flush pending requests and return error to all callbacks + this.pendingMessageRequests.length = 0 + this.responseCallbacks.forEach(responseCallback => { + responseCallback({ + ...new Error('wallet closed'), + code: 4001 + }) + }) + this.responseCallbacks.clear() + + this.connectPayload = undefined + this.openPayload = undefined + this.accountsChangedPayload = undefined + this.networksPayload = undefined + this.walletContextPayload = undefined + + this.events.emit('close', error) + } +} diff --git a/packages/provider/src/transports/base-wallet-transport.ts b/packages/provider/src/transports/base-wallet-transport.ts new file mode 100644 index 000000000..b3a15d46c --- /dev/null +++ b/packages/provider/src/transports/base-wallet-transport.ts @@ -0,0 +1,475 @@ +import { ethers } from 'ethers' +import { + WalletTransport, + ProviderMessage, + ProviderMessageRequest, + EventType, + ProviderMessageResponse, + ProviderRpcError, + InitState, + ConnectDetails, + WalletSession, + TransportSession +} from '../types' + +import { WalletRequestHandler } from './wallet-request-handler' + +import { NetworkConfig, JsonRpcRequest, JsonRpcResponseCallback, findSupportedNetwork } from '@0xsequence/network' +import { logger, sanitizeAlphanumeric, sanitizeHost, sanitizeNumberString } from '@0xsequence/utils' +import { AuthorizationOptions } from '@0xsequence/auth' + +import { PROVIDER_OPEN_TIMEOUT } from './base-provider-transport' +import { isBrowserExtension, useBestStore } from '../utils' +import { commons } from '@0xsequence/core' + +const TRANSPORT_SESSION_LS_KEY = '@sequence.transportSession' + +export abstract class BaseWalletTransport implements WalletTransport { + protected walletRequestHandler: WalletRequestHandler + protected _sessionId: string + protected _registered: boolean + + protected _init: InitState + protected _initNonce: string + protected _initCallback?: (error?: string) => void + + // appOrigin identifies the dapp's origin which opened the app. A transport + // will auto-detect and set this value if it can. This is determined + // as the parent app/window which opened the wallet. + protected appOrigin?: string + + constructor(walletRequestHandler: WalletRequestHandler) { + this.walletRequestHandler = walletRequestHandler + this._init = InitState.NIL + + this.walletRequestHandler.on('connect', (connectDetails: ConnectDetails) => { + if (!this.registered) return + // means user has logged in and wallet is connected to the app + this.notifyConnect(connectDetails) + }) + + this.walletRequestHandler.on('disconnect', (error?: ProviderRpcError, origin?: string) => { + if (!this.registered) return + // means user has logged out the app / disconnected wallet from the app + this.notifyDisconnect(error, origin) + }) + + this.walletRequestHandler.on('accountsChanged', (accounts: string[], origin?: string) => { + if (!this.registered) return + this.notifyAccountsChanged(accounts, origin) + }) + + this.walletRequestHandler.on('networks', (networks: NetworkConfig[]) => { + if (!this.registered) return + this.notifyNetworks(networks) + if (!networks || networks.length === 0) { + this.notifyChainChanged('0x0') + } else { + this.notifyChainChanged(ethers.utils.hexValue(networks.find(network => network.isDefaultChain)!.chainId)) + } + }) + + this.walletRequestHandler.on('chainChanged', (chainIdHex: string, origin?: string) => { + this.notifyChainChanged(chainIdHex, origin) + }) + + this.walletRequestHandler.on('walletContext', (walletContext: commons.context.VersionedContext) => { + if (!this.registered || !walletContext) return + this.notifyWalletContext(walletContext) + }) + + this.walletRequestHandler.on('close', (error?: ProviderRpcError) => { + if (!this.registered) return + this.notifyClose(error) + }) + } + + get registered(): boolean { + return this._registered + } + + register() { + throw new Error('abstract method') + } + + unregister() { + throw new Error('abstract method') + } + + sendAsync = async (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + throw new Error('abstract method') + } + + handleMessage = async (message: ProviderMessage) => { + const request = message + + // ensure initial handshake is complete before accepting + // other kinds of messages. + if (this._init !== InitState.OK) { + if (request.type === EventType.INIT) { + if (this.isValidInitAck(message)) { + // successful init + if (this._initCallback) this._initCallback() + } else { + // failed init + if (this._initCallback) this._initCallback('invalid init') + return + } + } else { + // we expect init message first. do nothing here. + } + return + } + + // ensure signer is ready to handle requests + // if (this.walletRequestHandler.getSigner() === undefined) { + // await this.walletRequestHandler.signerReady() + // } + + // handle request + switch (request.type) { + case EventType.OPEN: { + if (this._init !== InitState.OK) return + const session: TransportSession = { + sessionId: request.data.sessionId, + intent: request.data.intent, + networkId: request.data.networkId + } + await this.open(session) + return + } + + case EventType.CLOSE: { + if (this._init !== InitState.OK) return + // noop. just here to capture the message so event emitters may be notified + return + } + + case EventType.MESSAGE: { + const response = await this.walletRequestHandler.sendMessageRequest(request) + this.sendMessage(response) + + if (response.data.error) { + // TODO: for certain errors, whenever we want to render something to the UI + // we should throw + } + return + } + + default: { + logger.error(`unexpected payload type ${request.type}`) + } + } + } + + // sendMessageRequest sends a ProviderMessageRequest to the wallet post-message transport + sendMessageRequest = async (message: ProviderMessageRequest): Promise => { + return this.walletRequestHandler.sendMessageRequest(message) + } + + sendMessage(message: ProviderMessage) { + throw new Error('abstract method') + } + + notifyOpen(openInfo: { chainId?: string; sessionId?: string; session?: WalletSession; error?: string }) { + const { chainId, sessionId, session, error } = openInfo + this.sendMessage({ + idx: -1, + type: EventType.OPEN, + data: { + chainId, + sessionId, + session, + error + } + }) + } + + notifyClose(error?: ProviderRpcError) { + this.sendMessage({ + idx: -1, + type: EventType.CLOSE, + data: error ? { error } : null + }) + } + + notifyConnect(connectDetails: ConnectDetails) { + this.sendMessage({ + idx: -1, + type: EventType.CONNECT, + data: connectDetails + }) + } + + notifyDisconnect(error?: ProviderRpcError, origin?: string) { + this.sendMessage({ + idx: -1, + type: EventType.DISCONNECT, + data: error ? { error } : null, + origin + }) + } + + notifyAccountsChanged(accounts: string[], origin?: string) { + this.sendMessage({ + idx: -1, + type: EventType.ACCOUNTS_CHANGED, + data: accounts, + origin + }) + } + + notifyChainChanged(chainIdHex: string, origin?: string) { + this.sendMessage({ + idx: -1, + type: EventType.CHAIN_CHANGED, + data: chainIdHex, + origin + }) + } + + notifyNetworks(networks: NetworkConfig[]) { + this.sendMessage({ + idx: -1, + type: EventType.NETWORKS, + data: networks + }) + } + + notifyWalletContext(walletContext: commons.context.VersionedContext) { + this.sendMessage({ + idx: -1, + type: EventType.WALLET_CONTEXT, + data: walletContext + }) + } + + protected isValidInitAck(message: ProviderMessage): boolean { + if (this._init === InitState.OK) { + // we're already in init state, we shouldn't handle this message + logger.warn("isValidInitAck, already in init'd state, so inquiry is invalid.") + return false + } + if (message.type !== EventType.INIT) { + logger.warn('isValidInitAck, invalid message type, expecting init') + return false + } + + const { sessionId, nonce } = message.data as any as { sessionId: string; nonce: string } + if (!sessionId || sessionId.length === 0 || !nonce || nonce.length === 0) { + logger.error('invalid init ack') + return false + } + if (sessionId !== this._sessionId || nonce !== this._initNonce) { + logger.error('invalid init ack match') + return false + } + + // all checks pass, its true + return true + } + + private init(): Promise { + return new Promise((resolve, reject) => { + // avoid re-init`ing, or if there is a transport which doesn't require + // it, then it may set this._init to OK in its constructor. + if (this._init === InitState.OK) { + resolve() + return + } + if (this._init !== InitState.NIL || this._initCallback) { + reject('transport init is in progress') + return + } + + // start init timeout, if we don't receive confirmation + // from provider within this amount of time, then we timeout + const initTimeout = setTimeout(() => { + logger.warn('transport init timed out') + if (this._initCallback) { + this._initCallback('transport init timed out') + } + }, PROVIDER_OPEN_TIMEOUT / 2) + + // setup callback as we receive the init message async in the handleMessage function + this._initCallback = (error?: string) => { + this._initCallback = undefined // reset + clearTimeout(initTimeout) + if (error) { + reject(error) + } else { + this._init = InitState.OK + resolve() + } + } + + // send init request with random nonce to the provider, where we expect + // for the provider to echo it back to us as complete handshake + this._initNonce = `${performance.now()}` + this.sendMessage({ + idx: -1, + type: EventType.INIT, + data: { nonce: this._initNonce } + }) + this._init = InitState.SENT_NONCE + + // NOTE: the promise will resolve in the _initCallback method + // which will be called from either handleMessage or the initTimeout + }) + } + + protected open = async ({ sessionId, intent, networkId }: TransportSession): Promise => { + if (sessionId) { + this._sessionId = sanitizeNumberString(sessionId) + // persist transport session in localstorage for restoring after redirect/reload + this.saveTransportSession({ sessionId, intent, networkId }) + } + + this.walletRequestHandler.setOpenIntent(intent) + + // init handshake for certain transports, before we can open the communication. + // + // for example, with the window-transport, we have to exchange messages to determine the + // origin host of the dapp. + await this.init() + + // determine chainId from networkId (string or number) + let chainId: number | undefined = undefined + try { + if (networkId) { + const network = findSupportedNetwork(networkId) + if (network) { + chainId = network.chainId + } else { + throw new Error(`unknown network ${networkId}`) + } + } else { + // if not provided, use defaultChainId + chainId = this.walletRequestHandler.defaultChainId() + } + } catch (err) { + console.error(err) + } + + // Prepare connect options from intent + if (intent && intent.type === 'connect' && intent.options) { + const connectOptions = intent.options + const authorizeOptions: AuthorizationOptions = connectOptions // overlapping types + + // Sanity/integrity check the intent payload, and set authorization origin + // if its been determined as part of the init handshake from earlier. + if (this.appOrigin && authorizeOptions?.origin) { + if (!isBrowserExtension()) { + if (authorizeOptions.origin !== this.appOrigin) { + throw new Error('origin is invalid') + } else { + // request origin and derived origins match, lets carry on + } + } + } else if (!this.appOrigin && authorizeOptions?.origin) { + // ie. when we can't determine the origin in our transport, but dapp provides it to us. + // we just sanitize the origin host. + connectOptions.origin = sanitizeHost(authorizeOptions.origin) + } else if (this.appOrigin) { + // ie. when we auto-determine the origin such as in window-transport + connectOptions.origin = this.appOrigin + } + if (connectOptions.app) { + connectOptions.app = sanitizeAlphanumeric(connectOptions.app) + } + + if (connectOptions.networkId) { + networkId = connectOptions.networkId + } else if (networkId) { + connectOptions.networkId = networkId + } + + // Set connect options on the walletRequestHandler as our primary + // wallet controller, and fall back to networkId if necessary + this.walletRequestHandler.setConnectOptions(connectOptions) + } else { + this.walletRequestHandler.setConnectOptions(undefined) + } + + // ensure signer is ready + await this.walletRequestHandler.getAccount() + + // Notify open and proceed to prompt for connection if intended + if (!(await this.walletRequestHandler.isSignedIn())) { + // open wallet without a specific connected chainId, as the user is not signed in + this.notifyOpen({ + sessionId: this._sessionId + }) + return true + } else { + // prompt user with a connect request. the options will be used as previously set above. + // upon success, the walletRequestHandler will notify the dapp with the ConnectDetails. + // upon cancellation by user, the walletRequestHandler will throw an error + + if (intent && intent.type === 'connect') { + // Failed to set default network on open + // Fail silently here so we can continue with connect flow and ask + // user to connect on a different network if necessary + if (!chainId || chainId <= 0) { + console.log('Failed to set default network on open') + } + + // notify wallet is opened, without session details + this.notifyOpen({ + sessionId: this._sessionId + }) + + try { + const connectDetails = await this.walletRequestHandler.promptConnect(intent.options) + if (connectDetails.connected) { + this.walletRequestHandler.notifyConnect(connectDetails) + } + } catch (err) { + logger.warn('promptConnect not connected:', err) + } finally { + // auto-close by default, unless intent is to keep open + if (!intent.options || intent.options.keepWalletOpened !== true) { + this.notifyClose() + } + } + } else { + // Using default network + + // Failed to set default network on open -- quit + close + if (!chainId || chainId <= 0) { + this.notifyOpen({ + sessionId: this._sessionId, + error: `failed to open wallet on network ${networkId}` + }) + return false + } + + // user is already connected, notify session details. + // TODO: in future, keep list if 'connected' dapps / sessions in the session + // controller, and only sync with allowed apps + this.notifyOpen({ + sessionId: this._sessionId, + chainId: `${chainId}`, + session: await this.walletRequestHandler.walletSession(chainId) + }) + } + } + + return true + } + + private saveTransportSession = (session: TransportSession) => { + useBestStore().setItem(TRANSPORT_SESSION_LS_KEY, JSON.stringify(session)) + } + + protected getCachedTransportSession = async (): Promise => { + const session = useBestStore().getItem(TRANSPORT_SESSION_LS_KEY) + + try { + return session ? (JSON.parse(session) as TransportSession) : null + } catch (err) { + console.error(`unable to parse transport session: ${session}`) + return null + } + } +} diff --git a/packages/provider/src/transports/extension-transport/base-injected-transport.ts b/packages/provider/src/transports/extension-transport/base-injected-transport.ts new file mode 100644 index 000000000..94d734dbb --- /dev/null +++ b/packages/provider/src/transports/extension-transport/base-injected-transport.ts @@ -0,0 +1,101 @@ +import { JsonRpcRequest, JsonRpcResponse } from '@0xsequence/network' +import { logger } from '@0xsequence/utils' +import { EventEmitter2 as EventEmitter } from 'eventemitter2' +import { + ProviderMessageResponseCallback, + ProviderMessage, + EventType, + ProviderMessageRequest, + ProviderMessageResponse +} from '../../types' + +export interface Stream { + on(ev: string | symbol, fn: (...args: any[]) => void): void + writable: boolean + write(chunk: any, cb?: (error: Error | null | undefined) => void): boolean +} + +// to be used on injected window.ethereum EIP1193 proxy +export abstract class BaseInjectedTransport extends EventEmitter { + protected responseCallbacks = new Map() + + private _messageIdx = 0 + protected nextMessageIdx = () => ++this._messageIdx + + constructor(private stream: Stream) { + super() + + this.stream.on('data', this.handleMessage) + } + + private handleMessage = (message: ProviderMessage) => { + if (!message.type || !message.data) { + return + } + + logger.info('[received message]', message) + + const requestIdx = message.idx + const responseCallback = this.responseCallbacks.get(requestIdx) + if (requestIdx) { + this.responseCallbacks.delete(requestIdx) + } + + switch (message.type) { + case EventType.MESSAGE: + if (responseCallback) { + this.emit(EventType.MESSAGE, message) + responseCallback(message.data.error, message) + } else { + // NOTE: this would occur if 'idx' isn't set, which should never happen + // or when we register two handler, or duplicate messages with the same idx are sent, + // all of which should be prevented prior to getting to this point + throw new Error('impossible state') + } + break + case EventType.DISCONNECT: + case EventType.ACCOUNTS_CHANGED: + case EventType.CHAIN_CHANGED: + this.emit(message.type, message.data) + break + default: + console.error('unknown message type', message) + break + } + } + + protected sendMessageRequest = async (message: ProviderMessageRequest): Promise => { + return new Promise((resolve, reject) => { + if (!message.idx || message.idx <= 0) { + reject(new Error('message idx not set')) + } + + const responseCallback: ProviderMessageResponseCallback = (error: any, response?: ProviderMessageResponse) => { + if (error) { + reject(error) + } else if (response) { + resolve(response) + } else { + throw new Error('no valid response to return') + } + } + + const { idx } = message + if (!this.responseCallbacks.get(idx)) { + this.responseCallbacks.set(idx, responseCallback) + } else { + reject(new Error('duplicate message idx, should never happen')) + } + + this.sendMessage(message) + }) + } + + private sendMessage(message: ProviderMessage) { + if (!this.stream.writable) { + console.error('window post message stream is not writable') + } + + this.stream.write(message) + } +} diff --git a/packages/provider/src/transports/extension-transport/extension-message-handler.ts b/packages/provider/src/transports/extension-transport/extension-message-handler.ts new file mode 100644 index 000000000..88449b564 --- /dev/null +++ b/packages/provider/src/transports/extension-transport/extension-message-handler.ts @@ -0,0 +1,29 @@ +import { WalletRequestHandler } from '../wallet-request-handler' +import { BaseWalletTransport } from '../base-wallet-transport' +import { InitState, ProviderMessage } from '../../types' +import { Runtime } from 'webextension-polyfill' +import { logger } from '@0xsequence/utils' + +export const CHANNEL_ID = 'sequence-extension-message-handler' + +export class ExtensionMessageHandler extends BaseWalletTransport { + private port: any + + constructor( + walletRequestHandler: WalletRequestHandler, + public runtime: Runtime.Static + ) { + super(walletRequestHandler) + this._init = InitState.OK + } + + register() { + this._registered = true + this.port = this.runtime.connect({ name: CHANNEL_ID }) + } + + sendMessage(message: ProviderMessage) { + logger.info('[ExtensionMessageHandler send]', message) + this.port.postMessage(message) + } +} diff --git a/packages/provider/src/transports/extension-transport/extension-message-provider.ts b/packages/provider/src/transports/extension-transport/extension-message-provider.ts new file mode 100644 index 000000000..a65f214b0 --- /dev/null +++ b/packages/provider/src/transports/extension-transport/extension-message-provider.ts @@ -0,0 +1,41 @@ +import { InitState, OpenWalletIntent, ProviderMessage } from '../../types' +import { BaseProviderTransport } from '../base-provider-transport' +import { CHANNEL_ID } from './extension-message-handler' + +import { Runtime } from 'webextension-polyfill' + +export class ExtensionMessageProvider extends BaseProviderTransport { + constructor(runtime: Runtime.Static) { + super() + + runtime.onConnect.addListener(port => { + if (port.name === CHANNEL_ID) { + this._init = InitState.OK + + port.onMessage.addListener((message: ProviderMessage) => { + this.handleMessage(message) + }) + } + }) + } + + register = () => { + this._registered = true + } + + sendMessage(message: ProviderMessage) { + //noop + } + + unregister() { + //noop + } + + openWallet(path?: string, intent?: OpenWalletIntent, networkId?: string | number) { + //noop + } + + closeWallet() { + //noop + } +} diff --git a/packages/provider/src/transports/extension-transport/index.ts b/packages/provider/src/transports/extension-transport/index.ts new file mode 100644 index 000000000..af015cdc0 --- /dev/null +++ b/packages/provider/src/transports/extension-transport/index.ts @@ -0,0 +1,3 @@ +export * from './extension-message-handler' +export * from './extension-message-provider' +export * from './base-injected-transport' diff --git a/packages/provider/src/transports/index.ts b/packages/provider/src/transports/index.ts new file mode 100644 index 000000000..35f06a3af --- /dev/null +++ b/packages/provider/src/transports/index.ts @@ -0,0 +1,8 @@ +export * from './base-provider-transport' +export * from './base-wallet-transport' +export * from './proxy-transport' +export * from './mux-transport' +export * from './window-transport' +export * from './wallet-request-handler' +export * from './extension-transport' +export * from './unreal-transport' diff --git a/packages/provider/src/transports/mux-transport/index.ts b/packages/provider/src/transports/mux-transport/index.ts new file mode 100644 index 000000000..6a69b9e8d --- /dev/null +++ b/packages/provider/src/transports/mux-transport/index.ts @@ -0,0 +1 @@ +export * from './mux-message-provider' diff --git a/packages/provider/src/transports/mux-transport/mux-message-provider.ts b/packages/provider/src/transports/mux-transport/mux-message-provider.ts new file mode 100644 index 000000000..109181aba --- /dev/null +++ b/packages/provider/src/transports/mux-transport/mux-message-provider.ts @@ -0,0 +1,249 @@ +import { + ProviderMessage, + ProviderTransport, + ProviderEventTypes, + ProviderMessageRequest, + ProviderMessageResponse, + WalletSession, + OpenWalletIntent, + ConnectDetails +} from '../../types' + +import { JsonRpcRequest, JsonRpcResponseCallback } from '@0xsequence/network' +import { ProxyMessageChannelPort, ProxyMessageProvider } from '../proxy-transport' +import { Runtime } from 'webextension-polyfill' +import { UnrealMessageProvider } from '../unreal-transport' +import { ExtensionMessageProvider } from '../extension-transport' +import { WindowMessageProvider } from '../window-transport' + +export type MuxTransportTemplate = { + walletAppURL?: string + + // WindowMessage transport (optional) + windowTransport?: { + enabled: boolean + } + + // ProxyMessage transport (optional) + proxyTransport?: { + enabled: boolean + appPort?: ProxyMessageChannelPort + } + + // Extension transport (optional) + extensionTransport?: { + enabled: boolean + runtime: Runtime.Static + } + + // Unreal Engine transport (optional) + unrealTransport?: { + enabled: boolean + } +} + +export function isMuxTransportTemplate(obj: any): obj is MuxTransportTemplate { + return ( + obj && + typeof obj === 'object' && + ((obj.windowTransport && typeof obj.windowTransport === 'object') || + (obj.proxyTransport && typeof obj.proxyTransport === 'object') || + (obj.extensionTransport && typeof obj.extensionTransport === 'object') || + (obj.unrealTransport && typeof obj.unrealTransport === 'object')) && + // One of the transports must be enabled + ((obj.windowTransport && obj.windowTransport.enabled) || + (obj.proxyTransport && obj.proxyTransport.enabled) || + (obj.extensionTransport && obj.extensionTransport.enabled) || + (obj.unrealTransport && obj.unrealTransport.enabled)) + ) +} + +export class MuxMessageProvider implements ProviderTransport { + private messageProviders: ProviderTransport[] + private provider: ProviderTransport | undefined + + constructor(...messageProviders: ProviderTransport[]) { + this.messageProviders = messageProviders + this.provider = undefined + } + + static new(template: MuxTransportTemplate): MuxMessageProvider { + const muxMessageProvider = new MuxMessageProvider() + + if (template.windowTransport?.enabled && typeof window === 'object' && template.walletAppURL) { + const windowMessageProvider = new WindowMessageProvider(template.walletAppURL) + muxMessageProvider.add(windowMessageProvider) + } + + if (template.proxyTransport?.enabled) { + const proxyMessageProvider = new ProxyMessageProvider(template.proxyTransport.appPort!) + muxMessageProvider.add(proxyMessageProvider) + } + + if (template.extensionTransport?.enabled) { + const extensionMessageProvider = new ExtensionMessageProvider(template.extensionTransport.runtime) + muxMessageProvider.add(extensionMessageProvider) + + // NOTE/REVIEW: see note in mux-message-provider + // + // We don't add the extensionMessageProvider here because we don't send requests to it anyways, we seem to + // send all requests to the WindowMessageProvider anyways. By allowing it, if browser restarts, it will break + // the entire extension because messageProvider.provider will be undefined. So this is a hack to fix it. + } + + if (template.unrealTransport?.enabled && template.windowTransport && template.walletAppURL) { + const unrealMessageProvider = new UnrealMessageProvider(template.walletAppURL) + muxMessageProvider.add(unrealMessageProvider) + } + + muxMessageProvider.register() + + return muxMessageProvider + } + + add(...messageProviders: ProviderTransport[]) { + this.messageProviders.push(...messageProviders) + } + + register = () => { + if (this.messageProviders.length === 1) { + this.provider = this.messageProviders[0] + this.provider.register() + return + } + + // REVIEW/NOTE: ........ this method does not work for the chrome-extension. The issue becomes + // when the browser quits or restarts, the "open" event is never triggered. Perhaps the code here is fine, + // or maybe its not. What should happen is when a dapp makes a request, it will call openWallet + // below, in which case one of the events will register. So perhaps this is fine. + this.messageProviders.forEach(m => { + m.register() + + m.once('open', () => { + // the first one to open is the winner, and others will be unregistered + if (!this.provider) { + this.provider = m + + // unregister other providers + this.messageProviders.forEach(m => { + if (this.provider !== m) { + m.unregister() + } + }) + } + }) + }) + } + + unregister = () => { + this.messageProviders.forEach(m => m.unregister()) + this.provider = undefined + } + + openWallet = (path?: string, intent?: OpenWalletIntent, networkId?: string | number): void => { + if (this.provider) { + this.provider.openWallet(path, intent, networkId) + return + } + this.messageProviders.forEach(m => m.openWallet(path, intent, networkId)) + } + + closeWallet() { + if (this.provider) { + this.provider.closeWallet() + } + } + + isOpened(): boolean { + if (this.provider) { + return this.provider.isOpened() + } + return false + } + + isConnected(): boolean { + if (this.provider) { + return this.provider.isConnected() + } + return false + } + + on(event: K, fn: ProviderEventTypes[K]) { + if (this.provider) { + this.provider.on(event, fn) + return + } + this.messageProviders.forEach(m => { + m.on(event, fn) + }) + } + + once(event: K, fn: ProviderEventTypes[K]) { + if (this.provider) { + this.provider.once(event, fn) + return + } + this.messageProviders.forEach(m => { + m.once(event, fn) + }) + } + + emit(event: K, ...args: Parameters): boolean { + if (this.provider) { + return this.provider.emit(event, ...args) + } + for (let i = 0; i < this.messageProviders.length; i++) { + this.messageProviders[i].emit(event, ...args) + } + return true + } + + sendAsync = async (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + if (this.provider) { + this.provider.sendAsync(request, callback, chainId) + return + } + throw new Error('impossible state, wallet must be opened first') + } + + sendMessage(message: ProviderMessage) { + if (!message.idx || message.idx <= 0) { + throw new Error('message idx is empty') + } + + if (this.provider) { + this.provider.sendMessage(message) + } else { + throw new Error('impossible state, wallet must be opened first') + } + } + + sendMessageRequest = async (message: ProviderMessageRequest): Promise => { + if (this.provider) { + return this.provider.sendMessageRequest(message) + } + throw new Error('impossible state, wallet must be opened first') + } + + handleMessage(message: ProviderMessage): void { + if (this.provider) { + this.provider.handleMessage(message) + return + } + throw new Error('impossible state, wallet must be opened first') + } + + waitUntilOpened = async (): Promise => { + if (this.provider) { + return this.provider.waitUntilOpened() + } + return Promise.race(this.messageProviders.map(p => p.waitUntilOpened())) + } + + waitUntilConnected = async (): Promise => { + if (this.provider) { + return this.provider.waitUntilConnected() + } + throw new Error('impossible state, wallet must be opened first') + } +} diff --git a/packages/provider/src/transports/proxy-transport/index.ts b/packages/provider/src/transports/proxy-transport/index.ts new file mode 100644 index 000000000..dd0a69332 --- /dev/null +++ b/packages/provider/src/transports/proxy-transport/index.ts @@ -0,0 +1,3 @@ +export * from './proxy-message-channel' +export * from './proxy-message-provider' +export * from './proxy-message-handler' diff --git a/packages/provider/src/transports/proxy-transport/proxy-message-channel.ts b/packages/provider/src/transports/proxy-transport/proxy-message-channel.ts new file mode 100644 index 000000000..33f585797 --- /dev/null +++ b/packages/provider/src/transports/proxy-transport/proxy-message-channel.ts @@ -0,0 +1,57 @@ +import { EventEmitter2 as EventEmitter } from 'eventemitter2' +import { ProviderMessage, ProviderMessageTransport, ProviderEventTypes, TypedEventEmitter } from '../../types' + +export class ProxyMessageChannel { + app: ProxyMessageChannelPort + wallet: ProxyMessageChannelPort + + constructor() { + const port1 = new ProxyMessageChannelPort() + const port2 = new ProxyMessageChannelPort() + + port1.conn = port2 + port2.conn = port1 + + this.app = port1 + this.wallet = port2 + } +} + +export class ProxyMessageChannelPort implements ProviderMessageTransport { + conn: ProviderMessageTransport + events: TypedEventEmitter = new EventEmitter() as TypedEventEmitter + + // handle messages which hit this port + handleMessage = (message: ProviderMessage): void => { + throw new Error('ProxyMessageChannelPort is not registered') + } + + // send messages to the connected port + sendMessage = (message: ProviderMessage): void => { + this.conn.handleMessage(message) + + // trigger events + if (message.type === 'open') { + this.events.emit('open', message as any) + } + if (message.type === 'close') { + this.events.emit('close', message as any) + } + if (message.type === 'connect') { + this.events.emit('connect', message as any) + } + if (message.type === 'disconnect') { + this.events.emit('disconnect', message as any) + } + } + + on(event: K, fn: ProxyEventTypes[K]) { + this.events.on(event, fn as any) + } + + once(event: K, fn: ProxyEventTypes[K]) { + this.events.once(event, fn as any) + } +} + +export type ProxyEventTypes = Pick diff --git a/packages/provider/src/transports/proxy-transport/proxy-message-handler.ts b/packages/provider/src/transports/proxy-transport/proxy-message-handler.ts new file mode 100644 index 000000000..68d2e3982 --- /dev/null +++ b/packages/provider/src/transports/proxy-transport/proxy-message-handler.ts @@ -0,0 +1,44 @@ +import { BaseWalletTransport } from '../base-wallet-transport' +import { WalletRequestHandler } from '../wallet-request-handler' +import { InitState, ProviderMessage } from '../../types' +import { ProxyMessageChannelPort } from './proxy-message-channel' + +export class ProxyMessageHandler extends BaseWalletTransport { + private port: ProxyMessageChannelPort + + constructor(walletRequestHandler: WalletRequestHandler, port: ProxyMessageChannelPort) { + super(walletRequestHandler) + this.port = port + this._init = InitState.OK + } + + register() { + this.port.handleMessage = (message: ProviderMessage): void => { + this.handleMessage(message) + } + this._registered = true + } + + // note: we can't decide whether to restore the session within register(), because session info is + // received asyncronously via EventType.OPEN after register() is executed. + // And in the case of a redirect/reload, EventType.OPEN is not sent at all, + // because the wallet is already open. + // + // call this method from wallet redirect hander when a session restore is needed + async restoreSession() { + const cachedSession = await this.getCachedTransportSession() + if (cachedSession) { + this.open(cachedSession) + } + } + + unregister() { + // @ts-ignore + this.port.handleMessage = undefined + this._registered = false + } + + sendMessage(message: ProviderMessage) { + this.port.sendMessage(message) + } +} diff --git a/packages/provider/src/transports/proxy-transport/proxy-message-provider.ts b/packages/provider/src/transports/proxy-transport/proxy-message-provider.ts new file mode 100644 index 000000000..b5d817c78 --- /dev/null +++ b/packages/provider/src/transports/proxy-transport/proxy-message-provider.ts @@ -0,0 +1,85 @@ +import { BaseProviderTransport } from '../base-provider-transport' + +import { ProviderMessage, OpenState, OpenWalletIntent, EventType, InitState } from '../../types' + +import { ProxyMessageChannelPort, ProxyEventTypes } from './proxy-message-channel' + +export class ProxyMessageProvider extends BaseProviderTransport { + private port: ProxyMessageChannelPort + + constructor(port: ProxyMessageChannelPort) { + super() + this.state = OpenState.CLOSED + this.port = port + if (!port) { + throw new Error('port argument cannot be empty') + } + + // disable init handshake for proxy-transport, we set it to OK, to + // consider it in completed state. + this._init = InitState.OK + } + + register = () => { + this.port.handleMessage = (message: ProviderMessage): void => { + this.handleMessage(message) + } + + this.on('open', (...args: Parameters) => { + this.port.events.emit('open', ...args) + }) + this.on('close', (...args: Parameters) => { + this.port.events.emit('close', ...args) + }) + this.on('connect', (...args: Parameters) => { + this.port.events.emit('connect', ...args) + }) + this.on('disconnect', (...args: Parameters) => { + this.port.events.emit('disconnect', ...args) + }) + + this._registered = true + } + + unregister = () => { + this._registered = false + this.closeWallet() + this.events.removeAllListeners() + // @ts-ignore + this.port.handleMessage = undefined + } + + openWallet = (path?: string, intent?: OpenWalletIntent, networkId?: string | number): void => { + if (this.state === OpenState.CLOSED) { + this.state = OpenState.OPENING + const sessionId = `${performance.now()}` + this._sessionId = sessionId + this.sendMessage({ + idx: -1, + type: EventType.OPEN, + data: { + path, + intent, + networkId, + sessionId + } + }) + } + } + + closeWallet() { + this.sendMessage({ + idx: -1, + type: EventType.CLOSE, + data: null + }) + this.close() + } + + sendMessage(message: ProviderMessage) { + if (!message.idx) { + throw new Error('message idx is empty') + } + this.port.sendMessage(message) + } +} diff --git a/packages/provider/src/transports/unreal-transport/index.ts b/packages/provider/src/transports/unreal-transport/index.ts new file mode 100644 index 000000000..460b0a9f0 --- /dev/null +++ b/packages/provider/src/transports/unreal-transport/index.ts @@ -0,0 +1,2 @@ +export * from './unreal-message-provider' +export * from './unreal-message-handler' diff --git a/packages/provider/src/transports/unreal-transport/overridelogs.ts b/packages/provider/src/transports/unreal-transport/overridelogs.ts new file mode 100644 index 000000000..5148d9389 --- /dev/null +++ b/packages/provider/src/transports/unreal-transport/overridelogs.ts @@ -0,0 +1,34 @@ +interface UnrealInjectedWindow { + ue?: { + sequencewallettransport?: { + logfromjs: (message: string) => void + warnfromjs: (message: string) => void + errorfromjs: (message: string) => void + } + } + logsOverriddenForUnreal?: boolean +} +declare const window: Window & typeof globalThis & UnrealInjectedWindow + +/** + * This will redirect console logs from Sequence.js & the wallet to the Unreal console, for debugging purposes. + */ +export function overrideLogs(side: 'dapp' | 'wallet') { + if (window.ue?.sequencewallettransport && !window.logsOverriddenForUnreal) { + const t = window.ue?.sequencewallettransport + console.log = (...args: unknown[]) => { + t.logfromjs(`${side}: ${stringify(args)}`) + } + console.warn = (...args: unknown[]) => { + t.warnfromjs(`${side}: ${stringify(args)}`) + } + console.error = (...args: unknown[]) => { + t.errorfromjs(`${side}: ${stringify(args)}`) + } + window.logsOverriddenForUnreal = true + } +} + +function stringify(things: unknown[]): string { + return things.map(a => (typeof a === 'object' ? (a instanceof Error ? a.message : JSON.stringify(a)) : String(a))).join(' ') +} diff --git a/packages/provider/src/transports/unreal-transport/unreal-message-handler.ts b/packages/provider/src/transports/unreal-transport/unreal-message-handler.ts new file mode 100644 index 000000000..8358d6c6c --- /dev/null +++ b/packages/provider/src/transports/unreal-transport/unreal-message-handler.ts @@ -0,0 +1,121 @@ +import { + ProviderMessageRequest, + ProviderMessage, + EventType, + InitState, + WindowSessionParams, + OpenWalletIntent, + ProviderRpcError, + TransportSession +} from '../../types' +import { WalletRequestHandler } from '../wallet-request-handler' +import { BaseWalletTransport } from '../base-wallet-transport' +import { logger, base64DecodeObject } from '@0xsequence/utils' +import { overrideLogs } from './overridelogs' + +// all lowercase is an annoying limitation of Unreal CEF BindUObject +interface UnrealInjectedWalletWindow { + ue?: { + sequencewallettransport?: { + onmessagefromsequencejs?: (message: ProviderMessageRequest) => void + sendmessagetosequencejs: (message: string) => void + } + } +} +declare const window: Window & typeof globalThis & UnrealInjectedWalletWindow + +/** + * Initialized on Wallet side + */ +export class UnrealMessageHandler extends BaseWalletTransport { + constructor(walletRequestHandler: WalletRequestHandler) { + super(walletRequestHandler) + this._init = InitState.NIL + } + + async register(windowHref?: string | URL) { + if (window.ue?.sequencewallettransport === undefined) { + return + } + overrideLogs('wallet') + + // record open details (sessionId + default network) from the window url + const { search: rawParams } = new URL(windowHref || window.location.href) + + let session: TransportSession | null = this.getUnrealTransportSession(rawParams) + + // provider should always include sid when opening a new window + const isNewWindowSession = !!session.sessionId + + // attempt to restore previous session in the case of a redirect or window reload + if (!isNewWindowSession) { + session = await this.getCachedTransportSession() + } + + if (!session) { + logger.error('unreal session is undefined') + return + } + + // listen for window-transport requests + window.ue.sequencewallettransport.onmessagefromsequencejs = this.onMessageFromUnreal + this._registered = true + + // send open event to the app which opened us + this.open(session) + .then(opened => { + if (!opened) { + const err = `failed to open to network ${session?.networkId}` + logger.error(err) + this.notifyClose({ message: err } as ProviderRpcError) + window.close() + } + }) + .catch(e => { + const err = `failed to open to network ${session?.networkId}, due to: ${e}` + logger.error(err) + this.notifyClose({ message: err } as ProviderRpcError) + window.close() + }) + } + + unregister() { + if (window.ue?.sequencewallettransport?.onmessagefromsequencejs === this.onMessageFromUnreal) { + delete window.ue.sequencewallettransport.onmessagefromsequencejs + } + this._registered = false + } + + // onmessage is called when (the wallet) receives request messages from the dapp + // over the unreal json-messaging transport + private onMessageFromUnreal = (request: ProviderMessageRequest) => { + // Wallet always expects json-rpc request messages from a dapp + + logger.debug('RECEIVED MESSAGE', request) + + // Handle message via the base transport + this.handleMessage(request) + } + + // sendMessage sends message to the dapp window + sendMessage(message: ProviderMessage) { + if (message.type !== EventType.INIT && this._init !== InitState.OK) { + logger.error('impossible state, should not be calling postMessage until inited') + return + } + // prepare payload + const payload = JSON.stringify(message) + + // post-message to app. + window.ue?.sequencewallettransport?.sendmessagetosequencejs(payload) + } + + private getUnrealTransportSession = (windowParams: string | undefined): TransportSession => { + const params = new WindowSessionParams(windowParams) + return { + sessionId: params.get('sid'), + networkId: params.get('net'), + intent: base64DecodeObject(params.get('intent')) + } + } +} diff --git a/packages/provider/src/transports/unreal-transport/unreal-message-provider.ts b/packages/provider/src/transports/unreal-transport/unreal-message-provider.ts new file mode 100644 index 000000000..8b1908589 --- /dev/null +++ b/packages/provider/src/transports/unreal-transport/unreal-message-provider.ts @@ -0,0 +1,121 @@ +import { OpenWalletIntent, ProviderMessage, InitState, WindowSessionParams } from '../../types' +import { BaseProviderTransport } from '../base-provider-transport' +import { base64EncodeObject } from '@0xsequence/utils' +import { overrideLogs } from './overridelogs' + +let registeredUnrealMessageProvider: UnrealMessageProvider | undefined + +// all lowercase is an annoying limitation of Unreal CEF BindUObject +interface UnrealInjectedSequenceJSWindow { + ue?: { + sequencewallettransport?: { + onmessagefromwallet?: (message: ProviderMessage) => void + sendmessagetowallet: (message: string) => void + } + } +} + +declare const window: Window & typeof globalThis & UnrealInjectedSequenceJSWindow + +/** + * Initialized on dApp side + */ +export class UnrealMessageProvider extends BaseProviderTransport { + private walletURL: URL + + constructor(walletAppURL: string) { + super() + this.walletURL = new URL(walletAppURL) + } + + register = () => { + overrideLogs('dapp') + if (registeredUnrealMessageProvider) { + // overriding the registered message provider + registeredUnrealMessageProvider.unregister() + registeredUnrealMessageProvider = this + } + + // listen for incoming messages from wallet + if (window.ue?.sequencewallettransport) { + window.ue.sequencewallettransport.onmessagefromwallet = this.onUnrealCallback + } + registeredUnrealMessageProvider = this + + this._registered = true + console.log('registering transport!') + } + + unregister = () => { + this._registered = false + this.closeWallet() + + // disable message listener + if (registeredUnrealMessageProvider === this) { + registeredUnrealMessageProvider = undefined + } + if (window.ue?.sequencewallettransport?.onmessagefromwallet === this.onUnrealCallback) { + delete window.ue.sequencewallettransport.onmessagefromwallet + } + + // clear event listeners + this.events.removeAllListeners() + } + + openWallet = (path?: string, intent?: OpenWalletIntent, networkId?: string | number): void => { + if (this.isOpened()) { + // TODO focus wallet + console.log('wallet already open!') + return + } + + console.log('opening wallet!') + // Instantiate new walletURL for this call + const walletURL = new URL(this.walletURL.href) + const windowSessionParams = new WindowSessionParams() + + if (path) { + walletURL.pathname = path.toLowerCase() + } + + // Set session, intent and network id on walletURL + this._init = InitState.NIL + this._sessionId = `${performance.now()}` + windowSessionParams.set('sid', this._sessionId) + + if (intent) { + // encode intent as base64 url-encoded param + windowSessionParams.set('intent', base64EncodeObject(intent)) + } + if (networkId) { + windowSessionParams.set('net', `${networkId}`) + } + // serialize params + walletURL.search = windowSessionParams.toString() + + console.log('opening wallet to', walletURL.href) + + window.open(walletURL.href) + } + + closeWallet() { + this.close() + } + + // onmessage, receives ProviderMessageResponse from the wallet unreal transport + private onUnrealCallback = (message: ProviderMessage) => { + if (!message) { + throw new Error('ProviderMessage object is empty') + } + + // handle message with base message provider + this.handleMessage(message) + } + + // all lowercase is an annoying limitation of Unreal CEF BindUObject + sendMessage(message: ProviderMessage) { + const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message + console.log('Sending message to wallet:', postedMessage) + window.ue?.sequencewallettransport?.sendmessagetowallet(postedMessage) + } +} diff --git a/packages/provider/src/transports/wallet-request-handler.ts b/packages/provider/src/transports/wallet-request-handler.ts new file mode 100644 index 000000000..98dbf3cf3 --- /dev/null +++ b/packages/provider/src/transports/wallet-request-handler.ts @@ -0,0 +1,940 @@ +import { Account, AccountStatus } from '@0xsequence/account' +import { signAuthorization, AuthorizationOptions } from '@0xsequence/auth' +import { commons } from '@0xsequence/core' +import { + ChainId, + ChainIdLike, + findNetworkConfig, + findSupportedNetwork, + JsonRpcHandler, + JsonRpcRequest, + JsonRpcResponse, + JsonRpcResponseCallback, + NetworkConfig +} from '@0xsequence/network' +import { logger, TypedData } from '@0xsequence/utils' +import { BigNumber, ethers, providers } from 'ethers' +import { EventEmitter2 as EventEmitter } from 'eventemitter2' + +import { fromExtended } from '../extended' +import { validateTransactionRequest } from '../transactions' +import { + ConnectDetails, + ConnectOptions, + ErrSignedInRequired, + MessageToSign, + NetworkedConnectOptions, + OpenWalletIntent, + PromptConnectDetails, + ProviderEventTypes, + ProviderMessageRequest, + ProviderMessageRequestHandler, + ProviderMessageResponse, + ProviderRpcError, + TypedEventEmitter, + WalletSession +} from '../types' +import { prefixEIP191Message } from '../utils' + +type ExternalProvider = providers.ExternalProvider + +const SIGNER_READY_TIMEOUT = 10000 + +export interface WalletSignInOptions { + connect?: boolean + defaultNetworkId?: number +} + +export class WalletRequestHandler implements ExternalProvider, JsonRpcHandler, ProviderMessageRequestHandler { + // signer interface of the wallet. A null value means there is no signer (ie. user not signed in). An undefined + // value means the signer state is unknown, usually meaning the wallet app is booting up and initializing. Of course + // a Signer value is the actually interface to a signed-in account + private account: Account | null | undefined + private signerReadyCallbacks: Array<() => void> = [] + + private prompter: WalletUserPrompter | null + private networks: NetworkConfig[] + + private _openIntent?: OpenWalletIntent + private _connectOptions?: ConnectOptions + + private events: TypedEventEmitter = new EventEmitter() as TypedEventEmitter + + onConnectOptionsChange: ((connectOptions: ConnectOptions | undefined) => void) | undefined = undefined + + constructor(account: Account | null | undefined, prompter: WalletUserPrompter | null, networks: NetworkConfig[]) { + this.account = account + this.prompter = prompter + this.networks = networks + } + + defaultChainId(): number { + return this.prompter?.getDefaultChainId() ?? this.networks[0].chainId + } + + async signIn(account: Account | null, options: WalletSignInOptions = {}) { + this.setAccount(account) + + const { connect, defaultNetworkId } = options + + // Optionally, connect the dapp and wallet. In case connectOptions are provided, we will perform + // necessary auth request, and then notify the dapp of the 'connect' details. + // + // NOTE: if a user is signing into a dapp from a fresh state, and and auth request is made + // we don't trigger the promptConnect flow, as we consider the user just authenticated + // for this dapp, so its safe to authorize in the promptSignInConnect() which will directly + // connect after signing in. + // + // NOTE: signIn can optionally connect and notify dapp at this time for new signIn flows + if (connect) { + const connectOptions = this._connectOptions + + let connectDetails: ConnectDetails | PromptConnectDetails + + if (this.prompter !== null) { + connectDetails = await this.prompter?.promptSignInConnect(connectOptions) + } else { + connectDetails = await this.connect(connectOptions) + } + + this.notifyConnect(connectDetails) + + if (!connectOptions || connectOptions.keepWalletOpened !== true) { + this.notifyClose() + } + } + + if (defaultNetworkId && this.defaultChainId() !== defaultNetworkId) { + await this.prompter?.promptChangeNetwork(defaultNetworkId) + } + } + + signOut() { + if (this.account) { + this.notifyDisconnect() + } + + // signed out state + this.setAccount(null) + } + + signerReset() { + // resetting signer puts the wallet in an uninitialized state, which requires the app to + // re-initiatize and set the signer either as "null" (ie. no signer) or "Signer" (ie. signed in). + this.account = undefined + } + + signerReady(timeout: number = SIGNER_READY_TIMEOUT): Promise { + return new Promise((resolve, reject) => { + if (this.account !== undefined) { + resolve() + } else { + setTimeout(() => { + if (this.account === undefined) { + this.signerReadyCallbacks = [] + reject(`signerReady timed out`) + } + }, timeout) + this.signerReadyCallbacks.push(resolve) + } + }) + } + + async connect(options?: NetworkedConnectOptions): Promise { + if (!this.account) { + return { + connected: false, + chainId: '0x0', + error: 'unable to connect without signed in account' + } + } + + const networkId = options?.networkId ?? this.defaultChainId() ?? ChainId.MAINNET + const chainId = findSupportedNetwork(networkId)!.chainId + + const connectDetails: ConnectDetails = { + connected: true, + chainId: ethers.utils.hexValue(chainId) + } + + if (options && options.authorize) { + // Perform ethauth eip712 request and construct the ConnectDetails response + // including the auth proof + const authOptions: AuthorizationOptions = { + app: options.app, + origin: options.origin, + expiry: options.expiry, + nonce: options.authorizeNonce + } + // if (typeof(options.authorize) === 'object') { + // authOptions = { ...authOptions, ...options.authorize } + // } + + try { + // TODO: Either implement account as a signer, or change signAuthorization to accept an account + connectDetails.proof = await signAuthorization(this.account, chainId, authOptions) + } catch (err) { + logger.warn(`connect, signAuthorization failed for options: ${JSON.stringify(options)}, due to: ${err.message}`) + return { + connected: false, + chainId: '0x0', + error: `signAuthorization failed: ${err.message}` + } + } + } + + // Build session response for connect details + connectDetails.session = this.walletSession(chainId) + + return connectDetails + } + + promptConnect = async (options?: NetworkedConnectOptions): Promise => { + if (!options && !this._connectOptions) { + // this is an unexpected state and should not happen + throw new Error('prompter connect options are empty') + } + + if (!this.prompter) { + // if prompter is null, we'll auto connect + return this.connect(options) + } + + const promptConnectDetails = await this.prompter.promptConnect(options || this._connectOptions).catch(_ => { + return { connected: false } as ConnectDetails + }) + + const connectDetails: ConnectDetails = promptConnectDetails + if (connectDetails.connected && !connectDetails.session) { + connectDetails.session = await this.walletSession(options?.networkId) + } + + return promptConnectDetails + } + + // sendMessageRequest will unwrap the ProviderMessageRequest and send it to the JsonRpcHandler + // (aka, the signer in this instance) and then responds with a wrapped response of + // ProviderMessageResponse to be sent over the transport + sendMessageRequest(message: ProviderMessageRequest): Promise { + return new Promise(resolve => { + this.sendAsync( + message.data, + (error: any, response?: JsonRpcResponse) => { + // TODO: if response includes data.error, why do we need a separate error argument here? + + const responseMessage: ProviderMessageResponse = { + ...message, + data: response! + } + + // NOTE: we always resolve here, are the sendAsync call will wrap any exceptions + // in the error field of the response to ensure we send back to the user + resolve(responseMessage) + }, + message.chainId + ) + }) + } + + // sendAsync implements the JsonRpcHandler interface for sending JsonRpcRequests to the wallet + sendAsync = async (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + const response: JsonRpcResponse = { + jsonrpc: '2.0', + id: request.id!, + result: null + } + + await this.getAccount() + + try { + // only allow public json rpc method to the provider when user is not logged in, aka signer is not set + if ((!this.account || this.account === null) && !permittedJsonRpcMethods.includes(request.method)) { + // throw new Error(`not logged in. ${request.method} is unavailable`) + throw ErrSignedInRequired + } + + // wallet account + const account = this.account + if (!account) throw new Error('WalletRequestHandler: wallet account is not configured') + + // fetch the provider for the specific chain, or undefined will select defaultChain + const provider = this.account?.providerFor(chainId ?? this.defaultChainId()) + if (!provider) throw new Error(`WalletRequestHandler: wallet provider is not configured for chainId ${chainId}`) + const jsonRpcProvider = provider instanceof ethers.providers.JsonRpcProvider ? provider : undefined + + switch (request.method) { + case 'net_version': { + if (!jsonRpcProvider) { + throw new Error(`Account provider doesn't support send method`) + } + + const result = await jsonRpcProvider.send('net_version', []) + response.result = result + break + } + + case 'eth_chainId': { + if (!jsonRpcProvider) { + throw new Error(`Account provider doesn't support send method`) + } + + const result = await jsonRpcProvider.send('eth_chainId', []) + response.result = result + break + } + + case 'eth_accounts': { + const walletAddress = account.address + response.result = [walletAddress] + break + } + + case 'eth_getBalance': { + const [accountAddress, blockTag] = request.params! + const walletBalance = await provider.getBalance(accountAddress, blockTag) + response.result = walletBalance.toHexString() + break + } + + case 'sequence_sign': + case 'personal_sign': + case 'eth_sign': { + // note: message from json-rpc input is in hex format + let message: any + + // there is a difference in the order of the params: + // sequence_sign, personal_sign: [data, address] + // eth_sign: [address, data] + switch (request.method) { + case 'sequence_sign': + case 'personal_sign': { + const [data, _address] = request.params! + message = data + break + } + case 'eth_sign': { + const [_address, data] = request.params! + message = data + break + } + } + + let sig = '' + + // Message must be prefixed with "\x19Ethereum Signed Message:\n" + // as defined by EIP-191 + const prefixedMessage = prefixEIP191Message(message) + + // TODO: + // if (process.env.TEST_MODE === 'true' && this.prompter === null) { + const sequenceVerified = request.method === 'sequence_sign' + if (this.prompter === null) { + // prompter is null, so we'll sign from here + sig = await account.signMessage( + prefixedMessage, + chainId ?? this.defaultChainId(), + sequenceVerified ? 'eip6492' : 'ignore' + ) + } else { + sig = await this.prompter.promptSignMessage( + { + chainId: chainId, + message: prefixedMessage, + eip6492: sequenceVerified + }, + this.connectOptions + ) + } + + if (sig && sig.length > 0) { + response.result = sig + } else { + // The user has declined the request when value is null + throw new Error('declined by user') + } + break + } + + case 'sequence_signTypedData_v4': + case 'eth_signTypedData': + case 'eth_signTypedData_v4': { + // note: signingAddress from json-rpc input is in hex format, and typedDataObject + // should be an object, but in some instances may be double string encoded + const [signingAddress, typedDataObject] = request.params! + + let typedData: TypedData | undefined = undefined + if (typeof typedDataObject === 'string') { + try { + typedData = JSON.parse(typedDataObject) + } catch (e) { + console.warn('walletRequestHandler: error parsing typedData', e) + } + } else { + typedData = typedDataObject + } + + if (!typedData || !typedData.domain || !typedData.types || !typedData.message) { + throw new Error('invalid typedData object') + } + + let sig = '' + + const sequenceVerified = request.method === 'sequence_signTypedData_v4' + if (this.prompter === null) { + // prompter is null, so we'll sign from here + sig = await account.signTypedData( + typedData.domain, + typedData.types, + typedData.message, + chainId ?? this.defaultChainId(), + sequenceVerified ? 'eip6492' : 'ignore' + ) + } else { + sig = await this.prompter.promptSignMessage( + { + chainId: chainId, + typedData: typedData, + eip6492: sequenceVerified + }, + this.connectOptions + ) + } + + if (sig && sig.length > 0) { + response.result = sig + } else { + // The user has declined the request when value is null + throw new Error('declined by user') + } + break + } + + case 'eth_sendTransaction': { + // https://eth.wiki/json-rpc/API#eth_sendtransaction + const transactionParams = fromExtended(request.params![0]).map(tx => { + // eth_sendTransaction uses 'gas' + // ethers and sequence use 'gasLimit' + if ('gas' in tx && tx.gasLimit === undefined) { + tx.gasLimit = tx.gas as any + delete tx.gas + } + + return tx + }) + + validateTransactionRequest(account.address, transactionParams) + + let txnHash = '' + if (this.prompter === null) { + // prompter is null, so we'll send from here + const txnResponse = await account.sendTransaction(transactionParams, chainId ?? this.defaultChainId()) + txnHash = txnResponse?.hash ?? '' + } else { + // prompt user to provide the response + txnHash = await this.prompter.promptSendTransaction(transactionParams, chainId, this.connectOptions) + } + + if (txnHash) { + response.result = txnHash + } else { + // The user has declined the request when value is null + throw new Error('declined by user') + } + break + } + + case 'eth_signTransaction': { + // https://eth.wiki/json-rpc/API#eth_signTransaction + const [transaction] = request.params! + const sender = ethers.utils.getAddress(transaction.from) + + if (sender !== account.address) { + throw new Error('sender address does not match wallet') + } + + validateTransactionRequest(account.address, transaction) + + if (this.prompter === null) { + // The eth_signTransaction method expects a `string` return value we instead return a `SignedTransactions` object, + // this can only be broadcasted using an RPC provider with support for signed Sequence transactions, like this one. + // + // TODO: verify serializing / transporting the SignedTransaction object works as expected, most likely however + // we will want to resolveProperties the big number values to hex strings + response.result = await account.signTransactions(transaction, chainId ?? this.defaultChainId()) + } else { + response.result = await this.prompter.promptSignTransaction(transaction, chainId, this.connectOptions) + } + + break + } + + case 'eth_sendRawTransaction': { + // NOTE: we're not using a prompter here as the transaction is already signed + // and would have prompted the user upon signing. + + // https://eth.wiki/json-rpc/API#eth_sendRawTransaction + if (commons.transaction.isSignedTransactionBundle(request.params![0])) { + const txChainId = BigNumber.from(request.params![0].chainId).toNumber() + const tx = await account.relayer(txChainId)!.relay(request.params![0]) + response.result = tx.hash + } else { + const tx = await provider.sendTransaction(request.params![0]) + response.result = tx.hash + } + break + } + + case 'eth_getTransactionCount': { + const address = ethers.utils.getAddress(request.params![0] as string) + const tag = request.params![1] + + // TODO: Maybe we should fetch this data from the relayer or from the reader + // but for now we keep it simple and just use the provider + + const count = await provider.getTransactionCount(address, tag) + response.result = ethers.BigNumber.from(count).toHexString() + + break + } + + case 'eth_blockNumber': { + response.result = await provider.getBlockNumber() + break + } + + case 'eth_getBlockByNumber': { + response.result = await provider.getBlock(request.params![0] /* , jsonRpcRequest.params[1] */) + break + } + + case 'eth_getBlockByHash': { + response.result = await provider.getBlock(request.params![0] /* , jsonRpcRequest.params[1] */) + break + } + + case 'eth_getTransactionByHash': { + response.result = await provider.getTransaction(request.params![0]) + break + } + + case 'eth_call': { + const [transactionObject, blockTag] = request.params! + response.result = await provider.call(transactionObject, blockTag) + break + } + + case 'eth_getCode': { + const [contractAddress, blockTag] = request.params! + response.result = await provider.getCode(contractAddress, blockTag) + break + } + + case 'eth_estimateGas': { + const [transactionObject] = request.params! + response.result = await provider.estimateGas(transactionObject) + break + } + + case 'eth_gasPrice': { + const gasPrice = await provider.getGasPrice() + response.result = gasPrice.toHexString() + break + } + + case 'wallet_switchEthereumChain': { + const [switchParams] = request.params! + if (!switchParams.chainId || switchParams.chainId.length === 0) { + throw new Error('invalid chainId') + } + + const chainId = ethers.BigNumber.from(switchParams.chainId) + + this.setDefaultChainId(chainId.toNumber()) + + response.result = null // success + break + } + + // smart wallet method + case 'sequence_getWalletContext': { + response.result = account.contexts + break + } + + // smart wallet method + case 'sequence_getWalletConfig': { + const [chainId] = request.params! + if (chainId) { + response.result = [(await account.status(chainId)).onChain.config] + } else { + response.result = await Promise.all( + account.networks.map(async network => { + const status = await account.status(network.chainId) + return status.onChain.config + }) + ) + } + break + } + + // smart wallet method + case 'sequence_getWalletState': { + const [chainId] = request.params! + // TODO: Add getWalletState to the Signer interface + if (chainId) { + response.result = [getLegacyWalletState(chainId, await account.status(chainId))] + } else { + response.result = await Promise.all( + account.networks.map(async network => { + const status = await account.status(network.chainId) + return getLegacyWalletState(network.chainId, status) + }) + ) + } + break + } + + // smart wallet method + case 'sequence_getNetworks': { + // NOTE: must ensure that the response result below returns clean serialized data, which is to omit + // the provider and relayer objects and only return the urls so can be reinstantiated on dapp side. + // This is handled by this.getNetworks() but noted here for future readers. + response.result = await this.getNetworks(true) + break + } + + case 'sequence_isSequence': { + response.result = true + break + } + + // smart wallet method + case 'sequence_updateConfig': { + throw new Error('sequence_updateConfig method is not allowed from a dapp') + // NOTE: method is disabled as we don't need a dapp to request to update a config. + // However, if we ever want this, we can enable it but must also use the prompter + // for confirmation. + // + // const [newConfig] = request.params + // response.result = await signer.updateConfig(newConfig) + break + } + + // smart wallet method + case 'sequence_publishConfig': { + throw new Error('sequence_publishConfig method is not allowed from a dapp') + break + } + + // relayer method + case 'sequence_gasRefundOptions': { + // TODO + break + } + + // relayer method + case 'sequence_getNonce': { + // TODO + break + } + + // relayer method + case 'sequence_relay': { + // TODO + break + } + + // set default network of wallet + case 'sequence_setDefaultNetwork': { + const [defaultChainId] = request.params! + + if (!defaultChainId) { + throw new Error('invalid request, method argument defaultChainId cannot be empty') + } + + this.setDefaultChainId(defaultChainId) + response.result = await this.getNetworks(true) + break + } + + default: { + if (!jsonRpcProvider) { + throw new Error(`Account provider doesn't support send method`) + } + + // NOTE: provider here will be chain-bound if chainId is provided + const providerResponse = await jsonRpcProvider.send(request.method, request.params!) + response.result = providerResponse + } + } + } catch (err) { + logger.error(err) + + // See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1193.md#rpc-errors + response.result = null + response.error = { + ...new Error(err), + code: 4001 + } + } + + callback(undefined, response) + } + + on(event: K, fn: ProviderEventTypes[K]) { + this.events.on(event, fn as any) + } + + once(event: K, fn: ProviderEventTypes[K]) { + this.events.once(event, fn as any) + } + + async getAddress(): Promise { + return this.account?.address ?? '' + } + + get openIntent(): OpenWalletIntent | undefined { + return this._openIntent + } + + setOpenIntent(intent: OpenWalletIntent | undefined) { + this._openIntent = intent + } + + get connectOptions(): ConnectOptions | undefined { + return this._connectOptions + } + + setConnectOptions(options: ConnectOptions | undefined) { + this._connectOptions = options + + this.onConnectOptionsChange?.(options) + } + + async setDefaultChainId(chainId: number): Promise { + await this.prompter?.promptChangeNetwork(chainId) + return this.defaultChainId() + } + + async getNetworks(jsonRpcResponse?: boolean): Promise { + if (!this.account) { + logger.warn('signer not set: getNetworks is returning an empty list') + return [] + } + + if (jsonRpcResponse) { + // omit provider and relayer objects as they are not serializable + return this.account.networks.map(n => { + const network: NetworkConfig = { ...n } + network.provider = undefined + network.relayer = undefined + return network + }) + } else { + return this.account.networks + } + } + + walletSession(networkId?: ChainIdLike): WalletSession | undefined { + if (!this.account) { + return undefined + } + + const session = { + walletContext: this.account.contexts, + accountAddress: this.account.address, + // The dapp shouldn't access the relayer directly, and the provider (as an object) is not serializable. + networks: this.account.networks.map(n => ({ ...n, provider: undefined, relayer: undefined })) + } + + if (networkId) { + const network = findNetworkConfig(session.networks, networkId) + + if (network) { + // Delete the isDefaultChain property from the session network + session.networks?.forEach(n => delete n.isDefaultChain) + + // Add the isDefaultChain property to the network with the given networkId + network.isDefaultChain = true + } + } + + return session + } + + notifyConnect(connectDetails: ConnectDetails, origin?: string) { + console.log('emit connect', connectDetails) + this.events.emit('connect', connectDetails) + if (connectDetails.session?.accountAddress) { + this.events.emit('accountsChanged', [connectDetails.session?.accountAddress], origin) + } + } + + notifyDisconnect(origin?: string) { + this.events.emit('accountsChanged', [], origin) + this.events.emit('disconnect', undefined, origin) + } + + notifyChainChanged(chainId: number, origin?: string) { + this.events.emit('chainChanged', ethers.utils.hexValue(chainId), origin) + } + + async notifyNetworks(networks?: NetworkConfig[]) { + const n = networks || (await this.getNetworks(true)) + this.events.emit('networks', n) + if (n.length > 0) { + const defaultNetwork = n.find(network => network.chainId === this.defaultChainId()) + if (defaultNetwork) { + this.events.emit('chainChanged', ethers.utils.hexValue(defaultNetwork.chainId)) + } + } else { + this.events.emit('chainChanged', '0x0') + } + } + + async notifyWalletContext() { + if (!this.account) { + logger.warn('signer not set: skipping to notify wallet context') + return + } + const walletContext = this.account.contexts + this.events.emit('walletContext', walletContext) + } + + notifyClose(error?: ProviderRpcError) { + this.events.emit('close', error) + } + + isSignedIn = async (): Promise => { + await this.signerReady() + return !!this.account + } + + getAccount = async (): Promise => { + await this.signerReady() + if (this.account === undefined) { + throw new Error('signerReady failed resolve') + } + return this.account + } + + setAccount(account: Account | null | undefined) { + this.account = account + + if (account !== undefined) { + for (let i = 0; i < this.signerReadyCallbacks.length; i++) { + this.signerReadyCallbacks[i]() + } + this.signerReadyCallbacks = [] + } + } + + private async handleConfirmWalletDeployPrompt( + prompter: WalletUserPrompter, + account: Account, + sequenceVerified: boolean, + chainId?: number + ): Promise { + // check if wallet is deployed and up to date, if not, prompt user to deploy + // if no chainId is provided, we'll assume the wallet is auth chain wallet and is up to date + if (!chainId) { + return true + } + + const skipsDeploy = (status: AccountStatus) => { + return status.canOnchainValidate || (status.original.version === 2 && sequenceVerified) + } + + const status = await account.status(chainId) + if (skipsDeploy(status)) { + return true + } + + const promptResult = await prompter.promptConfirmWalletDeploy(chainId, this.connectOptions) + + // if client returned true, check again to make sure wallet is deployed and up to date + if (promptResult) { + const status2 = await account.status(chainId) + + if (skipsDeploy(status2)) { + return true + } else { + logger.error('WalletRequestHandler: result for promptConfirmWalletDeploy is not correct') + return false + } + } + + return false + } +} + +export interface WalletUserPrompter { + getDefaultChainId(): number + + promptConnect(options?: ConnectOptions): Promise + promptSignInConnect(options?: ConnectOptions): Promise + + promptSignMessage(message: MessageToSign, options?: ConnectOptions): Promise + promptSignTransaction(txn: commons.transaction.Transactionish, chainId?: number, options?: ConnectOptions): Promise + promptSendTransaction(txn: commons.transaction.Transactionish, chainId?: number, options?: ConnectOptions): Promise + promptConfirmWalletDeploy(chainId: number, options?: ConnectOptions): Promise + + promptChangeNetwork(chainId: number): Promise +} + +interface LegacyWalletState { + context: commons.context.WalletContext + config?: commons.config.Config + + // the wallet address + address: string + + // the chainId of the network + chainId: number + + // whether the wallet has been ever deployed + deployed: boolean + + // the imageHash of the `config` WalletConfig + imageHash: string + + // the last imageHash of a WalletConfig, stored on-chain + lastImageHash?: string + + // whether the WalletConfig object itself has been published to logs + published?: boolean + + status: AccountStatus +} + +function getLegacyWalletState(chainId: number, status: AccountStatus): LegacyWalletState { + return { + context: status.original.context, + config: status.onChain.config, + address: commons.context.addressOf(status.original.context, status.original.imageHash), + chainId, + deployed: status.onChain.deployed, + imageHash: status.imageHash, + lastImageHash: status.onChain.imageHash, + published: true, + status + } +} + +const permittedJsonRpcMethods = [ + 'net_version', + 'eth_chainId', + 'eth_getBalance', + 'eth_getTransactionCount', + 'eth_blockNumber', + 'eth_getBlockByNumber', + 'eth_getBlockByHash', + 'eth_getTransactionByHash', + 'eth_getCode', + 'eth_estimateGas', + 'eth_gasPrice', + + 'sequence_getWalletContext', + 'sequence_getNetworks', + 'sequence_setDefaultNetwork' +] diff --git a/packages/provider/src/transports/window-transport/index.ts b/packages/provider/src/transports/window-transport/index.ts new file mode 100644 index 000000000..c286e86a5 --- /dev/null +++ b/packages/provider/src/transports/window-transport/index.ts @@ -0,0 +1,2 @@ +export * from './window-message-provider' +export * from './window-message-handler' diff --git a/packages/provider/src/transports/window-transport/window-message-handler.ts b/packages/provider/src/transports/window-transport/window-message-handler.ts new file mode 100644 index 000000000..4336547b7 --- /dev/null +++ b/packages/provider/src/transports/window-transport/window-message-handler.ts @@ -0,0 +1,168 @@ +import { + ProviderMessageRequest, + ProviderMessage, + EventType, + InitState, + WindowSessionParams, + OpenWalletIntent, + ProviderRpcError, + TransportSession +} from '../../types' +import { WalletRequestHandler } from '../wallet-request-handler' +import { BaseWalletTransport } from '../base-wallet-transport' +import { logger, sanitizeNumberString, base64DecodeObject } from '@0xsequence/utils' + +export class WindowMessageHandler extends BaseWalletTransport { + protected parentWindow: Window + + private _isPopup: boolean = false + + constructor(walletRequestHandler: WalletRequestHandler) { + super(walletRequestHandler) + this._init = InitState.NIL + } + + async register(windowHref?: any) { + const isPopup = parent.window.opener !== null + this._isPopup = isPopup + if (isPopup !== true) { + return + } + + // record open details (sessionId + default network) from the window url + const { pathname, search: rawParams } = new URL(windowHref || window.location.href) + + let session: TransportSession | null = this.getWindowTransportSession(rawParams) + + // provider should always include sid when opening a new window + const isNewWindowSession = !!session.sessionId + + // attempt to restore previous session in the case of a redirect or window reload + if (!isNewWindowSession) { + session = await this.getCachedTransportSession() + } + + if (!session) { + logger.error('window session is undefined') + return + } + + // record parent window instance for communication + this.parentWindow = parent.window.opener + + // listen for window-transport requests + window.addEventListener('message', this.onWindowEvent, false) + this._registered = true + + // send open event to the app which opened us + this.open(session) + .then(opened => { + if (!opened) { + const err = `failed to open to network ${session?.networkId}` + logger.error(err) + this.notifyClose({ message: err } as ProviderRpcError) + window.close() + } + }) + .catch(e => { + const err = `failed to open to network ${session?.networkId}, due to: ${e}` + logger.error(err) + this.notifyClose({ message: err } as ProviderRpcError) + window.close() + }) + } + + unregister() { + window.removeEventListener('message', this.onWindowEvent) + this._registered = false + } + + // onmessage is called when (the wallet) receives request messages from the dapp + // over the window post-messaging transport + private onWindowEvent = async (event: MessageEvent) => { + if (!event.origin || event.origin === '') { + // skip same-origin or when event.origin is empty/undefined + return + } + if (this.appOrigin && event.origin !== this.appOrigin) { + // skip message as not from expected app origin + return + } + + // Wallet always expects json-rpc request messages from a dapp + let request: ProviderMessageRequest + try { + request = JSON.parse(event.data) + } catch (err) { + // event is not a ProviderMessage JSON object, skip + return + } + + logger.debug('RECEIVED MESSAGE', request) + + // Record event origin for valid init ack + if (this._init !== InitState.OK && this.isValidInitAck(request)) { + this.appOrigin = event.origin + } + if (this._init === InitState.OK && (!this.appOrigin || this.appOrigin.length < 8)) { + // impossible state + logger.error('impossible state, init.OK and appOrigin required') + return + } + + // Handle message via the base transport + this.handleMessage(request) + } + + // postMessage sends message to the dapp window + sendMessage(message: ProviderMessage) { + // prepare payload + const payload = JSON.stringify(message) + + // post-message to app. + // only for init requests, we send to '*' origin + if (message.type === EventType.INIT) { + this.postMessage(payload, true) + } else { + this.postMessage(payload) + } + } + + get isPopup(): boolean { + return this._isPopup + } + + private postMessage(message: any, init = false) { + if (init !== true && this._init !== InitState.OK) { + logger.error('impossible state, should not be calling postMessage until inited') + return + } + + if (init) { + // init message transmission. If we already know the app origin, restrict to it; + // do not fall back to a global target, to avoid leaking sensitive data. + if (this.appOrigin && this.appOrigin.length > 4) { + this.parentWindow.postMessage(message, this.appOrigin) + } else { + logger.error('unable to postMessage init message as appOrigin is invalid or unavailable') + } + } else { + // open message transmission + if (this.appOrigin && this.appOrigin.length > 4) { + // just above '.com' + this.parentWindow.postMessage(message, this.appOrigin) + } else { + logger.error('unable to postMessage as parentOrigin is invalid') + } + } + } + + private getWindowTransportSession = (windowParams: string | undefined): TransportSession => { + const params = new WindowSessionParams(windowParams) + return { + sessionId: params.get('sid'), + networkId: params.get('net'), + intent: base64DecodeObject(params.get('intent')) + } + } +} diff --git a/packages/provider/src/transports/window-transport/window-message-provider.ts b/packages/provider/src/transports/window-transport/window-message-provider.ts new file mode 100644 index 000000000..5256214d1 --- /dev/null +++ b/packages/provider/src/transports/window-transport/window-message-provider.ts @@ -0,0 +1,197 @@ +import { OpenWalletIntent, ProviderMessage, InitState, EventType, WindowSessionParams } from '../../types' +import { BaseProviderTransport } from '../base-provider-transport' +import { logger, base64EncodeObject } from '@0xsequence/utils' +import { isBrowserExtension, isUnityPlugin } from '../../utils' + +// .. +let registeredWindowMessageProvider: WindowMessageProvider | undefined + +export class WindowMessageProvider extends BaseProviderTransport { + private walletURL: URL + private walletWindow: Window | null + + constructor(walletAppURL: string) { + super() + this.walletURL = new URL(walletAppURL) + } + + register = () => { + if (registeredWindowMessageProvider) { + // overriding the registered message provider + registeredWindowMessageProvider.unregister() + registeredWindowMessageProvider = this + } + + // listen for incoming messages from wallet + window.addEventListener('message', this.onWindowEvent) + registeredWindowMessageProvider = this + + // open heartbeat + this.on('open', () => { + // Heartbeat to track if window closed + const popup = this.walletWindow + const interval = setInterval(() => { + if (popup && popup.closed) { + clearInterval(interval) + this.close() + } + }, 500) + }) + + // close clean up + this.on('close', () => { + if (this.walletWindow) { + this.walletWindow.close() + this.walletWindow = null + } + }) + + this._registered = true + } + + unregister = () => { + this._registered = false + this.closeWallet() + + // disable message listener + if (registeredWindowMessageProvider === this) { + registeredWindowMessageProvider = undefined + } + window.removeEventListener('message', this.onWindowEvent) + + // clear event listeners + this.events.removeAllListeners() + } + + openWallet = (path?: string, intent?: OpenWalletIntent, networkId?: string | number): void => { + if (this.walletWindow && this.isOpened()) { + // TODO: update the location of window to path + this.walletWindow.focus() + return + } + + // Instantiate new walletURL for this call + const walletURL = new URL(this.walletURL.href) + const windowSessionParams = new WindowSessionParams() + + if (path && path !== '') { + walletURL.pathname = path.toLowerCase() + } + + // Set session, intent and network id on walletURL + this._init = InitState.NIL + this._sessionId = `${performance.now()}` + windowSessionParams.set('sid', this._sessionId) + + if (intent) { + // for the window-transport, we eagerly/optimistically set the origin host + // when connecting to the wallet, however, this will be verified and enforced + // on the wallet-side, so if a dapp provides the wrong origin, it will be dropped. + if (intent.type === 'connect') { + if (!intent.options) + intent.options = { + app: window.location.origin + } + + // skip setting origin host if we're in an browser extension execution context + // allow origin that is passed in + if (!isBrowserExtension() && !isUnityPlugin() && intent.options) { + intent.options.origin = window.location.origin + } + } + // encode intent as base64 url-encoded param + windowSessionParams.set('intent', base64EncodeObject(intent)) + } + if (networkId) { + windowSessionParams.set('net', `${networkId}`) + } + + // Open popup window on center of the app window + let windowSize: number[] + let windowPos: number[] + + if (isBrowserExtension()) { + windowSize = [450, 750] + windowPos = [Math.abs(window.screen.width / 2 - windowSize[0] / 2), Math.abs(window.screen.height / 2 - windowSize[1] / 2)] + } else { + windowSize = [450, 750] + windowPos = [ + Math.abs(window.screenX + window.innerWidth / 2 - windowSize[0] / 2), + Math.abs(window.screenY + window.innerHeight / 2 - windowSize[1] / 2) + ] + } + + const windowFeatures = + `toolbar=0,location=0,menubar=0,scrollbars=yes,status=yes` + + `,width=${windowSize[0]},height=${windowSize[1]}` + + `,left=${windowPos[0]},top=${windowPos[1]}` + + // serialize params + walletURL.search = windowSessionParams.toString() + + this.walletWindow = window.open(walletURL.href, 'sequence.app', windowFeatures) + + // TODO: move this somewhere else + // TODO: perhaps we trigger a .on('openTimeout') event..? maybe.. could help. + + // Popup blocking detection and notice + // let warned = false + // const warnPopupBlocked = () => { + // if (warned) return + // warned = true + // // alert('popup is blocked! hey yo') // NOTE: for debug purposes only + // throw new Error('popup is blocked') + // } + + // const popupCheck = setTimeout(() => { + // if (!popup || popup.closed || typeof popup.closed === 'undefined') { + // // popup is definitely blocked if we reach here. + // warnPopupBlocked() + // } + // }, 1000) + + // const popupBlocked = popup === null || popup === undefined + // if (popupBlocked) { + // warnPopupBlocked() + // return + // } + } + + closeWallet() { + this.close() + this.walletWindow?.close() + } + + // onmessage, receives ProviderMessageResponse from the wallet post-message transport + private onWindowEvent = (event: MessageEvent) => { + // Security check, ensure message is coming from wallet origin url + if (event.origin !== this.walletURL.origin) { + // Safetly can skip events not from the wallet + return + } + + let message: ProviderMessage + try { + message = JSON.parse(event.data) + } catch (err) { + // event is not a ProviderMessage JSON object, skip + return + } + + if (!message) { + throw new Error('ProviderMessage object is empty') + } + + // handle message with base message provider + this.handleMessage(message) + } + + sendMessage(message: ProviderMessage) { + if (!this.walletWindow) { + logger.warn('WindowMessageProvider: sendMessage failed as walletWindow is unavailable') + return + } + const postedMessage = typeof message !== 'string' ? JSON.stringify(message) : message + this.walletWindow.postMessage(postedMessage, this.walletURL.origin) + } +} diff --git a/packages/provider/src/types.ts b/packages/provider/src/types.ts new file mode 100644 index 000000000..60bfb26da --- /dev/null +++ b/packages/provider/src/types.ts @@ -0,0 +1,380 @@ +import { ETHAuthProof as AuthETHAuthProof } from '@0xsequence/auth' +import { commons } from '@0xsequence/core' +import { + ChainIdLike, + JsonRpcHandler, + JsonRpcRequest, + JsonRpcResponse, + NetworkConfig, + ProviderRpcError as NetworkProviderRpcError +} from '@0xsequence/network' +import { TypedData } from '@0xsequence/utils' + +export interface ProviderTransport extends JsonRpcHandler, ProviderMessageTransport, ProviderMessageRequestHandler { + register(): void + unregister(): void + + openWallet(path?: string, intent?: OpenWalletIntent, networkId?: string | number): void + closeWallet(): void + + isOpened(): boolean + isConnected(): boolean + + on(event: K, fn: ProviderEventTypes[K]): void + once(event: K, fn: ProviderEventTypes[K]): void + emit(event: K, ...args: Parameters): boolean + + waitUntilOpened(): Promise + waitUntilConnected(): Promise +} + +export function isProviderTransport(transport: any): transport is ProviderTransport { + return ( + transport && + typeof transport === 'object' && + typeof transport.register === 'function' && + typeof transport.unregister === 'function' && + typeof transport.openWallet === 'function' && + typeof transport.closeWallet === 'function' && + typeof transport.isOpened === 'function' && + typeof transport.isConnected === 'function' && + typeof transport.on === 'function' + ) +} + +export interface WalletTransport extends JsonRpcHandler, ProviderMessageTransport, ProviderMessageRequestHandler { + register(): void + unregister(): void + + notifyOpen(openInfo: { chainId?: string; sessionId?: string; session?: WalletSession; error?: string }): void + notifyClose(error?: ProviderRpcError): void + + notifyConnect(connectDetails: ConnectDetails): void + notifyAccountsChanged(accounts: string[]): void + notifyChainChanged(chainIdHex: string): void + notifyNetworks(networks: NetworkConfig[]): void +} + +export interface ProviderMessage { + idx: number // message id number + type: string // message type + data: T // the ethereum json-rpc payload + chainId?: number // chain id which the message is intended + origin?: string // origin of the message +} + +export type ProviderMessageRequest = ProviderMessage + +export type ProviderMessageResponse = ProviderMessage + +// ProviderMessageCallback is used to respond to ProviderMessage requests. The error +// argument is for exceptions during the execution, and response is the response payload +// which may contain the result or an error payload from the wallet. +export type ProviderMessageResponseCallback = (error?: ProviderRpcError, response?: ProviderMessageResponse) => void + +export type ProviderRpcError = NetworkProviderRpcError + +export interface ProviderMessageRequestHandler { + // sendMessageRequest sends a ProviderMessageRequest over the wire to the wallet. + // This method is similar to `sendMessage`, but it expects a response to this message. + sendMessageRequest(message: ProviderMessageRequest): Promise +} + +export interface ProviderMessageTransport { + // handleMessage will handle a message received from the remote wallet + handleMessage(message: ProviderMessage): void + + // sendMessage will send the provider message over the wire + sendMessage(message: ProviderMessage): void +} + +export type WindowSessionParam = 'sid' | 'net' | 'intent' + +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging +export interface WindowSessionParams extends URLSearchParams { + get(name: WindowSessionParam): string | null + set(name: WindowSessionParam, value: string): void +} + +// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging +export class WindowSessionParams extends URLSearchParams { + static new(init?: Record | string) { + return new URLSearchParams(init) as WindowSessionParams + } +} + +export interface TransportSession { + sessionId?: string | null + networkId?: string | number | null + intent?: OpenWalletIntent +} + +export enum EventType { + OPEN = 'open', + CLOSE = 'close', + + MESSAGE = 'message', + CONNECT = 'connect', + DISCONNECT = 'disconnect', + ACCOUNTS_CHANGED = 'accountsChanged', + CHAIN_CHANGED = 'chainChanged', + + NETWORKS = 'networks', + WALLET_CONTEXT = 'walletContext', + + INIT = 'init', + DEBUG = '_debug' +} + +export interface WalletEventTypes { + open: (openInfo: { chainId?: string; sessionId?: string; session?: WalletSession; error?: string }) => void + close: (error?: ProviderRpcError) => void + + connect: (connectDetails: ConnectDetails) => void + disconnect: (error?: ProviderRpcError, origin?: string) => void + + accountsChanged: (accounts: string[], origin?: string) => void + chainChanged: (chainIdHex: string, origin?: string) => void + + networks: (networks: NetworkConfig[]) => void + walletContext: (walletContext: commons.context.VersionedContext) => void +} + +export interface ProviderEventTypes extends WalletEventTypes { + message: (message: ProviderMessageResponse) => void +} + +export enum OpenState { + CLOSED = 0, + OPENING = 1, + OPENED = 2 +} + +export enum InitState { + NIL = 0, + SENT_NONCE = 1, + OK = 2 +} + +export interface ConnectOptions { + /** app name of the dapp which will be announced to user on connect screen */ + app: string + + /** custom protocol for auth redirect (unity/unreal) */ + appProtocol?: string + + /** origin hint of the dapp's host opening the wallet. This value will automatically + * be determined and verified for integrity, and can be omitted. */ + origin?: string + + /** access key for the project that can be obtained from Sequence Builder on sequence.build. + * This value will be automatically populated using the key passed in initWallet. */ + projectAccessKey?: string + + /** expiry number (in seconds) that is used for ETHAuth proof. Default is 1 week in seconds. */ + expiry?: number + + /** authorize will perform an ETHAuth eip712 signing and return the proof to the dapp. */ + authorize?: boolean + + /** authorizeNonce is an optional number to be passed as ETHAuth's nonce claim for replay protection. **/ + authorizeNonce?: number + + /** authorizeVersion is the version of the SDK that will validate the ETHAuth proof. */ + authorizeVersion?: number + + /** askForEmail will prompt to give permission to the dapp to access email address */ + askForEmail?: boolean + + /** refresh flag will force a full re-connect (ie. disconnect then connect again) */ + refresh?: boolean + + /** keepWalletOpened will keep the wallet window opened after connecting. The default + * is to automatically close the wallet after connecting. */ + keepWalletOpened?: boolean + + /** clientVersion is the sequence.js version of the dapp client. */ + clientVersion?: string + + /** Options to further customize the wallet experience. */ + settings?: Settings +} + +export interface NetworkedConnectOptions extends ConnectOptions { + /** chainId is the chainId to connect to. If not specified, the default chainId + * will be used. This does not define a default chain id, it is only used for the connect + * authorization signature. */ + networkId?: string | number +} + +/** Options to further customize the wallet experience. */ +export interface Settings { + /** Specify a wallet theme. `light` and `dark` are the main themes, to use other available + * themes, you can use the camel case version of the theme names in the wallet settings. + * For example: "Blue Dark" on wallet UI can be passed as "blueDark". + * Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent + * to set when you open the wallet for user. */ + theme?: ThemeOption + + /** Specify a banner image. This image, if provided, will be displayed on the wallet during + * the connect/authorize process */ + bannerUrl?: string + + bannerSize?: BannerSize + + /** Specify payment providers to use. If not specified, + * all available payment providers will be enabled. + * Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent + * to set when you open the wallet for user. */ + includedPaymentProviders?: PaymentProviderOption[] + + /** Specify a default currency to use with payment providers. + * If not specified, the default is USDC. + * Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent + * to set when you open the wallet for user. */ + defaultFundingCurrency?: CurrencyOption + + /** Specify default purchase amount as an integer, for prefilling the funding amount. + * If not specified, the default is 100. + * Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent + * to set when you open the wallet for user. */ + defaultPurchaseAmount?: number + + /** If true, lockFundingCurrencyToDefault disables picking any currency provided by payment + * providers other than the defaultFundingCurrency. + * If false, it allows picking any currency provided by payment providers. + * The default is true. + * Note that this setting will not be persisted, use wallet.open with 'openWithOptions' intent + * to set when you open the wallet for user. */ + lockFundingCurrencyToDefault?: boolean + + /** Specify an auth provider to allow dapp to specify ahead of time which auth method to redirect to. + * Will be ignored if user is already signed in. + */ + signInWith?: SignInOption + + /** Specify an email address to allow user automatically sign in with the email option. + * Will be ignored if user is already signed in. + */ + signInWithEmail?: string + + /** Specify which sign in options are allowed. + * Will be ignored if user is already signed in. + */ + signInOptions?: SignInOption[] + + /** Specify auxiliary data + */ + aux?: any +} + +/** light and dark are the main themes, to use other themes in wallet settings, + * you can use the camel case version of the name in the wallet settings. + * For example: "Blue Dark" on wallet UI can be passed as "blueDark" */ +export type ThemeOption = 'light' | 'dark' | string +export type PaymentProviderOption = 'ramp' | 'moonpay' | 'transak' | 'onmeta' | 'paytrie' | 'sardine' +export type CurrencyOption = 'usdc' | 'eth' | 'matic' +export type SignInOption = 'email' | 'google' | 'apple' | 'facebook' | 'discord' | 'twitch' +export type BannerSize = 'small' | 'medium' // | 'large' + +export interface ConnectDetails { + // chainId (in hex) and error are defined by EIP-1193 expected fields + chainId?: string + error?: string + + // connected flag denotes user-accepted the connect request + connected: boolean + + // session include account and network information needed by the dapp wallet provider. + session?: WalletSession + + // proof is a signed typedData (EIP-712) payload using ETHAuth domain. + // NOTE: the proof is signed to the `authChainId`, as the canonical auth chain. + proof?: ETHAuthProof + + // email address provided from wallet to the dapp, as request + accepted + // by a user during a connect request + email?: string +} + +export type PromptConnectDetails = Pick + +export type OpenWalletIntent = + | { type: 'connect'; options?: NetworkedConnectOptions } + | { type: 'openWithOptions'; options?: ConnectOptions } + | { type: 'jsonRpcRequest'; method: string } + +export interface MessageToSign { + message?: Uint8Array + typedData?: TypedData + chainId?: number + + eip6492?: boolean +} + +export type ETHAuthProof = AuthETHAuthProof + +export interface WalletSession { + // Wallet context + walletContext?: commons.context.VersionedContext + + // Account address of the wallet + accountAddress?: string + + // Networks in use for the session. The default/dapp network will show + // up as the first one in the list as the "main chain" + networks?: NetworkConfig[] +} + +export class ProviderError extends Error { + constructor(message?: string) { + super(message) + this.name = 'ProviderError' + } +} + +export const ErrSignedInRequired = new ProviderError('Wallet is not signed in. Connect a wallet and try again.') + +// TODO: lets build some nice error handling tools, prob in /utils ... + +export interface TypedEventEmitter { + addListener(event: E, listener: Events[E]): this + on(event: E, listener: Events[E]): this + once(event: E, listener: Events[E]): this + prependListener(event: E, listener: Events[E]): this + prependOnceListener(event: E, listener: Events[E]): this + + off(event: E, listener: Events[E]): this + removeAllListeners(event?: E): this + removeListener(event: E, listener: Events[E]): this + + emit(event: E, ...args: Arguments): boolean + eventNames(): (keyof Events | string | symbol)[] + listeners(event: E): Function[] + listenerCount(event: E): number +} + +type Arguments = [T] extends [(...args: infer U) => any] ? U : [T] extends [void] ? [] : [T] + +export type OptionalChainIdLike = + | { + chainId?: ChainIdLike + } + | undefined + +export type OptionalChainId = + | { + chainId?: number + } + | undefined + +export type OptionalEIP6492 = + | { + eip6492?: boolean + } + | undefined + +// This is required by viem, it expects a provider to have an EIP-1193 compliant `request` attribute. +export interface EIP1193Provider { + request: (request: { method: string; params?: Array }) => Promise +} diff --git a/packages/provider/src/utils.ts b/packages/provider/src/utils.ts new file mode 100644 index 000000000..615ba0215 --- /dev/null +++ b/packages/provider/src/utils.ts @@ -0,0 +1,212 @@ +import { ethers, BytesLike } from 'ethers' +import { messageIsExemptFromEIP191Prefix } from './eip191exceptions' +import { AccountStatus } from '@0xsequence/account' +import { commons } from '@0xsequence/core' +import { encodeMessageDigest, TypedData, encodeTypedDataDigest } from '@0xsequence/utils' + +const eip191prefix = ethers.utils.toUtf8Bytes('\x19Ethereum Signed Message:\n') + +export const messageToBytes = (message: BytesLike): Uint8Array => { + if (ethers.utils.isBytesLike(message)) { + return ethers.utils.arrayify(message) + } + + return ethers.utils.toUtf8Bytes(message) +} + +export const prefixEIP191Message = (message: BytesLike): Uint8Array => { + const messageBytes = messageToBytes(message) + if (messageIsExemptFromEIP191Prefix(messageBytes)) { + return messageBytes + } else { + return ethers.utils.concat([eip191prefix, ethers.utils.toUtf8Bytes(String(messageBytes.length)), messageBytes]) + } +} + +export const trimEIP191Prefix = (prefixedMessage: Uint8Array): Uint8Array => { + // If the message is not prefixed, we return the message as is. + if (JSON.stringify(prefixedMessage.slice(0, eip191prefix.length)) !== JSON.stringify(eip191prefix)) { + return prefixedMessage + } + + // We have two parts to remove. + // First is the EIP-191 prefix. + const ethereumSignedMessagePartSlicedArray = prefixedMessage.slice(eip191prefix.length) + + // Second is the digits added which represent length of the message without the prefix + // and we need to find the prefix that will match this. + // Here first we take the max prefix char length, and check if as a number it is bigger + // than the length of the message (since prefix is added to represent length of original message), + // if it is we remove 1 from char length, if not we keep the max prefix char length. + // As an example for the case where , if the message is 123456789, the expected prefix char is 9, with starting value 9123456789 + // the char length of the total message with the prefix is 10, so the max prefix char length we start is 2 from [1,0], and as a number 10, it is longer + // than the length of the message after removing prefix (10 - 2 = 8), so we slice 1 char less, which is 9, and we get the correct prefix. + const maxPrefixCharLength = String(ethereumSignedMessagePartSlicedArray.length).length + + let prefixCharLenght: number + let prefixAsNumber: number + + try { + prefixAsNumber = Number(ethers.utils.toUtf8String(ethereumSignedMessagePartSlicedArray.slice(0, maxPrefixCharLength))) + } catch { + prefixAsNumber = Number(ethers.utils.hexlify(ethereumSignedMessagePartSlicedArray.slice(0, maxPrefixCharLength))) + } + + if (prefixAsNumber > ethereumSignedMessagePartSlicedArray.length || !Number.isInteger(prefixAsNumber)) { + prefixCharLenght = maxPrefixCharLength - 1 + } else { + prefixCharLenght = maxPrefixCharLength + } + + const prefixRevertedMessage = ethereumSignedMessagePartSlicedArray.slice(prefixCharLenght) + + return prefixRevertedMessage +} + +export const isValidSignature = async ( + address: string, + digest: Uint8Array, + sig: string, + provider: ethers.providers.Provider +): Promise => { + const reader = new commons.reader.OnChainReader(provider) + return reader.isValidSignature(address, digest, sig) +} + +// Verify message signature +export const isValidMessageSignature = async ( + address: string, + message: string | Uint8Array, + signature: string, + provider: ethers.providers.Provider +): Promise => { + const prefixed = prefixEIP191Message(message) + const digest = encodeMessageDigest(prefixed) + return isValidSignature(address, digest, signature, provider) +} + +// Verify typedData signature +export const isValidTypedDataSignature = ( + address: string, + typedData: TypedData, + signature: string, + provider: ethers.providers.Provider +): Promise => { + return isValidSignature(address, encodeTypedDataDigest(typedData), signature, provider) +} + +export const isBrowserExtension = (): boolean => + window.location.protocol === 'chrome-extension:' || window.location.protocol === 'moz-extension:' + +export const isUnityPlugin = (): boolean => !!navigator.userAgent.match(/UnitySequence/i) + +// /** +// * Returns the status of a signer's wallet on given chain by checking wallet deployment and config status +// * +// * @param {Status} of the wallet +// */ +export const isWalletUpToDate = (status: AccountStatus): boolean => { + return status.onChain.deployed && status.fullyMigrated +} + +export interface ItemStore { + getItem(key: string): string | null + setItem(key: string, value: string): void + + removeItem(key: string): void + + onItemChange(key: string, cb: (value: string | null) => void): () => void +} + +export class MemoryItemStore implements ItemStore { + private callbacks: { key: string; cb: (value: string | null) => void }[] = [] + private store: Record = {} + + getItem(key: string): string | null { + return this.store[key] || null + } + + setItem(key: string, value: string): void { + this.store[key] = value + this.callbacks.filter(c => c.key === key).forEach(c => c.cb(value)) + } + + removeItem(key: string): void { + delete this.store[key] + } + + onItemChange(key: string, cb: (value: string | null) => void): () => void { + this.callbacks.push({ key, cb }) + + return () => { + this.callbacks = this.callbacks.filter(c => c.cb !== cb) + } + } +} + +export class LocalStorage implements ItemStore { + private callbacks: { key: string; cb: (value: string | null) => void }[] = [] + + static isAvailable(): boolean { + return typeof window === 'object' && typeof window.localStorage === 'object' + } + + constructor() { + if (!LocalStorage.isAvailable()) { + throw new Error('LocalStorage is not available') + } + + window.addEventListener('storage', e => { + const { key } = e + const cb = this.callbacks.filter(c => c.key === key) + cb.forEach(c => c.cb(this.getItem(key!))) + }) + } + + getItem(key: string): string | null { + return window.localStorage.getItem(key) + } + + setItem(key: string, value: string): void { + window.localStorage.setItem(key, value) + + // Trigger callbacks + // NOTICE: the event is not triggered on the same window + this.callbacks.filter(c => c.key === key).forEach(c => c.cb(value)) + } + + removeItem(key: string): void { + window.localStorage.removeItem(key) + + // Trigger callbacks + // NOTICE: the event is not triggered on the same window + this.callbacks.filter(c => c.key === key).forEach(c => c.cb(null)) + } + + onItemChange(key: string, cb: (value: string | null) => void): () => void { + this.callbacks.push({ key, cb }) + + return () => { + this.callbacks = this.callbacks.filter(c => c.cb !== cb) + } + } +} + +export function useBestStore(): ItemStore { + if (LocalStorage.isAvailable()) { + return new LocalStorage() + } + + return new MemoryItemStore() +} + +export async function resolveArrayProperties( + object: Readonly> | Readonly>[] +): Promise { + if (Array.isArray(object)) { + // T must include array type + return Promise.all(object.map(o => ethers.utils.resolveProperties(o))) as any + } + + return ethers.utils.resolveProperties(object) +} diff --git a/packages/provider/src/utils/index.ts b/packages/provider/src/utils/index.ts new file mode 100644 index 000000000..73105a5d3 --- /dev/null +++ b/packages/provider/src/utils/index.ts @@ -0,0 +1,75 @@ +import { BytesLike, TypedDataDomain, TypedDataField } from 'ethers' +import { ChainIdLike } from '@0xsequence/network' +import { encodeMessageDigest, TypedData, encodeTypedDataDigest } from '@0xsequence/utils' +import { isValidSignature, prefixEIP191Message } from '../utils' +import { SequenceSigner, SingleNetworkSequenceSigner } from '../signer' + +/** + * This class is redundant with the SequenceSigner class, but it is here for now to + * maintain compatibility with the old wallet API. Eventually we should move these + * methods to the SequenceSigner class and deprecate this class. + */ +export class WalletUtils { + constructor(public signer: SequenceSigner) { + if (SingleNetworkSequenceSigner.is(signer)) { + throw new Error('WalletUtils does not support SingleNetworkSequenceSigner') + } + } + + // Sign message on a specified chain, or DefaultChain by default + signMessage(message: BytesLike, chainId?: ChainIdLike, eip6492?: boolean): Promise { + return this.signer.signMessage(message, { chainId, eip6492 }) + } + + // Sign EIP-712 TypedData on a specified chain, or DefaultChain by default + signTypedData( + domain: TypedDataDomain, + types: Record>, + message: Record, + chainId?: ChainIdLike, + eip6492?: boolean + ): Promise { + return this.signer.signTypedData(domain, types, message, { chainId, eip6492 }) + } + + // Verify signature of a digest, one of a message, typedData or other + async isValidSignature(address: string, digest: Uint8Array, signature: string, chainId: number): Promise { + return isValidSignature(address, digest, signature, this.signer.getProvider(chainId)) + } + + // Verify message signature + async isValidMessageSignature( + address: string, + message: string | Uint8Array, + signature: string, + chainId: number + ): Promise { + const provider = this.signer.getProvider(chainId) + const prefixed = prefixEIP191Message(message) + const digest = encodeMessageDigest(prefixed) + return isValidSignature(address, digest, signature, provider) + } + + // Verify typedData signature + isValidTypedDataSignature(address: string, typedData: TypedData, signature: string, chainId: number): Promise { + return this.isValidSignature(address, encodeTypedDataDigest(typedData), signature, chainId) + } + + // sendTransaction() + // sendTransactions() + + // sendETH() + // sendToken() + // sendCoin() -- sugar for sendToken() + // sendCollectible() -- sugar for sendToken() + // callContract() + + // transactionHistory() + // getReceipt() + // getLogs() + // // .. + + // validateSignature() + // recoverWalletConfig() + // recoverAddress() +} diff --git a/packages/provider/tests/client.spec.ts b/packages/provider/tests/client.spec.ts new file mode 100644 index 000000000..7f223f62b --- /dev/null +++ b/packages/provider/tests/client.spec.ts @@ -0,0 +1,1637 @@ +import { expect } from 'chai' +import { + OpenWalletIntent, + ProviderEventTypes, + ProviderTransport, + SequenceClient, + TypedEventEmitter, + messageToBytes, + useBestStore +} from '../src' +import { JsonRpcRequest, JsonRpcResponse, JsonRpcResponseCallback, allNetworks } from '@0xsequence/network' +import EventEmitter from 'events' +import { commons, v1, v2 } from '@0xsequence/core' +import { ethers } from 'ethers' +import { TypedData } from '@0xsequence/utils' +import { ExtendedTransactionRequest } from '../src/extended' +import packageJson from '../package.json' + +const basicMockTransport = { + on: () => {}, + register: () => {}, + unregister: () => {}, + openWallet: () => {}, + closeWallet: () => {}, + isOpened: () => false, + isConnected: () => false +} as unknown as ProviderTransport + +const sampleContext = { + [1]: { + version: 1, + factory: '0x1234', + mainModule: '0x5678', + mainModuleUpgradable: '0x213123', + guestModule: '0x634123', + + walletCreationCode: '0x112233' + }, + [4]: { + version: 4, + factory: '0x99283', + mainModule: '0x1234', + mainModuleUpgradable: '0x5678', + guestModule: '0x213123', + + walletCreationCode: '0x112233' + } +} as commons.context.VersionedContext + +describe('SequenceClient', () => { + describe('callbacks', () => { + const callbacks: TypedEventEmitter = new EventEmitter() as TypedEventEmitter + let client: SequenceClient + + beforeEach(() => { + const mockTransport = { + ...basicMockTransport, + on(event: K, fn: ProviderEventTypes[K]): void { + callbacks.on(event, fn) + } + } + + client = new SequenceClient(mockTransport as unknown as ProviderTransport, useBestStore(), 1) + }) + + it('shoud emit open event', async () => { + let called = false + + client.onOpen(() => { + called = true + }) + + callbacks.emit('open', {}) + expect(called).to.be.true + }) + + it('should emit networks event', async () => { + let called = false + + client.onNetworks(networks => { + expect(networks).to.deep.equal(allNetworks) + called = true + }) + + callbacks.emit('networks', JSON.parse(JSON.stringify(allNetworks))) + expect(called).to.be.true + }) + + it('should emit accounts changed event', async () => { + let called = false + + client.onAccountsChanged(accounts => { + expect(accounts).to.deep.equal(['0x1234', '0x5678']) + called = true + }) + + callbacks.emit('accountsChanged', ['0x1234', '0x5678']) + expect(called).to.be.true + }) + + it('should emit wallet context event', async () => { + let called = false + + client.onWalletContext(context => { + expect(context).to.deep.equal(sampleContext) + called = true + }) + + callbacks.emit('walletContext', sampleContext) + expect(called).to.be.true + }) + + it('should emit default chain id changed event', async () => { + // NOTICE: This is not handled by the transport + // this is because network switching is done client-side + // and transport is never aware of it. + let calls = 0 + + client.onDefaultChainIdChanged(chainId => { + expect(chainId).to.equal(calls === 0 ? '0x2' : '0x1') + calls++ + }) + + client.setDefaultChainId(2) + client.setDefaultChainId(1) + // Second call should not trigger event + client.setDefaultChainId(1) + + expect(calls).to.equal(2) + }) + + it('should emit close event', async () => { + let called = false + + client.onClose(() => { + called = true + }) + + callbacks.emit('close') + expect(called).to.be.true + }) + + it('should unregister callback', async () => { + let called = false + + const unregister = client.onClose(() => { + called = true + }) + + unregister() + + callbacks.emit('close') + expect(called).to.be.false + }) + + it('should emit connect event', async () => { + let callsToConnect = 0 + + client.onConnect(details => { + callsToConnect++ + expect(details).to.deep.equal({ + connected: true, + chainId: '0x1', + session: { + accountAddress: '0x1234' + }, + email: 'test@sequence.app' + }) + }) + + callbacks.emit('connect', { + connected: true, + chainId: '0x1', + session: { + accountAddress: '0x1234' + }, + email: 'test@sequence.app' + }) + + expect(callsToConnect).to.equal(1) + }) + + it('should use default chain id during connect event', async () => { + let callsToConnect = 0 + + client.onConnect(details => { + callsToConnect++ + expect(details).to.deep.equal({ + connected: true, + chainId: '0x2', + session: { + accountAddress: '0x1234' + }, + email: 'test@sequence.app' + }) + }) + + client.setDefaultChainId(2) + + callbacks.emit('connect', { + connected: true, + // This should be ignored + chainId: '0xa', + session: { + accountAddress: '0x1234' + }, + email: 'test@sequence.app' + }) + + expect(callsToConnect).to.equal(1) + }) + + it('should emit disconnect event', async () => { + let callsToDisconnect = 0 + + client.onDisconnect(details => { + callsToDisconnect++ + expect(details).to.deep.equal({ + code: 9999 + }) + }) + + callbacks.emit('disconnect', { + code: 9999 + } as any) + + expect(callsToDisconnect).to.equal(1) + }) + }) + + it('should open wallet', async () => { + let calledOpenWallet = 0 + let calledWaitUntilOpened = 0 + let calledIsOpened = 0 + + const path = 'this/is/a/test/path' + const intent = { + type: 'connect' + } as OpenWalletIntent + + const client = new SequenceClient( + { + ...basicMockTransport, + openWallet: (path: string, intent: OpenWalletIntent, chainId?: number) => { + calledOpenWallet++ + expect(path).to.equal(path) + expect(intent).to.equal(intent) + expect(chainId).to.equal(2) + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + calledWaitUntilOpened++ + // delay a bit + await new Promise(resolve => setTimeout(resolve, 500)) + return { + accountAddress: ethers.Wallet.createRandom().address + } + }, + isOpened: () => { + calledIsOpened++ + return false + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result = await client.openWallet(path, intent) + expect(result).to.equal(false) + expect(calledOpenWallet).to.equal(1) + expect(calledWaitUntilOpened).to.equal(1) + expect(calledIsOpened).to.equal(1) + }) + + it('should open wallet on default chain id', async () => { + let calledOpenWallet = 0 + let calledWaitUntilOpened = 0 + let calledIsOpened = 0 + + const path = 'this/is/a/test/path' + const intent = { + type: 'connect' + } as OpenWalletIntent + + const client = new SequenceClient( + { + ...basicMockTransport, + openWallet: (path: string, intent: OpenWalletIntent, chainId?: number) => { + calledOpenWallet++ + expect(path).to.equal(path) + expect(intent).to.equal(intent) + expect(chainId).to.equal(3) + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + calledWaitUntilOpened++ + // delay a bit + await new Promise(resolve => setTimeout(resolve, 500)) + return { + accountAddress: ethers.Wallet.createRandom().address + } + }, + isOpened: () => { + calledIsOpened++ + return false + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + client.setDefaultChainId(3) + const result = await client.openWallet(path, intent) + expect(result).to.equal(false) + expect(calledOpenWallet).to.equal(1) + expect(calledWaitUntilOpened).to.equal(1) + expect(calledIsOpened).to.equal(1) + }) + + it('should close wallet', async () => { + let calledCloseWallet = 0 + + const client = new SequenceClient( + { + ...basicMockTransport, + closeWallet: () => { + calledCloseWallet++ + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + client.closeWallet() + expect(calledCloseWallet).to.equal(1) + }) + + it('should handle isOpened', async () => { + let calledIsOpened = 0 + + const client = new SequenceClient( + { + ...basicMockTransport, + isOpened: () => { + calledIsOpened++ + return calledIsOpened === 1 + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result1 = client.isOpened() + expect(result1).to.equal(true) + expect(calledIsOpened).to.equal(1) + + const result2 = client.isOpened() + expect(result2).to.equal(false) + expect(calledIsOpened).to.equal(2) + }) + + it('should handle connect, isConnected and disconnect', async () => { + let calledIsOpened = 0 + let calledOpenWallet = 0 + let calledCloseWallet = 0 + let calledWaitUntilOpened = 0 + let calledWaitUntilConnected = 0 + + const session = { + accountAddress: ethers.Wallet.createRandom().address + } + + const client = new SequenceClient( + { + ...basicMockTransport, + openWallet: (path?: string, intent?: OpenWalletIntent) => { + expect(path).to.equal(undefined) + expect(intent).to.deep.equal({ + type: 'connect', + options: { + app: 'This is a test', + authorizeVersion: 2, + networkId: 2, + clientVersion: packageJson.version, + projectAccessKey: undefined + } + }) + + calledOpenWallet++ + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + calledWaitUntilOpened++ + return session + }, + waitUntilConnected: async () => { + calledWaitUntilConnected++ + return { connected: true, chainId: '0xa', session } + }, + isOpened: () => { + calledIsOpened++ + return true + }, + closeWallet: () => { + calledCloseWallet++ + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result1 = client.isConnected() + expect(result1).to.equal(false) + + const result2 = await client.connect({ app: 'This is a test' }) + expect(result2.chainId).to.equal('10') + expect(result2.connected).to.equal(true) + expect(result2.session).to.equal(session) + + const result3 = client.isConnected() + expect(result3).to.equal(true) + + await client.disconnect() + + const result4 = client.isConnected() + expect(result4).to.equal(false) + + expect(calledIsOpened).to.equal(2, 'isOpened') + expect(calledOpenWallet).to.equal(1, 'openWallet') + expect(calledWaitUntilOpened).to.equal(1, 'waitUntilOpened') + expect(calledWaitUntilConnected).to.equal(1, 'waitUntilConnected') + expect(calledCloseWallet).to.equal(1, 'closeWallet') + }) + + it('should handle fail to connect', async () => { + const client = new SequenceClient( + { + ...basicMockTransport, + openWallet: () => Promise.resolve(true), + waitUntilOpened: async () => { + return { + accountAddress: ethers.Wallet.createRandom().address + } + }, + waitUntilConnected: async () => { + throw new Error('Failed to connect') + }, + isOpened: () => true + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result = await client.connect({ app: 'This is a test' }) + expect(result.connected).to.equal(false) + expect(result.session).to.equal(undefined) + expect(result.error).to.equal('Failed to connect') + expect(client.isConnected()).to.equal(false) + }) + + it('should handle reject connect', async () => { + const client = new SequenceClient( + { + ...basicMockTransport, + openWallet: () => Promise.resolve(true), + waitUntilOpened: async () => { + return { + accountAddress: ethers.Wallet.createRandom().address + } + }, + waitUntilConnected: async () => { + return { connected: false } + }, + isOpened: () => true + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result = await client.connect({ app: 'This is a test' }) + expect(result.connected).to.equal(false) + expect(result.session).to.equal(undefined) + expect(result.error).to.equal(undefined) + expect(client.isConnected()).to.equal(false) + }) + + it('should handle arbitrary send', async () => { + let calledSendAsync = 0 + + const commands = [ + { chainId: 2, req: { method: 'eth_chainId', params: [] }, res: { result: '0x1' } }, + { chainId: 2, req: { method: 'eth_accounts', params: [] }, res: { result: '0x12345' } }, + { chainId: 5, req: { method: 'eth_sendTransaction', params: [{ to: '0x1234' }] }, res: { result: '0x000' } }, + { chainId: 9, req: { method: 'non-standard', params: [{ a: 23123, b: true }] }, res: { result: '0x99' } } + ] as { chainId: number; req: JsonRpcRequest; res: JsonRpcResponse }[] + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + calledSendAsync++ + const command = commands.shift() + expect(request).to.deep.equal(command?.req) + expect(chainId).to.equal(command?.chainId) + callback(undefined, command?.res) + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + expect(calledSendAsync).to.equal(0) + + const result1 = await client.send({ method: 'eth_chainId', params: [] }) + expect(result1).to.deep.equal('0x1') + expect(calledSendAsync).to.equal(1) + + const result2 = await client.send({ method: 'eth_accounts', params: [] }, 2) + expect(result2).to.deep.equal('0x12345') + expect(calledSendAsync).to.equal(2) + + const result3 = await client.send({ method: 'eth_sendTransaction', params: [{ to: '0x1234' }] }, 5) + expect(result3).to.deep.equal('0x000') + expect(calledSendAsync).to.equal(3) + + // Changing the default chainId + // should change the chainId of the request + client.setDefaultChainId(9) + + const result4 = await client.send({ method: 'non-standard', params: [{ a: 23123, b: true }] }) + expect(result4).to.deep.equal('0x99') + expect(calledSendAsync).to.equal(4) + }) + + it('should handle error during arbitrary send', async () => { + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + callback(new Error('Failed to send')) + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result = client.send({ method: 'eth_chainId', params: [] }) + await expect(result).to.be.rejectedWith('Failed to send') + }) + + it('should fail is response is empty', async () => { + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + callback(undefined, undefined) + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const request = { method: 'eth_chainId', params: [] } + const result = client.send(request) + await expect(result).to.be.rejectedWith(`Got undefined response for request: ${request}`) + }) + + it('shound handle getNetworks', async () => { + // Networks are fetched once (during connect) and cached + let calledSendAsync = 0 + + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback) => { + calledSendAsync++ + expect(request).to.deep.equal({ method: 'sequence_getNetworks' }) + callback(undefined, { + result: [ + { + chainId: 5, + name: 'test' + } + ] + } as any) + }, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result1 = client.getNetworks() + await expect(result1).to.be.rejectedWith('Sequence session not connected') + + await client.connect({ app: 'This is a test' }) + + const result2 = await client.getNetworks() + expect(result2).to.deep.equal(allNetworks) + // We fetched this data on the connect call + expect(calledSendAsync).to.equal(0) + + const result3 = await client.getNetworks() + expect(result3).to.deep.equal(allNetworks) + // We cached the data + expect(calledSendAsync).to.equal(0) + + const result4 = await client.getNetworks(true) + expect(result4).to.deep.equal([ + { + chainId: 5, + name: 'test' + } + ]) + // We forced a fetch + expect(calledSendAsync).to.equal(1) + }) + + it('should return address and accounts', async () => { + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + const client = new SequenceClient( + { + ...basicMockTransport, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + }, + closeWallet: () => {} + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result1 = new Promise(() => client.getAddress()) + await expect(result1).to.be.rejectedWith('Sequence session not connected') + + await client.connect({ app: 'This is a test' }) + + const result3 = client.getAddress() + expect(result3).to.equal(session.accountAddress) + + await client.disconnect() + + const result5 = new Promise(() => client.getAddress()) + await expect(result5).to.be.rejectedWith('Sequence session not connected') + }) + + it('should call sign message', async () => { + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + let calledSendAsync = 0 + + const requests = [ + { eip6492: false, chainId: 2, message: '0x1234', result: '0x0000' }, + { eip6492: true, chainId: 2, message: [4, 2, 9, 1], result: '0x1111' }, + { eip6492: false, chainId: 5, message: '0x9993212', result: '0x2222' }, + { eip6492: true, chainId: 6, message: [4, 2, 9, 1], result: '0x3333' } + ] as { eip6492: boolean; chainId: number; message: ethers.BytesLike; result: string }[] + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + calledSendAsync++ + const req = requests.shift() + + if (!req) { + throw new Error('No more requests to handle') + } + + const message = ethers.utils.hexlify(messageToBytes(req.message)) + + expect(request).to.deep.equal( + { + method: req.eip6492 ? 'sequence_sign' : 'personal_sign', + params: [message, session.accountAddress] + }, + 'sendAsync request mismatch' + ) + expect(chainId).to.equal(req.chainId) + callback(undefined, { result: req.result } as any) + }, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + }, + closeWallet: () => {} + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result1 = client.signMessage('0x1234') + await expect(result1).to.be.rejectedWith('Sequence session not connected') + + await client.connect({ app: 'This is a test' }) + + const result2 = await client.signMessage('0x1234') + expect(result2).to.equal('0x0000') + + const result3 = await client.signMessage([4, 2, 9, 1], { eip6492: true, chainId: 2 }) + expect(result3).to.equal('0x1111') + + client.setDefaultChainId(5) + + const result4 = await client.signMessage('0x9993212') + expect(result4).to.equal('0x2222') + + const result5 = await client.signMessage([4, 2, 9, 1], { eip6492: true, chainId: 6 }) + expect(result5).to.equal('0x3333') + + expect(calledSendAsync).to.equal(4) + }) + + it('should call sign typed message', async () => { + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + let calledSendAsync = 0 + + const requests = [ + { + eip6492: false, + chainId: 2, + data: { + domain: { + name: 'App1', + version: '1', + chainId: 2, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'age', type: 'uint256' } + ] + }, + message: { + name: 'Alice', + age: '28' + } + }, + result: '0x0000' + }, + { + eip6492: true, + chainId: 2, + data: { + domain: { + name: 'App2', + version: '1.1', + chainId: 2, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Payment: [ + { name: 'receiver', type: 'address' }, + { name: 'amount', type: 'uint256' } + ] + }, + message: { + receiver: ethers.Wallet.createRandom().address, + amount: '100' + } + }, + result: '0x1111' + }, + { + eip6492: false, + chainId: 5, + data: { + domain: { + name: 'App3', + version: '2', + chainId: 5, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Agreement: [ + { name: 'firstParty', type: 'address' }, + { name: 'secondParty', type: 'address' }, + { name: 'terms', type: 'string' } + ] + }, + message: { + firstParty: ethers.Wallet.createRandom().address, + secondParty: ethers.Wallet.createRandom().address, + terms: 'Terms of the agreement here.' + } + }, + result: '0x2222' + }, + { + eip6492: true, + chainId: 6, + data: { + domain: { + name: 'App4', + version: '2.1', + chainId: 7, // This is ignored because option takes precedence + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Sale: [ + { name: 'item', type: 'string' }, + { name: 'price', type: 'uint256' } + ] + }, + message: { + item: 'Laptop', + price: '1500' + } + }, + result: '0x3333' + }, + { + eip6492: true, + chainId: 99, + data: { + domain: { + name: 'App4', + version: '2.1', + chainId: 99, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Sale: [ + { name: 'item', type: 'string' }, + { name: 'price', type: 'uint256' } + ] + }, + message: { + item: 'Laptop', + price: '1500' + } + }, + result: '0x5555' + } + ] as { eip6492: boolean; chainId: number; data: TypedData; result: string }[] + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + const req = requests[calledSendAsync] + calledSendAsync++ + + const encoded = ethers.utils._TypedDataEncoder.getPayload(req!.data.domain, req!.data.types, req!.data.message) + + expect(request).to.deep.equal({ + method: req?.eip6492 ? 'sequence_signTypedData_v4' : 'eth_signTypedData_v4', + params: [session.accountAddress, encoded] + }) + + expect(chainId).to.equal(req?.chainId) + callback(undefined, { result: req?.result } as any) + }, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + }, + closeWallet: () => {} + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result1 = client.signTypedData(requests[0].data) + await expect(result1).to.be.rejectedWith('Sequence session not connected') + + await client.connect({ app: 'This is a test' }) + + const result2 = await client.signTypedData(requests[0].data) + expect(result2).to.equal('0x0000') + + const result3 = await client.signTypedData(requests[1].data, { eip6492: true, chainId: 2 }) + expect(result3).to.equal('0x1111') + + client.setDefaultChainId(5) + + const result4 = await client.signTypedData(requests[2].data) + expect(result4).to.equal('0x2222') + + const result5 = await client.signTypedData(requests[3].data, { eip6492: true, chainId: 6 }) + expect(result5).to.equal('0x3333') + + expect(calledSendAsync).to.equal(4) + + // Should use chainId provided by typed data + const result6 = await client.signTypedData(requests[4].data, { eip6492: true }) + expect(result6).to.equal('0x5555') + }) + + it('should call send transaction', async () => { + let calledSendAsync = 0 + + const requests = [ + { + chainId: 2, + tx: { + to: '0x88E1627e95071d140Abaec34574ee4AC991295fC', + value: ethers.utils.parseEther('1.0'), + auxiliary: [] + }, + result: '0x0000' + }, + { + chainId: 2, + tx: { + to: '0xD20bC67fD6feFad616Ed6B29d6d15884E08b6D86', + value: 0, + gasLimit: 90000, + data: '0x8fe62083b9bc53178597a5a6bf55a565f1889b177607a3713bd1299aa2d4eac5458b279c87b7f85eb4e8', + auxiliary: [] + }, + result: '0x1111' + }, + { + chainId: 5, + tx: { + to: '0xf0B654137245894CAb26e56230403651B053D2Dd', + auxiliary: [] + }, + result: '0x2222' + }, + { + chainId: 6, + tx: { + to: '0x88E1627e95071d140Abaec34574ee4AC991295fC', + value: ethers.utils.parseEther('1.0'), + auxiliary: [ + { + to: '0xD20bC67fD6feFad616Ed6B29d6d15884E08b6D86', + data: '0xefc57b05025168af33d34948ddbad8bd32a2eb8857468aa492ef94de07451c4b3423080f028edebab979' + }, + { + to: '0xf0B654137245894CAb26e56230403651B053D2Dd', + value: 1 + } + ] + }, + result: '0x3333' + } + ] as { chainId: number; tx: ExtendedTransactionRequest; result: string }[] + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + calledSendAsync++ + const req = requests.shift() + expect(request).to.deep.equal({ + method: 'eth_sendTransaction', + params: [req?.tx] + }) + expect(chainId).to.equal(req?.chainId) + callback(undefined, { result: req?.result } as any) + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + // NOTICE: eth_sendTransaction doesn't require the address, so we don't attempt + // to get the address, thus we don't need to connect to the wallet + // we could add an extra check, but better to avoid client-side access control + // and let the wallet handle it, so we don't have a false sense of security. + // + // const result1 = client.sendTransaction({ + // to: '0x88E1627e95071d140Abaec34574ee4AC991295fC', + // value: ethers.utils.parseEther('1.0'), + // }) + + // await expect(result1).to.be.rejectedWith('Sequence session not connected') + // await client.connect({ app: 'This is a test' }) + + const result2 = await client.sendTransaction({ + to: '0x88E1627e95071d140Abaec34574ee4AC991295fC', + value: ethers.utils.parseEther('1.0') + }) + + expect(result2).to.equal('0x0000') + + const result3 = await client.sendTransaction( + { + to: '0xD20bC67fD6feFad616Ed6B29d6d15884E08b6D86', + value: 0, + data: '0x8fe62083b9bc53178597a5a6bf55a565f1889b177607a3713bd1299aa2d4eac5458b279c87b7f85eb4e8', + gasLimit: 90000 + }, + { chainId: 2 } + ) + + expect(result3).to.equal('0x1111') + + client.setDefaultChainId(5) + + const result4 = await client.sendTransaction({ + to: '0xf0B654137245894CAb26e56230403651B053D2Dd' + }) + + expect(result4).to.equal('0x2222') + + const result5 = await client.sendTransaction( + [ + { + to: '0x88E1627e95071d140Abaec34574ee4AC991295fC', + value: ethers.utils.parseEther('1.0') + }, + { + to: '0xD20bC67fD6feFad616Ed6B29d6d15884E08b6D86', + data: '0xefc57b05025168af33d34948ddbad8bd32a2eb8857468aa492ef94de07451c4b3423080f028edebab979' + }, + { + to: '0xf0B654137245894CAb26e56230403651B053D2Dd', + value: 1 + } + ], + { chainId: 6 } + ) + + expect(result5).to.equal('0x3333') + + expect(calledSendAsync).to.equal(4) + }) + + it('should call getWalletContext', async () => { + let calledSendAsync = 0 + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + calledSendAsync++ + expect(request).to.deep.equal({ + method: 'sequence_getWalletContext' + }) + callback(undefined, { result: sampleContext } as any) + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + const result = await client.getWalletContext() + expect(result).to.deep.equal(sampleContext) + expect(calledSendAsync).to.equal(1) + }) + + it('should call getOnchainWalletConfig', async () => { + let calledSendAsync = 0 + + const results = [ + { + chainId: 2, + result: v2.config.ConfigCoder.fromSimple({ + threshold: 2, + checkpoint: 0, + signers: [ + { weight: 1, address: ethers.Wallet.createRandom().address }, + { weight: 1, address: ethers.Wallet.createRandom().address } + ] + }) + }, + { + chainId: 2, + result: v2.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 10, + signers: [{ weight: 1, address: ethers.Wallet.createRandom().address }] + }) + }, + { + chainId: 5, + result: v1.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [ + { weight: 3, address: ethers.Wallet.createRandom().address }, + { weight: 2, address: ethers.Wallet.createRandom().address }, + { weight: 3, address: ethers.Wallet.createRandom().address } + ] + }) + }, + { + chainId: 6, + result: v1.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ weight: 1, address: ethers.Wallet.createRandom().address }] + }) + } + ] as { chainId: number; result: commons.config.Config }[] + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + const req = results[calledSendAsync] + calledSendAsync++ + expect(request).to.deep.equal({ + method: 'sequence_getWalletConfig', + params: [req?.chainId] + }) + expect(chainId).to.be.equal(req?.chainId) + callback(undefined, { result: req?.result } as any) + } + }, + useBestStore(), + { + defaultChainId: 2 + } + ) + + // NOTICE: sequence_getWalletConfig doesn't require the address, so we don't attempt + // to get the address, thus we don't need to connect to the wallet + // we could add an extra check, but better to avoid client-side access control + // and let the wallet handle it, so we don't have a false sense of security. + + const result1 = await client.getOnchainWalletConfig() + expect(result1).to.deep.equal(results[0].result) + + const result2 = await client.getOnchainWalletConfig({ chainId: 2 }) + expect(result2).to.deep.equal(results[1].result) + + client.setDefaultChainId(5) + + const result3 = await client.getOnchainWalletConfig() + expect(result3).to.deep.equal(results[2].result) + + const result4 = await client.getOnchainWalletConfig({ chainId: 6 }) + expect(result4).to.deep.equal(results[3].result) + }) + + describe('Network changes', async () => { + it('should react to default chainId change', async () => { + const store = useBestStore() + + const client1 = new SequenceClient(basicMockTransport, store, { defaultChainId: 2 }) + const client2 = new SequenceClient(basicMockTransport, store, { defaultChainId: 2 }) + + expect(client1.getChainId()).to.equal(2) + expect(client2.getChainId()).to.equal(2) + + client1.setDefaultChainId(5) + + expect(client1.getChainId()).to.equal(5) + expect(client2.getChainId()).to.equal(5) + }) + + it('should converge after default chainId change (different initial chain ids)', async () => { + const store = useBestStore() + + const client1 = new SequenceClient(basicMockTransport, store, { defaultChainId: 2 }) + const client2 = new SequenceClient(basicMockTransport, store, { defaultChainId: 5 }) + + expect(client1.getChainId()).to.equal(2) + expect(client2.getChainId()).to.equal(5) + + client1.setDefaultChainId(10) + + expect(client1.getChainId()).to.equal(10) + expect(client2.getChainId()).to.equal(10) + }) + + it('should emit an event when default chainId changes', async () => { + const store = useBestStore() + + const client1 = new SequenceClient(basicMockTransport, store, { defaultChainId: 2 }) + const client2 = new SequenceClient(basicMockTransport, store, { defaultChainId: 2 }) + + let called1 = 0 + client1.onDefaultChainIdChanged(chainId => { + called1++ + expect(chainId).to.equal('0xa') + }) + + let called2 = 0 + client2.onDefaultChainIdChanged(chainId => { + called2++ + expect(chainId).to.equal('0xa') + }) + + client1.setDefaultChainId(10) + + expect(called1).to.equal(1) + expect(called2).to.equal(1) + }) + }) + + describe('Default EIP6492', () => { + it('should default to legacy signatures', async () => { + let requests: number = 0 + + const data = { + domain: { + name: 'App1', + version: '1', + chainId: 2, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'age', type: 'uint256' } + ] + }, + message: { + name: 'Alice', + age: '28' + } + } + + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + if (requests === 0) { + expect(request.method).to.equal('personal_sign') + requests++ + callback(undefined, { result: '0x445566' } as any) + } else if (requests === 1) { + expect(request.method).to.equal('eth_signTypedData_v4') + requests++ + callback(undefined, { result: '0x112233' } as any) + } else { + expect.fail('Should not have called sendAsync') + } + }, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + }, + closeWallet: () => {} + }, + useBestStore() + ) + + await client.connect({ app: 'This is a test' }) + + expect(client.defaultEIP6492).to.be.false + + const result1 = await client.signMessage('0x112233') + expect(result1).to.equal('0x445566') + + const result2 = await client.signTypedData(data) + expect(result2).to.equal('0x112233') + }) + + it('should default to EIP6492 signatures', async () => { + let requests: number = 0 + + const data = { + domain: { + name: 'App1', + version: '1', + chainId: 2, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'age', type: 'uint256' } + ] + }, + message: { + name: 'Alice', + age: '28' + } + } + + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + if (requests === 0) { + expect(request.method).to.equal('sequence_sign') + requests++ + callback(undefined, { result: '0x445566' } as any) + } else if (requests === 1) { + expect(request.method).to.equal('sequence_signTypedData_v4') + requests++ + callback(undefined, { result: '0x112233' } as any) + } else { + expect.fail('Should not have called sendAsync') + } + }, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + }, + closeWallet: () => {} + }, + useBestStore(), + { defaultEIP6492: true } + ) + + await client.connect({ app: 'This is a test' }) + + expect(client.defaultEIP6492).to.be.true + + const result1 = await client.signMessage('0x112233') + expect(result1).to.equal('0x445566') + + const result2 = await client.signTypedData(data) + expect(result2).to.equal('0x112233') + }) + + it('should default to legacy when calling send', async () => { + let requests: number = 0 + + const data = { + domain: { + name: 'App1', + version: '1', + chainId: 2, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'age', type: 'uint256' } + ] + }, + message: { + name: 'Alice', + age: '28' + } + } + + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + if (requests === 0) { + expect(request.method).to.equal('personal_sign') + requests++ + callback(undefined, { result: '0x445566' } as any) + } else if (requests === 1) { + expect(request.method).to.equal('eth_signTypedData_v4') + requests++ + callback(undefined, { result: '0x112233' } as any) + } else { + expect.fail('Should not have called sendAsync') + } + }, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + }, + closeWallet: () => {} + }, + useBestStore() + ) + + await client.connect({ app: 'This is a test' }) + + expect(client.defaultEIP6492).to.be.false + + const result1 = await client.send({ method: 'personal_sign', params: ['0x112233'] }) + expect(result1).to.equal('0x445566') + + const result2 = await client.send({ method: 'eth_signTypedData_v4', params: [data] }) + expect(result2).to.equal('0x112233') + }) + + it('should default to EIP6492 when calling send', async () => { + let requests: number = 0 + + const data = { + domain: { + name: 'App1', + version: '1', + chainId: 2, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'age', type: 'uint256' } + ] + }, + message: { + name: 'Alice', + age: '28' + } + } + + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + if (requests === 0) { + expect(request.method).to.equal('sequence_sign') + requests++ + callback(undefined, { result: '0x445566' } as any) + } else if (requests === 1) { + expect(request.method).to.equal('sequence_signTypedData_v4') + requests++ + callback(undefined, { result: '0x112233' } as any) + } else { + expect.fail('Should not have called sendAsync') + } + }, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + }, + closeWallet: () => {} + }, + useBestStore(), + { defaultEIP6492: true } + ) + + await client.connect({ app: 'This is a test' }) + + expect(client.defaultEIP6492).to.be.true + + const result1 = await client.send({ method: 'personal_sign', params: ['0x112233'] }) + expect(result1).to.equal('0x445566') + + const result2 = await client.send({ method: 'eth_signTypedData_v4', params: [data] }) + expect(result2).to.equal('0x112233') + }) + + it('should not override method if default is not set', async () => { + let requests: number = 0 + + const data = { + domain: { + name: 'App1', + version: '1', + chainId: 2, + verifyingContract: ethers.Wallet.createRandom().address + }, + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'age', type: 'uint256' } + ] + }, + message: { + name: 'Alice', + age: '28' + } + } + + const session = { + accountAddress: ethers.Wallet.createRandom().address, + networks: allNetworks, + walletContext: sampleContext + } + + const client = new SequenceClient( + { + ...basicMockTransport, + sendAsync: (request: JsonRpcRequest, callback: JsonRpcResponseCallback, chainId?: number) => { + if (requests === 0) { + expect(request.method).to.equal('sequence_sign') + requests++ + callback(undefined, { result: '0x445566' } as any) + } else if (requests === 1) { + expect(request.method).to.equal('sequence_signTypedData_v4') + requests++ + callback(undefined, { result: '0x112233' } as any) + } else { + expect.fail('Should not have called sendAsync') + } + }, + openWallet: () => { + return Promise.resolve(true) + }, + waitUntilOpened: async () => { + return session + }, + waitUntilConnected: async () => { + return { connected: true, session } + }, + isOpened: () => { + return true + }, + closeWallet: () => {} + }, + useBestStore() + ) + + await client.connect({ app: 'This is a test' }) + + const result1 = await client.send({ method: 'sequence_sign', params: ['0x112233'] }) + expect(result1).to.equal('0x445566') + + const result2 = await client.send({ method: 'sequence_signTypedData_v4', params: [data] }) + expect(result2).to.equal('0x112233') + }) + }) +}) diff --git a/packages/provider/tests/eip191prefix.spec.ts b/packages/provider/tests/eip191prefix.spec.ts new file mode 100644 index 000000000..c8434bd68 --- /dev/null +++ b/packages/provider/tests/eip191prefix.spec.ts @@ -0,0 +1,22 @@ +import chaiAsPromised from 'chai-as-promised' +import * as chai from 'chai' + +import { messageIsExemptFromEIP191Prefix } from '../src/eip191exceptions' +import { dclLogin, message1, zeroExV3Order } from './messages' +const { expect } = chai.use(chaiAsPromised) + +describe('191 prefix exceptions', () => { + it('decentraland is exempt', () => { + expect(messageIsExemptFromEIP191Prefix(dclLogin)).equal(true) + }) + + it('should strip 191 prefix from 0x v3 orders', () => { + expect(messageIsExemptFromEIP191Prefix(zeroExV3Order)).equal(true) + }) + + it('should not strip 191 prefix from other messages', () => { + expect(messageIsExemptFromEIP191Prefix(message1)).equal(false) + expect(messageIsExemptFromEIP191Prefix(zeroExV3Order.slice(0, -10))).equal(false) + expect(messageIsExemptFromEIP191Prefix(dclLogin.slice(0, -10))).equal(false) + }) +}) diff --git a/packages/provider/tests/messages.ts b/packages/provider/tests/messages.ts new file mode 100644 index 000000000..48f17a576 --- /dev/null +++ b/packages/provider/tests/messages.ts @@ -0,0 +1,93 @@ +import { ethers } from 'ethers' +import { prefixEIP191Message } from '../src/utils' + +// Ethereum personal sign: Hello, World! +export const message1 = new Uint8Array([ + 25, 69, 116, 104, 101, 114, 101, 117, 109, 32, 83, 105, 103, 110, 101, 100, 32, 77, 101, 115, 115, 97, 103, 101, 58, 10, 49, 51, + 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33 +]) + +const dclText = `Decentraland Login +Ephemeral address: 0xe1bCF3CAc83534a055f7254C1FD88B21159fCc67 +Expiration: 2022-10-27T16:03:29.191Z` + +export const dclLogin = ethers.utils.toUtf8Bytes(dclText) + +// Ethereum personal sign 0x v3 order +export const zeroExV3Order = new Uint8Array([ + 62, 254, 80, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 153, 144, + 71, 27, 241, 205, 119, 186, 5, 60, 99, 148, 99, 19, 201, 174, 101, 93, 86, 211, 104, 110, 31, 232, 176, 9, 52, 53, 122, 24, 41, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 3, 19, 123, 56, 230, 5, 28, 73, 127, 92, 7, 29, 45, 29, 189, 8, 190, 24, 26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 55, 18, 71, 48, 244, 210, 213, 18, 72, 210, 192, 93, 42, 229, 203, 210, 136, 237, 103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 192, 42, 21, 92, 55, 66, 99, 50, 17, 85, 85, 92, 207, 65, 7, 0, 23, 100, 158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 122, 103, 240, 255, 23, 36, 169, 85, 88, 7, 31, 44, 217, 97, 21, 252, 202, 109, 69, 32, 114, + 145, 27, 10, 160, 236, 62, 181, 81, 143, 220, 202, 36, 172, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 36, 148, 207, 205, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 224, 182, 179, 167, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 244, 114, 97, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 65, 193, 52, 252, 53, 23, 203, 14, 201, 75, 110, 234, 251, 102, 207, 153, 152, 120, 47, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 36, 148, 207, 205, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 224, 182, 179, 167, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 244, 114, 97, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 170, 165, 185, 230, 197, 137, 100, 47, 152, 161, 205, 169, 155, 157, 2, 75, 132, 7, 40, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +]) + +// Messages for testing trim-eip191prefix + +export const trimEIP191Prefix_test1_raw = `1915 Robert Frost +The Road Not Taken + +Two roads diverged in a yellow wood, +And sorry I could not travel both +And be one traveler, long I stood +And looked down one as far as I could +To where it bent in the undergrowth + +Then took the other, as just as fair, +And having perhaps the better claim, +Because it was grassy and wanted wear +Though as for that the passing there +Had worn them really about the same, + +And both that morning equally lay +In leaves no step had trodden black. +Oh, I kept the first for another day! +Yet knowing how way leads on to way, +I doubted if I should ever come back. + +I shall be telling this with a sigh +Somewhere ages and ages hence: +Two roads diverged in a wood, and I— +I took the one less traveled by, +And that has made all the difference. + +\u2601 \u2600 \u2602` +export const trimEIP191Prefix_test2_raw = dclText +export const trimEIP191Prefix_test3_raw = '1915 Robe' // 9 chars +export const trimEIP191Prefix_test4_raw = + '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' // 99 chars +export const trimEIP191Prefix_test5_raw = 'Robe 1915' + +export const trimEIP191Prefix_test1_prefixed = prefixEIP191Message(trimEIP191Prefix_test1_raw) +export const trimEIP191Prefix_test2_prefixed = prefixEIP191Message(dclText) +export const trimEIP191Prefix_test3_prefixed = prefixEIP191Message(trimEIP191Prefix_test3_raw) +export const trimEIP191Prefix_test4_prefixed = prefixEIP191Message(trimEIP191Prefix_test4_raw) +export const trimEIP191Prefix_test5_prefixed = prefixEIP191Message(trimEIP191Prefix_test5_raw) diff --git a/packages/provider/tests/provider.spec.ts b/packages/provider/tests/provider.spec.ts new file mode 100644 index 000000000..2025f6264 --- /dev/null +++ b/packages/provider/tests/provider.spec.ts @@ -0,0 +1,1743 @@ +import { ethers } from 'ethers' +import { + ConnectOptions, + OpenWalletIntent, + OptionalChainId, + SequenceClient, + SequenceProvider, + SingleNetworkSequenceProvider +} from '../src' +import { expect } from 'chai' +import { JsonRpcRequest, JsonRpcResponse, allNetworks } from '@0xsequence/network' +import { ExtendedTransactionRequest } from '../src/extended' + +const hardhat1Provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:9595') +const hardhat2Provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8595') + +const providerFor = (chainId: number) => { + if (chainId === 31337) { + return hardhat1Provider + } + + if (chainId === 31338) { + return hardhat2Provider + } + + throw new Error(`No provider for chainId ${chainId}`) +} + +let defaultChainId: number + +let callback: (chainId: number) => void + +const onDefaultChainIdChanged = (cb: (chainId: number) => void) => { + callback = cb +} + +const setDefaultChainId = (chainId: number) => { + defaultChainId = chainId + callback(chainId) +} + +const basicMockClient = { + getChainId: () => defaultChainId, + onDefaultChainIdChanged, + setDefaultChainId, + // EIP-1193 + onConnect: () => {}, + onDisconnect: () => {}, + onAccountsChanged: () => {} +} as unknown as SequenceClient + +async function waitUntilNoFail(provider: ethers.providers.Provider, timeout = 20000): Promise { + const start = Date.now() + while (Date.now() - start < timeout) { + try { + await provider.getBlockNumber() + return + } catch (e) { + await new Promise(resolve => setTimeout(resolve, 100)) + } + } + console.warn('waitUntilNoFail timed out') +} + +describe('SequenceProvider', () => { + before(async () => { + // Wait for both providers to be ready + await Promise.all([waitUntilNoFail(hardhat1Provider), waitUntilNoFail(hardhat2Provider)]) + }) + + beforeEach(() => { + defaultChainId = 31337 + }) + + describe('client proxy methods', () => { + it('should call connect', async () => { + let callsToConnect = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + connect: async (transport: ConnectOptions) => { + expect(transport).to.deep.equal({ app: 'test' }) + callsToConnect++ + return { connected: true } + } + } as unknown as SequenceClient, + providerFor + ) + + const res = await provider.connect({ app: 'test' }) + expect(res).to.deep.equal({ connected: true }) + expect(callsToConnect).to.equal(1) + }) + + it('should call disconnect', async () => { + let callsToDisconnect = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + disconnect: async () => { + callsToDisconnect++ + } + } as unknown as SequenceClient, + providerFor + ) + + await provider.disconnect() + expect(callsToDisconnect).to.equal(1) + }) + + it('should call isConnected', async () => { + let callsToIsConnected = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + isConnected: () => { + callsToIsConnected++ + return true + } + } as unknown as SequenceClient, + providerFor + ) + + const res = provider.isConnected() + expect(res).to.equal(true) + expect(callsToIsConnected).to.equal(1) + }) + + it('should call getSession', async () => { + let callsToGetSession = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + getSession: () => { + callsToGetSession++ + return { session: 'test' } + } + } as unknown as SequenceClient, + providerFor + ) + + const res = provider.getSession() + expect(res).to.deep.equal({ session: 'test' }) + expect(callsToGetSession).to.equal(1) + }) + + it('should call getAddress', async () => { + let callsToGetAddress = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + getAddress: () => { + callsToGetAddress++ + return '0x123' + } + } as unknown as SequenceClient, + providerFor + ) + + const res = provider.getAddress() + expect(res).to.equal('0x123') + expect(callsToGetAddress).to.equal(1) + }) + + it('should call getNetworks', async () => { + let callsToGetNetworks = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + getNetworks: async () => { + callsToGetNetworks++ + return [{ chainId: 31337 }, { chainId: 31338 }] + } + } as unknown as SequenceClient, + providerFor + ) + + const res = await provider.getNetworks() + expect(res).to.deep.equal([{ chainId: 31337 }, { chainId: 31338 }]) + expect(callsToGetNetworks).to.equal(1) + }) + + it('should call getChainId', async () => { + let callsToGetChainId = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + getChainId: () => { + callsToGetChainId++ + return 31337 + } + } as unknown as SequenceClient, + providerFor + ) + + const res = provider.getChainId() + expect(res).to.equal(31337) + + // This method is also called by the constructor + expect(callsToGetChainId).to.equal(2) + }) + + it('should call setDefaultChainId', async () => { + let callsToSetDefaultChainId = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + setDefaultChainId: (chainId: number) => { + callsToSetDefaultChainId++ + expect(chainId).to.equal(31338) + } + } as unknown as SequenceClient, + providerFor + ) + + provider.setDefaultChainId(31338) + expect(callsToSetDefaultChainId).to.equal(1) + }) + + it('should call isOpened', async () => { + let callsToIsOpened = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + isOpened: () => { + callsToIsOpened++ + return true + } + } as unknown as SequenceClient, + providerFor + ) + + const res = provider.isOpened() + expect(res).to.equal(true) + expect(callsToIsOpened).to.equal(1) + }) + + it('should call closeWallet', async () => { + let callsToCloseWallet = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + closeWallet: async () => { + callsToCloseWallet++ + } + } as unknown as SequenceClient, + providerFor + ) + + provider.closeWallet() + expect(callsToCloseWallet).to.equal(1) + }) + + it('should call getWalletContext', async () => { + let callsToGetWalletContext = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + getWalletContext: async () => { + callsToGetWalletContext++ + return { walletContext: 'test' } + } + } as unknown as SequenceClient, + providerFor + ) + + const res = await provider.getWalletContext() + expect(res).to.deep.equal({ walletContext: 'test' }) + expect(callsToGetWalletContext).to.equal(1) + }) + + it('should call getWalletConfig', async () => { + let callsToGetWalletConfig = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + getOnchainWalletConfig: async (options?: OptionalChainId) => { + expect(options).to.deep.equal({ chainId: 31338 }) + callsToGetWalletConfig++ + return { walletConfig: 'test' } + } + } as unknown as SequenceClient, + providerFor + ) + + const res = await provider.getWalletConfig('hardhat2') + expect(res).to.deep.equal({ walletConfig: 'test' }) + expect(callsToGetWalletConfig).to.equal(1) + }) + + it('should call connect + authorize', async () => { + let callsToConnect = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + connect: async (transport: ConnectOptions) => { + expect(transport).to.deep.equal({ app: 'test', authorize: true }) + callsToConnect++ + return { connected: true } + } + } as unknown as SequenceClient, + providerFor + ) + + const res = await provider.authorize({ app: 'test' }) + expect(res).to.deep.equal({ connected: true }) + expect(callsToConnect).to.equal(1) + }) + + it('should call openWallet', async () => { + let callsToOpenWallet = 0 + + const provider = new SequenceProvider( + { + ...basicMockClient, + openWallet: (path: string, intent: OpenWalletIntent) => { + expect(path).to.equal('/test') + expect(intent).to.deep.equal({ type: 'connect' }) + callsToOpenWallet++ + } + } as unknown as SequenceClient, + providerFor + ) + + await provider.openWallet('/test', { type: 'connect' }) + expect(callsToOpenWallet).to.equal(1) + }) + }) + + describe('provider events', () => { + let provider: SequenceProvider + + const callbacks: { [event: string]: (data: any) => void } = {} + + beforeEach(() => { + const usecb = (name: string, cb: (data: any) => any) => { + callbacks[name] = cb + return () => {} + } + + provider = new SequenceProvider( + { + ...basicMockClient, + onConnect: (c: any) => usecb('connect', c), + onDisconnect: (c: any) => usecb('disconnect', c), + onDefaultChainIdChanged: (c: any) => usecb('chainChanged', c), + onAccountsChanged: (c: any) => usecb('accountsChanged', c) + } as unknown as SequenceClient, + providerFor + ) + }) + + it('should call onConnect', async () => { + let callsToOnConnect = 0 + + provider.on('connect', (data: any) => { + callsToOnConnect++ + expect(data).to.deep.equal({ + connected: true, + chainId: '0x112233' + }) + }) + + callbacks['connect']({ + connected: true, + chainId: '0x112233' + }) + + await new Promise(resolve => setTimeout(resolve, 100)) + expect(callsToOnConnect).to.equal(1) + }) + + it('should call onDisconnect', async () => { + let callsToOnDisconnect = 0 + + provider.on('disconnect', (data: any) => { + callsToOnDisconnect++ + expect(data).to.deep.equal({ + connected: false, + error: 1000 + }) + }) + + callbacks['disconnect']({ + connected: false, + error: 1000 + }) + + await new Promise(resolve => setTimeout(resolve, 100)) + expect(callsToOnDisconnect).to.equal(1) + }) + + it('should call onDefaultChainIdChanged', async () => { + let callsToOnDefaultChainIdChanged = 0 + + provider.on('chainChanged', (data: any) => { + callsToOnDefaultChainIdChanged++ + expect(data).to.equal(31338) + }) + + callbacks['chainChanged'](31338) + + await new Promise(resolve => setTimeout(resolve, 100)) + expect(callsToOnDefaultChainIdChanged).to.equal(1) + }) + + it('should call onAccountsChanged', async () => { + let callsToOnAccountsChanged = 0 + + provider.on('accountsChanged', (data: any) => { + callsToOnAccountsChanged++ + expect(data).to.deep.equal(['0x123']) + }) + + callbacks['accountsChanged'](['0x123']) + + await new Promise(resolve => setTimeout(resolve, 100)) + expect(callsToOnAccountsChanged).to.equal(1) + }) + }) + + // This converts from "any kind" of chainId to a number + describe('toChainId', () => { + let provider: SequenceProvider + + const defaultChainId: number = 31337 + + beforeEach(() => { + provider = new SequenceProvider( + { + ...basicMockClient, + onDefaultChainIdChanged, + getChainId: () => defaultChainId + } as unknown as SequenceClient, + providerFor + ) + }) + + it('should work for numbers', () => { + expect(provider.toChainId(1)).to.equal(1) + expect(provider.toChainId(31337)).to.equal(31337) + expect(provider.toChainId(31338)).to.equal(31338) + }) + + it('should fail if network is not supported', () => { + expect(() => provider.toChainId(99999)).to.throw('Unsupported network 99999') + }) + + it('should work for number strings', () => { + expect(provider.toChainId('1')).to.equal(1) + expect(provider.toChainId('31337')).to.equal(31337) + expect(provider.toChainId('31338')).to.equal(31338) + }) + + it('should work for hex strings', () => { + expect(provider.toChainId('0x1')).to.equal(1) + expect(provider.toChainId('0x7a69')).to.equal(31337) + expect(provider.toChainId('0x7a6a')).to.equal(31338) + }) + + it('should fail if network is not supported - number string', () => { + expect(() => provider.toChainId('99999')).to.throw('Unsupported network 99999') + }) + + it('should fail if network is not supported - hex string', () => { + expect(() => provider.toChainId('0x99999')).to.throw('Unsupported network 0x99999') + }) + + it('should work for network names', () => { + expect(provider.toChainId('mainnet')).to.equal(1) + expect(provider.toChainId('rinkeby')).to.equal(4) + expect(provider.toChainId('goerli')).to.equal(5) + expect(provider.toChainId('polygon')).to.equal(137) + expect(provider.toChainId('mumbai')).to.equal(80001) + expect(provider.toChainId('polygon-zkevm')).to.equal(1101) + expect(provider.toChainId('bsc')).to.equal(56) + expect(provider.toChainId('bsc-testnet')).to.equal(97) + expect(provider.toChainId('optimism')).to.equal(10) + expect(provider.toChainId('arbitrum')).to.equal(42161) + expect(provider.toChainId('arbitrum-sepolia')).to.equal(421614) + expect(provider.toChainId('arbitrum-nova')).to.equal(42170) + expect(provider.toChainId('avalanche')).to.equal(43114) + }) + + it('should fail if network is not supported - network name', () => { + expect(() => provider.toChainId('notreallyachain')).to.throw('Unsupported network notreallyachain') + }) + + it('should work when passing a full network config', () => { + expect(provider.toChainId(allNetworks.find(n => n.chainId === 1))).to.equal(1) + expect(provider.toChainId(allNetworks.find(n => n.chainId === 31337))).to.equal(31337) + }) + + it('should fail if the passed network config doesnt exist on the provider', () => { + const fakeNetwork = { chainId: 99999, name: 'fake', rpcUrl: 'http://127.0.0.1:99999' } + expect(() => provider.toChainId(fakeNetwork)).to.throw(`Unsupported network ${fakeNetwork}`) + }) + + it('should work when passing a BigNumber', () => { + expect(provider.toChainId(ethers.BigNumber.from(1))).to.equal(1) + expect(provider.toChainId(ethers.BigNumber.from(31337))).to.equal(31337) + expect(provider.toChainId(ethers.BigNumber.from(31338))).to.equal(31338) + }) + + it('should fail if network is not supported - BigNumber', () => { + expect(() => provider.toChainId(ethers.BigNumber.from(99999))).to.throw( + `Unsupported network ${ethers.BigNumber.from(99999)}` + ) + }) + + it('should return undefined if passed undefined', () => { + expect(provider.toChainId(undefined)).to.equal(undefined) + }) + }) + + describe('getProvider (single network)', () => { + let provider: SequenceProvider + + beforeEach(() => { + provider = new SequenceProvider(basicMockClient, providerFor) + }) + + it('should return self if asked for no specific chain', () => { + expect(provider.getProvider()).to.equal(provider) + }) + + it('should not return self if asked for the current default chain', () => { + expect(provider.getProvider(provider.getChainId())).to.not.equal(provider) + }) + + it('should return specific provider if asked for a specific chain', () => { + expect(provider.getProvider(31337).getChainId()).to.equal(31337) + expect(provider.getProvider(31338).getChainId()).to.equal(31338) + }) + + it('specific provider should not be parent provider', () => { + expect(provider.getProvider(31337)).to.not.equal(provider) + }) + + it('should return same provider if asked for specific chain twice', () => { + const provider1 = provider.getProvider(31337) + const provider2 = provider.getProvider(31337) + expect(provider1).to.equal(provider2) + + const provider3 = provider.getProvider(31338) + const provider4 = provider.getProvider(31338) + expect(provider3).to.equal(provider4) + + expect(provider1).to.not.equal(provider3) + }) + + it('should fail to return provider for different chain from a specific provider', () => { + const provider1 = provider.getProvider(31337) + expect(() => provider1.getProvider(31338)).to.throw( + 'This provider only supports the network 31337, but 31338 was requested.' + ) + + const provider2 = provider.getProvider(31338) + expect(() => provider2.getProvider(31337)).to.throw( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + + it('specific provider should return self if asked for no specific chain', () => { + const provider1 = provider.getProvider(31337) + expect(provider1.getProvider()).to.equal(provider1) + expect(provider1).to.not.equal(provider) + expect(provider1.getProvider()).to.not.equal(provider) + }) + + it('specific provider should return self if asked for the provider of its own chain', () => { + const provider1 = provider.getProvider(31338) + expect(provider1.getProvider(31338)).to.equal(provider1) + }) + + it('should return isSingleNetworkSequenceProvider', async () => { + const main = provider.getProvider() + const single = provider.getProvider(31337) + + expect(SequenceProvider.is(main)).to.equal(true) + expect(SequenceProvider.is(single)).to.equal(true) + expect(SingleNetworkSequenceProvider.is(main)).to.equal(false) + expect(SingleNetworkSequenceProvider.is(single)).to.equal(true) + }) + }) + + describe('getSigner (single network)', () => { + let provider: SequenceProvider + + beforeEach(() => { + provider = new SequenceProvider(basicMockClient, providerFor) + }) + + it('should get signer for default chain', async () => { + const signer = provider.getSigner() + expect(await signer.getChainId()).to.equal(31337) + }) + + it('should not get same signer for default and specific chain', async () => { + const signer1 = provider.getSigner() + const signer2 = provider.getSigner(31337) + expect(signer1).to.not.equal(signer2) + }) + + it('should get signer for specific chain', async () => { + const signer = provider.getSigner(31338) + expect(await signer.getChainId()).to.equal(31338) + }) + + it('should get signer for specific chain from specific provider', async () => { + const signer = provider.getProvider(31338).getSigner() + expect(await signer.getChainId()).to.equal(31338) + }) + + it('should get signer for specific chain from specific provider (using chainid(', async () => { + const signer = provider.getProvider(31338).getSigner(31338) + expect(await signer.getChainId()).to.equal(31338) + }) + + it('should fail to get signer for different chain from a specific provider', async () => { + expect(() => provider.getProvider(31338).getSigner(31337)).to.throw( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('subproviders (public rpc methods)', () => { + let provider: SequenceProvider + + beforeEach(() => { + provider = new SequenceProvider(basicMockClient, providerFor) + }) + + it('should return hardhat1 subprovider for chain 31337', async () => { + expect(await provider._getSubprovider('hardhat')).to.equal(hardhat1Provider) + }) + + it('should return hardhat2 subprovider for chain 31338', async () => { + expect(await provider._getSubprovider('hardhat2')).to.equal(hardhat2Provider) + }) + + it('should fail to return subprovider if providerFor doesnt return a provider', async () => { + await expect(provider._getSubprovider(1)).to.be.rejectedWith('No provider for chainId 1') + }) + + it('should return hardhat1 subprovider for default chain', async () => { + expect(await provider._getSubprovider()).to.equal(hardhat1Provider) + }) + + it('should return hardat2 if default chain is changed', async () => { + provider.setDefaultChainId(31338) + expect(await provider._getSubprovider()).to.equal(hardhat2Provider) + }) + + describe('forward methods to subprovider', () => { + const testAccounts = [ + new ethers.Wallet('0xcd0434442164a4a6ef9bb677da8dc326fddf412cad4df65e1a3f2555aee5e2b3').connect(hardhat1Provider), + new ethers.Wallet('0xcd0434442164a4a6ef9bb677da8dc326fddf412cad4df65e1a3f2555aee5e2b3').connect(hardhat2Provider) + ] + + describe('forward getBlockNumber', () => { + let bn1: number + let bn2: number + + beforeEach(async () => { + bn1 = await hardhat1Provider.getBlockNumber() + bn2 = await hardhat2Provider.getBlockNumber() + + if (bn1 === bn2) { + await hardhat2Provider.send('evm_mine', []) + bn2 = await hardhat2Provider.getBlockNumber() + } + + expect(bn1).to.not.equal(bn2) + }) + + it('forward getBlockNumber - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getBlockNumber()).to.equal(bn1, 'default chain') + + provider.setDefaultChainId(31338) + expect(await provider.getBlockNumber()).to.equal(bn2, 'new default chain') + }) + + it('forward getBlockNumber - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getBlockNumber({ chainId: 31337 })).to.equal(bn1) + expect(await provider.getBlockNumber({ chainId: 31338 })).to.equal(bn2) + }) + + it('forward getBlockNumber - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').getBlockNumber()).to.equal(bn1) + expect(await provider.getProvider('hardhat2').getBlockNumber()).to.equal(bn2) + }) + + it('fail to forward getBlockNumber - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect(provider.getProvider('hardhat2').getBlockNumber({ chainId: 31337 })).to.be.rejectedWith( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('forward getGasPrice', () => { + let provider: SequenceProvider + + beforeEach(() => { + // NOTICE: We need to path the hardhat providers so they return different gas prices + provider = new SequenceProvider(basicMockClient, (chainId: number) => { + if (chainId === 31337) { + return { + ...hardhat1Provider, + getGasPrice: async () => ethers.BigNumber.from(1) + } as unknown as ethers.providers.JsonRpcProvider + } + + if (chainId === 31338) { + return { + ...hardhat2Provider, + getGasPrice: async () => ethers.BigNumber.from(2) + } as unknown as ethers.providers.JsonRpcProvider + } + + throw new Error(`No provider for chainId ${chainId}`) + }) + }) + + it('forward getGasPrice - default', async () => { + expect(await provider.getGasPrice()).to.deep.equal(ethers.BigNumber.from(1)) + + provider.setDefaultChainId(31338) + expect(await provider.getGasPrice()).to.deep.equal(ethers.BigNumber.from(2)) + }) + + it('forward getGasPrice - specific chain', async () => { + expect(await provider.getGasPrice({ chainId: 31337 })).to.deep.equal(ethers.BigNumber.from(1)) + expect(await provider.getGasPrice({ chainId: 31338 })).to.deep.equal(ethers.BigNumber.from(2)) + }) + + it('forward getGasPrice - static network provider', async () => { + expect(await provider.getProvider('hardhat').getGasPrice()).to.deep.equal(ethers.BigNumber.from(1)) + expect(await provider.getProvider(31338).getGasPrice()).to.deep.equal(ethers.BigNumber.from(2)) + }) + + it('fail to forward getGasPrice - static network provider for different chain', async () => { + await expect(provider.getProvider('hardhat').getGasPrice({ chainId: 31338 })).to.be.rejectedWith( + 'This provider only supports the network 31337, but 31338 was requested.' + ) + }) + }) + + describe('forward getBalance', () => { + let b1: ethers.BigNumber + let b2: ethers.BigNumber + + beforeEach(async () => { + b1 = await hardhat1Provider.getBalance(testAccounts[0].address) + b2 = await hardhat2Provider.getBalance(testAccounts[1].address) + + if (b1.eq(b2)) { + await testAccounts[1].sendTransaction({ + to: ethers.Wallet.createRandom().address, + value: 1 + }) + + b2 = await hardhat2Provider.getBalance(testAccounts[1].address) + } + + expect(b1).to.not.deep.equal(b2) + }) + + it('forward getBalance - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getBalance(testAccounts[0].address)).to.deep.equal(b1) + + provider.setDefaultChainId(31338) + expect(await provider.getBalance(testAccounts[1].address)).to.deep.equal(b2) + }) + + it('forward getBalance - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getBalance(testAccounts[0].address, undefined, { chainId: 31337 })).to.deep.equal(b1) + expect(await provider.getBalance(testAccounts[1].address, undefined, { chainId: 31338 })).to.deep.equal(b2) + }) + + it('forward getBalance - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').getBalance(testAccounts[0].address)).to.deep.equal(b1) + expect(await provider.getProvider('hardhat2').getBalance(testAccounts[1].address)).to.deep.equal(b2) + }) + + it('fail to forward getBalance - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect( + provider.getProvider('hardhat2').getBalance(testAccounts[0].address, undefined, { chainId: 31337 }) + ).to.be.rejectedWith('This provider only supports the network 31338, but 31337 was requested.') + }) + }) + + describe('forward getTransactionCount', () => { + let txc1: number + let txc2: number + + beforeEach(async () => { + txc1 = await hardhat1Provider.getTransactionCount(testAccounts[0].address) + txc2 = await hardhat2Provider.getTransactionCount(testAccounts[1].address) + + if (txc1 === txc2) { + await testAccounts[1].sendTransaction({ + to: testAccounts[0].address + }) + + txc2 = await hardhat2Provider.getTransactionCount(testAccounts[1].address) + } + + expect(txc1).to.not.equal(txc2) + }) + + it('forward getTransactionCount - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getTransactionCount(testAccounts[0].address)).to.equal(txc1) + + provider.setDefaultChainId(31338) + expect(await provider.getTransactionCount(testAccounts[1].address)).to.equal(txc2) + }) + + it('forward getTransactionCount - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getTransactionCount(testAccounts[0].address, undefined, { chainId: 31337 })).to.equal(txc1) + expect(await provider.getTransactionCount(testAccounts[1].address, undefined, { chainId: 31338 })).to.equal(txc2) + }) + + it('forward getTransactionCount - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').getTransactionCount(testAccounts[0].address)).to.equal(txc1) + expect(await provider.getProvider('hardhat2').getTransactionCount(testAccounts[1].address)).to.equal(txc2) + }) + + it('fail to forward getTransactionCount - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect( + provider.getProvider('hardhat2').getTransactionCount(testAccounts[0].address, undefined, { chainId: 31337 }) + ).to.be.rejectedWith('This provider only supports the network 31338, but 31337 was requested.') + }) + }) + + describe('forward getCode', () => { + let addr: string + + beforeEach(async () => { + // deploy a "contract" with code 0x112233 + const res = await testAccounts[0] + .sendTransaction({ + data: '0x621122336000526003601df3' + }) + .then(r => r.wait()) + + addr = res.contractAddress + + expect(await hardhat1Provider.getCode(addr)).to.equal('0x112233') + expect(await hardhat2Provider.getCode(addr)).to.equal('0x') + }) + + it('forward getCode - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getCode(addr)).to.equal('0x112233') + + provider.setDefaultChainId(31338) + expect(await provider.getCode(addr)).to.equal('0x') + }) + + it('forward getCode - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getCode(addr, undefined, { chainId: 31337 })).to.equal('0x112233') + expect(await provider.getCode(addr, undefined, { chainId: 31338 })).to.equal('0x') + }) + + it('forward getCode - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').getCode(addr)).to.equal('0x112233') + expect(await provider.getProvider('hardhat2').getCode(addr)).to.equal('0x') + }) + + it('fail to forward getCode - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect(provider.getProvider('hardhat2').getCode(addr, undefined, { chainId: 31337 })).to.be.rejectedWith( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('forward getStorageAt', () => { + const expected = '0x0000000000000000000000000000000000000000000000000000000000112233' + const empty = '0x0000000000000000000000000000000000000000000000000000000000000000' + + let addr: string + + beforeEach(async () => { + // deploy a "contract" that writes 0x112233 to storage slot 0x445566 + const res = await testAccounts[0] + .sendTransaction({ + data: '0x621122336244556655' + }) + .then(r => r.wait()) + + addr = res.contractAddress + + expect(await hardhat1Provider.getStorageAt(addr, '0x445566')).to.equal(expected) + expect(await hardhat2Provider.getStorageAt(addr, '0x445566')).to.equal(empty) + }) + + it('forward getStorageAt - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getStorageAt(addr, '0x445566')).to.equal(expected) + + provider.setDefaultChainId(31338) + expect(await provider.getStorageAt(addr, '0x445566')).to.equal(empty) + }) + + it('forward getStorageAt - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getStorageAt(addr, '0x445566', undefined, { chainId: 31337 })).to.equal(expected) + expect(await provider.getStorageAt(addr, '0x445566', undefined, { chainId: 31338 })).to.equal(empty) + }) + + it('forward getStorageAt - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').getStorageAt(addr, '0x445566')).to.equal(expected) + expect(await provider.getProvider('hardhat2').getStorageAt(addr, '0x445566')).to.equal(empty) + }) + + it('fail to forward getStorageAt - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect( + provider.getProvider('hardhat2').getStorageAt(addr, '0x445566', undefined, { chainId: 31337 }) + ).to.be.rejectedWith('This provider only supports the network 31338, but 31337 was requested.') + }) + }) + + describe('forward call', () => { + let addr: string + + beforeEach(async () => { + // deploy a "contract" that when called returns 0x112233 + const res = await testAccounts[0] + .sendTransaction({ + data: '0x6b621122336000526003601df3600052600c6014f3' + }) + .then(r => r.wait()) + + addr = res.contractAddress + + expect(await hardhat1Provider.call({ to: addr })).to.equal('0x112233') + expect(await hardhat2Provider.call({ to: addr })).to.equal('0x') + }) + + it('forward call - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.call({ to: addr })).to.equal('0x112233') + + provider.setDefaultChainId(31338) + expect(await provider.call({ to: addr })).to.equal('0x') + }) + + it('forward call - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.call({ to: addr }, undefined, { chainId: 31337 })).to.equal('0x112233') + expect(await provider.call({ to: addr }, undefined, { chainId: 31338 })).to.equal('0x') + }) + + it('forward call - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').call({ to: addr })).to.equal('0x112233') + expect(await provider.getProvider('hardhat2').call({ to: addr })).to.equal('0x') + }) + + it('fail to forward call - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect(provider.getProvider('hardhat2').call({ to: addr }, undefined, { chainId: 31337 })).to.be.rejectedWith( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('forward estimateGas', () => { + let eg1: ethers.BigNumber + let eg2: ethers.BigNumber + + let addr: string + + beforeEach(async () => { + // deploy a "contract" that when called returns 0x112233 + // (this uses a bit of gas that we can measure) + const res = await testAccounts[0] + .sendTransaction({ + data: '0x6b621122336000526003601df3600052600c6014f3' + }) + .then(r => r.wait()) + + addr = res.contractAddress + + eg1 = await hardhat1Provider.estimateGas({ to: addr }) + eg2 = await hardhat2Provider.estimateGas({ to: addr }) + + expect(eg1).to.not.deep.equal(eg2) + }) + + it('forward estimateGas - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.estimateGas({ to: addr })).to.deep.equal(eg1) + + provider.setDefaultChainId(31338) + expect(await provider.estimateGas({ to: addr })).to.deep.equal(eg2) + }) + + it('forward estimateGas - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.estimateGas({ to: addr }, { chainId: 31337 })).to.deep.equal(eg1) + expect(await provider.estimateGas({ to: addr }, { chainId: 31338 })).to.deep.equal(eg2) + }) + + it('forward estimateGas - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').estimateGas({ to: addr })).to.deep.equal(eg1) + expect(await provider.getProvider('hardhat2').estimateGas({ to: addr })).to.deep.equal(eg2) + }) + + it('fail to forward estimateGas - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect(provider.getProvider('hardhat2').estimateGas({ to: addr }, { chainId: 31337 })).to.be.rejectedWith( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('forward getBlock', () => { + let b1: ethers.providers.Block + let b2: ethers.providers.Block + + beforeEach(async () => { + b1 = await hardhat1Provider.getBlock(1) + b2 = await hardhat2Provider.getBlock(1) + + expect(b1).to.not.deep.equal(b2) + }) + + it('forward getBlock - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getBlock(1)).to.deep.equal(b1) + + provider.setDefaultChainId(31338) + expect(await provider.getBlock(1)).to.deep.equal(b2) + }) + + it('forward getBlock - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getBlock(1, { chainId: 31337 })).to.deep.equal(b1) + expect(await provider.getBlock(1, { chainId: 31338 })).to.deep.equal(b2) + }) + + it('forward getBlock - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').getBlock(1)).to.deep.equal(b1) + expect(await provider.getProvider('hardhat2').getBlock(1)).to.deep.equal(b2) + }) + + it('fail to forward getBlock - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect(provider.getProvider('hardhat2').getBlock(0, { chainId: 31337 })).to.be.rejectedWith( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('forward getTransaction', () => { + let t1: string + + beforeEach(async () => { + // We can't create a transaction that exists on both chains + const res = await testAccounts[0].sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + t1 = res.hash + await res.wait() + }) + + it('forward getTransaction - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getTransaction(t1).then(r => r.hash)).to.equal(t1) + + provider.setDefaultChainId(31338) + expect(await provider.getTransaction(t1)).to.be.null + }) + + it('forward getTransaction - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getTransaction(t1, { chainId: 31337 }).then(r => r.hash)).to.equal(t1) + expect(await provider.getTransaction(t1, { chainId: 31338 })).to.be.null + }) + + it('forward getTransaction - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect( + await provider + .getProvider('hardhat') + .getTransaction(t1) + .then(r => r.hash) + ).to.equal(t1) + expect(await provider.getProvider('hardhat2').getTransaction(t1)).to.be.null + }) + + it('fail to forward getTransaction - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect(provider.getProvider('hardhat2').getTransaction(t1, { chainId: 31337 })).to.be.rejectedWith( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('forward getLogs', () => { + let t1: string + + let r1: Array + let r2: Array + + beforeEach(async () => { + // Deploy a contract that emits a single LOG0 event (during deployment) + const res = await testAccounts[0] + .sendTransaction({ + data: '0x60006000a0' + }) + .then(r => r.wait()) + + t1 = res.contractAddress + + r1 = await hardhat1Provider.getLogs({ address: t1 }) + r2 = await hardhat2Provider.getLogs({ address: t1 }) + + expect(r1).to.not.deep.equal(r2) + }) + + it('forward getLogs - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getLogs({ address: t1 })).to.deep.equal(r1) + + provider.setDefaultChainId(31338) + expect(await provider.getLogs({ address: t1 })).to.deep.equal(r2) + }) + + it('forward getLogs - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getLogs({ address: t1 }, { chainId: 31337 })).to.deep.equal(r1) + expect(await provider.getLogs({ address: t1 }, { chainId: 31338 })).to.deep.equal(r2) + }) + + it('forward getLogs - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider('hardhat').getLogs({ address: t1 })).to.deep.equal(r1) + expect(await provider.getProvider('hardhat2').getLogs({ address: t1 })).to.deep.equal(r2) + }) + + it('fail to forward getLogs - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect(provider.getProvider('hardhat2').getLogs({ address: t1 }, { chainId: 31337 })).to.be.rejectedWith( + 'This provider only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('forward waitForTransaction', () => { + let t1: string + + beforeEach(async () => { + t1 = await testAccounts[0] + .sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + .then(r => r.hash) + }) + + it('forward waitForTransaction - default', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.waitForTransaction(t1, undefined, 250).then(r => r.transactionHash)).to.equal(t1) + + provider.setDefaultChainId(31338) + await expect(provider.waitForTransaction(t1, undefined, 250)).to.be.rejected + }) + + it('forward waitForTransaction - specific chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.waitForTransaction(t1, undefined, 250, { chainId: 31337 }).then(r => r.transactionHash)).to.equal( + t1 + ) + await expect(provider.waitForTransaction(t1, undefined, 250, { chainId: 31338 })).to.be.rejected + }) + + it('forward waitForTransaction - static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect( + await provider + .getProvider('hardhat') + .waitForTransaction(t1, undefined, 250) + .then(r => r.transactionHash) + ).to.equal(t1) + await expect(provider.getProvider('hardhat2').waitForTransaction(t1, undefined, 250)).to.be.rejected + }) + + it('fail to forward waitForTransaction - static network provider for different chain', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect( + provider.getProvider('hardhat2').waitForTransaction(t1, undefined, 250, { chainId: 31337 }) + ).to.be.rejectedWith('This provider only supports the network 31338, but 31337 was requested.') + }) + }) + + // NOTICE: These tests may be a bit fragile, as they rely + // on using the sequence mainnet provider + describe('forward ENS methods', () => { + let provider: SequenceProvider + let mainnetProvider: ethers.providers.JsonRpcProvider + + let vitalikAddr: string | null + + before(async () => { + mainnetProvider = new ethers.providers.JsonRpcProvider('https://nodes.sequence.app/mainnet') + vitalikAddr = await mainnetProvider.resolveName('vitalik.eth') + }) + + beforeEach(() => { + provider = new SequenceProvider( + { + ...basicMockClient, + getNetworks: async () => allNetworks + } as unknown as SequenceClient, + (chainId: number) => { + if (chainId === 1) { + return mainnetProvider + } + + return providerFor(chainId) + } + ) + }) + + it('resolve normal address', async () => { + const addr = ethers.Wallet.createRandom().address + expect(await provider.resolveName(addr)).to.equal(addr) + }) + + it('forward resolveName on primary provider', async () => { + expect(await provider.resolveName('vitalik.eth')).to.equal(vitalikAddr) + }) + + it('forward resolveName on single network (mainnet) provider', async () => { + expect(await provider.getProvider('mainnet').resolveName('vitalik.eth')).to.equal(vitalikAddr) + }) + + it('fail to forward resolveName on single network (hardhat) provider', async () => { + await expect(provider.getProvider('hardhat').resolveName('vitalik.eth')).to.be.rejectedWith( + 'This provider only supports the network 31337, but 1 was requested.' + ) + }) + }) + }) + + describe('perform implementation', () => { + describe('perform eth_chainId', async () => { + it('should return initial default chainId', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + }) + + it('should return new default chainId', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + provider.setDefaultChainId(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should return static chainId', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.getProvider(31337).perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + expect(await provider.getProvider(31338).perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should return chainId using request', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.request({ method: 'eth_chainId' })).to.equal(ethers.utils.hexValue(31337)) + }) + }) + + describe('perform eth_accounts', async () => { + let provider: SequenceProvider + let address: string + + beforeEach(async () => { + address = ethers.Wallet.createRandom().address + provider = new SequenceProvider( + { + ...basicMockClient, + getAddress: () => address + } as unknown as SequenceClient, + providerFor + ) + }) + + it('should return accounts on main provider', async () => { + expect(await provider.perform('eth_accounts', [])).to.deep.equal([address]) + }) + + it('should return accounts on single network provider', async () => { + expect(await provider.getProvider(31337).perform('eth_accounts', [])).to.deep.equal([address]) + expect(await provider.getProvider(31338).perform('eth_accounts', [])).to.deep.equal([address]) + }) + + it('should return accounts using request', async () => { + expect(await provider.request({ method: 'eth_accounts' })).to.deep.equal([address]) + }) + }) + + describe('perform wallet_switchEthereumChain', async () => { + it('should switch default chainId using request', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.request({ method: 'eth_chainId' })).to.equal(ethers.utils.hexValue(31337)) + + await provider.request({ method: 'wallet_switchEthereumChain', params: [{ chainId: '0x7a6a' }] }) + expect(defaultChainId).to.equal(31338) + }) + + it('should switch default chainId using object', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + + await provider.perform('wallet_switchEthereumChain', [{ chainId: '0x7a6a' }]) + expect(defaultChainId).to.equal(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should switch default chainId using hex string', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + + await provider.perform('wallet_switchEthereumChain', ['0x7a6a']) + expect(defaultChainId).to.equal(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should switch default chainId using number', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + + await provider.perform('wallet_switchEthereumChain', [31338]) + expect(defaultChainId).to.equal(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should switch default chainId using string', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + + await provider.perform('wallet_switchEthereumChain', ['31338']) + expect(defaultChainId).to.equal(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should fail to switch default chainId on static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + await expect(provider.getProvider(31337).perform('wallet_switchEthereumChain', ['31337'])).to.be.rejectedWith( + 'This provider only supports the network 31337; use the parent provider to switch networks.' + ) + }) + + describe('using the setDefaultChainId method', async () => { + it('should switch default chainId using name', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + + provider.setDefaultChainId('hardhat2') + expect(defaultChainId).to.equal(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should switch default chainId using number', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + + provider.setDefaultChainId(31338) + expect(defaultChainId).to.equal(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should switch default chainId using string', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + + provider.setDefaultChainId('31338') + expect(defaultChainId).to.equal(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should switch default chainId using hex string', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31337)) + + provider.setDefaultChainId('0x7a6a') + expect(defaultChainId).to.equal(31338) + expect(await provider.perform('eth_chainId', [])).to.equal(ethers.utils.hexValue(31338)) + }) + + it('should fail to switch default chainId on static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(() => provider.getProvider(31337).setDefaultChainId(31338)).to.throw( + 'This provider only supports the network 31337; use the parent provider to switch networks.' + ) + }) + + it('should fail to switch default chainId (to same chainId) on static network provider', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(() => provider.getProvider(31337).setDefaultChainId(31337)).to.throw( + 'This provider only supports the network 31337; use the parent provider to switch networks.' + ) + }) + }) + }) + + describe('sequence client methods', () => { + describe('perform eth_sendTransaction', async () => { + const expectedResult = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + + let provider: SequenceProvider + let calledCount: number + + let expectedChainId: number + let expectedTx: ethers.providers.TransactionRequest + + beforeEach(async () => { + calledCount = 0 + provider = new SequenceProvider( + { + ...basicMockClient, + send: async (request: JsonRpcRequest, chainId?: number) => { + expect(chainId).to.equal(expectedChainId) + expect(request.method).to.equal('eth_sendTransaction') + expect(request.params).to.deep.equal([expectedTx]) + calledCount++ + return expectedResult + } + } as unknown as SequenceClient, + providerFor + ) + + expectedTx = { + to: ethers.Wallet.createRandom().address, + value: '9000', + data: ethers.utils.hexlify(ethers.utils.randomBytes(66)) + } + }) + + it('should call sendTransaction on main provider', async () => { + expectedChainId = 31337 + const res = await provider.perform('eth_sendTransaction', [expectedTx]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sendTransaction after switching default chainId', async () => { + expectedChainId = 31338 + provider.setDefaultChainId(31338) + const res = await provider.perform('eth_sendTransaction', [expectedTx]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sendTransaction on single network provider', async () => { + expectedChainId = 31338 + const res = await provider.getProvider(31338).perform('eth_sendTransaction', [expectedTx]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sendTransaction with aux data', async () => { + expectedTx = { + ...expectedTx, + auxiliary: [{ to: ethers.Wallet.createRandom().address }] + } as ExtendedTransactionRequest + expectedChainId = 31338 + const res = await provider.getProvider(31338).perform('eth_sendTransaction', [expectedTx]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sendTransaction using request', async () => { + expectedChainId = 31337 + const res = await provider.request({ method: 'eth_sendTransaction', params: [expectedTx] }) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + }) + ;['eth_sign', 'personal_sign', 'sequence_sign'].forEach(method => { + describe(`perform ${method}`, async () => { + const expectedResult = ethers.utils.hexlify(ethers.utils.randomBytes(120)) + + let provider: SequenceProvider + let calledCount: number + + let expectedChainId: number + let expectedAddress: string + let expectedMessage: string + + beforeEach(async () => { + calledCount = 0 + provider = new SequenceProvider( + { + ...basicMockClient, + send: async (request: JsonRpcRequest, chainId?: number) => { + expect(chainId).to.equal(expectedChainId) + expect(request.method).to.equal(method) + expect(request.params).to.deep.equal([expectedAddress, expectedMessage]) + calledCount++ + return expectedResult + } + } as unknown as SequenceClient, + providerFor + ) + + expectedAddress = ethers.Wallet.createRandom().address + expectedMessage = ethers.utils.hexlify(ethers.utils.randomBytes(66)) + }) + + it('should call sign on main provider', async () => { + expectedChainId = 31337 + const res = await provider.perform(method, [expectedAddress, expectedMessage]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sign after switching default chainId', async () => { + expectedChainId = 31338 + provider.setDefaultChainId(31338) + const res = await provider.perform(method, [expectedAddress, expectedMessage]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sign on single network provider', async () => { + expectedChainId = 31338 + const res = await provider.getProvider(31338).perform(method, [expectedAddress, expectedMessage]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sign using request', async () => { + expectedChainId = 31337 + const res = await provider.request({ method, params: [expectedAddress, expectedMessage] }) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + }) + }) + ;['eth_signTypedData', 'eth_signTypedData_v4', 'sequence_signTypedData_v4'].forEach(method => { + describe(`perform ${method}`, async () => { + const expectedResult = ethers.utils.hexlify(ethers.utils.randomBytes(121)) + + let provider: SequenceProvider + let calledCount: number + + let expectedChainId: number + let expectedAddress: string + let expectedMessage: Array + + beforeEach(async () => { + calledCount = 0 + provider = new SequenceProvider( + { + ...basicMockClient, + send: async (request: JsonRpcRequest, chainId?: number) => { + expect(chainId).to.equal(expectedChainId) + expect(request.method).to.equal(method) + expect(request.params).to.deep.equal([expectedAddress, expectedMessage]) + calledCount++ + return expectedResult + } + } as unknown as SequenceClient, + providerFor + ) + + expectedAddress = ethers.Wallet.createRandom().address + expectedMessage = [{ thisisjustdata: ethers.utils.hexlify(ethers.utils.randomBytes(66)), sure: 'yes' }] + }) + + it('should call sign on main provider', async () => { + expectedChainId = 31337 + const res = await provider.perform(method, [expectedAddress, expectedMessage]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sign after switching default chainId', async () => { + expectedChainId = 31338 + provider.setDefaultChainId(31338) + const res = await provider.perform(method, [expectedAddress, expectedMessage]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sign on single network provider', async () => { + expectedChainId = 31338 + const res = await provider.getProvider(31338).perform(method, [expectedAddress, expectedMessage]) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + + it('should call sign using request', async () => { + expectedChainId = 31337 + const res = await provider.request({ method, params: [expectedAddress, expectedMessage] }) + expect(calledCount).to.equal(1) + expect(res).to.equal(expectedResult) + }) + }) + }) + }) + + describe('misc public rpc methods', () => { + let provider: SequenceProvider + let b1: number + let b2: number + + beforeEach(async () => { + provider = new SequenceProvider(basicMockClient, providerFor) + b1 = await hardhat1Provider.getBlockNumber() + b2 = await hardhat2Provider.getBlockNumber() + }) + + it('should forward random method to main provider', async () => { + await provider.perform('evm_mine', []) + expect(await hardhat1Provider.getBlockNumber()).to.equal(b1 + 1) + expect(await hardhat2Provider.getBlockNumber()).to.equal(b2) + }) + + it('should forward random method after switching default chain', async () => { + provider.setDefaultChainId(31338) + await provider.perform('evm_mine', []) + expect(await hardhat1Provider.getBlockNumber()).to.equal(b1) + expect(await hardhat2Provider.getBlockNumber()).to.equal(b2 + 1) + }) + + it('should forward random method to single network provider', async () => { + await provider.getProvider(31338).perform('evm_mine', []) + expect(await hardhat1Provider.getBlockNumber()).to.equal(b1) + expect(await hardhat2Provider.getBlockNumber()).to.equal(b2 + 1) + }) + + it('should forward method with parameters', async () => { + await provider.perform('evm_mine', []) + await provider.perform('evm_mine', []) + const block1 = await hardhat1Provider.getBlock(2).then(t => t.hash) + expect(await provider.perform('eth_getBlockByNumber', ['0x2', false]).then(t => t.hash)).to.equal(block1) + }) + + it('should forward method using request', async () => { + await provider.request({ method: 'evm_mine', params: [] }) + await provider.request({ method: 'evm_mine', params: [] }) + const block1 = await hardhat1Provider.getBlock(2).then(t => t.hash) + expect(await provider.request({ method: 'eth_getBlockByNumber', params: ['0x2', false] }).then(t => t.hash)).to.equal( + block1 + ) + }) + }) + }) + }) + + it('should return true to isSequenceProvider', () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + expect(SequenceProvider.is(provider)).to.equal(true) + }) + + describe('network switching', () => { + it('should emit chainChanged when default chain is changed', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + + let emittedCount = 0 + provider.on('chainChanged', chainId => { + expect(chainId).to.equal(31338) + emittedCount++ + }) + + provider.setDefaultChainId(31338) + + await new Promise(resolve => setTimeout(resolve, 100)) + expect(emittedCount).to.equal(1) + }) + + it('should detect network', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + const initialNetwork = await provider.detectNetwork() + + expect(initialNetwork.chainId).to.equal(31337, 'initial network') + + provider.setDefaultChainId(31338) + + await new Promise(resolve => setTimeout(resolve, 100)) + const newNetwork = await provider.detectNetwork() + expect(newNetwork.chainId).to.equal(31338, '2nd network') + }) + + it('should update polling block number', async () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + + const b1 = await hardhat1Provider.getBlockNumber() + const b2 = await hardhat2Provider.getBlockNumber() + + if (b1 === b2) { + await hardhat2Provider.send('evm_mine', []) + } + + expect(b1).to.not.equal(b2) + + await new Promise(resolve => setTimeout(resolve, 250)) + const initialBlockNumber = provider.blockNumber + + provider.setDefaultChainId(31338) + + await new Promise(resolve => setTimeout(resolve, 250)) + const newBlockNumber = await provider.getBlockNumber() + + expect(initialBlockNumber).to.not.equal(newBlockNumber) + }) + }) +}) diff --git a/packages/provider/tests/remove-eip191prefix.spec.ts b/packages/provider/tests/remove-eip191prefix.spec.ts new file mode 100644 index 000000000..1a4c31f7c --- /dev/null +++ b/packages/provider/tests/remove-eip191prefix.spec.ts @@ -0,0 +1,34 @@ +import chaiAsPromised from 'chai-as-promised' +import * as chai from 'chai' + +import { + trimEIP191Prefix_test1_prefixed, + trimEIP191Prefix_test1_raw, + trimEIP191Prefix_test2_prefixed, + trimEIP191Prefix_test2_raw, + trimEIP191Prefix_test3_prefixed, + trimEIP191Prefix_test3_raw, + trimEIP191Prefix_test4_prefixed, + trimEIP191Prefix_test4_raw, + trimEIP191Prefix_test5_prefixed, + trimEIP191Prefix_test5_raw +} from './messages' +import { trimEIP191Prefix } from '../src/utils' +import { ethers } from 'ethers' +const { expect } = chai.use(chaiAsPromised) + +describe('trimming eip191prefix', () => { + it('should trim prefix', () => { + expect(ethers.utils.toUtf8String(trimEIP191Prefix(trimEIP191Prefix_test1_prefixed))).equal(trimEIP191Prefix_test1_raw) + }) + + it('should handle eip191 exempt messages (by returning early)', () => { + expect(ethers.utils.toUtf8String(trimEIP191Prefix(trimEIP191Prefix_test2_prefixed))).equal(trimEIP191Prefix_test2_raw) + }) + + it('should trim prefix for case where max prefix char as number is bigger than the length of the message', () => { + expect(ethers.utils.toUtf8String(trimEIP191Prefix(trimEIP191Prefix_test3_prefixed))).equal(trimEIP191Prefix_test3_raw) + expect(ethers.utils.toUtf8String(trimEIP191Prefix(trimEIP191Prefix_test4_prefixed))).equal(trimEIP191Prefix_test4_raw) + expect(ethers.utils.toUtf8String(trimEIP191Prefix(trimEIP191Prefix_test5_prefixed))).equal(trimEIP191Prefix_test5_raw) + }) +}) diff --git a/packages/provider/tests/signer.spec.ts b/packages/provider/tests/signer.spec.ts new file mode 100644 index 000000000..36044d9a9 --- /dev/null +++ b/packages/provider/tests/signer.spec.ts @@ -0,0 +1,1091 @@ +import { ethers } from 'ethers' +import { + ConnectOptions, + OpenWalletIntent, + OptionalChainId, + OptionalChainIdLike, + OptionalEIP6492, + SequenceClient, + SequenceProvider, + SequenceSigner, + SingleNetworkSequenceProvider, + SingleNetworkSequenceSigner +} from '../src' +import { expect } from 'chai' +import { JsonRpcRequest, JsonRpcResponse, allNetworks } from '@0xsequence/network' +import { ExtendedTransactionRequest } from '../src/extended' +import { TypedData } from '@0xsequence/utils' + +const hardhat1Provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:9595') +const hardhat2Provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8595') + +const testAccounts = [ + new ethers.Wallet('0xcd0434442164a4a6ef9bb677da8dc326fddf412cad4df65e1a3f2555aee5e2b3').connect(hardhat1Provider), + new ethers.Wallet('0xcd0434442164a4a6ef9bb677da8dc326fddf412cad4df65e1a3f2555aee5e2b3').connect(hardhat2Provider) +] + +const providerFor = (chainId: number) => { + if (chainId === 31337) { + return hardhat1Provider + } + + if (chainId === 31338) { + return hardhat2Provider + } + + throw new Error(`No provider for chainId ${chainId}`) +} + +let defaultChainId: number + +let callback: (chainId: number) => void + +const onDefaultChainIdChanged = (cb: (chainId: number) => void) => { + callback = cb +} + +const setDefaultChainId = (chainId: number) => { + defaultChainId = chainId + callback(chainId) +} + +const basicMockClient = { + getChainId: () => defaultChainId, + onDefaultChainIdChanged, + setDefaultChainId, + // EIP-1193 + onConnect: () => {}, + onDisconnect: () => {}, + onAccountsChanged: () => {} +} as unknown as SequenceClient + +async function waitUntilNoFail(provider: ethers.providers.Provider, timeout = 20000): Promise { + const start = Date.now() + while (Date.now() - start < timeout) { + try { + await provider.getBlockNumber() + return + } catch (e) { + await new Promise(resolve => setTimeout(resolve, 100)) + } + } + console.warn('waitUntilNoFail timed out') +} + +describe('SequenceSigner', () => { + before(async () => { + // Wait for both providers to be ready + await Promise.all([waitUntilNoFail(hardhat1Provider), waitUntilNoFail(hardhat2Provider)]) + }) + + beforeEach(() => { + defaultChainId = 31337 + }) + + describe('client proxy methods', () => { + describe('getWalletConfig', () => { + const returnWalletConfig = { + version: 1, + threshold: 5, + signers: [ + { + weight: 1, + addr: ethers.Wallet.createRandom().address + } + ] + } + + let expectedChainId: number + let signer: SequenceSigner + let callsToGetWalletConfig: number + + beforeEach(() => { + callsToGetWalletConfig = 0 + signer = new SequenceProvider( + { + ...basicMockClient, + getOnchainWalletConfig: async (args: { chainId: number }) => { + expect(args.chainId).to.equal(expectedChainId) + callsToGetWalletConfig++ + return returnWalletConfig + } + } as unknown as SequenceClient, + providerFor + ).getSigner() + }) + + it('should return the wallet config', async () => { + expectedChainId = 31337 + const walletConfig = await signer.getWalletConfig() + expect(walletConfig).to.deep.equal(returnWalletConfig) + expect(callsToGetWalletConfig).to.equal(1) + }) + + it('should return the wallet config for a different chainId', async () => { + expectedChainId = 31338 + signer.provider.setDefaultChainId(31338) + const walletConfig = await signer.getWalletConfig() + expect(walletConfig).to.deep.equal(returnWalletConfig) + expect(callsToGetWalletConfig).to.equal(1) + }) + + it('should return the wallet config on a specific network signer', async () => { + const signer1 = signer.getSigner(31337) + const signer2 = signer.getSigner(31338) + + expectedChainId = 31337 + const walletConfig1 = await signer1.getWalletConfig() + expect(walletConfig1).to.deep.equal(returnWalletConfig) + expect(callsToGetWalletConfig).to.equal(1) + + expectedChainId = 31338 + const walletConfig2 = await signer2.getWalletConfig() + expect(walletConfig2).to.deep.equal(returnWalletConfig) + expect(callsToGetWalletConfig).to.equal(2) + }) + }) + + it('getNetworks', async () => { + let callsToGetNetworks = 0 + const signer = new SequenceProvider( + { + ...basicMockClient, + getNetworks: async () => { + callsToGetNetworks++ + return allNetworks + } + } as unknown as SequenceClient, + providerFor + ).getSigner() + + expect(await signer.getNetworks()).to.deep.equal(allNetworks) + expect(callsToGetNetworks).to.equal(1) + + expect(await signer.getSigner(31337).getNetworks()).to.deep.equal(allNetworks) + expect(callsToGetNetworks).to.equal(2) + + expect(await signer.getSigner('hardhat2').getNetworks()).to.deep.equal(allNetworks) + expect(callsToGetNetworks).to.equal(3) + }) + + describe('getChainId', () => { + it('should return the default chainId', async () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + expect(await signer.getChainId()).to.equal(31337) + }) + + it('should return the chainId for a specific signer', async () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + expect(await signer.getSigner(31338).getChainId()).to.equal(31338) + }) + + it('should return the chainId for a specific signer by name', async () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + expect(await signer.getSigner('hardhat2').getChainId()).to.equal(31338) + }) + + it('should return the chainId after the default chainId changes', async () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + expect(await signer.getChainId()).to.equal(31337) + signer.provider.setDefaultChainId(31338) + expect(await signer.getChainId()).to.equal(31338) + }) + }) + + describe('getAddress', () => { + let callsToGetAddress: number + let signer: SequenceSigner + let address: string + + beforeEach(() => { + callsToGetAddress = 0 + address = ethers.Wallet.createRandom().address + signer = new SequenceProvider( + { + ...basicMockClient, + getAddress: () => { + callsToGetAddress++ + return address + } + } as unknown as SequenceClient, + providerFor + ).getSigner() + }) + + it('should return the address', async () => { + expect(await signer.getAddress()).to.equal(address) + expect(callsToGetAddress).to.equal(1) + }) + + it('should return the address for a specific signer', async () => { + expect(await signer.getSigner(31338).getAddress()).to.equal(address) + expect(callsToGetAddress).to.equal(1) + }) + + it('getAddress should not be memoized', async () => { + expect(await signer.getAddress()).to.equal(address) + expect(callsToGetAddress).to.equal(1) + expect(await signer.getAddress()).to.equal(address) + expect(callsToGetAddress).to.equal(2) + }) + }) + }) + + describe('provider proxy methods', () => { + describe('getBalance', () => { + let signer: SequenceSigner + let address: string + + beforeEach(async () => { + address = ethers.Wallet.createRandom().address + + signer = new SequenceProvider( + { + ...basicMockClient, + getAddress: () => address + } as unknown as SequenceClient, + providerFor + ).getSigner() + + // Send 10 wei in hardhat1 and 20 wei in hardhat2 + await testAccounts[0].sendTransaction({ + to: address, + value: 10 + }) + + await testAccounts[1].sendTransaction({ + to: address, + value: 20 + }) + }) + + it('should return the balance on default chain', async () => { + expect(await signer.getBalance().then(b => b.toNumber())).to.equal(10) + }) + + it('should return the balance on default chain after switching networks', async () => { + signer.provider.setDefaultChainId(31338) + expect(await signer.getBalance().then(b => b.toNumber())).to.equal(20) + }) + + it('should return the balance on specific chain', async () => { + expect(await signer.getBalance(undefined, { chainId: 31337 }).then(b => b.toNumber())).to.equal(10) + expect(await signer.getBalance(undefined, { chainId: 31338 }).then(b => b.toNumber())).to.equal(20) + }) + + it('should return the balance on specific chain using string network name', async () => { + expect(await signer.getBalance(undefined, { chainId: 'hardhat' }).then(b => b.toNumber())).to.equal(10) + expect(await signer.getBalance(undefined, { chainId: 'hardhat2' }).then(b => b.toNumber())).to.equal(20) + }) + + it('should return the balance on static network signer', async () => { + expect( + await signer + .getSigner(31337) + .getBalance() + .then(b => b.toNumber()) + ).to.equal(10) + expect( + await signer + .getSigner(31338) + .getBalance() + .then(b => b.toNumber()) + ).to.equal(20) + }) + + it('should return the balance on static network signer using string network name', async () => { + expect( + await signer + .getSigner('hardhat') + .getBalance() + .then(b => b.toNumber()) + ).to.equal(10) + expect( + await signer + .getSigner('hardhat2') + .getBalance() + .then(b => b.toNumber()) + ).to.equal(20) + }) + + it('should return balance on specific chain when passing chainId', async () => { + expect( + await signer + .getSigner('hardhat') + .getBalance(undefined, { chainId: 31337 }) + .then(b => b.toNumber()) + ).to.equal(10) + expect( + await signer + .getSigner('hardhat2') + .getBalance(undefined, { chainId: 31338 }) + .then(b => b.toNumber()) + ).to.equal(20) + }) + + it('should fail to return balance on specific chain when passing different chainId', async () => { + await expect(signer.getSigner('hardhat').getBalance(undefined, { chainId: 31338 })).to.be.rejectedWith( + 'This signer only supports the network 31337, but 31338 was requested.' + ) + }) + }) + + describe('estimate gas', () => { + let signer: SequenceSigner + + let eg1: ethers.BigNumber + let eg2: ethers.BigNumber + + let addr: string + + beforeEach(async () => { + // deploy a "contract" that when called returns 0x112233 + // (this uses a bit of gas that we can measure) + const res = await testAccounts[0] + .sendTransaction({ + data: '0x6b621122336000526003601df3600052600c6014f3' + }) + .then(r => r.wait()) + + addr = res.contractAddress + + eg1 = await hardhat1Provider.estimateGas({ to: addr }) + eg2 = await hardhat2Provider.estimateGas({ to: addr }) + + expect(eg1).to.not.deep.equal(eg2) + + signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + }) + + it('forward estimateGas - default', async () => { + expect(await signer.estimateGas({ to: addr })).to.deep.equal(eg1) + + signer.provider.setDefaultChainId(31338) + expect(await signer.estimateGas({ to: addr })).to.deep.equal(eg2) + }) + + it('forward estimateGas - specific chain', async () => { + expect(await signer.estimateGas({ to: addr }, { chainId: 31337 })).to.deep.equal(eg1) + expect(await signer.estimateGas({ to: addr }, { chainId: 31338 })).to.deep.equal(eg2) + }) + + it('forward estimateGas - static network provider', async () => { + expect(await signer.getSigner('hardhat').estimateGas({ to: addr })).to.deep.equal(eg1) + expect(await signer.getSigner('hardhat2').estimateGas({ to: addr })).to.deep.equal(eg2) + }) + + it('fail to forward estimateGas - static network provider for different chain', async () => { + await expect(signer.getSigner('hardhat2').estimateGas({ to: addr }, { chainId: 31337 })).to.be.rejectedWith( + 'This signer only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('call', () => { + let signer: SequenceSigner + let addr: string + + beforeEach(async () => { + // deploy a "contract" that when called returns 0x112233 + const res = await testAccounts[0] + .sendTransaction({ + data: '0x6b621122336000526003601df3600052600c6014f3' + }) + .then(r => r.wait()) + + addr = res.contractAddress + + expect(await hardhat1Provider.call({ to: addr })).to.equal('0x112233') + expect(await hardhat2Provider.call({ to: addr })).to.equal('0x') + signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + }) + + it('forward call - default', async () => { + expect(await signer.call({ to: addr })).to.equal('0x112233') + + signer.provider.setDefaultChainId(31338) + expect(await signer.call({ to: addr })).to.equal('0x') + }) + + it('forward call - specific chain', async () => { + expect(await signer.call({ to: addr }, undefined, { chainId: 31337 })).to.equal('0x112233') + expect(await signer.call({ to: addr }, undefined, { chainId: 31338 })).to.equal('0x') + }) + + it('forward call - static network provider', async () => { + expect(await signer.getSigner(31337).call({ to: addr })).to.equal('0x112233') + expect(await signer.getSigner(31338).call({ to: addr })).to.equal('0x') + }) + + it('fail to forward call - static network provider for different chain', async () => { + await expect(signer.getSigner('hardhat2').call({ to: addr }, undefined, { chainId: 31337 })).to.be.rejectedWith( + 'This signer only supports the network 31338, but 31337 was requested.' + ) + }) + }) + + describe('getGasPrice', () => { + let signer: SequenceSigner + + beforeEach(() => { + // NOTICE: We need to path the hardhat providers so they return different gas prices + signer = new SequenceProvider(basicMockClient, (chainId: number) => { + if (chainId === 31337) { + return { + ...hardhat1Provider, + getGasPrice: async () => ethers.BigNumber.from(1) + } as unknown as ethers.providers.JsonRpcProvider + } + + if (chainId === 31338) { + return { + ...hardhat2Provider, + getGasPrice: async () => ethers.BigNumber.from(2) + } as unknown as ethers.providers.JsonRpcProvider + } + + throw new Error(`No provider for chainId ${chainId}`) + }).getSigner() + }) + + it('forward getGasPrice - default', async () => { + expect(await signer.getGasPrice()).to.deep.equal(ethers.BigNumber.from(1)) + + signer.provider.setDefaultChainId(31338) + expect(await signer.getGasPrice()).to.deep.equal(ethers.BigNumber.from(2)) + }) + + it('forward getGasPrice - specific chain', async () => { + expect(await signer.getGasPrice({ chainId: 31337 })).to.deep.equal(ethers.BigNumber.from(1)) + expect(await signer.getGasPrice({ chainId: 31338 })).to.deep.equal(ethers.BigNumber.from(2)) + }) + + it('forward getGasPrice - static network provider', async () => { + expect(await signer.getSigner('hardhat').getGasPrice()).to.deep.equal(ethers.BigNumber.from(1)) + expect(await signer.getSigner(31338).getGasPrice()).to.deep.equal(ethers.BigNumber.from(2)) + }) + + it('fail to forward getGasPrice - static network provider for different chain', async () => { + await expect(signer.getSigner('hardhat').getGasPrice({ chainId: 31338 })).to.be.rejectedWith( + 'This signer only supports the network 31337, but 31338 was requested.' + ) + }) + }) + + describe('ENS', () => { + let signer: SequenceSigner + let mainnetProvider: ethers.providers.JsonRpcProvider + + let vitalikAddr: string | null + + before(async () => { + mainnetProvider = new ethers.providers.JsonRpcProvider('https://nodes.sequence.app/mainnet') + vitalikAddr = await mainnetProvider.resolveName('vitalik.eth') + }) + + beforeEach(() => { + signer = new SequenceProvider( + { + ...basicMockClient, + getNetworks: async () => allNetworks + } as unknown as SequenceClient, + (chainId: number) => { + if (chainId === 1) { + return mainnetProvider + } + + return providerFor(chainId) + } + ).getSigner() + }) + + it('resolve normal address', async () => { + const addr = ethers.Wallet.createRandom().address + expect(await signer.resolveName(addr)).to.equal(addr) + }) + + it('forward resolveName on primary provider', async () => { + expect(await signer.resolveName('vitalik.eth')).to.equal(vitalikAddr) + }) + + it('forward resolveName on single network (mainnet) provider', async () => { + expect(await signer.getSigner('mainnet').resolveName('vitalik.eth')).to.equal(vitalikAddr) + }) + + it('fail to forward resolveName on single network (hardhat) provider', async () => { + await expect(signer.getSigner('hardhat').resolveName('vitalik.eth')).to.be.rejectedWith( + 'This provider only supports the network 31337, but 1 was requested.' + ) + }) + + it('shuld fail if the name is not resolved', async () => { + await expect(signer.resolveName('pleasedontregisterthisorelsethistestwillfail.eth')).to.be.rejectedWith( + 'ENS name not found: pleasedontregisterthisorelsethistestwillfail.eth' + ) + }) + }) + }) + + describe('connect', () => { + it('should connect to new sequence provider', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + const newProvider = new SequenceProvider(basicMockClient, providerFor) + + expect(signer.provider).to.not.equal(newProvider) + const newSigner = signer.connect(newProvider) + + expect(signer).to.not.equal(newSigner) + expect(newSigner.provider).to.equal(newProvider) + }) + + it('should fail to connect to non-sequence provider', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + expect(() => signer.connect(hardhat1Provider)).to.throw('SequenceSigner can only be connected to a SequenceProvider') + }) + }) + + describe('single networks signer', () => { + it('default chainId signer should return this', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + expect(signer.getSigner()).to.equal(signer) + }) + + it('static network matching default chainId should not return this', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + expect(signer.getSigner(31337)).to.not.equal(signer) + }) + + it('static network should be memoized', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + expect(signer.getSigner(31337)).to.equal(signer.getSigner('hardhat')) + }) + + it('static network should math the one provided by the provider', () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + const signer = provider.getSigner() + expect(signer.getSigner(31337).provider).to.equal(provider.getSigner(31337).provider) + }) + + it('static network provider should return static network signer', () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + const staticProvider = provider.getProvider(31337) + const signer = staticProvider.getSigner() + expect(SingleNetworkSequenceSigner.is(signer)).to.be.true + }) + + it('static network provider should return static network signer when asking for the same chainId', () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + const staticProvider = provider.getProvider(31337) + const signer = staticProvider.getSigner(31337) + expect(SingleNetworkSequenceSigner.is(signer)).to.be.true + expect(signer).to.equal(staticProvider.getSigner()) + }) + + it('static network provider should fail to return signer for different chainId', () => { + const provider = new SequenceProvider(basicMockClient, providerFor) + const staticProvider = provider.getProvider(31337) + expect(() => staticProvider.getSigner(31338)).to.throw( + 'This provider only supports the network 31337, but 31338 was requested.' + ) + }) + + it('static network signer should return static chainId', async () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner(31337) + expect(await signer.getChainId()).to.equal(31337) + }) + + it('static network signer should return self when asking for the same chainId', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + const snetwork = signer.getSigner(31337) + expect(snetwork.getSigner(31337)).to.equal(snetwork) + }) + + it('static network signer should return self when asked for a signer without chainId', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner() + const snetwork = signer.getSigner(31337) + expect(snetwork.getSigner()).to.equal(snetwork) + }) + + it('static network signer should fail to return signer for a different chainId', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner(31337) + expect(() => signer.getSigner(31338)).to.throw('This signer only supports the network 31337, but 31338 was requested.') + }) + + it('static network signer should return static network provider', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner(31337) + const provider = signer.getProvider() + expect(SingleNetworkSequenceProvider.is(provider)).to.be.true + }) + + it('static network signer should return static network provider when asked for same chainId', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner(31337) + const provider = signer.getProvider(31337) + expect(SingleNetworkSequenceProvider.is(provider)).to.be.true + expect(provider).to.equal(signer.getProvider()) + }) + + it('static network signer should fail to return provider for different chainId', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner(31337) + expect(() => signer.getProvider(31338)).to.throw('This signer only supports the network 31337, but 31338 was requested.') + }) + + it('signer getProvider should return main provider', () => { + const signer = new SequenceProvider(basicMockClient, providerFor).getSigner(31337) + expect(signer.getProvider()).to.equal(signer.provider) + }) + }) + + describe('signMessage', () => { + let signer: SequenceSigner + + let callsToSignMessage: number + let expectedSignMessage: ethers.utils.BytesLike + let expectedOptions: OptionalEIP6492 & OptionalChainId + let returnValue: string + + beforeEach(() => { + callsToSignMessage = 0 + expectedSignMessage = ethers.utils.hexlify(ethers.utils.randomBytes(64)) + expectedOptions = {} + returnValue = ethers.utils.hexlify(ethers.utils.randomBytes(99)) + + signer = new SequenceProvider( + { + ...basicMockClient, + signMessage: async (message: string, options: OptionalEIP6492 & OptionalChainId) => { + expect(message).to.equal(expectedSignMessage) + expect(options).to.deep.equal(expectedOptions) + callsToSignMessage++ + return returnValue + } + } as unknown as SequenceClient, + providerFor + ).getSigner() + }) + + it('should sign message on default chain', async () => { + expectedOptions = { chainId: 31337, eip6492: true } + expect(await signer.signMessage(expectedSignMessage)).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on default chain without using eip6492', async () => { + expectedOptions = { chainId: 31337, eip6492: false } + expect(await signer.signMessage(expectedSignMessage, { eip6492: false })).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on default chain after switching networks', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + signer.provider.setDefaultChainId(31338) + expect(await signer.signMessage(expectedSignMessage)).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on default chain after switching networks without using eip6492', async () => { + expectedOptions = { chainId: 31338, eip6492: false } + signer.provider.setDefaultChainId(31338) + expect(await signer.signMessage(expectedSignMessage, { eip6492: false })).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on specific chain', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + expect(await signer.signMessage(expectedSignMessage, { chainId: 31338 })).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on specific chain without using eip6492', async () => { + expectedOptions = { chainId: 31338, eip6492: false } + expect(await signer.signMessage(expectedSignMessage, { chainId: 31338, eip6492: false })).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on specific chain using string network name', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + expect(await signer.signMessage(expectedSignMessage, { chainId: 'hardhat2' })).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on specific chain using string network name without using eip6492', async () => { + expectedOptions = { chainId: 31338, eip6492: false } + expect(await signer.signMessage(expectedSignMessage, { chainId: 'hardhat2', eip6492: false })).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on static network signer', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + expect(await signer.getSigner(31338).signMessage(expectedSignMessage)).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on static network signer without using eip6492', async () => { + expectedOptions = { chainId: 31338, eip6492: false } + expect(await signer.getSigner(31338).signMessage(expectedSignMessage, { eip6492: false })).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should sign message on static network signer if passing chainId', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + expect(await signer.getSigner(31338).signMessage(expectedSignMessage, { chainId: 31338 })).to.equal(returnValue) + expect(callsToSignMessage).to.equal(1) + }) + + it('should fail to sign message on static network signer if passing different chainId', async () => { + await expect(signer.getSigner(31338).signMessage(expectedSignMessage, { chainId: 31337 })).to.be.rejectedWith( + 'This signer only supports the network 31338, but 31337 was requested.' + ) + }) + + it('should pass array instead of string', async () => { + expectedSignMessage = ethers.utils.arrayify(ethers.utils.randomBytes(199)) + expectedOptions = { chainId: 31337, eip6492: true } + expect(await signer.signMessage(expectedSignMessage)).to.equal(returnValue) + }) + }) + + describe('signTypedData', () => { + let signer: SequenceSigner + + let callsToSignTypedData: number + let expectedDomain: ethers.TypedDataDomain + let expectedTypes: Record> + let expectedMessage: Record + let expectedOptions: OptionalEIP6492 & OptionalChainId + let returnValue: string + + beforeEach(() => { + callsToSignTypedData = 0 + expectedDomain = { + name: 'Sequence', + version: '1', + chainId: 31337, + verifyingContract: ethers.utils.hexlify(ethers.utils.randomBytes(12)) + } + expectedTypes = { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + { name: 'verifyingContract', type: 'address' } + ], + MetaTransaction: [ + { name: 'nonce', type: 'uint256' }, + { name: 'from', type: 'address' }, + { name: 'to', type: 'address' }, + { name: 'data', type: 'bytes' } + ] + } + expectedMessage = { + nonce: 1, + from: ethers.utils.hexlify(ethers.utils.randomBytes(12)), + to: ethers.utils.hexlify(ethers.utils.randomBytes(20)), + data: ethers.utils.hexlify(ethers.utils.randomBytes(32)) + } + expectedOptions = {} + returnValue = ethers.utils.hexlify(ethers.utils.randomBytes(99)) + + signer = new SequenceProvider( + { + ...basicMockClient, + signTypedData: async (typedData: TypedData, options: OptionalEIP6492 & OptionalChainId) => { + expect(typedData.domain).to.deep.equal(expectedDomain) + expect(typedData.types).to.deep.equal(expectedTypes) + expect(typedData.message).to.deep.equal(expectedMessage) + expect(options).to.deep.equal(expectedOptions) + callsToSignTypedData++ + return returnValue + } + } as unknown as SequenceClient, + providerFor + ).getSigner() + }) + + it('should sign typed data on default chain', async () => { + expectedOptions = { chainId: 31337, eip6492: true } + expect(await signer.signTypedData(expectedDomain, expectedTypes, expectedMessage)).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on default chain without using eip6492', async () => { + expectedOptions = { chainId: 31337, eip6492: false } + expect(await signer.signTypedData(expectedDomain, expectedTypes, expectedMessage, { eip6492: false })).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on default chain after switching networks', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + signer.provider.setDefaultChainId(31338) + expect(await signer.signTypedData(expectedDomain, expectedTypes, expectedMessage)).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on default chain after switching networks without using eip6492', async () => { + expectedOptions = { chainId: 31338, eip6492: false } + signer.provider.setDefaultChainId(31338) + expect(await signer.signTypedData(expectedDomain, expectedTypes, expectedMessage, { eip6492: false })).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on specific chain', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + expect(await signer.signTypedData(expectedDomain, expectedTypes, expectedMessage, { chainId: 31338 })).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on specific chain without using eip6492', async () => { + expectedOptions = { chainId: 31338, eip6492: false } + expect( + await signer.signTypedData(expectedDomain, expectedTypes, expectedMessage, { chainId: 31338, eip6492: false }) + ).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on specific chain using string network name', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + expect( + await signer.signTypedData(expectedDomain, expectedTypes, expectedMessage, { + chainId: 'hardhat2' + }) + ).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on specific chain using string network name without using eip6492', async () => { + expectedOptions = { chainId: 31338, eip6492: false } + expect( + await signer.signTypedData(expectedDomain, expectedTypes, expectedMessage, { + chainId: 'hardhat2', + eip6492: false + }) + ).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on static network signer', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + expect(await signer.getSigner(31338).signTypedData(expectedDomain, expectedTypes, expectedMessage)).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on static network signer without using eip6492', async () => { + expectedOptions = { chainId: 31338, eip6492: false } + expect( + await signer.getSigner(31338).signTypedData(expectedDomain, expectedTypes, expectedMessage, { eip6492: false }) + ).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should sign typed data on static network signer if passing chainId', async () => { + expectedOptions = { chainId: 31338, eip6492: true } + expect( + await signer.getSigner(31338).signTypedData(expectedDomain, expectedTypes, expectedMessage, { chainId: 31338 }) + ).to.equal(returnValue) + expect(callsToSignTypedData).to.equal(1) + }) + + it('should fail to sign typed data on static network signer if passing different chainId', async () => { + await expect( + signer.getSigner(31338).signTypedData(expectedDomain, expectedTypes, expectedMessage, { chainId: 31337 }) + ).to.be.rejectedWith('This signer only supports the network 31338, but 31337 was requested.') + }) + }) + + describe('sendTransaction', () => { + let callsToSendTransaction: number + let expectedTransactionRequest: + | ethers.utils.Deferrable[] + | ethers.utils.Deferrable + + let expectedOptions: OptionalChainIdLike + + let signer: SequenceSigner + + beforeEach(() => { + callsToSendTransaction = 0 + + expectedTransactionRequest = { + to: ethers.utils.hexlify(ethers.utils.randomBytes(12)), + value: ethers.utils.parseEther('1.0'), + data: ethers.utils.hexlify(ethers.utils.randomBytes(55)), + gasLimit: 40000 + } + + expectedOptions = {} + + signer = new SequenceProvider( + { + ...basicMockClient, + sendTransaction: async ( + transactionRequest: + | ethers.utils.Deferrable[] + | ethers.utils.Deferrable, + options: OptionalChainIdLike + ) => { + expect(transactionRequest).to.deep.equal(expectedTransactionRequest) + expect(options).to.deep.equal(expectedOptions) + callsToSendTransaction++ + + // Send a random transaction on the expected chainId + // so we can return some "hash", otherwise the provider + // will throw an error + const subsig = testAccounts[(options?.chainId ?? 31337) === 31337 ? 0 : 1] + const tx = await subsig.sendTransaction({ + to: ethers.Wallet.createRandom().address + }) + + return tx.hash + } + } as unknown as SequenceClient, + providerFor + ).getSigner() + }) + + it('should send transaction on default chain', async () => { + expectedOptions = { chainId: 31337 } + const tx = await signer.sendTransaction(expectedTransactionRequest) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + expect(callsToSendTransaction).to.equal(1) + }) + + it('should send transaction on default chain after switching networks', async () => { + expectedOptions = { chainId: 31338 } + signer.provider.setDefaultChainId(31338) + const tx = await signer.sendTransaction(expectedTransactionRequest) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + expect(callsToSendTransaction).to.equal(1) + }) + + it('should send transaction on specific chain', async () => { + expectedOptions = { chainId: 31338 } + const tx = await signer.sendTransaction(expectedTransactionRequest, { chainId: 31338 }) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + expect(callsToSendTransaction).to.equal(1) + }) + + it('should send transaction on specific chain using string network name', async () => { + expectedOptions = { chainId: 31338 } + const tx = await signer.sendTransaction(expectedTransactionRequest, { chainId: 'hardhat2' }) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + expect(callsToSendTransaction).to.equal(1) + }) + + it('should send transaction on static network signer', async () => { + expectedOptions = { chainId: 31338 } + const tx = await signer.getSigner(31338).sendTransaction(expectedTransactionRequest) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + expect(callsToSendTransaction).to.equal(1) + }) + + it('should send transaction on static network signer if passing chainId', async () => { + expectedOptions = { chainId: 31338 } + const tx = await signer.getSigner(31338).sendTransaction(expectedTransactionRequest, { chainId: 'hardhat2' }) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + expect(callsToSendTransaction).to.equal(1) + }) + + it('should fail to send transaction on static network signer if passing different chainId', async () => { + await expect(signer.getSigner(31338).sendTransaction(expectedTransactionRequest, { chainId: 31337 })).to.be.rejectedWith( + 'This signer only supports the network 31338, but 31337 was requested.' + ) + }) + + it('should send batch transaction', async () => { + expectedOptions = { chainId: 31338 } + expectedTransactionRequest = [ + { + to: ethers.utils.hexlify(ethers.utils.randomBytes(12)), + value: ethers.utils.parseEther('1.0'), + data: ethers.utils.hexlify(ethers.utils.randomBytes(55)) + }, + { + to: ethers.utils.hexlify(ethers.utils.randomBytes(12)), + data: ethers.utils.hexlify(ethers.utils.randomBytes(1)) + }, + { + to: ethers.utils.hexlify(ethers.utils.randomBytes(12)), + value: 2 + } + ] + + const tx = await signer.sendTransaction(expectedTransactionRequest, { chainId: 31338 }) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + expect(callsToSendTransaction).to.equal(1) + }) + + it('shoud send deffered transaction', async () => { + expectedOptions = { chainId: 31338 } + const expected = { + to: ethers.utils.hexlify(ethers.utils.randomBytes(12)), + value: ethers.utils.parseEther('1.0').toString() + } + + expectedTransactionRequest = JSON.parse(JSON.stringify(expected)) + + const derrered = { + to: new Promise(async r => { + await new Promise(d => setTimeout(d, 1000)) + return r(expected.to) + }), + value: new Promise(async r => { + await new Promise(d => setTimeout(d, 600)) + return r(expected.value) + }) + } + + const tx = await signer.sendTransaction(derrered, { chainId: 31338 }) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + }) + + it('shoud send array of deffered transactions', async () => { + expectedOptions = { chainId: 31338 } + const expected = [ + { + to: ethers.utils.hexlify(ethers.utils.randomBytes(12)), + value: ethers.utils.parseEther('1.0').toString() + }, + { + to: ethers.utils.hexlify(ethers.utils.randomBytes(12)), + data: ethers.utils.hexlify(ethers.utils.randomBytes(111)) + } + ] + + expectedTransactionRequest = JSON.parse(JSON.stringify(expected)) + + const derrered = [ + { + to: new Promise(async r => { + await new Promise(d => setTimeout(d, 1000)) + return r(expected[0].to) + }), + value: new Promise(async r => { + await new Promise(d => setTimeout(d, 600)) + return r(expected[0].value!) + }) + }, + { + to: new Promise(async r => { + await new Promise(d => setTimeout(d, 412)) + return r(expected[1].to) + }), + data: new Promise(async r => { + await new Promise(d => setTimeout(d, 1001)) + return r(expected[1].data!) + }) + } + ] + + const tx = await signer.sendTransaction(derrered, { chainId: 31338 }) + expect(tx.wait()).to.be.fulfilled + expect(ethers.utils.arrayify(tx.hash)).to.have.lengthOf(32) + }) + }) +}) diff --git a/packages/provider/tests/transactions.spec.ts b/packages/provider/tests/transactions.spec.ts new file mode 100644 index 000000000..ad89d9f81 --- /dev/null +++ b/packages/provider/tests/transactions.spec.ts @@ -0,0 +1,109 @@ +import { commons } from '@0xsequence/core' +import { expect } from 'chai' +import { validateTransactionRequest } from '../src/transactions' + +const self = '0x5e1f5e1f5e1f5e1f5e1f5e1f5e1f5e1f5e1f5e1f' +const to = '0x0123456789012345678901234567890123456789' + +describe('validating transaction requests', () => { + it('should throw an error when a transaction does a self call', () => { + const transaction = { + to, + data: commons.transaction.encodeBundleExecData({ + entrypoint: to, + transactions: [ + { + to: self, + data: '0x12345678' + } + ] + }) + } + + expect(() => validateTransactionRequest(self, transaction)).to.throw() + }) + + it('should throw an error when a transaction does a deep self call', () => { + const transaction = { + to, + data: commons.transaction.encodeBundleExecData({ + entrypoint: to, + transactions: [ + { + to: self, + data: commons.transaction.encodeBundleExecData({ + entrypoint: self, + transactions: [ + { + to: self, + data: '0x12345678' + } + ] + }) + } + ] + }) + } + + expect(() => validateTransactionRequest(self, transaction)).to.throw() + }) + + it('should throw an error when a transaction does a delegate call', () => { + const transaction = { + to, + data: commons.transaction.encodeBundleExecData({ + entrypoint: to, + transactions: [ + { + to, + delegateCall: true + } + ] + }) + } + + expect(() => validateTransactionRequest(self, transaction)).to.throw() + }) + + it('should throw an error when a transaction does a deep delegate call', () => { + const transaction = { + to, + data: commons.transaction.encodeBundleExecData({ + entrypoint: to, + transactions: [ + { + to: self, + data: commons.transaction.encodeBundleExecData({ + entrypoint: self, + transactions: [ + { + to: self, + delegateCall: true + } + ] + }) + } + ] + }) + } + + expect(() => validateTransactionRequest(self, transaction)).to.throw() + }) + + it('should not throw an error in general', () => { + const transaction = { + to, + data: commons.transaction.encodeBundleExecData({ + entrypoint: to, + transactions: [ + { + to: self, // self without data is ok + value: '1000000000000000000' + } + ] + }) + } + + expect(() => validateTransactionRequest(self, transaction)).to.not.throw() + }) +}) diff --git a/packages/provider/tests/zeroxv3.spec.ts b/packages/provider/tests/zeroxv3.spec.ts new file mode 100644 index 000000000..ee65442e2 --- /dev/null +++ b/packages/provider/tests/zeroxv3.spec.ts @@ -0,0 +1,14 @@ +import chaiAsPromised from 'chai-as-promised' +import * as chai from 'chai' + +import { isZeroExV3Order } from '../src/eip191exceptions' +import { message1, zeroExV3Order } from './messages' +const { expect } = chai.use(chaiAsPromised) + +describe('Utils / 0xv3', () => { + it('should detect 0x v3 order', () => { + expect(isZeroExV3Order(message1)).equals(false) + expect(isZeroExV3Order(zeroExV3Order.slice(0, -1))).equals(false) + expect(isZeroExV3Order(zeroExV3Order)).equals(true) + }) +}) diff --git a/packages/react-native/src/index.ts b/packages/react-native/src/index.ts new file mode 100644 index 000000000..c05c347fe --- /dev/null +++ b/packages/react-native/src/index.ts @@ -0,0 +1 @@ +export * from './keychain-store' diff --git a/packages/react-native/src/keychain-store.ts b/packages/react-native/src/keychain-store.ts new file mode 100644 index 000000000..9a5a5bbfc --- /dev/null +++ b/packages/react-native/src/keychain-store.ts @@ -0,0 +1,30 @@ +import { SecureStoreBackend } from '@0xsequence/waas' + +import { getGenericPassword, setGenericPassword, resetGenericPassword } from 'react-native-keychain' + +export class KeychainSecureStoreBackend implements SecureStoreBackend { + constructor() { + // no-op + } + + async get(dbName: string, dbStoreName: string, key: string): Promise { + const credentials = await getGenericPassword({ service: dbStoreName }) + if (credentials) { + return credentials.password + } else { + return null + } + } + + async set(dbName: string, dbStoreName: string, key: string, value: any): Promise { + if (typeof value !== 'string') { + throw new Error('Value must be a string') + } + await setGenericPassword(key, value, { service: dbStoreName }) + return true + } + + async delete(dbName: string, dbStoreName: string, key: string): Promise { + return resetGenericPassword({ service: dbStoreName }) + } +} diff --git a/packages/relayer/CHANGELOG.md b/packages/relayer/CHANGELOG.md new file mode 100644 index 000000000..cb132caec --- /dev/null +++ b/packages/relayer/CHANGELOG.md @@ -0,0 +1,3132 @@ +# @0xsequence/relayer + +## 1.10.8 + +### Patch Changes + +- update metadata bindings +- Updated dependencies + - @0xsequence/abi@1.10.8 + - @0xsequence/core@1.10.8 + - @0xsequence/utils@1.10.8 + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client +- Updated dependencies + - @0xsequence/abi@1.10.7 + - @0xsequence/core@1.10.7 + - @0xsequence/utils@1.10.7 + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/abi@1.10.6 + - @0xsequence/core@1.10.6 + - @0xsequence/utils@1.10.6 + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet +- Updated dependencies + - @0xsequence/abi@1.10.5 + - @0xsequence/core@1.10.5 + - @0xsequence/utils@1.10.5 + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia +- Updated dependencies + - @0xsequence/abi@1.10.4 + - @0xsequence/core@1.10.4 + - @0xsequence/utils@1.10.4 + +## 1.10.3 + +### Patch Changes + +- typing fix +- Updated dependencies + - @0xsequence/abi@1.10.3 + - @0xsequence/core@1.10.3 + - @0xsequence/utils@1.10.3 + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client +- Updated dependencies + - @0xsequence/abi@1.10.2 + - @0xsequence/core@1.10.2 + - @0xsequence/utils@1.10.2 + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/abi@1.10.1 + - @0xsequence/core@1.10.1 + - @0xsequence/utils@1.10.1 + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.10.0 + - @0xsequence/core@1.10.0 + - @0xsequence/utils@1.10.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants +- Updated dependencies + - @0xsequence/abi@1.9.37 + - @0xsequence/core@1.9.37 + - @0xsequence/utils@1.9.37 + +## 1.9.36 + +### Patch Changes + +- guard: export client +- Updated dependencies + - @0xsequence/abi@1.9.36 + - @0xsequence/core@1.9.36 + - @0xsequence/utils@1.9.36 + +## 1.9.35 + +### Patch Changes + +- guard: update bindings +- Updated dependencies + - @0xsequence/abi@1.9.35 + - @0xsequence/core@1.9.35 + - @0xsequence/utils@1.9.35 + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email +- Updated dependencies + - @0xsequence/abi@1.9.34 + - @0xsequence/core@1.9.34 + - @0xsequence/utils@1.9.34 + +## 1.9.33 + +### Patch Changes + +- waas: umd build +- Updated dependencies + - @0xsequence/abi@1.9.33 + - @0xsequence/core@1.9.33 + - @0xsequence/utils@1.9.33 + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings +- Updated dependencies + - @0xsequence/abi@1.9.32 + - @0xsequence/core@1.9.32 + - @0xsequence/utils@1.9.32 + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes +- Updated dependencies + - @0xsequence/abi@1.9.31 + - @0xsequence/core@1.9.31 + - @0xsequence/utils@1.9.31 + +## 1.9.30 + +### Patch Changes + +- update +- Updated dependencies + - @0xsequence/abi@1.9.30 + - @0xsequence/core@1.9.30 + - @0xsequence/utils@1.9.30 + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain +- Updated dependencies + - @0xsequence/abi@1.9.29 + - @0xsequence/core@1.9.29 + - @0xsequence/utils@1.9.29 + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree +- Updated dependencies + - @0xsequence/abi@1.9.28 + - @0xsequence/core@1.9.28 + - @0xsequence/utils@1.9.28 + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.9.27 + - @0xsequence/core@1.9.27 + - @0xsequence/utils@1.9.27 + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 +- Updated dependencies + - @0xsequence/abi@1.9.26 + - @0xsequence/core@1.9.26 + - @0xsequence/utils@1.9.26 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types +- Updated dependencies + - @0xsequence/abi@1.9.25 + - @0xsequence/core@1.9.25 + - @0xsequence/utils@1.9.25 + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore +- Updated dependencies + - @0xsequence/abi@1.9.24 + - @0xsequence/core@1.9.24 + - @0xsequence/utils@1.9.24 + +## 1.9.23 + +### Patch Changes + +- update api client bindings +- Updated dependencies + - @0xsequence/abi@1.9.23 + - @0xsequence/core@1.9.23 + - @0xsequence/utils@1.9.23 + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings +- Updated dependencies + - @0xsequence/abi@1.9.22 + - @0xsequence/core@1.9.22 + - @0xsequence/utils@1.9.22 + +## 1.9.21 + +### Patch Changes + +- api client bindings +- Updated dependencies + - @0xsequence/abi@1.9.21 + - @0xsequence/core@1.9.21 + - @0xsequence/utils@1.9.21 + +## 1.9.20 + +### Patch Changes + +- api client bindings update +- Updated dependencies + - @0xsequence/abi@1.9.20 + - @0xsequence/core@1.9.20 + - @0xsequence/utils@1.9.20 + +## 1.9.19 + +### Patch Changes + +- waas update +- Updated dependencies + - @0xsequence/abi@1.9.19 + - @0xsequence/core@1.9.19 + - @0xsequence/utils@1.9.19 + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions +- Updated dependencies + - @0xsequence/abi@1.9.18 + - @0xsequence/core@1.9.18 + - @0xsequence/utils@1.9.18 + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia +- Updated dependencies + - @0xsequence/abi@1.9.17 + - @0xsequence/core@1.9.17 + - @0xsequence/utils@1.9.17 + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions +- Updated dependencies + - @0xsequence/abi@1.9.16 + - @0xsequence/core@1.9.16 + - @0xsequence/utils@1.9.16 + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix +- Updated dependencies + - @0xsequence/abi@1.9.15 + - @0xsequence/core@1.9.15 + - @0xsequence/utils@1.9.15 + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.9.14 + - @0xsequence/core@1.9.14 + - @0xsequence/utils@1.9.14 + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency +- Updated dependencies + - @0xsequence/abi@1.9.13 + - @0xsequence/core@1.9.13 + - @0xsequence/utils@1.9.13 + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.9.12 + - @0xsequence/core@1.9.12 + - @0xsequence/utils@1.9.12 + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings +- Updated dependencies + - @0xsequence/abi@1.9.11 + - @0xsequence/core@1.9.11 + - @0xsequence/utils@1.9.11 + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings +- Updated dependencies + - @0xsequence/abi@1.9.10 + - @0xsequence/core@1.9.10 + - @0xsequence/utils@1.9.10 + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client +- Updated dependencies + - @0xsequence/abi@1.9.9 + - @0xsequence/core@1.9.9 + - @0xsequence/utils@1.9.9 + +## 1.9.8 + +### Patch Changes + +- waas client update +- Updated dependencies + - @0xsequence/abi@1.9.8 + - @0xsequence/core@1.9.8 + - @0xsequence/utils@1.9.8 + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer +- Updated dependencies + - @0xsequence/abi@1.9.7 + - @0xsequence/core@1.9.7 + - @0xsequence/utils@1.9.7 + +## 1.9.6 + +### Patch Changes + +- waas package update +- Updated dependencies + - @0xsequence/abi@1.9.6 + - @0xsequence/core@1.9.6 + - @0xsequence/utils@1.9.6 + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key +- Updated dependencies + - @0xsequence/abi@1.9.5 + - @0xsequence/core@1.9.5 + - @0xsequence/utils@1.9.5 + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency +- Updated dependencies + - @0xsequence/abi@1.9.4 + - @0xsequence/core@1.9.4 + - @0xsequence/utils@1.9.4 + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it +- Updated dependencies + - @0xsequence/abi@1.9.3 + - @0xsequence/core@1.9.3 + - @0xsequence/utils@1.9.3 + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia +- Updated dependencies + - @0xsequence/abi@1.9.2 + - @0xsequence/core@1.9.2 + - @0xsequence/utils@1.9.2 + +## 1.9.1 + +### Patch Changes + +- analytics fix +- Updated dependencies + - @0xsequence/abi@1.9.1 + - @0xsequence/core@1.9.1 + - @0xsequence/utils@1.9.1 + +## 1.9.0 + +### Minor Changes + +- waas release + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.9.0 + - @0xsequence/core@1.9.0 + - @0xsequence/utils@1.9.0 + +## 1.8.8 + +### Patch Changes + +- update metadata bindings +- Updated dependencies + - @0xsequence/abi@1.8.8 + - @0xsequence/core@1.8.8 + - @0xsequence/utils@1.8.8 + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 +- Updated dependencies + - @0xsequence/abi@1.8.7 + - @0xsequence/core@1.8.7 + - @0xsequence/utils@1.8.7 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof +- Updated dependencies + - @0xsequence/abi@1.8.6 + - @0xsequence/core@1.8.6 + - @0xsequence/utils@1.8.6 + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof +- Updated dependencies + - @0xsequence/abi@1.8.5 + - @0xsequence/core@1.8.5 + - @0xsequence/utils@1.8.5 + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list +- Updated dependencies + - @0xsequence/abi@1.8.4 + - @0xsequence/core@1.8.4 + - @0xsequence/utils@1.8.4 + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support +- Updated dependencies + - @0xsequence/abi@1.8.3 + - @0xsequence/core@1.8.3 + - @0xsequence/utils@1.8.3 + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested +- Updated dependencies + - @0xsequence/abi@1.8.2 + - @0xsequence/core@1.8.2 + - @0xsequence/utils@1.8.2 + +## 1.8.1 + +### Patch Changes + +- update to analytics provider +- Updated dependencies + - @0xsequence/abi@1.8.1 + - @0xsequence/core@1.8.1 + - @0xsequence/utils@1.8.1 + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.8.0 + - @0xsequence/core@1.8.0 + - @0xsequence/utils@1.8.0 + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.7.2 + - @0xsequence/core@1.7.2 + - @0xsequence/utils@1.7.2 + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI +- Updated dependencies + - @0xsequence/abi@1.7.1 + - @0xsequence/core@1.7.1 + - @0xsequence/utils@1.7.1 + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.7.0 + - @0xsequence/core@1.7.0 + - @0xsequence/utils@1.7.0 + +## 1.6.3 + +### Patch Changes + +- network list update +- Updated dependencies + - @0xsequence/abi@1.6.3 + - @0xsequence/core@1.6.3 + - @0xsequence/utils@1.6.3 + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.6.2 + - @0xsequence/core@1.6.2 + - @0xsequence/utils@1.6.2 + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.6.1 + - @0xsequence/core@1.6.1 + - @0xsequence/utils@1.6.1 + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.6.0 + - @0xsequence/core@1.6.0 + - @0xsequence/utils@1.6.0 + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.5.0 + - @0xsequence/core@1.5.0 + - @0xsequence/utils@1.5.0 + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata +- Updated dependencies + - @0xsequence/abi@1.4.9 + - @0xsequence/core@1.4.9 + - @0xsequence/utils@1.4.9 + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners +- Updated dependencies + - @0xsequence/abi@1.4.8 + - @0xsequence/core@1.4.8 + - @0xsequence/utils@1.4.8 + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings +- Updated dependencies + - @0xsequence/abi@1.4.7 + - @0xsequence/core@1.4.7 + - @0xsequence/utils@1.4.7 + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings +- Updated dependencies + - @0xsequence/abi@1.4.6 + - @0xsequence/core@1.4.6 + - @0xsequence/utils@1.4.6 + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.4.5 + - @0xsequence/core@1.4.5 + - @0xsequence/utils@1.4.5 + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.4.4 + - @0xsequence/core@1.4.4 + - @0xsequence/utils@1.4.4 + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods +- Updated dependencies + - @0xsequence/abi@1.4.3 + - @0xsequence/core@1.4.3 + - @0xsequence/utils@1.4.3 + +## 1.4.2 + +### Patch Changes + +- guard: update bindings +- Updated dependencies + - @0xsequence/abi@1.4.2 + - @0xsequence/core@1.4.2 + - @0xsequence/utils@1.4.2 + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.4.1 + - @0xsequence/core@1.4.1 + - @0xsequence/utils@1.4.1 + +## 1.4.0 + +### Minor Changes + +- project access key support + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.4.0 + - @0xsequence/core@1.4.0 + - @0xsequence/utils@1.4.0 + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.3.0 + - @0xsequence/core@1.3.0 + - @0xsequence/utils@1.3.0 + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.2.9 + - @0xsequence/core@1.2.9 + - @0xsequence/utils@1.2.9 + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key +- Updated dependencies + - @0xsequence/abi@1.2.8 + - @0xsequence/core@1.2.8 + - @0xsequence/utils@1.2.8 + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients +- Updated dependencies + - @0xsequence/abi@1.2.7 + - @0xsequence/core@1.2.7 + - @0xsequence/utils@1.2.7 + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider +- Updated dependencies + - @0xsequence/abi@1.2.6 + - @0xsequence/core@1.2.6 + - @0xsequence/utils@1.2.6 + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes +- Updated dependencies + - @0xsequence/abi@1.2.5 + - @0xsequence/core@1.2.5 + - @0xsequence/utils@1.2.5 + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.2.4 + - @0xsequence/core@1.2.4 + - @0xsequence/utils@1.2.4 + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce +- Updated dependencies + - @0xsequence/abi@1.2.3 + - @0xsequence/core@1.2.3 + - @0xsequence/utils@1.2.3 + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.2.2 + - @0xsequence/core@1.2.2 + - @0xsequence/utils@1.2.2 + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available +- Updated dependencies + - @0xsequence/abi@1.2.1 + - @0xsequence/core@1.2.1 + - @0xsequence/utils@1.2.1 + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.2.0 + - @0xsequence/core@1.2.0 + - @0xsequence/utils@1.2.0 + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering +- Updated dependencies + - @0xsequence/abi@1.1.15 + - @0xsequence/core@1.1.15 + - @0xsequence/utils@1.1.15 + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError +- Updated dependencies + - @0xsequence/abi@1.1.14 + - @0xsequence/core@1.1.14 + - @0xsequence/utils@1.1.14 + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.1.13 + - @0xsequence/core@1.1.13 + - @0xsequence/utils@1.1.13 + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions +- Updated dependencies + - @0xsequence/abi@1.1.12 + - @0xsequence/core@1.1.12 + - @0xsequence/utils@1.1.12 + +## 1.1.11 + +### Patch Changes + +- add homeverse configs +- Updated dependencies + - @0xsequence/abi@1.1.11 + - @0xsequence/core@1.1.11 + - @0xsequence/utils@1.1.11 + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send +- Updated dependencies + - @0xsequence/abi@1.1.10 + - @0xsequence/core@1.1.10 + - @0xsequence/utils@1.1.10 + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client +- Updated dependencies + - @0xsequence/abi@1.1.9 + - @0xsequence/core@1.1.9 + - @0xsequence/utils@1.1.9 + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter +- Updated dependencies + - @0xsequence/abi@1.1.8 + - @0xsequence/core@1.1.8 + - @0xsequence/utils@1.1.8 + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow +- Updated dependencies + - @0xsequence/abi@1.1.7 + - @0xsequence/core@1.1.7 + - @0xsequence/utils@1.1.7 + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters +- Updated dependencies + - @0xsequence/abi@1.1.6 + - @0xsequence/core@1.1.6 + - @0xsequence/utils@1.1.6 + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions +- Updated dependencies + - @0xsequence/abi@1.1.5 + - @0xsequence/core@1.1.5 + - @0xsequence/utils@1.1.5 + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.1.4 + - @0xsequence/core@1.1.4 + - @0xsequence/utils@1.1.4 + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.1.3 + - @0xsequence/core@1.1.3 + - @0xsequence/utils@1.1.3 + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes +- Updated dependencies + - @0xsequence/abi@1.1.2 + - @0xsequence/core@1.1.2 + - @0xsequence/utils@1.1.2 + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.1.1 + - @0xsequence/core@1.1.1 + - @0xsequence/utils@1.1.1 + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.1.0 + - @0xsequence/core@1.1.0 + - @0xsequence/utils@1.1.0 + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.0.5 + - @0xsequence/core@1.0.5 + - @0xsequence/utils@1.0.5 + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId +- Updated dependencies + - @0xsequence/abi@1.0.4 + - @0xsequence/core@1.0.4 + - @0xsequence/utils@1.0.4 + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers +- Updated dependencies + - @0xsequence/abi@1.0.3 + - @0xsequence/core@1.0.3 + - @0xsequence/utils@1.0.3 + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods +- Updated dependencies + - @0xsequence/abi@1.0.2 + - @0xsequence/core@1.0.2 + - @0xsequence/utils@1.0.2 + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet +- Updated dependencies + - @0xsequence/abi@1.0.1 + - @0xsequence/core@1.0.1 + - @0xsequence/utils@1.0.1 + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.0.0 + - @0xsequence/core@1.0.0 + - @0xsequence/utils@1.0.0 + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer +- Updated dependencies + - @0xsequence/abi@0.43.34 + - @0xsequence/config@0.43.34 + - @0xsequence/network@0.43.34 + - @0xsequence/transactions@0.43.34 + - @0xsequence/utils@0.43.34 + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler +- Updated dependencies + - @0xsequence/abi@0.43.33 + - @0xsequence/config@0.43.33 + - @0xsequence/network@0.43.33 + - @0xsequence/transactions@0.43.33 + - @0xsequence/utils@0.43.33 + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network +- Updated dependencies + - @0xsequence/abi@0.43.32 + - @0xsequence/config@0.43.32 + - @0xsequence/network@0.43.32 + - @0xsequence/transactions@0.43.32 + - @0xsequence/utils@0.43.32 + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect +- Updated dependencies + - @0xsequence/abi@0.43.31 + - @0xsequence/config@0.43.31 + - @0xsequence/network@0.43.31 + - @0xsequence/transactions@0.43.31 + - @0xsequence/utils@0.43.31 + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet +- Updated dependencies + - @0xsequence/abi@0.43.30 + - @0xsequence/config@0.43.30 + - @0xsequence/network@0.43.30 + - @0xsequence/transactions@0.43.30 + - @0xsequence/utils@0.43.30 + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object +- Updated dependencies + - @0xsequence/abi@0.43.29 + - @0xsequence/config@0.43.29 + - @0xsequence/network@0.43.29 + - @0xsequence/transactions@0.43.29 + - @0xsequence/utils@0.43.29 + +## 0.43.28 + +### Patch Changes + +- update api bindings +- Updated dependencies + - @0xsequence/abi@0.43.28 + - @0xsequence/config@0.43.28 + - @0xsequence/network@0.43.28 + - @0xsequence/transactions@0.43.28 + - @0xsequence/utils@0.43.28 + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method +- Updated dependencies + - @0xsequence/abi@0.43.27 + - @0xsequence/config@0.43.27 + - @0xsequence/network@0.43.27 + - @0xsequence/transactions@0.43.27 + - @0xsequence/utils@0.43.27 + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum +- Updated dependencies + - @0xsequence/abi@0.43.26 + - @0xsequence/config@0.43.26 + - @0xsequence/network@0.43.26 + - @0xsequence/transactions@0.43.26 + - @0xsequence/utils@0.43.26 + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks +- Updated dependencies + - @0xsequence/abi@0.43.25 + - @0xsequence/config@0.43.25 + - @0xsequence/network@0.43.25 + - @0xsequence/transactions@0.43.25 + - @0xsequence/utils@0.43.25 + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm +- Updated dependencies + - @0xsequence/abi@0.43.24 + - @0xsequence/config@0.43.24 + - @0xsequence/network@0.43.24 + - @0xsequence/transactions@0.43.24 + - @0xsequence/utils@0.43.24 + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM +- Updated dependencies + - @0xsequence/abi@0.43.23 + - @0xsequence/config@0.43.23 + - @0xsequence/network@0.43.23 + - @0xsequence/transactions@0.43.23 + - @0xsequence/utils@0.43.23 + +## 0.43.22 + +### Patch Changes + +- add zkevm chain +- Updated dependencies + - @0xsequence/abi@0.43.22 + - @0xsequence/config@0.43.22 + - @0xsequence/network@0.43.22 + - @0xsequence/transactions@0.43.22 + - @0xsequence/utils@0.43.22 + +## 0.43.21 + +### Patch Changes + +- api: update client bindings +- Updated dependencies + - @0xsequence/abi@0.43.21 + - @0xsequence/config@0.43.21 + - @0xsequence/network@0.43.21 + - @0xsequence/transactions@0.43.21 + - @0xsequence/utils@0.43.21 + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings +- Updated dependencies + - @0xsequence/abi@0.43.20 + - @0xsequence/config@0.43.20 + - @0xsequence/network@0.43.20 + - @0xsequence/transactions@0.43.20 + - @0xsequence/utils@0.43.20 + +## 0.43.19 + +### Patch Changes + +- session proof update +- Updated dependencies + - @0xsequence/abi@0.43.19 + - @0xsequence/config@0.43.19 + - @0xsequence/network@0.43.19 + - @0xsequence/transactions@0.43.19 + - @0xsequence/utils@0.43.19 + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening +- Updated dependencies + - @0xsequence/abi@0.43.18 + - @0xsequence/config@0.43.18 + - @0xsequence/network@0.43.18 + - @0xsequence/transactions@0.43.18 + - @0xsequence/utils@0.43.18 + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined +- Updated dependencies + - @0xsequence/abi@0.43.17 + - @0xsequence/config@0.43.17 + - @0xsequence/network@0.43.17 + - @0xsequence/transactions@0.43.17 + - @0xsequence/utils@0.43.17 + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use +- Updated dependencies + - @0xsequence/abi@0.43.16 + - @0xsequence/config@0.43.16 + - @0xsequence/network@0.43.16 + - @0xsequence/transactions@0.43.16 + - @0xsequence/utils@0.43.16 + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods +- Updated dependencies + - @0xsequence/abi@0.43.15 + - @0xsequence/config@0.43.15 + - @0xsequence/network@0.43.15 + - @0xsequence/transactions@0.43.15 + - @0xsequence/utils@0.43.15 + +## 0.43.14 + +### Patch Changes + +- bump +- Updated dependencies + - @0xsequence/abi@0.43.14 + - @0xsequence/config@0.43.14 + - @0xsequence/network@0.43.14 + - @0xsequence/transactions@0.43.14 + - @0xsequence/utils@0.43.14 + +## 0.43.13 + +### Patch Changes + +- update rpc bindings +- Updated dependencies + - @0xsequence/abi@0.43.13 + - @0xsequence/config@0.43.13 + - @0xsequence/network@0.43.13 + - @0xsequence/transactions@0.43.13 + - @0xsequence/utils@0.43.13 + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method +- Updated dependencies + - @0xsequence/abi@0.43.12 + - @0xsequence/config@0.43.12 + - @0xsequence/network@0.43.12 + - @0xsequence/transactions@0.43.12 + - @0xsequence/utils@0.43.12 + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.43.11 + - @0xsequence/config@0.43.11 + - @0xsequence/network@0.43.11 + - @0xsequence/transactions@0.43.11 + - @0xsequence/utils@0.43.11 + +## 0.43.10 + +### Patch Changes + +- various improvements +- Updated dependencies + - @0xsequence/abi@0.43.10 + - @0xsequence/config@0.43.10 + - @0xsequence/network@0.43.10 + - @0xsequence/transactions@0.43.10 + - @0xsequence/utils@0.43.10 + +## 0.43.9 + +### Patch Changes + +- update deps +- Updated dependencies + - @0xsequence/abi@0.43.9 + - @0xsequence/config@0.43.9 + - @0xsequence/network@0.43.9 + - @0xsequence/transactions@0.43.9 + - @0xsequence/utils@0.43.9 + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching +- Updated dependencies + - @0xsequence/abi@0.43.8 + - @0xsequence/config@0.43.8 + - @0xsequence/network@0.43.8 + - @0xsequence/transactions@0.43.8 + - @0xsequence/utils@0.43.8 + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init +- Updated dependencies + - @0xsequence/abi@0.43.7 + - @0xsequence/config@0.43.7 + - @0xsequence/transactions@0.43.7 + - @0xsequence/utils@0.43.7 + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings +- Updated dependencies + - @0xsequence/abi@0.43.6 + - @0xsequence/config@0.43.6 + - @0xsequence/transactions@0.43.6 + - @0xsequence/utils@0.43.6 + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.43.5 + - @0xsequence/config@0.43.5 + - @0xsequence/transactions@0.43.5 + - @0xsequence/utils@0.43.5 + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build +- Updated dependencies + - @0xsequence/abi@0.43.4 + - @0xsequence/config@0.43.4 + - @0xsequence/transactions@0.43.4 + - @0xsequence/utils@0.43.4 + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/abi@0.43.3 + - @0xsequence/config@0.43.3 + - @0xsequence/transactions@0.43.3 + - @0xsequence/utils@0.43.3 + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked +- Updated dependencies + - @0xsequence/abi@0.43.2 + - @0xsequence/config@0.43.2 + - @0xsequence/transactions@0.43.2 + - @0xsequence/utils@0.43.2 + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep +- Updated dependencies + - @0xsequence/abi@0.43.1 + - @0xsequence/config@0.43.1 + - @0xsequence/transactions@0.43.1 + - @0xsequence/utils@0.43.1 + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.43.0 + - @0xsequence/config@0.43.0 + - @0xsequence/transactions@0.43.0 + - @0xsequence/utils@0.43.0 + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider +- Updated dependencies + - @0xsequence/abi@0.42.10 + - @0xsequence/config@0.42.10 + - @0xsequence/transactions@0.42.10 + - @0xsequence/utils@0.42.10 + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions +- Updated dependencies + - @0xsequence/abi@0.42.9 + - @0xsequence/config@0.42.9 + - @0xsequence/transactions@0.42.9 + - @0xsequence/utils@0.42.9 + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin +- Updated dependencies + - @0xsequence/abi@0.42.8 + - @0xsequence/config@0.42.8 + - @0xsequence/transactions@0.42.8 + - @0xsequence/utils@0.42.8 + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings +- Updated dependencies + - @0xsequence/abi@0.42.7 + - @0xsequence/config@0.42.7 + - @0xsequence/transactions@0.42.7 + - @0xsequence/utils@0.42.7 + +## 0.42.6 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/abi@0.42.6 + - @0xsequence/config@0.42.6 + - @0xsequence/transactions@0.42.6 + - @0xsequence/utils@0.42.6 + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure +- Updated dependencies + - @0xsequence/abi@0.42.5 + - @0xsequence/config@0.42.5 + - @0xsequence/transactions@0.42.5 + - @0xsequence/utils@0.42.5 + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options +- Updated dependencies + - @0xsequence/abi@0.42.4 + - @0xsequence/config@0.42.4 + - @0xsequence/transactions@0.42.4 + - @0xsequence/utils@0.42.4 + +## 0.42.3 + +### Patch Changes + +- update api bindings +- Updated dependencies + - @0xsequence/abi@0.42.3 + - @0xsequence/config@0.42.3 + - @0xsequence/transactions@0.42.3 + - @0xsequence/utils@0.42.3 + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network +- Updated dependencies + - @0xsequence/abi@0.42.2 + - @0xsequence/config@0.42.2 + - @0xsequence/transactions@0.42.2 + - @0xsequence/utils@0.42.2 + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter +- Updated dependencies + - @0xsequence/abi@0.42.1 + - @0xsequence/config@0.42.1 + - @0xsequence/transactions@0.42.1 + - @0xsequence/utils@0.42.1 + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.42.0 + - @0xsequence/config@0.42.0 + - @0xsequence/transactions@0.42.0 + - @0xsequence/utils@0.42.0 + +## 0.41.3 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/abi@0.41.3 + - @0xsequence/config@0.41.3 + - @0xsequence/transactions@0.41.3 + - @0xsequence/utils@0.41.3 + +## 0.41.2 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/abi@0.41.2 + - @0xsequence/config@0.41.2 + - @0xsequence/transactions@0.41.2 + - @0xsequence/utils@0.41.2 + +## 0.41.1 + +### Patch Changes + +- update default networks +- Updated dependencies + - @0xsequence/abi@0.41.1 + - @0xsequence/config@0.41.1 + - @0xsequence/transactions@0.41.1 + - @0xsequence/utils@0.41.1 + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.41.0 + - @0xsequence/config@0.41.0 + - @0xsequence/transactions@0.41.0 + - @0xsequence/utils@0.41.0 + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain +- Updated dependencies + - @0xsequence/abi@0.40.6 + - @0xsequence/config@0.40.6 + - @0xsequence/transactions@0.40.6 + - @0xsequence/utils@0.40.6 + +## 0.40.5 + +### Patch Changes + +- api: update bindings +- Updated dependencies + - @0xsequence/abi@0.40.5 + - @0xsequence/config@0.40.5 + - @0xsequence/transactions@0.40.5 + - @0xsequence/utils@0.40.5 + +## 0.40.4 + +### Patch Changes + +- add unreal transport +- Updated dependencies + - @0xsequence/abi@0.40.4 + - @0xsequence/config@0.40.4 + - @0xsequence/transactions@0.40.4 + - @0xsequence/utils@0.40.4 + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type +- Updated dependencies + - @0xsequence/abi@0.40.3 + - @0xsequence/config@0.40.3 + - @0xsequence/transactions@0.40.3 + - @0xsequence/utils@0.40.3 + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method +- Updated dependencies + - @0xsequence/abi@0.40.2 + - @0xsequence/config@0.40.2 + - @0xsequence/transactions@0.40.2 + - @0xsequence/utils@0.40.2 + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet +- Updated dependencies + - @0xsequence/abi@0.40.1 + - @0xsequence/config@0.40.1 + - @0xsequence/transactions@0.40.1 + - @0xsequence/utils@0.40.1 + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.40.0 + - @0xsequence/config@0.40.0 + - @0xsequence/transactions@0.40.0 + - @0xsequence/utils@0.40.0 + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings +- Updated dependencies + - @0xsequence/abi@0.39.6 + - @0xsequence/config@0.39.6 + - @0xsequence/transactions@0.39.6 + - @0xsequence/utils@0.39.6 + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option +- Updated dependencies + - @0xsequence/abi@0.39.5 + - @0xsequence/config@0.39.5 + - @0xsequence/transactions@0.39.5 + - @0xsequence/utils@0.39.5 + +## 0.39.4 + +### Patch Changes + +- api: update client bindings +- Updated dependencies + - @0xsequence/abi@0.39.4 + - @0xsequence/config@0.39.4 + - @0xsequence/transactions@0.39.4 + - @0xsequence/utils@0.39.4 + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider +- Updated dependencies + - @0xsequence/abi@0.39.3 + - @0xsequence/config@0.39.3 + - @0xsequence/transactions@0.39.3 + - @0xsequence/utils@0.39.3 + +## 0.39.2 + +### Patch Changes + +- update umd name +- Updated dependencies + - @0xsequence/abi@0.39.2 + - @0xsequence/config@0.39.2 + - @0xsequence/transactions@0.39.2 + - @0xsequence/utils@0.39.2 + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.39.1 + - @0xsequence/config@0.39.1 + - @0xsequence/transactions@0.39.1 + - @0xsequence/utils@0.39.1 + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.39.0 + - @0xsequence/config@0.39.0 + - @0xsequence/transactions@0.39.0 + - @0xsequence/utils@0.39.0 + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount +- Updated dependencies + - @0xsequence/abi@0.38.2 + - @0xsequence/config@0.38.2 + - @0xsequence/transactions@0.38.2 + - @0xsequence/utils@0.38.2 + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings +- Updated dependencies + - @0xsequence/abi@0.38.1 + - @0xsequence/config@0.38.1 + - @0xsequence/transactions@0.38.1 + - @0xsequence/utils@0.38.1 + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +### Patch Changes + +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.38.0 + - @0xsequence/config@0.38.0 + - @0xsequence/transactions@0.38.0 + - @0xsequence/utils@0.38.0 + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. +- Updated dependencies + - @0xsequence/abi@0.37.1 + - @0xsequence/config@0.37.1 + - @0xsequence/transactions@0.37.1 + - @0xsequence/utils@0.37.1 + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +### Patch Changes + +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.37.0 + - @0xsequence/config@0.37.0 + - @0xsequence/transactions@0.37.0 + - @0xsequence/utils@0.37.0 + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints +- Updated dependencies + - @0xsequence/abi@0.36.13 + - @0xsequence/config@0.36.13 + - @0xsequence/transactions@0.36.13 + - @0xsequence/utils@0.36.13 + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.36.12 + - @0xsequence/config@0.36.12 + - @0xsequence/transactions@0.36.12 + - @0xsequence/utils@0.36.12 + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler +- Updated dependencies + - @0xsequence/abi@0.36.11 + - @0xsequence/config@0.36.11 + - @0xsequence/transactions@0.36.11 + - @0xsequence/utils@0.36.11 + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect +- Updated dependencies + - @0xsequence/abi@0.36.10 + - @0xsequence/config@0.36.10 + - @0xsequence/transactions@0.36.10 + - @0xsequence/utils@0.36.10 + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements +- Updated dependencies + - @0xsequence/abi@0.36.9 + - @0xsequence/config@0.36.9 + - @0xsequence/transactions@0.36.9 + - @0xsequence/utils@0.36.9 + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) +- Updated dependencies + - @0xsequence/abi@0.36.8 + - @0xsequence/config@0.36.8 + - @0xsequence/transactions@0.36.8 + - @0xsequence/utils@0.36.8 + +## 0.36.7 + +### Patch Changes + +- fix missing break +- Updated dependencies + - @0xsequence/abi@0.36.7 + - @0xsequence/config@0.36.7 + - @0xsequence/transactions@0.36.7 + - @0xsequence/utils@0.36.7 + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support +- Updated dependencies + - @0xsequence/abi@0.36.6 + - @0xsequence/config@0.36.6 + - @0xsequence/transactions@0.36.6 + - @0xsequence/utils@0.36.6 + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit +- Updated dependencies + - @0xsequence/abi@0.36.5 + - @0xsequence/config@0.36.5 + - @0xsequence/transactions@0.36.5 + - @0xsequence/utils@0.36.5 + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains +- Updated dependencies + - @0xsequence/abi@0.36.4 + - @0xsequence/config@0.36.4 + - @0xsequence/transactions@0.36.4 + - @0xsequence/utils@0.36.4 + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods +- Updated dependencies + - @0xsequence/abi@0.36.3 + - @0xsequence/config@0.36.3 + - @0xsequence/transactions@0.36.3 + - @0xsequence/utils@0.36.3 + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode +- Updated dependencies + - @0xsequence/abi@0.36.2 + - @0xsequence/config@0.36.2 + - @0xsequence/transactions@0.36.2 + - @0xsequence/utils@0.36.2 + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields +- Updated dependencies + - @0xsequence/abi@0.36.1 + - @0xsequence/config@0.36.1 + - @0xsequence/transactions@0.36.1 + - @0xsequence/utils@0.36.1 + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.36.0 + - @0xsequence/config@0.36.0 + - @0xsequence/transactions@0.36.0 + - @0xsequence/utils@0.36.0 + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils +- Updated dependencies + - @0xsequence/abi@0.35.12 + - @0xsequence/config@0.35.12 + - @0xsequence/transactions@0.35.12 + - @0xsequence/utils@0.35.12 + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation +- Updated dependencies + - @0xsequence/abi@0.35.11 + - @0xsequence/config@0.35.11 + - @0xsequence/transactions@0.35.11 + - @0xsequence/utils@0.35.11 + +## 0.35.10 + +### Patch Changes + +- upgrade deps +- Updated dependencies + - @0xsequence/abi@0.35.10 + - @0xsequence/config@0.35.10 + - @0xsequence/transactions@0.35.10 + - @0xsequence/utils@0.35.10 + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance +- Updated dependencies + - @0xsequence/abi@0.35.9 + - @0xsequence/config@0.35.9 + - @0xsequence/transactions@0.35.9 + - @0xsequence/utils@0.35.9 + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements +- Updated dependencies + - @0xsequence/abi@0.35.8 + - @0xsequence/config@0.35.8 + - @0xsequence/transactions@0.35.8 + - @0xsequence/utils@0.35.8 + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs +- Updated dependencies + - @0xsequence/abi@0.35.7 + - @0xsequence/config@0.35.7 + - @0xsequence/transactions@0.35.7 + - @0xsequence/utils@0.35.7 + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler +- Updated dependencies + - @0xsequence/abi@0.35.6 + - @0xsequence/config@0.35.6 + - @0xsequence/transactions@0.35.6 + - @0xsequence/utils@0.35.6 + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation +- Updated dependencies + - @0xsequence/abi@0.35.5 + - @0xsequence/config@0.35.5 + - @0xsequence/transactions@0.35.5 + - @0xsequence/utils@0.35.5 + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window +- Updated dependencies + - @0xsequence/abi@0.35.4 + - @0xsequence/config@0.35.4 + - @0xsequence/transactions@0.35.4 + - @0xsequence/utils@0.35.4 + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode +- Updated dependencies + - @0xsequence/abi@0.35.3 + - @0xsequence/config@0.35.3 + - @0xsequence/transactions@0.35.3 + - @0xsequence/utils@0.35.3 + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref +- Updated dependencies + - @0xsequence/abi@0.35.2 + - @0xsequence/config@0.35.2 + - @0xsequence/transactions@0.35.2 + - @0xsequence/utils@0.35.2 + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too +- Updated dependencies + - @0xsequence/abi@0.35.1 + - @0xsequence/config@0.35.1 + - @0xsequence/transactions@0.35.1 + - @0xsequence/utils@0.35.1 + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.35.0 + - @0xsequence/config@0.35.0 + - @0xsequence/transactions@0.35.0 + - @0xsequence/utils@0.35.0 + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.34.0 + - @0xsequence/config@0.34.0 + - @0xsequence/transactions@0.34.0 + - @0xsequence/utils@0.34.0 + +## 0.33.2 + +### Patch Changes + +- Updated dependencies + - @0xsequence/transactions@0.33.2 + +## 0.31.1 + +### Patch Changes + +- relayer: add Relayer.simulate + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.31.0 + - @0xsequence/config@0.31.0 + - @0xsequence/transactions@0.31.0 + - @0xsequence/utils@0.31.0 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.30.0 + - @0xsequence/config@0.30.0 + - @0xsequence/transactions@0.30.0 + - @0xsequence/utils@0.30.0 + +## 0.29.8 + +### Patch Changes + +- update api +- Updated dependencies [undefined] + - @0xsequence/abi@0.29.8 + - @0xsequence/config@0.29.8 + - @0xsequence/transactions@0.29.8 + - @0xsequence/utils@0.29.8 + +## 0.29.6 + +### Patch Changes + +- @0xsequence/config@0.29.6 +- @0xsequence/transactions@0.29.6 + +## 0.29.5 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/config@0.29.5 + +## 0.29.2 + +### Patch Changes + +- relayer: don't pass nonce to GetMetaTxnNetworkFeeOptions + +## 0.29.0 + +### Minor Changes + +- major architectural changes in Sequence design + + - only one API instance, API is no longer a per-chain service + - separate per-chain indexer service, API no longer handles indexing + - single contract metadata service, API no longer serves metadata + + chaind package has been removed, indexer and metadata packages have been added + + stronger typing with new explicit ChainId type + + multicall fixes and improvements + + forbid "wait" transactions in sendTransactionBatch calls + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/config@0.29.0 + - @0xsequence/transactions@0.29.0 + - @0xsequence/abi@0.29.0 + - @0xsequence/utils@0.29.0 + +## 0.28.0 + +### Minor Changes + +- extension provider + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.28.0 + - @0xsequence/chaind@0.28.0 + - @0xsequence/config@0.28.0 + - @0xsequence/transactions@0.28.0 + - @0xsequence/utils@0.28.0 + +## 0.27.1 + +### Patch Changes + +- fix waitReceipt polling logic + +## 0.27.0 + +### Minor Changes + +- Add requireFreshSigner lib to sessions + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.27.0 + - @0xsequence/chaind@0.27.0 + - @0xsequence/config@0.27.0 + - @0xsequence/transactions@0.27.0 + - @0xsequence/utils@0.27.0 + +## 0.26.0 + +### Minor Changes + +- update relayer client bindings + provide the wallet's address for calls to SendMetaTxn + modify the semantics of Relayer.getNonce() to allow relayers to select nonce spaces for clients + +## 0.25.1 + +### Patch Changes + +- Fix build typescrypt issue +- Updated dependencies [undefined] + - @0xsequence/abi@0.25.1 + - @0xsequence/chaind@0.25.1 + - @0xsequence/config@0.25.1 + - @0xsequence/transactions@0.25.1 + - @0xsequence/utils@0.25.1 + +## 0.25.0 + +### Minor Changes + +- 10c8af8: Add estimator package + Fix multicall few calls bug + +### Patch Changes + +- Updated dependencies [10c8af8] + - @0xsequence/abi@0.25.0 + - @0xsequence/chaind@0.25.0 + - @0xsequence/config@0.25.0 + - @0xsequence/transactions@0.25.0 + - @0xsequence/utils@0.25.0 + +## 0.24.1 + +### Patch Changes + +- relayer: wait for queued status instead of unknown + +## 0.24.0 + +### Minor Changes + +- pass wallet config and nonce to GetMetaTxnNetworkFeeOptions + +## 0.23.0 + +### Minor Changes + +- - relayer: offer variety of gas fee options from the relayer service" + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.23.0 + - @0xsequence/chaind@0.23.0 + - @0xsequence/config@0.23.0 + - @0xsequence/transactions@0.23.0 + - @0xsequence/utils@0.23.0 + +## 0.22.2 + +### Patch Changes + +- e1c109e: Fix authProof on expired sessions +- Updated dependencies [e1c109e] + - @0xsequence/abi@0.22.2 + - @0xsequence/chaind@0.22.2 + - @0xsequence/config@0.22.2 + - @0xsequence/transactions@0.22.2 + - @0xsequence/utils@0.22.2 + +## 0.22.1 + +### Patch Changes + +- transport session cache +- Updated dependencies [undefined] + - @0xsequence/abi@0.22.1 + - @0xsequence/chaind@0.22.1 + - @0xsequence/config@0.22.1 + - @0xsequence/transactions@0.22.1 + - @0xsequence/utils@0.22.1 + +## 0.22.0 + +### Minor Changes + +- e667b65: Expose all relayer options on networks + +### Patch Changes + +- Updated dependencies [e667b65] + - @0xsequence/abi@0.22.0 + - @0xsequence/utils@0.22.0 + - @0xsequence/chaind@0.22.0 + - @0xsequence/config@0.22.0 + - @0xsequence/transactions@0.22.0 + +## 0.21.5 + +### Patch Changes + +- Give priority to metaTxnId returned by relayer +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.5 + - @0xsequence/chaind@0.21.5 + - @0xsequence/config@0.21.5 + - @0xsequence/transactions@0.21.5 + - @0xsequence/utils@0.21.5 + +## 0.21.4 + +### Patch Changes + +- Add has enough signers method +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.4 + - @0xsequence/chaind@0.21.4 + - @0xsequence/config@0.21.4 + - @0xsequence/transactions@0.21.4 + - @0xsequence/utils@0.21.4 + +## 0.21.3 + +### Patch Changes + +- add window session cache +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.3 + - @0xsequence/chaind@0.21.3 + - @0xsequence/config@0.21.3 + - @0xsequence/transactions@0.21.3 + - @0xsequence/utils@0.21.3 + +## 0.21.2 + +### Patch Changes + +- exception handlind in relayer +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.2 + - @0xsequence/chaind@0.21.2 + - @0xsequence/config@0.21.2 + - @0xsequence/transactions@0.21.2 + - @0xsequence/utils@0.21.2 + +## 0.21.0 + +### Minor Changes + +- - fix gas estimation on wallets with large number of signers + - update to session handling and wallet config construction upon auth + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.0 + - @0xsequence/chaind@0.21.0 + - @0xsequence/config@0.21.0 + - @0xsequence/transactions@0.21.0 + - @0xsequence/utils@0.21.0 + +## 0.19.3 + +### Patch Changes + +- jwtAuth visibility, package version sync +- Updated dependencies [undefined] + - @0xsequence/abi@0.19.3 + - @0xsequence/chaind@0.19.3 + - @0xsequence/config@0.19.3 + - @0xsequence/transactions@0.19.3 + - @0xsequence/utils@0.19.3 + +## 0.19.2 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.19.2 + - @0xsequence/config@0.19.2 + - @0xsequence/transactions@0.19.2 + +## 0.19.0 + +### Minor Changes + +- - provider, improve dapp / wallet transport io + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.19.0 + - @0xsequence/chaind@0.19.0 + - @0xsequence/config@0.19.0 + - @0xsequence/transactions@0.19.0 + - @0xsequence/utils@0.19.0 + +## 0.18.0 + +### Minor Changes + +- relayer improvements and pending transaction handling + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.18.0 + - @0xsequence/chaind@0.18.0 + - @0xsequence/config@0.18.0 + - @0xsequence/transactions@0.18.0 + - @0xsequence/utils@0.18.0 + +## 0.16.0 + +### Minor Changes + +- relayer as its own service separate from chaind + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.16.0 + - @0xsequence/chaind@0.16.0 + - @0xsequence/config@0.16.0 + - @0xsequence/transactions@0.16.0 + - @0xsequence/utils@0.16.0 + +## 0.15.1 + +### Patch Changes + +- update api clients +- Updated dependencies [undefined] + - @0xsequence/abi@0.15.1 + - @0xsequence/chaind@0.15.1 + - @0xsequence/config@0.15.1 + - @0xsequence/transactions@0.15.1 + - @0xsequence/utils@0.15.1 + +## 0.15.0 + +### Minor Changes + +- - update chaind and api bindings + - replace EstimateMetaTxnGasReceipt with UpdateMetaTxnGasLimits and GetMetaTxnNetworkFeeOptions + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/chaind@0.15.0 + - @0xsequence/transactions@0.15.0 + +## 0.14.3 + +### Patch Changes + +- Fix 0xSequence relayer dependencies +- Updated dependencies [undefined] + - @0xsequence/abi@0.14.3 + - @0xsequence/chaind@0.14.3 + - @0xsequence/config@0.14.3 + - @0xsequence/transactions@0.14.3 + - @0xsequence/utils@0.14.3 + +## 0.14.2 + +### Patch Changes + +- Add debug logs to rpc-relayer +- Updated dependencies [undefined] + - @0xsequence/abi@0.14.2 + - @0xsequence/chaind@0.14.2 + - @0xsequence/config@0.14.2 + - @0xsequence/transactions@0.14.2 + +## 0.14.0 + +### Minor Changes + +- update sequence utils finder which includes optimization + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.14.0 + - @0xsequence/chaind@0.14.0 + - @0xsequence/config@0.14.0 + - @0xsequence/transactions@0.14.0 + +## 0.13.0 + +### Minor Changes + +- Update SequenceUtils deployed contract + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.13.0 + - @0xsequence/chaind@0.13.0 + - @0xsequence/config@0.13.0 + - @0xsequence/transactions@0.13.0 + +## 0.12.1 + +### Patch Changes + +- npm bump +- Updated dependencies [undefined] + - @0xsequence/abi@0.12.1 + - @0xsequence/chaind@0.12.1 + - @0xsequence/config@0.12.1 + - @0xsequence/transactions@0.12.1 + +## 0.12.0 + +### Minor Changes + +- provider: improvements to window transport + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.12.0 + - @0xsequence/chaind@0.12.0 + - @0xsequence/config@0.12.0 + - @0xsequence/transactions@0.12.0 + +## 0.11.4 + +### Patch Changes + +- update api client +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.4 + - @0xsequence/chaind@0.11.4 + - @0xsequence/config@0.11.4 + - @0xsequence/transactions@0.11.4 + +## 0.11.3 + +### Patch Changes + +- improve openWindow state options handling +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.3 + - @0xsequence/chaind@0.11.3 + - @0xsequence/config@0.11.3 + - @0xsequence/transactions@0.11.3 + +## 0.11.2 + +### Patch Changes + +- Fix multicall proxy scopes +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.2 + - @0xsequence/chaind@0.11.2 + - @0xsequence/config@0.11.2 + - @0xsequence/transactions@0.11.2 + +## 0.11.1 + +### Patch Changes + +- Add support for dynamic and nested signatures +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.1 + - @0xsequence/chaind@0.11.1 + - @0xsequence/config@0.11.1 + - @0xsequence/transactions@0.11.1 + +## 0.11.0 + +### Minor Changes + +- Update wallet context to 1.7 contracts + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.0 + - @0xsequence/chaind@0.11.0 + - @0xsequence/config@0.11.0 + - @0xsequence/transactions@0.11.0 + +## 0.10.9 + +### Patch Changes + +- add support for public addresses as signers in session.open +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.9 + - @0xsequence/chaind@0.10.9 + - @0xsequence/config@0.10.9 + - @0xsequence/transactions@0.10.9 + +## 0.10.8 + +### Patch Changes + +- Multicall production configuration +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.8 + - @0xsequence/chaind@0.10.8 + - @0xsequence/config@0.10.8 + - @0xsequence/transactions@0.10.8 + +## 0.10.7 + +### Patch Changes + +- allow provider transport to force disconnect +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.7 + - @0xsequence/chaind@0.10.7 + - @0xsequence/config@0.10.7 + - @0xsequence/transactions@0.10.7 + +## 0.10.6 + +### Patch Changes + +- - fix getWalletState method +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.6 + - @0xsequence/chaind@0.10.6 + - @0xsequence/config@0.10.6 + - @0xsequence/transactions@0.10.6 + +## 0.10.5 + +### Patch Changes + +- update relayer gas refund options +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.5 + - @0xsequence/chaind@0.10.5 + - @0xsequence/config@0.10.5 + - @0xsequence/transactions@0.10.5 + +## 0.10.4 + +### Patch Changes + +- Update api proto +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.4 + - @0xsequence/chaind@0.10.4 + - @0xsequence/config@0.10.4 + - @0xsequence/transactions@0.10.4 + +## 0.10.3 + +### Patch Changes + +- Fix loading config cross-chain +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.3 + - @0xsequence/chaind@0.10.3 + - @0xsequence/config@0.10.3 + - @0xsequence/transactions@0.10.3 + +## 0.10.2 + +### Patch Changes + +- - message digest fix +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.2 + - @0xsequence/chaind@0.10.2 + - @0xsequence/config@0.10.2 + - @0xsequence/transactions@0.10.2 + +## 0.10.1 + +### Patch Changes + +- upgrade deps +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.1 + - @0xsequence/chaind@0.10.1 + - @0xsequence/config@0.10.1 + - @0xsequence/transactions@0.10.1 + +## 0.10.0 + +### Minor Changes + +- Deployed new contracts with ERC1271 signer support + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.0 + - @0xsequence/chaind@0.10.0 + - @0xsequence/config@0.10.0 + - @0xsequence/transactions@0.10.0 + +## 0.9.6 + +### Patch Changes + +- Update ABIs for latest sequence contracts +- Updated dependencies [undefined] + - @0xsequence/config@0.9.6 + - @0xsequence/transactions@0.9.6 + - @0xsequence/abi@0.9.6 + - @0xsequence/chaind@0.9.6 + +## 0.9.5 + +### Patch Changes + +- Implemented session class +- Updated dependencies [undefined] + - @0xsequence/config@0.9.5 + - @0xsequence/transactions@0.9.5 + +## 0.9.3 + +### Patch Changes + +- - minor improvements +- Updated dependencies [undefined] + - @0xsequence/abi@0.9.3 + - @0xsequence/chaind@0.9.3 + - @0xsequence/config@0.9.3 + - @0xsequence/transactions@0.9.3 + +## 0.9.1 + +### Patch Changes + +- - patch bump +- Updated dependencies [undefined] + - @0xsequence/abi@0.9.1 + - @0xsequence/chaind@0.9.1 + - @0xsequence/config@0.9.1 + - @0xsequence/transactions@0.9.1 + +## 0.9.0 + +### Minor Changes + +- - provider transport hardening + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.9.0 + - @0xsequence/chaind@0.9.0 + - @0xsequence/config@0.9.0 + - @0xsequence/transactions@0.9.0 + +## 0.8.5 + +### Patch Changes + +- - use latest wallet-contracts +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.5 + - @0xsequence/chaind@0.8.5 + - @0xsequence/config@0.8.5 + - @0xsequence/transactions@0.8.5 + +## 0.8.4 + +### Patch Changes + +- - minor improvements, name updates and comments +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.4 + - @0xsequence/chaind@0.8.4 + - @0xsequence/config@0.8.4 + - @0xsequence/transactions@0.8.4 + +## 0.8.3 + +### Patch Changes + +- - refinements + + - normalize signer address in config + + - provider: getWalletState() method to WalletProvider + +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.3 + - @0xsequence/chaind@0.8.3 + - @0xsequence/config@0.8.3 + - @0xsequence/transactions@0.8.3 + +## 0.8.2 + +### Patch Changes + +- - field rename and ethauth dependency bump +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.2 + - @0xsequence/chaind@0.8.2 + - @0xsequence/config@0.8.2 + - @0xsequence/transactions@0.8.2 + +## 0.8.1 + +### Patch Changes + +- - variety of optimizations +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.1 + - @0xsequence/chaind@0.8.1 + - @0xsequence/config@0.8.1 + - @0xsequence/transactions@0.8.1 + +## 0.8.0 + +### Minor Changes + +- - changeset fix + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.0 + - @0xsequence/chaind@0.8.0 + - @0xsequence/config@0.8.0 + - @0xsequence/transactions@0.8.0 + +## 0.7.1 + +### Patch Changes + +- 02377ab: Minor improvements + +## 0.7.0 + +### Patch Changes + +- 6f11ed7: sequence.js, init release +- Updated dependencies [6f11ed7] + - @0xsequence/abi@0.7.0 + - @0xsequence/chaind@0.7.0 + - @0xsequence/config@0.7.0 + - @0xsequence/transactions@0.7.0 diff --git a/packages/relayer/README.md b/packages/relayer/README.md new file mode 100644 index 000000000..71c808fd0 --- /dev/null +++ b/packages/relayer/README.md @@ -0,0 +1,4 @@ +@0xsequence/relayer +=================== + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/relayer/hardhat.config.js b/packages/relayer/hardhat.config.js new file mode 100644 index 000000000..eaca50531 --- /dev/null +++ b/packages/relayer/hardhat.config.js @@ -0,0 +1,15 @@ +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: '0.7.6', + + networks: { + hardhat: { + chainId: 31337, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + } + } + } +} diff --git a/packages/relayer/src/index.ts b/packages/relayer/src/index.ts new file mode 100644 index 000000000..f771369bb --- /dev/null +++ b/packages/relayer/src/index.ts @@ -0,0 +1,86 @@ +import { ethers, providers } from 'ethers' +import { proto } from './rpc-relayer' + +import { commons } from '@0xsequence/core' + +export interface Relayer { + // simulate returns the execution results for a list of transactions. + simulate(wallet: string, ...transactions: commons.transaction.Transaction[]): Promise + + // getFeeOptions returns the fee options that the relayer will accept as payment. + // If a quote is returned, it may be passed back to the relayer for dispatch. + getFeeOptions( + address: string, + ...transactions: commons.transaction.Transaction[] + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> + + // getFeeOptionsRaw returns the fee options that the relayer will accept as payment. + // If a quote is returned, it may be passed back to the relayer for dispatch. + // It doesn't make any assumptions about the transaction format. + getFeeOptionsRaw( + entrypoint: string, + data: ethers.utils.BytesLike, + options?: { + simulate?: boolean + } + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> + + // gasRefundOptions returns the transactions which can be included to refund a + // relayer for submitting your transaction to a network. + gasRefundOptions(address: string, ...transactions: commons.transaction.Transaction[]): Promise + + // getNonce returns the transaction count/nonce for a wallet, encoded with nonce space. + // If space is undefined, the relayer can choose a nonce space to encode the result with. + // Otherwise, the relayer must return a nonce encoded for the given nonce space. + getNonce(address: string, space?: ethers.BigNumberish, blockTag?: providers.BlockTag): Promise + + // relayer will submit the transaction(s) to the network and return the transaction response. + // The quote should be the one returned from getFeeOptions, if any. + // waitForReceipt must default to true. + relay( + signedTxs: commons.transaction.IntendedTransactionBundle, + quote?: FeeQuote, + waitForReceipt?: boolean + ): Promise + + // wait for transaction confirmation + // timeout is the maximum time to wait for the transaction response + // delay is the polling interval, i.e. the time to wait between requests + // maxFails is the maximum number of hard failures to tolerate before giving up + wait( + metaTxnId: string | commons.transaction.SignedTransactionBundle, + timeout?: number, + delay?: number, + maxFails?: number + ): Promise +} + +export * from './local-relayer' +export * from './provider-relayer' +export * from './rpc-relayer' +export { proto as RpcRelayerProto } from './rpc-relayer' +export type SimulateResult = proto.SimulateResult +export type FeeOption = proto.FeeOption + +// A fee quote is simply an opaque value that can be obtained via Relayer.getFeeOptions(), and +// returned back to the same relayer via Relayer.relay(). Fee quotes should be treated as an +// implementation detail of the relayer that produces them. +// +// This interface exists for type-safety purposes to protect against passing non-FeeQuotes to +// Relayer.relay(), or any other functions that call it indirectly (e.g. Account.sendTransaction). +export interface FeeQuote { + _tag: 'FeeQuote' + _quote: unknown +} + +export function isRelayer(cand: any): cand is Relayer { + return ( + typeof cand === 'object' && + typeof cand.simulate === 'function' && + typeof cand.getFeeOptions === 'function' && + typeof cand.gasRefundOptions === 'function' && + typeof cand.getNonce === 'function' && + typeof cand.relay === 'function' && + typeof cand.wait === 'function' + ) +} diff --git a/packages/relayer/src/local-relayer.ts b/packages/relayer/src/local-relayer.ts new file mode 100644 index 000000000..19712ce12 --- /dev/null +++ b/packages/relayer/src/local-relayer.ts @@ -0,0 +1,79 @@ +import { Signer as AbstractSigner, providers, BytesLike } from 'ethers' +import { logger } from '@0xsequence/utils' +import { FeeOption, FeeQuote, Relayer } from '.' +import { ProviderRelayer, ProviderRelayerOptions } from './provider-relayer' +import { commons } from '@0xsequence/core' + +export type LocalRelayerOptions = Omit & { + signer: AbstractSigner +} + +export function isLocalRelayerOptions(obj: any): obj is LocalRelayerOptions { + return obj.signer !== undefined && AbstractSigner.isSigner(obj.signer) +} + +export class LocalRelayer extends ProviderRelayer implements Relayer { + private signer: AbstractSigner + private txnOptions: providers.TransactionRequest + + constructor(options: LocalRelayerOptions | AbstractSigner) { + super(AbstractSigner.isSigner(options) ? { provider: options.provider! } : { ...options, provider: options.signer.provider! }) + this.signer = AbstractSigner.isSigner(options) ? options : options.signer + if (!this.signer.provider) throw new Error('Signer must have a provider') + } + + async getFeeOptions(_address: string, ..._transactions: commons.transaction.Transaction[]): Promise<{ options: FeeOption[] }> { + return { options: [] } + } + + async getFeeOptionsRaw( + _entrypoint: string, + _data: BytesLike, + _options?: { + simulate?: boolean + } + ): Promise<{ options: FeeOption[] }> { + return { options: [] } + } + + async gasRefundOptions(address: string, ...transactions: commons.transaction.Transaction[]): Promise { + const { options } = await this.getFeeOptions(address, ...transactions) + return options + } + + setTransactionOptions(transactionRequest: providers.TransactionRequest) { + this.txnOptions = transactionRequest + } + + async relay( + signedTxs: commons.transaction.IntendedTransactionBundle, + quote?: FeeQuote, + waitForReceipt: boolean = true + ): Promise> { + if (quote !== undefined) { + logger.warn(`LocalRelayer doesn't accept fee quotes`) + } + + const data = commons.transaction.encodeBundleExecData(signedTxs) + + // TODO: think about computing gas limit individually, summing together and passing across + // NOTE: we expect that all txns have set their gasLimit ahead of time through proper estimation + // const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum.add(tx.gasLimit), ethers.BigNumber.from(0)) + // txRequest.gasLimit = gasLimit + + const responsePromise = this.signer.sendTransaction({ + to: signedTxs.entrypoint, + data, + ...this.txnOptions, + gasLimit: 9000000 + }) + + if (waitForReceipt) { + const response: commons.transaction.TransactionResponse = await responsePromise + response.receipt = await response.wait() + return response + } else { + return responsePromise + } + } +} diff --git a/packages/relayer/src/provider-relayer.ts b/packages/relayer/src/provider-relayer.ts new file mode 100644 index 000000000..9135c7acf --- /dev/null +++ b/packages/relayer/src/provider-relayer.ts @@ -0,0 +1,247 @@ +import { ethers, providers } from 'ethers' +import { walletContracts } from '@0xsequence/abi' +import { FeeOption, FeeQuote, Relayer, SimulateResult } from '.' +import { logger, Optionals } from '@0xsequence/utils' +import { commons } from '@0xsequence/core' + +const DEFAULT_GAS_LIMIT = ethers.BigNumber.from(800000) + +export interface ProviderRelayerOptions { + provider: providers.Provider + waitPollRate?: number + deltaBlocksLog?: number + fromBlockLog?: number +} + +export const ProviderRelayerDefaults: Required> = { + waitPollRate: 1000, + deltaBlocksLog: 12, + fromBlockLog: -1024 +} + +export function isProviderRelayerOptions(obj: any): obj is ProviderRelayerOptions { + return obj.provider !== undefined && providers.Provider.isProvider(obj.provider) +} + +export abstract class ProviderRelayer implements Relayer { + public provider: providers.Provider + public waitPollRate: number + public deltaBlocksLog: number + public fromBlockLog: number + + constructor(options: ProviderRelayerOptions) { + const opts = { ...ProviderRelayerDefaults, ...options } + + this.provider = opts.provider + this.waitPollRate = opts.waitPollRate + this.deltaBlocksLog = opts.deltaBlocksLog + this.fromBlockLog = opts.fromBlockLog + } + + abstract getFeeOptions( + address: string, + ...transactions: commons.transaction.Transaction[] + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> + + abstract getFeeOptionsRaw( + entrypoint: string, + data: ethers.utils.BytesLike, + options?: { + simulate?: boolean + } + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> + + abstract gasRefundOptions(address: string, ...transactions: commons.transaction.Transaction[]): Promise + + abstract relay( + signedTxs: commons.transaction.IntendedTransactionBundle, + quote?: FeeQuote, + waitForReceipt?: boolean + ): Promise + + async simulate(wallet: string, ...transactions: commons.transaction.Transaction[]): Promise { + return ( + await Promise.all( + transactions.map(async tx => { + // Respect gasLimit request of the transaction (as long as its not 0) + if (tx.gasLimit && !ethers.BigNumber.from(tx.gasLimit || 0).eq(ethers.constants.Zero)) { + return tx.gasLimit + } + + // Fee can't be estimated locally for delegateCalls + if (tx.delegateCall) { + return DEFAULT_GAS_LIMIT + } + + // Fee can't be estimated for self-called if wallet hasn't been deployed + if (tx.to === wallet && (await this.provider.getCode(wallet).then(code => ethers.utils.arrayify(code).length === 0))) { + return DEFAULT_GAS_LIMIT + } + + if (!this.provider) { + throw new Error('signer.provider is not set, but is required') + } + + // TODO: If the wallet address has been deployed, gas limits can be + // estimated with more accurately by using self-calls with the batch transactions one by one + return this.provider.estimateGas({ + from: wallet, + to: tx.to, + data: tx.data, + value: tx.value + }) + }) + ) + ).map(gasLimit => ({ + executed: true, + succeeded: true, + gasUsed: ethers.BigNumber.from(gasLimit).toNumber(), + gasLimit: ethers.BigNumber.from(gasLimit).toNumber() + })) + } + + async getNonce(address: string, space?: ethers.BigNumberish, blockTag?: providers.BlockTag): Promise { + if (!this.provider) { + throw new Error('provider is not set') + } + + if ((await this.provider.getCode(address)) === '0x') { + return 0 + } + + if (space === undefined) { + space = 0 + } + + const module = new ethers.Contract(address, walletContracts.mainModule.abi, this.provider) + const nonce = await module.readNonce(space, { blockTag: blockTag }) + return commons.transaction.encodeNonce(space, nonce) + } + + async wait( + metaTxnId: string | commons.transaction.SignedTransactionBundle, + timeoutDuration?: number, + delay: number = this.waitPollRate, + maxFails: number = 5 + ): Promise { + if (typeof metaTxnId !== 'string') { + metaTxnId = commons.transaction.intendedTransactionID(metaTxnId) + } + + let timedOut = false + + const retry = async (f: () => Promise, errorMessage: string): Promise => { + let fails = 0 + + while (!timedOut) { + try { + return await f() + } catch (error) { + fails++ + + if (maxFails !== undefined && fails >= maxFails) { + logger.error(`giving up after ${fails} failed attempts${errorMessage ? `: ${errorMessage}` : ''}`, error) + throw error + } else { + logger.warn(`attempt #${fails} failed${errorMessage ? `: ${errorMessage}` : ''}`, error) + } + } + + if (delay > 0) { + await new Promise(resolve => setTimeout(resolve, delay)) + } + } + + throw new Error(`timed out after ${fails} failed attempts${errorMessage ? `: ${errorMessage}` : ''}`) + } + + const waitReceipt = async (): Promise => { + // Transactions can only get executed on nonce change + // get all nonce changes and look for metaTxnIds in between logs + let lastBlock: number = this.fromBlockLog + + if (lastBlock < 0) { + const block = await retry(() => this.provider.getBlockNumber(), 'unable to get latest block number') + lastBlock = block + lastBlock + } + + if (typeof metaTxnId !== 'string') { + throw new Error('impossible') + } + + const normalMetaTxnId = metaTxnId.replace('0x', '') + + while (!timedOut) { + const block = await retry(() => this.provider.getBlockNumber(), 'unable to get latest block number') + + const logs = await retry( + () => + this.provider.getLogs({ + fromBlock: Math.max(0, lastBlock - this.deltaBlocksLog), + toBlock: block, + // Nonce change event topic + topics: ['0x1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881'] + }), + `unable to get NonceChange logs for blocks ${Math.max(0, lastBlock - this.deltaBlocksLog)} to ${block}` + ) + + lastBlock = block + + // Get receipts of all transactions + const txs = await Promise.all( + logs.map(l => + retry( + () => this.provider.getTransactionReceipt(l.transactionHash), + `unable to get receipt for transaction ${l.transactionHash}` + ) + ) + ) + + // Find a transaction with a TxExecuted log + const found = txs.find(tx => + tx.logs.find( + l => + (l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId) || + (l.topics.length === 1 && + // TxFailed event topic + l.topics[0] === '0x3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd7' && + l.data.length >= 64 && + l.data.replace('0x', '').startsWith(normalMetaTxnId)) + ) + ) + + // If found return that + if (found) { + return { + receipt: found, + ...(await retry( + () => this.provider.getTransaction(found.transactionHash), + `unable to get transaction ${found.transactionHash}` + )) + } + } + + // Otherwise wait and try again + if (!timedOut) { + await new Promise(r => setTimeout(r, delay)) + } + } + + throw new Error(`Timeout waiting for transaction receipt ${metaTxnId}`) + } + + if (timeoutDuration !== undefined) { + return Promise.race([ + waitReceipt(), + new Promise((_, reject) => + setTimeout(() => { + timedOut = true + reject(`Timeout waiting for transaction receipt ${metaTxnId}`) + }, timeoutDuration) + ) + ]) + } else { + return waitReceipt() + } + } +} diff --git a/packages/relayer/src/rpc-relayer/index.ts b/packages/relayer/src/rpc-relayer/index.ts new file mode 100644 index 000000000..728035b7e --- /dev/null +++ b/packages/relayer/src/rpc-relayer/index.ts @@ -0,0 +1,328 @@ +import { ethers } from 'ethers' +import { FeeOption, FeeQuote, Relayer, SimulateResult } from '..' +import * as proto from './relayer.gen' +import { commons } from '@0xsequence/core' +import { getEthersConnectionInfo, logger } from '@0xsequence/utils' + +export { proto } + +const FINAL_STATUSES = [ + proto.ETHTxnStatus.DROPPED, + proto.ETHTxnStatus.SUCCEEDED, + proto.ETHTxnStatus.PARTIALLY_FAILED, + proto.ETHTxnStatus.FAILED +] + +const FAILED_STATUSES = [proto.ETHTxnStatus.DROPPED, proto.ETHTxnStatus.PARTIALLY_FAILED, proto.ETHTxnStatus.FAILED] + +export interface RpcRelayerOptions { + provider: ethers.providers.Provider | { url: string } + url: string + projectAccessKey?: string + jwtAuth?: string +} + +export function isRpcRelayerOptions(obj: any): obj is RpcRelayerOptions { + return ( + obj.url !== undefined && + typeof obj.url === 'string' && + obj.provider !== undefined && + ethers.providers.Provider.isProvider(obj.provider) + ) +} + +const fetch = typeof global === 'object' ? global.fetch : window.fetch + +// TODO: rename to SequenceRelayer +export class RpcRelayer implements Relayer { + private readonly service: proto.Relayer + public readonly provider: ethers.providers.Provider + + constructor(public options: RpcRelayerOptions) { + this.service = new proto.Relayer(options.url, this._fetch) + + if (ethers.providers.Provider.isProvider(options.provider)) { + this.provider = options.provider + } else { + const { jwtAuth, projectAccessKey } = this.options + const providerConnectionInfo = getEthersConnectionInfo(options.provider.url, projectAccessKey, jwtAuth) + this.provider = new ethers.providers.StaticJsonRpcProvider(providerConnectionInfo) + } + } + + _fetch = (input: RequestInfo, init?: RequestInit): Promise => { + // automatically include jwt and access key auth header to requests + // if its been set on the api client + const headers: { [key: string]: any } = {} + + const { jwtAuth, projectAccessKey } = this.options + + if (jwtAuth && jwtAuth.length > 0) { + headers['Authorization'] = `BEARER ${jwtAuth}` + } + + if (projectAccessKey && projectAccessKey.length > 0) { + headers['X-Access-Key'] = projectAccessKey + } + + // before the request is made + init!.headers = { ...init!.headers, ...headers } + + return fetch(input, init) + } + + async waitReceipt( + metaTxnId: string | commons.transaction.SignedTransactionBundle, + delay: number = 1000, + maxFails: number = 5, + isCancelled?: () => boolean + ): Promise { + if (typeof metaTxnId !== 'string') { + metaTxnId = commons.transaction.intendedTransactionID(metaTxnId) + } + + logger.info(`[rpc-relayer/waitReceipt] waiting for ${metaTxnId}`) + + let fails = 0 + + while (isCancelled === undefined || !isCancelled()) { + try { + const { receipt } = await this.service.getMetaTxnReceipt({ metaTxID: metaTxnId }) + + if ( + receipt && + receipt.txnReceipt && + receipt.txnReceipt !== 'null' && + FINAL_STATUSES.includes(receipt.status as proto.ETHTxnStatus) + ) { + return { receipt } + } + } catch (e) { + fails++ + + if (fails === maxFails) { + throw e + } + } + + if (isCancelled === undefined || !isCancelled()) { + await new Promise(resolve => setTimeout(resolve, delay)) + } + } + + throw new Error(`Cancelled waiting for transaction receipt ${metaTxnId}`) + } + + async simulate(wallet: string, ...transactions: commons.transaction.Transaction[]): Promise { + const coder = ethers.utils.defaultAbiCoder + const encoded = coder.encode( + [commons.transaction.MetaTransactionsType], + [commons.transaction.sequenceTxAbiEncode(transactions)] + ) + return (await this.service.simulate({ wallet, transactions: encoded })).results + } + + async getFeeOptions( + address: string, + ...transactions: commons.transaction.Transaction[] + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + // NOTE/TODO: for a given `service` the feeTokens will not change between execution, so we should memoize this value + // for a short-period of time, perhaps for 1 day or in memory. Perhaps one day we can make this happen automatically + // with http cache response for this endpoint and service-worker.. lots of approaches + const feeTokens = await this.service.feeTokens() + + if (feeTokens.isFeeRequired) { + const symbols = feeTokens.tokens.map(token => token.symbol).join(', ') + logger.info(`[rpc-relayer/getFeeOptions] relayer fees are required, accepted tokens are ${symbols}`) + + const nonce = await this.getNonce(address) + + if (!this.provider) { + logger.warn(`[rpc-relayer/getFeeOptions] provider not set, needed for stub signature`) + throw new Error('provider is not set') + } + + const { options, quote } = await this.service.feeOptions({ + wallet: address, + to: address, + data: commons.transaction.encodeBundleExecData({ + entrypoint: address, + transactions, + nonce + }) + }) + + logger.info(`[rpc-relayer/getFeeOptions] got refund options ${JSON.stringify(options)}`) + return { options, quote: { _tag: 'FeeQuote', _quote: quote } } + } else { + logger.info(`[rpc-relayer/getFeeOptions] relayer fees are not required`) + return { options: [] } + } + } + + async getFeeOptionsRaw( + entrypoint: string, + data: ethers.utils.BytesLike, + options?: { + simulate?: boolean + } + ): Promise<{ options: FeeOption[]; quote?: FeeQuote }> { + const { options: feeOptions, quote } = await this.service.feeOptions({ + wallet: entrypoint, + to: entrypoint, + data: ethers.utils.hexlify(data), + simulate: options?.simulate + }) + + return { options: feeOptions, quote: { _tag: 'FeeQuote', _quote: quote } } + } + + async gasRefundOptions(address: string, ...transactions: commons.transaction.Transaction[]): Promise { + const { options } = await this.getFeeOptions(address, ...transactions) + return options + } + + async getNonce(address: string, space?: ethers.BigNumberish): Promise { + logger.info(`[rpc-relayer/getNonce] get nonce for wallet ${address} space: ${space}`) + const encodedNonce = space !== undefined ? ethers.BigNumber.from(space).toHexString() : undefined + const resp = await this.service.getMetaTxnNonce({ walletContractAddress: address, space: encodedNonce }) + const nonce = ethers.BigNumber.from(resp.nonce) + const [decodedSpace, decodedNonce] = commons.transaction.decodeNonce(nonce) + logger.info(`[rpc-relayer/getNonce] got next nonce for wallet ${address} ${decodedNonce} space: ${decodedSpace}`) + return nonce + } + + async relay( + signedTxs: commons.transaction.IntendedTransactionBundle, + quote?: FeeQuote, + waitForReceipt: boolean = true + ): Promise> { + logger.info( + `[rpc-relayer/relay] relaying signed meta-transactions ${JSON.stringify(signedTxs)} with quote ${JSON.stringify(quote)}` + ) + + let typecheckedQuote: string | undefined + if (quote !== undefined) { + if (typeof quote._quote === 'string') { + typecheckedQuote = quote._quote + } else { + logger.warn('[rpc-relayer/relay] ignoring invalid fee quote') + } + } + + if (!this.provider) { + logger.warn(`[rpc-relayer/relay] provider not set, failed relay`) + throw new Error('provider is not set') + } + + const data = commons.transaction.encodeBundleExecData(signedTxs) + const metaTxn = await this.service.sendMetaTxn({ + call: { + walletAddress: signedTxs.intent.wallet, + contract: signedTxs.entrypoint, + input: data + }, + quote: typecheckedQuote + }) + + logger.info(`[rpc-relayer/relay] got relay result ${JSON.stringify(metaTxn)}`) + + if (waitForReceipt) { + return this.wait(signedTxs.intent.id) + } else { + const response = { + hash: signedTxs.intent.id, + confirmations: 0, + from: signedTxs.intent.wallet, + wait: (_confirmations?: number): Promise => Promise.reject(new Error('impossible')) + } + + const wait = async (confirmations?: number): Promise => { + if (!this.provider) { + throw new Error('cannot wait for receipt, relayer has no provider set') + } + + const waitResponse = await this.wait(signedTxs.intent.id) + const transactionHash = waitResponse.receipt?.transactionHash + + if (!transactionHash) { + throw new Error('cannot wait for receipt, unknown native transaction hash') + } + + Object.assign(response, waitResponse) + + return this.provider.waitForTransaction(transactionHash, confirmations) + } + + response.wait = wait + + return response as commons.transaction.TransactionResponse + } + } + + async wait( + metaTxnId: string | commons.transaction.SignedTransactionBundle, + timeout?: number, + delay: number = 1000, + maxFails: number = 5 + ): Promise> { + let timedOut = false + + const { receipt } = await (timeout !== undefined + ? Promise.race([ + this.waitReceipt(metaTxnId, delay, maxFails, () => timedOut), + new Promise((_, reject) => + setTimeout(() => { + timedOut = true + reject(`Timeout waiting for transaction receipt ${metaTxnId}`) + }, timeout) + ) + ]) + : this.waitReceipt(metaTxnId, delay, maxFails)) + + if (!receipt.txnReceipt || FAILED_STATUSES.includes(receipt.status as proto.ETHTxnStatus)) { + throw new MetaTransactionResponseException(receipt) + } + + const txReceipt = JSON.parse(receipt.txnReceipt) as RelayerTxReceipt + + return { + blockHash: txReceipt.blockHash, + blockNumber: ethers.BigNumber.from(txReceipt.blockNumber).toNumber(), + confirmations: 1, + from: typeof metaTxnId === 'string' ? undefined : metaTxnId.intent.wallet, + hash: txReceipt.transactionHash, + raw: receipt.txnReceipt, + receipt: txReceipt, // extended type which is Sequence-specific. Contains the decoded metaTxReceipt + wait: async (confirmations?: number) => this.provider!.waitForTransaction(txReceipt.transactionHash, confirmations) + } as commons.transaction.TransactionResponse + } +} + +class MetaTransactionResponseException { + constructor(public receipt: proto.MetaTxnReceipt) {} +} + +export type RelayerTxReceipt = { + blockHash: string + blockNumber: string + contractAddress: string + cumulativeGasUsed: string + gasUsed: string + logs: { + address: string + blockHash: string + blockNumber: string + data: string + logIndex: string + removed: boolean + topics: string[] + transactionHash: string + transactionIndex: string + }[] + logsBloom: string + root: string + status: string + transactionHash: string + transactionIndex: string +} diff --git a/packages/relayer/src/rpc-relayer/relayer.gen.ts b/packages/relayer/src/rpc-relayer/relayer.gen.ts new file mode 100644 index 000000000..91ce2e9b0 --- /dev/null +++ b/packages/relayer/src/rpc-relayer/relayer.gen.ts @@ -0,0 +1,1461 @@ +/* eslint-disable */ +// sequence-relayer v0.4.1 1e27d0fd295aa5897878939595ef0c6adc54b1a3 +// -- +// Code generated by webrpc-gen@v0.18.6 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.4.1' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = '1e27d0fd295aa5897878939595ef0c6adc54b1a3' + +// +// Types +// + +export enum ETHTxnStatus { + UNKNOWN = 'UNKNOWN', + DROPPED = 'DROPPED', + QUEUED = 'QUEUED', + SENT = 'SENT', + SUCCEEDED = 'SUCCEEDED', + PARTIALLY_FAILED = 'PARTIALLY_FAILED', + FAILED = 'FAILED' +} + +export enum TransferType { + SEND = 'SEND', + RECEIVE = 'RECEIVE', + BRIDGE_DEPOSIT = 'BRIDGE_DEPOSIT', + BRIDGE_WITHDRAW = 'BRIDGE_WITHDRAW', + BURN = 'BURN', + UNKNOWN = 'UNKNOWN' +} + +export enum FeeTokenType { + UNKNOWN = 'UNKNOWN', + ERC20_TOKEN = 'ERC20_TOKEN', + ERC1155_TOKEN = 'ERC1155_TOKEN' +} + +export enum SortOrder { + DESC = 'DESC', + ASC = 'ASC' +} + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface RuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + branch: string + commitHash: string + useEIP1559: boolean + senders: Array + checks: RuntimeChecks + numTxnsRelayed: NumTxnsRelayed +} + +export interface SenderStatus { + index: number + address: string + etherBalance: number + active: boolean +} + +export interface RuntimeChecks {} + +export interface NumTxnsRelayed { + prev: number + current: number + period: number +} + +export interface SequenceContext { + factory: string + mainModule: string + mainModuleUpgradable: string + guestModule: string + utils: string +} + +export interface GasTank { + id: number + name: string + currentBalance: number + unlimited: boolean + feeMarkupFactor: number + updatedAt: string + createdAt: string +} + +export interface GasTankBalanceAdjustment { + gasTankId: number + nonce: number + amount: number + totalBalance: number + balanceTimestamp: string + createdAt: string +} + +export interface GasSponsor { + id: number + gasTankId: number + projectId: number + address: string + name: string + active: boolean + updatedAt: string + createdAt: string + deletedAt: string +} + +export interface GasSponsorUsage { + name: string + id: number + totalGasUsed: number + totalTxnFees: number + totalTxnFeesUsd: number + avgGasPrice: number + totalTxns: number + startTime: string + endTime: string +} + +export interface MetaTxn { + walletAddress: string + contract: string + input: string +} + +export interface MetaTxnLog { + id: number + projectId: number + txnHash: string + txnNonce: string + metaTxnID?: string + txnStatus: ETHTxnStatus + txnRevertReason: string + requeues: number + queuedAt: string + sentAt: string + minedAt: string + target: string + input: string + txnArgs: { [key: string]: any } + txnReceipt?: { [key: string]: any } + walletAddress: string + metaTxnNonce: string + gasLimit: number + gasPrice: string + gasUsed: number + gasEstimated: number + gasFeeMarkup?: number + usdRate: string + creditsUsed: number + isWhitelisted: boolean + gasSponsor?: number + gasTank?: number + updatedAt: string + createdAt: string +} + +export interface MetaTxnEntry { + id: number + metaTxnID: string + txnStatus: ETHTxnStatus + txnRevertReason: string + index: number + logs?: Array + updatedAt: string + createdAt: string +} + +export interface MetaTxnReceipt { + id: string + status: string + revertReason?: string + index: number + logs: Array + receipts: Array + txnReceipt: string +} + +export interface MetaTxnReceiptLog { + address: string + topics: Array + data: string +} + +export interface Transaction { + txnHash?: string + blockNumber: number + chainId: number + metaTxnID?: string + transfers?: Array + users?: { [key: string]: TxnLogUser } + timestamp: string +} + +export interface TxnLogUser { + username: string +} + +export interface TxnLogTransfer { + transferType: TransferType + contractAddress: string + from: string + to: string + ids: Array + amounts: Array +} + +export interface SentTransactionsFilter { + pending?: boolean + failed?: boolean +} + +export interface SimulateResult { + executed: boolean + succeeded: boolean + result?: string + reason?: string + gasUsed: number + gasLimit: number +} + +export interface FeeOption { + token: FeeToken + to: string + value: string + gasLimit: number +} + +export interface FeeToken { + chainId: number + name: string + symbol: string + type: FeeTokenType + decimals?: number + logoURL: string + contractAddress?: string + tokenID?: string +} + +export interface Page { + pageSize?: number + page?: number + more?: boolean + totalRecords?: number + column?: string + before?: any + after?: any + sort?: Array +} + +export interface SortBy { + column: string + order: SortOrder +} + +export interface Relayer { + ping(headers?: object, signal?: AbortSignal): Promise + version(headers?: object, signal?: AbortSignal): Promise + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + getSequenceContext(headers?: object, signal?: AbortSignal): Promise + getChainID(headers?: object, signal?: AbortSignal): Promise + sendMetaTxn(args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNonce(args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnReceipt(args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise + simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise + updateMetaTxnGasLimits( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal + ): Promise + feeTokens(headers?: object, signal?: AbortSignal): Promise + feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNetworkFeeOptions( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getMetaTransactions(args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + sentTransactions(args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + pendingTransactions(args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + getGasTank(args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise + addGasTank(args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise + updateGasTank(args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise + getGasSponsor(args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + addressGasSponsors(args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + listGasSponsors(args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + addGasSponsor(args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + updateGasSponsor(args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + removeGasSponsor(args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise + reportGasSponsorUsage( + args: ReportGasSponsorUsageArgs, + headers?: object, + signal?: AbortSignal + ): Promise + nextGasTankBalanceAdjustmentNonce( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal + ): Promise + adjustGasTankBalance( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal + ): Promise + getGasTankBalanceAdjustment( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal + ): Promise + listGasTankBalanceAdjustments( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal + ): Promise +} + +export interface PingArgs {} + +export interface PingReturn { + status: boolean +} +export interface VersionArgs {} + +export interface VersionReturn { + version: Version +} +export interface RuntimeStatusArgs {} + +export interface RuntimeStatusReturn { + status: RuntimeStatus +} +export interface GetSequenceContextArgs {} + +export interface GetSequenceContextReturn { + data: SequenceContext +} +export interface GetChainIDArgs {} + +export interface GetChainIDReturn { + chainID: number +} +export interface SendMetaTxnArgs { + call: MetaTxn + quote?: string +} + +export interface SendMetaTxnReturn { + status: boolean + txnHash: string +} +export interface GetMetaTxnNonceArgs { + walletContractAddress: string + space?: string +} + +export interface GetMetaTxnNonceReturn { + nonce: string +} +export interface GetMetaTxnReceiptArgs { + metaTxID: string +} + +export interface GetMetaTxnReceiptReturn { + receipt: MetaTxnReceipt +} +export interface SimulateArgs { + wallet: string + transactions: string +} + +export interface SimulateReturn { + results: Array +} +export interface UpdateMetaTxnGasLimitsArgs { + walletAddress: string + walletConfig: any + payload: string +} + +export interface UpdateMetaTxnGasLimitsReturn { + payload: string +} +export interface FeeTokensArgs {} + +export interface FeeTokensReturn { + isFeeRequired: boolean + tokens: Array +} +export interface FeeOptionsArgs { + wallet: string + to: string + data: string + simulate?: boolean +} + +export interface FeeOptionsReturn { + options: Array + sponsored: boolean + quote?: string +} +export interface GetMetaTxnNetworkFeeOptionsArgs { + walletConfig: any + payload: string +} + +export interface GetMetaTxnNetworkFeeOptionsReturn { + options: Array +} +export interface GetMetaTransactionsArgs { + projectId: number + gasTankId: number + page?: Page +} + +export interface GetMetaTransactionsReturn { + page: Page + transactions: Array +} +export interface SentTransactionsArgs { + filter?: SentTransactionsFilter + page?: Page +} + +export interface SentTransactionsReturn { + page: Page + transactions: Array +} +export interface PendingTransactionsArgs { + page?: Page +} + +export interface PendingTransactionsReturn { + page: Page + transactions: Array +} +export interface GetGasTankArgs { + id: number +} + +export interface GetGasTankReturn { + gasTank: GasTank +} +export interface AddGasTankArgs { + name: string + feeMarkupFactor: number + unlimited?: boolean +} + +export interface AddGasTankReturn { + status: boolean + gasTank: GasTank +} +export interface UpdateGasTankArgs { + id: number + name?: string + feeMarkupFactor?: number + unlimited?: boolean +} + +export interface UpdateGasTankReturn { + status: boolean + gasTank: GasTank +} +export interface GetGasSponsorArgs { + id: number +} + +export interface GetGasSponsorReturn { + gasSponsor: GasSponsor +} +export interface AddressGasSponsorsArgs { + address: string + page?: Page +} + +export interface AddressGasSponsorsReturn { + page: Page + gasSponsors: Array +} +export interface ListGasSponsorsArgs { + projectId: number + gasTankId: number + page?: Page +} + +export interface ListGasSponsorsReturn { + page: Page + gasSponsors: Array +} +export interface AddGasSponsorArgs { + projectId: number + gasTankId: number + address: string + name?: string + active?: boolean +} + +export interface AddGasSponsorReturn { + status: boolean + gasSponsor: GasSponsor +} +export interface UpdateGasSponsorArgs { + id: number + name?: string + active?: boolean +} + +export interface UpdateGasSponsorReturn { + status: boolean + gasSponsor: GasSponsor +} +export interface RemoveGasSponsorArgs { + id: number +} + +export interface RemoveGasSponsorReturn { + status: boolean +} +export interface ReportGasSponsorUsageArgs { + projectId: number + gasTankId: number + startTime?: string + endTime?: string +} + +export interface ReportGasSponsorUsageReturn { + gasSponsorUsage: Array +} +export interface NextGasTankBalanceAdjustmentNonceArgs { + id: number +} + +export interface NextGasTankBalanceAdjustmentNonceReturn { + nonce: number +} +export interface AdjustGasTankBalanceArgs { + id: number + nonce: number + amount: number +} + +export interface AdjustGasTankBalanceReturn { + status: boolean + adjustment: GasTankBalanceAdjustment +} +export interface GetGasTankBalanceAdjustmentArgs { + id: number + nonce: number +} + +export interface GetGasTankBalanceAdjustmentReturn { + adjustment: GasTankBalanceAdjustment +} +export interface ListGasTankBalanceAdjustmentsArgs { + id: number + page?: Page +} + +export interface ListGasTankBalanceAdjustmentsReturn { + page: Page + adjustments: Array +} + +// +// Client +// +export class Relayer implements Relayer { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Relayer/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + version: _data.version + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + data: _data.data + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getChainID = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + chainID: _data.chainID + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + txnHash: _data.txnHash + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getMetaTxnNonce = (args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + nonce: _data.nonce + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getMetaTxnReceipt = (args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + receipt: _data.receipt + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + results: >_data.results + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + updateMetaTxnGasLimits = ( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + payload: _data.payload + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + feeTokens = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + isFeeRequired: _data.isFeeRequired, + tokens: >_data.tokens + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + options: >_data.options, + sponsored: _data.sponsored, + quote: _data.quote + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getMetaTxnNetworkFeeOptions = ( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + options: >_data.options + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getMetaTransactions = ( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + transactions: >_data.transactions + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + sentTransactions = (args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + transactions: >_data.transactions + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + pendingTransactions = ( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + transactions: >_data.transactions + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + gasTank: _data.gasTank + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + gasTank: _data.gasTank + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + gasTank: _data.gasTank + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + gasSponsor: _data.gasSponsor + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + addressGasSponsors = ( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + listGasSponsors = (args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + updateGasSponsor = (args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + removeGasSponsor = (args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + reportGasSponsorUsage = ( + args: ReportGasSponsorUsageArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ReportGasSponsorUsage'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + gasSponsorUsage: >_data.gasSponsorUsage + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + nextGasTankBalanceAdjustmentNonce = ( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + nonce: _data.nonce + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + adjustGasTankBalance = ( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status, + adjustment: _data.adjustment + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getGasTankBalanceAdjustment = ( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + adjustment: _data.adjustment + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + listGasTankBalanceAdjustments = ( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + page: _data.page, + adjustments: >_data.adjustments + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + return { + method: 'POST', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body || {}), + signal + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then(text => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}` + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = 'endpoint error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = 'request failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = 'bad route', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = 'bad method', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = 'bad request', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = 'bad response', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = 'server panic', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = 'internal error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = 'client disconnected', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = 'stream lost', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = 'stream finished', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export class UnauthorizedError extends WebrpcError { + constructor( + name: string = 'Unauthorized', + code: number = 1000, + message: string = 'Unauthorized access', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedError.prototype) + } +} + +export class PermissionDeniedError extends WebrpcError { + constructor( + name: string = 'PermissionDenied', + code: number = 1001, + message: string = 'Permission denied', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, PermissionDeniedError.prototype) + } +} + +export class MethodNotFoundError extends WebrpcError { + constructor( + name: string = 'MethodNotFound', + code: number = 1003, + message: string = 'Method not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, MethodNotFoundError.prototype) + } +} + +export class AbortedError extends WebrpcError { + constructor( + name: string = 'Aborted', + code: number = 1005, + message: string = 'Request aborted', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AbortedError.prototype) + } +} + +export class InvalidArgumentError extends WebrpcError { + constructor( + name: string = 'InvalidArgument', + code: number = 2001, + message: string = 'Invalid argument', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidArgumentError.prototype) + } +} + +export class UnavailableError extends WebrpcError { + constructor( + name: string = 'Unavailable', + code: number = 2002, + message: string = 'Unavailable resource', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnavailableError.prototype) + } +} + +export class QueryFailedError extends WebrpcError { + constructor( + name: string = 'QueryFailed', + code: number = 2003, + message: string = 'Query failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, QueryFailedError.prototype) + } +} + +export class NotFoundError extends WebrpcError { + constructor( + name: string = 'NotFound', + code: number = 3000, + message: string = 'Resource not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NotFoundError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Unauthorized = 'Unauthorized', + PermissionDenied = 'PermissionDenied', + MethodNotFound = 'MethodNotFound', + Aborted = 'Aborted', + InvalidArgument = 'InvalidArgument', + Unavailable = 'Unavailable', + QueryFailed = 'QueryFailed', + NotFound = 'NotFound' +} + +const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1000]: UnauthorizedError, + [1001]: PermissionDeniedError, + [1003]: MethodNotFoundError, + [1005]: AbortedError, + [2001]: InvalidArgumentError, + [2002]: UnavailableError, + [2003]: QueryFailedError, + [3000]: NotFoundError +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/relayer/tests/provider-relayer.spec.ts b/packages/relayer/tests/provider-relayer.spec.ts new file mode 100644 index 000000000..681cb59e5 --- /dev/null +++ b/packages/relayer/tests/provider-relayer.spec.ts @@ -0,0 +1,532 @@ +import { commons, v2 } from '@0xsequence/core' +import { Orchestrator } from '@0xsequence/signhub' +import { context } from '@0xsequence/tests' +import { Wallet, WalletV2 } from '@0xsequence/wallet' +import { CallReceiverMock, HookCallerMock } from '@0xsequence/wallet-contracts' +import * as chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { ethers } from 'ethers' +import hardhat from 'hardhat' +import { LocalRelayer } from '../src' + +const CallReceiverMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/CallReceiverMock.sol/CallReceiverMock.json') +const HookCallerMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/HookCallerMock.sol/HookCallerMock.json') + +const { expect } = chai.use(chaiAsPromised) + +describe('Wallet integration', function () { + let relayer: LocalRelayer + let callReceiver: CallReceiverMock + let hookCaller: HookCallerMock + + let contexts: Awaited> + let provider: ethers.providers.Web3Provider + let signers: ethers.Signer[] + + before(async () => { + provider = new ethers.providers.Web3Provider(hardhat.network.provider as any) + signers = new Array(8).fill(0).map((_, i) => provider.getSigner(i)) + contexts = await context.deploySequenceContexts(signers[0]) + relayer = new LocalRelayer(signers[1]) + + // Deploy call receiver mock + callReceiver = (await new ethers.ContractFactory( + CallReceiverMockArtifact.abi, + CallReceiverMockArtifact.bytecode, + signers[0] + ).deploy()) as CallReceiverMock + + // Deploy hook caller mock + hookCaller = (await new ethers.ContractFactory( + HookCallerMockArtifact.abi, + HookCallerMockArtifact.bytecode, + signers[0] + ).deploy()) as HookCallerMock + }) + + describe('Waiting for receipts', () => { + ;[ + { + name: 'deployed', + deployed: true + }, + { + name: 'undeployed', + deployed: false + } + ].map(c => { + let wallet: WalletV2 + + beforeEach(async () => { + const signer = ethers.Wallet.createRandom() + const orchestrator = new Orchestrator([signer]) + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [ + { + address: signer.address, + weight: 1 + } + ] + }) + + wallet = Wallet.newWallet({ + coders: v2.coders, + context: contexts[2], + config, + orchestrator, + chainId: provider.network.chainId, + provider, + relayer + }) + + if (c.deployed) await wallet.deploy() + + expect(await wallet.reader().isDeployed(wallet.address)).to.equal(c.deployed) + }) + + describe(`For ${c.name} wallet`, () => { + it('Should get receipt of success transaction', async () => { + const txn = { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0 + } + + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, 0, [txn]) + + const receiptPromise = relayer.wait(id, 10000) + await new Promise(r => setTimeout(r, 1000)) + + const ogtx = await wallet.sendTransaction(txn, { serial: true }) + const receipt = await receiptPromise + + expect(receipt).to.not.be.undefined + expect(receipt.hash).to.equal(ogtx.hash) + }) + + it('Should get receipt of success batch transaction', async () => { + const txns = [ + { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + }, + { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + } + ] + + const nonce = 0 //wallet.randomNonce() + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, nonce, txns) + + const receiptPromise = relayer.wait(id, 10000) + await new Promise(r => setTimeout(r, 1000)) + + const ogtx = await wallet.sendTransaction(txns, { nonce }) + const receipt = await receiptPromise + + expect(receipt).to.not.be.undefined + expect(receipt.hash).to.equal(ogtx.hash) + }) + + it('Should get receipt of batch transaction with failed meta-txs', async () => { + const txns = [ + { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + }, + { + to: contexts[2].factory, + // 0xff not a valid factory method + data: '0xffffffffffff', + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + } + ] + + const nonce = wallet.randomNonce() + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, nonce, txns) + + const receiptPromise = relayer.wait(id, 10000) + await new Promise(r => setTimeout(r, 1000)) + + const ogtx = await wallet.sendTransaction(txns, { nonce }) + const receipt = await receiptPromise + + expect(receipt).to.not.be.undefined + expect(receipt.hash).to.equal(ogtx.hash) + }) + + it('Should get receipt of failed transaction', async () => { + const txn = { + to: contexts[1].factory, + // 0xff not a valid factory method + data: '0xffffffffffff', + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + } + + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, 0, [txn]) + + const receiptPromise = relayer.wait(id, 10000) + await new Promise(r => setTimeout(r, 1000)) + + const ogtx = await wallet.sendTransaction(txn, { serial: true }) + const receipt = await receiptPromise + + expect(receipt).to.not.be.undefined + expect(receipt.hash).to.equal(ogtx.hash) + }) + + it('Find correct receipt between multiple other transactions', async () => { + const altSigner = ethers.Wallet.createRandom() + const orchestrator = new Orchestrator([altSigner]) + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [ + { + address: altSigner.address, + weight: 1 + } + ] + }) + + const altWallet = Wallet.newWallet({ + coders: v2.coders, + context: contexts[2], + config, + provider, + relayer, + orchestrator, + chainId: provider.network.chainId + }) + + await altWallet.deploy() + + expect(await altWallet.reader().isDeployed(altWallet.address)).to.be.true + + await Promise.all( + new Array(8).fill(0).map(async (_, i) => { + await altWallet.sendTransaction( + { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0 + }, + { nonce: commons.transaction.encodeNonce(i, 0) } + ) + }) + ) + + const txn = { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + } + + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, 0, [txn]) + + const receiptPromise = relayer.wait(id, 10000) + await new Promise(r => setTimeout(r, 1000)) + + const ogtx = await wallet.sendTransaction(txn, { serial: true }) + + // Post-txs + await Promise.all( + new Array(8).fill(0).map(async (_, i) => { + await altWallet.sendTransaction( + { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0 + }, + { nonce: commons.transaction.encodeNonce(i + 1000, 0) } + ) + }) + ) + + const receipt = await receiptPromise + + expect(receipt).to.not.be.undefined + expect(receipt.hash).to.equal(ogtx.hash) + }) + + it('Find correct receipt between multiple other failed transactions', async () => { + // Pre-txs + const altSigner = ethers.Wallet.createRandom() + const orchestrator = new Orchestrator([altSigner]) + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [ + { + address: altSigner.address, + weight: 1 + } + ] + }) + + const altWallet = Wallet.newWallet({ + coders: v2.coders, + context: contexts[2], + config, + provider, + relayer, + orchestrator, + chainId: provider.network.chainId + }) + + await Promise.all( + new Array(8).fill(0).map(async (_, i) => { + await altWallet.sendTransaction( + { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0 + }, + { nonce: commons.transaction.encodeNonce(i, 0) } + ) + }) + ) + + await Promise.all( + new Array(8).fill(0).map(async (_, i) => { + await altWallet.sendTransaction( + { + to: contexts[2].factory, + // 0xff not a valid factory method + data: '0xffffffffffff', + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0 + }, + { nonce: commons.transaction.encodeNonce(i + 1000, 0) } + ) + }) + ) + + const txn = { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + } + + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, 0, [txn]) + + const receiptPromise = relayer.wait(id, 10000) + await new Promise(r => setTimeout(r, 1000)) + + const ogtx = await wallet.sendTransaction(txn, { serial: true }) + + const receipt = await receiptPromise + + expect(receipt).to.not.be.undefined + expect(receipt.hash).to.equal(ogtx.hash) + }) + + it('Find failed tx receipt between multiple other failed transactions', async () => { + // Pre-txs + const altSigner = ethers.Wallet.createRandom() + const orchestrator = new Orchestrator([altSigner]) + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [ + { + address: altSigner.address, + weight: 1 + } + ] + }) + + const altWallet = Wallet.newWallet({ + coders: v2.coders, + context: contexts[2], + config, + provider, + relayer, + orchestrator, + chainId: provider.network.chainId + }) + + await Promise.all( + new Array(8).fill(0).map(async (_, i) => { + await altWallet.sendTransaction( + { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000 + }, + { nonce: commons.transaction.encodeNonce(i, 0) } + ) + }) + ) + + await Promise.all( + new Array(8).fill(0).map(async (_, i) => { + await altWallet.sendTransaction( + { + to: contexts[1].factory, + // 0xff not a valid factory method + data: '0xffffffffffff', + delegateCall: false, + revertOnError: false, + gasLimit: 140000 + }, + { nonce: commons.transaction.encodeNonce(i + 1000, 0) } + ) + }) + ) + + const txn = { + to: contexts[2].factory, + // 0xff not a valid factory method + data: '0xffffffffffff', + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + } + + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, 0, [txn]) + + const receiptPromise = relayer.wait(id, 10000) + await new Promise(r => setTimeout(r, 1000)) + + const ogtx = await wallet.sendTransaction(txn, { serial: true }) + const receipt = await receiptPromise + + expect(receipt).to.not.be.undefined + expect(receipt.hash).to.equal(ogtx.hash) + }) + + it('Should timeout receipt if transaction is never sent', async () => { + const txn = { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0, + nonce: 0 + } + + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, 0, [txn]) + const receiptPromise = relayer.wait(id, 2000) + + await expect(receiptPromise).to.be.rejectedWith(`Timeout waiting for transaction receipt ${id}`) + }) + + if (c.deployed) { + it('Find correct receipt between multiple other failed transactions of the same wallet', async () => { + // Pre-txs + await Promise.all( + new Array(8).fill(0).map(async (_, i) => { + await wallet.sendTransaction( + { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0 + }, + { nonce: commons.transaction.encodeNonce(i + 1000, 0) } + ) + }) + ) + + await Promise.all( + new Array(8).fill(0).map(async (_, i) => { + await wallet.sendTransaction( + { + to: contexts[1].factory, + // 0xff not a valid factory method + data: '0xffffffffffff', + delegateCall: false, + revertOnError: false, + gasLimit: 140000, + value: 0 + }, + { nonce: commons.transaction.encodeNonce(i + 2000, 0) } + ) + }) + ) + + const txn = { + to: ethers.Wallet.createRandom().address, + data: ethers.utils.randomBytes(43), + delegateCall: false, + revertOnError: false, + gasLimit: 140000 + } + + const id = commons.transaction.subdigestOfTransactions(wallet.address, provider.network.chainId, 0, [txn]) + + const receiptPromise = relayer.wait(id, 10000) + await new Promise(r => setTimeout(r, 1000)) + + const ogtx = await wallet.sendTransaction(txn, { serial: true }) + + const receipt = await receiptPromise + + expect(receipt).to.not.be.undefined + expect(receipt.hash).to.equal(ogtx.hash) + }) + } + }) + }) + }) +}) diff --git a/packages/replacer/src/cached.ts b/packages/replacer/src/cached.ts new file mode 100644 index 000000000..28ae1e5c7 --- /dev/null +++ b/packages/replacer/src/cached.ts @@ -0,0 +1,31 @@ +import { ethers } from 'ethers' +import { runByEIP5719, URISolver } from '.' + +export class CachedEIP5719 { + constructor( + public provider: ethers.providers.Provider, + public solver?: URISolver, + public window: number = 1000 + ) {} + + private pending: Map< + string, + { + timestamp: number + promise: Promise + } + > = new Map() + + async runByEIP5719(address: string, digest: ethers.BytesLike, signature: ethers.BytesLike): Promise { + const key = `${address}-${digest}-${signature}` + const now = Date.now() + + if (this.pending.has(key) && now - this.pending.get(key)!.timestamp < this.window) { + return this.pending.get(key)!.promise + } + + const promise = runByEIP5719(address, this.provider, digest, signature, this.solver) + this.pending.set(key, { timestamp: now, promise }) + return promise + } +} diff --git a/packages/replacer/src/index.ts b/packages/replacer/src/index.ts new file mode 100644 index 000000000..02c76da8f --- /dev/null +++ b/packages/replacer/src/index.ts @@ -0,0 +1,118 @@ +import { ethers } from 'ethers' +import { walletContracts } from '@0xsequence/abi' +import { isIPFS, useGateway } from './ipfs' +import { commons } from '@0xsequence/core' + +export * from './cached' + +export function eip5719Contract(address: string, provider: ethers.providers.Provider): ethers.Contract { + // TODO: for some reason walletContracts is not being loaded from local + // remove this code once fixed + const abi = [ + { + inputs: [ + { + internalType: 'bytes32', + type: 'bytes32' + } + ], + name: 'getAlternativeSignature', + outputs: [ + { + internalType: 'string', + type: 'string' + } + ], + stateMutability: 'view', + type: 'function' + } + ] + + return new ethers.Contract(address, abi, provider) +} + +export function eip1271Contract(address: string, provider: ethers.providers.Provider): ethers.Contract { + return new ethers.Contract(address, walletContracts.erc1271.abi, provider) +} + +export async function isValidSignature( + address: string, + provider: ethers.providers.Provider, + digest: ethers.BytesLike, + signature: ethers.BytesLike +): Promise { + // First we try to validate the signature using Ethers + try { + const addr = ethers.utils.recoverAddress(digest, signature) + if (addr.toLowerCase() === address.toLowerCase()) return true + } catch {} + + // Then we try to validate the signature using EIP1271 + try { + const contract = eip1271Contract(address, provider) + const value = await contract.isValidSignature(digest, signature) + if (value === walletContracts.erc1271.returns) return true + } catch {} + + // If all else fails, we return false + return false +} + +export interface URISolver { + resolve: (uri: string) => Promise +} + +async function tryAwait(promise: Promise): Promise { + try { + return await promise + } catch { + return undefined + } +} + +export async function runByEIP5719( + address: string, + provider: ethers.providers.Provider, + digest: ethers.BytesLike, + signature: ethers.BytesLike, + solver?: URISolver, + tries: number = 0 +): Promise { + if (tries > 10) throw new Error('EIP5719 - Too many tries') + + if (commons.signer.canRecover(signature)) { + const recoveredAddr = commons.signer.recoverSigner(digest, signature) + if (recoveredAddr && recoveredAddr.toLowerCase() === address.toLowerCase()) return signature + } + + try { + if (await commons.signer.isValidSignature(address, digest, signature, provider)) { + return signature + } + } catch {} + + const altUri = await tryAwait(eip5719Contract(address, provider).getAlternativeSignature(digest) as Promise) + if (!altUri || altUri === '') throw new Error('EIP5719 - Invalid signature and no alternative signature') + + const altSignature = ethers.utils.hexlify(await (solver || new URISolverIPFS()).resolve(altUri)) + if (!altSignature || altSignature === '') throw new Error('EIP5719 - Empty alternative signature') + if (altSignature === ethers.utils.hexlify(signature)) throw new Error('EIP5719 - Alternative signature is invalid or the same') + + return runByEIP5719(address, provider, digest, altSignature, solver, tries + 1) +} + +export class URISolverIPFS implements URISolver { + constructor(public gateway: string = 'https://cloudflare-ipfs.com/ipfs/') {} + + uri = (uri: string): string => { + if (isIPFS(uri)) return useGateway(uri, this.gateway) + return uri + } + + resolve = async (uri: string): Promise => { + const url = this.uri(uri) + const res = await fetch(url) + if (!res.ok) throw new Error(`URISolverIPFS - Failed to fetch ${url}`) + return await res.text() + } +} diff --git a/packages/replacer/src/ipfs.ts b/packages/replacer/src/ipfs.ts new file mode 100644 index 000000000..2e6c64ddc --- /dev/null +++ b/packages/replacer/src/ipfs.ts @@ -0,0 +1,9 @@ +export function useGateway(uri: string, gateway: string) { + const clean = uri.replace('ipfs://ipfs/', '').replace('ipfs://', '') + if (uri.startsWith('ipfs://')) return `${gateway}${clean}` + return uri +} + +export function isIPFS(uri: string): boolean { + return uri.startsWith('ipfs://') +} diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md index 0a4106482..28bacf399 100644 --- a/packages/services/api/CHANGELOG.md +++ b/packages/services/api/CHANGELOG.md @@ -1422,7 +1422,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -1787,7 +1786,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/services/api/src/api.gen.ts b/packages/services/api/src/api.gen.ts index a42d143d6..967fad8fe 100644 --- a/packages/services/api/src/api.gen.ts +++ b/packages/services/api/src/api.gen.ts @@ -5,75 +5,74 @@ // // webrpc-gen -schema=api.ridl -target=typescript -client -out=./clients/api.gen.ts -export const WebrpcHeader = "Webrpc" +export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = "webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0" +export const WebrpcHeaderValue = 'webrpc@v0.25.3;gen-typescript@v0.17.0;sequence-api@v0.4.0' // WebRPC description and code-gen version -export const WebRPCVersion = "v1" +export const WebRPCVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = "v0.4.0" +export const WebRPCSchemaVersion = 'v0.4.0' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = "d43a5aac616814072c69e63f2f81fe65ea10a7e0" +export const WebRPCSchemaHash = 'd43a5aac616814072c69e63f2f81fe65ea10a7e0' type WebrpcGenVersions = { - webrpcGenVersion: string; - codeGenName: string; - codeGenVersion: string; - schemaName: string; - schemaVersion: string; -}; + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader); + const headerValue = headers.get(WebrpcHeader) if (!headerValue) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - return parseWebrpcGenVersions(headerValue); + return parseWebrpcGenVersions(headerValue) } function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(";"); + const versions = header.split(';') if (versions.length < 3) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - const [_, webrpcGenVersion] = versions[0]!.split("@"); - const [codeGenName, codeGenVersion] = versions[1]!.split("@"); - const [schemaName, schemaVersion] = versions[2]!.split("@"); + const [_, webrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') return { - webrpcGenVersion: webrpcGenVersion ?? "", - codeGenName: codeGenName ?? "", - codeGenVersion: codeGenVersion ?? "", - schemaName: schemaName ?? "", - schemaVersion: schemaVersion ?? "", - }; + webrpcGenVersion: webrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } } // // Types // - export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } export enum SardinePaymentType { @@ -82,57 +81,57 @@ export enum SardinePaymentType { credit = 'credit', us_debit = 'us_debit', international_debit = 'international_debit', - international_credit = 'international_credit' + international_credit = 'international_credit', } export enum SardineQuoteType { buy = 'buy', - sell = 'sell' + sell = 'sell', } export enum GetLifiSwapRouteDirection { to = 'to', - from = 'from' + from = 'from', } export enum TokenType { ERC20 = 'ERC20', ERC721 = 'ERC721', - ERC1155 = 'ERC1155' + ERC1155 = 'ERC1155', } export enum TransakBuySell { UNKNOWN = 'UNKNOWN', BUY = 'BUY', - SELL = 'SELL' + SELL = 'SELL', } export enum TradeType { EXACT_INPUT = 'EXACT_INPUT', - EXACT_OUTPUT = 'EXACT_OUTPUT' + EXACT_OUTPUT = 'EXACT_OUTPUT', } export enum CheckoutOptionCrypto { none = 'none', partially = 'partially', - all = 'all' + all = 'all', } export enum CheckoutOptionNFTCheckoutProvider { unknown = 'unknown', sardine = 'sardine', - transak = 'transak' + transak = 'transak', } export enum CheckoutOptionOnRampProvider { unknown = 'unknown', sardine = 'sardine', - transak = 'transak' + transak = 'transak', } export enum CheckoutOptionSwapProvider { unknown = 'unknown', - lifi = 'lifi' + lifi = 'lifi', } export interface Version { @@ -150,7 +149,7 @@ export interface RuntimeStatus { branch: string commitHash: string checks: RuntimeChecks - numTxnsRelayed: {[key: string]: NumTxnsRelayed} + numTxnsRelayed: { [key: string]: NumTxnsRelayed } } export interface NumTxnsRelayed { @@ -160,8 +159,7 @@ export interface NumTxnsRelayed { period: number } -export interface RuntimeChecks { -} +export interface RuntimeChecks {} export interface SequenceContext { factory: string @@ -960,14 +958,14 @@ export interface IntentQuote { quoteProvider: string quoteProviderRequestId: string quoteProviderFeeUsd: string - feeQuotes: {[key: string]: string} + feeQuotes: { [key: string]: string } } export interface API { /** - * + * * Runtime - * + * */ ping(headers?: object, signal?: AbortSignal): Promise version(headers?: object, signal?: AbortSignal): Promise @@ -975,70 +973,133 @@ export interface API { clock(headers?: object, signal?: AbortSignal): Promise getSequenceContext(headers?: object, signal?: AbortSignal): Promise /** - * + * * Auth - * + * * TODO: rename 'ewtString' arg to 'ethauthProof' */ getAuthToken(args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise getAuthToken2(args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise - sendPasswordlessLink(args: SendPasswordlessLinkArgs, headers?: object, signal?: AbortSignal): Promise - registerPublicKey(args: RegisterPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise + sendPasswordlessLink( + args: SendPasswordlessLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + registerPublicKey( + args: RegisterPublicKeyArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getPublicKey(args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Contacts / Friends - * + * */ friendList(args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise - getFriendByAddress(args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise + getFriendByAddress( + args: GetFriendByAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise searchFriends(args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise addFriend(args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise - updateFriendNickname(args: UpdateFriendNicknameArgs, headers?: object, signal?: AbortSignal): Promise + updateFriendNickname( + args: UpdateFriendNicknameArgs, + headers?: object, + signal?: AbortSignal, + ): Promise removeFriend(args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Chain-Utils - * + * */ contractCall(args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise - decodeContractCall(args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise - lookupContractCallSelectors(args: LookupContractCallSelectorsArgs, headers?: object, signal?: AbortSignal): Promise + decodeContractCall( + args: DecodeContractCallArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + lookupContractCallSelectors( + args: LookupContractCallSelectorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * User Storage - * + * */ userStorageFetch(args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise userStorageSave(args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise - userStorageDelete(args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise - userStorageFetchAll(args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise + userStorageDelete( + args: UserStorageDeleteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + userStorageFetchAll( + args: UserStorageFetchAllArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Wallet utils - * + * */ getMoonpayLink(args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise /** * - IsUsingGoogleMail(domain: string) => (yes: bool) */ - resolveENSAddress(args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise + resolveENSAddress( + args: ResolveENSAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * TODO: we can add walletContext optional in the future when we need it * NOTE: chainId can be either a number or canonical name */ isValidSignature(args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidMessageSignature(args: IsValidMessageSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidTypedDataSignature(args: IsValidTypedDataSignatureArgs, headers?: object, signal?: AbortSignal): Promise - isValidETHAuthProof(args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise + isValidMessageSignature( + args: IsValidMessageSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + isValidTypedDataSignature( + args: IsValidTypedDataSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + isValidETHAuthProof( + args: IsValidETHAuthProofArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getOnRampURL(args: GetOnRampURLArgs, headers?: object, signal?: AbortSignal): Promise sardineGetClientToken(headers?: object, signal?: AbortSignal): Promise - sardineGetNFTCheckoutToken(args: SardineGetNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise - sardineGetNFTCheckoutOrderStatus(args: SardineGetNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise + sardineGetNFTCheckoutToken( + args: SardineGetNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + sardineGetNFTCheckoutOrderStatus( + args: SardineGetNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetSupportedRegions(headers?: object, signal?: AbortSignal): Promise - sardineGetSupportedFiatCurrencies(headers?: object, signal?: AbortSignal): Promise + sardineGetSupportedFiatCurrencies( + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetSupportedTokens(headers?: object, signal?: AbortSignal): Promise - sardineGetSupportedTokenForSwap(args: SardineGetSupportedTokenForSwapArgs, headers?: object, signal?: AbortSignal): Promise + sardineGetSupportedTokenForSwap( + args: SardineGetSupportedTokenForSwapArgs, + headers?: object, + signal?: AbortSignal, + ): Promise sardineGetEnabledTokens(headers?: object, signal?: AbortSignal): Promise sardineGetQuote(args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise /** @@ -1048,172 +1109,302 @@ export interface API { /** * Deprecated. Use SardineGetNFTCheckoutToken() instead. */ - getSardineNFTCheckoutToken(args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise + getSardineNFTCheckoutToken( + args: GetSardineNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Deprecated. Use SardineGetNFTCheckoutOrderStatus() instead. */ - getSardineNFTCheckoutOrderStatus(args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise + getSardineNFTCheckoutOrderStatus( + args: GetSardineNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise transakGetCountries(headers?: object, signal?: AbortSignal): Promise transakGetCryptoCurrencies(headers?: object, signal?: AbortSignal): Promise transakGetFiatCurrencies(headers?: object, signal?: AbortSignal): Promise transakGetPrice(args: TransakGetPriceArgs, headers?: object, signal?: AbortSignal): Promise - transakGetSupportedNFTCheckoutChains(headers?: object, signal?: AbortSignal): Promise + transakGetSupportedNFTCheckoutChains( + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Price Feed - * + * */ getCoinPrices(args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise - getCollectiblePrices(args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal): Promise + getCollectiblePrices( + args: GetCollectiblePricesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Price Feed utils - * + * */ getExchangeRate(args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Util / misc - * + * */ memoryStore(args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise memoryLoad(args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Legacy - * + * */ getInviteInfo(headers?: object, signal?: AbortSignal): Promise /** * NOTE: we're still using this from SW-API to Sequence-API to claim invite code */ - isValidAccessCode(args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise - internalClaimAccessCode(args: InternalClaimAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise + isValidAccessCode( + args: IsValidAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + internalClaimAccessCode( + args: InternalClaimAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Utils */ - blockNumberAtTime(args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise + blockNumberAtTime( + args: BlockNumberAtTimeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Paper * TODO: deprecate in the future - * + * */ - paperSessionSecret(args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise - paperSessionSecret2(args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise + paperSessionSecret( + args: PaperSessionSecretArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + paperSessionSecret2( + args: PaperSessionSecret2Args, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Linked wallets (v0 -- simple support) - * + * */ linkWallet(args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise getLinkedWallets(args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise - removeLinkedWallet(args: RemoveLinkedWalletArgs, headers?: object, signal?: AbortSignal): Promise + removeLinkedWallet( + args: RemoveLinkedWalletArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * NOTE: these methods are deprecated, please do not use them. We may resurface them in the future, but just wanted * to be clear, they are not necessary for our linked wallets. */ - generateWaaSVerificationURL(args: GenerateWaaSVerificationURLArgs, headers?: object, signal?: AbortSignal): Promise - validateWaaSVerificationNonce(args: ValidateWaaSVerificationNonceArgs, headers?: object, signal?: AbortSignal): Promise + generateWaaSVerificationURL( + args: GenerateWaaSVerificationURLArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + validateWaaSVerificationNonce( + args: ValidateWaaSVerificationNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * - * + * + * * WaaS child wallet adoption - * + * */ - listAdoptedWallets(args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal): Promise + listAdoptedWallets( + args: ListAdoptedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getLifiChains(headers?: object, signal?: AbortSignal): Promise getLifiTokens(args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise /** * All parameters except `params` are deprecated. * Use only the `params` object to pass values. */ - getLifiSwapRoutes(args: GetLifiSwapRoutesArgs, headers?: object, signal?: AbortSignal): Promise + getLifiSwapRoutes( + args: GetLifiSwapRoutesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getLifiSwapQuote(args: GetLifiSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Chain abstraction - * + * */ - getIntentCallsPayloads(args: GetIntentCallsPayloadsArgs, headers?: object, signal?: AbortSignal): Promise - commitIntentConfig(args: CommitIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise + getIntentCallsPayloads( + args: GetIntentCallsPayloadsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + commitIntentConfig( + args: CommitIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getIntentConfig(args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise /** - * + * * Inventory, payments and management - * + * */ listCurrencyGroups(headers?: object, signal?: AbortSignal): Promise - addOffchainInventory(args: AddOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - getOffchainInventory(args: GetOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - listOffchainInventories(args: ListOffchainInventoriesArgs, headers?: object, signal?: AbortSignal): Promise - updateOffchainInventory(args: UpdateOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - deleteOffchainInventory(args: DeleteOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise - requestOffchainPayment(args: RequestOffchainPaymentArgs, headers?: object, signal?: AbortSignal): Promise - listOffchainPayments(args: ListOffchainPaymentsArgs, headers?: object, signal?: AbortSignal): Promise + addOffchainInventory( + args: AddOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getOffchainInventory( + args: GetOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listOffchainInventories( + args: ListOffchainInventoriesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + updateOffchainInventory( + args: UpdateOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + deleteOffchainInventory( + args: DeleteOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + requestOffchainPayment( + args: RequestOffchainPaymentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listOffchainPayments( + args: ListOffchainPaymentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Packs - * + * */ savePack(args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise getPack(args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise getPackIds(args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise deletePack(args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise - updatePackContent(args: UpdatePackContentArgs, headers?: object, signal?: AbortSignal): Promise + updatePackContent( + args: UpdatePackContentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise getRevealTxData(args: GetRevealTxDataArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsPrimary(args: CheckoutOptionsPrimaryArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsSecondary(args: CheckoutOptionsSecondaryArgs, headers?: object, signal?: AbortSignal): Promise - checkoutOptionsGetTransakContractID(args: CheckoutOptionsGetTransakContractIDArgs, headers?: object, signal?: AbortSignal): Promise - fortePayCreateIntent(args: FortePayCreateIntentArgs, headers?: object, signal?: AbortSignal): Promise - fortePayGetPaymentStatuses(args: FortePayGetPaymentStatusesArgs, headers?: object, signal?: AbortSignal): Promise + checkoutOptionsPrimary( + args: CheckoutOptionsPrimaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + checkoutOptionsSecondary( + args: CheckoutOptionsSecondaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + checkoutOptionsGetTransakContractID( + args: CheckoutOptionsGetTransakContractIDArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + fortePayCreateIntent( + args: FortePayCreateIntentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + fortePayGetPaymentStatuses( + args: FortePayGetPaymentStatusesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * CCTP - * + * */ getCCTPTransfer(args: GetCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise - queueCCTPTransfer(args: QueueCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise + queueCCTPTransfer( + args: QueueCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** - * + * * Intent Machine Worker - * + * */ - queueIntentConfigExecution(args: QueueIntentConfigExecutionArgs, headers?: object, signal?: AbortSignal): Promise - getIntentConfigExecutionStatus(args: GetIntentConfigExecutionStatusArgs, headers?: object, signal?: AbortSignal): Promise - listIntentConfigs(args: ListIntentConfigsArgs, headers?: object, signal?: AbortSignal): Promise - queueMetaTxnReceipt(args: QueueMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise -} - -export interface PingArgs { -} + queueIntentConfigExecution( + args: QueueIntentConfigExecutionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getIntentConfigExecutionStatus( + args: GetIntentConfigExecutionStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listIntentConfigs( + args: ListIntentConfigsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + queueMetaTxnReceipt( + args: QueueMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise +} + +export interface PingArgs {} export interface PingReturn { - status: boolean -} -export interface VersionArgs { + status: boolean } +export interface VersionArgs {} export interface VersionReturn { - version: Version -} -export interface RuntimeStatusArgs { + version: Version } +export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { - status: RuntimeStatus -} -export interface ClockArgs { + status: RuntimeStatus } +export interface ClockArgs {} export interface ClockReturn { - serverTime: string -} -export interface GetSequenceContextArgs { + serverTime: string } +export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { - data: SequenceContext + data: SequenceContext } export interface GetAuthTokenArgs { ewtString: string @@ -1224,7 +1415,7 @@ export interface GetAuthTokenReturn { status: boolean jwtToken: string address: string - user?: User + user?: User } export interface GetAuthToken2Args { ewtString: string @@ -1235,7 +1426,7 @@ export interface GetAuthToken2Return { status: boolean jwtToken: string address: string - user?: User + user?: User } export interface SendPasswordlessLinkArgs { email: string @@ -1244,21 +1435,21 @@ export interface SendPasswordlessLinkArgs { } export interface SendPasswordlessLinkReturn { - status: boolean + status: boolean } export interface RegisterPublicKeyArgs { publicKey: PublicKey } export interface RegisterPublicKeyReturn { - status: boolean + status: boolean } export interface GetPublicKeyArgs { id: string } export interface GetPublicKeyReturn { - publicKey: PublicKey + publicKey: PublicKey } export interface FriendListArgs { nickname?: string @@ -1267,7 +1458,7 @@ export interface FriendListArgs { export interface FriendListReturn { page: Page - friends: Array + friends: Array } export interface GetFriendByAddressArgs { friendAddress: string @@ -1275,7 +1466,7 @@ export interface GetFriendByAddressArgs { export interface GetFriendByAddressReturn { status: boolean - friend: Friend + friend: Friend } export interface SearchFriendsArgs { filterUsername: string @@ -1283,7 +1474,7 @@ export interface SearchFriendsArgs { } export interface SearchFriendsReturn { - friends: Array + friends: Array } export interface AddFriendArgs { friendAddress: string @@ -1292,7 +1483,7 @@ export interface AddFriendArgs { export interface AddFriendReturn { status: boolean - friend?: Friend + friend?: Friend } export interface UpdateFriendNicknameArgs { friendAddress: string @@ -1301,14 +1492,14 @@ export interface UpdateFriendNicknameArgs { export interface UpdateFriendNicknameReturn { status: boolean - friend?: Friend + friend?: Friend } export interface RemoveFriendArgs { friendAddress: string } export interface RemoveFriendReturn { - status: boolean + status: boolean } export interface ContractCallArgs { chainID: string @@ -1319,28 +1510,28 @@ export interface ContractCallArgs { } export interface ContractCallReturn { - returns: Array + returns: Array } export interface DecodeContractCallArgs { callData: string } export interface DecodeContractCallReturn { - call: ContractCall + call: ContractCall } export interface LookupContractCallSelectorsArgs { selectors: Array } export interface LookupContractCallSelectorsReturn { - signatures: Array> + signatures: Array> } export interface UserStorageFetchArgs { key: string } export interface UserStorageFetchReturn { - object: any + object: any } export interface UserStorageSaveArgs { key: string @@ -1348,28 +1539,28 @@ export interface UserStorageSaveArgs { } export interface UserStorageSaveReturn { - ok: boolean + ok: boolean } export interface UserStorageDeleteArgs { key: string } export interface UserStorageDeleteReturn { - ok: boolean + ok: boolean } export interface UserStorageFetchAllArgs { keys?: Array } export interface UserStorageFetchAllReturn { - objects: {[key: string]: any} + objects: { [key: string]: any } } export interface GetMoonpayLinkArgs { url: string } export interface GetMoonpayLinkReturn { - signedUrl: string + signedUrl: string } export interface ResolveENSAddressArgs { ens: string @@ -1377,7 +1568,7 @@ export interface ResolveENSAddressArgs { export interface ResolveENSAddressReturn { address: string - ok: boolean + ok: boolean } export interface IsValidSignatureArgs { chainId: string @@ -1387,7 +1578,7 @@ export interface IsValidSignatureArgs { } export interface IsValidSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidMessageSignatureArgs { chainId: string @@ -1397,7 +1588,7 @@ export interface IsValidMessageSignatureArgs { } export interface IsValidMessageSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidTypedDataSignatureArgs { chainId: string @@ -1407,7 +1598,7 @@ export interface IsValidTypedDataSignatureArgs { } export interface IsValidTypedDataSignatureReturn { - isValid: boolean + isValid: boolean } export interface IsValidETHAuthProofArgs { chainId: string @@ -1416,52 +1607,48 @@ export interface IsValidETHAuthProofArgs { } export interface IsValidETHAuthProofReturn { - isValid: boolean + isValid: boolean } export interface GetOnRampURLArgs { chainId: string } export interface GetOnRampURLReturn { - url: string -} -export interface SardineGetClientTokenArgs { + url: string } +export interface SardineGetClientTokenArgs {} export interface SardineGetClientTokenReturn { - token: string + token: string } export interface SardineGetNFTCheckoutTokenArgs { params: SardineNFTCheckoutParams } export interface SardineGetNFTCheckoutTokenReturn { - resp: SardineNFTCheckout + resp: SardineNFTCheckout } export interface SardineGetNFTCheckoutOrderStatusArgs { orderId: string } export interface SardineGetNFTCheckoutOrderStatusReturn { - resp: SardineOrder -} -export interface SardineGetSupportedRegionsArgs { + resp: SardineOrder } +export interface SardineGetSupportedRegionsArgs {} export interface SardineGetSupportedRegionsReturn { - regions: Array -} -export interface SardineGetSupportedFiatCurrenciesArgs { + regions: Array } +export interface SardineGetSupportedFiatCurrenciesArgs {} export interface SardineGetSupportedFiatCurrenciesReturn { - tokens: Array -} -export interface SardineGetSupportedTokensArgs { + tokens: Array } +export interface SardineGetSupportedTokensArgs {} export interface SardineGetSupportedTokensReturn { - tokens: Array + tokens: Array } export interface SardineGetSupportedTokenForSwapArgs { network: string @@ -1469,92 +1656,86 @@ export interface SardineGetSupportedTokenForSwapArgs { } export interface SardineGetSupportedTokenForSwapReturn { - token: SardineSupportedTokenForSwap -} -export interface SardineGetEnabledTokensArgs { + token: SardineSupportedTokenForSwap } +export interface SardineGetEnabledTokensArgs {} export interface SardineGetEnabledTokensReturn { - tokens: Array + tokens: Array } export interface SardineGetQuoteArgs { params: SardineGetQuoteParams } export interface SardineGetQuoteReturn { - quote: SardineQuote -} -export interface GetSardineClientTokenArgs { + quote: SardineQuote } +export interface GetSardineClientTokenArgs {} export interface GetSardineClientTokenReturn { - token: string + token: string } export interface GetSardineNFTCheckoutTokenArgs { params: SardineNFTCheckoutParams } export interface GetSardineNFTCheckoutTokenReturn { - resp: SardineNFTCheckout + resp: SardineNFTCheckout } export interface GetSardineNFTCheckoutOrderStatusArgs { orderId: string } export interface GetSardineNFTCheckoutOrderStatusReturn { - resp: SardineOrder -} -export interface TransakGetCountriesArgs { + resp: SardineOrder } +export interface TransakGetCountriesArgs {} export interface TransakGetCountriesReturn { - regions: Array -} -export interface TransakGetCryptoCurrenciesArgs { + regions: Array } +export interface TransakGetCryptoCurrenciesArgs {} export interface TransakGetCryptoCurrenciesReturn { - currencies: Array -} -export interface TransakGetFiatCurrenciesArgs { + currencies: Array } +export interface TransakGetFiatCurrenciesArgs {} export interface TransakGetFiatCurrenciesReturn { - currencies: Array + currencies: Array } export interface TransakGetPriceArgs { params: TransakGetPriceParams } export interface TransakGetPriceReturn { - price: TransakPrice -} -export interface TransakGetSupportedNFTCheckoutChainsArgs { + price: TransakPrice } +export interface TransakGetSupportedNFTCheckoutChainsArgs {} export interface TransakGetSupportedNFTCheckoutChainsReturn { - chains: Array + chains: Array } export interface GetCoinPricesArgs { tokens: Array } export interface GetCoinPricesReturn { - tokenPrices: Array + tokenPrices: Array } export interface GetCollectiblePricesArgs { tokens: Array } export interface GetCollectiblePricesReturn { - tokenPrices: Array + tokenPrices: Array } export interface GetExchangeRateArgs { toCurrency: string } export interface GetExchangeRateReturn { - exchangeRate: ExchangeRate + exchangeRate: ExchangeRate } export interface MemoryStoreArgs { key: string @@ -1562,27 +1743,26 @@ export interface MemoryStoreArgs { } export interface MemoryStoreReturn { - ok: boolean + ok: boolean } export interface MemoryLoadArgs { key: string } export interface MemoryLoadReturn { - value: string -} -export interface GetInviteInfoArgs { + value: string } +export interface GetInviteInfoArgs {} export interface GetInviteInfoReturn { - inviteInfo: InviteInfo + inviteInfo: InviteInfo } export interface IsValidAccessCodeArgs { accessCode: string } export interface IsValidAccessCodeReturn { - status: boolean + status: boolean } export interface InternalClaimAccessCodeArgs { address: string @@ -1590,7 +1770,7 @@ export interface InternalClaimAccessCodeArgs { } export interface InternalClaimAccessCodeReturn { - status: boolean + status: boolean } export interface BlockNumberAtTimeArgs { chainId: number @@ -1598,7 +1778,7 @@ export interface BlockNumberAtTimeArgs { } export interface BlockNumberAtTimeReturn { - blocks: Array + blocks: Array } export interface PaperSessionSecretArgs { chainName: string @@ -1608,7 +1788,7 @@ export interface PaperSessionSecretArgs { } export interface PaperSessionSecretReturn { - secret: string + secret: string } export interface PaperSessionSecret2Args { chainName: string @@ -1618,7 +1798,7 @@ export interface PaperSessionSecret2Args { } export interface PaperSessionSecret2Return { - secret: string + secret: string } export interface LinkWalletArgs { parentWalletAddress: string @@ -1632,7 +1812,7 @@ export interface LinkWalletArgs { } export interface LinkWalletReturn { - status: boolean + status: boolean } export interface GetLinkedWalletsArgs { parentWalletAddress: string @@ -1642,7 +1822,7 @@ export interface GetLinkedWalletsArgs { } export interface GetLinkedWalletsReturn { - linkedWallets: Array + linkedWallets: Array } export interface RemoveLinkedWalletArgs { parentWalletAddress: string @@ -1653,7 +1833,7 @@ export interface RemoveLinkedWalletArgs { } export interface RemoveLinkedWalletReturn { - status: boolean + status: boolean } export interface GenerateWaaSVerificationURLArgs { walletAddress: string @@ -1661,7 +1841,7 @@ export interface GenerateWaaSVerificationURLArgs { export interface GenerateWaaSVerificationURLReturn { nonce: string - verificationURL: string + verificationURL: string } export interface ValidateWaaSVerificationNonceArgs { nonce: string @@ -1671,7 +1851,7 @@ export interface ValidateWaaSVerificationNonceArgs { } export interface ValidateWaaSVerificationNonceReturn { - walletAddress: string + walletAddress: string } export interface ListAdoptedWalletsArgs { page?: Page @@ -1679,20 +1859,19 @@ export interface ListAdoptedWalletsArgs { export interface ListAdoptedWalletsReturn { page: Page - wallets: Array -} -export interface GetLifiChainsArgs { + wallets: Array } +export interface GetLifiChainsArgs {} export interface GetLifiChainsReturn { - chains: Array + chains: Array } export interface GetLifiTokensArgs { chainIds: Array } export interface GetLifiTokensReturn { - tokens: Array + tokens: Array } export interface GetLifiSwapRoutesArgs { params: GetLifiSwapRouteParams @@ -1703,14 +1882,14 @@ export interface GetLifiSwapRoutesArgs { } export interface GetLifiSwapRoutesReturn { - routes: Array + routes: Array } export interface GetLifiSwapQuoteArgs { params: GetLifiSwapQuoteParams } export interface GetLifiSwapQuoteReturn { - quote: LifiSwapQuote + quote: LifiSwapQuote } export interface GetIntentCallsPayloadsArgs { userAddress: string @@ -1737,9 +1916,9 @@ export interface GetIntentCallsPayloadsReturn { metaTxns: Array trailsFee: TrailsFee quote: IntentQuote - feeQuotes: {[key: string]: string} + feeQuotes: { [key: string]: string } originIntentAddress: string - destinationIntentAddress: string + destinationIntentAddress: string } export interface CommitIntentConfigArgs { originIntentAddress: string @@ -1751,54 +1930,52 @@ export interface CommitIntentConfigArgs { } export interface CommitIntentConfigReturn { - config: IntentConfig + config: IntentConfig } export interface GetIntentConfigArgs { intentAddress: string } export interface GetIntentConfigReturn { - config: IntentConfig -} -export interface ListCurrencyGroupsArgs { + config: IntentConfig } +export interface ListCurrencyGroupsArgs {} export interface ListCurrencyGroupsReturn { - currencyGroups: Array + currencyGroups: Array } export interface AddOffchainInventoryArgs { inventory: OffchainInventory } export interface AddOffchainInventoryReturn { - inventoryId: number + inventoryId: number } export interface GetOffchainInventoryArgs { inventoryId: number } export interface GetOffchainInventoryReturn { - inventory: OffchainInventory + inventory: OffchainInventory } export interface ListOffchainInventoriesArgs { projectId: number } export interface ListOffchainInventoriesReturn { - inventory: Array + inventory: Array } export interface UpdateOffchainInventoryArgs { inventory: OffchainInventory } -export interface UpdateOffchainInventoryReturn { -} +export interface UpdateOffchainInventoryReturn {} export interface DeleteOffchainInventoryArgs { inventoryId: number } export interface DeleteOffchainInventoryReturn { - ok: boolean + ok: boolean } export interface RequestOffchainPaymentArgs { inventoryId: number @@ -1808,7 +1985,7 @@ export interface RequestOffchainPaymentArgs { } export interface RequestOffchainPaymentReturn { - payment: PaymentResponse + payment: PaymentResponse } export interface ListOffchainPaymentsArgs { inventoryId: number @@ -1817,14 +1994,14 @@ export interface ListOffchainPaymentsArgs { export interface ListOffchainPaymentsReturn { page: Page - payments: Array + payments: Array } export interface SavePackArgs { pack: Pack } export interface SavePackReturn { - merkleRoot: string + merkleRoot: string } export interface GetPackArgs { contractAddress: string @@ -1833,7 +2010,7 @@ export interface GetPackArgs { } export interface GetPackReturn { - pack: Pack + pack: Pack } export interface GetPackIdsArgs { contractAddress: string @@ -1841,7 +2018,7 @@ export interface GetPackIdsArgs { } export interface GetPackIdsReturn { - packIds: Array + packIds: Array } export interface DeletePackArgs { contractAddress: string @@ -1850,14 +2027,14 @@ export interface DeletePackArgs { } export interface DeletePackReturn { - status: boolean + status: boolean } export interface UpdatePackContentArgs { pack: Pack } export interface UpdatePackContentReturn { - merkleRoot: string + merkleRoot: string } export interface GetRevealTxDataArgs { contractAddress: string @@ -1867,7 +2044,7 @@ export interface GetRevealTxDataArgs { } export interface GetRevealTxDataReturn { - txData: string + txData: string } export interface CheckoutOptionsPrimaryArgs { chainId: number @@ -1878,7 +2055,7 @@ export interface CheckoutOptionsPrimaryArgs { } export interface CheckoutOptionsPrimaryReturn { - options: CheckoutOptions + options: CheckoutOptions } export interface CheckoutOptionsSecondaryArgs { chainId: number @@ -1887,7 +2064,7 @@ export interface CheckoutOptionsSecondaryArgs { } export interface CheckoutOptionsSecondaryReturn { - options: CheckoutOptions + options: CheckoutOptions } export interface CheckoutOptionsGetTransakContractIDArgs { chainId: number @@ -1895,28 +2072,28 @@ export interface CheckoutOptionsGetTransakContractIDArgs { } export interface CheckoutOptionsGetTransakContractIDReturn { - contractId: string + contractId: string } export interface FortePayCreateIntentArgs { intent: FortePayCreateIntent } export interface FortePayCreateIntentReturn { - resp: FortePayIntent + resp: FortePayIntent } export interface FortePayGetPaymentStatusesArgs { paymentIntentIds: Array } export interface FortePayGetPaymentStatusesReturn { - statuses: Array + statuses: Array } export interface GetCCTPTransferArgs { id: string } export interface GetCCTPTransferReturn { - transfer: CCTPTransfer + transfer: CCTPTransfer } export interface QueueCCTPTransferArgs { sourceTxHash?: string @@ -1926,21 +2103,21 @@ export interface QueueCCTPTransferArgs { } export interface QueueCCTPTransferReturn { - transfer: CCTPTransfer + transfer: CCTPTransfer } export interface QueueIntentConfigExecutionArgs { intentConfigId: number } export interface QueueIntentConfigExecutionReturn { - status: boolean + status: boolean } export interface GetIntentConfigExecutionStatusArgs { intentConfigId: number } export interface GetIntentConfigExecutionStatusReturn { - executionStatus: string + executionStatus: string } export interface ListIntentConfigsArgs { page?: Page @@ -1949,18 +2126,16 @@ export interface ListIntentConfigsArgs { export interface ListIntentConfigsReturn { page: Page - intentConfigs: Array + intentConfigs: Array } export interface QueueMetaTxnReceiptArgs { metaTxID: string } export interface QueueMetaTxnReceiptReturn { - status: boolean + status: boolean } - - // // Client // @@ -1977,1420 +2152,1743 @@ export class API implements API { private url(name: string): string { return this.hostname + this.path + name } - + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Ping'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Version'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - version: (_data.version), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + version: _data.version, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RuntimeStatus'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + clock = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Clock'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - serverTime: (_data.serverTime), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Clock'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + serverTime: _data.serverTime, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSequenceContext'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - data: (_data.data), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + data: _data.data, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getAuthToken = (args: GetAuthTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetAuthToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - jwtToken: (_data.jwtToken), - address: (_data.address), - user: (_data.user), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetAuthToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + jwtToken: _data.jwtToken, + address: _data.address, + user: _data.user, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getAuthToken2 = (args: GetAuthToken2Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetAuthToken2'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - jwtToken: (_data.jwtToken), - address: (_data.address), - user: (_data.user), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sendPasswordlessLink = (args: SendPasswordlessLinkArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SendPasswordlessLink'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - registerPublicKey = (args: RegisterPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RegisterPublicKey'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetAuthToken2'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + jwtToken: _data.jwtToken, + address: _data.address, + user: _data.user, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sendPasswordlessLink = ( + args: SendPasswordlessLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SendPasswordlessLink'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + registerPublicKey = ( + args: RegisterPublicKeyArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RegisterPublicKey'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPublicKey = (args: GetPublicKeyArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPublicKey'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - publicKey: (_data.publicKey), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPublicKey'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + publicKey: _data.publicKey, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + friendList = (args: FriendListArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FriendList'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - friends: >(_data.friends), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getFriendByAddress = (args: GetFriendByAddressArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetFriendByAddress'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FriendList'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + friends: >_data.friends, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getFriendByAddress = ( + args: GetFriendByAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetFriendByAddress'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + searchFriends = (args: SearchFriendsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SearchFriends'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - friends: >(_data.friends), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SearchFriends'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + friends: >_data.friends, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + addFriend = (args: AddFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddFriend'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateFriendNickname = (args: UpdateFriendNicknameArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateFriendNickname'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - friend: (_data.friend), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('AddFriend'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateFriendNickname = ( + args: UpdateFriendNicknameArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateFriendNickname'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + friend: _data.friend, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + removeFriend = (args: RemoveFriendArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveFriend'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RemoveFriend'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + contractCall = (args: ContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ContractCall'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - returns: >(_data.returns), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - decodeContractCall = (args: DecodeContractCallArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DecodeContractCall'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - call: (_data.call), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - lookupContractCallSelectors = (args: LookupContractCallSelectorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('LookupContractCallSelectors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - signatures: >>(_data.signatures), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageFetch = (args: UserStorageFetchArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageFetch'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - object: (_data.object), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageSave = (args: UserStorageSaveArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageSave'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageDelete = (args: UserStorageDeleteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageDelete'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - userStorageFetchAll = (args: UserStorageFetchAllArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UserStorageFetchAll'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - objects: <{[key: string]: any}>(_data.objects), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMoonpayLink = (args: GetMoonpayLinkArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMoonpayLink'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - signedUrl: (_data.signedUrl), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - resolveENSAddress = (args: ResolveENSAddressArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ResolveENSAddress'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - address: (_data.address), - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidSignature = (args: IsValidSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidMessageSignature = (args: IsValidMessageSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidMessageSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidTypedDataSignature = (args: IsValidTypedDataSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidTypedDataSignature'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidETHAuthProof = (args: IsValidETHAuthProofArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidETHAuthProof'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - isValid: (_data.isValid), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('ContractCall'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + returns: >_data.returns, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + decodeContractCall = ( + args: DecodeContractCallArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('DecodeContractCall'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + call: _data.call, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + lookupContractCallSelectors = ( + args: LookupContractCallSelectorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('LookupContractCallSelectors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + signatures: >>_data.signatures, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageFetch = ( + args: UserStorageFetchArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageFetch'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + object: _data.object, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageSave = ( + args: UserStorageSaveArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageSave'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageDelete = ( + args: UserStorageDeleteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageDelete'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + userStorageFetchAll = ( + args: UserStorageFetchAllArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UserStorageFetchAll'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + objects: <{ [key: string]: any }>_data.objects, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMoonpayLink = ( + args: GetMoonpayLinkArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMoonpayLink'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + signedUrl: _data.signedUrl, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + resolveENSAddress = ( + args: ResolveENSAddressArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ResolveENSAddress'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + address: _data.address, + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidSignature = ( + args: IsValidSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidMessageSignature = ( + args: IsValidMessageSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidMessageSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidTypedDataSignature = ( + args: IsValidTypedDataSignatureArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidTypedDataSignature'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidETHAuthProof = ( + args: IsValidETHAuthProofArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidETHAuthProof'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isValid: _data.isValid, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getOnRampURL = (args: GetOnRampURLArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetOnRampURL'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - url: (_data.url), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetOnRampURL'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + url: _data.url, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetClientToken'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetNFTCheckoutToken = (args: SardineGetNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetNFTCheckoutToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetNFTCheckoutOrderStatus = (args: SardineGetNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetNFTCheckoutOrderStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetClientToken'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetNFTCheckoutToken = ( + args: SardineGetNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetNFTCheckoutOrderStatus = ( + args: SardineGetNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetSupportedRegions = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedRegions'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - regions: >(_data.regions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetSupportedFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedFiatCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetSupportedRegions'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + regions: >_data.regions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetSupportedFiatCurrencies = ( + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetSupportedFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetSupportedTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetSupportedTokenForSwap = (args: SardineGetSupportedTokenForSwapArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetSupportedTokenForSwap'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetSupportedTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetSupportedTokenForSwap = ( + args: SardineGetSupportedTokenForSwapArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetSupportedTokenForSwap'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sardineGetEnabledTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetEnabledTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sardineGetQuote = (args: SardineGetQuoteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SardineGetQuote'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SardineGetEnabledTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sardineGetQuote = ( + args: SardineGetQuoteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SardineGetQuote'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSardineClientToken = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineClientToken'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - token: (_data.token), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getSardineNFTCheckoutToken = (args: GetSardineNFTCheckoutTokenArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineNFTCheckoutToken'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getSardineNFTCheckoutOrderStatus = (args: GetSardineNFTCheckoutOrderStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSardineNFTCheckoutOrderStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSardineClientToken'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + token: _data.token, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getSardineNFTCheckoutToken = ( + args: GetSardineNFTCheckoutTokenArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetSardineNFTCheckoutToken'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getSardineNFTCheckoutOrderStatus = ( + args: GetSardineNFTCheckoutOrderStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetSardineNFTCheckoutOrderStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetCountries = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetCountries'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - regions: >(_data.regions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetCountries'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + regions: >_data.regions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetCryptoCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetCryptoCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencies: >(_data.currencies), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetCryptoCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencies: >_data.currencies, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + transakGetFiatCurrencies = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetFiatCurrencies'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencies: >(_data.currencies), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - transakGetPrice = (args: TransakGetPriceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetPrice'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - price: (_data.price), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - transakGetSupportedNFTCheckoutChains = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('TransakGetSupportedNFTCheckoutChains'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chains: >(_data.chains), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('TransakGetFiatCurrencies'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencies: >_data.currencies, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + transakGetPrice = ( + args: TransakGetPriceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('TransakGetPrice'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + price: _data.price, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + transakGetSupportedNFTCheckoutChains = ( + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('TransakGetSupportedNFTCheckoutChains'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chains: >_data.chains, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getCoinPrices = (args: GetCoinPricesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCoinPrices'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokenPrices: >(_data.tokenPrices), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getCollectiblePrices = (args: GetCollectiblePricesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCollectiblePrices'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokenPrices: >(_data.tokenPrices), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getExchangeRate = (args: GetExchangeRateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetExchangeRate'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - exchangeRate: (_data.exchangeRate), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetCoinPrices'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokenPrices: >_data.tokenPrices, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getCollectiblePrices = ( + args: GetCollectiblePricesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCollectiblePrices'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokenPrices: >_data.tokenPrices, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getExchangeRate = ( + args: GetExchangeRateArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetExchangeRate'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + exchangeRate: _data.exchangeRate, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + memoryStore = (args: MemoryStoreArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('MemoryStore'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('MemoryStore'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + memoryLoad = (args: MemoryLoadArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('MemoryLoad'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - value: (_data.value), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('MemoryLoad'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + value: _data.value, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getInviteInfo = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetInviteInfo'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - inviteInfo: (_data.inviteInfo), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - isValidAccessCode = (args: IsValidAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('IsValidAccessCode'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - internalClaimAccessCode = (args: InternalClaimAccessCodeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('InternalClaimAccessCode'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - blockNumberAtTime = (args: BlockNumberAtTimeArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('BlockNumberAtTime'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - blocks: >(_data.blocks), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - paperSessionSecret = (args: PaperSessionSecretArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PaperSessionSecret'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - secret: (_data.secret), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - paperSessionSecret2 = (args: PaperSessionSecret2Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PaperSessionSecret2'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - secret: (_data.secret), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetInviteInfo'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inviteInfo: _data.inviteInfo, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + isValidAccessCode = ( + args: IsValidAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('IsValidAccessCode'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + internalClaimAccessCode = ( + args: InternalClaimAccessCodeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('InternalClaimAccessCode'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + blockNumberAtTime = ( + args: BlockNumberAtTimeArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('BlockNumberAtTime'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + blocks: >_data.blocks, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + paperSessionSecret = ( + args: PaperSessionSecretArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PaperSessionSecret'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + secret: _data.secret, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + paperSessionSecret2 = ( + args: PaperSessionSecret2Args, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PaperSessionSecret2'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + secret: _data.secret, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + linkWallet = (args: LinkWalletArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('LinkWallet'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLinkedWallets = (args: GetLinkedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLinkedWallets'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - linkedWallets: >(_data.linkedWallets), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - removeLinkedWallet = (args: RemoveLinkedWalletArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveLinkedWallet'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - generateWaaSVerificationURL = (args: GenerateWaaSVerificationURLArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GenerateWaaSVerificationURL'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - verificationURL: (_data.verificationURL), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - validateWaaSVerificationNonce = (args: ValidateWaaSVerificationNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ValidateWaaSVerificationNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - walletAddress: (_data.walletAddress), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listAdoptedWallets = (args: ListAdoptedWalletsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListAdoptedWallets'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - wallets: >(_data.wallets), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('LinkWallet'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLinkedWallets = ( + args: GetLinkedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLinkedWallets'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + linkedWallets: >_data.linkedWallets, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + removeLinkedWallet = ( + args: RemoveLinkedWalletArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveLinkedWallet'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + generateWaaSVerificationURL = ( + args: GenerateWaaSVerificationURLArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GenerateWaaSVerificationURL'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + verificationURL: _data.verificationURL, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + validateWaaSVerificationNonce = ( + args: ValidateWaaSVerificationNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ValidateWaaSVerificationNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + walletAddress: _data.walletAddress, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listAdoptedWallets = ( + args: ListAdoptedWalletsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListAdoptedWallets'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + wallets: >_data.wallets, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getLifiChains = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiChains'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chains: >(_data.chains), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetLifiChains'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chains: >_data.chains, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getLifiTokens = (args: GetLifiTokensArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiTokens'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLifiSwapRoutes = (args: GetLifiSwapRoutesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiSwapRoutes'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - routes: >(_data.routes), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getLifiSwapQuote = (args: GetLifiSwapQuoteArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetLifiSwapQuote'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentCallsPayloads = (args: GetIntentCallsPayloadsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentCallsPayloads'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - calls: >(_data.calls), - preconditions: >(_data.preconditions), - metaTxns: >(_data.metaTxns), - trailsFee: (_data.trailsFee), - quote: (_data.quote), - feeQuotes: <{[key: string]: string}>(_data.feeQuotes), - originIntentAddress: (_data.originIntentAddress), - destinationIntentAddress: (_data.destinationIntentAddress), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - commitIntentConfig = (args: CommitIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CommitIntentConfig'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - config: (_data.config), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentConfig = (args: GetIntentConfigArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentConfig'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - config: (_data.config), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetLifiTokens'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLifiSwapRoutes = ( + args: GetLifiSwapRoutesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLifiSwapRoutes'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + routes: >_data.routes, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getLifiSwapQuote = ( + args: GetLifiSwapQuoteArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetLifiSwapQuote'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentCallsPayloads = ( + args: GetIntentCallsPayloadsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentCallsPayloads'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + calls: >_data.calls, + preconditions: >_data.preconditions, + metaTxns: >_data.metaTxns, + trailsFee: _data.trailsFee, + quote: _data.quote, + feeQuotes: <{ [key: string]: string }>_data.feeQuotes, + originIntentAddress: _data.originIntentAddress, + destinationIntentAddress: _data.destinationIntentAddress, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + commitIntentConfig = ( + args: CommitIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CommitIntentConfig'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + config: _data.config, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentConfig = ( + args: GetIntentConfigArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentConfig'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + config: _data.config, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + listCurrencyGroups = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListCurrencyGroups'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - currencyGroups: >(_data.currencyGroups), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addOffchainInventory = (args: AddOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventoryId: (_data.inventoryId), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getOffchainInventory = (args: GetOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventory: (_data.inventory), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listOffchainInventories = (args: ListOffchainInventoriesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListOffchainInventories'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - inventory: >(_data.inventory), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateOffchainInventory = (args: UpdateOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return {} - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - deleteOffchainInventory = (args: DeleteOffchainInventoryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DeleteOffchainInventory'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - ok: (_data.ok), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - requestOffchainPayment = (args: RequestOffchainPaymentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RequestOffchainPayment'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - payment: (_data.payment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listOffchainPayments = (args: ListOffchainPaymentsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListOffchainPayments'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - payments: >(_data.payments), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('ListCurrencyGroups'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + currencyGroups: >_data.currencyGroups, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addOffchainInventory = ( + args: AddOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventoryId: _data.inventoryId, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getOffchainInventory = ( + args: GetOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventory: _data.inventory, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listOffchainInventories = ( + args: ListOffchainInventoriesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListOffchainInventories'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + inventory: >_data.inventory, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateOffchainInventory = ( + args: UpdateOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return {} + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + deleteOffchainInventory = ( + args: DeleteOffchainInventoryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('DeleteOffchainInventory'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + ok: _data.ok, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + requestOffchainPayment = ( + args: RequestOffchainPaymentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RequestOffchainPayment'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + payment: _data.payment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listOffchainPayments = ( + args: ListOffchainPaymentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListOffchainPayments'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + payments: >_data.payments, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + savePack = (args: SavePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SavePack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - merkleRoot: (_data.merkleRoot), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SavePack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + merkleRoot: _data.merkleRoot, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPack = (args: GetPackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - pack: (_data.pack), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + pack: _data.pack, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getPackIds = (args: GetPackIdsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetPackIds'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - packIds: >(_data.packIds), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - deletePack = (args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('DeletePack'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updatePackContent = (args: UpdatePackContentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdatePackContent'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - merkleRoot: (_data.merkleRoot), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getRevealTxData = (args: GetRevealTxDataArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetRevealTxData'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - txData: (_data.txData), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsPrimary = (args: CheckoutOptionsPrimaryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsPrimary'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: (_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsSecondary = (args: CheckoutOptionsSecondaryArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsSecondary'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: (_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - checkoutOptionsGetTransakContractID = (args: CheckoutOptionsGetTransakContractIDArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('CheckoutOptionsGetTransakContractID'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - contractId: (_data.contractId), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - fortePayCreateIntent = (args: FortePayCreateIntentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FortePayCreateIntent'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - resp: (_data.resp), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - fortePayGetPaymentStatuses = (args: FortePayGetPaymentStatusesArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FortePayGetPaymentStatuses'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - statuses: >(_data.statuses), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getCCTPTransfer = (args: GetCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetCCTPTransfer'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - transfer: (_data.transfer), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueCCTPTransfer = (args: QueueCCTPTransferArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueCCTPTransfer'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - transfer: (_data.transfer), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueIntentConfigExecution = (args: QueueIntentConfigExecutionArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueIntentConfigExecution'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getIntentConfigExecutionStatus = (args: GetIntentConfigExecutionStatusArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetIntentConfigExecutionStatus'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - executionStatus: (_data.executionStatus), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listIntentConfigs = (args: ListIntentConfigsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListIntentConfigs'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - intentConfigs: >(_data.intentConfigs), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - queueMetaTxnReceipt = (args: QueueMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('QueueMetaTxnReceipt'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetPackIds'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + packIds: >_data.packIds, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - -} - const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: {[key: string]: string} = { ...headers, 'Content-Type': 'application/json' } + deletePack = (args: DeletePackArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('DeletePack'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updatePackContent = ( + args: UpdatePackContentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdatePackContent'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + merkleRoot: _data.merkleRoot, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getRevealTxData = ( + args: GetRevealTxDataArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetRevealTxData'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + txData: _data.txData, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsPrimary = ( + args: CheckoutOptionsPrimaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsPrimary'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: _data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsSecondary = ( + args: CheckoutOptionsSecondaryArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsSecondary'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: _data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + checkoutOptionsGetTransakContractID = ( + args: CheckoutOptionsGetTransakContractIDArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('CheckoutOptionsGetTransakContractID'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + contractId: _data.contractId, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + fortePayCreateIntent = ( + args: FortePayCreateIntentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('FortePayCreateIntent'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + resp: _data.resp, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + fortePayGetPaymentStatuses = ( + args: FortePayGetPaymentStatusesArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('FortePayGetPaymentStatuses'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + statuses: >_data.statuses, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getCCTPTransfer = ( + args: GetCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + transfer: _data.transfer, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueCCTPTransfer = ( + args: QueueCCTPTransferArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueCCTPTransfer'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + transfer: _data.transfer, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueIntentConfigExecution = ( + args: QueueIntentConfigExecutionArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueIntentConfigExecution'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getIntentConfigExecutionStatus = ( + args: GetIntentConfigExecutionStatusArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetIntentConfigExecutionStatus'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + executionStatus: _data.executionStatus, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listIntentConfigs = ( + args: ListIntentConfigsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListIntentConfigs'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + intentConfigs: >_data.intentConfigs, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + queueMetaTxnReceipt = ( + args: QueueMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('QueueMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } reqHeaders[WebrpcHeader] = WebrpcHeaderValue return { method: 'POST', headers: reqHeaders, body: JSON.stringify(body || {}), - signal + signal, } } const buildResponse = (res: Response): Promise => { - return res.text().then(text => { + return res.text().then((text) => { let data try { data = JSON.parse(text) - } catch(error) { + } catch (error) { let message = '' - if (error instanceof Error) { + if (error instanceof Error) { message = error.message } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`}, - ) + cause: `JSON.parse(): ${message}: response text: ${text}`, + }) } if (!res.ok) { - const code: number = (typeof data.code === 'number') ? data.code : 0 + const code: number = typeof data.code === 'number' ? data.code : 0 throw (webrpcErrorByCode[code] || WebrpcError).new(data) } return data @@ -3435,7 +3933,7 @@ export class WebrpcEndpointError extends WebrpcError { code: number = 0, message: string = `endpoint error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcEndpointError.prototype) @@ -3448,7 +3946,7 @@ export class WebrpcRequestFailedError extends WebrpcError { code: number = -1, message: string = `request failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) @@ -3461,7 +3959,7 @@ export class WebrpcBadRouteError extends WebrpcError { code: number = -2, message: string = `bad route`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) @@ -3474,7 +3972,7 @@ export class WebrpcBadMethodError extends WebrpcError { code: number = -3, message: string = `bad method`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) @@ -3487,7 +3985,7 @@ export class WebrpcBadRequestError extends WebrpcError { code: number = -4, message: string = `bad request`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) @@ -3500,7 +3998,7 @@ export class WebrpcBadResponseError extends WebrpcError { code: number = -5, message: string = `bad response`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) @@ -3513,7 +4011,7 @@ export class WebrpcServerPanicError extends WebrpcError { code: number = -6, message: string = `server panic`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) @@ -3526,7 +4024,7 @@ export class WebrpcInternalErrorError extends WebrpcError { code: number = -7, message: string = `internal error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) @@ -3539,7 +4037,7 @@ export class WebrpcClientDisconnectedError extends WebrpcError { code: number = -8, message: string = `client disconnected`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) @@ -3552,7 +4050,7 @@ export class WebrpcStreamLostError extends WebrpcError { code: number = -9, message: string = `stream lost`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) @@ -3565,14 +4063,13 @@ export class WebrpcStreamFinishedError extends WebrpcError { code: number = -10, message: string = `stream finished`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } - // Schema errors export class UnauthorizedError extends WebrpcError { @@ -3581,7 +4078,7 @@ export class UnauthorizedError extends WebrpcError { code: number = 1000, message: string = `Unauthorized access`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedError.prototype) @@ -3594,7 +4091,7 @@ export class PermissionDeniedError extends WebrpcError { code: number = 1001, message: string = `Permission denied`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, PermissionDeniedError.prototype) @@ -3607,7 +4104,7 @@ export class SessionExpiredError extends WebrpcError { code: number = 1002, message: string = `Session expired`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SessionExpiredError.prototype) @@ -3620,7 +4117,7 @@ export class MethodNotFoundError extends WebrpcError { code: number = 1003, message: string = `Method not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MethodNotFoundError.prototype) @@ -3633,7 +4130,7 @@ export class RequestConflictError extends WebrpcError { code: number = 1004, message: string = `Conflict with target resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RequestConflictError.prototype) @@ -3646,7 +4143,7 @@ export class AbortedError extends WebrpcError { code: number = 1005, message: string = `Request aborted`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AbortedError.prototype) @@ -3659,7 +4156,7 @@ export class GeoblockedError extends WebrpcError { code: number = 1006, message: string = `Geoblocked region`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, GeoblockedError.prototype) @@ -3672,7 +4169,7 @@ export class RateLimitedError extends WebrpcError { code: number = 1007, message: string = `Rate-limited. Please slow down.`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RateLimitedError.prototype) @@ -3685,7 +4182,7 @@ export class ProjectNotFoundError extends WebrpcError { code: number = 1008, message: string = `Project not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, ProjectNotFoundError.prototype) @@ -3698,7 +4195,7 @@ export class AccessKeyNotFoundError extends WebrpcError { code: number = 1101, message: string = `Access key not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) @@ -3711,7 +4208,7 @@ export class AccessKeyMismatchError extends WebrpcError { code: number = 1102, message: string = `Access key mismatch`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) @@ -3724,7 +4221,7 @@ export class InvalidOriginError extends WebrpcError { code: number = 1103, message: string = `Invalid origin for Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidOriginError.prototype) @@ -3737,7 +4234,7 @@ export class InvalidServiceError extends WebrpcError { code: number = 1104, message: string = `Service not enabled for Access key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidServiceError.prototype) @@ -3750,7 +4247,7 @@ export class UnauthorizedUserError extends WebrpcError { code: number = 1105, message: string = `Unauthorized user`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedUserError.prototype) @@ -3763,7 +4260,7 @@ export class QuotaExceededError extends WebrpcError { code: number = 1200, message: string = `Quota request exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaExceededError.prototype) @@ -3776,7 +4273,7 @@ export class QuotaRateLimitError extends WebrpcError { code: number = 1201, message: string = `Quota rate limit exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaRateLimitError.prototype) @@ -3789,7 +4286,7 @@ export class NoDefaultKeyError extends WebrpcError { code: number = 1300, message: string = `No default access key found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NoDefaultKeyError.prototype) @@ -3802,7 +4299,7 @@ export class MaxAccessKeysError extends WebrpcError { code: number = 1301, message: string = `Access keys limit reached`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MaxAccessKeysError.prototype) @@ -3815,7 +4312,7 @@ export class AtLeastOneKeyError extends WebrpcError { code: number = 1302, message: string = `You need at least one Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) @@ -3828,7 +4325,7 @@ export class TimeoutError extends WebrpcError { code: number = 1900, message: string = `Request timed out`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, TimeoutError.prototype) @@ -3841,7 +4338,7 @@ export class InvalidArgumentError extends WebrpcError { code: number = 2000, message: string = `Invalid argument`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidArgumentError.prototype) @@ -3854,7 +4351,7 @@ export class UnavailableError extends WebrpcError { code: number = 2002, message: string = `Unavailable resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnavailableError.prototype) @@ -3867,7 +4364,7 @@ export class QueryFailedError extends WebrpcError { code: number = 2003, message: string = `Query failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QueryFailedError.prototype) @@ -3880,7 +4377,7 @@ export class NotFoundError extends WebrpcError { code: number = 3000, message: string = `Resource not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotFoundError.prototype) @@ -3893,14 +4390,13 @@ export class UnsupportedNetworkError extends WebrpcError { code: number = 3008, message: string = `Unsupported network`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnsupportedNetworkError.prototype) } } - export enum errors { WebrpcEndpoint = 'WebrpcEndpoint', WebrpcRequestFailed = 'WebrpcRequestFailed', @@ -4019,4 +4515,3 @@ export const webrpcErrorByCode: { [code: number]: any } = { } export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise - diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md index 63fd273bc..73a079116 100644 --- a/packages/services/guard/CHANGELOG.md +++ b/packages/services/guard/CHANGELOG.md @@ -2302,7 +2302,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md index 6b1ea35be..29f042bf6 100644 --- a/packages/services/indexer/CHANGELOG.md +++ b/packages/services/indexer/CHANGELOG.md @@ -1422,7 +1422,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -1767,7 +1766,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md index b51ee450c..fa04faa2d 100644 --- a/packages/services/metadata/CHANGELOG.md +++ b/packages/services/metadata/CHANGELOG.md @@ -1422,7 +1422,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -1775,7 +1774,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md index c35614659..2a3c09e46 100644 --- a/packages/services/relayer/CHANGELOG.md +++ b/packages/services/relayer/CHANGELOG.md @@ -2476,7 +2476,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -3139,7 +3138,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts b/packages/services/relayer/src/rpc-relayer/relayer.gen.ts index 79ca49296..a9e6b4440 100644 --- a/packages/services/relayer/src/rpc-relayer/relayer.gen.ts +++ b/packages/services/relayer/src/rpc-relayer/relayer.gen.ts @@ -5,72 +5,71 @@ // // webrpc-gen -schema=relayer.ridl -target=typescript -client -out=./clients/relayer.gen.ts -export const WebrpcHeader = "Webrpc" +export const WebrpcHeader = 'Webrpc' -export const WebrpcHeaderValue = "webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1" +export const WebrpcHeaderValue = 'webrpc@v0.26.0;gen-typescript@v0.17.0;sequence-relayer@v0.4.1' // WebRPC description and code-gen version -export const WebRPCVersion = "v1" +export const WebRPCVersion = 'v1' // Schema version of your RIDL schema -export const WebRPCSchemaVersion = "v0.4.1" +export const WebRPCSchemaVersion = 'v0.4.1' // Schema hash generated from your RIDL schema -export const WebRPCSchemaHash = "62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a" +export const WebRPCSchemaHash = '62fe2b49d57c4a0d3960ac1176d48ecfffc7af5a' type WebrpcGenVersions = { - webrpcGenVersion: string; - codeGenName: string; - codeGenVersion: string; - schemaName: string; - schemaVersion: string; -}; + webrpcGenVersion: string + codeGenName: string + codeGenVersion: string + schemaName: string + schemaVersion: string +} export function VersionFromHeader(headers: Headers): WebrpcGenVersions { - const headerValue = headers.get(WebrpcHeader); + const headerValue = headers.get(WebrpcHeader) if (!headerValue) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - return parseWebrpcGenVersions(headerValue); + return parseWebrpcGenVersions(headerValue) } function parseWebrpcGenVersions(header: string): WebrpcGenVersions { - const versions = header.split(";"); + const versions = header.split(';') if (versions.length < 3) { return { - webrpcGenVersion: "", - codeGenName: "", - codeGenVersion: "", - schemaName: "", - schemaVersion: "", - }; + webrpcGenVersion: '', + codeGenName: '', + codeGenVersion: '', + schemaName: '', + schemaVersion: '', + } } - const [_, webrpcGenVersion] = versions[0]!.split("@"); - const [codeGenName, codeGenVersion] = versions[1]!.split("@"); - const [schemaName, schemaVersion] = versions[2]!.split("@"); + const [_, webrpcGenVersion] = versions[0]!.split('@') + const [codeGenName, codeGenVersion] = versions[1]!.split('@') + const [schemaName, schemaVersion] = versions[2]!.split('@') return { - webrpcGenVersion: webrpcGenVersion ?? "", - codeGenName: codeGenName ?? "", - codeGenVersion: codeGenVersion ?? "", - schemaName: schemaName ?? "", - schemaVersion: schemaVersion ?? "", - }; + webrpcGenVersion: webrpcGenVersion ?? '', + codeGenName: codeGenName ?? '', + codeGenVersion: codeGenVersion ?? '', + schemaName: schemaName ?? '', + schemaVersion: schemaVersion ?? '', + } } // // Types // - export enum ETHTxnStatus { UNKNOWN = 'UNKNOWN', DROPPED = 'DROPPED', @@ -79,7 +78,7 @@ export enum ETHTxnStatus { SUCCEEDED = 'SUCCEEDED', PARTIALLY_FAILED = 'PARTIALLY_FAILED', FAILED = 'FAILED', - PENDING_PRECONDITION = 'PENDING_PRECONDITION' + PENDING_PRECONDITION = 'PENDING_PRECONDITION', } export enum TransferType { @@ -88,7 +87,7 @@ export enum TransferType { BRIDGE_DEPOSIT = 'BRIDGE_DEPOSIT', BRIDGE_WITHDRAW = 'BRIDGE_WITHDRAW', BURN = 'BURN', - UNKNOWN = 'UNKNOWN' + UNKNOWN = 'UNKNOWN', } export enum SimulateStatus { @@ -97,18 +96,18 @@ export enum SimulateStatus { FAILED = 'FAILED', ABORTED = 'ABORTED', REVERTED = 'REVERTED', - NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS' + NOT_ENOUGH_GAS = 'NOT_ENOUGH_GAS', } export enum FeeTokenType { UNKNOWN = 'UNKNOWN', ERC20_TOKEN = 'ERC20_TOKEN', - ERC1155_TOKEN = 'ERC1155_TOKEN' + ERC1155_TOKEN = 'ERC1155_TOKEN', } export enum SortOrder { DESC = 'DESC', - ASC = 'ASC' + ASC = 'ASC', } export interface Version { @@ -138,8 +137,7 @@ export interface SenderStatus { active: boolean } -export interface RuntimeChecks { -} +export interface RuntimeChecks {} export interface SequenceContext { factory: string @@ -215,8 +213,8 @@ export interface MetaTxnLog { minedAt: string target: string input: string - txnArgs: {[key: string]: any} - txnReceipt?: {[key: string]: any} + txnArgs: { [key: string]: any } + txnReceipt?: { [key: string]: any } walletAddress: string metaTxnNonce: string gasLimit: number @@ -353,9 +351,9 @@ export interface Relayer { getSequenceContext(headers?: object, signal?: AbortSignal): Promise getChainID(headers?: object, signal?: AbortSignal): Promise /** - * + * * Transactions - * + * * TODO (future): rename this to just, 'SendTransaction(txn: MetaTransaction)' or 'SendTransaction(txn: SignedTransaction)', or something.. * Project ID is only used by service and admin calls. Other clients must have projectID passed via the context * TODO: rename return txnHash: string to metaTxnID: string @@ -370,21 +368,41 @@ export interface Relayer { * new, GetTransactionReceipt and WaitTransactionReceipt methods * we can also accept metaTxnId and txnHash .. so can take either or.. I wonder if ERC-4337 has any convention on this? */ - getMetaTxnReceipt(args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnReceipt( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise simulate(args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise simulateV3(args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ - updateMetaTxnGasLimits(args: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal): Promise + updateMetaTxnGasLimits( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise feeTokens(headers?: object, signal?: AbortSignal): Promise feeOptions(args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise /** * TODO: deprecated, to be removed by https://github.com/0xsequence/stack/pull/356 at a later date */ - getMetaTxnNetworkFeeOptions(args: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise - getMetaTransactions(args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise - getTransactionCost(args: GetTransactionCostArgs, headers?: object, signal?: AbortSignal): Promise + getMetaTxnNetworkFeeOptions( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getMetaTransactions( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getTransactionCost( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Sent transactions from an account. If filter is omitted then it will return all transactions. */ @@ -393,7 +411,11 @@ export interface Relayer { * Pending transactions waiting to be mined for an account. This endpoint is just a sugar of `SentTransactions` * with the filter set to pending: true. */ - pendingTransactions(args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise + pendingTransactions( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Legacy Gas Tank */ @@ -403,10 +425,26 @@ export interface Relayer { /** * Legacy Gas Adjustment */ - nextGasTankBalanceAdjustmentNonce(args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal): Promise - adjustGasTankBalance(args: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal): Promise - getGasTankBalanceAdjustment(args: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal): Promise - listGasTankBalanceAdjustments(args: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal): Promise + nextGasTankBalanceAdjustmentNonce( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustGasTankBalance( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + getGasTankBalanceAdjustment( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + listGasTankBalanceAdjustments( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Gas Sponsorship */ @@ -418,43 +456,50 @@ export interface Relayer { /** * Gas Sponsor Lookup */ - addressGasSponsors(args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise + addressGasSponsors( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise /** * Project Balance */ - getProjectBalance(args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise - adjustProjectBalance(args: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise + getProjectBalance( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise + adjustProjectBalance( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise } -export interface PingArgs { -} +export interface PingArgs {} export interface PingReturn { - status: boolean -} -export interface VersionArgs { + status: boolean } +export interface VersionArgs {} export interface VersionReturn { - version: Version -} -export interface RuntimeStatusArgs { + version: Version } +export interface RuntimeStatusArgs {} export interface RuntimeStatusReturn { - status: RuntimeStatus -} -export interface GetSequenceContextArgs { + status: RuntimeStatus } +export interface GetSequenceContextArgs {} export interface GetSequenceContextReturn { - data: SequenceContext -} -export interface GetChainIDArgs { + data: SequenceContext } +export interface GetChainIDArgs {} export interface GetChainIDReturn { - chainID: number + chainID: number } export interface SendMetaTxnArgs { call: MetaTxn @@ -465,7 +510,7 @@ export interface SendMetaTxnArgs { export interface SendMetaTxnReturn { status: boolean - txnHash: string + txnHash: string } export interface GetMetaTxnNonceArgs { walletContractAddress: string @@ -473,14 +518,14 @@ export interface GetMetaTxnNonceArgs { } export interface GetMetaTxnNonceReturn { - nonce: string + nonce: string } export interface GetMetaTxnReceiptArgs { metaTxID: string } export interface GetMetaTxnReceiptReturn { - receipt: MetaTxnReceipt + receipt: MetaTxnReceipt } export interface SimulateArgs { wallet: string @@ -488,7 +533,7 @@ export interface SimulateArgs { } export interface SimulateReturn { - results: Array + results: Array } export interface SimulateV3Args { wallet: string @@ -496,7 +541,7 @@ export interface SimulateV3Args { } export interface SimulateV3Return { - results: Array + results: Array } export interface UpdateMetaTxnGasLimitsArgs { walletAddress: string @@ -505,14 +550,13 @@ export interface UpdateMetaTxnGasLimitsArgs { } export interface UpdateMetaTxnGasLimitsReturn { - payload: string -} -export interface FeeTokensArgs { + payload: string } +export interface FeeTokensArgs {} export interface FeeTokensReturn { isFeeRequired: boolean - tokens: Array + tokens: Array } export interface FeeOptionsArgs { wallet: string @@ -524,7 +568,7 @@ export interface FeeOptionsArgs { export interface FeeOptionsReturn { options: Array sponsored: boolean - quote?: string + quote?: string } export interface GetMetaTxnNetworkFeeOptionsArgs { walletConfig: any @@ -532,7 +576,7 @@ export interface GetMetaTxnNetworkFeeOptionsArgs { } export interface GetMetaTxnNetworkFeeOptionsReturn { - options: Array + options: Array } export interface GetMetaTransactionsArgs { projectId: number @@ -541,7 +585,7 @@ export interface GetMetaTransactionsArgs { export interface GetMetaTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface GetTransactionCostArgs { projectId: number @@ -550,7 +594,7 @@ export interface GetTransactionCostArgs { } export interface GetTransactionCostReturn { - cost: number + cost: number } export interface SentTransactionsArgs { filter?: SentTransactionsFilter @@ -559,7 +603,7 @@ export interface SentTransactionsArgs { export interface SentTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface PendingTransactionsArgs { page?: Page @@ -567,14 +611,14 @@ export interface PendingTransactionsArgs { export interface PendingTransactionsReturn { page: Page - transactions: Array + transactions: Array } export interface GetGasTankArgs { id: number } export interface GetGasTankReturn { - gasTank: GasTank + gasTank: GasTank } export interface AddGasTankArgs { name: string @@ -584,7 +628,7 @@ export interface AddGasTankArgs { export interface AddGasTankReturn { status: boolean - gasTank: GasTank + gasTank: GasTank } export interface UpdateGasTankArgs { id: number @@ -595,14 +639,14 @@ export interface UpdateGasTankArgs { export interface UpdateGasTankReturn { status: boolean - gasTank: GasTank + gasTank: GasTank } export interface NextGasTankBalanceAdjustmentNonceArgs { id: number } export interface NextGasTankBalanceAdjustmentNonceReturn { - nonce: number + nonce: number } export interface AdjustGasTankBalanceArgs { id: number @@ -612,7 +656,7 @@ export interface AdjustGasTankBalanceArgs { export interface AdjustGasTankBalanceReturn { status: boolean - adjustment: GasTankBalanceAdjustment + adjustment: GasTankBalanceAdjustment } export interface GetGasTankBalanceAdjustmentArgs { id: number @@ -620,7 +664,7 @@ export interface GetGasTankBalanceAdjustmentArgs { } export interface GetGasTankBalanceAdjustmentReturn { - adjustment: GasTankBalanceAdjustment + adjustment: GasTankBalanceAdjustment } export interface ListGasTankBalanceAdjustmentsArgs { id: number @@ -629,7 +673,7 @@ export interface ListGasTankBalanceAdjustmentsArgs { export interface ListGasTankBalanceAdjustmentsReturn { page: Page - adjustments: Array + adjustments: Array } export interface ListGasSponsorsArgs { projectId: number @@ -638,7 +682,7 @@ export interface ListGasSponsorsArgs { export interface ListGasSponsorsReturn { page: Page - gasSponsors: Array + gasSponsors: Array } export interface GetGasSponsorArgs { projectId: number @@ -646,7 +690,7 @@ export interface GetGasSponsorArgs { } export interface GetGasSponsorReturn { - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface AddGasSponsorArgs { projectId: number @@ -657,7 +701,7 @@ export interface AddGasSponsorArgs { export interface AddGasSponsorReturn { status: boolean - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface UpdateGasSponsorArgs { projectId: number @@ -668,7 +712,7 @@ export interface UpdateGasSponsorArgs { export interface UpdateGasSponsorReturn { status: boolean - gasSponsor: GasSponsor + gasSponsor: GasSponsor } export interface RemoveGasSponsorArgs { projectId: number @@ -676,7 +720,7 @@ export interface RemoveGasSponsorArgs { } export interface RemoveGasSponsorReturn { - status: boolean + status: boolean } export interface AddressGasSponsorsArgs { address: string @@ -685,14 +729,14 @@ export interface AddressGasSponsorsArgs { export interface AddressGasSponsorsReturn { page: Page - gasSponsors: Array + gasSponsors: Array } export interface GetProjectBalanceArgs { projectId: number } export interface GetProjectBalanceReturn { - balance: number + balance: number } export interface AdjustProjectBalanceArgs { projectId: number @@ -701,11 +745,9 @@ export interface AdjustProjectBalanceArgs { } export interface AdjustProjectBalanceReturn { - balance: number + balance: number } - - // // Client // @@ -722,521 +764,619 @@ export class Relayer implements Relayer { private url(name: string): string { return this.hostname + this.path + name } - + ping = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Ping'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + version = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Version'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - version: (_data.version), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + version: _data.version, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RuntimeStatus'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getSequenceContext = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetSequenceContext'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - data: (_data.data), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetSequenceContext'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + data: _data.data, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getChainID = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetChainID'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - chainID: (_data.chainID), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetChainID'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + chainID: _data.chainID, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + sendMetaTxn = (args: SendMetaTxnArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SendMetaTxn'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - txnHash: (_data.txnHash), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnNonce = (args: GetMetaTxnNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnReceipt = (args: GetMetaTxnReceiptArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnReceipt'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - receipt: (_data.receipt), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SendMetaTxn'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + txnHash: _data.txnHash, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNonce = ( + args: GetMetaTxnNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnReceipt = ( + args: GetMetaTxnReceiptArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnReceipt'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + receipt: _data.receipt, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + simulate = (args: SimulateArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('Simulate'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - results: >(_data.results), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('Simulate'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + results: >_data.results, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + simulateV3 = (args: SimulateV3Args, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SimulateV3'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - results: >(_data.results), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateMetaTxnGasLimits = (args: UpdateMetaTxnGasLimitsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateMetaTxnGasLimits'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - payload: (_data.payload), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('SimulateV3'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + results: >_data.results, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateMetaTxnGasLimits = ( + args: UpdateMetaTxnGasLimitsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateMetaTxnGasLimits'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + payload: _data.payload, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + feeTokens = (headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FeeTokens'), - createHTTPRequest({}, headers, signal) - ).then((res) => { - return buildResponse(res).then(_data => { - return { - isFeeRequired: (_data.isFeeRequired), - tokens: >(_data.tokens), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FeeTokens'), createHTTPRequest({}, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + isFeeRequired: _data.isFeeRequired, + tokens: >_data.tokens, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + feeOptions = (args: FeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('FeeOptions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: >(_data.options), - sponsored: (_data.sponsored), - quote: (_data.quote), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTxnNetworkFeeOptions = (args: GetMetaTxnNetworkFeeOptionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTxnNetworkFeeOptions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - options: >(_data.options), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getMetaTransactions = (args: GetMetaTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetMetaTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getTransactionCost = (args: GetTransactionCostArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetTransactionCost'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - cost: (_data.cost), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - sentTransactions = (args: SentTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('SentTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - pendingTransactions = (args: PendingTransactionsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('PendingTransactions'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - transactions: >(_data.transactions), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('FeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + sponsored: _data.sponsored, + quote: _data.quote, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTxnNetworkFeeOptions = ( + args: GetMetaTxnNetworkFeeOptionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTxnNetworkFeeOptions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + options: >_data.options, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getMetaTransactions = ( + args: GetMetaTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetMetaTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getTransactionCost = ( + args: GetTransactionCostArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetTransactionCost'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + cost: _data.cost, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + sentTransactions = ( + args: SentTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('SentTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + pendingTransactions = ( + args: PendingTransactionsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('PendingTransactions'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + transactions: >_data.transactions, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getGasTank = (args: GetGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + addGasTank = (args: AddGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('AddGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + updateGasTank = (args: UpdateGasTankArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateGasTank'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasTank: (_data.gasTank), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - nextGasTankBalanceAdjustmentNonce = (args: NextGasTankBalanceAdjustmentNonceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('NextGasTankBalanceAdjustmentNonce'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - nonce: (_data.nonce), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - adjustGasTankBalance = (args: AdjustGasTankBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AdjustGasTankBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - adjustment: (_data.adjustment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getGasTankBalanceAdjustment = (args: GetGasTankBalanceAdjustmentArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasTankBalanceAdjustment'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - adjustment: (_data.adjustment), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listGasTankBalanceAdjustments = (args: ListGasTankBalanceAdjustmentsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListGasTankBalanceAdjustments'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - adjustments: >(_data.adjustments), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - listGasSponsors = (args: ListGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('ListGasSponsors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - gasSponsors: >(_data.gasSponsors), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('UpdateGasTank'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasTank: _data.gasTank, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + nextGasTankBalanceAdjustmentNonce = ( + args: NextGasTankBalanceAdjustmentNonceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('NextGasTankBalanceAdjustmentNonce'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + nonce: _data.nonce, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustGasTankBalance = ( + args: AdjustGasTankBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustGasTankBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getGasTankBalanceAdjustment = ( + args: GetGasTankBalanceAdjustmentArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetGasTankBalanceAdjustment'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + adjustment: _data.adjustment, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasTankBalanceAdjustments = ( + args: ListGasTankBalanceAdjustmentsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasTankBalanceAdjustments'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + adjustments: >_data.adjustments, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + listGasSponsors = ( + args: ListGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('ListGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - + getGasSponsor = (args: GetGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - updateGasSponsor = (args: UpdateGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('UpdateGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - gasSponsor: (_data.gasSponsor), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - removeGasSponsor = (args: RemoveGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('RemoveGasSponsor'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - status: (_data.status), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - addressGasSponsors = (args: AddressGasSponsorsArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AddressGasSponsors'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - page: (_data.page), - gasSponsors: >(_data.gasSponsors), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - getProjectBalance = (args: GetProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('GetProjectBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - balance: (_data.balance), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) - } - - adjustProjectBalance = (args: AdjustProjectBalanceArgs, headers?: object, signal?: AbortSignal): Promise => { - return this.fetch( - this.url('AdjustProjectBalance'), - createHTTPRequest(args, headers, signal)).then((res) => { - return buildResponse(res).then(_data => { - return { - balance: (_data.balance), - } - }) - }, (error) => { - throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) - }) + return this.fetch(this.url('GetGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) } - -} - const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { - const reqHeaders: {[key: string]: string} = { ...headers, 'Content-Type': 'application/json' } + addGasSponsor = (args: AddGasSponsorArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('AddGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + updateGasSponsor = ( + args: UpdateGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('UpdateGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + gasSponsor: _data.gasSponsor, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + removeGasSponsor = ( + args: RemoveGasSponsorArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('RemoveGasSponsor'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + status: _data.status, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + addressGasSponsors = ( + args: AddressGasSponsorsArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AddressGasSponsors'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + page: _data.page, + gasSponsors: >_data.gasSponsors, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + getProjectBalance = ( + args: GetProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('GetProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } + + adjustProjectBalance = ( + args: AdjustProjectBalanceArgs, + headers?: object, + signal?: AbortSignal, + ): Promise => { + return this.fetch(this.url('AdjustProjectBalance'), createHTTPRequest(args, headers, signal)).then( + (res) => { + return buildResponse(res).then((_data) => { + return { + balance: _data.balance, + } + }) + }, + (error) => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + }, + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + const reqHeaders: { [key: string]: string } = { ...headers, 'Content-Type': 'application/json' } reqHeaders[WebrpcHeader] = WebrpcHeaderValue return { method: 'POST', headers: reqHeaders, body: JSON.stringify(body || {}), - signal + signal, } } const buildResponse = (res: Response): Promise => { - return res.text().then(text => { + return res.text().then((text) => { let data try { data = JSON.parse(text) - } catch(error) { + } catch (error) { let message = '' - if (error instanceof Error) { + if (error instanceof Error) { message = error.message } throw WebrpcBadResponseError.new({ status: res.status, - cause: `JSON.parse(): ${message}: response text: ${text}`}, - ) + cause: `JSON.parse(): ${message}: response text: ${text}`, + }) } if (!res.ok) { - const code: number = (typeof data.code === 'number') ? data.code : 0 + const code: number = typeof data.code === 'number' ? data.code : 0 throw (webrpcErrorByCode[code] || WebrpcError).new(data) } return data @@ -1281,7 +1421,7 @@ export class WebrpcEndpointError extends WebrpcError { code: number = 0, message: string = `endpoint error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcEndpointError.prototype) @@ -1294,7 +1434,7 @@ export class WebrpcRequestFailedError extends WebrpcError { code: number = -1, message: string = `request failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) @@ -1307,7 +1447,7 @@ export class WebrpcBadRouteError extends WebrpcError { code: number = -2, message: string = `bad route`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) @@ -1320,7 +1460,7 @@ export class WebrpcBadMethodError extends WebrpcError { code: number = -3, message: string = `bad method`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) @@ -1333,7 +1473,7 @@ export class WebrpcBadRequestError extends WebrpcError { code: number = -4, message: string = `bad request`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) @@ -1346,7 +1486,7 @@ export class WebrpcBadResponseError extends WebrpcError { code: number = -5, message: string = `bad response`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) @@ -1359,7 +1499,7 @@ export class WebrpcServerPanicError extends WebrpcError { code: number = -6, message: string = `server panic`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) @@ -1372,7 +1512,7 @@ export class WebrpcInternalErrorError extends WebrpcError { code: number = -7, message: string = `internal error`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) @@ -1385,7 +1525,7 @@ export class WebrpcClientDisconnectedError extends WebrpcError { code: number = -8, message: string = `client disconnected`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) @@ -1398,7 +1538,7 @@ export class WebrpcStreamLostError extends WebrpcError { code: number = -9, message: string = `stream lost`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) @@ -1411,14 +1551,13 @@ export class WebrpcStreamFinishedError extends WebrpcError { code: number = -10, message: string = `stream finished`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) } } - // Schema errors export class UnauthorizedError extends WebrpcError { @@ -1427,7 +1566,7 @@ export class UnauthorizedError extends WebrpcError { code: number = 1000, message: string = `Unauthorized access`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedError.prototype) @@ -1440,7 +1579,7 @@ export class PermissionDeniedError extends WebrpcError { code: number = 1001, message: string = `Permission denied`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, PermissionDeniedError.prototype) @@ -1453,7 +1592,7 @@ export class SessionExpiredError extends WebrpcError { code: number = 1002, message: string = `Session expired`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SessionExpiredError.prototype) @@ -1466,7 +1605,7 @@ export class MethodNotFoundError extends WebrpcError { code: number = 1003, message: string = `Method not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MethodNotFoundError.prototype) @@ -1479,7 +1618,7 @@ export class RequestConflictError extends WebrpcError { code: number = 1004, message: string = `Conflict with target resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RequestConflictError.prototype) @@ -1492,7 +1631,7 @@ export class AbortedError extends WebrpcError { code: number = 1005, message: string = `Request aborted`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AbortedError.prototype) @@ -1505,7 +1644,7 @@ export class GeoblockedError extends WebrpcError { code: number = 1006, message: string = `Geoblocked region`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, GeoblockedError.prototype) @@ -1518,7 +1657,7 @@ export class RateLimitedError extends WebrpcError { code: number = 1007, message: string = `Rate-limited. Please slow down.`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, RateLimitedError.prototype) @@ -1531,7 +1670,7 @@ export class ProjectNotFoundError extends WebrpcError { code: number = 1008, message: string = `Project not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, ProjectNotFoundError.prototype) @@ -1544,7 +1683,7 @@ export class AccessKeyNotFoundError extends WebrpcError { code: number = 1101, message: string = `Access key not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyNotFoundError.prototype) @@ -1557,7 +1696,7 @@ export class AccessKeyMismatchError extends WebrpcError { code: number = 1102, message: string = `Access key mismatch`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AccessKeyMismatchError.prototype) @@ -1570,7 +1709,7 @@ export class InvalidOriginError extends WebrpcError { code: number = 1103, message: string = `Invalid origin for Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidOriginError.prototype) @@ -1583,7 +1722,7 @@ export class InvalidServiceError extends WebrpcError { code: number = 1104, message: string = `Service not enabled for Access key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidServiceError.prototype) @@ -1596,7 +1735,7 @@ export class UnauthorizedUserError extends WebrpcError { code: number = 1105, message: string = `Unauthorized user`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnauthorizedUserError.prototype) @@ -1609,7 +1748,7 @@ export class QuotaExceededError extends WebrpcError { code: number = 1200, message: string = `Quota request exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaExceededError.prototype) @@ -1622,7 +1761,7 @@ export class QuotaRateLimitError extends WebrpcError { code: number = 1201, message: string = `Quota rate limit exceeded`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QuotaRateLimitError.prototype) @@ -1635,7 +1774,7 @@ export class NoDefaultKeyError extends WebrpcError { code: number = 1300, message: string = `No default access key found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NoDefaultKeyError.prototype) @@ -1648,7 +1787,7 @@ export class MaxAccessKeysError extends WebrpcError { code: number = 1301, message: string = `Access keys limit reached`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, MaxAccessKeysError.prototype) @@ -1661,7 +1800,7 @@ export class AtLeastOneKeyError extends WebrpcError { code: number = 1302, message: string = `You need at least one Access Key`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, AtLeastOneKeyError.prototype) @@ -1674,7 +1813,7 @@ export class TimeoutError extends WebrpcError { code: number = 1900, message: string = `Request timed out`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, TimeoutError.prototype) @@ -1687,7 +1826,7 @@ export class InvalidArgumentError extends WebrpcError { code: number = 2001, message: string = `Invalid argument`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InvalidArgumentError.prototype) @@ -1700,7 +1839,7 @@ export class UnavailableError extends WebrpcError { code: number = 2002, message: string = `Unavailable resource`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, UnavailableError.prototype) @@ -1713,7 +1852,7 @@ export class QueryFailedError extends WebrpcError { code: number = 2003, message: string = `Query failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, QueryFailedError.prototype) @@ -1726,7 +1865,7 @@ export class NotFoundError extends WebrpcError { code: number = 3000, message: string = `Resource not found`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotFoundError.prototype) @@ -1739,7 +1878,7 @@ export class InsufficientFeeError extends WebrpcError { code: number = 3004, message: string = `Insufficient fee`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, InsufficientFeeError.prototype) @@ -1752,7 +1891,7 @@ export class NotEnoughBalanceError extends WebrpcError { code: number = 3005, message: string = `Not enough balance`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, NotEnoughBalanceError.prototype) @@ -1765,14 +1904,13 @@ export class SimulationFailedError extends WebrpcError { code: number = 3006, message: string = `Simulation failed`, status: number = 0, - cause?: string + cause?: string, ) { super(name, code, message, status, cause) Object.setPrototypeOf(this, SimulationFailedError.prototype) } } - export enum errors { WebrpcEndpoint = 'WebrpcEndpoint', WebrpcRequestFailed = 'WebrpcRequestFailed', @@ -1897,4 +2035,3 @@ export const webrpcErrorByCode: { [code: number]: any } = { } export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise - diff --git a/packages/sessions/hardhat.config.js b/packages/sessions/hardhat.config.js new file mode 100644 index 000000000..51bc6d710 --- /dev/null +++ b/packages/sessions/hardhat.config.js @@ -0,0 +1,11 @@ + +module.exports = { + networks: { + hardhat: { + chainId: 31337, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + }, + }, + } +} diff --git a/packages/sessions/src/index.ts b/packages/sessions/src/index.ts new file mode 100644 index 000000000..76ee95e53 --- /dev/null +++ b/packages/sessions/src/index.ts @@ -0,0 +1,2 @@ +export * as tracker from './tracker' +export * as trackers from './trackers' diff --git a/packages/sessions/src/tracker.ts b/packages/sessions/src/tracker.ts new file mode 100644 index 000000000..2ba337339 --- /dev/null +++ b/packages/sessions/src/tracker.ts @@ -0,0 +1,56 @@ +import { commons } from '@0xsequence/core' +import { ethers } from 'ethers' + +export type PresignedConfig = { + wallet: string + nextConfig: commons.config.Config + signature: string +} + +export type PresignedConfigLink = Omit & { nextImageHash: string } + +export type ConfigDataDump = { + configurations: commons.config.Config[] + wallets: { + imageHash: string + context: commons.context.WalletContext + }[] + presignedTransactions: PresignedConfigLink[] +} + +export abstract class ConfigTracker { + loadPresignedConfiguration: (args: { + wallet: string + fromImageHash: string + longestPath?: boolean + }) => Promise + + savePresignedConfiguration: (args: PresignedConfig) => Promise + + saveWitnesses: (args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] }) => Promise + + configOfImageHash: (args: { imageHash: string; noCache?: boolean }) => Promise + + saveWalletConfig: (args: { config: commons.config.Config }) => Promise + + imageHashOfCounterfactualWallet: (args: { wallet: string; noCache?: boolean }) => Promise< + | { + imageHash: string + context: commons.context.WalletContext + } + | undefined + > + + saveCounterfactualWallet: (args: { config: commons.config.Config; context: commons.context.WalletContext[] }) => Promise + + walletsOfSigner: (args: { signer: string; noCache?: boolean }) => Promise< + { + wallet: string + proof: { + digest: string + chainId: ethers.BigNumber + signature: string + } + }[] + > +} diff --git a/packages/sessions/src/trackers/cached.ts b/packages/sessions/src/trackers/cached.ts new file mode 100644 index 000000000..e1bc44768 --- /dev/null +++ b/packages/sessions/src/trackers/cached.ts @@ -0,0 +1,186 @@ +import { commons, universal } from '@0xsequence/core' +import { migrator } from '@0xsequence/migration' +import { ethers } from 'ethers' +import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker' + +export class CachedTracker implements migrator.PresignedMigrationTracker, ConfigTracker { + constructor( + private readonly tracker: migrator.PresignedMigrationTracker & ConfigTracker, + private readonly cache: migrator.PresignedMigrationTracker & ConfigTracker, + public readonly contexts: commons.context.VersionedContext + ) {} + + async loadPresignedConfiguration(args: { + wallet: string + fromImageHash: string + longestPath?: boolean | undefined + }): Promise { + // We need to check both, and return the one with the highest checkpoint + // eventually we could try to combine them, but for now we'll just return + // the one with the highest checkpoint + const results = [this.tracker.loadPresignedConfiguration(args), this.cache.loadPresignedConfiguration(args)] + + let best: PresignedConfigLink[] + + // If both results end with the same image hash, we can just return the longest/shortest one + const [result1, result2] = await Promise.all(results) + if ( + result1.length > 0 && + result2.length > 0 && + result1[result1.length - 1].nextImageHash === result2[result2.length - 1].nextImageHash + ) { + best = + args.longestPath === true + ? result1.length > result2.length + ? result1 + : result2 + : result1.length < result2.length + ? result1 + : result2 + } else { + // Otherwise we need to check the checkpoints + // this requires us to fetch the config for each image hash + const checkpoints = await Promise.all( + results.map(async result => { + const r = await result + const last = r[r.length - 1] + if (!last) return undefined + + // TODO: This will fire a lot of requests, optimize it + const config = await this.configOfImageHash({ imageHash: last.nextImageHash }) + if (!config) return undefined + + return { checkpoint: universal.genericCoderFor(config.version).config.checkpointOf(config), result: r } + }) + ) + + best = + checkpoints.reduce((acc, val) => { + if (!val) return acc + if (!acc) return val + if (val.checkpoint.gt(acc.checkpoint)) return val + return acc + })?.result ?? [] + } + + if (!best) return [] + + return best + } + + async savePresignedConfiguration(args: PresignedConfig): Promise { + await Promise.all([this.tracker.savePresignedConfiguration(args), this.cache.savePresignedConfiguration(args)]) + } + + async configOfImageHash(args: { imageHash: string; noCache?: boolean }): Promise { + // We first check the cache, if it's not there, we check the tracker + // and then we save it to the cache + if (args.noCache !== true) { + const config = await this.cache.configOfImageHash(args) + if (config) return config + } + + const config2 = await this.tracker.configOfImageHash(args) + if (config2) { + await this.cache.saveWalletConfig({ config: config2 }) + } + + return config2 + } + + async saveWalletConfig(args: { config: commons.config.Config }): Promise { + await Promise.all([this.tracker.saveWalletConfig(args), this.cache.saveWalletConfig(args)]) + } + + async imageHashOfCounterfactualWallet(args: { + wallet: string + noCache?: boolean + }): Promise<{ imageHash: string; context: commons.context.WalletContext } | undefined> { + // We first check the cache, if it's not there, we check the tracker + // and then we save it to the cache + if (args.noCache !== true) { + const result1 = await this.cache.imageHashOfCounterfactualWallet(args) + if (result1) return result1 + } + + const result2 = await this.tracker.imageHashOfCounterfactualWallet(args) + if (result2) { + // TODO: We shouldn't need to get the config to save the counterfactual wallet + const config = await this.configOfImageHash({ imageHash: result2.imageHash }) + if (config) { + await this.cache.saveCounterfactualWallet({ config, context: [result2.context] }) + } + } + + return result2 + } + + async saveCounterfactualWallet(args: { + config: commons.config.Config + context: commons.context.WalletContext[] + }): Promise { + await Promise.all([this.tracker.saveCounterfactualWallet(args), this.cache.saveCounterfactualWallet(args)]) + } + + async walletsOfSigner(args: { + signer: string + noCache?: boolean + }): Promise<{ wallet: string; proof: { digest: string; chainId: ethers.BigNumber; signature: string } }[]> { + if (args.noCache) { + return this.tracker.walletsOfSigner(args) + } + + // In this case we need to both aggregate the results from the cache and the tracker + // and then dedupe the results + const results = await Promise.all([this.tracker.walletsOfSigner(args), this.cache.walletsOfSigner(args)]) + const wallets = new Map() + + for (const result of results) { + for (const wallet of result) { + wallets.set(wallet.wallet, wallet) + } + } + + return Array.from(wallets.values()) + } + + async saveWitnesses(args: { + wallet: string + digest: string + chainId: ethers.BigNumberish + signatures: string[] + }): Promise { + await Promise.all([this.tracker.saveWitnesses(args), this.cache.saveWitnesses(args)]) + } + + async getMigration( + address: string, + fromImageHash: string, + fromVersion: number, + chainId: ethers.BigNumberish + ): Promise { + // We first check the cache, if it's not there, we check the tracker + // NOTICE: we could eventually try to combine the two, but now we just have 1 migration + // so it's not worth it. + const migration1 = await this.cache.getMigration(address, fromImageHash, fromVersion, chainId) + if (migration1) return migration1 + + const migration2 = await this.tracker.getMigration(address, fromImageHash, fromVersion, chainId) + if (migration2) { + await this.cache.saveMigration(address, migration2, this.contexts) + } + + return migration2 + } + + async saveMigration( + address: string, + signed: migrator.SignedMigration, + contexts: commons.context.VersionedContext + ): Promise { + await Promise.all([ + this.tracker.saveMigration(address, signed, contexts), + this.cache.saveMigration(address, signed, contexts) + ]) + } +} diff --git a/packages/sessions/src/trackers/debug.ts b/packages/sessions/src/trackers/debug.ts new file mode 100644 index 000000000..3a7d8bfa9 --- /dev/null +++ b/packages/sessions/src/trackers/debug.ts @@ -0,0 +1,96 @@ +import { commons } from '@0xsequence/core' +import { migrator } from '@0xsequence/migration' +import { ethers } from 'ethers' +import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker' + +export class DebugConfigTracker implements ConfigTracker, migrator.PresignedMigrationTracker { + constructor(private readonly tracker: ConfigTracker & migrator.PresignedMigrationTracker) {} + + async loadPresignedConfiguration(args: { + wallet: string + fromImageHash: string + longestPath?: boolean + }): Promise { + console.debug('? loadPresignedConfiguration') + debug(args, '? ') + return debug(await this.tracker.loadPresignedConfiguration(args), '! ') + } + + savePresignedConfiguration(args: PresignedConfig): Promise { + console.debug('? savePresignedConfiguration') + debug(args, '? ') + return this.tracker.savePresignedConfiguration(args) + } + + saveWitnesses(args: { wallet: string; digest: string; chainId: ethers.BigNumberish; signatures: string[] }): Promise { + console.debug('? saveWitnesses') + debug(args, '? ') + return this.tracker.saveWitnesses(args) + } + + async configOfImageHash(args: { imageHash: string }): Promise { + console.debug('? configOfImageHash') + debug(args, '? ') + return debug(await this.tracker.configOfImageHash(args), '! ') + } + + saveWalletConfig(args: { config: commons.config.Config }): Promise { + console.debug('? saveWalletConfig') + debug(args, '? ') + return this.tracker.saveWalletConfig(args) + } + + async imageHashOfCounterfactualWallet(args: { + wallet: string + }): Promise<{ imageHash: string; context: commons.context.WalletContext } | undefined> { + console.debug('? imageHashOfCounterfactualWallet') + debug(args, '? ') + return debug(await this.tracker.imageHashOfCounterfactualWallet(args), '! ') + } + + saveCounterfactualWallet(args: { config: commons.config.Config; context: commons.context.WalletContext[] }): Promise { + console.debug('? saveCounterfactualWallet') + debug(args, '? ') + return this.tracker.saveCounterfactualWallet(args) + } + + async walletsOfSigner(args: { + signer: string + }): Promise<{ wallet: string; proof: { digest: string; chainId: ethers.BigNumber; signature: string } }[]> { + console.debug('? walletsOfSigner') + debug(args, '? ') + return debug(await this.tracker.walletsOfSigner(args), '! ') + } + + async getMigration( + address: string, + fromImageHash: string, + fromVersion: number, + chainId: ethers.BigNumberish + ): Promise { + console.debug('? getMigration') + debug({ address, fromImageHash, fromVersion, chainId }, '? ') + return debug(await this.tracker.getMigration(address, fromImageHash, fromVersion, chainId), '! ') + } + + saveMigration(address: string, signed: migrator.SignedMigration, contexts: commons.context.VersionedContext): Promise { + console.debug('? saveMigration') + debug({ address, signed, contexts }, '? ') + return this.tracker.saveMigration(address, signed, contexts) + } +} + +function debug(value: T, prefix: string = ''): T { + switch (value) { + case undefined: + console.debug(prefix + 'undefined') + break + default: + JSON.stringify(value, undefined, 2) + .split('\n') + .map(line => prefix + line) + .forEach(line => console.debug(line)) + break + } + return value +} diff --git a/packages/sessions/src/trackers/deduped.ts b/packages/sessions/src/trackers/deduped.ts new file mode 100644 index 000000000..c8246df85 --- /dev/null +++ b/packages/sessions/src/trackers/deduped.ts @@ -0,0 +1,99 @@ +import { commons } from '@0xsequence/core' +import { migrator } from '@0xsequence/migration' +import { BigNumber, BigNumberish, ethers } from 'ethers' +import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker' +import { PromiseCache } from './promise-cache' +import { LocalConfigTracker } from './local' + +export function isDedupedTracker(tracker: any): tracker is DedupedTracker { + return tracker instanceof DedupedTracker +} + +// This tracks wraps another tracker and dedupes calls to it, so in any calls +// are sent in short succession, only the first call is forwarded to the +// underlying tracker, and the rest are ignored. +export class DedupedTracker implements migrator.PresignedMigrationTracker, ConfigTracker { + private cache: PromiseCache = new PromiseCache() + + constructor( + private readonly tracker: migrator.PresignedMigrationTracker & ConfigTracker, + public readonly window = 50, + public verbose = false + ) {} + + invalidateCache() { + this.cache = new PromiseCache() + } + + configOfImageHash(args: { imageHash: string }): Promise { + return this.cache.do('configOfImageHash', this.window, args => this.tracker.configOfImageHash(args), args) + } + + getMigration( + address: string, + fromImageHash: string, + fromVersion: number, + chainId: BigNumberish + ): Promise { + return this.cache.do( + 'getMigration', + this.window, + (...args) => this.tracker.getMigration(...args), + address, + fromImageHash, + fromVersion, + chainId + ) + } + + saveMigration(address: string, signed: migrator.SignedMigration, contexts: commons.context.VersionedContext): Promise { + return this.cache.do('saveMigration', undefined, (...args) => this.tracker.saveMigration(...args), address, signed, contexts) + } + + loadPresignedConfiguration(args: { + wallet: string + fromImageHash: string + longestPath?: boolean | undefined + }): Promise { + return this.cache.do('loadPresignedConfiguration', this.window, args => this.tracker.loadPresignedConfiguration(args), args) + } + + savePresignedConfiguration(args: PresignedConfig): Promise { + return this.cache.do('savePresignedConfiguration', undefined, args => this.tracker.savePresignedConfiguration(args), args) + } + + saveWitnesses(args: { wallet: string; digest: string; chainId: BigNumberish; signatures: string[] }): Promise { + return this.cache.do('saveWitnesses', undefined, args => this.tracker.saveWitnesses(args), args) + } + + saveWalletConfig(args: { config: commons.config.Config }): Promise { + return this.cache.do('saveWalletConfig', undefined, args => this.tracker.saveWalletConfig(args), args) + } + + imageHashOfCounterfactualWallet(args: { + wallet: string + }): Promise<{ imageHash: string; context: commons.context.WalletContext } | undefined> { + return this.cache.do( + 'imageHashOfCounterfactualWallet', + undefined, + args => this.tracker.imageHashOfCounterfactualWallet(args), + args + ) + } + + saveCounterfactualWallet(args: { config: commons.config.Config; context: commons.context.WalletContext[] }): Promise { + return this.cache.do('saveCounterfactualWallet', undefined, args => this.tracker.saveCounterfactualWallet(args), args) + } + + walletsOfSigner(args: { + signer: string + }): Promise<{ wallet: string; proof: { digest: string; chainId: BigNumber; signature: string } }[]> { + return this.cache.do('walletsOfSigner', this.window, args => this.tracker.walletsOfSigner(args), args) + } + + updateProvider(provider: ethers.providers.Provider) { + if (this.tracker instanceof LocalConfigTracker) { + this.tracker.updateProvider(provider) + } + } +} diff --git a/packages/sessions/src/trackers/index.ts b/packages/sessions/src/trackers/index.ts new file mode 100644 index 000000000..05dddeb00 --- /dev/null +++ b/packages/sessions/src/trackers/index.ts @@ -0,0 +1,7 @@ +export * as debug from './debug' +export * as local from './local' +export * as remote from './remote' +export * as stores from './stores' +export * from './multiple' +export * from './cached' +export * from './deduped' diff --git a/packages/sessions/src/trackers/local.ts b/packages/sessions/src/trackers/local.ts new file mode 100644 index 000000000..9d78cf47a --- /dev/null +++ b/packages/sessions/src/trackers/local.ts @@ -0,0 +1,594 @@ +import { commons, universal, v1, v2 } from '@0xsequence/core' +import { migration, migrator } from '@0xsequence/migration' +import { ethers } from 'ethers' +import { CachedEIP5719 } from '@0xsequence/replacer' +import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker' +import { isPlainNested, isPlainNode, isPlainV2Config, MemoryTrackerStore, PlainNested, PlainNode, TrackerStore } from './stores' + +export class LocalConfigTracker implements ConfigTracker, migrator.PresignedMigrationTracker { + private cachedEIP5719: CachedEIP5719 + + constructor( + // TODO: The provider is only used to determine that EIP1271 signatures have *some* validity + // but when reconstructing a presigned transaction we should do the replacement once per chain. + // For now, it's recommended to use Mainnet as the provider. + public provider: ethers.providers.Provider, + private store: TrackerStore = new MemoryTrackerStore(), + public useEIP5719: boolean = false + ) { + this.cachedEIP5719 = new CachedEIP5719(provider) + } + + private loadTopology = async (hash: string): Promise => { + const node = await this.store.loadV2Node(hash) + if (!node) return { nodeHash: hash } + + if (isPlainNode(node)) { + const [left, right] = await Promise.all([this.loadTopology(node.left), this.loadTopology(node.right)]) + return { left, right } + } + + if (isPlainNested(node)) { + return { + weight: ethers.BigNumber.from(node.weight), + threshold: ethers.BigNumber.from(node.threshold), + tree: await this.loadTopology(node.tree) + } + } + + return node + } + + private saveTopology = async (node: v2.config.Topology): Promise => { + if (v2.config.isNodeLeaf(node)) { + return // Nothing to do, this is a dead-end + } + + const hash = v2.config.hashNode(node) + + if (v2.config.isNode(node)) { + const saveLeft = this.saveTopology(node.left) + const saveRight = this.saveTopology(node.right) + const saveThis = this.store.saveV2Node(hash, { + left: v2.config.hashNode(node.left), + right: v2.config.hashNode(node.right) + } as PlainNode) + + await Promise.all([saveLeft, saveRight, saveThis]) + + return + } + + if (v2.config.isNestedLeaf(node)) { + const saveTree = this.saveTopology(node.tree) + const saveThis = this.store.saveV2Node(hash, { + weight: ethers.BigNumber.from(node.weight).toString(), + threshold: ethers.BigNumber.from(node.threshold).toString(), + tree: v2.config.hashNode(node.tree) + } as PlainNested) + + await Promise.all([saveTree, saveThis]) + + return + } + + // If it's a normal leaf, then we just store it + if (v2.config.isSignerLeaf(node)) { + return this.store.saveV2Node(hash, { + address: node.address, + weight: node.weight + }) + } + + if (v2.config.isSubdigestLeaf(node)) { + return this.store.saveV2Node(hash, { + subdigest: node.subdigest + }) + } + + throw new Error(`Unknown topology type: ${node}`) + } + + saveWalletConfig = async (args: { config: commons.config.Config }): Promise => { + const { config } = args + if (v1.config.ConfigCoder.isWalletConfig(config)) { + // We can store the configuration as-is + const imageHash = v1.config.ConfigCoder.imageHashOf(config) + return this.store.saveConfig(imageHash, config) + } + + if (v2.config.ConfigCoder.isWalletConfig(config)) { + // We split the configuration in a list of nodes, and store them individually + // then we can reconstruct it. This also means we can combine multiple configurations + // if they share information + const imageHash = v2.config.ConfigCoder.imageHashOf(config) + + // This is an optimization, it allows us to avoid splitting the tree if it's already complete + if (v2.config.isComplete(config.tree)) { + return this.store.saveConfig(imageHash, config) + } + + // TODO: Re-enable storing partial v2 configs once + // we have more performant code to reconstructing them + // in the meantime, rely on the remote tracker + + // const storeTree = this.saveTopology(config.tree) + // const storeConfig = this.store.saveConfig(imageHash, { + // version: 2, + // threshold: ethers.BigNumber.from(config.threshold).toString(), + // checkpoint: ethers.BigNumber.from(config.checkpoint).toString(), + // tree: v2.config.hashNode(config.tree) + // }) + + // await Promise.all([storeTree, storeConfig]) + } + + return + } + + private configOfImageHashCache = {} as { [key: string]: commons.config.Config } + + configOfImageHash = async (args: { imageHash: string }): Promise => { + const { imageHash } = args + + if (this.configOfImageHashCache[args.imageHash]) { + return this.configOfImageHashCache[args.imageHash] + } + + const config = await this.store.loadConfig(imageHash) + if (!config) { + return undefined + } + + if (config.version === 1 || (config.version === 2 && !isPlainV2Config(config))) { + this.configOfImageHashCache[args.imageHash] = config + return config + } + + if (isPlainV2Config(config)) { + const fullConfig = { + version: 2, + threshold: ethers.BigNumber.from(config.threshold), + checkpoint: ethers.BigNumber.from(config.checkpoint), + tree: await this.loadTopology(config.tree) + } as v2.config.WalletConfig + this.configOfImageHashCache[args.imageHash] = fullConfig + return fullConfig + } + + throw new Error(`Unknown config type: ${config}`) + } + + saveCounterfactualWallet = async (args: { + config: commons.config.Config + context: commons.context.WalletContext[] + }): Promise => { + const { config, context } = args + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + await Promise.all([ + this.saveWalletConfig({ config }), + ...context.map(ctx => { + const address = commons.context.addressOf(ctx, imageHash) + return this.store.saveCounterfactualWallet(address, imageHash, ctx) + }) + ]) + } + + imageHashOfCounterfactualWallet = async (args: { + wallet: string + }): Promise< + | { + imageHash: string + context: commons.context.WalletContext + } + | undefined + > => { + const { wallet } = args + const result = await this.store.loadCounterfactualWallet(wallet) + + if (!result) return undefined + + return { + imageHash: result.imageHash, + context: result.context + } + } + + savePayload = async (args: { payload: commons.signature.SignedPayload }): Promise => { + const { payload } = args + + const subdigest = commons.signature.subdigestOf(payload) + await this.store.savePayloadOfSubdigest(subdigest, payload) + } + + private payloadOfSubdigestCache = {} as { [key: string]: commons.signature.SignedPayload } + + payloadOfSubdigest = async (args: { subdigest: string }): Promise => { + if (this.payloadOfSubdigestCache[args.subdigest]) { + return this.payloadOfSubdigestCache[args.subdigest] + } + + const { subdigest } = args + const res = await this.store.loadPayloadOfSubdigest(subdigest) + + if (res) { + this.payloadOfSubdigestCache[subdigest] = res + } + + return res + } + + savePresignedConfiguration = async (args: PresignedConfig): Promise => { + // Presigned configurations only work with v2 (for now) + // so we can assume that the signature is for a v2 configuration + const decoded = v2.signature.SignatureCoder.decode(args.signature) + const nextImageHash = universal.genericCoderFor(args.nextConfig.version).config.imageHashOf(args.nextConfig) + const message = v2.chained.messageSetImageHash(nextImageHash) + const digest = ethers.utils.keccak256(message) + const payload = { + message, + address: args.wallet, + chainId: 0, + digest + } + + const savePayload = this.savePayload({ payload }) + const saveNextConfig = this.saveWalletConfig({ config: args.nextConfig }) + + const recovered = await v2.signature.SignatureCoder.recover(decoded, payload, this.provider) + + // Save the recovered configuration and all signature parts + const signatures = v2.signature.signaturesOf(recovered.config.tree) + await Promise.all([ + savePayload, + saveNextConfig, + this.saveWalletConfig({ config: recovered.config }), + ...signatures.map(sig => this.store.saveSignatureOfSubdigest(sig.address, recovered.subdigest, sig.signature)) + ]) + } + + loadPresignedConfiguration = async (args: { + wallet: string + fromImageHash: string + longestPath?: boolean + }): Promise => { + const { wallet, fromImageHash, longestPath } = args + + const fromConfig = await this.configOfImageHash({ imageHash: fromImageHash }) + if (!fromConfig || !v2.config.ConfigCoder.isWalletConfig(fromConfig)) { + return [] + } + + // Get all subdigests for the config members + const signers = v2.config.signersOf(fromConfig.tree).map(s => s.address) + const subdigestsOfSigner = await Promise.all(signers.map(s => this.store.loadSubdigestsOfSigner(s))) + const subdigests = [...new Set(subdigestsOfSigner.flat())] + + // Get all unique payloads + const payloads = await Promise.all( + [...new Set(subdigests)].map(async s => ({ ...(await this.payloadOfSubdigest({ subdigest: s })), subdigest: s })) + ) + + // Get all possible next imageHashes based on the payloads + const nextImageHashes = payloads + .filter(p => p?.message && p?.address && p.address === wallet) + .map(p => ({ payload: p, nextImageHash: v2.chained.decodeMessageSetImageHash(p!.message!) })) + .filter(p => p?.nextImageHash) as { + payload: commons.signature.SignedPayload & { subdigest: string } + nextImageHash: string + }[] + + // Build a signature for each next imageHash + // and filter out the ones that don't have enough weight + let bestCandidate: + | { + nextImageHash: string + checkpoint: ethers.BigNumber + signature: string + } + | undefined + + const nextConfigsAndCheckpoints = await Promise.all( + nextImageHashes.map(async ({ nextImageHash, payload }) => { + const nextConfig = await this.configOfImageHash({ imageHash: nextImageHash }) + if (!nextConfig || !v2.config.isWalletConfig(nextConfig)) return undefined + const nextCheckpoint = ethers.BigNumber.from(nextConfig.checkpoint) + return { nextConfig, nextCheckpoint, nextImageHash, payload } + }) + ) + + const sortedNextConfigsAndCheckpoints = nextConfigsAndCheckpoints + .filter(c => c !== undefined) + .filter(c => c!.nextCheckpoint.gt(fromConfig.checkpoint)) + .sort((a, b) => + // If we are looking for the longest path, sort by ascending checkpoint + // because we want to find the smalles jump, and we should start with the + // closest one. If we are not looking for the longest path, sort by + // descending checkpoint, because we want to find the largest jump. + // + // We don't have a guarantee that all "next configs" will be valid + // so worst case scenario we will need to try all of them. + // But we can try to optimize for the most common case. + a!.nextCheckpoint.gt(b!.nextCheckpoint) ? (longestPath ? 1 : -1) : longestPath ? -1 : 1 + ) + + for (const entry of sortedNextConfigsAndCheckpoints) { + const { nextConfig, nextCheckpoint, nextImageHash, payload } = entry! + + if (bestCandidate) { + const bestCheckpoint = bestCandidate.checkpoint + if (longestPath) { + // Only consider candidates earlier than our current best + if (nextCheckpoint.gte(bestCheckpoint)) continue + } else { + // Only consider candidates later than our current best + if (nextCheckpoint.lte(bestCheckpoint)) continue + } + } + + // Get all signatures (for all signers) for this subdigest + const signatures = new Map( + ( + await Promise.all( + signers.map(async signer => { + const signature = await this.store.loadSignatureOfSubdigest(signer, payload.subdigest) + if (!signature) { + return [signer, undefined] + } + + const replacedSignature = ethers.utils.hexlify( + this.useEIP5719 ? await this.cachedEIP5719.runByEIP5719(signer, payload.subdigest, signature) : signature + ) + + const isDynamic = commons.signer.tryRecoverSigner(payload.subdigest, replacedSignature) !== signer + + return [signer, { isDynamic, signature: replacedSignature }] + }) + ) + ).filter((signature): signature is [string, commons.signature.SignaturePart] => Boolean(signature[1])) + ) + + // Skip if we don't have ANY signatures (it can never reach the threshold) + if (signatures.size === 0) continue + + // Encode the full signature (to see if it has enough weight) + const encoded = v2.signature.SignatureCoder.encodeSigners(fromConfig, signatures, [], 0) + if (encoded.weight.lt(fromConfig.threshold)) continue + + // Save the new best candidate + bestCandidate = { + nextImageHash, + checkpoint: ethers.BigNumber.from(nextConfig.checkpoint), + signature: encoded.encoded + } + } + + if (!bestCandidate) { + return [] + } + + // Get the next step + const nextStep = await this.loadPresignedConfiguration({ + wallet, + fromImageHash: bestCandidate.nextImageHash, + longestPath + }) + + return [ + { + wallet, + nextImageHash: bestCandidate.nextImageHash, + signature: bestCandidate.signature + }, + ...nextStep + ] + } + + saveWitnesses = async (args: { + wallet: string + digest: string + chainId: ethers.BigNumberish + signatures: string[] + }): Promise => { + const payload = { + digest: args.digest, + address: args.wallet, + chainId: args.chainId + } + + const subdigest = commons.signature.subdigestOf(payload) + + await Promise.all([ + this.savePayload({ payload }), + ...args.signatures + .filter(signature => { + // We don't support saving witnesses for non-recoverable signatures + // we could change this eventually, but the issue is that the witness may become invalid + return commons.signer.canRecover(signature) + }) + .map(signature => { + const signer = commons.signer.recoverSigner(subdigest, signature) + return this.store.saveSignatureOfSubdigest(signer, subdigest, signature) + }) + ]) + } + + walletsOfSigner = async (args: { + signer: string + }): Promise< + { + wallet: string + proof: { + digest: string + chainId: ethers.BigNumber + signature: string + } + }[] + > => { + const subdigests = await this.store.loadSubdigestsOfSigner(args.signer) + const payloads = await Promise.all(subdigests.map(s => this.payloadOfSubdigest({ subdigest: s }))).then( + p => p.filter(p => p !== undefined) as commons.signature.SignedPayload[] + ) + + // filter unique wallets, and provide a proof for each wallet + const result: { + wallet: string + proof: { + digest: string + chainId: ethers.BigNumber + signature: string + } + }[] = [] + + for (const payload of payloads) { + const wallet = payload.address + if (result.find(r => r.wallet === wallet)) continue + + const subdigest = commons.signature.subdigestOf(payload) + const signature = await this.store.loadSignatureOfSubdigest(args.signer, subdigest) + if (!signature) continue + + result.push({ + wallet, + proof: { + digest: payload.digest, + chainId: ethers.BigNumber.from(payload.chainId), + signature: ethers.utils.hexlify(signature) + } + }) + } + + return result + } + + async saveMigration( + address: string, + signed: migrator.SignedMigration, + contexts: commons.context.VersionedContext + ): Promise { + const fromVersion = signed.fromVersion + if (fromVersion !== 1) throw new Error('Migration not supported') + if (!v2.config.isWalletConfig(signed.toConfig)) throw new Error('Invalid to config') + + // Validate migration transaction + const { newImageHash, address: decodedAddress } = migration.v1v2.decodeTransaction(signed.tx, contexts) + if (decodedAddress !== address) throw new Error('Invalid migration transaction - address') + if (v2.config.ConfigCoder.imageHashOf(signed.toConfig) != newImageHash) + throw new Error('Invalid migration transaction - config') + + // Split signature and save each part + const message = commons.transaction.packMetaTransactionsData(signed.tx.nonce, signed.tx.transactions) + const digest = ethers.utils.keccak256(message) + const payload = { chainId: signed.tx.chainId, message, address, digest } + const subdigest = commons.signature.subdigestOf(payload) + + const savePayload = this.savePayload({ payload }) + const saveToConfig = this.saveWalletConfig({ config: signed.toConfig }) + + const decoded = v1.signature.SignatureCoder.decode(signed.tx.signature) + const recovered = await v1.signature.SignatureCoder.recover(decoded, payload, this.provider) + + // Save the recovered config, the migrate transaction, and all signature parts + const signatures = v1.signature.SignatureCoder.signaturesOf(recovered.config) + + await Promise.all([ + savePayload, + saveToConfig, + this.saveWalletConfig({ config: recovered.config }), + this.store.saveMigrationsSubdigest(address, fromVersion, fromVersion + 1, subdigest, newImageHash), + ...signatures.map(sig => this.store.saveSignatureOfSubdigest(sig.address, recovered.subdigest, sig.signature)) + ]) + } + + async getMigration( + address: string, + fromImageHash: string, + fromVersion: number, + chainId: ethers.BigNumberish + ): Promise { + // Get the current config and all possible migration payloads + const [currentConfig, txs] = await Promise.all([ + this.configOfImageHash({ imageHash: fromImageHash }), + this.store.loadMigrationsSubdigest(address, fromVersion, fromVersion + 1) + ]) + + const coder = universal.coderFor(fromVersion) + if (!currentConfig) { + // We may not be able to find the config, because the migration is still not copied locally + // in that case we consider as we don't have any migration + return undefined + } + + if (!coder.config.isWalletConfig(currentConfig)) { + // throw new Error("Invalid from config - version") + // better to not fail here, some other tracker may be able to handle this migration + return undefined + } + + // We need to process every migration candidate individually + // and see which one has enough signers to be valid (for the current config) + const candidates = await Promise.all( + txs.map(async tx => { + const { subdigest, toImageHash } = tx + const payload = await this.payloadOfSubdigest({ subdigest }) + if (!payload || !payload.message) return undefined + if (!ethers.BigNumber.from(chainId).eq(payload.chainId)) return undefined + + const signers = coder.config.signersOf(currentConfig as any).map(s => s.address) + + // Get all signatures (for all signers) for this subdigest + const signatures = new Map( + ( + await Promise.all( + signers.map(async signer => { + const signature = await this.store.loadSignatureOfSubdigest(signer, subdigest) + if (!signature) { + return [signer, undefined] + } + + const replacedSignature = ethers.utils.hexlify( + this.useEIP5719 ? await this.cachedEIP5719.runByEIP5719(signer, subdigest, signature) : signature + ) + + const isDynamic = commons.signer.tryRecoverSigner(subdigest, replacedSignature) !== signer + + return [signer, { isDynamic, signature: replacedSignature }] + }) + ) + ).filter((signature): signature is [string, commons.signature.SignaturePart] => Boolean(signature[1])) + ) + + // Encode signature parts into a single signature + const encoded = coder.signature.encodeSigners(currentConfig as any, signatures, [], chainId) + if (!encoded || encoded.weight < currentConfig.threshold) return undefined + + // Unpack payload (it should have transactions) + const [nonce, transactions] = commons.transaction.unpackMetaTransactionsData(payload.message) + + return { + tx: { + entrypoint: address, + transactions: commons.transaction.fromTxAbiEncode(transactions), + chainId: chainId, + nonce: nonce, + signature: encoded.encoded, + intent: { + id: subdigest, + wallet: address + } + }, + toConfig: await this.configOfImageHash({ imageHash: toImageHash }), + fromVersion, + toVersion: fromVersion + 1 + } as migrator.SignedMigration + }) + ).then(c => c.filter(c => c !== undefined)) + + // Return the first valid candidate + return candidates[0] + } + + updateProvider(provider: ethers.providers.Provider) { + this.provider = provider + } +} diff --git a/packages/sessions/src/trackers/multiple.ts b/packages/sessions/src/trackers/multiple.ts new file mode 100644 index 000000000..d800a257c --- /dev/null +++ b/packages/sessions/src/trackers/multiple.ts @@ -0,0 +1,230 @@ +import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../tracker' +import { migrator } from '@0xsequence/migration' +import { BigNumber, BigNumberish, ethers } from 'ethers' +import { commons, universal } from '@0xsequence/core' +import { LocalConfigTracker } from './local' + +export function raceUntil(promises: Promise[], fallback: T, evalRes: (val: T) => boolean): Promise { + return new Promise(resolve => { + let count = 0 + + promises.forEach(p => + p + .then((val: T) => { + if (evalRes(val)) { + resolve(val) + } else { + count++ + if (count === promises.length) { + resolve(fallback) + } + } + }) + .catch(() => { + // Ignore + count++ + if (count === promises.length) { + resolve(fallback) + } + }) + ) + }) +} + +export async function allSafe(promises: Promise[], fallback: T): Promise { + return Promise.all(promises.map(promise => promise.catch(() => fallback))) +} + +export class MultipleTracker implements migrator.PresignedMigrationTracker, ConfigTracker { + constructor(private trackers: (migrator.PresignedMigrationTracker & ConfigTracker)[]) {} + + async configOfImageHash(args: { imageHash: string }): Promise { + const requests = this.trackers.map(async (t, i) => ({ res: await t.configOfImageHash(args), i })) + + // We try to find a complete configuration, we race so that we don't wait for all trackers to respond + const result1 = await raceUntil(requests, undefined, val => { + if (val?.res === undefined) return false + return universal.genericCoderFor(val.res.version).config.isComplete(val.res) + }) + + if (result1?.res) { + // Skip saving the config to the tracker that returned the result + this.saveWalletConfig({ config: result1.res, skipTracker: result1.i }) + return result1.res + } + + // If we haven't found a complete configuration yet, it either means that the configuration is not complete + // (and thus we need to combine all results) or that the configuration is not found at all + // but we try to combine all results anyway + const tmptracker = new LocalConfigTracker(undefined as any) // TODO: Fix this, provider not needed anyway + + const results = await allSafe(requests, undefined) + + for (const r of results) { + if (r?.res) await tmptracker.saveWalletConfig({ config: r.res }) + } + + const result2 = await tmptracker.configOfImageHash(args) + if (result2) this.saveWalletConfig({ config: result2 }) + return result2 + } + + async saveWalletConfig(args: { config: commons.config.Config; skipTracker?: number }): Promise { + await Promise.all( + this.trackers.map((t, i) => { + if (i === args.skipTracker) return + return t.saveWalletConfig(args) + }) + ) + } + + async imageHashOfCounterfactualWallet(args: { + wallet: string + }): Promise<{ imageHash: string; context: commons.context.WalletContext } | undefined> { + const imageHash = await raceUntil( + this.trackers.map(t => t.imageHashOfCounterfactualWallet(args)), + undefined, + result => Boolean(result) + ) + + if (imageHash) { + this.configOfImageHash({ imageHash: imageHash.imageHash }).then(config => { + if (config) { + this.saveCounterfactualWallet({ config, context: [imageHash.context] }) + } + }) + } + + return imageHash + } + + async saveCounterfactualWallet(args: { + config: commons.config.Config + context: commons.context.WalletContext[] + skipTracker?: number + }): Promise { + await Promise.all( + this.trackers.map((t, i) => { + if (i === args.skipTracker) return + return t.saveCounterfactualWallet(args) + }) + ) + } + + async walletsOfSigner(args: { + signer: string + }): Promise<{ wallet: string; proof: { digest: string; chainId: BigNumber; signature: string } }[]> { + // We can't race here, because there is no "correct" response + // we just return the union of all results, skipping duplicates + const results = await allSafe( + this.trackers.map(t => t.walletsOfSigner(args)), + [] + ).then(r => r.flat()) + + const wallets: { [wallet: string]: { digest: string; chainId: BigNumber; signature: string } } = {} + for (const r of results) { + wallets[r.wallet] = r.proof + } + + // TODO: This will send redundant information back to the trackers + // consider optimizing this for better performance during login + + const result = Object.keys(wallets).map(w => ({ wallet: w, proof: wallets[w] })) + + const witnesses = new Map() + result.forEach(({ wallet, proof: { digest, chainId, signature } }) => { + const key = `${wallet}-${digest}-${chainId}` + let signatures = witnesses.get(key) + if (!signatures) { + signatures = { wallet, digest, chainId, signatures: [] } + witnesses.set(key, signatures) + } + signatures.signatures.push(signature) + }) + witnesses.forEach(witnesses => this.saveWitnesses(witnesses)) + + return result + } + + async saveWitnesses(args: { wallet: string; digest: string; chainId: BigNumberish; signatures: string[] }): Promise { + await Promise.all(this.trackers.map(t => t.saveWitnesses(args))) + } + + async loadPresignedConfiguration(args: { + wallet: string + fromImageHash: string + longestPath?: boolean | undefined + }): Promise { + // We can't race here, because any of the trackers could have a new "link" in the chain + const results = await allSafe( + this.trackers.map(t => t.loadPresignedConfiguration(args)), + [] + ) + + // The "best" result is the one with the highest checkpoint + const checkpoints = await allSafe( + results.map(async r => { + const last = r[r.length - 1] + + // TODO: This will fire a lot of requests, optimize it + const config = await this.configOfImageHash({ imageHash: last.nextImageHash }) + if (!config) return undefined + + return { checkpoint: universal.genericCoderFor(config.version).config.checkpointOf(config), result: r } + }), + undefined + ) + + const best = checkpoints.reduce((acc, val) => { + if (!val) return acc + if (!acc) return val + if (val.checkpoint.gt(acc.checkpoint)) return val + return acc + }) + + if (!best) return [] + + const configs = new Map>() + const config = (imageHash: string): Promise => { + if (!configs.has(imageHash)) { + configs.set(imageHash, this.configOfImageHash({ imageHash })) + } + return configs.get(imageHash)! + } + best.result.forEach(async res => { + const nextConfig = await config(res.nextImageHash) + if (nextConfig) { + this.savePresignedConfiguration({ + wallet: args.wallet, + nextConfig, + signature: res.signature + }) + } + }) + + return best.result + } + + async savePresignedConfiguration(args: PresignedConfig): Promise { + await Promise.all(this.trackers.map(t => t.savePresignedConfiguration(args))) + } + + async getMigration( + address: string, + fromImageHash: string, + fromVersion: number, + chainId: BigNumberish + ): Promise { + // TODO: Backfeed migration results to other trackers + const results = await Promise.all(this.trackers.map(t => t.getMigration(address, fromImageHash, fromVersion, chainId))) + return results.find(r => !!r) + } + + async saveMigration( + address: string, + signed: migrator.SignedMigration, + contexts: commons.context.VersionedContext + ): Promise { + await Promise.all(this.trackers.map(t => t.saveMigration(address, signed, contexts))) + } +} diff --git a/packages/sessions/src/trackers/promise-cache.ts b/packages/sessions/src/trackers/promise-cache.ts new file mode 100644 index 000000000..0504adda8 --- /dev/null +++ b/packages/sessions/src/trackers/promise-cache.ts @@ -0,0 +1,58 @@ +import { ethers } from 'ethers' + +export class PromiseCache { + private readonly cache: Map + + constructor() { + this.cache = new Map() + } + + do, T>( + key: string, + validMilliseconds: number | undefined, + task: (...args: S) => Promise, + ...args: S + ): Promise { + key = `${key}:${ethers.utils.keccak256(ethers.utils.toUtf8Bytes(JSON.stringify(args, deterministically)))}` + + let entry = this.cache.get(key) + + if (entry) { + if (entry.expiration) { + if (new Date() >= entry.expiration) { + entry = undefined + this.cache.delete(key) + } + } + } + + if (!entry) { + const entry_: Entry = { promise: task(...args) } + + if (validMilliseconds !== undefined) { + entry_.promise = entry_.promise.then(result => { + entry_.expiration = new Date(Date.now() + validMilliseconds) + return result + }) + } + + entry = entry_ + this.cache.set(key, entry) + } + + return entry.promise as Promise + } +} + +type Entry = { + promise: Promise + expiration?: Date +} + +function deterministically(_key: string, value: any): any { + if (typeof value === 'object' && value !== null && !Array.isArray(value)) { + return Object.fromEntries(Object.entries(value).sort()) + } + + return value +} diff --git a/packages/sessions/src/trackers/remote/index.ts b/packages/sessions/src/trackers/remote/index.ts new file mode 100644 index 000000000..1daaf05c8 --- /dev/null +++ b/packages/sessions/src/trackers/remote/index.ts @@ -0,0 +1,359 @@ +import { commons, universal, v1, v2 } from '@0xsequence/core' +import { migrator } from '@0xsequence/migration' +import { ethers } from 'ethers' +import { ConfigTracker, PresignedConfig, PresignedConfigLink } from '../../tracker' +import { Sessions, SignatureType, Transaction } from './sessions.gen' + +export class RemoteConfigTracker implements ConfigTracker, migrator.PresignedMigrationTracker { + private readonly sessions: Sessions + + constructor( + hostname: string, + public readonly onlyRecoverable: boolean = true + ) { + this.sessions = new Sessions(hostname, fetch) + } + + async loadPresignedConfiguration(args: { + wallet: string + fromImageHash: string + longestPath?: boolean + }): Promise { + try { + const { updates } = await this.sessions.configUpdates({ + wallet: args.wallet, + fromImageHash: args.fromImageHash, + allUpdates: args.longestPath + }) + + return updates.map(({ toImageHash, signature }) => ({ wallet: args.wallet, nextImageHash: toImageHash, signature })) + } catch (error) { + if (is404NotFound(error)) { + return [] + } else { + throw error + } + } + } + + async savePresignedConfiguration(args: PresignedConfig): Promise { + const config = args.nextConfig + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + const message = v2.signature.setImageHashStruct(imageHash) + const digest = ethers.utils.keccak256(message) + + await this.sessions.saveSignature({ + wallet: args.wallet, + digest, + chainID: '0', + signature: args.signature, + toConfig: encodeConfig(config) + }) + } + + async saveWitnesses(args: { + wallet: string + digest: string + chainId: ethers.BigNumberish + signatures: string[] + }): Promise { + let filteredSignatures = args.signatures + if (this.onlyRecoverable) { + filteredSignatures = filteredSignatures.filter(signature => { + return commons.signer.canRecover(signature) + }) + } + + await this.sessions.saveSignerSignatures({ + wallet: args.wallet, + digest: args.digest, + chainID: numberString(args.chainId), + signatures: filteredSignatures + }) + } + + async configOfImageHash(args: { imageHash: string }): Promise { + try { + const { version, config } = await this.sessions.config(args) + return decodeConfig(version, config) + } catch (error) { + if (is404NotFound(error)) { + return + } else { + throw error + } + } + } + + async saveWalletConfig(args: { config: commons.config.Config }): Promise { + const config = encodeConfig(args.config) + await this.sessions.saveConfig({ version: args.config.version, config }) + } + + async imageHashOfCounterfactualWallet(args: { + wallet: string + }): Promise<{ imageHash: string; context: commons.context.WalletContext } | undefined> { + try { + const { deployHash, context } = await this.sessions.deployHash(args) + return { imageHash: deployHash, context } + } catch (error) { + if (is404NotFound(error)) { + return + } else { + throw error + } + } + } + + async saveCounterfactualWallet(args: { + config: commons.config.Config + context: commons.context.WalletContext[] + }): Promise { + const deployConfig = encodeConfig(args.config) + await this.sessions.saveWallet({ version: args.config.version, deployConfig }) + } + + async walletsOfSigner(args: { + signer: string + }): Promise<{ wallet: string; proof: { digest: string; chainId: ethers.BigNumber; signature: string } }[]> { + const { wallets } = await this.sessions.wallets(args) + return Object.entries(wallets).map(([wallet, { digest, chainID, type, signature }]) => { + switch (type) { + case SignatureType.EIP712: + signature += ethers.utils.hexlify(commons.signer.SigType.EIP712).slice(2) + break + case SignatureType.EthSign: + signature += ethers.utils.hexlify(commons.signer.SigType.ETH_SIGN).slice(2) + break + case SignatureType.EIP1271: + signature += ethers.utils.hexlify(commons.signer.SigType.WALLET_BYTES32).slice(2) + break + } + + return { + wallet, + proof: { + digest, + signature, + chainId: ethers.BigNumber.from(chainID) + } + } + }) + } + + async getMigration( + wallet: string, + fromImageHash: string, + fromVersion: number, + chainId: ethers.BigNumberish + ): Promise { + const chainIdString = numberString(chainId) + const { migrations } = await this.sessions.migrations({ wallet, fromVersion, fromImageHash, chainID: chainIdString }) + + const chooseMigration = async (chainId: string): Promise => { + const migrations_ = migrations[chainId] + if (migrations_) { + const toVersions = Object.keys(migrations_) + .map(Number) + .sort((a: number, b: number) => b - a) + + for (const toVersion of toVersions) { + for (const [toHash, transactions] of Object.entries(migrations_[toVersion])) { + try { + const toConfig = await this.configOfImageHash({ imageHash: toHash }) + if (toConfig) { + return { + fromVersion, + toVersion, + toConfig, + tx: { + entrypoint: transactions.executor, + transactions: transactions.transactions, + nonce: transactions.nonce, + signature: transactions.signature, + chainId, + intent: { + id: commons.transaction.subdigestOfTransactions( + wallet, + chainId, + transactions.nonce, + transactions.transactions + ), + wallet + } + } + } + } + } catch (error) { + console.error(error) + } + } + } + } + return + } + + const migration = await chooseMigration(chainIdString) + if (migration) { + return migration + } + + for (const chainId in migrations) { + if (chainId !== chainIdString) { + const migration = await chooseMigration(chainId) + if (migration) { + return migration + } + } + } + + return + } + + async saveMigration( + wallet: string, + signed: migrator.SignedMigration, + _contexts: commons.context.VersionedContext + ): Promise { + await this.sessions.saveMigration({ + wallet, + fromVersion: signed.fromVersion, + toVersion: signed.toVersion, + toConfig: encodeConfig(signed.toConfig), + executor: signed.tx.entrypoint, + transactions: signed.tx.transactions.map(encodeTransaction), + nonce: numberString(signed.tx.nonce), + signature: signed.tx.signature, + chainID: numberString(signed.tx.chainId) + }) + } +} + +type SessionsConfig = { + 1: { threshold: number; signers: Array<{ weight: number; address: string }> } + 2: { threshold: number; checkpoint: number; tree: V2SessionsConfigTree } +} + +type V2SessionsConfigTree = + | { left: V2SessionsConfigTree; right: V2SessionsConfigTree } + | { weight: number; address: string } + | { node: string } + | { weight: number; threshold: number; tree: V2SessionsConfigTree } + | { subdigest: string } + +function encodeConfig(config: commons.config.Config): SessionsConfig[1 | 2] { + switch (config.version) { + case 1: + if (v1.config.ConfigCoder.isWalletConfig(config)) { + return { + threshold: numberNumber(config.threshold), + signers: config.signers.map(({ weight, address }) => ({ weight: numberNumber(weight), address })) + } + } else { + throw new Error(`not a v${config.version} config: ${config}`) + } + + case 2: + if (v2.config.ConfigCoder.isWalletConfig(config)) { + return { + threshold: numberNumber(config.threshold), + checkpoint: numberNumber(config.checkpoint), + tree: encodeV2ConfigTree(config.tree) + } + } else { + throw new Error(`not a v${config.version} config: ${config}`) + } + + default: + throw new Error(`unknown version ${config.version}`) + } +} + +function encodeV2ConfigTree(tree: v2.config.Topology): V2SessionsConfigTree { + if (v2.config.isNode(tree)) { + return { + left: encodeV2ConfigTree(tree.left), + right: encodeV2ConfigTree(tree.right) + } + } else if (v2.config.isSignerLeaf(tree)) { + return { + weight: numberNumber(tree.weight), + address: tree.address + } + } else if (v2.config.isNestedLeaf(tree)) { + return { + weight: numberNumber(tree.weight), + threshold: numberNumber(tree.threshold), + tree: encodeV2ConfigTree(tree.tree) + } + } else if (v2.config.isNodeLeaf(tree)) { + return { node: tree.nodeHash } + } else { + return { ...tree } + } +} + +function decodeConfig(version: number, config: any): commons.config.Config { + switch (version) { + case 1: + return { ...config, version } + + case 2: + return { ...config, version, tree: decodeV2ConfigTree(config.tree) } + + default: + throw new Error(`unknown version ${version}`) + } +} + +function decodeV2ConfigTree(tree: any): v2.config.Topology { + switch (typeof tree) { + case 'object': + const tree_ = { ...tree } + + if (tree_.left !== undefined) { + tree_.left = decodeV2ConfigTree(tree_.left) + } + + if (tree_.right !== undefined) { + tree_.right = decodeV2ConfigTree(tree_.right) + } + + if (tree_.tree !== undefined) { + tree_.tree = decodeV2ConfigTree(tree_.tree) + } + + if (tree_.node !== undefined) { + tree_.nodeHash = tree_.node + delete tree_.node + } + + return tree_ + + default: + throw new Error(`v2 config tree ${tree} is not an object`) + } +} + +function encodeTransaction(transaction: commons.transaction.Transaction): Transaction { + return { + to: transaction.to, + value: transaction.value !== undefined ? numberString(transaction.value) : undefined, + data: transaction.data !== undefined ? ethers.utils.hexlify(transaction.data) : undefined, + gasLimit: transaction.gasLimit !== undefined ? numberString(transaction.gasLimit) : undefined, + delegateCall: transaction.delegateCall, + revertOnError: transaction.revertOnError + } +} + +function numberNumber(n: ethers.BigNumberish): number { + return ethers.BigNumber.from(n).toNumber() +} + +function numberString(n: ethers.BigNumberish): string { + return ethers.BigNumber.from(n).toString() +} + +function is404NotFound(error: any): boolean { + return typeof error === 'object' && error.status === 404 +} diff --git a/packages/sessions/src/trackers/remote/sessions.gen.ts b/packages/sessions/src/trackers/remote/sessions.gen.ts new file mode 100644 index 000000000..49eb8207d --- /dev/null +++ b/packages/sessions/src/trackers/remote/sessions.gen.ts @@ -0,0 +1,634 @@ +/* eslint-disable */ +// sessions v0.0.1 d81ea64cbe41c1ab8b0107bce2f118817b34ebc0 +// -- +// Code generated by webrpc-gen@v0.18.6 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=sessions.ridl -target=typescript -client -out=./sessions.gen.ts + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.0.1' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = 'd81ea64cbe41c1ab8b0107bce2f118817b34ebc0' + +// +// Types +// + +export enum SignatureType { + EIP712 = 'EIP712', + EthSign = 'EthSign', + EIP1271 = 'EIP1271' +} + +export interface RuntimeStatus { + healthy: boolean + started: string + uptime: number + version: string + branch: string + commit: string + wallets: { [key: string]: number } + configs: { [key: string]: number } + configTrees: number + migrations: { [key: string]: number } + signatures: number + digests: number + recorder: RecorderStatus +} + +export interface RecorderStatus { + requests: number + buffer: number + lastFlush?: string + secondsSinceLastFlush?: number + endpoints: { [key: string]: number } +} + +export interface Context { + version: number + factory: string + mainModule: string + mainModuleUpgradable: string + guestModule: string + walletCreationCode: string +} + +export interface Signature { + digest: string + toImageHash?: string + chainID: string + type: SignatureType + signature: string +} + +export interface ConfigUpdate { + toImageHash: string + signature: string +} + +export interface Transaction { + to: string + value?: string + data?: string + gasLimit?: string + delegateCall?: boolean + revertOnError?: boolean +} + +export interface TransactionBundle { + executor: string + transactions: Array + nonce: string + signature: string +} + +export interface Sessions { + ping(headers?: object, signal?: AbortSignal): Promise + config(args: ConfigArgs, headers?: object, signal?: AbortSignal): Promise + wallets(args: WalletsArgs, headers?: object, signal?: AbortSignal): Promise + deployHash(args: DeployHashArgs, headers?: object, signal?: AbortSignal): Promise + configUpdates(args: ConfigUpdatesArgs, headers?: object, signal?: AbortSignal): Promise + migrations(args: MigrationsArgs, headers?: object, signal?: AbortSignal): Promise + saveConfig(args: SaveConfigArgs, headers?: object, signal?: AbortSignal): Promise + saveWallet(args: SaveWalletArgs, headers?: object, signal?: AbortSignal): Promise + saveSignature(args: SaveSignatureArgs, headers?: object, signal?: AbortSignal): Promise + saveSignerSignatures( + args: SaveSignerSignaturesArgs, + headers?: object, + signal?: AbortSignal + ): Promise + saveMigration(args: SaveMigrationArgs, headers?: object, signal?: AbortSignal): Promise +} + +export interface PingArgs {} + +export interface PingReturn {} +export interface ConfigArgs { + imageHash: string +} + +export interface ConfigReturn { + version: number + config: any +} +export interface WalletsArgs { + signer: string +} + +export interface WalletsReturn { + wallets: { [key: string]: Signature } +} +export interface DeployHashArgs { + wallet: string +} + +export interface DeployHashReturn { + deployHash: string + context: Context +} +export interface ConfigUpdatesArgs { + wallet: string + fromImageHash: string + allUpdates?: boolean +} + +export interface ConfigUpdatesReturn { + updates: Array +} +export interface MigrationsArgs { + wallet: string + fromVersion: number + fromImageHash: string + chainID?: string +} + +export interface MigrationsReturn { + migrations: { [key: string]: { [key: number]: { [key: string]: TransactionBundle } } } +} +export interface SaveConfigArgs { + version: number + config: any +} + +export interface SaveConfigReturn {} +export interface SaveWalletArgs { + version: number + deployConfig: any +} + +export interface SaveWalletReturn {} +export interface SaveSignatureArgs { + wallet: string + digest: string + chainID: string + signature: string + toConfig?: any +} + +export interface SaveSignatureReturn {} +export interface SaveSignerSignaturesArgs { + wallet: string + digest: string + chainID: string + signatures: Array + toConfig?: any +} + +export interface SaveSignerSignaturesReturn {} +export interface SaveMigrationArgs { + wallet: string + fromVersion: number + toVersion: number + toConfig: any + executor: string + transactions: Array + nonce: string + signature: string + chainID?: string +} + +export interface SaveMigrationReturn {} + +// +// Client +// +export class Sessions implements Sessions { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/Sessions/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + ping = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Ping'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + config = (args: ConfigArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Config'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + version: _data.version, + config: _data.config + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + wallets = (args: WalletsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Wallets'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + wallets: <{ [key: string]: Signature }>_data.wallets + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + deployHash = (args: DeployHashArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('DeployHash'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + deployHash: _data.deployHash, + context: _data.context + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + configUpdates = (args: ConfigUpdatesArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ConfigUpdates'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + updates: >_data.updates + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + migrations = (args: MigrationsArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Migrations'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + migrations: <{ [key: string]: { [key: number]: { [key: string]: TransactionBundle } } }>_data.migrations + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + saveConfig = (args: SaveConfigArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SaveConfig'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + saveWallet = (args: SaveWalletArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SaveWallet'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + saveSignature = (args: SaveSignatureArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SaveSignature'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + saveSignerSignatures = ( + args: SaveSignerSignaturesArgs, + headers?: object, + signal?: AbortSignal + ): Promise => { + return this.fetch(this.url('SaveSignerSignatures'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + saveMigration = (args: SaveMigrationArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SaveMigration'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return {} + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + return { + method: 'POST', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body || {}), + signal + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then(text => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}` + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = 'endpoint error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = 'request failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = 'bad route', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = 'bad method', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = 'bad request', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = 'bad response', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = 'server panic', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = 'internal error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = 'client disconnected', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = 'stream lost', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = 'stream finished', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export class InvalidArgumentError extends WebrpcError { + constructor( + name: string = 'InvalidArgument', + code: number = 1, + message: string = 'invalid argument', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, InvalidArgumentError.prototype) + } +} + +export class NotFoundError extends WebrpcError { + constructor(name: string = 'NotFound', code: number = 2, message: string = 'not found', status: number = 0, cause?: string) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, NotFoundError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + InvalidArgument = 'InvalidArgument', + NotFound = 'NotFound' +} + +const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1]: InvalidArgumentError, + [2]: NotFoundError +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/sessions/src/trackers/stores/index.ts b/packages/sessions/src/trackers/stores/index.ts new file mode 100644 index 000000000..b067048d0 --- /dev/null +++ b/packages/sessions/src/trackers/stores/index.ts @@ -0,0 +1,78 @@ +import { commons, v1, v2 } from '@0xsequence/core' +import { ethers } from 'ethers' + +export type PlainNode = { + left: string + right: string +} + +export type PlainNested = { + weight: string + threshold: string + tree: string +} + +export type PlainV2Config = { + version: 2 + threshold: string + checkpoint: string + tree: string +} + +export function isPlainNode(node: any): node is PlainNode { + return node.left !== undefined && node.right !== undefined +} + +export function isPlainNested(node: any): node is PlainNested { + return node.weight !== undefined && node.threshold !== undefined && node.tree !== undefined +} + +export function isPlainV2Config(config: any): config is PlainV2Config { + return ( + config.version === 2 && + config.threshold !== undefined && + config.checkpoint !== undefined && + config.tree !== undefined && + typeof config.tree === 'string' + ) +} + +export interface TrackerStore { + // top level configurations store + loadConfig: (imageHash: string) => Promise + saveConfig: (imageHash: string, config: v1.config.WalletConfig | PlainV2Config | v2.config.WalletConfig) => Promise + + // v2 configurations store + loadV2Node: (nodeHash: string) => Promise + saveV2Node: (nodeHash: string, node: PlainNode | PlainNested | v2.config.Topology) => Promise + + // counterfactual wallets + loadCounterfactualWallet: (wallet: string) => Promise<{ imageHash: string; context: commons.context.WalletContext } | undefined> + saveCounterfactualWallet: (wallet: string, imageHash: string, context: commons.context.WalletContext) => Promise + + // payloads + loadPayloadOfSubdigest: (subdigest: string) => Promise + savePayloadOfSubdigest: (subdigest: string, payload: commons.signature.SignedPayload) => Promise + + // signatures + loadSubdigestsOfSigner: (signer: string) => Promise + loadSignatureOfSubdigest: (signer: string, subdigest: string) => Promise + saveSignatureOfSubdigest: (signer: string, subdigest: string, payload: ethers.BytesLike) => Promise + + // migrations + loadMigrationsSubdigest: ( + wallet: string, + fromVersion: number, + toVersion: number + ) => Promise<{ subdigest: string; toImageHash: string }[]> + saveMigrationsSubdigest: ( + wallet: string, + fromVersion: number, + toVersion: number, + subdigest: string, + toImageHash: string + ) => Promise +} + +export * from './memoryStore' +export * from './indexedDBStore' diff --git a/packages/sessions/src/trackers/stores/indexedDBStore.ts b/packages/sessions/src/trackers/stores/indexedDBStore.ts new file mode 100644 index 000000000..6f0f1e275 --- /dev/null +++ b/packages/sessions/src/trackers/stores/indexedDBStore.ts @@ -0,0 +1,191 @@ +import { commons, v1, v2 } from '@0xsequence/core' +import { ethers } from 'ethers' +import { PlainNested, PlainNode, PlainV2Config, TrackerStore } from '.' + +import { DBSchema, IDBPDatabase, openDB } from 'idb' + +export interface LocalTrackerDBSchema extends DBSchema { + configs: { + key: string + value: v1.config.WalletConfig | v2.config.WalletConfig | PlainV2Config + } + v2Nodes: { + key: string + value: v2.config.Topology | PlainNode | PlainNested + } + counterfactualWallets: { + key: string + value: { + imageHash: string + context: commons.context.WalletContext + } + } + payloads: { + key: string + value: commons.signature.SignedPayload + } + signatures: { + key: string // `${signer}-${subdigest}` + value: { + signature: ethers.BytesLike + signer: string + } + indexes: { + signer: string + } + } + migrations: { + key: string + value: { + wallet: string + fromVersion: number + toVersion: number + subdigest: string + toImageHash: string + } + indexes: { + jump: string // '${wallet}-${fromVersion}-${toVersion} + } + } +} + +export function recreateBigNumbers(object: T): T | undefined { + if (object === undefined) return undefined + + const result = {} as any + + for (const key of Object.keys(object)) { + const val = (object as any)[key as string] + + if (val._isBigNumber === true && val._hex !== undefined && typeof val._hex === 'string' && val._hex.length !== '') { + // Entry is a big number + result[key] = ethers.BigNumber.from(val) + } else if (Array.isArray(val)) { + // Entry is an array, recurse + result[key] = val.map(v => recreateBigNumbers(v)) + } else if (typeof val === 'object' && val !== null) { + // Entry is another object, recurse + result[key] = recreateBigNumbers(val) + } else { + // Entry is a primitive, just copy + result[key] = val + } + } + + return result +} + +export class IndexedDBStore implements TrackerStore { + private _lazyDb: IDBPDatabase | undefined + + constructor(public dbName: string) {} + + async getDb() { + if (this._lazyDb) return this._lazyDb + + const dbName = this.dbName + this._lazyDb = await openDB(dbName, 1, { + upgrade(db, oldVersion, newVersion, transaction) { + console.log(`upgrading ${dbName} from ${oldVersion} to ${newVersion} - ${transaction}`) + if (oldVersion === 0) { + db.createObjectStore('configs') + db.createObjectStore('v2Nodes') + db.createObjectStore('counterfactualWallets') + db.createObjectStore('payloads') + + const signatures = db.createObjectStore('signatures') + signatures.createIndex('signer', 'signer', { unique: false }) + + const migrations = db.createObjectStore('migrations') + migrations.createIndex('jump', ['wallet', 'fromVersion', 'toVersion']) + } + } + }) + return this._lazyDb + } + + loadConfig = async ( + imageHash: string + ): Promise => { + const db = await this.getDb() + return db.get('configs', imageHash).then(c => recreateBigNumbers(c)) + } + + saveConfig = async ( + imageHash: string, + config: v1.config.WalletConfig | v2.config.WalletConfig | PlainV2Config + ): Promise => { + const db = await this.getDb() + await db.put('configs', config, imageHash) + } + + loadV2Node = async (nodeHash: string): Promise => { + const db = await this.getDb() + return db.get('v2Nodes', nodeHash).then(c => recreateBigNumbers(c)) + } + + saveV2Node = async (nodeHash: string, node: v2.config.Topology | PlainNode | PlainNested): Promise => { + const db = await this.getDb() + await db.put('v2Nodes', node, nodeHash) + } + + loadCounterfactualWallet = async ( + wallet: string + ): Promise<{ imageHash: string; context: commons.context.WalletContext } | undefined> => { + const db = await this.getDb() + return db.get('counterfactualWallets', wallet) + } + + saveCounterfactualWallet = async (wallet: string, imageHash: string, context: commons.context.WalletContext): Promise => { + const db = await this.getDb() + await db.put('counterfactualWallets', { imageHash, context }, wallet) + } + + loadPayloadOfSubdigest = async (subdigest: string): Promise => { + const db = await this.getDb() + return db.get('payloads', subdigest).then(c => recreateBigNumbers(c)) + } + + savePayloadOfSubdigest = async (subdigest: string, payload: commons.signature.SignedPayload): Promise => { + const db = await this.getDb() + await db.put('payloads', payload, subdigest) + } + + loadSubdigestsOfSigner = async (signer: string): Promise => { + const db = await this.getDb() + const index = await db.getAllKeysFromIndex('signatures', 'signer', IDBKeyRange.only(signer)) + return index.map(key => key.split('-')[0]) + } + + loadSignatureOfSubdigest = async (signer: string, subdigest: string): Promise => { + const db = await this.getDb() + const signature = await db.get('signatures', [subdigest, signer].join('-')) + return signature?.signature + } + + saveSignatureOfSubdigest = async (signer: string, subdigest: string, payload: ethers.BytesLike): Promise => { + const db = await this.getDb() + await db.put('signatures', { signature: payload, signer }, [subdigest, signer].join('-')) + } + + loadMigrationsSubdigest = async ( + wallet: string, + fromVersion: number, + toVersion: number + ): Promise<{ subdigest: string; toImageHash: string }[]> => { + const db = await this.getDb() + const index = await db.getAllFromIndex('migrations', 'jump', IDBKeyRange.only([wallet, fromVersion, toVersion])) + return index.map(key => ({ subdigest: key.subdigest, toImageHash: key.toImageHash })) + } + + saveMigrationsSubdigest = async ( + wallet: string, + fromVersion: number, + toVersion: number, + subdigest: string, + toImageHash: string + ): Promise => { + const db = await this.getDb() + await db.put('migrations', { wallet, fromVersion, toVersion, subdigest, toImageHash }, subdigest) + } +} diff --git a/packages/sessions/src/trackers/stores/memoryStore.ts b/packages/sessions/src/trackers/stores/memoryStore.ts new file mode 100644 index 000000000..f7a10ae23 --- /dev/null +++ b/packages/sessions/src/trackers/stores/memoryStore.ts @@ -0,0 +1,88 @@ +import { commons, v1, v2 } from '@0xsequence/core' +import { ethers } from 'ethers' +import { PlainNested, PlainNode, PlainV2Config, TrackerStore } from '.' + +export class MemoryTrackerStore implements TrackerStore { + private configs: { [imageHash: string]: v1.config.WalletConfig | v2.config.WalletConfig | PlainV2Config } = {} + private v2Nodes: { [nodeHash: string]: PlainNode | PlainNested | v2.config.Topology } = {} + private counterfactualWallets: { [wallet: string]: { imageHash: string; context: commons.context.WalletContext } } = {} + private payloads: { [subdigest: string]: commons.signature.SignedPayload } = {} + private signatures: { [signer: string]: { [subdigest: string]: ethers.BytesLike } } = {} + private migrations: { + [wallet: string]: { [fromVersion: number]: { [toVersion: number]: { subdigest: string; toImageHash: string }[] } } + } = {} + + loadConfig = (imageHash: string): Promise => { + return Promise.resolve(this.configs[imageHash]) + } + + saveConfig = (imageHash: string, config: v1.config.WalletConfig | v2.config.WalletConfig | PlainV2Config): Promise => { + this.configs[imageHash] = config + return Promise.resolve() + } + + loadV2Node = (nodeHash: string): Promise => { + return Promise.resolve(this.v2Nodes[nodeHash]) + } + + saveV2Node = (nodeHash: string, node: v2.config.Topology | PlainNode | PlainNested): Promise => { + this.v2Nodes[nodeHash] = node + return Promise.resolve() + } + + loadCounterfactualWallet = ( + wallet: string + ): Promise<{ imageHash: string; context: commons.context.WalletContext } | undefined> => { + return Promise.resolve(this.counterfactualWallets[wallet]) + } + + saveCounterfactualWallet = (wallet: string, imageHash: string, context: commons.context.WalletContext): Promise => { + this.counterfactualWallets[wallet] = { imageHash, context } + return Promise.resolve() + } + + loadPayloadOfSubdigest = (subdigest: string): Promise => { + return Promise.resolve(this.payloads[subdigest]) + } + + savePayloadOfSubdigest = (subdigest: string, payload: commons.signature.SignedPayload): Promise => { + this.payloads[subdigest] = payload + return Promise.resolve() + } + + loadSubdigestsOfSigner = (signer: string): Promise => { + return Promise.resolve(Object.keys(this.signatures[signer] || {})) + } + + loadSignatureOfSubdigest = (signer: string, subdigest: string): Promise => { + return Promise.resolve(this.signatures[signer]?.[subdigest]) + } + + saveSignatureOfSubdigest = (signer: string, subdigest: string, payload: ethers.BytesLike): Promise => { + if (!this.signatures[signer]) this.signatures[signer] = {} + this.signatures[signer][subdigest] = payload + return Promise.resolve() + } + + loadMigrationsSubdigest = ( + wallet: string, + fromVersion: number, + toVersion: number + ): Promise<{ subdigest: string; toImageHash: string }[]> => { + return Promise.resolve(this.migrations[wallet]?.[fromVersion]?.[toVersion] || []) + } + + saveMigrationsSubdigest = ( + wallet: string, + fromVersion: number, + toVersion: number, + subdigest: string, + toImageHash: string + ): Promise => { + if (!this.migrations[wallet]) this.migrations[wallet] = {} + if (!this.migrations[wallet][fromVersion]) this.migrations[wallet][fromVersion] = {} + if (!this.migrations[wallet][fromVersion][toVersion]) this.migrations[wallet][fromVersion][toVersion] = [] + this.migrations[wallet][fromVersion][toVersion].push({ subdigest, toImageHash }) + return Promise.resolve() + } +} diff --git a/packages/sessions/tests/local.spec.ts b/packages/sessions/tests/local.spec.ts new file mode 100644 index 000000000..7dc9a349b --- /dev/null +++ b/packages/sessions/tests/local.spec.ts @@ -0,0 +1,1195 @@ +import hardhat from 'hardhat' +import * as chai from 'chai' +import * as utils from '@0xsequence/tests' + +import { trackers, tracker } from '../src/index' +import { commons, universal, v2 } from '@0xsequence/core' +import { ethers } from 'ethers' +import { Wallet } from '@0xsequence/wallet' +import { Orchestrator } from '@0xsequence/signhub' + +// This is a hack to get around the fact that indexedDB is not available in nodejs +import 'fake-indexeddb/auto' + +const { expect } = chai + +const ConfigCases = [ + { + name: 'v1, random', + config: () => utils.configs.random.genRandomV1Config() + }, + { + name: 'v1, no signers', + config: () => utils.configs.random.genRandomV1Config(undefined, 0) + }, + { + name: 'v1, 1 signer', + config: () => utils.configs.random.genRandomV1Config(undefined, 1) + }, + { + name: 'v1, 2 signers', + config: () => utils.configs.random.genRandomV1Config(undefined, 2) + }, + { + name: 'v1, 3 signers', + config: () => utils.configs.random.genRandomV1Config(undefined, 3) + }, + { + name: 'v1, 4 signers', + config: () => utils.configs.random.genRandomV1Config(undefined, 4) + }, + { + name: 'v1, 100 signers', + config: () => utils.configs.random.genRandomV1Config(undefined, 100) + }, + { + name: 'v1, 101 signers', + config: () => utils.configs.random.genRandomV1Config(undefined, 101) + }, + { + name: 'v2 (random)', + config: () => utils.configs.random.genRandomV2Config() + }, + { + name: 'v2, 1 signer', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 1, 0) + }, + { + name: 'v2, 2 signers', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 2, 0) + }, + { + name: 'v2, 3 signers', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 3, 0) + }, + { + name: 'v2, 4 signers', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 4, 0) + }, + { + name: 'v2, 5 signers', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 5, 0) + }, + { + name: 'v2, 59 signers', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 59, 0) + }, + { + name: 'v2, 5 signers (merkle)', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 5, 0, true) + }, + { + name: 'v2, 11 signers (merkle)', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 11, 0, true) + }, + { + name: 'v2, 101 signers (merkle)', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 101, 0, true) + }, + { + name: 'v2, 1 subdigest', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 0, 1) + }, + { + name: 'v2, 10 subdigest (merkle)', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 0, 10, true) + }, + { + name: 'v2, 12 signers, 55 subdigest (merkle)', + config: () => utils.configs.random.genRandomV2Config(undefined, undefined, 12, 55, true) + }, + { + name: 'v2, random nested configs', + config: () => { + const nested1 = utils.configs.random.genRandomV2Config(undefined, undefined, 11, 10, true) + const nested2 = utils.configs.random.genRandomV2Config() + + return { + version: 2, + threshold: ethers.BigNumber.from(2), + checkpoint: ethers.BigNumber.from(392919), + tree: { + left: { + subdigest: ethers.utils.hexlify(ethers.utils.randomBytes(32)) + }, + right: { + left: { + weight: ethers.BigNumber.from(1), + threshold: ethers.BigNumber.from(99), + tree: nested1.tree + }, + right: { + weight: ethers.BigNumber.from(99), + threshold: ethers.BigNumber.from(1), + tree: nested2.tree + } + } + } + } as v2.config.WalletConfig + } + } +] + +const randomContext = () => { + return { + version: Math.floor(Math.random() * 10) + 1, + factory: ethers.Wallet.createRandom().address, + mainModule: ethers.Wallet.createRandom().address, + mainModuleUpgradable: ethers.Wallet.createRandom().address, + guestModule: ethers.Wallet.createRandom().address, + + walletCreationCode: ethers.utils.hexlify(ethers.utils.randomBytes(32)) + } +} + +const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)) + +describe('Local config tracker', () => { + let provider: ethers.providers.Web3Provider + + before(async () => { + provider = new ethers.providers.Web3Provider(hardhat.network.provider as any) + }) + ;[ + { + name: 'Using memory store', + getTracker: () => new trackers.local.LocalConfigTracker(provider, new trackers.stores.MemoryTrackerStore()) + }, + { + name: 'Using IndexedDB store', + getTracker: () => new trackers.local.LocalConfigTracker(provider, new trackers.stores.IndexedDBStore('test')) + }, + { + name: 'Using multiple trackers (2)', + getTracker: () => { + const tracker1 = new trackers.local.LocalConfigTracker(provider, new trackers.stores.MemoryTrackerStore()) + const tracker2 = new trackers.local.LocalConfigTracker(provider, new trackers.stores.MemoryTrackerStore()) + + return new trackers.MultipleTracker([tracker1, tracker2]) + } + }, + { + name: 'Using multiple trackers (3)', + getTracker: () => { + const tracker1 = new trackers.local.LocalConfigTracker(provider, new trackers.stores.MemoryTrackerStore()) + const tracker2 = new trackers.local.LocalConfigTracker(provider, new trackers.stores.MemoryTrackerStore()) + const tracker3 = new trackers.local.LocalConfigTracker(provider, new trackers.stores.IndexedDBStore('test-2')) + + return new trackers.MultipleTracker([tracker1, tracker2, tracker3]) + } + }, + { + name: 'Using a cached tracker', + getTracker: () => { + const tracker = new trackers.local.LocalConfigTracker(provider, new trackers.stores.MemoryTrackerStore()) + const cache = new trackers.local.LocalConfigTracker(provider, new trackers.stores.MemoryTrackerStore()) + return new trackers.CachedTracker(tracker, cache, {}) + } + }, + { + name: 'Using a deduped tracker', + getTracker: () => { + const tracker = new trackers.local.LocalConfigTracker(provider, new trackers.stores.MemoryTrackerStore()) + return new trackers.DedupedTracker(tracker, 50) + } + } + ].map(({ name, getTracker }) => { + describe(name, () => { + let tracker: tracker.ConfigTracker + + beforeEach(() => { + tracker = getTracker() + }) + + describe('Configuration', () => { + ConfigCases.map(o => { + it(`Should be able to set and get ${o.name}`, async () => { + const config = o.config() + + await tracker.saveWalletConfig({ config }) + + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + const getConfig = await tracker.configOfImageHash({ imageHash }) + + expect(normalize(getConfig)).to.deep.equal(normalize(config)) + }) + }) + + it('Should handle all cases at once', async () => { + const shuffled = ConfigCases.sort(() => Math.random() - 0.5) + const configs = shuffled.map(o => o.config()) + + for (const config of configs) { + await tracker.saveWalletConfig({ config }) + + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + const getConfig = await tracker.configOfImageHash({ imageHash }) + + expect(normalize(getConfig)).to.deep.equal(normalize(config)) + } + + for (const config of configs) { + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + const getConfig = await tracker.configOfImageHash({ imageHash }) + + expect(normalize(getConfig)).to.deep.equal(normalize(config)) + } + + // Adding the configs again should not change anything + for (const config of configs) { + await tracker.saveWalletConfig({ config }) + + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + const getConfig = await tracker.configOfImageHash({ imageHash }) + + expect(normalize(getConfig)).to.deep.equal(normalize(config)) + } + }) + + it.skip('Should combine two different v2 configurations', async () => { + const config1 = utils.configs.random.genRandomV2Config(undefined, undefined, 25, 15, true) + const config2 = utils.configs.random.genRandomV2Config(undefined, undefined, 2, 1, false) + + const ih1 = v2.config.imageHash(config1) + const ih2 = v2.config.imageHash(config2) + + const emptyConfig = { + version: 2, + threshold: ethers.BigNumber.from(2), + checkpoint: ethers.BigNumber.from(0), + tree: { + left: { nodeHash: v2.config.hashNode(config1.tree) }, + right: { nodeHash: v2.config.hashNode(config2.tree) } + } + } + + const imageHash = v2.config.imageHash(emptyConfig) + + await tracker.saveWalletConfig({ config: emptyConfig }) + expect(normalize(await tracker.configOfImageHash({ imageHash }))).to.deep.equal(normalize(emptyConfig)) + + // Add the first config + // should reveal the left branch + await tracker.saveWalletConfig({ config: config1 }) + + // The deduped tracker may cache the result a bit, so if we see a window + // we apply a small delay + if ((tracker as any).window) { + await new Promise(resolve => setTimeout(resolve, 100)) + } + + expect(normalize(await tracker.configOfImageHash({ imageHash: ih1 }))).to.deep.equal(normalize(config1)) + expect(normalize(await tracker.configOfImageHash({ imageHash }))).to.deep.equal( + normalize({ + version: 2, + threshold: ethers.BigNumber.from(2), + checkpoint: ethers.BigNumber.from(0), + tree: { + left: config1.tree, + right: { nodeHash: v2.config.hashNode(config2.tree) } + } + }) + ) + + // Add the second config + // should reveal the whole tree + await tracker.saveWalletConfig({ config: config2 }) + + if ((tracker as any).window) { + await new Promise(resolve => setTimeout(resolve, 100)) + } + + expect(normalize(await tracker.configOfImageHash({ imageHash: ih2 }))).to.deep.equal(normalize(config2)) + expect(normalize(await tracker.configOfImageHash({ imageHash }))).to.deep.equal( + normalize({ + version: 2, + threshold: ethers.BigNumber.from(2), + checkpoint: ethers.BigNumber.from(0), + tree: { + left: config1.tree, + right: config2.tree + } + }) + ) + }) + + it('Should return undefined for unknown imageHash', async () => { + const imageHash = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + expect(await tracker.configOfImageHash({ imageHash })).to.be.undefined + }) + + it('Should handle the same request multiple times', async () => { + const config = utils.configs.random.genRandomV1Config() + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + + await Promise.all(new Array(10).fill(0).map(async () => tracker.saveWalletConfig({ config }))) + const results = await Promise.all(new Array(10).fill(0).map(async () => tracker.configOfImageHash({ imageHash }))) + + expect(results).to.deep.equal(new Array(10).fill(config)) + }) + }) + + describe('Counterfactual address', () => { + it('Should set and get address', async () => { + const context = randomContext() + const config = utils.configs.random.genRandomV1Config() + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + + const wallet = commons.context.addressOf(context, imageHash) + await tracker.saveCounterfactualWallet({ config, context: [context] }) + const res = await tracker.imageHashOfCounterfactualWallet({ wallet }) + + expect(res).to.deep.equal({ imageHash, context }) + }) + + it('Should set address for multiple configs', async () => { + const contexts = new Array(5).fill(0).map(() => randomContext()) + const config = utils.configs.random.genRandomV1Config() + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + + const wallets = contexts.map(c => commons.context.addressOf(c, imageHash)) + await tracker.saveCounterfactualWallet({ config, context: contexts }) + + for (let i = 0; i < wallets.length; i++) { + const res = await tracker.imageHashOfCounterfactualWallet({ wallet: wallets[i] }) + expect(res).to.deep.equal({ imageHash, context: contexts[i] }) + } + }) + + it('Should return undefined for unknown wallet', async () => { + const wallet = ethers.Wallet.createRandom().address + expect(await tracker.imageHashOfCounterfactualWallet({ wallet })).to.be.undefined + }) + + it('Should handle the same request multiple times', async () => { + const context = randomContext() + const config = utils.configs.random.genRandomV1Config() + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + + const wallet = commons.context.addressOf(context, imageHash) + await Promise.all( + new Array(10).fill(0).map(async () => tracker.saveCounterfactualWallet({ config, context: [context] })) + ) + + const results = await Promise.all( + new Array(10).fill(0).map(async () => tracker.imageHashOfCounterfactualWallet({ wallet })) + ) + expect(results).to.deep.equal(new Array(10).fill({ imageHash, context })) + }) + }) + + describe('Chained configurations', () => { + let context: commons.context.WalletContext + + before(async () => { + context = await utils.context.deploySequenceContexts(provider.getSigner(0)).then(c => c[2]) + }) + + it('Should return return empty chained configuration if config is not known', async () => { + const imageHash = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + const res = await tracker.loadPresignedConfiguration({ + wallet: ethers.Wallet.createRandom().address, + fromImageHash: imageHash + }) + expect(res).to.deep.equal([]) + }) + + it('Should return no chained configuration if no presigned transactions', async () => { + const config = utils.configs.random.genRandomV2Config() + const imageHash = v2.config.imageHash(config) + await tracker.saveWalletConfig({ config }) + const res = await tracker.loadPresignedConfiguration({ + wallet: ethers.Wallet.createRandom().address, + fromImageHash: imageHash + }) + expect(res).to.deep.equal([]) + }) + + it('Should return single presigned step', async () => { + const signer = ethers.Wallet.createRandom() + const config = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer.address, weight: 1 } } + const imageHash = v2.config.imageHash(config) + const address = commons.context.addressOf(context, imageHash) + const wallet = new Wallet({ + config, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + + const nextConfig = utils.configs.random.genRandomV2Config() + const nextImageHash = v2.config.imageHash(nextConfig) + + const digest = v2.chained.hashSetImageHash(nextImageHash) + const signature = await wallet.signDigest(digest) + + await tracker.saveWalletConfig({ config }) + await tracker.saveWalletConfig({ config: nextConfig }) + await tracker.savePresignedConfiguration({ wallet: address, nextConfig, signature }) + + const res = await tracker.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + expect(res.length).to.equal(1) + expect(res[0].nextImageHash).to.equal(nextImageHash) + expect(res[0].wallet).to.equal(wallet.address) + expect(res[0].signature).to.equal(signature) + }) + + it('Should return empty for wrong wallet', async () => { + const signer = ethers.Wallet.createRandom() + const config = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer.address, weight: 1 } } + const imageHash = v2.config.imageHash(config) + const address = commons.context.addressOf(context, imageHash) + const wallet = new Wallet({ + config, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + + const nextConfig = utils.configs.random.genRandomV2Config() + const nextImageHash = v2.config.imageHash(nextConfig) + + const digest = v2.chained.hashSetImageHash(nextImageHash) + const signature = await wallet.signDigest(digest) + + await tracker.saveWalletConfig({ config }) + await tracker.saveWalletConfig({ config: nextConfig }) + await tracker.savePresignedConfiguration({ wallet: address, nextConfig, signature }) + + const wrongWallet = ethers.Wallet.createRandom().address + const res = await tracker.loadPresignedConfiguration({ wallet: wrongWallet, fromImageHash: imageHash }) + expect(res.length).to.equal(0) + }) + + it('Should return two steps', async () => { + // Step 1 + const signer = ethers.Wallet.createRandom() + const config = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer.address, weight: 1 } } + const imageHash = v2.config.imageHash(config) + + const address = commons.context.addressOf(context, imageHash) + const wallet1 = new Wallet({ + config, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + + const signer2a = ethers.Wallet.createRandom() + const signer2b = ethers.Wallet.createRandom() + const nextConfig1 = { + version: 2, + threshold: 6, + checkpoint: 2, + tree: { + right: { + address: signer2a.address, + weight: 3 + }, + left: { + address: signer2b.address, + weight: 3 + } + } + } + + const nextImageHash1 = v2.config.imageHash(nextConfig1) + + const digest1 = v2.chained.hashSetImageHash(nextImageHash1) + const signature1 = await wallet1.signDigest(digest1) + + // Step 2 + const nextConfig2 = { ...utils.configs.random.genRandomV2Config(), checkpoint: 3 } + const nextImageHash2 = v2.config.imageHash(nextConfig2) + + const digest2 = v2.chained.hashSetImageHash(nextImageHash2) + const wallet2 = new Wallet({ + config: nextConfig1, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer2a, signer2b]) + }) + + const signature2 = await wallet2.signDigest(digest2) + + // Saving only signature2 should lead to empty path + // because there is no route from initial config to config1 + await tracker.saveWalletConfig({ config }) + await tracker.saveWalletConfig({ config: nextConfig1 }) + await tracker.saveWalletConfig({ config: nextConfig2 }) + await tracker.savePresignedConfiguration({ + wallet: address, + nextConfig: nextConfig2, + signature: signature2 + }) + + const route0_2a = await tracker.loadPresignedConfiguration({ + wallet: address, + fromImageHash: imageHash + }) + + expect(route0_2a.length).to.equal(0) + + // But starting from imageHash1 should give us a link + const result1_2a = await tracker.loadPresignedConfiguration({ + wallet: address, + fromImageHash: nextImageHash1 + }) + + expect(result1_2a.length).to.equal(1) + expect(result1_2a[0].nextImageHash).to.equal(nextImageHash2) + expect(result1_2a[0].signature).to.equal(signature2) + expect(result1_2a[0].wallet).to.equal(address) + + // Adding the 0_1 step should give us a full chain to 2 + await tracker.savePresignedConfiguration({ + wallet: address, + nextConfig: nextConfig1, + signature: signature1 + }) + + if ((tracker as any).window) { + await new Promise(resolve => setTimeout(resolve, 100)) + } + + const result0_2b = await tracker.loadPresignedConfiguration({ + wallet: address, + fromImageHash: imageHash + }) + + expect(result0_2b.length).to.equal(2) + expect(result0_2b[0].wallet).to.equal(address) + expect(result0_2b[1].wallet).to.equal(address) + expect(result0_2b[0].nextImageHash).to.equal(nextImageHash1) + expect(result0_2b[1].nextImageHash).to.equal(nextImageHash2) + expect(result0_2b[0].signature).to.equal(signature1) + expect(result0_2b[1].signature).to.equal(signature2) + }) + + it('Should skip step if it uses the same signers', async () => { + const signer1 = ethers.Wallet.createRandom() + const config1 = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer1.address, weight: 1 } } + const imageHash1 = v2.config.imageHash(config1) + const address = commons.context.addressOf(context, imageHash1) + const wallet = new Wallet({ + config: config1, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer1]) + }) + + const signer2 = ethers.Wallet.createRandom() + const config2 = { + version: 2, + threshold: 3, + checkpoint: 1, + tree: { + left: { + address: signer1.address, + weight: 3 + }, + right: { + address: signer2.address, + weight: 4 + } + } + } + + const imageHash2 = v2.config.imageHash(config2) + + const digest1 = v2.chained.hashSetImageHash(imageHash2) + const signature1 = await wallet.signDigest(digest1) + + const config3 = utils.configs.random.genRandomV2Config() + const imageHash3 = v2.config.imageHash(config3) + + const digest2 = v2.chained.hashSetImageHash(imageHash3) + const wallet2 = new Wallet({ + config: config2, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer1, signer2]) + }) + + const signature2 = await wallet2.signDigest(digest2) + + await tracker.saveWalletConfig({ config: config1 }) + await tracker.saveWalletConfig({ config: config2 }) + await tracker.saveWalletConfig({ config: config3 }) + await tracker.savePresignedConfiguration({ wallet: address, nextConfig: config2, signature: signature1 }) + await tracker.savePresignedConfiguration({ wallet: address, nextConfig: config3, signature: signature2 }) + + // Going from 1 to 3 should give us 1 jump + const resa = await tracker.loadPresignedConfiguration({ + wallet: address, + fromImageHash: imageHash1 + }) + + expect(resa.length).to.equal(1) + expect(resa[0].wallet).to.equal(address) + expect(resa[0].nextImageHash).to.equal(imageHash3) + // This is equivalent to having signed the update + // with only signer1 (because that's what we have in imageHash1) + expect(resa[0].signature).to.equal(await wallet.signDigest(digest2)) + + // Unless we ask for the longest path, then we should find + // both jumps + const resb = await tracker.loadPresignedConfiguration({ + wallet: address, + fromImageHash: imageHash1, + longestPath: true + }) + + expect(resb.length).to.equal(2) + expect(resb[0].wallet).to.equal(address) + expect(resb[1].wallet).to.equal(address) + expect(resb[0].nextImageHash).to.equal(imageHash2) + expect(resb[1].nextImageHash).to.equal(imageHash3) + expect(resb[0].signature).to.equal(signature1) + expect(resb[1].signature).to.equal(signature2) + + // Should return wallets of signer1 and signer2 + const wallets1 = await tracker.walletsOfSigner({ signer: signer1.address }) + expect(wallets1.length).to.equal(1) + expect(wallets1[0].wallet).to.equal(address) + + const wallets2 = await tracker.walletsOfSigner({ signer: signer2.address }) + expect(wallets2.length).to.equal(1) + expect(wallets2[0].wallet).to.equal(address) + }) + }) + + describe('Handle witnesses', async () => { + let context: commons.context.WalletContext + + before(async () => { + context = await utils.context.deploySequenceContexts(provider.getSigner(0)).then(c => c[2]) + }) + + it('Should retrieve no witness for never used signer', async () => { + const signer = ethers.Wallet.createRandom().address + const witness = await tracker.walletsOfSigner({ signer }) + expect(witness.length).to.equal(0) + }) + + it('Should save a witness for a signer', async () => { + const signer = ethers.Wallet.createRandom() + const config = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer.address, weight: 1 } } + const imageHash = v2.config.imageHash(config) + const address = commons.context.addressOf(context, imageHash) + const wallet = new Wallet({ + config, + chainId: 1, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + + const digest = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + const signature = await wallet.signDigest(digest) + + const decoded = v2.signature.SignatureCoder.decode(signature) + await tracker.saveWitnesses({ + wallet: address, + digest, + chainId: 1, + signatures: [(decoded.decoded.tree as v2.signature.SignatureLeaf).signature] + }) + + const witness = await tracker.walletsOfSigner({ signer: signer.address }) + expect(witness.length).to.equal(1) + expect(witness[0].wallet).to.equal(address) + expect(witness[0].proof.chainId.toNumber()).to.equal(1) + expect(witness[0].proof.digest).to.equal(digest) + expect(witness[0].proof.signature).to.equal((decoded.decoded.tree as v2.signature.SignatureLeaf).signature) + + // Adding a second witness should not change anything + const digest2 = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + const signature2 = await wallet.signDigest(digest2) + const decoded2 = v2.signature.SignatureCoder.decode(signature2) + await tracker.saveWitnesses({ + wallet: address, + digest: digest2, + chainId: 1, + signatures: [(decoded2.decoded.tree as v2.signature.SignatureLeaf).signature] + }) + + const witness2 = await tracker.walletsOfSigner({ signer: signer.address }) + expect(witness2.length).to.equal(1) + + // Adding a witness for a different chain should not change anything + const digest3 = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + const wallet2 = new Wallet({ + config, + chainId: 2, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + const signature3 = await wallet2.signDigest(digest3) + const decoded3 = v2.signature.SignatureCoder.decode(signature3) + await tracker.saveWitnesses({ + wallet: address, + digest: digest3, + chainId: 2, + signatures: [(decoded3.decoded.tree as v2.signature.SignatureLeaf).signature] + }) + + const witness3 = await tracker.walletsOfSigner({ signer: signer.address }) + expect(witness3.length).to.equal(1) + }) + + it('It should save witnesses for multiple wallets', async () => { + const signer = ethers.Wallet.createRandom() + const config = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer.address, weight: 1 } } + const imageHash = v2.config.imageHash(config) + const address = commons.context.addressOf(context, imageHash) + const wallet = new Wallet({ + config, + chainId: 1, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + + const digest = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + const signature = await wallet.signDigest(digest) + + const decoded = v2.signature.SignatureCoder.decode(signature) + await tracker.saveWitnesses({ + wallet: address, + digest, + chainId: 1, + signatures: [(decoded.decoded.tree as v2.signature.SignatureLeaf).signature] + }) + + const config2 = { version: 2, threshold: 2, checkpoint: 0, tree: { address: signer.address, weight: 2 } } + const imageHash2 = v2.config.imageHash(config2) + const address2 = commons.context.addressOf(context, imageHash2) + const wallet2 = new Wallet({ + config: config2, + chainId: 1, + coders: v2.coders, + address: address2, + context, + orchestrator: new Orchestrator([signer]) + }) + + const digest2 = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + const signature2 = await wallet2.signDigest(digest2) + + const decoded2 = v2.signature.SignatureCoder.decode(signature2) + await tracker.saveWitnesses({ + wallet: address2, + digest: digest2, + chainId: 1, + signatures: [(decoded2.decoded.tree as v2.signature.SignatureLeaf).signature] + }) + + const witness = await tracker.walletsOfSigner({ signer: signer.address }) + expect(witness.length).to.equal(2) + + const wallet1Result = witness.find(w => w.wallet === address) + const wallet2Result = witness.find(w => w.wallet === address2) + expect(wallet1Result).to.not.be.undefined + expect(wallet2Result).to.not.be.undefined + + expect(wallet1Result?.proof.chainId.toNumber()).to.equal(1) + expect(wallet1Result?.proof.digest).to.equal(digest) + expect(wallet1Result?.proof.signature).to.equal((decoded.decoded.tree as v2.signature.SignatureLeaf).signature) + + expect(wallet2Result?.proof.chainId.toNumber()).to.equal(1) + expect(wallet2Result?.proof.digest).to.equal(digest2) + expect(wallet2Result?.proof.signature).to.equal((decoded2.decoded.tree as v2.signature.SignatureLeaf).signature) + }) + }) + }) + }) + + describe('Multiple config trackers', () => { + let tracker1: trackers.local.LocalConfigTracker + let tracker2: trackers.local.LocalConfigTracker + + let combined: trackers.MultipleTracker + + beforeEach(async () => { + tracker1 = new trackers.local.LocalConfigTracker(provider) + tracker2 = new trackers.local.LocalConfigTracker(provider) + + combined = new trackers.MultipleTracker([tracker1, tracker2]) + }) + + describe('Config', () => { + it('Storing a config should store it in both', async () => { + const config = { + version: 2, + threshold: ethers.BigNumber.from(1), + checkpoint: ethers.BigNumber.from(0), + tree: { + address: ethers.Wallet.createRandom().address, + weight: ethers.BigNumber.from(1) + } + } + + const imageHash = v2.config.imageHash(config) + + await combined.saveWalletConfig({ config }) + + const config1 = await tracker1.configOfImageHash({ imageHash }) + const config2 = await tracker2.configOfImageHash({ imageHash }) + + expect(config1).to.deep.equal(config) + expect(config2).to.deep.equal(config) + }) + + it('Retrieving a config from tracker1, should mirror to tracker2', async () => { + const config = { + version: 2, + threshold: ethers.BigNumber.from(1), + checkpoint: ethers.BigNumber.from(0), + tree: { + address: ethers.Wallet.createRandom().address, + weight: ethers.BigNumber.from(1) + } + } + + const imageHash = v2.config.imageHash(config) + + await tracker1.saveWalletConfig({ config }) + + const config1 = await combined.configOfImageHash({ imageHash }) + + await wait(500) + + const config2 = await tracker2.configOfImageHash({ imageHash }) + + expect(config1).to.deep.equal(config) + expect(config2).to.deep.equal(config) + }) + + it.skip('Should combine 2 different sources', async () => { + const node1 = { + address: ethers.Wallet.createRandom().address, + weight: ethers.BigNumber.from(1) + } + + const node2 = { + address: ethers.Wallet.createRandom().address, + weight: ethers.BigNumber.from(1) + } + + const config1 = { + version: 2, + threshold: ethers.BigNumber.from(1), + checkpoint: ethers.BigNumber.from(1234), + tree: { + left: { + nodeHash: v2.config.hashNode(node1) + }, + right: node2 + } + } + + const config2 = { + version: 2, + threshold: ethers.BigNumber.from(1), + checkpoint: ethers.BigNumber.from(1234), + tree: { + left: node1, + right: { + nodeHash: v2.config.hashNode(node2) + } + } + } + + const configAll = { + version: 2, + threshold: ethers.BigNumber.from(1), + checkpoint: ethers.BigNumber.from(1234), + tree: { + left: node1, + right: node2 + } + } + + await tracker1.saveWalletConfig({ config: config1 }) + await tracker2.saveWalletConfig({ config: config2 }) + + const imageHash = v2.config.imageHash(config2) + const res1 = await combined.configOfImageHash({ imageHash }) + const res2 = await tracker1.configOfImageHash({ imageHash }) + const res3 = await tracker2.configOfImageHash({ imageHash }) + + expect(res1).to.deep.equal(configAll) + expect(res2).to.deep.equal(configAll) + expect(res3).to.deep.equal(configAll) + }) + }) + + describe('Counterfactual addresses', () => { + it('Should store counterfactual address in both', async () => { + const context = randomContext() + const config = utils.configs.random.genRandomV1Config() + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + + const wallet = commons.context.addressOf(context, imageHash) + await combined.saveCounterfactualWallet({ config, context: [context] }) + + const res1 = await combined.imageHashOfCounterfactualWallet({ wallet }) + const res2 = await tracker1.imageHashOfCounterfactualWallet({ wallet }) + const res3 = await tracker2.imageHashOfCounterfactualWallet({ wallet }) + + expect(res1).to.deep.equal({ imageHash, context }) + expect(res2).to.deep.equal({ imageHash, context }) + expect(res3).to.deep.equal({ imageHash, context }) + }) + + it('Should mirror counterfactual address from tracker1', async () => { + const context = randomContext() + const config = utils.configs.random.genRandomV1Config() + const imageHash = universal.genericCoderFor(config.version).config.imageHashOf(config) + + const wallet = commons.context.addressOf(context, imageHash) + await tracker1.saveCounterfactualWallet({ config, context: [context] }) + + const res1 = await combined.imageHashOfCounterfactualWallet({ wallet }) + + await wait(500) + + const res2 = await tracker1.imageHashOfCounterfactualWallet({ wallet }) + const res3 = await tracker2.imageHashOfCounterfactualWallet({ wallet }) + + expect(res1).to.deep.equal({ imageHash, context }) + expect(res2).to.deep.equal({ imageHash, context }) + expect(res3).to.deep.equal({ imageHash, context }) + }) + }) + + describe('Chained configurations', () => { + let context: commons.context.WalletContext + + before(async () => { + context = await utils.context.deploySequenceContexts(provider.getSigner(0)).then(c => c[2]) + }) + + it('Should store chained config in both', async () => { + const signer = ethers.Wallet.createRandom() + const config = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer.address, weight: 1 } } + const imageHash = v2.config.imageHash(config) + const address = commons.context.addressOf(context, imageHash) + const wallet = new Wallet({ + config, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + + const nextConfig = utils.configs.random.genRandomV2Config() + const nextImageHash = v2.config.imageHash(nextConfig) + + const digest = v2.chained.hashSetImageHash(nextImageHash) + const signature = await wallet.signDigest(digest) + + await combined.saveWalletConfig({ config }) + await combined.saveWalletConfig({ config: nextConfig }) + await combined.savePresignedConfiguration({ wallet: address, nextConfig, signature }) + + const res2 = await tracker1.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + const res3 = await tracker2.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + const res1 = await combined.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + + expect(res1.length).to.equal(1) + expect(res1[0].nextImageHash).to.equal(nextImageHash) + expect(res1[0].wallet).to.equal(wallet.address) + expect(res1[0].signature).to.equal(signature) + + expect(res2.length).to.equal(1) + expect(res2[0].nextImageHash).to.equal(nextImageHash) + expect(res2[0].wallet).to.equal(wallet.address) + expect(res2[0].signature).to.equal(signature) + + expect(res3.length).to.equal(1) + expect(res3[0].nextImageHash).to.equal(nextImageHash) + expect(res3[0].wallet).to.equal(wallet.address) + expect(res3[0].signature).to.equal(signature) + }) + + it('Should mirror chained config from tracker2', async () => { + const signer = ethers.Wallet.createRandom() + const config = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer.address, weight: 1 } } + const imageHash = v2.config.imageHash(config) + const address = commons.context.addressOf(context, imageHash) + const wallet = new Wallet({ + config, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + + const nextConfig = utils.configs.random.genRandomV2Config() + const nextImageHash = v2.config.imageHash(nextConfig) + + const digest = v2.chained.hashSetImageHash(nextImageHash) + const signature = await wallet.signDigest(digest) + + await tracker2.saveWalletConfig({ config }) + await tracker2.saveWalletConfig({ config: nextConfig }) + await tracker2.savePresignedConfiguration({ wallet: address, nextConfig, signature }) + + const res1 = await combined.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + + await wait(500) + + const res2 = await tracker1.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + const res3 = await tracker2.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + + expect(res1.length).to.equal(1) + expect(res1[0].nextImageHash).to.equal(nextImageHash) + expect(res1[0].wallet).to.equal(wallet.address) + expect(res1[0].signature).to.equal(signature) + + expect(res2.length).to.equal(1) + expect(res2[0].nextImageHash).to.equal(nextImageHash) + expect(res2[0].wallet).to.equal(wallet.address) + expect(res2[0].signature).to.equal(signature) + + expect(res3.length).to.equal(1) + expect(res3[0].nextImageHash).to.equal(nextImageHash) + expect(res3[0].wallet).to.equal(wallet.address) + expect(res3[0].signature).to.equal(signature) + }) + + it('Should return highest checkpoint chain (and then mirror)', async () => { + // Step 1 + const signer = ethers.Wallet.createRandom() + const config = { version: 2, threshold: 1, checkpoint: 0, tree: { address: signer.address, weight: 1 } } + const imageHash = v2.config.imageHash(config) + + const address = commons.context.addressOf(context, imageHash) + const wallet1 = new Wallet({ + config, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer]) + }) + + const signer2a = ethers.Wallet.createRandom() + const signer2b = ethers.Wallet.createRandom() + const nextConfig1 = { + version: 2, + threshold: 6, + checkpoint: 2, + tree: { + right: { + address: signer2a.address, + weight: 3 + }, + left: { + address: signer2b.address, + weight: 3 + } + } + } + + const nextImageHash1 = v2.config.imageHash(nextConfig1) + + const digest1 = v2.chained.hashSetImageHash(nextImageHash1) + const signature1 = await wallet1.signDigest(digest1) + + // Step 2 + const nextConfig2 = { ...utils.configs.random.genRandomV2Config(), checkpoint: 3 } + const nextImageHash2 = v2.config.imageHash(nextConfig2) + + const digest2 = v2.chained.hashSetImageHash(nextImageHash2) + const wallet2 = new Wallet({ + config: nextConfig1, + chainId: 0, + coders: v2.coders, + address, + context, + orchestrator: new Orchestrator([signer2a, signer2b]) + }) + + const signature2 = await wallet2.signDigest(digest2) + + // Saving only signature1 on tracker 1 + await tracker1.saveWalletConfig({ config }) + await tracker1.saveWalletConfig({ config: nextConfig1 }) + await tracker1.savePresignedConfiguration({ + wallet: address, + nextConfig: nextConfig1, + signature: signature1 + }) + + // Saving both signatures on tracker 2 + await tracker2.saveWalletConfig({ config }) + await tracker2.saveWalletConfig({ config: nextConfig1 }) + await tracker2.saveWalletConfig({ config: nextConfig2 }) + await tracker2.savePresignedConfiguration({ + wallet: address, + nextConfig: nextConfig1, + signature: signature1 + }) + await tracker2.savePresignedConfiguration({ + wallet: address, + nextConfig: nextConfig2, + signature: signature2 + }) + + // Now the combined tracker should return the highest checkpoint + const res1 = await combined.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + + await wait(500) + + const res2 = await tracker1.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + const res3 = await tracker2.loadPresignedConfiguration({ wallet: address, fromImageHash: imageHash }) + + expect(res1.length).to.equal(2) + expect(res1[0].wallet).to.equal(address) + expect(res1[1].wallet).to.equal(address) + expect(res1[0].nextImageHash).to.equal(nextImageHash1) + expect(res1[1].nextImageHash).to.equal(nextImageHash2) + expect(res1[0].signature).to.equal(signature1) + expect(res1[1].signature).to.equal(signature2) + + expect(res2).to.deep.equal(res1) + expect(res3).to.deep.equal(res1) + }) + }) + }) +}) + +function normalize(value: any): any { + switch (typeof value) { + case 'object': + if (ethers.BigNumber.isBigNumber(value)) { + return value.toString() + } + return Object.fromEntries(Object.entries(value).map(([key, value]) => [key, normalize(value)])) + case 'number': + return `${value}` + default: + return value + } +} diff --git a/packages/signhub/src/index.ts b/packages/signhub/src/index.ts new file mode 100644 index 000000000..22f52a644 --- /dev/null +++ b/packages/signhub/src/index.ts @@ -0,0 +1,2 @@ +export * as signers from './signers' +export * from './orchestrator' diff --git a/packages/signhub/src/orchestrator.ts b/packages/signhub/src/orchestrator.ts new file mode 100644 index 000000000..49bf5747b --- /dev/null +++ b/packages/signhub/src/orchestrator.ts @@ -0,0 +1,218 @@ +import { ethers } from 'ethers' +import { commons } from '@0xsequence/core' +import { isSapientSigner, SapientSigner } from './signers/signer' +import { SignerWrapper } from './signers/wrapper' + +export type Status = { + ended: boolean + message: ethers.BytesLike + signers: { [signer: string]: SignerStatus } +} + +export enum SignerState { + INITIAL, + SIGNING, + SIGNED, + ERROR +} + +export type SignerStatus = + | { state: SignerState.INITIAL } + | { state: SignerState.SIGNING; request: Promise } + | { state: SignerState.SIGNED; signature: ethers.BytesLike; suffix: ethers.BytesLike } + | { state: SignerState.ERROR; error: any } + +export function isSignerStatusPending( + status?: SignerStatus +): status is undefined | { state: SignerState.INITIAL } | { state: SignerState.SIGNING; request: Promise } { + return status === undefined || status.state === SignerState.INITIAL || status.state === SignerState.SIGNING +} + +export interface SignatureOrchestrator { + getSigners(): Promise + + signMessage(args: { + candidates: string[] + message: ethers.BytesLike + metadata: object + callback: (status: Status, onNewMetadata: (metadata: object) => void) => boolean + }): Promise + + buildDeployTransaction(metadata: object): Promise + + predecorateSignedTransactions(metadata?: object): Promise + + decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata?: object + ): Promise +} + +/** + * Orchestrates actions of collective signers. + * This includes the signing of a single digests and transactions by multiple signers. + * It can provide internal visibility of the signing process, and it also + * provides the internal signers with additional information about the + * message being signed. Transaction decoration can be used to ensure on-chain state + * is correctly managed during the signing process. + */ +export class Orchestrator { + private observers: ((status: Status, metadata: object) => void)[] = [] + private signers: SapientSigner[] = [] + + private count = 0 + + constructor( + signers: (ethers.Signer | SapientSigner)[], + public tag: string = Orchestrator.randomTag() + ) { + this.setSigners(signers) + } + + private static randomTag(): string { + return `default-${ethers.utils.hexlify(ethers.utils.randomBytes(8)).slice(2)}` + } + + private pullId(): string { + return `${this.tag}-${this.count++}` + } + + setSigners(signers: (ethers.Signer | SapientSigner)[]) { + this.signers = signers.map(s => (isSapientSigner(s) ? s : new SignerWrapper(s))) + } + + async getSigners(): Promise { + return Promise.all(this.signers.map(async s => s.getAddress())) + } + + subscribe(observer: (status: Status, metadata: object) => void): () => void { + this.observers.push(observer) + return () => { + this.observers = this.observers.filter(o => o !== observer) + } + } + + private async notifyObservers(id: string, status: Status, metadata: object) { + await Promise.all([ + ...this.signers.map(async signer => signer.notifyStatusChange(id, status, metadata)), + ...this.observers.map(async observer => observer(status, metadata)) + ]) + } + + async buildDeployTransaction(metadata: object): Promise { + let bundle: commons.transaction.TransactionBundle | undefined + for (const signer of this.signers) { + const newBundle = await signer.buildDeployTransaction(metadata) + if (bundle === undefined) { + // Use first bundle as base + bundle = newBundle + } else if (newBundle?.transactions) { + // Combine deploy transactions + bundle.transactions = newBundle.transactions.concat(bundle.transactions) + } + } + return bundle + } + + async predecorateSignedTransactions(metadata?: object): Promise { + const output: commons.transaction.SignedTransactionBundle[] = [] + for (const signer of this.signers) { + output.push(...(await signer.predecorateSignedTransactions(metadata ?? {}))) + } + return output + } + + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata?: object + ): Promise { + for (const signer of this.signers) { + bundle = await signer.decorateTransactions(bundle, metadata ?? {}) + } + return bundle + } + + signMessage(args: { + candidates?: string[] + message: ethers.BytesLike + metadata?: object + callback?: (status: Status, onNewMetadata: (metadata: object) => void) => boolean + }): Promise { + const id = this.pullId() + + return new Promise(async resolve => { + const { message, metadata, callback, candidates } = args + const status: Status = { ended: false, message, signers: {} } + let lastMetadata = metadata ?? {} + + const onNewMetadata = (newMetadata: object) => { + lastMetadata = newMetadata + this.notifyObservers(id, status, lastMetadata) + } + + const onStatusUpdate = () => { + try { + this.notifyObservers(id, status, lastMetadata) + + const pending = Object.entries(status.signers).filter(([_, s]) => isSignerStatusPending(s)) + if ((callback && callback(status, onNewMetadata)) || pending.length === 0) { + status.ended = true + resolve(status) + this.notifyObservers(id, status, lastMetadata) + return + } + } catch (e) { + console.error('Error while notifying observers', e) + } + } + + // we only call signers that are found in `candidates` + // if `candidates` is undefined, we call all signers + let signers = this.signers + if (candidates) { + const addresses = await Promise.all(this.signers.map(async s => s.getAddress())) + signers = this.signers.filter((_, i) => candidates.includes(addresses[i])) + } + + // build callbacks object + const accepted = await Promise.allSettled( + signers.map(async s => { + const saddr = await s.getAddress() + + status.signers[saddr] = { + state: SignerState.SIGNING, + request: s + .sign(message, metadata ?? {}) + .then(signature => { + const suffix = s.suffix() + status.signers[saddr] = { state: SignerState.SIGNED, signature, suffix } + onStatusUpdate() + return signature + }) + .catch(error => { + status.signers[saddr] = { state: SignerState.ERROR, error } + onStatusUpdate() + throw error + }) + } + }) + ) + + for (let i = 0; i < accepted.length; i++) { + const signer = this.signers[i] + const promise = accepted[i] + + if (promise.status === 'rejected') { + const address = await signer.getAddress() + console.warn(`signer ${address} rejected the request: ${promise.reason}`) + status.signers[address] = { + state: SignerState.ERROR, + error: new Error(`signer ${address} rejected the request: ${promise.reason}`) + } + } + } + + onStatusUpdate() + }) + } +} diff --git a/packages/signhub/src/signers/index.ts b/packages/signhub/src/signers/index.ts new file mode 100644 index 000000000..2ea68121a --- /dev/null +++ b/packages/signhub/src/signers/index.ts @@ -0,0 +1,2 @@ +export * from './signer' +export * from './wrapper' diff --git a/packages/signhub/src/signers/signer.ts b/packages/signhub/src/signers/signer.ts new file mode 100644 index 000000000..7bf3fec54 --- /dev/null +++ b/packages/signhub/src/signers/signer.ts @@ -0,0 +1,45 @@ +import { ethers } from 'ethers' +import { commons } from '@0xsequence/core' +import { Status } from '../orchestrator' + +export interface SapientSigner { + getAddress(): Promise + + buildDeployTransaction(metadata: object): Promise + + /** + * Get signed transactions to be included in the next request. + */ + predecorateSignedTransactions(metadata: object): Promise + + /** + * Modify the transaction bundle before it is sent. + */ + decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise + + /** + * Request a signature from the signer. + */ + sign(message: ethers.BytesLike, metadata: object): Promise + + /** + * Notify the signer of a status change. + */ + notifyStatusChange(id: string, status: Status, metadata: object): void + + suffix(): ethers.BytesLike +} + +export function isSapientSigner(signer: ethers.Signer | SapientSigner): signer is SapientSigner { + return ( + (signer as SapientSigner).getAddress !== undefined && + (signer as SapientSigner).buildDeployTransaction !== undefined && + (signer as SapientSigner).predecorateSignedTransactions !== undefined && + (signer as SapientSigner).decorateTransactions !== undefined && + (signer as SapientSigner).sign !== undefined && + (signer as SapientSigner).notifyStatusChange !== undefined + ) +} diff --git a/packages/signhub/src/signers/wrapper.ts b/packages/signhub/src/signers/wrapper.ts new file mode 100644 index 000000000..bbd2b4e80 --- /dev/null +++ b/packages/signhub/src/signers/wrapper.ts @@ -0,0 +1,41 @@ +import { ethers } from 'ethers' +import { commons } from '@0xsequence/core' +import { Status } from '../orchestrator' +import { SapientSigner } from './signer' + +export class SignerWrapper implements SapientSigner { + constructor( + public signer: ethers.Signer, + public eoa: boolean = true + ) {} + + getAddress(): Promise { + return this.signer.getAddress() + } + + async buildDeployTransaction(_metadata: object): Promise { + // Wrapped signers don't require deployment + return + } + + async predecorateSignedTransactions(_metadata: object): Promise { + return [] + } + + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + _metadata: object + ): Promise { + return bundle + } + + sign(message: ethers.utils.BytesLike, metadata: object): Promise { + return this.signer.signMessage(message) + } + + notifyStatusChange(_i: string, _s: Status, _m: object): void {} + + suffix(): ethers.BytesLike { + return [2] + } +} diff --git a/packages/signhub/tests/orchestrator.spec.ts b/packages/signhub/tests/orchestrator.spec.ts new file mode 100644 index 000000000..1b4fad943 --- /dev/null +++ b/packages/signhub/tests/orchestrator.spec.ts @@ -0,0 +1,551 @@ +import * as chai from 'chai' +import { ethers } from 'ethers' +import { commons } from '@0xsequence/core' +import { isSignerStatusPending, Orchestrator, SignerState, Status } from '../src' +import { SapientSigner } from '../src/signers' + +const { expect } = chai + +describe('Orchestrator', () => { + describe('signMessage', () => { + it('Should call all signers', async () => { + const signers = [ethers.Wallet.createRandom(), ethers.Wallet.createRandom(), ethers.Wallet.createRandom()] + + const orchestrator = new Orchestrator(signers) + const signature = await orchestrator.signMessage({ message: '0x1234' }) + + expect(Object.keys(signature.signers)).to.have.lengthOf(signers.length) + + for (const signer of signers) { + expect(signature.signers).to.have.property(signer.address) + } + }) + + it('Should call callback with status updates', async () => { + const signers = [ethers.Wallet.createRandom(), ethers.Wallet.createRandom(), ethers.Wallet.createRandom()] + + const orchestrator = new Orchestrator(signers) + + let callbackCallsA = 0 + orchestrator.subscribe((status, metadata) => { + // Status should have all signers + let numErrors = 0 + let numSignatures = 0 + let numPending = 0 + expect(Object.keys(status.signers)).to.have.lengthOf(signers.length, 'Should have all signers') + for (const signer of signers) { + expect(status.signers).to.have.property(signer.address) + const signerStatus = status.signers[signer.address] + + if (signerStatus.state === SignerState.ERROR) { + numErrors++ + } + + if (isSignerStatusPending(signerStatus)) { + numPending++ + } + + if (signerStatus.state === SignerState.SIGNED) { + numSignatures++ + } + } + + callbackCallsA++ + + expect(numErrors).to.be.equal(0, 'No errors should be present') + expect(numSignatures).to.be.equal(Math.max(callbackCallsA, 3), 'Should have max 3 signatures') + expect(numPending).to.be.equal(Math.min(signers.length - callbackCallsA, 0), 'Should have 0 pending') + }) + + let callbackCallsB = 0 + await orchestrator.signMessage({ + message: '0x1234', + callback: () => { + callbackCallsB++ + return false + } + }) + + // 3 updates + 1 final + expect(callbackCallsA).to.be.equal(4) + + // only the 3 updates + expect(callbackCallsB).to.be.equal(3) + }) + + it('getSigners should return all signers', async () => { + const signers = new Array(10).fill(0).map(() => ethers.Wallet.createRandom()) + const orchestrator = new Orchestrator(signers) + const result = await orchestrator.getSigners() + expect(result).to.have.lengthOf(signers.length) + for (const signer of signers) { + expect(result).to.include(signer.address) + } + }) + + it('setSigners should update the signers', async () => { + const signers = new Array(10).fill(0).map(() => ethers.Wallet.createRandom()) + const orchestrator = new Orchestrator(signers) + + const newSigners = new Array(22).fill(0).map(() => ethers.Wallet.createRandom()) + orchestrator.setSigners(newSigners) + const result = await orchestrator.getSigners() + expect(result).to.have.lengthOf(newSigners.length) + for (const signer of newSigners) { + expect(result).to.include(signer.address) + } + }) + + it('exception on signer should be interpreted as error', async () => { + const brokenSignerEOA = ethers.Wallet.createRandom() + const brokenSigner: SapientSigner = { + getAddress: async function (): Promise { + return brokenSignerEOA.address + }, + buildDeployTransaction(metadata) { + throw new Error('This is a broken signer.') + }, + async predecorateSignedTransactions(_metadata: object): Promise { + throw new Error('This is a broken signer.') + }, + decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + throw new Error('This is a broken signer.') + }, + sign(_message, _metadata) { + throw new Error('This is a broken signer.') + }, + notifyStatusChange: function (id: string, status: Status): void {}, + suffix: function () { + return [2] + } + } + + const signers = [ethers.Wallet.createRandom(), brokenSigner, ethers.Wallet.createRandom()] + + const orchestrator = new Orchestrator(signers) + + let callbackCallsA = 0 + orchestrator.subscribe(async status => { + // Status should have all signers + let numErrors = 0 + let numSignatures = 0 + let numPending = 0 + + expect(Object.keys(status.signers)).to.have.lengthOf(signers.length) + + for (const signer of signers) { + expect(status.signers).to.have.property(await signer.getAddress()) + const signerStatus = status.signers[await signer.getAddress()] + + if (signerStatus.state === SignerState.ERROR) { + numErrors++ + } + + if (isSignerStatusPending(signerStatus)) { + numPending++ + } + + if (signerStatus.state === SignerState.SIGNED) { + numSignatures++ + } + } + + callbackCallsA++ + + expect(numErrors).to.be.equal(1) + expect(numSignatures).to.be.equal(2) + expect(numPending).to.be.equal(0) + }) + + const signature = await orchestrator.signMessage({ message: '0x1234' }) + expect(Object.keys(signature.signers)).to.have.lengthOf(2) + + for (const signer of signers) { + const address = await signer.getAddress() + const status = signature.signers[address] + + if (address === (await brokenSigner.getAddress())) { + if (status.state === SignerState.ERROR) { + expect(status.error.message).to.contain('This is a broken signer.') + } else { + expect.fail('Signer should be rejected') + } + } else { + expect(status.state === SignerState.SIGNED).to.be.true + } + } + }) + + it('Should manually reject a request', async () => { + const rejectSignerEOA = ethers.Wallet.createRandom() + const rejectSigner: SapientSigner = { + getAddress: async function (): Promise { + return rejectSignerEOA.address + }, + buildDeployTransaction(metadata) { + throw new Error('This is a reject signer.') + }, + async predecorateSignedTransactions(_metadata: object): Promise { + throw new Error('This is a reject signer.') + }, + decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + throw new Error('This is a rejected signer.') + }, + async sign(_message, _metadata) { + throw new Error('This is a rejected signer.') + }, + notifyStatusChange: function (id: string, status: Status): void {}, + suffix: function () { + return [2] + } + } + + const signers = [ethers.Wallet.createRandom(), rejectSigner] + + const orchestrator = new Orchestrator(signers) + + let callbackCallsA = 0 + orchestrator.subscribe(() => { + callbackCallsA++ + }) + + const signature = await orchestrator.signMessage({ message: '0x1234' }) + expect(Object.keys(signature.signers)).to.have.lengthOf(signers.length) + + for (const signer of signers) { + const address = await signer.getAddress() + const status = signature.signers[address] + + if (address === (await rejectSigner.getAddress())) { + if (status.state === SignerState.ERROR) { + expect(status.error.message).to.contain('This is a rejected signer.') + } else { + expect.fail('Signer should be rejected') + } + } else { + expect(status.state === SignerState.SIGNED).to.be.true + } + } + }) + + it('Should pass the correct message to the signer', async () => { + const ogMessage = ethers.utils.randomBytes(99) + const signer: SapientSigner = { + getAddress: async function (): Promise { + return '0x1234' + }, + buildDeployTransaction(metadata) { + return Promise.resolve(undefined) + }, + predecorateSignedTransactions(_metadata: object): Promise { + return Promise.resolve([]) + }, + decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + return Promise.resolve(bundle) + }, + async sign(message, _metadata) { + expect(message).to.be.equal(ogMessage) + return '0x5678' + }, + notifyStatusChange: function (id: string, status: Status): void {}, + suffix: function () { + return [2] + } + } + + const orchestrator = new Orchestrator([signer]) + const signature = await orchestrator.signMessage({ message: ogMessage }) + + expect((signature.signers['0x1234'] as any).signature).to.be.equal('0x5678') + }) + + it('Should pass metadata to signer', async () => { + const ogMessage = ethers.utils.randomBytes(99) + const signer: SapientSigner = { + getAddress: async function (): Promise { + return '0x1234' + }, + buildDeployTransaction(metadata) { + return Promise.resolve(undefined) + }, + predecorateSignedTransactions(_metadata: object): Promise { + return Promise.resolve([]) + }, + decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + return Promise.resolve(bundle) + }, + async sign(_message, metadata) { + expect(metadata).to.be.deep.equal({ test: 'test' }) + return '0x5678' + }, + notifyStatusChange: function (id: string, status: Status): void {}, + suffix: function () { + return [2] + } + } + + const orchestrator = new Orchestrator([signer]) + const signature = await orchestrator.signMessage({ message: ogMessage, metadata: { test: 'test' } }) + + expect((signature.signers['0x1234'] as any).signature).to.be.equal('0x5678') + }) + + it('Should pass updated metadata to signer', async () => { + const ogMessage = ethers.utils.randomBytes(99) + + let firstCall = true + let errorOnNotify: any = undefined + + const signer1: SapientSigner = { + getAddress: async function (): Promise { + return '0x1234' + }, + buildDeployTransaction(metadata) { + return Promise.resolve(undefined) + }, + predecorateSignedTransactions(_metadata: object): Promise { + return Promise.resolve([]) + }, + decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + return Promise.resolve(bundle) + }, + async sign(_message, metadata) { + expect(metadata).to.be.deep.equal({ test: 'test' }) + return '0x5678' + }, + notifyStatusChange: function (id: string, status: Status, metadata: object): void { + try { + if (firstCall) { + expect(metadata).to.be.deep.equal({ test: 'test' }) + } else { + expect(metadata).to.be.deep.equal({ hello: 'world' }) + } + } catch (e) { + errorOnNotify = e + } + }, + suffix: function () { + return [2] + } + } + + const signer2: SapientSigner = { + getAddress: async function (): Promise { + return '0x5678' + }, + buildDeployTransaction(metadata) { + return Promise.resolve(undefined) + }, + predecorateSignedTransactions(_metadata: object): Promise { + return Promise.resolve([]) + }, + decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + return Promise.resolve(bundle) + }, + async sign(_message, metadata) { + expect(metadata).to.be.deep.equal({ test: 'test' }) + return '0x9012' + }, + notifyStatusChange: function (id: string, status: Status, metadata: object): void { + try { + if (firstCall) { + expect(metadata).to.be.deep.equal({ test: 'test' }) + } else { + expect(metadata).to.be.deep.equal({ hello: 'world' }) + } + } catch (e) { + errorOnNotify = e + } + }, + suffix: function () { + return [2] + } + } + + const orchestrator = new Orchestrator([signer1, signer2]) + const signature = await orchestrator.signMessage({ + message: ogMessage, + metadata: { test: 'test' }, + callback: (s: Status, onNewMetadata: (metadata: object) => void) => { + if (firstCall) { + firstCall = false + onNewMetadata({ hello: 'world' }) + return false + } + + return true + } + }) + + expect((signature.signers['0x1234'] as any).signature).to.be.equal('0x5678') + expect((signature.signers['0x5678'] as any).signature).to.be.equal('0x9012') + if (errorOnNotify) throw errorOnNotify + }) + + it('Should auto-generate random tag', () => { + const orchestrator1 = new Orchestrator([]) + const orchestrator2 = new Orchestrator([]) + + expect(orchestrator1.tag).to.not.be.equal(orchestrator2.tag) + }) + + it('Should only sign with candidates', async () => { + const message = ethers.utils.randomBytes(99) + + const signer1 = ethers.Wallet.createRandom() + const signer2 = ethers.Wallet.createRandom() + const signer3 = ethers.Wallet.createRandom() + const signer4 = ethers.Wallet.createRandom() + + const orchestrator = new Orchestrator([signer1, signer2, signer3, signer4]) + + const result = await orchestrator.signMessage({ + message: message, + candidates: [signer1.address, signer3.address] + }) + + expect(result.signers[signer1.address]).to.not.be.undefined + expect(result.signers[signer2.address]).to.be.undefined + expect(result.signers[signer3.address]).to.not.be.undefined + expect(result.signers[signer4.address]).to.be.undefined + }) + }) + describe('decorateTransactions', () => { + it('Repeatedly decorate a bundle', async () => { + const signer: SapientSigner = { + getAddress: async function (): Promise { + return '0x1' + }, + async buildDeployTransaction(metadata: object) { + return undefined + }, + async predecorateSignedTransactions(_metadata: object): Promise { + return [] + }, + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + // Add a transaction on each call + bundle.transactions.push({ + to: 'to' + }) + return bundle + }, + sign(_message, _metadata) { + throw new Error('unreachable') + }, + notifyStatusChange: function (id: string, status: Status): void {}, + suffix: function () { + return [0] + } + } + + const orchestrator = new Orchestrator([signer, signer, signer]) + const bundle: commons.transaction.IntendedTransactionBundle = { + intent: { + id: '', + wallet: '' + }, + chainId: 0, + transactions: [], + entrypoint: '' + } + + const output = await orchestrator.decorateTransactions(bundle) + + expect(output?.transactions.length).to.be.equal(3) + }) + }) + + describe('buildDeployTransaction', () => { + it('Should create a combined bundle', async () => { + const signer1: SapientSigner = { + getAddress: async function (): Promise { + return '0x1' + }, + async buildDeployTransaction(metadata: object) { + return { + entrypoint: 'entrypoint1', + transactions: [ + { + to: 'to1', + data: 'data1' + } + ] + } + }, + async predecorateSignedTransactions(_metadata: object): Promise { + return [] + }, + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + metadata: object + ): Promise { + return bundle + }, + sign(_message, _metadata) { + throw new Error('unreachable') + }, + notifyStatusChange: function (id: string, status: Status): void {}, + suffix: function () { + return [0] + } + } + const signer2: SapientSigner = { + getAddress: async function (): Promise { + return '0x2' + }, + async buildDeployTransaction(metadata: object) { + return { + entrypoint: 'entrypoint2', + transactions: [ + { + to: 'to2', + data: 'data2' + } + ] + } + }, + async predecorateSignedTransactions(_metadata: object): Promise { + return [] + }, + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle + ): Promise { + return bundle + }, + sign(_message, _metadata) { + throw new Error('unreachable') + }, + notifyStatusChange: function (id: string, status: Status): void {}, + suffix: function () { + return [0] + } + } + + const orchestrator = new Orchestrator([signer1, signer2]) + const bundle = await orchestrator.buildDeployTransaction({}) + + expect(bundle?.transactions.length).to.be.equal(2) + }) + }) +}) diff --git a/packages/simulator/src/geth-call.ts b/packages/simulator/src/geth-call.ts new file mode 100644 index 000000000..0c7206587 --- /dev/null +++ b/packages/simulator/src/geth-call.ts @@ -0,0 +1,90 @@ +import { BigNumber, BigNumberish, BytesLike, utils, providers } from 'ethers' + +export async function gethCall( + provider: providers.JsonRpcProvider, + transaction: providers.TransactionRequest, + block?: providers.BlockTag, + overrides?: Overrides +) { + const formatter = providers.JsonRpcProvider.getFormatter() + + return provider.send('eth_call', [ + formatter.transactionRequest(transaction), + formatter.blockTag(block ?? null), + ...(overrides ? [formatOverrides(overrides)] : []) + ]) +} + +export interface Overrides { + [address: string]: { + balance?: BigNumberish + nonce?: BigNumberish + code?: BytesLike | utils.Hexable | number | bigint + state?: StorageOverrides + stateDiff?: StorageOverrides + } +} + +export interface StorageOverrides { + [hash: string]: string +} + +function formatOverrides(overrides: any): Overrides { + if (typeof overrides !== 'object') { + throw new Error('overrides must be an object') + } + + const formatted: Overrides = {} + + for (const [key, value] of Object.entries(overrides)) { + if (utils.isHexString(key, 20)) { + try { + formatted[key] = providers.Formatter.check(overridesFormat, value) + } catch {} + } + } + + return formatted +} + +const overridesFormat = { + balance: skipNullish(BigNumber.from), + nonce: skipNullish(BigNumber.from), + code: skipNullish(utils.hexlify), + state: skipNullish(formatStorageOverrides), + stateDiff: skipNullish(formatStorageOverrides) +} + +function formatStorageOverrides(overrides: any): StorageOverrides { + if (typeof overrides !== 'object') { + throw new Error('storage overrides must be an object') + } + + const formatted: StorageOverrides = {} + + for (const [key, value] of Object.entries(overrides)) { + if (utils.isHexString(key, 32)) { + try { + const hash = utils.hexlify(value as any) + if (utils.isHexString(hash, 32)) { + formatted[key] = hash + } + } catch {} + } + } + + return formatted +} + +function skipNullish(formatter: (x: X) => Y): (x?: X | null) => Y | undefined { + return x => { + switch (x) { + case null: + case undefined: + return undefined + + default: + return formatter(x) + } + } +} diff --git a/packages/simulator/src/index.ts b/packages/simulator/src/index.ts new file mode 100644 index 000000000..2b76aac76 --- /dev/null +++ b/packages/simulator/src/index.ts @@ -0,0 +1,2 @@ +export * from './geth-call' +export * from './simulate' diff --git a/packages/simulator/src/simulate.ts b/packages/simulator/src/simulate.ts new file mode 100644 index 000000000..e27ba5415 --- /dev/null +++ b/packages/simulator/src/simulate.ts @@ -0,0 +1,28 @@ +import { BigNumber, providers, utils } from 'ethers' +import { gethCall } from './geth-call' +import { commons } from '@0xsequence/core' + +const simulatorArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/modules/MainModuleGasEstimation.sol/MainModuleGasEstimation.json') +const simulatorInterface = new utils.Interface(simulatorArtifact.abi) +const simulatorBytecode = simulatorArtifact.deployedBytecode + +export async function simulate( + provider: providers.JsonRpcProvider, + wallet: string, + transactions: commons.transaction.Transaction[], + block?: providers.BlockTag +): Promise { + const encodedTransactions = commons.transaction.sequenceTxAbiEncode(transactions) + const data = simulatorInterface.encodeFunctionData('simulateExecute', [encodedTransactions]) + const transaction = { to: wallet, data } + const overrides = { [wallet]: { code: simulatorBytecode } } + const result = await gethCall(provider, transaction, block, overrides) + return simulatorInterface.decodeFunctionResult('simulateExecute', result)[0] +} + +export interface Result { + executed: boolean + succeeded: boolean + result: string + gasUsed: BigNumber +} diff --git a/packages/simulator/tests/sequence-simulator.spec.ts b/packages/simulator/tests/sequence-simulator.spec.ts new file mode 100644 index 000000000..875e28c0c --- /dev/null +++ b/packages/simulator/tests/sequence-simulator.spec.ts @@ -0,0 +1,298 @@ +import { CallReceiverMock, HookCallerMock } from '@0xsequence/wallet-contracts' +import { LocalRelayer } from '@0xsequence/relayer' +import { ethers } from 'ethers' +import { configureLogger } from '@0xsequence/utils' + +import chaiAsPromised from 'chai-as-promised' +import * as chai from 'chai' + +const CallReceiverMockArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/mocks/CallReceiverMock.sol/CallReceiverMock.json') + +const { expect } = chai.use(chaiAsPromised) + +configureLogger({ logLevel: 'DEBUG', silence: false }) + +import { SequenceOrchestratorWrapper, Wallet, WalletV2 } from '@0xsequence/wallet' +import { simulate } from '../src' +import { encodeData } from '@0xsequence/wallet/tests/utils' +import { context } from '@0xsequence/tests' +import { commons, v2 } from '@0xsequence/core' +import { Orchestrator } from '@0xsequence/signhub' + +describe('Wallet integration', function () { + let contexts: Awaited> + let provider: ethers.providers.JsonRpcProvider + let signers: ethers.Signer[] + + let relayer: LocalRelayer + let callReceiver: CallReceiverMock + + before(async () => { + const url = 'http://127.0.0.1:10045/' + provider = new ethers.providers.JsonRpcProvider(url) + + signers = new Array(8).fill(0).map((_, i) => provider.getSigner(i)) + + contexts = await context.deploySequenceContexts(signers[0]) + relayer = new LocalRelayer(signers[0]) + + // Deploy call receiver mock + callReceiver = (await new ethers.ContractFactory( + CallReceiverMockArtifact.abi, + CallReceiverMockArtifact.bytecode, + signers[0] + ).deploy({ gasLimit: 1000000 })) as CallReceiverMock + + // Deploy local relayer + relayer = new LocalRelayer({ signer: signers[0] }) + }) + + beforeEach(async () => { + await callReceiver.setRevertFlag(false) + await callReceiver.testCall(0, []) + }) + + describe('estimate gas of transactions', () => { + const options = [ + { + name: 'single signer wallet', + getWallet: async () => { + // const pk = ethers.utils.randomBytes(32) + // const wallet = await Wallet.singleOwner(pk, context) + // return wallet.connect(ethnode.provider, relayer) + const signer = ethers.Wallet.createRandom() + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ weight: 1, address: signer.address }] + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator([signer]), + chainId: provider.network.chainId + }) + } + }, + { + name: 'multiple signers wallet', + getWallet: async () => { + const signers = new Array(4).fill(0).map(() => ethers.Wallet.createRandom()) + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 3, + checkpoint: 0, + signers: signers.map(s => ({ weight: 1, address: s.address })) + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator(signers.slice(0, 3)), + chainId: provider.network.chainId + }) + } + }, + { + name: 'many multiple signers wallet', + getWallet: async () => { + const signers = new Array(111).fill(0).map(() => ethers.Wallet.createRandom()) + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 77, + checkpoint: 0, + signers: signers.map(s => ({ weight: 1, address: s.address })) + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator(signers.slice(0, 77)), + chainId: provider.network.chainId + }) + } + }, + { + name: 'nested wallet', + getWallet: async () => { + const EOASigners = new Array(3).fill(0).map(() => ethers.Wallet.createRandom()) + const nestedSigners = await Promise.all( + new Array(2).fill(0).map(async () => { + const signers = new Array(3).fill(0).map(() => ethers.Wallet.createRandom()) + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 2, + checkpoint: 0, + signers: signers.map(s => ({ weight: 1, address: s.address })) + }) + + const wallet = Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator(signers.slice(0, 2)), + chainId: provider.network.chainId + }) + + await wallet.deploy() + + return wallet + }) + ) + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 2, + checkpoint: 0, + signers: [ + ...EOASigners.map(s => ({ weight: 1, address: s.address })), + ...nestedSigners.map(s => ({ weight: 1, address: s.address })) + ] + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator([ + ...EOASigners.slice(0, 2), + ...nestedSigners.slice(0, 1).map(s => new SequenceOrchestratorWrapper(s)) + ]), + chainId: provider.network.chainId + }) + } + }, + { + name: 'asymetrical signers wallet', + getWallet: async () => { + const signersA = new Array(5).fill(0).map(() => ethers.Wallet.createRandom()) + const signersB = new Array(6).fill(0).map(() => ethers.Wallet.createRandom()) + + const config = v2.config.ConfigCoder.fromSimple({ + threshold: 5, + checkpoint: 0, + signers: [ + ...signersA.map(s => ({ weight: 1, address: s.address })), + ...signersB.map(s => ({ weight: 10, address: s.address })) + ] + }) + + return Wallet.newWallet({ + context: contexts[2], + coders: v2.coders, + config, + provider, + relayer, + orchestrator: new Orchestrator(signersA), + chainId: provider.network.chainId + }) + } + } + ] + + options.map(o => { + describe(`with ${o.name}`, () => { + let wallet: WalletV2 + + beforeEach(async () => { + wallet = await o.getWallet() + }) + + describe('with deployed wallet', () => { + let txs: commons.transaction.Transaction[] + + beforeEach(async () => { + await callReceiver.testCall(0, []) + await wallet.deploy() + }) + + describe('a single transaction', () => { + beforeEach(async () => { + txs = [ + { + delegateCall: false, + revertOnError: false, + gasLimit: 0, + to: callReceiver.address, + value: ethers.constants.Zero, + data: await encodeData(callReceiver, 'testCall', 14442, '0x112233') + } + ] + }) + + it('should use estimated gas for a single transaction', async () => { + const results = await simulate(provider, wallet.address, txs) + + expect(results).to.have.lengthOf(txs.length) + expect(results.every(result => result.executed)).to.be.true + expect(results.every(result => result.succeeded)).to.be.true + expect(results.every(result => result.gasUsed.gt(0))).to.be.true + }) + + it('should use estimated gas for a single failing transaction', async () => { + await callReceiver.setRevertFlag(true) + + const results = await simulate(provider, wallet.address, txs) + + expect(results).to.have.lengthOf(txs.length) + expect(results.every(result => result.executed)).to.be.true + expect(results.every(result => !result.succeeded)).to.be.true + expect(results.every(result => result.gasUsed.gt(0))).to.be.true + }) + }) + + describe('a batch of transactions', () => { + let valB: Uint8Array + + beforeEach(async () => { + await callReceiver.setRevertFlag(false) + valB = ethers.utils.randomBytes(99) + + txs = [ + { + delegateCall: false, + revertOnError: false, + gasLimit: 0, + to: callReceiver.address, + value: ethers.constants.Zero, + data: await encodeData(callReceiver, 'setRevertFlag', true) + }, + { + delegateCall: false, + revertOnError: false, + gasLimit: 0, + to: callReceiver.address, + value: ethers.constants.Zero, + data: await encodeData(callReceiver, 'testCall', 2, valB) + } + ] + }) + + it('should use estimated gas for a batch of transactions', async () => { + const results = await simulate(provider, wallet.address, txs) + + expect(results).to.have.lengthOf(txs.length) + expect(results[0].executed).to.be.true + expect(results[0].succeeded).to.be.true + expect(results[0].gasUsed.gt(0)).to.be.true + expect(results[1].executed).to.be.true + expect(results[1].succeeded).to.be.false + expect(results[1].gasUsed.gt(0)).to.be.true + }) + }) + }) + }) + }) + }) +}) diff --git a/packages/tests/src/builds/artifact.ts b/packages/tests/src/builds/artifact.ts new file mode 100644 index 000000000..b74bbb512 --- /dev/null +++ b/packages/tests/src/builds/artifact.ts @@ -0,0 +1,9 @@ +import { ethers } from 'ethers' + +export type Artifact = { + contractName: string + sourceName: string + abi: ethers.ContractInterface + bytecode: string + deployedBytecode: string +} diff --git a/packages/tests/src/builds/index.ts b/packages/tests/src/builds/index.ts new file mode 100644 index 000000000..53e4b6eec --- /dev/null +++ b/packages/tests/src/builds/index.ts @@ -0,0 +1,4 @@ +export * as v1 from './v1' +export * as v2 from './v2' + +export * from './artifact' diff --git a/packages/tests/src/builds/v1/artifacts/Factory.ts b/packages/tests/src/builds/v1/artifacts/Factory.ts new file mode 100644 index 000000000..e776e8c41 --- /dev/null +++ b/packages/tests/src/builds/v1/artifacts/Factory.ts @@ -0,0 +1,37 @@ +export const factory = { + _format: 'hh-sol-artifact-1', + contractName: 'Factory', + sourceName: 'contracts/Factory.sol', + abi: [ + { + inputs: [ + { + internalType: 'address', + name: '_mainModule', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_salt', + type: 'bytes32' + } + ], + name: 'deploy', + outputs: [ + { + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b506101c8806100206000396000f3fe60806040526004361061001e5760003560e01c806332c02a1414610023575b600080fd5b61005c6004803603604081101561003957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610085565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60008060405180606001604052806028815260200161016b602891398473ffffffffffffffffffffffffffffffffffffffff166040516020018083805190602001908083835b6020831061010857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100cb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920193845250604080518085038152938201905282519294508693508401905034f594935050505056fe603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3a26469706673582212209b0bce93afab3297b9ebf4e58fa642ef123d74bcbd3bdb4e48b662eb12b430ca64736f6c63430007060033', + deployedBytecode: + '0x60806040526004361061001e5760003560e01c806332c02a1414610023575b600080fd5b61005c6004803603604081101561003957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610085565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60008060405180606001604052806028815260200161016b602891398473ffffffffffffffffffffffffffffffffffffffff166040516020018083805190602001908083835b6020831061010857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100cb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920193845250604080518085038152938201905282519294508693508401905034f594935050505056fe603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3a26469706673582212209b0bce93afab3297b9ebf4e58fa642ef123d74bcbd3bdb4e48b662eb12b430ca64736f6c63430007060033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v1/artifacts/GuestModule.ts b/packages/tests/src/builds/v1/artifacts/GuestModule.ts new file mode 100644 index 000000000..d6bccbbe4 --- /dev/null +++ b/packages/tests/src/builds/v1/artifacts/GuestModule.ts @@ -0,0 +1,295 @@ +export const guestModule = { + _format: 'hh-sol-artifact-1', + contractName: 'GuestModule', + sourceName: 'contracts/modules/GuestModule.sol', + abi: [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + name: 'CreatedContract', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + indexed: false, + internalType: 'uint256', + name: '_newNonce', + type: 'uint256' + } + ], + name: 'NonceChange', + type: 'event' + }, + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + } + ], + name: 'TxExecuted', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'bytes', + name: '_reason', + type: 'bytes' + } + ], + name: 'TxFailed', + type: 'event' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_code', + type: 'bytes' + } + ], + name: 'createContract', + outputs: [ + { + internalType: 'address', + name: 'addr', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'execute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signatures', + type: 'bytes' + } + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_data', + type: 'bytes' + }, + { + internalType: 'bytes', + name: '_signatures', + 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: '_space', + type: 'uint256' + } + ], + name: 'readNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'selfExecute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_interfaceID', + type: 'bytes4' + } + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'pure', + type: 'function' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b50611ddc806100206000396000f3fe60806040526004361061007b5760003560e01c80637a9a16281161004e5780637a9a1628146101255780638c3f55631461014557806390042baf14610172578063affed0e0146101925761007b565b806301ffc9a7146100805780631626ba7e146100b657806320c13b0b146100e357806361c2926c14610103575b600080fd5b34801561008c57600080fd5b506100a061009b366004611677565b6101a7565b6040516100ad91906118be565b60405180910390f35b3480156100c257600080fd5b506100d66100d136600461162d565b6101ba565b6040516100ad91906118eb565b3480156100ef57600080fd5b506100d66100fe3660046116b7565b610233565b34801561010f57600080fd5b5061012361011e366004611590565b61028d565b005b34801561013157600080fd5b506101236101403660046115c3565b6102ce565b34801561015157600080fd5b50610165610160366004611753565b6102f6565b6040516100ad91906118c9565b610185610180366004611720565b610322565b6040516100ad919061189d565b34801561019e57600080fd5b506101656103d6565b60006101b2826103e7565b90505b919050565b60006102046101c885610444565b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506104a492505050565b1561022c57507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061025d6101c88686604051808383808284376040519201829003909120935061044492505050565b1561028557507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b60006102be826040516020016102a39190611a19565b60405160208183030381529060405280519060200120610444565b90506102ca818361069c565b5050565b60006102e4846040516020016102a39190611975565b90506102f0818561069c565b50505050565b60006101b27f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610817565b600033301461037c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611d806027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006103e260006102f6565b905090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf00000000000000000000000000000000000000000000000000000000141561043b575060016101b5565b6101b282610844565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b60008060006104b2846108a1565b909250905061ffff821660005b855183101561067957600080806104d6898761090f565b975060ff918216945016915060018314156104fe576104f58987610990565b96509050610622565b8261052a57606061050f8a88610a08565b9750905061051d8b82610ab9565b9150828501945050610622565b60028314156105d15761053d8987610990565b96509050600061054d8a88610e43565b975061ffff16905060606105628b8984610eb4565b985090506105718c8483610fa3565b6105c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c0b6032913960400191505060405180910390fd5b505092810192610622565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180611b28602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012094505050506104bf565b8361ffff1681101580156106915750610691826111eb565b979650505050505050565b60005b81518110156108125760008282815181106106b657fe5b6020026020010151905060006060826000015115610709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610700906119bc565b60405180910390fd5b82604001515a1015610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070090611918565b826060015173ffffffffffffffffffffffffffffffffffffffff168360800151846040015160001461077d57846040015161077f565b5a5b908560a001516040516107929190611881565b600060405180830381858888f193505050503d80600081146107d0576040519150601f19603f3d011682016040523d82523d6000602084013e6107d5565b606091505b50909250905081156107fc57856040516107ef91906118c9565b60405180910390a0610807565b6108078387836111f1565b50505060010161069f565b505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415610898575060016101b5565b6101b282611241565b6020810151815160f09190911c9060029081111561090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611b776027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161092f57fe5b8451811115610989576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611cdb6026913960400191505060405180910390fd5b9250925092565b8082016020015160601c601482018281116109a757fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611b546023913960400191505060405180910390fd5b9250929050565b604080516042808252608082019092526060916000919060208201818036833701905050915082840160200180516020840152602081015160408401526022810151604284015250604283019050828111610a5f57fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611c7c6023913960400191505060405180910390fd5b60008151604214610b15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180611aee603a913960400191505060405180910390fd5b600082600184510381518110610b2757fe5b602001015160f81c60f81b60f81c60ff169050600083604081518110610b4957fe5b016020015160f81c90506000610b5f85826112c9565b90506000610b6e8660206112c9565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115610be9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611ab1603d913960400191505060405180910390fd5b8260ff16601b14158015610c0157508260ff16601c14155b15610c57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611b9e603d913960400191505060405180910390fd5b6001841415610ccb5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610cba573d6000803e3d6000fd5b505050602060405103519450610dcd565b6002841415610d7c5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610cba573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611c9f603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180611bdb6030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c60028201828111610e5a57fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611d226022913960400191505060405180910390fd5b606060008267ffffffffffffffff81118015610ecf57600080fd5b506040519080825280601f01601f191660200182016040528015610efa576020820181803683370190505b509150838501602001600060205b85811015610f2157908201518482015260208101610f08565b8486016020018051939092015190850152525082820183811015610f4157fe5b8451811115610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611d016021913960400191505060405180910390fd5b935093915050565b60008082600184510381518110610fb657fe5b016020015160f81c90506001811480610fcf5750600281145b15611013578373ffffffffffffffffffffffffffffffffffffffff16610ff58685610ab9565b73ffffffffffffffffffffffffffffffffffffffff161491506111e3565b60038114156111925782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b838110156110cd5781810151838201526020016110b5565b50505050905090810190601f1680156110fa5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e000000000000000000000000000000000000000000000000000000001491506111e3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180611c3d603f913960400191505060405180910390fd5b509392505050565b50600190565b82602001511561120357805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd782826040516112349291906118d2565b60405180910390a1505050565b60007fffffffff00000000000000000000000000000000000000000000000000000000821615806112b357507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b156112c0575060016101b5565b6101b282611331565b60008160200183511015611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611d44603c913960400191505060405180910390fd5b50016020015190565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101b557600080fd5b600082601f8301126113af578081fd5b8135602067ffffffffffffffff808311156113c657fe5b6113d38283850201611a60565b83815282810190868401865b868110156114af578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e0301121561141d57898afd5b604080518281018181108a8211171561143257fe5b825261143f848b016114bd565b815261144c8285016114bd565b8a820152606080850135838301526080925061146983860161137b565b9082015260a08481013583830152928401359289841115611488578c8dfd5b6114968f8c8688010161150d565b90820152875250505092850192908501906001016113df565b509098975050505050505050565b803580151581146101b557600080fd5b60008083601f8401126114de578182fd5b50813567ffffffffffffffff8111156114f5578182fd5b602083019150836020828501011115610a0157600080fd5b600082601f83011261151d578081fd5b813567ffffffffffffffff81111561153157fe5b61156260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611a60565b818152846020838601011115611576578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156115a1578081fd5b813567ffffffffffffffff8111156115b7578182fd5b6102858482850161139f565b6000806000606084860312156115d7578182fd5b833567ffffffffffffffff808211156115ee578384fd5b6115fa8783880161139f565b9450602086013593506040860135915080821115611616578283fd5b506116238682870161150d565b9150509250925092565b600080600060408486031215611641578283fd5b83359250602084013567ffffffffffffffff81111561165e578283fd5b61166a868287016114cd565b9497909650939450505050565b600060208284031215611688578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461022c578182fd5b600080600080604085870312156116cc578081fd5b843567ffffffffffffffff808211156116e3578283fd5b6116ef888389016114cd565b90965094506020870135915080821115611707578283fd5b50611714878288016114cd565b95989497509550505050565b600060208284031215611731578081fd5b813567ffffffffffffffff811115611747578182fd5b6102858482850161150d565b600060208284031215611764578081fd5b5035919050565b60008282518085526020808601955080818302840101818601855b8481101561182a578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805115158452848101511515858501526040808201519085015260608082015173ffffffffffffffffffffffffffffffffffffffff16908501526080808201519085015260a09081015160c09185018290529061181681860183611837565b9a86019a9450505090830190600101611786565b5090979650505050505050565b6000815180845261184f816020860160208601611a84565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251611893818460208701611a84565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526102856040830184611837565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60208082526029908201527f47756573744d6f64756c65235f6578656375746547756573743a204e4f545f4560408201527f4e4f5547485f4741530000000000000000000000000000000000000000000000606082015260800190565b600060408252600660408301527f67756573743a000000000000000000000000000000000000000000000000000060608301526080602083015261022c608083018461176b565b60208082526033908201527f47756573744d6f64756c65235f6578656375746547756573743a2064656c656760408201527f61746543616c6c206e6f7420616c6c6f77656400000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a00000000000000000000000000000000000000000000000000000060608301526080602083015261022c608083018461176b565b60405181810167ffffffffffffffff81118282101715611a7c57fe5b604052919050565b60005b83811015611a9f578181015183820152602001611a87565b838111156102f0575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220f5a1de0b650baa2ee828e8766bc6dbd0c74da0cc4735a143852d24f868e4b62464736f6c63430007060033', + deployedBytecode: + '0x60806040526004361061007b5760003560e01c80637a9a16281161004e5780637a9a1628146101255780638c3f55631461014557806390042baf14610172578063affed0e0146101925761007b565b806301ffc9a7146100805780631626ba7e146100b657806320c13b0b146100e357806361c2926c14610103575b600080fd5b34801561008c57600080fd5b506100a061009b366004611677565b6101a7565b6040516100ad91906118be565b60405180910390f35b3480156100c257600080fd5b506100d66100d136600461162d565b6101ba565b6040516100ad91906118eb565b3480156100ef57600080fd5b506100d66100fe3660046116b7565b610233565b34801561010f57600080fd5b5061012361011e366004611590565b61028d565b005b34801561013157600080fd5b506101236101403660046115c3565b6102ce565b34801561015157600080fd5b50610165610160366004611753565b6102f6565b6040516100ad91906118c9565b610185610180366004611720565b610322565b6040516100ad919061189d565b34801561019e57600080fd5b506101656103d6565b60006101b2826103e7565b90505b919050565b60006102046101c885610444565b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506104a492505050565b1561022c57507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061025d6101c88686604051808383808284376040519201829003909120935061044492505050565b1561028557507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b60006102be826040516020016102a39190611a19565b60405160208183030381529060405280519060200120610444565b90506102ca818361069c565b5050565b60006102e4846040516020016102a39190611975565b90506102f0818561069c565b50505050565b60006101b27f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610817565b600033301461037c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611d806027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006103e260006102f6565b905090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf00000000000000000000000000000000000000000000000000000000141561043b575060016101b5565b6101b282610844565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b60008060006104b2846108a1565b909250905061ffff821660005b855183101561067957600080806104d6898761090f565b975060ff918216945016915060018314156104fe576104f58987610990565b96509050610622565b8261052a57606061050f8a88610a08565b9750905061051d8b82610ab9565b9150828501945050610622565b60028314156105d15761053d8987610990565b96509050600061054d8a88610e43565b975061ffff16905060606105628b8984610eb4565b985090506105718c8483610fa3565b6105c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c0b6032913960400191505060405180910390fd5b505092810192610622565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180611b28602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012094505050506104bf565b8361ffff1681101580156106915750610691826111eb565b979650505050505050565b60005b81518110156108125760008282815181106106b657fe5b6020026020010151905060006060826000015115610709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610700906119bc565b60405180910390fd5b82604001515a1015610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070090611918565b826060015173ffffffffffffffffffffffffffffffffffffffff168360800151846040015160001461077d57846040015161077f565b5a5b908560a001516040516107929190611881565b600060405180830381858888f193505050503d80600081146107d0576040519150601f19603f3d011682016040523d82523d6000602084013e6107d5565b606091505b50909250905081156107fc57856040516107ef91906118c9565b60405180910390a0610807565b6108078387836111f1565b50505060010161069f565b505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415610898575060016101b5565b6101b282611241565b6020810151815160f09190911c9060029081111561090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611b776027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161092f57fe5b8451811115610989576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611cdb6026913960400191505060405180910390fd5b9250925092565b8082016020015160601c601482018281116109a757fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611b546023913960400191505060405180910390fd5b9250929050565b604080516042808252608082019092526060916000919060208201818036833701905050915082840160200180516020840152602081015160408401526022810151604284015250604283019050828111610a5f57fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611c7c6023913960400191505060405180910390fd5b60008151604214610b15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180611aee603a913960400191505060405180910390fd5b600082600184510381518110610b2757fe5b602001015160f81c60f81b60f81c60ff169050600083604081518110610b4957fe5b016020015160f81c90506000610b5f85826112c9565b90506000610b6e8660206112c9565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115610be9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611ab1603d913960400191505060405180910390fd5b8260ff16601b14158015610c0157508260ff16601c14155b15610c57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611b9e603d913960400191505060405180910390fd5b6001841415610ccb5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610cba573d6000803e3d6000fd5b505050602060405103519450610dcd565b6002841415610d7c5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610cba573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611c9f603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180611bdb6030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c60028201828111610e5a57fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611d226022913960400191505060405180910390fd5b606060008267ffffffffffffffff81118015610ecf57600080fd5b506040519080825280601f01601f191660200182016040528015610efa576020820181803683370190505b509150838501602001600060205b85811015610f2157908201518482015260208101610f08565b8486016020018051939092015190850152525082820183811015610f4157fe5b8451811115610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611d016021913960400191505060405180910390fd5b935093915050565b60008082600184510381518110610fb657fe5b016020015160f81c90506001811480610fcf5750600281145b15611013578373ffffffffffffffffffffffffffffffffffffffff16610ff58685610ab9565b73ffffffffffffffffffffffffffffffffffffffff161491506111e3565b60038114156111925782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b838110156110cd5781810151838201526020016110b5565b50505050905090810190601f1680156110fa5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e000000000000000000000000000000000000000000000000000000001491506111e3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180611c3d603f913960400191505060405180910390fd5b509392505050565b50600190565b82602001511561120357805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd782826040516112349291906118d2565b60405180910390a1505050565b60007fffffffff00000000000000000000000000000000000000000000000000000000821615806112b357507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b156112c0575060016101b5565b6101b282611331565b60008160200183511015611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611d44603c913960400191505060405180910390fd5b50016020015190565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101b557600080fd5b600082601f8301126113af578081fd5b8135602067ffffffffffffffff808311156113c657fe5b6113d38283850201611a60565b83815282810190868401865b868110156114af578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e0301121561141d57898afd5b604080518281018181108a8211171561143257fe5b825261143f848b016114bd565b815261144c8285016114bd565b8a820152606080850135838301526080925061146983860161137b565b9082015260a08481013583830152928401359289841115611488578c8dfd5b6114968f8c8688010161150d565b90820152875250505092850192908501906001016113df565b509098975050505050505050565b803580151581146101b557600080fd5b60008083601f8401126114de578182fd5b50813567ffffffffffffffff8111156114f5578182fd5b602083019150836020828501011115610a0157600080fd5b600082601f83011261151d578081fd5b813567ffffffffffffffff81111561153157fe5b61156260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611a60565b818152846020838601011115611576578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156115a1578081fd5b813567ffffffffffffffff8111156115b7578182fd5b6102858482850161139f565b6000806000606084860312156115d7578182fd5b833567ffffffffffffffff808211156115ee578384fd5b6115fa8783880161139f565b9450602086013593506040860135915080821115611616578283fd5b506116238682870161150d565b9150509250925092565b600080600060408486031215611641578283fd5b83359250602084013567ffffffffffffffff81111561165e578283fd5b61166a868287016114cd565b9497909650939450505050565b600060208284031215611688578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461022c578182fd5b600080600080604085870312156116cc578081fd5b843567ffffffffffffffff808211156116e3578283fd5b6116ef888389016114cd565b90965094506020870135915080821115611707578283fd5b50611714878288016114cd565b95989497509550505050565b600060208284031215611731578081fd5b813567ffffffffffffffff811115611747578182fd5b6102858482850161150d565b600060208284031215611764578081fd5b5035919050565b60008282518085526020808601955080818302840101818601855b8481101561182a578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805115158452848101511515858501526040808201519085015260608082015173ffffffffffffffffffffffffffffffffffffffff16908501526080808201519085015260a09081015160c09185018290529061181681860183611837565b9a86019a9450505090830190600101611786565b5090979650505050505050565b6000815180845261184f816020860160208601611a84565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251611893818460208701611a84565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526102856040830184611837565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60208082526029908201527f47756573744d6f64756c65235f6578656375746547756573743a204e4f545f4560408201527f4e4f5547485f4741530000000000000000000000000000000000000000000000606082015260800190565b600060408252600660408301527f67756573743a000000000000000000000000000000000000000000000000000060608301526080602083015261022c608083018461176b565b60208082526033908201527f47756573744d6f64756c65235f6578656375746547756573743a2064656c656760408201527f61746543616c6c206e6f7420616c6c6f77656400000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a00000000000000000000000000000000000000000000000000000060608301526080602083015261022c608083018461176b565b60405181810167ffffffffffffffff81118282101715611a7c57fe5b604052919050565b60005b83811015611a9f578181015183820152602001611a87565b838111156102f0575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220f5a1de0b650baa2ee828e8766bc6dbd0c74da0cc4735a143852d24f868e4b62464736f6c63430007060033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v1/artifacts/MainModule.ts b/packages/tests/src/builds/v1/artifacts/MainModule.ts new file mode 100644 index 000000000..89c3c4dd4 --- /dev/null +++ b/packages/tests/src/builds/v1/artifacts/MainModule.ts @@ -0,0 +1,528 @@ +export const mainModule = { + _format: 'hh-sol-artifact-1', + contractName: 'MainModule', + sourceName: 'contracts/modules/MainModule.sol', + abi: [ + { + inputs: [ + { + internalType: 'address', + name: '_factory', + type: 'address' + } + ], + stateMutability: 'nonpayable', + type: 'constructor' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + name: 'CreatedContract', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'newImplementation', + type: 'address' + } + ], + name: 'ImplementationUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + indexed: false, + internalType: 'uint256', + name: '_newNonce', + type: 'uint256' + } + ], + name: 'NonceChange', + type: 'event' + }, + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + } + ], + name: 'TxExecuted', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'bytes', + name: '_reason', + type: 'bytes' + } + ], + name: 'TxFailed', + type: 'event' + }, + { + stateMutability: 'payable', + type: 'fallback' + }, + { + inputs: [], + name: 'FACTORY', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'INIT_CODE_HASH', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + }, + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'addHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_code', + type: 'bytes' + } + ], + name: 'createContract', + outputs: [ + { + internalType: 'address', + name: 'addr', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + }, + { + internalType: 'uint256', + name: '_nonce', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'execute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signatures', + type: 'bytes' + } + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_data', + type: 'bytes' + }, + { + internalType: 'bytes', + name: '_signatures', + 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: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155BatchReceived', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC721Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'readHook', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + } + ], + name: 'readNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'removeHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'selfExecute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_interfaceID', + type: 'bytes4' + } + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'updateImplementation', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + stateMutability: 'payable', + type: 'receive' + } + ], + bytecode: + '0x60c06040523480156200001157600080fd5b5060405162002d6338038062002d638339810160408190526200003491620000e2565b80600060405180606001604052806028815260200162002d3b60289139306001600160a01b03166040516020018083805190602001908083835b602083106200008f5780518252601f1990920191602091820191016200006e565b51815160209384036101000a60001901801990921691161790529201938452506040805180850381529382019052825192019190912060805250505060601b6001600160601b03191660a0525062000112565b600060208284031215620000f4578081fd5b81516001600160a01b03811681146200010b578182fd5b9392505050565b60805160a05160601c612bf862000143600039806106d55280611baa5250806106b15280611bdb5250612bf86000f3fe6080604052600436106101125760003560e01c80634fcf3eca116100a557806390042baf11610074578063b93ea7ad11610059578063b93ea7ad146103c5578063bc197c81146103e5578063f23a6e611461040557610119565b806390042baf1461039d578063affed0e0146103b057610119565b80634fcf3eca1461031d57806361c2926c1461033d5780637a9a16281461035d5780638c3f55631461037d57610119565b80631a9b2337116100e15780631a9b23371461029957806320c13b0b146102c6578063257671f5146102e65780632dd310001461030857610119565b806301ffc9a7146101f4578063025b22bc1461022a578063150b7a021461024c5780631626ba7e1461027957610119565b3661011957005b60006101486000357fffffffff0000000000000000000000000000000000000000000000000000000016610425565b905073ffffffffffffffffffffffffffffffffffffffff8116156101f1576000808273ffffffffffffffffffffffffffffffffffffffff166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101d2576040519150601f19603f3d011682016040523d82523d6000602084013e6101d7565b606091505b5091509150816101e957805160208201fd5b805160208201f35b50005b34801561020057600080fd5b5061021461020f366004612401565b61047b565b6040516102219190612633565b60405180910390f35b34801561023657600080fd5b5061024a610245366004612166565b610486565b005b34801561025857600080fd5b5061026c610267366004612237565b6105a7565b6040516102219190612660565b34801561028557600080fd5b5061026c6102943660046123b7565b6105d1565b3480156102a557600080fd5b506102b96102b4366004612401565b61064a565b6040516102219190612612565b3480156102d257600080fd5b5061026c6102e136600461244d565b610655565b3480156102f257600080fd5b506102fb6106af565b604051610221919061263e565b34801561031457600080fd5b506102b96106d3565b34801561032957600080fd5b5061024a610338366004612401565b6106f7565b34801561034957600080fd5b5061024a61035836600461231a565b6107d5565b34801561036957600080fd5b5061024a61037836600461234d565b61086e565b34801561038957600080fd5b506102fb6103983660046124e9565b6108ea565b6102b96103ab3660046124b6565b610916565b3480156103bc57600080fd5b506102fb6109ca565b3480156103d157600080fd5b5061024a6103e036600461241b565b6109db565b3480156103f157600080fd5b5061026c610400366004612180565b610ab4565b34801561041157600080fd5b5061026c6104203660046122a4565b610ae1565b60006104737fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610b0c565b90505b919050565b600061047382610b39565b3330146104de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b6104fd8173ffffffffffffffffffffffffffffffffffffffff16610b96565b610552576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180612a826039913960400191505060405180910390fd5b61055b81610b9c565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039181900360200190a150565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b600061061b6105df85610ba0565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c0092505050565b1561064357507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061047382610425565b600061067f6105df86866040518083838082843760405192018290039091209350610ba092505050565b156106a757507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b33301461074f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b600061075a82610425565b73ffffffffffffffffffffffffffffffffffffffff1614156107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806128e0602b913960400191505060405180910390fd5b6107d2816000610df8565b50565b33301461082d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b600061085e82604051602001610843919061277e565b60405160208183030381529060405280519060200120610ba0565b905061086a8183610e5b565b5050565b6108778261102a565b600061088f83856040516020016108439291906127c5565b905061089b8183610c00565b6108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190612721565b60405180910390fd5b6108e48185610e5b565b50505050565b60006104737f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610b0c565b6000333014610970576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006109d660006108ea565b905090565b333014610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b6000610a3e83610425565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806129f4602c913960400191505060405180910390fd5b61086a8282610df8565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf000000000000000000000000000000000000000000000000000000001415610b8d57506001610476565b610473826110ce565b3b151590565b3055565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b6000806000610c0e8461120f565b909250905061ffff821660005b8551831015610dd55760008080610c32898761127d565b975060ff91821694501691506001831415610c5a57610c5189876112fe565b96509050610d7e565b82610c86576060610c6b8a88611376565b97509050610c798b82611427565b9150828501945050610d7e565b6002831415610d2d57610c9989876112fe565b965090506000610ca98a886117b1565b975061ffff1690506060610cbe8b8984611822565b98509050610ccd8c8483611911565b610d22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806129c26032913960400191505060405180910390fd5b505092810192610d7e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806128b4602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019350505050604051602081830303815290604052805190602001209450505050610c1b565b8361ffff168110158015610ded5750610ded82611b59565b979650505050505050565b61086a7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff00000000000000000000000000000000000000000000000000000000841673ffffffffffffffffffffffffffffffffffffffff8416611c37565b60005b8151811015611025576000828281518110610e7557fe5b602002602001015190506000606082604001515a1015610ec1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d1906126c4565b825115610f5957826060015173ffffffffffffffffffffffffffffffffffffffff168360400151600014610ef9578360400151610efb565b5a5b8460a00151604051610f0d91906125f6565b6000604051808303818686f4925050503d8060008114610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b509092509050610fee565b826060015173ffffffffffffffffffffffffffffffffffffffff1683608001518460400151600014610f8f578460400151610f91565b5a5b908560a00151604051610fa491906125f6565b600060405180830381858888f193505050503d8060008114610fe2576040519150601f19603f3d011682016040523d82523d6000602084013e610fe7565b606091505b5090925090505b811561100f5785604051611002919061263e565b60405180910390a061101a565b61101a838783611c65565b505050600101610e5e565b505050565b60008061103683611cb5565b915091506000611045836108ea565b9050808214611080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d19061268d565b6001820161108e8482611cce565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f88184826040516110bf9291906127de565b60405180910390a15050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba5000000000000000000000000000000000000000000000000000000000148061116157507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806111ad57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806111f957507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561120657506001610476565b61047382611cf9565b6020810151815160f09190911c90600290811115611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061292e6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161129d57fe5b84518111156112f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612af76026913960400191505060405180910390fd5b9250925092565b8082016020015160601c6014820182811161131557fe5b835181111561136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061290b6023913960400191505060405180910390fd5b9250929050565b6040805160428082526080820190925260609160009190602082018180368337019050509150828401602001805160208401526020810151604084015260228101516042840152506042830190508281116113cd57fe5b835181111561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612a5f6023913960400191505060405180910390fd5b60008151604214611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061287a603a913960400191505060405180910390fd5b60008260018451038151811061149557fe5b602001015160f81c60f81b60f81c60ff1690506000836040815181106114b757fe5b016020015160f81c905060006114cd8582611d56565b905060006114dc866020611d56565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018061283d603d913960400191505060405180910390fd5b8260ff16601b1415801561156f57508260ff16601c14155b156115c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612955603d913960400191505060405180910390fd5b60018414156116395760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611628573d6000803e3d6000fd5b50505060206040510351945061173b565b60028414156116ea5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611628573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612abb603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166117a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806129926030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c600282018281116117c857fe5b835181111561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612b3e6022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561183d57600080fd5b506040519080825280601f01601f191660200182016040528015611868576020820181803683370190505b509150838501602001600060205b8581101561188f57908201518482015260208101611876565b84860160200180519390920151908501525250828201838110156118af57fe5b8451811115611909576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612b1d6021913960400191505060405180910390fd5b935093915050565b6000808260018451038151811061192457fe5b016020015160f81c9050600181148061193d5750600281145b15611981578373ffffffffffffffffffffffffffffffffffffffff166119638685611427565b73ffffffffffffffffffffffffffffffffffffffff16149150611b51565b6003811415611b005782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b83811015611a3b578181015183820152602001611a23565b50505050905090810190601f168015611a685780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611a8657600080fd5b505afa158015611a9a573d6000803e3d6000fd5b505050506040513d6020811015611ab057600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611b51565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180612a20603f913960400191505060405180910390fd5b509392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021830152603582018490527f0000000000000000000000000000000000000000000000000000000000000000605580840191909152835180840390910181526075909201909252805191012073ffffffffffffffffffffffffffffffffffffffff163014919050565b6040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b826020015115611c7757805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051611ca8929190612647565b60405180910390a1505050565b606081901c916bffffffffffffffffffffffff90911690565b61086a7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e8383611c37565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f025b22bc000000000000000000000000000000000000000000000000000000001415611d4d57506001610476565b61047382611dbe565b60008160200183511015611db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612b60603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415611e1257506001610476565b6104738260007fffffffff0000000000000000000000000000000000000000000000000000000082161580611e8857507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15611e9557506001610476565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610473565b803573ffffffffffffffffffffffffffffffffffffffff8116811461047657600080fd5b600082601f830112611f13578081fd5b8135602067ffffffffffffffff80831115611f2a57fe5b611f3782838502016127ec565b83815282810190868401865b86811015612013578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e03011215611f8157898afd5b604080518281018181108a82111715611f9657fe5b8252611fa3848b01612063565b8152611fb0828501612063565b8a8201526060808501358383015260809250611fcd838601611edf565b9082015260a08481013583830152928401359289841115611fec578c8dfd5b611ffa8f8c868801016120e3565b9082015287525050509285019290850190600101611f43565b509098975050505050505050565b60008083601f840112612032578182fd5b50813567ffffffffffffffff811115612049578182fd5b602083019150836020808302850101111561136f57600080fd5b8035801515811461047657600080fd5b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461047657600080fd5b60008083601f8401126120b4578182fd5b50813567ffffffffffffffff8111156120cb578182fd5b60208301915083602082850101111561136f57600080fd5b600082601f8301126120f3578081fd5b813567ffffffffffffffff81111561210757fe5b61213860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016127ec565b81815284602083860101111561214c578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612177578081fd5b61064382611edf565b60008060008060008060008060a0898b03121561219b578384fd5b6121a489611edf565b97506121b260208a01611edf565b9650604089013567ffffffffffffffff808211156121ce578586fd5b6121da8c838d01612021565b909850965060608b01359150808211156121f2578586fd5b6121fe8c838d01612021565b909650945060808b0135915080821115612216578384fd5b506122238b828c016120a3565b999c989b5096995094979396929594505050565b60008060008060006080868803121561224e578081fd5b61225786611edf565b945061226560208701611edf565b935060408601359250606086013567ffffffffffffffff811115612287578182fd5b612293888289016120a3565b969995985093965092949392505050565b60008060008060008060a087890312156122bc578182fd5b6122c587611edf565b95506122d360208801611edf565b94506040870135935060608701359250608087013567ffffffffffffffff8111156122fc578283fd5b61230889828a016120a3565b979a9699509497509295939492505050565b60006020828403121561232b578081fd5b813567ffffffffffffffff811115612341578182fd5b6106a784828501611f03565b600080600060608486031215612361578283fd5b833567ffffffffffffffff80821115612378578485fd5b61238487838801611f03565b94506020860135935060408601359150808211156123a0578283fd5b506123ad868287016120e3565b9150509250925092565b6000806000604084860312156123cb578283fd5b83359250602084013567ffffffffffffffff8111156123e8578283fd5b6123f4868287016120a3565b9497909650939450505050565b600060208284031215612412578081fd5b61064382612073565b6000806040838503121561242d578182fd5b61243683612073565b915061244460208401611edf565b90509250929050565b60008060008060408587031215612462578182fd5b843567ffffffffffffffff80821115612479578384fd5b612485888389016120a3565b9096509450602087013591508082111561249d578384fd5b506124aa878288016120a3565b95989497509550505050565b6000602082840312156124c7578081fd5b813567ffffffffffffffff8111156124dd578182fd5b6106a7848285016120e3565b6000602082840312156124fa578081fd5b5035919050565b6000815180845260208085018081965082840281019150828601855b8581101561259f5782840389528151805115158552858101511515868601526040808201519086015260608082015173ffffffffffffffffffffffffffffffffffffffff16908601526080808201519086015260a09081015160c09186018290529061258b818701836125ac565b9a87019a955050509084019060010161251d565b5091979650505050505050565b600081518084526125c4816020860160208601612810565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612608818460208701612810565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526106a760408301846125ac565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6020808252601f908201527f4d61696e4d6f64756c65235f617574683a20494e56414c49445f4e4f4e434500604082015260600190565b60208082526024908201527f4d6f64756c6543616c6c73235f657865637574653a204e4f545f454e4f55474860408201527f5f47415300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d6f64756c6543616c6c7323657865637574653a20494e56414c49445f53494760408201527f4e41545552450000000000000000000000000000000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a0000000000000000000000000000000000000000000000000000006060830152608060208301526106436080830184612501565b6000838252604060208301526106a76040830184612501565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561280857fe5b604052919050565b60005b8381101561282b578181015183820152602001612813565b838111156108e4575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474d6f64756c65486f6f6b732372656d6f7665486f6f6b3a20484f4f4b5f4e4f545f524547495354455245444c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552454d6f64756c65486f6f6b7323616464486f6f6b3a20484f4f4b5f414c52454144595f524547495354455245445369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44534d6f64756c6555706461746523757064617465496d706c656d656e746174696f6e3a20494e56414c49445f494d504c454d454e544154494f4e5369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220b34deca9dd75815e4ef8a9279e45750ec5554b22c673e160bdba849d80f5888564736f6c63430007060033603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3', + deployedBytecode: + '0x6080604052600436106101125760003560e01c80634fcf3eca116100a557806390042baf11610074578063b93ea7ad11610059578063b93ea7ad146103c5578063bc197c81146103e5578063f23a6e611461040557610119565b806390042baf1461039d578063affed0e0146103b057610119565b80634fcf3eca1461031d57806361c2926c1461033d5780637a9a16281461035d5780638c3f55631461037d57610119565b80631a9b2337116100e15780631a9b23371461029957806320c13b0b146102c6578063257671f5146102e65780632dd310001461030857610119565b806301ffc9a7146101f4578063025b22bc1461022a578063150b7a021461024c5780631626ba7e1461027957610119565b3661011957005b60006101486000357fffffffff0000000000000000000000000000000000000000000000000000000016610425565b905073ffffffffffffffffffffffffffffffffffffffff8116156101f1576000808273ffffffffffffffffffffffffffffffffffffffff166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101d2576040519150601f19603f3d011682016040523d82523d6000602084013e6101d7565b606091505b5091509150816101e957805160208201fd5b805160208201f35b50005b34801561020057600080fd5b5061021461020f366004612401565b61047b565b6040516102219190612633565b60405180910390f35b34801561023657600080fd5b5061024a610245366004612166565b610486565b005b34801561025857600080fd5b5061026c610267366004612237565b6105a7565b6040516102219190612660565b34801561028557600080fd5b5061026c6102943660046123b7565b6105d1565b3480156102a557600080fd5b506102b96102b4366004612401565b61064a565b6040516102219190612612565b3480156102d257600080fd5b5061026c6102e136600461244d565b610655565b3480156102f257600080fd5b506102fb6106af565b604051610221919061263e565b34801561031457600080fd5b506102b96106d3565b34801561032957600080fd5b5061024a610338366004612401565b6106f7565b34801561034957600080fd5b5061024a61035836600461231a565b6107d5565b34801561036957600080fd5b5061024a61037836600461234d565b61086e565b34801561038957600080fd5b506102fb6103983660046124e9565b6108ea565b6102b96103ab3660046124b6565b610916565b3480156103bc57600080fd5b506102fb6109ca565b3480156103d157600080fd5b5061024a6103e036600461241b565b6109db565b3480156103f157600080fd5b5061026c610400366004612180565b610ab4565b34801561041157600080fd5b5061026c6104203660046122a4565b610ae1565b60006104737fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610b0c565b90505b919050565b600061047382610b39565b3330146104de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b6104fd8173ffffffffffffffffffffffffffffffffffffffff16610b96565b610552576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180612a826039913960400191505060405180910390fd5b61055b81610b9c565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039181900360200190a150565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b600061061b6105df85610ba0565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c0092505050565b1561064357507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061047382610425565b600061067f6105df86866040518083838082843760405192018290039091209350610ba092505050565b156106a757507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b33301461074f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b600061075a82610425565b73ffffffffffffffffffffffffffffffffffffffff1614156107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806128e0602b913960400191505060405180910390fd5b6107d2816000610df8565b50565b33301461082d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b600061085e82604051602001610843919061277e565b60405160208183030381529060405280519060200120610ba0565b905061086a8183610e5b565b5050565b6108778261102a565b600061088f83856040516020016108439291906127c5565b905061089b8183610c00565b6108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190612721565b60405180910390fd5b6108e48185610e5b565b50505050565b60006104737f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610b0c565b6000333014610970576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006109d660006108ea565b905090565b333014610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b6000610a3e83610425565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806129f4602c913960400191505060405180910390fd5b61086a8282610df8565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf000000000000000000000000000000000000000000000000000000001415610b8d57506001610476565b610473826110ce565b3b151590565b3055565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b6000806000610c0e8461120f565b909250905061ffff821660005b8551831015610dd55760008080610c32898761127d565b975060ff91821694501691506001831415610c5a57610c5189876112fe565b96509050610d7e565b82610c86576060610c6b8a88611376565b97509050610c798b82611427565b9150828501945050610d7e565b6002831415610d2d57610c9989876112fe565b965090506000610ca98a886117b1565b975061ffff1690506060610cbe8b8984611822565b98509050610ccd8c8483611911565b610d22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806129c26032913960400191505060405180910390fd5b505092810192610d7e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806128b4602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019350505050604051602081830303815290604052805190602001209450505050610c1b565b8361ffff168110158015610ded5750610ded82611b59565b979650505050505050565b61086a7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff00000000000000000000000000000000000000000000000000000000841673ffffffffffffffffffffffffffffffffffffffff8416611c37565b60005b8151811015611025576000828281518110610e7557fe5b602002602001015190506000606082604001515a1015610ec1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d1906126c4565b825115610f5957826060015173ffffffffffffffffffffffffffffffffffffffff168360400151600014610ef9578360400151610efb565b5a5b8460a00151604051610f0d91906125f6565b6000604051808303818686f4925050503d8060008114610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b509092509050610fee565b826060015173ffffffffffffffffffffffffffffffffffffffff1683608001518460400151600014610f8f578460400151610f91565b5a5b908560a00151604051610fa491906125f6565b600060405180830381858888f193505050503d8060008114610fe2576040519150601f19603f3d011682016040523d82523d6000602084013e610fe7565b606091505b5090925090505b811561100f5785604051611002919061263e565b60405180910390a061101a565b61101a838783611c65565b505050600101610e5e565b505050565b60008061103683611cb5565b915091506000611045836108ea565b9050808214611080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d19061268d565b6001820161108e8482611cce565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f88184826040516110bf9291906127de565b60405180910390a15050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba5000000000000000000000000000000000000000000000000000000000148061116157507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806111ad57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806111f957507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561120657506001610476565b61047382611cf9565b6020810151815160f09190911c90600290811115611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061292e6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161129d57fe5b84518111156112f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612af76026913960400191505060405180910390fd5b9250925092565b8082016020015160601c6014820182811161131557fe5b835181111561136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061290b6023913960400191505060405180910390fd5b9250929050565b6040805160428082526080820190925260609160009190602082018180368337019050509150828401602001805160208401526020810151604084015260228101516042840152506042830190508281116113cd57fe5b835181111561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612a5f6023913960400191505060405180910390fd5b60008151604214611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061287a603a913960400191505060405180910390fd5b60008260018451038151811061149557fe5b602001015160f81c60f81b60f81c60ff1690506000836040815181106114b757fe5b016020015160f81c905060006114cd8582611d56565b905060006114dc866020611d56565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018061283d603d913960400191505060405180910390fd5b8260ff16601b1415801561156f57508260ff16601c14155b156115c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612955603d913960400191505060405180910390fd5b60018414156116395760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611628573d6000803e3d6000fd5b50505060206040510351945061173b565b60028414156116ea5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611628573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612abb603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166117a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806129926030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c600282018281116117c857fe5b835181111561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612b3e6022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561183d57600080fd5b506040519080825280601f01601f191660200182016040528015611868576020820181803683370190505b509150838501602001600060205b8581101561188f57908201518482015260208101611876565b84860160200180519390920151908501525250828201838110156118af57fe5b8451811115611909576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612b1d6021913960400191505060405180910390fd5b935093915050565b6000808260018451038151811061192457fe5b016020015160f81c9050600181148061193d5750600281145b15611981578373ffffffffffffffffffffffffffffffffffffffff166119638685611427565b73ffffffffffffffffffffffffffffffffffffffff16149150611b51565b6003811415611b005782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b83811015611a3b578181015183820152602001611a23565b50505050905090810190601f168015611a685780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611a8657600080fd5b505afa158015611a9a573d6000803e3d6000fd5b505050506040513d6020811015611ab057600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611b51565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180612a20603f913960400191505060405180910390fd5b509392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021830152603582018490527f0000000000000000000000000000000000000000000000000000000000000000605580840191909152835180840390910181526075909201909252805191012073ffffffffffffffffffffffffffffffffffffffff163014919050565b6040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b826020015115611c7757805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051611ca8929190612647565b60405180910390a1505050565b606081901c916bffffffffffffffffffffffff90911690565b61086a7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e8383611c37565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f025b22bc000000000000000000000000000000000000000000000000000000001415611d4d57506001610476565b61047382611dbe565b60008160200183511015611db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612b60603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415611e1257506001610476565b6104738260007fffffffff0000000000000000000000000000000000000000000000000000000082161580611e8857507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15611e9557506001610476565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610473565b803573ffffffffffffffffffffffffffffffffffffffff8116811461047657600080fd5b600082601f830112611f13578081fd5b8135602067ffffffffffffffff80831115611f2a57fe5b611f3782838502016127ec565b83815282810190868401865b86811015612013578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e03011215611f8157898afd5b604080518281018181108a82111715611f9657fe5b8252611fa3848b01612063565b8152611fb0828501612063565b8a8201526060808501358383015260809250611fcd838601611edf565b9082015260a08481013583830152928401359289841115611fec578c8dfd5b611ffa8f8c868801016120e3565b9082015287525050509285019290850190600101611f43565b509098975050505050505050565b60008083601f840112612032578182fd5b50813567ffffffffffffffff811115612049578182fd5b602083019150836020808302850101111561136f57600080fd5b8035801515811461047657600080fd5b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461047657600080fd5b60008083601f8401126120b4578182fd5b50813567ffffffffffffffff8111156120cb578182fd5b60208301915083602082850101111561136f57600080fd5b600082601f8301126120f3578081fd5b813567ffffffffffffffff81111561210757fe5b61213860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016127ec565b81815284602083860101111561214c578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612177578081fd5b61064382611edf565b60008060008060008060008060a0898b03121561219b578384fd5b6121a489611edf565b97506121b260208a01611edf565b9650604089013567ffffffffffffffff808211156121ce578586fd5b6121da8c838d01612021565b909850965060608b01359150808211156121f2578586fd5b6121fe8c838d01612021565b909650945060808b0135915080821115612216578384fd5b506122238b828c016120a3565b999c989b5096995094979396929594505050565b60008060008060006080868803121561224e578081fd5b61225786611edf565b945061226560208701611edf565b935060408601359250606086013567ffffffffffffffff811115612287578182fd5b612293888289016120a3565b969995985093965092949392505050565b60008060008060008060a087890312156122bc578182fd5b6122c587611edf565b95506122d360208801611edf565b94506040870135935060608701359250608087013567ffffffffffffffff8111156122fc578283fd5b61230889828a016120a3565b979a9699509497509295939492505050565b60006020828403121561232b578081fd5b813567ffffffffffffffff811115612341578182fd5b6106a784828501611f03565b600080600060608486031215612361578283fd5b833567ffffffffffffffff80821115612378578485fd5b61238487838801611f03565b94506020860135935060408601359150808211156123a0578283fd5b506123ad868287016120e3565b9150509250925092565b6000806000604084860312156123cb578283fd5b83359250602084013567ffffffffffffffff8111156123e8578283fd5b6123f4868287016120a3565b9497909650939450505050565b600060208284031215612412578081fd5b61064382612073565b6000806040838503121561242d578182fd5b61243683612073565b915061244460208401611edf565b90509250929050565b60008060008060408587031215612462578182fd5b843567ffffffffffffffff80821115612479578384fd5b612485888389016120a3565b9096509450602087013591508082111561249d578384fd5b506124aa878288016120a3565b95989497509550505050565b6000602082840312156124c7578081fd5b813567ffffffffffffffff8111156124dd578182fd5b6106a7848285016120e3565b6000602082840312156124fa578081fd5b5035919050565b6000815180845260208085018081965082840281019150828601855b8581101561259f5782840389528151805115158552858101511515868601526040808201519086015260608082015173ffffffffffffffffffffffffffffffffffffffff16908601526080808201519086015260a09081015160c09186018290529061258b818701836125ac565b9a87019a955050509084019060010161251d565b5091979650505050505050565b600081518084526125c4816020860160208601612810565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612608818460208701612810565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526106a760408301846125ac565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6020808252601f908201527f4d61696e4d6f64756c65235f617574683a20494e56414c49445f4e4f4e434500604082015260600190565b60208082526024908201527f4d6f64756c6543616c6c73235f657865637574653a204e4f545f454e4f55474860408201527f5f47415300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d6f64756c6543616c6c7323657865637574653a20494e56414c49445f53494760408201527f4e41545552450000000000000000000000000000000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a0000000000000000000000000000000000000000000000000000006060830152608060208301526106436080830184612501565b6000838252604060208301526106a76040830184612501565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561280857fe5b604052919050565b60005b8381101561282b578181015183820152602001612813565b838111156108e4575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474d6f64756c65486f6f6b732372656d6f7665486f6f6b3a20484f4f4b5f4e4f545f524547495354455245444c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552454d6f64756c65486f6f6b7323616464486f6f6b3a20484f4f4b5f414c52454144595f524547495354455245445369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44534d6f64756c6555706461746523757064617465496d706c656d656e746174696f6e3a20494e56414c49445f494d504c454d454e544154494f4e5369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220b34deca9dd75815e4ef8a9279e45750ec5554b22c673e160bdba849d80f5888564736f6c63430007060033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v1/artifacts/MainModuleUpgradable.ts b/packages/tests/src/builds/v1/artifacts/MainModuleUpgradable.ts new file mode 100644 index 000000000..2a9d12243 --- /dev/null +++ b/packages/tests/src/builds/v1/artifacts/MainModuleUpgradable.ts @@ -0,0 +1,530 @@ +export const mainModuleUpgradable = { + _format: 'hh-sol-artifact-1', + contractName: 'MainModuleUpgradable', + sourceName: 'contracts/modules/MainModuleUpgradable.sol', + abi: [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + name: 'CreatedContract', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: 'newImageHash', + type: 'bytes32' + } + ], + name: 'ImageHashUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'newImplementation', + type: 'address' + } + ], + name: 'ImplementationUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + indexed: false, + internalType: 'uint256', + name: '_newNonce', + type: 'uint256' + } + ], + name: 'NonceChange', + type: 'event' + }, + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + } + ], + name: 'TxExecuted', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'bytes', + name: '_reason', + type: 'bytes' + } + ], + name: 'TxFailed', + type: 'event' + }, + { + stateMutability: 'payable', + type: 'fallback' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + }, + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'addHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_code', + type: 'bytes' + } + ], + name: 'createContract', + outputs: [ + { + internalType: 'address', + name: 'addr', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + }, + { + internalType: 'uint256', + name: '_nonce', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'execute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [], + name: 'imageHash', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signatures', + type: 'bytes' + } + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_data', + type: 'bytes' + }, + { + internalType: 'bytes', + name: '_signatures', + 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: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155BatchReceived', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC721Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'readHook', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + } + ], + name: 'readNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'removeHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'selfExecute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_interfaceID', + type: 'bytes4' + } + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + } + ], + name: 'updateImageHash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'updateImplementation', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + stateMutability: 'payable', + type: 'receive' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b50612ce7806100206000396000f3fe6080604052600436106101125760003560e01c806351605d80116100a557806390042baf11610074578063b93ea7ad11610059578063b93ea7ad146103d0578063bc197c81146103f0578063f23a6e611461041057610119565b806390042baf146103a8578063affed0e0146103bb57610119565b806351605d801461032657806361c2926c146103485780637a9a1628146103685780638c3f55631461038857610119565b80631a9b2337116100e15780631a9b23371461029957806320c13b0b146102c657806329561426146102e65780634fcf3eca1461030657610119565b806301ffc9a7146101f4578063025b22bc1461022a578063150b7a021461024c5780631626ba7e1461027957610119565b3661011957005b60006101486000357fffffffff0000000000000000000000000000000000000000000000000000000016610430565b905073ffffffffffffffffffffffffffffffffffffffff8116156101f1576000808273ffffffffffffffffffffffffffffffffffffffff166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101d2576040519150601f19603f3d011682016040523d82523d6000602084013e6101d7565b606091505b5091509150816101e957805160208201fd5b805160208201f35b50005b34801561020057600080fd5b5061021461020f3660046124d4565b610486565b60405161022191906126eb565b60405180910390f35b34801561023657600080fd5b5061024a610245366004612221565b610491565b005b34801561025857600080fd5b5061026c6102673660046122f2565b6105b2565b6040516102219190612718565b34801561028557600080fd5b5061026c61029436600461248a565b6105dc565b3480156102a557600080fd5b506102b96102b43660046124d4565b610655565b60405161022191906126ca565b3480156102d257600080fd5b5061026c6102e1366004612520565b610660565b3480156102f257600080fd5b5061024a610301366004612472565b6106ba565b34801561031257600080fd5b5061024a6103213660046124d4565b6107c8565b34801561033257600080fd5b5061033b6108a6565b60405161022191906126f6565b34801561035457600080fd5b5061024a6103633660046123d5565b6108d6565b34801561037457600080fd5b5061024a610383366004612408565b61096f565b34801561039457600080fd5b5061033b6103a3366004612472565b6109eb565b6102b96103b6366004612589565b610a17565b3480156103c757600080fd5b5061033b610acb565b3480156103dc57600080fd5b5061024a6103eb3660046124ee565b610ad7565b3480156103fc57600080fd5b5061026c61040b36600461223b565b610bb0565b34801561041c57600080fd5b5061026c61042b36600461235f565b610bdd565b600061047e7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610c08565b90505b919050565b600061047e82610c35565b3330146104e9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b6105088173ffffffffffffffffffffffffffffffffffffffff16610c92565b61055d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180612b716039913960400191505060405180910390fd5b61056681610c98565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039181900360200190a150565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b60006106266105ea85610c9c565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cfc92505050565b1561064e57507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061047e82610430565b600061068a6105ea86866040518083838082843760405192018290039091209350610c9c92505050565b156106b257507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b333014610712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b80610768576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806129986037913960400191505060405180910390fd5b6107927fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf882610ef4565b6040805182815290517f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa9181900360200190a150565b333014610820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b600061082b82610430565b73ffffffffffffffffffffffffffffffffffffffff161415610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806129cf602b913960400191505060405180910390fd5b6108a3816000610ef8565b50565b60006108d17fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8610f5b565b905090565b33301461092e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b600061095f826040516020016109449190612836565b60405160208183030381529060405280519060200120610c9c565b905061096b8183610f5f565b5050565b6109788261112e565b6000610990838560405160200161094492919061287d565b905061099c8183610cfc565b6109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d2906127d9565b60405180910390fd5b6109e58185610f5f565b50505050565b600061047e7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610c08565b6000333014610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006108d160006109eb565b333014610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b6000610b3a83610430565b73ffffffffffffffffffffffffffffffffffffffff1614610ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612ae3602c913960400191505060405180910390fd5b61096b8282610ef8565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf000000000000000000000000000000000000000000000000000000001415610c8957506001610481565b61047e826111d2565b3b151590565b3055565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b6000806000610d0a84611313565b909250905061ffff821660005b8551831015610ed15760008080610d2e8987611381565b975060ff91821694501691506001831415610d5657610d4d8987611402565b96509050610e7a565b82610d82576060610d678a8861147a565b97509050610d758b8261152b565b9150828501945050610e7a565b6002831415610e2957610d958987611402565b965090506000610da58a886118b5565b975061ffff1690506060610dba8b8984611926565b98509050610dc98c8483611a15565b610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180612ab16032913960400191505060405180910390fd5b505092810192610e7a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061296c602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019350505050604051602081830303815290604052805190602001209450505050610d17565b8361ffff168110158015610ee95750610ee982611c5d565b979650505050505050565b9055565b61096b7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff00000000000000000000000000000000000000000000000000000000841673ffffffffffffffffffffffffffffffffffffffff8416611c9a565b5490565b60005b8151811015611129576000828281518110610f7957fe5b602002602001015190506000606082604001515a1015610fc5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d29061277c565b82511561105d57826060015173ffffffffffffffffffffffffffffffffffffffff168360400151600014610ffd578360400151610fff565b5a5b8460a0015160405161101191906126ae565b6000604051808303818686f4925050503d806000811461104d576040519150601f19603f3d011682016040523d82523d6000602084013e611052565b606091505b5090925090506110f2565b826060015173ffffffffffffffffffffffffffffffffffffffff1683608001518460400151600014611093578460400151611095565b5a5b908560a001516040516110a891906126ae565b600060405180830381858888f193505050503d80600081146110e6576040519150601f19603f3d011682016040523d82523d6000602084013e6110eb565b606091505b5090925090505b8115611113578560405161110691906126f6565b60405180910390a061111e565b61111e838783611cc8565b505050600101610f62565b505050565b60008061113a83611d18565b915091506000611149836109eb565b9050808214611184576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d290612745565b600182016111928482611d31565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f88184826040516111c3929190612896565b60405180910390a15050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba5000000000000000000000000000000000000000000000000000000000148061126557507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806112b157507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806112fd57507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561130a57506001610481565b61047e82611d5c565b6020810151815160f09190911c9060029081111561137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612a1d6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff16600283018381116113a157fe5b84518111156113fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612be66026913960400191505060405180910390fd5b9250925092565b8082016020015160601c6014820182811161141957fe5b8351811115611473576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806129fa6023913960400191505060405180910390fd5b9250929050565b6040805160428082526080820190925260609160009190602082018180368337019050509150828401602001805160208401526020810151604084015260228101516042840152506042830190508281116114d157fe5b8351811115611473576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612b4e6023913960400191505060405180910390fd5b60008151604214611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180612932603a913960400191505060405180910390fd5b60008260018451038151811061159957fe5b602001015160f81c60f81b60f81c60ff1690506000836040815181106115bb57fe5b016020015160f81c905060006115d18582611db9565b905060006115e0866020611db9565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806128f5603d913960400191505060405180910390fd5b8260ff16601b1415801561167357508260ff16601c14155b156116c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612a44603d913960400191505060405180910390fd5b600184141561173d5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561172c573d6000803e3d6000fd5b50505060206040510351945061183f565b60028414156117ee5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561172c573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612baa603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166118ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612a816030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c600282018281116118cc57fe5b8351811115611473576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c2d6022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561194157600080fd5b506040519080825280601f01601f19166020018201604052801561196c576020820181803683370190505b509150838501602001600060205b858110156119935790820151848201526020810161197a565b84860160200180519390920151908501525250828201838110156119b357fe5b8451811115611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612c0c6021913960400191505060405180910390fd5b935093915050565b60008082600184510381518110611a2857fe5b016020015160f81c90506001811480611a415750600281145b15611a85578373ffffffffffffffffffffffffffffffffffffffff16611a67868561152b565b73ffffffffffffffffffffffffffffffffffffffff16149150611c55565b6003811415611c045782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b83811015611b3f578181015183820152602001611b27565b50505050905090810190601f168015611b6c5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611b8a57600080fd5b505afa158015611b9e573d6000803e3d6000fd5b505050506040513d6020811015611bb457600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611c55565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180612b0f603f913960400191505060405180910390fd5b509392505050565b6000811580159061047e5750611c927fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8610f5b565b909114919050565b6040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b826020015115611cda57805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051611d0b9291906126ff565b60405180910390a1505050565b606081901c916bffffffffffffffffffffffff90911690565b61096b7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e8383611c9a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f025b22bc000000000000000000000000000000000000000000000000000000001415611db057506001610481565b61047e82611e21565b60008160200183511015611e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612c4f603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415611e7557506001610481565b61047e8260007fffffffff0000000000000000000000000000000000000000000000000000000082167f783649a6000000000000000000000000000000000000000000000000000000001415611ecd57506001610481565b61047e8260007fffffffff0000000000000000000000000000000000000000000000000000000082161580611f4357507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15611f5057506001610481565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461047e565b803573ffffffffffffffffffffffffffffffffffffffff8116811461048157600080fd5b600082601f830112611fce578081fd5b8135602067ffffffffffffffff80831115611fe557fe5b611ff282838502016128a4565b83815282810190868401865b868110156120ce578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e0301121561203c57898afd5b604080518281018181108a8211171561205157fe5b825261205e848b0161211e565b815261206b82850161211e565b8a8201526060808501358383015260809250612088838601611f9a565b9082015260a084810135838301529284013592898411156120a7578c8dfd5b6120b58f8c8688010161219e565b9082015287525050509285019290850190600101611ffe565b509098975050505050505050565b60008083601f8401126120ed578182fd5b50813567ffffffffffffffff811115612104578182fd5b602083019150836020808302850101111561147357600080fd5b8035801515811461048157600080fd5b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461048157600080fd5b60008083601f84011261216f578182fd5b50813567ffffffffffffffff811115612186578182fd5b60208301915083602082850101111561147357600080fd5b600082601f8301126121ae578081fd5b813567ffffffffffffffff8111156121c257fe5b6121f360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016128a4565b818152846020838601011115612207578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612232578081fd5b61064e82611f9a565b60008060008060008060008060a0898b031215612256578384fd5b61225f89611f9a565b975061226d60208a01611f9a565b9650604089013567ffffffffffffffff80821115612289578586fd5b6122958c838d016120dc565b909850965060608b01359150808211156122ad578586fd5b6122b98c838d016120dc565b909650945060808b01359150808211156122d1578384fd5b506122de8b828c0161215e565b999c989b5096995094979396929594505050565b600080600080600060808688031215612309578081fd5b61231286611f9a565b945061232060208701611f9a565b935060408601359250606086013567ffffffffffffffff811115612342578182fd5b61234e8882890161215e565b969995985093965092949392505050565b60008060008060008060a08789031215612377578182fd5b61238087611f9a565b955061238e60208801611f9a565b94506040870135935060608701359250608087013567ffffffffffffffff8111156123b7578283fd5b6123c389828a0161215e565b979a9699509497509295939492505050565b6000602082840312156123e6578081fd5b813567ffffffffffffffff8111156123fc578182fd5b6106b284828501611fbe565b60008060006060848603121561241c578283fd5b833567ffffffffffffffff80821115612433578485fd5b61243f87838801611fbe565b945060208601359350604086013591508082111561245b578283fd5b506124688682870161219e565b9150509250925092565b600060208284031215612483578081fd5b5035919050565b60008060006040848603121561249e578283fd5b83359250602084013567ffffffffffffffff8111156124bb578283fd5b6124c78682870161215e565b9497909650939450505050565b6000602082840312156124e5578081fd5b61064e8261212e565b60008060408385031215612500578182fd5b6125098361212e565b915061251760208401611f9a565b90509250929050565b60008060008060408587031215612535578182fd5b843567ffffffffffffffff8082111561254c578384fd5b6125588883890161215e565b90965094506020870135915080821115612570578384fd5b5061257d8782880161215e565b95989497509550505050565b60006020828403121561259a578081fd5b813567ffffffffffffffff8111156125b0578182fd5b6106b28482850161219e565b6000815180845260208085019450848183028601828601855b858110156126575783830389528151805115158452858101511515868501526040808201519085015260608082015173ffffffffffffffffffffffffffffffffffffffff16908501526080808201519085015260a09081015160c09185018290529061264381860183612664565b9a87019a94505050908401906001016125d5565b5090979650505050505050565b6000815180845261267c8160208601602086016128c8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516126c08184602087016128c8565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526106b26040830184612664565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6020808252601f908201527f4d61696e4d6f64756c65235f617574683a20494e56414c49445f4e4f4e434500604082015260600190565b60208082526024908201527f4d6f64756c6543616c6c73235f657865637574653a204e4f545f454e4f55474860408201527f5f47415300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d6f64756c6543616c6c7323657865637574653a20494e56414c49445f53494760408201527f4e41545552450000000000000000000000000000000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a00000000000000000000000000000000000000000000000000000060608301526080602083015261064e60808301846125bc565b6000838252604060208301526106b260408301846125bc565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156128c057fe5b604052919050565b60005b838110156128e35781810151838201526020016128cb565b838111156109e5575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474d6f64756c654175746855706772616461626c6523757064617465496d6167654861736820494e56414c49445f494d4147455f484153484d6f64756c65486f6f6b732372656d6f7665486f6f6b3a20484f4f4b5f4e4f545f524547495354455245444c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552454d6f64756c65486f6f6b7323616464486f6f6b3a20484f4f4b5f414c52454144595f524547495354455245445369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44534d6f64756c6555706461746523757064617465496d706c656d656e746174696f6e3a20494e56414c49445f494d504c454d454e544154494f4e5369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220aebb8d931ef86555b6441c416b208bb9fe8fe0974c5733ebbccce548296c37ce64736f6c63430007060033', + deployedBytecode: + '0x6080604052600436106101125760003560e01c806351605d80116100a557806390042baf11610074578063b93ea7ad11610059578063b93ea7ad146103d0578063bc197c81146103f0578063f23a6e611461041057610119565b806390042baf146103a8578063affed0e0146103bb57610119565b806351605d801461032657806361c2926c146103485780637a9a1628146103685780638c3f55631461038857610119565b80631a9b2337116100e15780631a9b23371461029957806320c13b0b146102c657806329561426146102e65780634fcf3eca1461030657610119565b806301ffc9a7146101f4578063025b22bc1461022a578063150b7a021461024c5780631626ba7e1461027957610119565b3661011957005b60006101486000357fffffffff0000000000000000000000000000000000000000000000000000000016610430565b905073ffffffffffffffffffffffffffffffffffffffff8116156101f1576000808273ffffffffffffffffffffffffffffffffffffffff166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101d2576040519150601f19603f3d011682016040523d82523d6000602084013e6101d7565b606091505b5091509150816101e957805160208201fd5b805160208201f35b50005b34801561020057600080fd5b5061021461020f3660046124d4565b610486565b60405161022191906126eb565b60405180910390f35b34801561023657600080fd5b5061024a610245366004612221565b610491565b005b34801561025857600080fd5b5061026c6102673660046122f2565b6105b2565b6040516102219190612718565b34801561028557600080fd5b5061026c61029436600461248a565b6105dc565b3480156102a557600080fd5b506102b96102b43660046124d4565b610655565b60405161022191906126ca565b3480156102d257600080fd5b5061026c6102e1366004612520565b610660565b3480156102f257600080fd5b5061024a610301366004612472565b6106ba565b34801561031257600080fd5b5061024a6103213660046124d4565b6107c8565b34801561033257600080fd5b5061033b6108a6565b60405161022191906126f6565b34801561035457600080fd5b5061024a6103633660046123d5565b6108d6565b34801561037457600080fd5b5061024a610383366004612408565b61096f565b34801561039457600080fd5b5061033b6103a3366004612472565b6109eb565b6102b96103b6366004612589565b610a17565b3480156103c757600080fd5b5061033b610acb565b3480156103dc57600080fd5b5061024a6103eb3660046124ee565b610ad7565b3480156103fc57600080fd5b5061026c61040b36600461223b565b610bb0565b34801561041c57600080fd5b5061026c61042b36600461235f565b610bdd565b600061047e7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610c08565b90505b919050565b600061047e82610c35565b3330146104e9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b6105088173ffffffffffffffffffffffffffffffffffffffff16610c92565b61055d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180612b716039913960400191505060405180910390fd5b61056681610c98565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039181900360200190a150565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b60006106266105ea85610c9c565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cfc92505050565b1561064e57507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061047e82610430565b600061068a6105ea86866040518083838082843760405192018290039091209350610c9c92505050565b156106b257507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b333014610712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b80610768576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806129986037913960400191505060405180910390fd5b6107927fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf882610ef4565b6040805182815290517f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa9181900360200190a150565b333014610820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b600061082b82610430565b73ffffffffffffffffffffffffffffffffffffffff161415610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806129cf602b913960400191505060405180910390fd5b6108a3816000610ef8565b50565b60006108d17fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8610f5b565b905090565b33301461092e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b600061095f826040516020016109449190612836565b60405160208183030381529060405280519060200120610c9c565b905061096b8183610f5f565b5050565b6109788261112e565b6000610990838560405160200161094492919061287d565b905061099c8183610cfc565b6109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d2906127d9565b60405180910390fd5b6109e58185610f5f565b50505050565b600061047e7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610c08565b6000333014610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006108d160006109eb565b333014610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b6000610b3a83610430565b73ffffffffffffffffffffffffffffffffffffffff1614610ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612ae3602c913960400191505060405180910390fd5b61096b8282610ef8565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf000000000000000000000000000000000000000000000000000000001415610c8957506001610481565b61047e826111d2565b3b151590565b3055565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b6000806000610d0a84611313565b909250905061ffff821660005b8551831015610ed15760008080610d2e8987611381565b975060ff91821694501691506001831415610d5657610d4d8987611402565b96509050610e7a565b82610d82576060610d678a8861147a565b97509050610d758b8261152b565b9150828501945050610e7a565b6002831415610e2957610d958987611402565b965090506000610da58a886118b5565b975061ffff1690506060610dba8b8984611926565b98509050610dc98c8483611a15565b610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180612ab16032913960400191505060405180910390fd5b505092810192610e7a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061296c602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019350505050604051602081830303815290604052805190602001209450505050610d17565b8361ffff168110158015610ee95750610ee982611c5d565b979650505050505050565b9055565b61096b7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff00000000000000000000000000000000000000000000000000000000841673ffffffffffffffffffffffffffffffffffffffff8416611c9a565b5490565b60005b8151811015611129576000828281518110610f7957fe5b602002602001015190506000606082604001515a1015610fc5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d29061277c565b82511561105d57826060015173ffffffffffffffffffffffffffffffffffffffff168360400151600014610ffd578360400151610fff565b5a5b8460a0015160405161101191906126ae565b6000604051808303818686f4925050503d806000811461104d576040519150601f19603f3d011682016040523d82523d6000602084013e611052565b606091505b5090925090506110f2565b826060015173ffffffffffffffffffffffffffffffffffffffff1683608001518460400151600014611093578460400151611095565b5a5b908560a001516040516110a891906126ae565b600060405180830381858888f193505050503d80600081146110e6576040519150601f19603f3d011682016040523d82523d6000602084013e6110eb565b606091505b5090925090505b8115611113578560405161110691906126f6565b60405180910390a061111e565b61111e838783611cc8565b505050600101610f62565b505050565b60008061113a83611d18565b915091506000611149836109eb565b9050808214611184576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d290612745565b600182016111928482611d31565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f88184826040516111c3929190612896565b60405180910390a15050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba5000000000000000000000000000000000000000000000000000000000148061126557507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806112b157507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806112fd57507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561130a57506001610481565b61047e82611d5c565b6020810151815160f09190911c9060029081111561137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612a1d6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff16600283018381116113a157fe5b84518111156113fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612be66026913960400191505060405180910390fd5b9250925092565b8082016020015160601c6014820182811161141957fe5b8351811115611473576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806129fa6023913960400191505060405180910390fd5b9250929050565b6040805160428082526080820190925260609160009190602082018180368337019050509150828401602001805160208401526020810151604084015260228101516042840152506042830190508281116114d157fe5b8351811115611473576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612b4e6023913960400191505060405180910390fd5b60008151604214611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180612932603a913960400191505060405180910390fd5b60008260018451038151811061159957fe5b602001015160f81c60f81b60f81c60ff1690506000836040815181106115bb57fe5b016020015160f81c905060006115d18582611db9565b905060006115e0866020611db9565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806128f5603d913960400191505060405180910390fd5b8260ff16601b1415801561167357508260ff16601c14155b156116c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612a44603d913960400191505060405180910390fd5b600184141561173d5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561172c573d6000803e3d6000fd5b50505060206040510351945061183f565b60028414156117ee5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561172c573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612baa603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166118ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612a816030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c600282018281116118cc57fe5b8351811115611473576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c2d6022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561194157600080fd5b506040519080825280601f01601f19166020018201604052801561196c576020820181803683370190505b509150838501602001600060205b858110156119935790820151848201526020810161197a565b84860160200180519390920151908501525250828201838110156119b357fe5b8451811115611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612c0c6021913960400191505060405180910390fd5b935093915050565b60008082600184510381518110611a2857fe5b016020015160f81c90506001811480611a415750600281145b15611a85578373ffffffffffffffffffffffffffffffffffffffff16611a67868561152b565b73ffffffffffffffffffffffffffffffffffffffff16149150611c55565b6003811415611c045782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b83811015611b3f578181015183820152602001611b27565b50505050905090810190601f168015611b6c5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611b8a57600080fd5b505afa158015611b9e573d6000803e3d6000fd5b505050506040513d6020811015611bb457600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611c55565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180612b0f603f913960400191505060405180910390fd5b509392505050565b6000811580159061047e5750611c927fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8610f5b565b909114919050565b6040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b826020015115611cda57805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051611d0b9291906126ff565b60405180910390a1505050565b606081901c916bffffffffffffffffffffffff90911690565b61096b7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e8383611c9a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f025b22bc000000000000000000000000000000000000000000000000000000001415611db057506001610481565b61047e82611e21565b60008160200183511015611e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612c4f603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415611e7557506001610481565b61047e8260007fffffffff0000000000000000000000000000000000000000000000000000000082167f783649a6000000000000000000000000000000000000000000000000000000001415611ecd57506001610481565b61047e8260007fffffffff0000000000000000000000000000000000000000000000000000000082161580611f4357507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15611f5057506001610481565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461047e565b803573ffffffffffffffffffffffffffffffffffffffff8116811461048157600080fd5b600082601f830112611fce578081fd5b8135602067ffffffffffffffff80831115611fe557fe5b611ff282838502016128a4565b83815282810190868401865b868110156120ce578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e0301121561203c57898afd5b604080518281018181108a8211171561205157fe5b825261205e848b0161211e565b815261206b82850161211e565b8a8201526060808501358383015260809250612088838601611f9a565b9082015260a084810135838301529284013592898411156120a7578c8dfd5b6120b58f8c8688010161219e565b9082015287525050509285019290850190600101611ffe565b509098975050505050505050565b60008083601f8401126120ed578182fd5b50813567ffffffffffffffff811115612104578182fd5b602083019150836020808302850101111561147357600080fd5b8035801515811461048157600080fd5b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461048157600080fd5b60008083601f84011261216f578182fd5b50813567ffffffffffffffff811115612186578182fd5b60208301915083602082850101111561147357600080fd5b600082601f8301126121ae578081fd5b813567ffffffffffffffff8111156121c257fe5b6121f360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016128a4565b818152846020838601011115612207578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612232578081fd5b61064e82611f9a565b60008060008060008060008060a0898b031215612256578384fd5b61225f89611f9a565b975061226d60208a01611f9a565b9650604089013567ffffffffffffffff80821115612289578586fd5b6122958c838d016120dc565b909850965060608b01359150808211156122ad578586fd5b6122b98c838d016120dc565b909650945060808b01359150808211156122d1578384fd5b506122de8b828c0161215e565b999c989b5096995094979396929594505050565b600080600080600060808688031215612309578081fd5b61231286611f9a565b945061232060208701611f9a565b935060408601359250606086013567ffffffffffffffff811115612342578182fd5b61234e8882890161215e565b969995985093965092949392505050565b60008060008060008060a08789031215612377578182fd5b61238087611f9a565b955061238e60208801611f9a565b94506040870135935060608701359250608087013567ffffffffffffffff8111156123b7578283fd5b6123c389828a0161215e565b979a9699509497509295939492505050565b6000602082840312156123e6578081fd5b813567ffffffffffffffff8111156123fc578182fd5b6106b284828501611fbe565b60008060006060848603121561241c578283fd5b833567ffffffffffffffff80821115612433578485fd5b61243f87838801611fbe565b945060208601359350604086013591508082111561245b578283fd5b506124688682870161219e565b9150509250925092565b600060208284031215612483578081fd5b5035919050565b60008060006040848603121561249e578283fd5b83359250602084013567ffffffffffffffff8111156124bb578283fd5b6124c78682870161215e565b9497909650939450505050565b6000602082840312156124e5578081fd5b61064e8261212e565b60008060408385031215612500578182fd5b6125098361212e565b915061251760208401611f9a565b90509250929050565b60008060008060408587031215612535578182fd5b843567ffffffffffffffff8082111561254c578384fd5b6125588883890161215e565b90965094506020870135915080821115612570578384fd5b5061257d8782880161215e565b95989497509550505050565b60006020828403121561259a578081fd5b813567ffffffffffffffff8111156125b0578182fd5b6106b28482850161219e565b6000815180845260208085019450848183028601828601855b858110156126575783830389528151805115158452858101511515868501526040808201519085015260608082015173ffffffffffffffffffffffffffffffffffffffff16908501526080808201519085015260a09081015160c09185018290529061264381860183612664565b9a87019a94505050908401906001016125d5565b5090979650505050505050565b6000815180845261267c8160208601602086016128c8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516126c08184602087016128c8565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526106b26040830184612664565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6020808252601f908201527f4d61696e4d6f64756c65235f617574683a20494e56414c49445f4e4f4e434500604082015260600190565b60208082526024908201527f4d6f64756c6543616c6c73235f657865637574653a204e4f545f454e4f55474860408201527f5f47415300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d6f64756c6543616c6c7323657865637574653a20494e56414c49445f53494760408201527f4e41545552450000000000000000000000000000000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a00000000000000000000000000000000000000000000000000000060608301526080602083015261064e60808301846125bc565b6000838252604060208301526106b260408301846125bc565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156128c057fe5b604052919050565b60005b838110156128e35781810151838201526020016128cb565b838111156109e5575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474d6f64756c654175746855706772616461626c6523757064617465496d6167654861736820494e56414c49445f494d4147455f484153484d6f64756c65486f6f6b732372656d6f7665486f6f6b3a20484f4f4b5f4e4f545f524547495354455245444c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552454d6f64756c65486f6f6b7323616464486f6f6b3a20484f4f4b5f414c52454144595f524547495354455245445369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44534d6f64756c6555706461746523757064617465496d706c656d656e746174696f6e3a20494e56414c49445f494d504c454d454e544154494f4e5369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220aebb8d931ef86555b6441c416b208bb9fe8fe0974c5733ebbccce548296c37ce64736f6c63430007060033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v1/artifacts/MultiCallUtils.ts b/packages/tests/src/builds/v1/artifacts/MultiCallUtils.ts new file mode 100644 index 000000000..6d9f1ced3 --- /dev/null +++ b/packages/tests/src/builds/v1/artifacts/MultiCallUtils.ts @@ -0,0 +1,281 @@ +export const multiCallUtils = { + _format: 'hh-sol-artifact-1', + contractName: 'MultiCallUtils', + sourceName: 'contracts/modules/utils/MultiCallUtils.sol', + abi: [ + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callBalanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callBlockNumber', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_i', + type: 'uint256' + } + ], + name: 'callBlockhash', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callChainId', + outputs: [ + { + internalType: 'uint256', + name: 'id', + type: 'uint256' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCode', + outputs: [ + { + internalType: 'bytes', + name: 'code', + type: 'bytes' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCodeHash', + outputs: [ + { + internalType: 'bytes32', + name: 'codeHash', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCodeSize', + outputs: [ + { + internalType: 'uint256', + name: 'size', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callCoinbase', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callDifficulty', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasLeft', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasLimit', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasPrice', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callOrigin', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callTimestamp', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'multiCall', + outputs: [ + { + internalType: 'bool[]', + name: '_successes', + type: 'bool[]' + }, + { + internalType: 'bytes[]', + name: '_results', + type: 'bytes[]' + } + ], + stateMutability: 'payable', + type: 'function' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b50610aac806100206000396000f3fe6080604052600436106100e85760003560e01c8063c272d5c31161008a578063d5b5337f11610059578063d5b5337f14610230578063e90f13e71461021b578063f209883a14610250578063ffd7d74114610265576100e8565b8063c272d5c3146101b9578063c39f2d5c146101ce578063c66764e1146101ee578063d1db39071461021b576100e8565b8063543196eb116100c6578063543196eb1461014d578063984395bc1461016d57806398f9fbc41461018f578063aeea5fb5146101a4576100e8565b80630fdecfac146100ed57806343d9c9351461011857806348acd29f1461012d575b600080fd5b3480156100f957600080fd5b50610102610286565b60405161010f91906108ef565b60405180910390f35b34801561012457600080fd5b5061010261028a565b34801561013957600080fd5b50610102610148366004610649565b610292565b34801561015957600080fd5b50610102610168366004610649565b6102b0565b34801561017957600080fd5b506101826102b4565b60405161010f9190610828565b34801561019b57600080fd5b506101826102b8565b3480156101b057600080fd5b506101026102bc565b3480156101c557600080fd5b506101026102c0565b3480156101da57600080fd5b506101026101e9366004610649565b6102c4565b3480156101fa57600080fd5b5061020e610209366004610649565b6102c8565b60405161010f91906108f8565b34801561022757600080fd5b5061010261030d565b34801561023c57600080fd5b5061010261024b3660046107aa565b610311565b34801561025c57600080fd5b50610102610315565b61027861027336600461066a565b610319565b60405161010f929190610849565b4690565b60005a905090565b73ffffffffffffffffffffffffffffffffffffffff8116315b919050565b3f90565b3290565b4190565b4490565b3a90565b3b90565b60408051603f833b9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092528181529080600060208401853c50919050565b4590565b4090565b4290565b606080825167ffffffffffffffff8111801561033457600080fd5b5060405190808252806020026020018201604052801561035e578160200160208202803683370190505b509150825167ffffffffffffffff8111801561037957600080fd5b506040519080825280602002602001820160405280156103ad57816020015b60608152602001906001900390816103985790505b50905060005b835181101561058c5760008482815181106103ca57fe5b60200260200101519050806000015115610419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610410906109c5565b60405180910390fd5b80604001515a1015610457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041090610968565b806060015173ffffffffffffffffffffffffffffffffffffffff168160800151826040015160001461048d57826040015161048f565b5a5b908360a001516040516104a2919061080c565b600060405180830381858888f193505050503d80600081146104e0576040519150601f19603f3d011682016040523d82523d6000602084013e6104e5565b606091505b508584815181106104f257fe5b6020026020010185858151811061050557fe5b602002602001018290528215151515815250505083828151811061052557fe5b60200260200101518061054d575084828151811061053f57fe5b602002602001015160200151155b610583576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104109061090b565b506001016103b3565b50915091565b803573ffffffffffffffffffffffffffffffffffffffff811681146102ab57600080fd5b803580151581146102ab57600080fd5b600082601f8301126105d6578081fd5b813567ffffffffffffffff8111156105ea57fe5b61061b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610a22565b81815284602083860101111561062f578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561065a578081fd5b61066382610592565b9392505050565b6000602080838503121561067c578182fd5b823567ffffffffffffffff80821115610693578384fd5b818501915085601f8301126106a6578384fd5b8135818111156106b257fe5b6106bf8485830201610a22565b81815284810190848601875b8481101561079b578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215610709578a8bfd5b604080518281018181108b8211171561071e57fe5b825261072b848d016105b6565b81526107388285016105b6565b8c8201526060808501358383015260809250610755838601610592565b9082015260a084013582820152918301359189831115610773578c8dfd5b6107818f8d858701016105c6565b60a0820152875250505092870192908701906001016106cb565b50909998505050505050505050565b6000602082840312156107bb578081fd5b5035919050565b600081518084526107da816020860160208601610a46565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161081e818460208701610a46565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015610884578151151584529284019290840190600101610866565b5050508381038285015284518082528282019080840283018401878501865b8381101561079b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526108dd8383516107c2565b948701949250908601906001016108a3565b90815260200190565b60006020825261066360208301846107c2565b60208082526027908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2043414c4c5f5260408201527f4556455254454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a204e4f545f454e60408201527f4f5547485f474153000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2064656c65676160408201527f746543616c6c206e6f7420616c6c6f7765640000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff81118282101715610a3e57fe5b604052919050565b60005b83811015610a61578181015183820152602001610a49565b83811115610a70576000848401525b5050505056fea26469706673582212209bcbc4408d83c4567da8d51b96a29d3d2cf56395e5ac84eee40917a48945daaf64736f6c63430007060033', + deployedBytecode: + '0x6080604052600436106100e85760003560e01c8063c272d5c31161008a578063d5b5337f11610059578063d5b5337f14610230578063e90f13e71461021b578063f209883a14610250578063ffd7d74114610265576100e8565b8063c272d5c3146101b9578063c39f2d5c146101ce578063c66764e1146101ee578063d1db39071461021b576100e8565b8063543196eb116100c6578063543196eb1461014d578063984395bc1461016d57806398f9fbc41461018f578063aeea5fb5146101a4576100e8565b80630fdecfac146100ed57806343d9c9351461011857806348acd29f1461012d575b600080fd5b3480156100f957600080fd5b50610102610286565b60405161010f91906108ef565b60405180910390f35b34801561012457600080fd5b5061010261028a565b34801561013957600080fd5b50610102610148366004610649565b610292565b34801561015957600080fd5b50610102610168366004610649565b6102b0565b34801561017957600080fd5b506101826102b4565b60405161010f9190610828565b34801561019b57600080fd5b506101826102b8565b3480156101b057600080fd5b506101026102bc565b3480156101c557600080fd5b506101026102c0565b3480156101da57600080fd5b506101026101e9366004610649565b6102c4565b3480156101fa57600080fd5b5061020e610209366004610649565b6102c8565b60405161010f91906108f8565b34801561022757600080fd5b5061010261030d565b34801561023c57600080fd5b5061010261024b3660046107aa565b610311565b34801561025c57600080fd5b50610102610315565b61027861027336600461066a565b610319565b60405161010f929190610849565b4690565b60005a905090565b73ffffffffffffffffffffffffffffffffffffffff8116315b919050565b3f90565b3290565b4190565b4490565b3a90565b3b90565b60408051603f833b9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092528181529080600060208401853c50919050565b4590565b4090565b4290565b606080825167ffffffffffffffff8111801561033457600080fd5b5060405190808252806020026020018201604052801561035e578160200160208202803683370190505b509150825167ffffffffffffffff8111801561037957600080fd5b506040519080825280602002602001820160405280156103ad57816020015b60608152602001906001900390816103985790505b50905060005b835181101561058c5760008482815181106103ca57fe5b60200260200101519050806000015115610419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610410906109c5565b60405180910390fd5b80604001515a1015610457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041090610968565b806060015173ffffffffffffffffffffffffffffffffffffffff168160800151826040015160001461048d57826040015161048f565b5a5b908360a001516040516104a2919061080c565b600060405180830381858888f193505050503d80600081146104e0576040519150601f19603f3d011682016040523d82523d6000602084013e6104e5565b606091505b508584815181106104f257fe5b6020026020010185858151811061050557fe5b602002602001018290528215151515815250505083828151811061052557fe5b60200260200101518061054d575084828151811061053f57fe5b602002602001015160200151155b610583576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104109061090b565b506001016103b3565b50915091565b803573ffffffffffffffffffffffffffffffffffffffff811681146102ab57600080fd5b803580151581146102ab57600080fd5b600082601f8301126105d6578081fd5b813567ffffffffffffffff8111156105ea57fe5b61061b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610a22565b81815284602083860101111561062f578283fd5b816020850160208301379081016020019190915292915050565b60006020828403121561065a578081fd5b61066382610592565b9392505050565b6000602080838503121561067c578182fd5b823567ffffffffffffffff80821115610693578384fd5b818501915085601f8301126106a6578384fd5b8135818111156106b257fe5b6106bf8485830201610a22565b81815284810190848601875b8481101561079b578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215610709578a8bfd5b604080518281018181108b8211171561071e57fe5b825261072b848d016105b6565b81526107388285016105b6565b8c8201526060808501358383015260809250610755838601610592565b9082015260a084013582820152918301359189831115610773578c8dfd5b6107818f8d858701016105c6565b60a0820152875250505092870192908701906001016106cb565b50909998505050505050505050565b6000602082840312156107bb578081fd5b5035919050565b600081518084526107da816020860160208601610a46565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000825161081e818460208701610a46565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080825283519082018190526000906020906060840190828701845b82811015610884578151151584529284019290840190600101610866565b5050508381038285015284518082528282019080840283018401878501865b8381101561079b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526108dd8383516107c2565b948701949250908601906001016108a3565b90815260200190565b60006020825261066360208301846107c2565b60208082526027908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2043414c4c5f5260408201527f4556455254454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a204e4f545f454e60408201527f4f5547485f474153000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2064656c65676160408201527f746543616c6c206e6f7420616c6c6f7765640000000000000000000000000000606082015260800190565b60405181810167ffffffffffffffff81118282101715610a3e57fe5b604052919050565b60005b83811015610a61578181015183820152602001610a49565b83811115610a70576000848401525b5050505056fea26469706673582212209bcbc4408d83c4567da8d51b96a29d3d2cf56395e5ac84eee40917a48945daaf64736f6c63430007060033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v1/artifacts/SequenceUtils.ts b/packages/tests/src/builds/v1/artifacts/SequenceUtils.ts new file mode 100644 index 000000000..dfeb06755 --- /dev/null +++ b/packages/tests/src/builds/v1/artifacts/SequenceUtils.ts @@ -0,0 +1,527 @@ +export const sequenceUtils = { + _format: 'hh-sol-artifact-1', + contractName: 'SequenceUtils', + sourceName: 'contracts/modules/utils/SequenceUtils.sol', + abi: [ + { + inputs: [ + { + internalType: 'address', + name: '_factory', + type: 'address' + }, + { + internalType: 'address', + name: '_mainModule', + type: 'address' + } + ], + stateMutability: 'nonpayable', + type: 'constructor' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + indexed: true, + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'uint256', + name: '_threshold', + type: 'uint256' + }, + { + indexed: false, + internalType: 'bytes', + name: '_signers', + type: 'bytes' + } + ], + name: 'RequiredConfig', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + indexed: true, + internalType: 'address', + name: '_signer', + type: 'address' + } + ], + name: 'RequiredSigner', + type: 'event' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callBalanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callBlockNumber', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_i', + type: 'uint256' + } + ], + name: 'callBlockhash', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callChainId', + outputs: [ + { + internalType: 'uint256', + name: 'id', + type: 'uint256' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCode', + outputs: [ + { + internalType: 'bytes', + name: 'code', + type: 'bytes' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCodeHash', + outputs: [ + { + internalType: 'bytes32', + name: 'codeHash', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_addr', + type: 'address' + } + ], + name: 'callCodeSize', + outputs: [ + { + internalType: 'uint256', + name: 'size', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callCoinbase', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callDifficulty', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasLeft', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasLimit', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callGasPrice', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callOrigin', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'callTimestamp', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'knownImageHashes', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + name: 'lastImageHashUpdate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'lastSignerUpdate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'lastWalletUpdate', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'multiCall', + outputs: [ + { + internalType: 'bool[]', + name: '_successes', + type: 'bool[]' + }, + { + internalType: 'bytes[]', + name: '_results', + type: 'bytes[]' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + internalType: 'uint256', + name: '_threshold', + type: 'uint256' + }, + { + components: [ + { + internalType: 'uint256', + name: 'weight', + type: 'uint256' + }, + { + internalType: 'address', + name: 'signer', + type: 'address' + } + ], + internalType: 'struct RequireUtils.Member[]', + name: '_members', + type: 'tuple[]' + }, + { + internalType: 'bool', + name: '_index', + type: 'bool' + } + ], + name: 'publishConfig', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: '_sizeMembers', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'bool', + name: '_index', + type: 'bool' + } + ], + name: 'publishInitialSigners', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_wallet', + type: 'address' + }, + { + internalType: 'uint256', + name: '_nonce', + type: 'uint256' + } + ], + name: 'requireMinNonce', + outputs: [], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'requireNonExpired', + outputs: [], + stateMutability: 'view', + type: 'function' + } + ], + bytecode: + '0x60c06040523480156200001157600080fd5b5060405162002ad638038062002ad68339810160408190526200003491620000cd565b8181816001600160a01b031660a0816001600160a01b031660601b8152505060405180606001604052806028815260200162002aae60289139816001600160a01b03166040516020016200008a92919062000104565b60408051601f198184030181529190528051602090910120608052506200014692505050565b80516001600160a01b0381168114620000c857600080fd5b919050565b60008060408385031215620000e0578182fd5b620000eb83620000b0565b9150620000fb60208401620000b0565b90509250929050565b60008351815b818110156200012657602081870181015185830152016200010a565b81811115620001355782828501525b509190910191825250602001919050565b60805160a05160601c61293762000177600039806106515280610b1b5250806106755280610b3f52506129376000f3fe6080604052600436106101805760003560e01c806398f9fbc4116100d6578063d1db39071161007f578063e90f13e711610059578063e90f13e714610395578063f209883a146103ea578063ffd7d741146103ff57610180565b8063d1db390714610395578063d5b5337f146103aa578063e717aba9146103ca57610180565b8063c272d5c3116100b0578063c272d5c314610333578063c39f2d5c14610348578063c66764e11461036857610180565b806398f9fbc4146102e9578063aeea5fb5146102fe578063b472f0a21461031357610180565b806348acd29f116101385780637ae99638116101125780637ae99638146102875780637f29d538146102a7578063984395bc146102c757610180565b806348acd29f14610227578063543196eb146102475780637082503b1461026757610180565b80631cd05dc4116101695780631cd05dc4146101d057806343d9c935146101f057806344d466c21461020557610180565b80630fdecfac146101855780631551f0ab146101b0575b600080fd5b34801561019157600080fd5b5061019a610420565b6040516101a79190612190565b60405180910390f35b3480156101bc57600080fd5b5061019a6101cb366004611e76565b610424565b3480156101dc57600080fd5b5061019a6101eb366004611bea565b610436565b3480156101fc57600080fd5b5061019a610448565b34801561021157600080fd5b50610225610220366004611ca4565b610450565b005b34801561023357600080fd5b5061019a610242366004611bea565b61080a565b34801561025357600080fd5b5061019a610262366004611bea565b610828565b34801561027357600080fd5b50610225610282366004611c0b565b61082c565b34801561029357600080fd5b5061019a6102a2366004611bea565b610cb0565b3480156102b357600080fd5b506102256102c2366004611e76565b610cc2565b3480156102d357600080fd5b506102dc610cfe565b6040516101a79190612000565b3480156102f557600080fd5b506102dc610d02565b34801561030a57600080fd5b5061019a610d06565b34801561031f57600080fd5b5061022561032e366004611c7b565b610d0a565b34801561033f57600080fd5b5061019a610de8565b34801561035457600080fd5b5061019a610363366004611bea565b610dec565b34801561037457600080fd5b50610388610383366004611bea565b610df0565b6040516101a791906121c5565b3480156103a157600080fd5b5061019a610e35565b3480156103b657600080fd5b5061019a6103c5366004611e76565b610e39565b3480156103d657600080fd5b5061019a6103e5366004611bea565b610e3d565b3480156103f657600080fd5b5061019a610e4f565b61041261040d366004611d34565b610e53565b6040516101a7929190612021565b4690565b60036020526000908152604090205481565b60006020819052908152604090205481565b60005a905090565b8360005b838110156104e9578185858381811061046957fe5b9050604002016000013586868481811061047f57fe5b90506040020160200160208101906104979190611bea565b6040516020016104a993929190612199565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209150600101610454565b506000808773ffffffffffffffffffffffffffffffffffffffff166351605d8060e01b60405160200161051c9190611f54565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261055491611f81565b6000604051808303816000865af19150503d8060008114610591576040519150601f19603f3d011682016040523d82523d6000602084013e610596565b606091505b50915091508180156105a9575080516020145b1561060e576000818060200190518101906105c49190611e8e565b9050838114610608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612543565b60405180910390fd5b50610732565b60405173ffffffffffffffffffffffffffffffffffffffff89169061069d907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009087907f000000000000000000000000000000000000000000000000000000000000000090602001611ef0565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906125a0565b83156107325773ffffffffffffffffffffffffffffffffffffffff881660009081526002602052604090208390555b828873ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee89898960405160200161077f9291906120c7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526107b89291612623565b60405180910390a383156108005773ffffffffffffffffffffffffffffffffffffffff8816600090815260016020908152604080832043908190558684526003909252909120555b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116315b919050565b3f90565b600080610838846110c3565b9150915060008046905080898960405160200161085793929190611f9d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012091505061ffff831660008767ffffffffffffffff811180156108ae57600080fd5b506040519080825280602002602001820160405280156108e857816020015b6108d5611b1c565b8152602001906001900390816108cd5790505b50905060005b8751851015610a9f57600080806109058b89611131565b995060ff9182169450169150600183141561092d576109248b896111b2565b98509050610a20565b8261095f57606061093e8c8a61122a565b9950905061094c88826112db565b91506109598f838d611665565b50610a20565b60028314156109ee576109728b896111b2565b9850905060006109828c8a6116f3565b995061ffff16905060606109978d8b84611764565b9a5090506109a6898483611853565b6109dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff9061242c565b50506109e98e828c611665565b610a20565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906121d8565b60405180604001604052808381526020018273ffffffffffffffffffffffffffffffffffffffff16815250858581518110610a5757fe5b60200260200101819052508380600101945050858282604051602001610a7f93929190612199565b6040516020818303038152906040528051906020012095505050506108ee565b888114610ad8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906124e6565b60405173ffffffffffffffffffffffffffffffffffffffff8c1690610b67907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009087907f000000000000000000000000000000000000000000000000000000000000000090602001611ef0565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906123a9565b828b73ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee8885604051602001610c18919061212b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610c5192916125fe565b60405180910390a38615610ca35773ffffffffffffffffffffffffffffffffffffffff8b1660008181526001602090815260408083204390819055878452600383528184205592825260029052208390555b5050505050505050505050565b60026020526000908152604090205481565b804210610cfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff9061234c565b50565b3290565b4190565b4490565b600080610d1683611a9b565b9150915060008473ffffffffffffffffffffffffffffffffffffffff16638c3f5563846040518263ffffffff1660e01b8152600401610d559190612190565b60206040518083038186803b158015610d6d57600080fd5b505afa158015610d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da59190611e8e565b905081811015610de1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906122ef565b5050505050565b3a90565b3b90565b60408051603f833b9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092528181529080600060208401853c50919050565b4590565b4090565b60016020526000908152604090205481565b4290565b606080825167ffffffffffffffff81118015610e6e57600080fd5b50604051908082528060200260200182016040528015610e98578160200160208202803683370190505b509150825167ffffffffffffffff81118015610eb357600080fd5b50604051908082528060200260200182016040528015610ee757816020015b6060815260200190600190039081610ed25790505b50905060005b83518110156110bd576000848281518110610f0457fe5b60200260200101519050806000015115610f4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612489565b80604001515a1015610f88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612292565b806060015173ffffffffffffffffffffffffffffffffffffffff1681608001518260400151600014610fbe578260400151610fc0565b5a5b908360a00151604051610fd39190611f81565b600060405180830381858888f193505050503d8060008114611011576040519150601f19603f3d011682016040523d82523d6000602084013e611016565b606091505b5085848151811061102357fe5b6020026020010185858151811061103657fe5b602002602001018290528215151515815250505083828151811061105657fe5b60200260200101518061107e575084828151811061107057fe5b602002602001015160200151155b6110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612235565b50600101610eed565b50915091565b6020810151815160f09190911c9060029081111561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061272b6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161115157fe5b84518111156111ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061285d6026913960400191505060405180910390fd5b9250925092565b8082016020015160601c601482018281116111c957fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806127086023913960400191505060405180910390fd5b9250929050565b60408051604280825260808201909252606091600091906020820181803683370190505091508284016020018051602084015260208101516040840152602281015160428401525060428301905082811161128157fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806127fe6023913960400191505060405180910390fd5b60008151604214611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806126ce603a913960400191505060405180910390fd5b60008260018451038151811061134957fe5b602001015160f81c60f81b60f81c60ff16905060008360408151811061136b57fe5b016020015160f81c905060006113818582611ab4565b90506000611390866020611ab4565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561140b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612691603d913960400191505060405180910390fd5b8260ff16601b1415801561142357508260ff16601c14155b15611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612752603d913960400191505060405180910390fd5b60018414156114ed5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156114dc573d6000803e3d6000fd5b5050506020604051035194506115ef565b600284141561159e5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156114dc573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612821603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851661165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061278f6030913960400191505060405180910390fd5b5050505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f600ba597427f042bcd559a0d06fa1732cc104d6dd43cbe8845b5a0e804b2b39f60405160405180910390a380156116ee5773ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090204390555b505050565b8082016020015160f01c6002820182811161170a57fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806128a46022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561177f57600080fd5b506040519080825280601f01601f1916602001820160405280156117aa576020820181803683370190505b509150838501602001600060205b858110156117d1579082015184820152602081016117b8565b84860160200180519390920151908501525250828201838110156117f157fe5b845181111561184b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128836021913960400191505060405180910390fd5b935093915050565b6000808260018451038151811061186657fe5b016020015160f81c9050600181148061187f5750600281145b156118c3578373ffffffffffffffffffffffffffffffffffffffff166118a586856112db565b73ffffffffffffffffffffffffffffffffffffffff16149150611a93565b6003811415611a425782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b8381101561197d578181015183820152602001611965565b50505050905090810190601f1680156119aa5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b1580156119c857600080fd5b505afa1580156119dc573d6000803e3d6000fd5b505050506040513d60208110156119f257600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611a93565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f8152602001806127bf603f913960400191505060405180910390fd5b509392505050565b606081901c916bffffffffffffffffffffffff90911690565b60008160200183511015611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806128c6603c913960400191505060405180910390fd5b50016020015190565b604080518082019091526000808252602082015290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461082357600080fd5b8035801515811461082357600080fd5b600082601f830112611b77578081fd5b813567ffffffffffffffff811115611b8b57fe5b611bbc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161263c565b818152846020838601011115611bd0578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611bfb578081fd5b611c0482611b33565b9392505050565b600080600080600060a08688031215611c22578081fd5b611c2b86611b33565b94506020860135935060408601359250606086013567ffffffffffffffff811115611c54578182fd5b611c6088828901611b67565b925050611c6f60808701611b57565b90509295509295909350565b60008060408385031215611c8d578182fd5b611c9683611b33565b946020939093013593505050565b600080600080600060808688031215611cbb578081fd5b611cc486611b33565b945060208601359350604086013567ffffffffffffffff80821115611ce7578283fd5b818801915088601f830112611cfa578283fd5b813581811115611d08578384fd5b896020604083028501011115611d1c578384fd5b602083019550809450505050611c6f60608701611b57565b60006020808385031215611d46578182fd5b823567ffffffffffffffff80821115611d5d578384fd5b818501915085601f830112611d70578384fd5b813581811115611d7c57fe5b611d89848583020161263c565b81815284810190848601875b84811015611e67578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215611dd3578a8bfd5b604080518281018181108b82111715611de857fe5b8252611df5848d01611b57565b8152611e02828501611b57565b8c82015260608085013583830152611e1c60808601611b33565b9082015260a08481013560808301529284013592915089831115611e3e578c8dfd5b611e4c8f8d85870101611b67565b91810191909152865250509287019290870190600101611d95565b50909998505050505050505050565b600060208284031215611e87578081fd5b5035919050565b600060208284031215611e9f578081fd5b5051919050565b60008151808452611ebe816020860160208601612660565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260040190565b60008251611f93818460208701612660565b9190910192915050565b7f19010000000000000000000000000000000000000000000000000000000000008152600281019390935260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166022830152603682015260560190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080825283519082018190526000906020906060840190828701845b8281101561205c57815115158452928401929084019060010161203e565b5050508381038285015284518082528282019080840283018401878501865b83811015611e67577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526120b5838351611ea6565b9487019492509086019060010161207b565b6020808252818101839052600090604080840186845b8781101561211e578135835273ffffffffffffffffffffffffffffffffffffffff612109868401611b33565b168386015291830191908301906001016120dd565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156121835781518051855286015173ffffffffffffffffffffffffffffffffffffffff16868501529284019290850190600101612148565b5091979650505050505050565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b600060208252611c046020830184611ea6565b6020808252603a908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f5349474e41545552455f464c4147000000000000606082015260800190565b60208082526027908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2043414c4c5f5260408201527f4556455254454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a204e4f545f454e60408201527f4f5547485f474153000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f526571756972655574696c7323726571756972654d696e4e6f6e63653a204e4f60408201527f4e43455f42454c4f575f52455155495245440000000000000000000000000000606082015260800190565b60208082526027908201527f526571756972655574696c7323726571756972654e6f6e457870697265643a2060408201527f4558504952454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526048908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20554e45585045435445445f434f554e5445524641435455414c5f494d60608201527f4147455f48415348000000000000000000000000000000000000000000000000608082015260a00190565b60208082526032908201527f4d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a60408201527f20494e56414c49445f5349474e41545552450000000000000000000000000000606082015260800190565b60208082526032908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2064656c65676160408201527f746543616c6c206e6f7420616c6c6f7765640000000000000000000000000000606082015260800190565b60208082526039908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f4d454d424552535f434f554e5400000000000000606082015260800190565b60208082526031908201527f526571756972655574696c73237075626c697368436f6e6669673a20554e455860408201527f5045435445445f494d4147455f48415348000000000000000000000000000000606082015260800190565b602080825260409082018190527f526571756972655574696c73237075626c697368436f6e6669673a20554e4558908201527f5045435445445f434f554e5445524641435455414c5f494d4147455f48415348606082015260800190565b600061ffff841682526040602083015261261b6040830184611ea6565b949350505050565b60008382526040602083015261261b6040830184611ea6565b60405181810167ffffffffffffffff8111828210171561265857fe5b604052919050565b60005b8381101561267b578181015183820152602001612663565b8381111561268a576000848401525b5050505056fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544a26469706673582212200abb842b6eea58df953f048e3a9aa7589fd3ce15ca086e43b61cdb0c0c42723564736f6c63430007060033603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3', + deployedBytecode: + '0x6080604052600436106101805760003560e01c806398f9fbc4116100d6578063d1db39071161007f578063e90f13e711610059578063e90f13e714610395578063f209883a146103ea578063ffd7d741146103ff57610180565b8063d1db390714610395578063d5b5337f146103aa578063e717aba9146103ca57610180565b8063c272d5c3116100b0578063c272d5c314610333578063c39f2d5c14610348578063c66764e11461036857610180565b806398f9fbc4146102e9578063aeea5fb5146102fe578063b472f0a21461031357610180565b806348acd29f116101385780637ae99638116101125780637ae99638146102875780637f29d538146102a7578063984395bc146102c757610180565b806348acd29f14610227578063543196eb146102475780637082503b1461026757610180565b80631cd05dc4116101695780631cd05dc4146101d057806343d9c935146101f057806344d466c21461020557610180565b80630fdecfac146101855780631551f0ab146101b0575b600080fd5b34801561019157600080fd5b5061019a610420565b6040516101a79190612190565b60405180910390f35b3480156101bc57600080fd5b5061019a6101cb366004611e76565b610424565b3480156101dc57600080fd5b5061019a6101eb366004611bea565b610436565b3480156101fc57600080fd5b5061019a610448565b34801561021157600080fd5b50610225610220366004611ca4565b610450565b005b34801561023357600080fd5b5061019a610242366004611bea565b61080a565b34801561025357600080fd5b5061019a610262366004611bea565b610828565b34801561027357600080fd5b50610225610282366004611c0b565b61082c565b34801561029357600080fd5b5061019a6102a2366004611bea565b610cb0565b3480156102b357600080fd5b506102256102c2366004611e76565b610cc2565b3480156102d357600080fd5b506102dc610cfe565b6040516101a79190612000565b3480156102f557600080fd5b506102dc610d02565b34801561030a57600080fd5b5061019a610d06565b34801561031f57600080fd5b5061022561032e366004611c7b565b610d0a565b34801561033f57600080fd5b5061019a610de8565b34801561035457600080fd5b5061019a610363366004611bea565b610dec565b34801561037457600080fd5b50610388610383366004611bea565b610df0565b6040516101a791906121c5565b3480156103a157600080fd5b5061019a610e35565b3480156103b657600080fd5b5061019a6103c5366004611e76565b610e39565b3480156103d657600080fd5b5061019a6103e5366004611bea565b610e3d565b3480156103f657600080fd5b5061019a610e4f565b61041261040d366004611d34565b610e53565b6040516101a7929190612021565b4690565b60036020526000908152604090205481565b60006020819052908152604090205481565b60005a905090565b8360005b838110156104e9578185858381811061046957fe5b9050604002016000013586868481811061047f57fe5b90506040020160200160208101906104979190611bea565b6040516020016104a993929190612199565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209150600101610454565b506000808773ffffffffffffffffffffffffffffffffffffffff166351605d8060e01b60405160200161051c9190611f54565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261055491611f81565b6000604051808303816000865af19150503d8060008114610591576040519150601f19603f3d011682016040523d82523d6000602084013e610596565b606091505b50915091508180156105a9575080516020145b1561060e576000818060200190518101906105c49190611e8e565b9050838114610608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612543565b60405180910390fd5b50610732565b60405173ffffffffffffffffffffffffffffffffffffffff89169061069d907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009087907f000000000000000000000000000000000000000000000000000000000000000090602001611ef0565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906125a0565b83156107325773ffffffffffffffffffffffffffffffffffffffff881660009081526002602052604090208390555b828873ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee89898960405160200161077f9291906120c7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526107b89291612623565b60405180910390a383156108005773ffffffffffffffffffffffffffffffffffffffff8816600090815260016020908152604080832043908190558684526003909252909120555b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116315b919050565b3f90565b600080610838846110c3565b9150915060008046905080898960405160200161085793929190611f9d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012091505061ffff831660008767ffffffffffffffff811180156108ae57600080fd5b506040519080825280602002602001820160405280156108e857816020015b6108d5611b1c565b8152602001906001900390816108cd5790505b50905060005b8751851015610a9f57600080806109058b89611131565b995060ff9182169450169150600183141561092d576109248b896111b2565b98509050610a20565b8261095f57606061093e8c8a61122a565b9950905061094c88826112db565b91506109598f838d611665565b50610a20565b60028314156109ee576109728b896111b2565b9850905060006109828c8a6116f3565b995061ffff16905060606109978d8b84611764565b9a5090506109a6898483611853565b6109dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff9061242c565b50506109e98e828c611665565b610a20565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906121d8565b60405180604001604052808381526020018273ffffffffffffffffffffffffffffffffffffffff16815250858581518110610a5757fe5b60200260200101819052508380600101945050858282604051602001610a7f93929190612199565b6040516020818303038152906040528051906020012095505050506108ee565b888114610ad8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906124e6565b60405173ffffffffffffffffffffffffffffffffffffffff8c1690610b67907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009087907f000000000000000000000000000000000000000000000000000000000000000090602001611ef0565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906123a9565b828b73ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee8885604051602001610c18919061212b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610c5192916125fe565b60405180910390a38615610ca35773ffffffffffffffffffffffffffffffffffffffff8b1660008181526001602090815260408083204390819055878452600383528184205592825260029052208390555b5050505050505050505050565b60026020526000908152604090205481565b804210610cfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff9061234c565b50565b3290565b4190565b4490565b600080610d1683611a9b565b9150915060008473ffffffffffffffffffffffffffffffffffffffff16638c3f5563846040518263ffffffff1660e01b8152600401610d559190612190565b60206040518083038186803b158015610d6d57600080fd5b505afa158015610d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da59190611e8e565b905081811015610de1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906122ef565b5050505050565b3a90565b3b90565b60408051603f833b9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092528181529080600060208401853c50919050565b4590565b4090565b60016020526000908152604090205481565b4290565b606080825167ffffffffffffffff81118015610e6e57600080fd5b50604051908082528060200260200182016040528015610e98578160200160208202803683370190505b509150825167ffffffffffffffff81118015610eb357600080fd5b50604051908082528060200260200182016040528015610ee757816020015b6060815260200190600190039081610ed25790505b50905060005b83518110156110bd576000848281518110610f0457fe5b60200260200101519050806000015115610f4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612489565b80604001515a1015610f88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612292565b806060015173ffffffffffffffffffffffffffffffffffffffff1681608001518260400151600014610fbe578260400151610fc0565b5a5b908360a00151604051610fd39190611f81565b600060405180830381858888f193505050503d8060008114611011576040519150601f19603f3d011682016040523d82523d6000602084013e611016565b606091505b5085848151811061102357fe5b6020026020010185858151811061103657fe5b602002602001018290528215151515815250505083828151811061105657fe5b60200260200101518061107e575084828151811061107057fe5b602002602001015160200151155b6110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612235565b50600101610eed565b50915091565b6020810151815160f09190911c9060029081111561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061272b6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161115157fe5b84518111156111ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061285d6026913960400191505060405180910390fd5b9250925092565b8082016020015160601c601482018281116111c957fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806127086023913960400191505060405180910390fd5b9250929050565b60408051604280825260808201909252606091600091906020820181803683370190505091508284016020018051602084015260208101516040840152602281015160428401525060428301905082811161128157fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806127fe6023913960400191505060405180910390fd5b60008151604214611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806126ce603a913960400191505060405180910390fd5b60008260018451038151811061134957fe5b602001015160f81c60f81b60f81c60ff16905060008360408151811061136b57fe5b016020015160f81c905060006113818582611ab4565b90506000611390866020611ab4565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561140b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612691603d913960400191505060405180910390fd5b8260ff16601b1415801561142357508260ff16601c14155b15611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612752603d913960400191505060405180910390fd5b60018414156114ed5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156114dc573d6000803e3d6000fd5b5050506020604051035194506115ef565b600284141561159e5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156114dc573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612821603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851661165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061278f6030913960400191505060405180910390fd5b5050505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f600ba597427f042bcd559a0d06fa1732cc104d6dd43cbe8845b5a0e804b2b39f60405160405180910390a380156116ee5773ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090204390555b505050565b8082016020015160f01c6002820182811161170a57fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806128a46022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561177f57600080fd5b506040519080825280601f01601f1916602001820160405280156117aa576020820181803683370190505b509150838501602001600060205b858110156117d1579082015184820152602081016117b8565b84860160200180519390920151908501525250828201838110156117f157fe5b845181111561184b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128836021913960400191505060405180910390fd5b935093915050565b6000808260018451038151811061186657fe5b016020015160f81c9050600181148061187f5750600281145b156118c3578373ffffffffffffffffffffffffffffffffffffffff166118a586856112db565b73ffffffffffffffffffffffffffffffffffffffff16149150611a93565b6003811415611a425782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b8381101561197d578181015183820152602001611965565b50505050905090810190601f1680156119aa5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b1580156119c857600080fd5b505afa1580156119dc573d6000803e3d6000fd5b505050506040513d60208110156119f257600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611a93565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f8152602001806127bf603f913960400191505060405180910390fd5b509392505050565b606081901c916bffffffffffffffffffffffff90911690565b60008160200183511015611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806128c6603c913960400191505060405180910390fd5b50016020015190565b604080518082019091526000808252602082015290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461082357600080fd5b8035801515811461082357600080fd5b600082601f830112611b77578081fd5b813567ffffffffffffffff811115611b8b57fe5b611bbc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161263c565b818152846020838601011115611bd0578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611bfb578081fd5b611c0482611b33565b9392505050565b600080600080600060a08688031215611c22578081fd5b611c2b86611b33565b94506020860135935060408601359250606086013567ffffffffffffffff811115611c54578182fd5b611c6088828901611b67565b925050611c6f60808701611b57565b90509295509295909350565b60008060408385031215611c8d578182fd5b611c9683611b33565b946020939093013593505050565b600080600080600060808688031215611cbb578081fd5b611cc486611b33565b945060208601359350604086013567ffffffffffffffff80821115611ce7578283fd5b818801915088601f830112611cfa578283fd5b813581811115611d08578384fd5b896020604083028501011115611d1c578384fd5b602083019550809450505050611c6f60608701611b57565b60006020808385031215611d46578182fd5b823567ffffffffffffffff80821115611d5d578384fd5b818501915085601f830112611d70578384fd5b813581811115611d7c57fe5b611d89848583020161263c565b81815284810190848601875b84811015611e67578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215611dd3578a8bfd5b604080518281018181108b82111715611de857fe5b8252611df5848d01611b57565b8152611e02828501611b57565b8c82015260608085013583830152611e1c60808601611b33565b9082015260a08481013560808301529284013592915089831115611e3e578c8dfd5b611e4c8f8d85870101611b67565b91810191909152865250509287019290870190600101611d95565b50909998505050505050505050565b600060208284031215611e87578081fd5b5035919050565b600060208284031215611e9f578081fd5b5051919050565b60008151808452611ebe816020860160208601612660565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260040190565b60008251611f93818460208701612660565b9190910192915050565b7f19010000000000000000000000000000000000000000000000000000000000008152600281019390935260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166022830152603682015260560190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080825283519082018190526000906020906060840190828701845b8281101561205c57815115158452928401929084019060010161203e565b5050508381038285015284518082528282019080840283018401878501865b83811015611e67577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526120b5838351611ea6565b9487019492509086019060010161207b565b6020808252818101839052600090604080840186845b8781101561211e578135835273ffffffffffffffffffffffffffffffffffffffff612109868401611b33565b168386015291830191908301906001016120dd565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156121835781518051855286015173ffffffffffffffffffffffffffffffffffffffff16868501529284019290850190600101612148565b5091979650505050505050565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b600060208252611c046020830184611ea6565b6020808252603a908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f5349474e41545552455f464c4147000000000000606082015260800190565b60208082526027908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2043414c4c5f5260408201527f4556455254454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a204e4f545f454e60408201527f4f5547485f474153000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f526571756972655574696c7323726571756972654d696e4e6f6e63653a204e4f60408201527f4e43455f42454c4f575f52455155495245440000000000000000000000000000606082015260800190565b60208082526027908201527f526571756972655574696c7323726571756972654e6f6e457870697265643a2060408201527f4558504952454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526048908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20554e45585045435445445f434f554e5445524641435455414c5f494d60608201527f4147455f48415348000000000000000000000000000000000000000000000000608082015260a00190565b60208082526032908201527f4d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a60408201527f20494e56414c49445f5349474e41545552450000000000000000000000000000606082015260800190565b60208082526032908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2064656c65676160408201527f746543616c6c206e6f7420616c6c6f7765640000000000000000000000000000606082015260800190565b60208082526039908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f4d454d424552535f434f554e5400000000000000606082015260800190565b60208082526031908201527f526571756972655574696c73237075626c697368436f6e6669673a20554e455860408201527f5045435445445f494d4147455f48415348000000000000000000000000000000606082015260800190565b602080825260409082018190527f526571756972655574696c73237075626c697368436f6e6669673a20554e4558908201527f5045435445445f434f554e5445524641435455414c5f494d4147455f48415348606082015260800190565b600061ffff841682526040602083015261261b6040830184611ea6565b949350505050565b60008382526040602083015261261b6040830184611ea6565b60405181810167ffffffffffffffff8111828210171561265857fe5b604052919050565b60005b8381101561267b578181015183820152602001612663565b8381111561268a576000848401525b5050505056fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544a26469706673582212200abb842b6eea58df953f048e3a9aa7589fd3ce15ca086e43b61cdb0c0c42723564736f6c63430007060033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v1/index.ts b/packages/tests/src/builds/v1/index.ts new file mode 100644 index 000000000..a4c3cd41a --- /dev/null +++ b/packages/tests/src/builds/v1/index.ts @@ -0,0 +1,6 @@ +export { factory } from './artifacts/Factory' +export { guestModule } from './artifacts/GuestModule' +export { mainModule } from './artifacts/MainModule' +export { mainModuleUpgradable } from './artifacts/MainModuleUpgradable' +export { multiCallUtils } from './artifacts/MultiCallUtils' +export { sequenceUtils } from './artifacts/SequenceUtils' diff --git a/packages/tests/src/builds/v2/artifacts/Factory.ts b/packages/tests/src/builds/v2/artifacts/Factory.ts new file mode 100644 index 000000000..ff1a54fc2 --- /dev/null +++ b/packages/tests/src/builds/v2/artifacts/Factory.ts @@ -0,0 +1,37 @@ +export const factory = { + _format: 'hh-sol-artifact-1', + contractName: 'Factory', + sourceName: 'contracts/Factory.sol', + abi: [ + { + inputs: [ + { + internalType: 'address', + name: '_mainModule', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_salt', + type: 'bytes32' + } + ], + name: 'deploy', + outputs: [ + { + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b5061019a806100206000396000f3fe60806040526004361061001e5760003560e01c806332c02a1414610023575b600080fd5b6100366100313660046100c5565b61005f565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60008060405180606001604052806028815260200161013d602891398473ffffffffffffffffffffffffffffffffffffffff166040516020016100a392919061010a565b60405160208183030381529060405290508281516020830134f5949350505050565b600080604083850312156100d857600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146100fc57600080fd5b946020939093013593505050565b6000835160005b8181101561012b5760208187018101518583015201610111565b50919091019182525060200191905056fe603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3a264697066735822122043a67ce1dd84e0676792a0fadb81e020ae20ed22debbddf46c2790ea0338256464736f6c63430008110033', + deployedBytecode: + '0x60806040526004361061001e5760003560e01c806332c02a1414610023575b600080fd5b6100366100313660046100c5565b61005f565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b60008060405180606001604052806028815260200161013d602891398473ffffffffffffffffffffffffffffffffffffffff166040516020016100a392919061010a565b60405160208183030381529060405290508281516020830134f5949350505050565b600080604083850312156100d857600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146100fc57600080fd5b946020939093013593505050565b6000835160005b8181101561012b5760208187018101518583015201610111565b50919091019182525060200191905056fe603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3a264697066735822122043a67ce1dd84e0676792a0fadb81e020ae20ed22debbddf46c2790ea0338256464736f6c63430008110033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v2/artifacts/GuestModule.ts b/packages/tests/src/builds/v2/artifacts/GuestModule.ts new file mode 100644 index 000000000..9e0e81e75 --- /dev/null +++ b/packages/tests/src/builds/v2/artifacts/GuestModule.ts @@ -0,0 +1,628 @@ +export const guestModule = { + _format: 'hh-sol-artifact-1', + contractName: 'GuestModule', + sourceName: 'contracts/modules/GuestModule.sol', + abi: [ + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_provided', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_current', + type: 'uint256' + } + ], + name: 'BadNonce', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_index', + type: 'uint256' + } + ], + name: 'DelegateCallNotAllowed', + type: 'error' + }, + { + inputs: [], + name: 'ImageHashIsZero', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'address', + name: '_addr', + type: 'address' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidNestedSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'bytes32', + name: '_s', + type: 'bytes32' + } + ], + name: 'InvalidSValue', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_flag', + type: 'uint256' + } + ], + name: 'InvalidSignatureFlag', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidSignatureLength', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes1', + name: '_type', + type: 'bytes1' + } + ], + name: 'InvalidSignatureType', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_v', + type: 'uint256' + } + ], + name: 'InvalidVValue', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: 'threshold', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_weight', + type: 'uint256' + } + ], + name: 'LowWeightChainedSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_index', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_requested', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_available', + type: 'uint256' + } + ], + name: 'NotEnoughGas', + type: 'error' + }, + { + inputs: [], + name: 'NotSupported', + type: 'error' + }, + { + inputs: [ + { + internalType: 'address', + name: '_sender', + type: 'address' + }, + { + internalType: 'address', + name: '_self', + type: 'address' + } + ], + name: 'OnlySelfAuth', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'SignerIsAddress0', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_type', + type: 'uint256' + }, + { + internalType: 'bool', + name: '_recoverMode', + type: 'bool' + } + ], + name: 'UnsupportedSignatureType', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_current', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_prev', + type: 'uint256' + } + ], + name: 'WrongChainedCheckpointOrder', + type: 'error' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + name: 'CreatedContract', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: 'newImageHash', + type: 'bytes32' + } + ], + name: 'ImageHashUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + indexed: false, + internalType: 'uint256', + name: '_newNonce', + type: 'uint256' + } + ], + name: 'NonceChange', + type: 'event' + }, + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + } + ], + name: 'TxExecuted', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'bytes', + name: '_reason', + type: 'bytes' + } + ], + name: 'TxFailed', + type: 'event' + }, + { + inputs: [], + name: 'SET_IMAGE_HASH_TYPE_HASH', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_code', + type: 'bytes' + } + ], + name: 'createContract', + outputs: [ + { + internalType: 'address', + name: 'addr', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'execute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signatures', + type: 'bytes' + } + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_data', + type: 'bytes' + }, + { + internalType: 'bytes', + name: '_signatures', + 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: '_space', + type: 'uint256' + } + ], + name: 'readNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'selfExecute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'signatureRecovery', + outputs: [ + { + internalType: 'uint256', + name: 'threshold', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'weight', + type: 'uint256' + }, + { + internalType: 'bytes32', + name: 'imageHash', + type: 'bytes32' + }, + { + internalType: 'bytes32', + name: 'subDigest', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: 'checkpoint', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_interfaceID', + type: 'bytes4' + } + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + } + ], + name: 'updateImageHash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b5061210b806100206000396000f3fe6080604052600436106100bc5760003560e01c806361c2926c116100745780638c3f55631161004e5780638c3f55631461025357806390042baf14610273578063affed0e0146102ab57600080fd5b806361c2926c146101cb5780637a9a1628146101eb578063853c50681461020b57600080fd5b806320c13b0b116100a557806320c13b0b14610147578063295614261461016757806357c56d6b1461018957600080fd5b806301ffc9a7146100c15780631626ba7e146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046117cc565b6102c0565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b50610116610111366004611832565b6102d1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ed565b34801561015357600080fd5b5061011661016236600461187e565b61031e565b34801561017357600080fd5b506101876101823660046118ea565b610383565b005b34801561019557600080fd5b506101bd7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b6040519081526020016100ed565b3480156101d757600080fd5b506101876101e6366004611948565b6103d5565b3480156101f757600080fd5b5061018761020636600461198a565b61041a565b34801561021757600080fd5b5061022b610226366004611832565b610447565b604080519586526020860194909452928401919091526060830152608082015260a0016100ed565b34801561025f57600080fd5b506101bd61026e3660046118ea565b61060f565b610286610281366004611a33565b61063b565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b3480156102b757600080fd5b506101bd6106d7565b60006102cb826106e8565b92915050565b6000806102df858585610744565b509050801561031157507f1626ba7e000000000000000000000000000000000000000000000000000000009050610317565b50600090505b9392505050565b6000806103438686604051610334929190611b02565b60405180910390208585610744565b509050801561037557507f20c13b0b00000000000000000000000000000000000000000000000000000000905061037b565b50600090505b949350505050565b3330146103c9576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b6103d28161077c565b50565b600061040883836040516020016103ed929190611ce0565b604051602081830303815290604052805190602001206107ae565b9050610415818484610833565b505050565b600061043286866040516020016103ed929190611d28565b905061043f818787610833565b505050505050565b6000806000806000808787600081811061046357610463611d70565b909101357fff000000000000000000000000000000000000000000000000000000000000001691508190506104b95761049b896107ae565b92506104a8838989610996565b929850909650945091506106049050565b7fff00000000000000000000000000000000000000000000000000000000000000818116016104f8576104eb896107ae565b92506104a88389896109e7565b7ffe000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082160161054a576104eb89610a13565b7ffd000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216016105ae5761059e898989610a80565b9550955095509550955050610604565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff00000000000000000000000000000000000000000000000000000000000000821660048201526024016103c0565b939792965093509350565b60006102cb7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610bfd565b600033301461067e576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016103c0565b81516020830134f060405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b60006106e3600061060f565b905090565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161073b57506001919050565b6102cb82610c5b565b6000806000806000610757888888610447565b5096509194509250905082821080159061076f575060015b9450505050935093915050565b6040517fa038794000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b8181101561098f573684848381811061085257610852611d70565b90506020028101906108649190611d9f565b90506108736020820182611ddd565b156108ad576040517f230d1ccc000000000000000000000000000000000000000000000000000000008152600481018390526024016103c0565b6040810135805a10156109005782815a6040517f2bb3e3ba0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016103c0565b600061093a6109156080850160608601611df8565b608085013584156109265784610928565b5a5b61093560a0880188611e13565b610cb7565b905080156109585760405188815260200160405180910390a0610979565b61097961096b6040850160208601611ddd565b89610974610cd4565b610cf3565b505050808061098790611ea7565b915050610837565b5050505050565b60008080806109b1876109ac876006818b611edf565b610d3f565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080610a02876109fd876001818b611edf565b610996565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601610816565b6000808080806004600188013560e81c82610a9b8383611f09565b9050610aad8b61022683868d8f611edf565b939b5091995097509550935087871015610b0557610acd81848b8d611edf565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c09493929190611f1c565b8092505b88831015610bef5760038301928a013560e81c9150610b288383611f09565b90506000610b4a610b38886111d5565b8c8c8790869261022693929190611edf565b939c50919a5098509091505088881015610ba257610b6a82858c8e611edf565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c09493929190611f1c565b848110610be5576040517f37daf62b00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016103c0565b9350915081610b09565b505050939792965093509350565b6000808383604051602001610c1c929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610cae57506001919050565b6102cb82611209565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b8215610d0157805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051610d32929190611f43565b60405180910390a1505050565b60008060005b838110156111cc57600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101610de657601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff000000000000000000000000000000000000000016811785610dcc5780610ddb565b60008681526020829052604090205b955050505050610d45565b80610e7c5760018201918681013560f81c906043016000610e128a610e0d84888c8e611edf565b6112f3565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161786610e615780610e70565b60008781526020829052604090205b96505050505050610d45565b60028103610fa4576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff169150809650819250505060008186019050610ef58b848c8c8a908692610ef093929190611edf565b6115b6565b610f3d578a83610f0783898d8f611edf565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016103c09493929190611fb7565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161787610f885780610f97565b60008881526020829052604090205b9750505050505050610d45565b60038103610fd757602082019186013583610fbf5780610fce565b60008481526020829052604090205b93505050610d45565b60048103611023576003808301928781013560e81c91908201016000806110048b6109ac85898d8f611edf565b60009889526020526040909720969097019650909350610d4592505050565b6006810361112b5760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506000806110918d8d8d8b9087926109ac93929190611edf565b939850889390925090508482106110a757988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a905283518084039091018152609890920190925280519101208961110d578061111c565b60008a81526020829052604090205b99505050505050505050610d45565b60058103611197576020820191860135878103611166577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b600061117182611763565b90508461117e578061118d565b60008581526020829052604090205b9450505050610d45565b6040517fb2505f7c000000000000000000000000000000000000000000000000000000008152600481018290526024016103c0565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d160009081526020829052604081206102cb565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e00000000000000000000000000000000000000000000000000000000148061129c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b156112a957506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102cb565b6000604282146113335782826040517f2ee17a3d0000000000000000000000000000000000000000000000000000000081526004016103c0929190611ff7565b600061134c61134360018561200b565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111156113c0578686826040517fad4aac760000000000000000000000000000000000000000000000000000000081526004016103c09392919061201e565b8260ff16601b141580156113d857508260ff16601c14155b15611415578686846040517fe578897e0000000000000000000000000000000000000000000000000000000081526004016103c093929190612042565b60018403611482576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa158015611471573d6000803e3d6000fd5b50505060206040510351945061155a565b6002840361151f576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a00161144f565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c09493929190612069565b73ffffffffffffffffffffffffffffffffffffffff85166115ab5786866040517f6c1719d20000000000000000000000000000000000000000000000000000000081526004016103c0929190611ff7565b505050509392505050565b60008083836115c660018261200b565b8181106115d5576115d5611d70565b919091013560f81c91505060018114806115ef5750600281145b15611634578473ffffffffffffffffffffffffffffffffffffffff166116168786866112f3565b73ffffffffffffffffffffffffffffffffffffffff1614915061175a565b6003810361171f5773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e878660008761166860018261200b565b9261167593929190611edf565b6040518463ffffffff1660e01b815260040161169393929190612095565b602060405180830381865afa1580156116b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d491906120b8565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014915061175a565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c09493929190612069565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801610816565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146103d257600080fd5b6000602082840312156117de57600080fd5b81356103178161179e565b60008083601f8401126117fb57600080fd5b50813567ffffffffffffffff81111561181357600080fd5b60208301915083602082850101111561182b57600080fd5b9250929050565b60008060006040848603121561184757600080fd5b83359250602084013567ffffffffffffffff81111561186557600080fd5b611871868287016117e9565b9497909650939450505050565b6000806000806040858703121561189457600080fd5b843567ffffffffffffffff808211156118ac57600080fd5b6118b8888389016117e9565b909650945060208701359150808211156118d157600080fd5b506118de878288016117e9565b95989497509550505050565b6000602082840312156118fc57600080fd5b5035919050565b60008083601f84011261191557600080fd5b50813567ffffffffffffffff81111561192d57600080fd5b6020830191508360208260051b850101111561182b57600080fd5b6000806020838503121561195b57600080fd5b823567ffffffffffffffff81111561197257600080fd5b61197e85828601611903565b90969095509350505050565b6000806000806000606086880312156119a257600080fd5b853567ffffffffffffffff808211156119ba57600080fd5b6119c689838a01611903565b90975095506020880135945060408801359150808211156119e657600080fd5b506119f3888289016117e9565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611a4557600080fd5b813567ffffffffffffffff80821115611a5d57600080fd5b818401915084601f830112611a7157600080fd5b813581811115611a8357611a83611a04565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611ac957611ac9611a04565b81604052828152876020848701011115611ae257600080fd5b826020860160208301376000928101602001929092525095945050505050565b8183823760009101908152919050565b80358015158114611b2257600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611b2257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b818352600060208085019450848460051b86018460005b87811015611cd357838303895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41883603018112611bea57600080fd5b870160c0611bf782611b12565b15158552611c06878301611b12565b15158588015260408281013590860152606073ffffffffffffffffffffffffffffffffffffffff611c38828501611b27565b16908601526080828101359086015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611c7e57600080fd5b90920187810192903567ffffffffffffffff811115611c9c57600080fd5b803603841315611cab57600080fd5b8282880152611cbd8388018286611b4b565b9c89019c96505050928601925050600101611bab565b5090979650505050505050565b60408152600560408201527f73656c663a000000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611b94565b60408152600660408201527f67756573743a0000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611b94565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112611dd357600080fd5b9190910192915050565b600060208284031215611def57600080fd5b61031782611b12565b600060208284031215611e0a57600080fd5b61031782611b27565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e4857600080fd5b83018035915067ffffffffffffffff821115611e6357600080fd5b60200191503681900382131561182b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ed857611ed8611e78565b5060010190565b60008085851115611eef57600080fd5b83861115611efc57600080fd5b5050820193919092039150565b808201808211156102cb576102cb611e78565b606081526000611f30606083018688611b4b565b6020830194909452506040015292915050565b82815260006020604081840152835180604085015260005b81811015611f7757858101830151858201606001528201611f5b565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000611fed606083018486611b4b565b9695505050505050565b60208152600061037b602083018486611b4b565b818103818111156102cb576102cb611e78565b604081526000612032604083018587611b4b565b9050826020830152949350505050565b604081526000612056604083018587611b4b565b905060ff83166020830152949350505050565b60608152600061207d606083018688611b4b565b60208301949094525090151560409091015292915050565b8381526040602082015260006120af604083018486611b4b565b95945050505050565b6000602082840312156120ca57600080fd5b81516103178161179e56fea264697066735822122075ce1ed9c453c8c833ec89aa2911db2e9a1e07c0a29fc3ed180acba619d449be64736f6c63430008110033', + deployedBytecode: + '0x6080604052600436106100bc5760003560e01c806361c2926c116100745780638c3f55631161004e5780638c3f55631461025357806390042baf14610273578063affed0e0146102ab57600080fd5b806361c2926c146101cb5780637a9a1628146101eb578063853c50681461020b57600080fd5b806320c13b0b116100a557806320c13b0b14610147578063295614261461016757806357c56d6b1461018957600080fd5b806301ffc9a7146100c15780631626ba7e146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046117cc565b6102c0565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b50610116610111366004611832565b6102d1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ed565b34801561015357600080fd5b5061011661016236600461187e565b61031e565b34801561017357600080fd5b506101876101823660046118ea565b610383565b005b34801561019557600080fd5b506101bd7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b6040519081526020016100ed565b3480156101d757600080fd5b506101876101e6366004611948565b6103d5565b3480156101f757600080fd5b5061018761020636600461198a565b61041a565b34801561021757600080fd5b5061022b610226366004611832565b610447565b604080519586526020860194909452928401919091526060830152608082015260a0016100ed565b34801561025f57600080fd5b506101bd61026e3660046118ea565b61060f565b610286610281366004611a33565b61063b565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b3480156102b757600080fd5b506101bd6106d7565b60006102cb826106e8565b92915050565b6000806102df858585610744565b509050801561031157507f1626ba7e000000000000000000000000000000000000000000000000000000009050610317565b50600090505b9392505050565b6000806103438686604051610334929190611b02565b60405180910390208585610744565b509050801561037557507f20c13b0b00000000000000000000000000000000000000000000000000000000905061037b565b50600090505b949350505050565b3330146103c9576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b6103d28161077c565b50565b600061040883836040516020016103ed929190611ce0565b604051602081830303815290604052805190602001206107ae565b9050610415818484610833565b505050565b600061043286866040516020016103ed929190611d28565b905061043f818787610833565b505050505050565b6000806000806000808787600081811061046357610463611d70565b909101357fff000000000000000000000000000000000000000000000000000000000000001691508190506104b95761049b896107ae565b92506104a8838989610996565b929850909650945091506106049050565b7fff00000000000000000000000000000000000000000000000000000000000000818116016104f8576104eb896107ae565b92506104a88389896109e7565b7ffe000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082160161054a576104eb89610a13565b7ffd000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216016105ae5761059e898989610a80565b9550955095509550955050610604565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff00000000000000000000000000000000000000000000000000000000000000821660048201526024016103c0565b939792965093509350565b60006102cb7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610bfd565b600033301461067e576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016103c0565b81516020830134f060405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b60006106e3600061060f565b905090565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161073b57506001919050565b6102cb82610c5b565b6000806000806000610757888888610447565b5096509194509250905082821080159061076f575060015b9450505050935093915050565b6040517fa038794000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b8181101561098f573684848381811061085257610852611d70565b90506020028101906108649190611d9f565b90506108736020820182611ddd565b156108ad576040517f230d1ccc000000000000000000000000000000000000000000000000000000008152600481018390526024016103c0565b6040810135805a10156109005782815a6040517f2bb3e3ba0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016103c0565b600061093a6109156080850160608601611df8565b608085013584156109265784610928565b5a5b61093560a0880188611e13565b610cb7565b905080156109585760405188815260200160405180910390a0610979565b61097961096b6040850160208601611ddd565b89610974610cd4565b610cf3565b505050808061098790611ea7565b915050610837565b5050505050565b60008080806109b1876109ac876006818b611edf565b610d3f565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080610a02876109fd876001818b611edf565b610996565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601610816565b6000808080806004600188013560e81c82610a9b8383611f09565b9050610aad8b61022683868d8f611edf565b939b5091995097509550935087871015610b0557610acd81848b8d611edf565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c09493929190611f1c565b8092505b88831015610bef5760038301928a013560e81c9150610b288383611f09565b90506000610b4a610b38886111d5565b8c8c8790869261022693929190611edf565b939c50919a5098509091505088881015610ba257610b6a82858c8e611edf565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c09493929190611f1c565b848110610be5576040517f37daf62b00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016103c0565b9350915081610b09565b505050939792965093509350565b6000808383604051602001610c1c929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610cae57506001919050565b6102cb82611209565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b8215610d0157805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051610d32929190611f43565b60405180910390a1505050565b60008060005b838110156111cc57600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101610de657601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff000000000000000000000000000000000000000016811785610dcc5780610ddb565b60008681526020829052604090205b955050505050610d45565b80610e7c5760018201918681013560f81c906043016000610e128a610e0d84888c8e611edf565b6112f3565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161786610e615780610e70565b60008781526020829052604090205b96505050505050610d45565b60028103610fa4576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff169150809650819250505060008186019050610ef58b848c8c8a908692610ef093929190611edf565b6115b6565b610f3d578a83610f0783898d8f611edf565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016103c09493929190611fb7565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161787610f885780610f97565b60008881526020829052604090205b9750505050505050610d45565b60038103610fd757602082019186013583610fbf5780610fce565b60008481526020829052604090205b93505050610d45565b60048103611023576003808301928781013560e81c91908201016000806110048b6109ac85898d8f611edf565b60009889526020526040909720969097019650909350610d4592505050565b6006810361112b5760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506000806110918d8d8d8b9087926109ac93929190611edf565b939850889390925090508482106110a757988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a905283518084039091018152609890920190925280519101208961110d578061111c565b60008a81526020829052604090205b99505050505050505050610d45565b60058103611197576020820191860135878103611166577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b600061117182611763565b90508461117e578061118d565b60008581526020829052604090205b9450505050610d45565b6040517fb2505f7c000000000000000000000000000000000000000000000000000000008152600481018290526024016103c0565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d160009081526020829052604081206102cb565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e00000000000000000000000000000000000000000000000000000000148061129c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b156112a957506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102cb565b6000604282146113335782826040517f2ee17a3d0000000000000000000000000000000000000000000000000000000081526004016103c0929190611ff7565b600061134c61134360018561200b565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111156113c0578686826040517fad4aac760000000000000000000000000000000000000000000000000000000081526004016103c09392919061201e565b8260ff16601b141580156113d857508260ff16601c14155b15611415578686846040517fe578897e0000000000000000000000000000000000000000000000000000000081526004016103c093929190612042565b60018403611482576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa158015611471573d6000803e3d6000fd5b50505060206040510351945061155a565b6002840361151f576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a00161144f565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c09493929190612069565b73ffffffffffffffffffffffffffffffffffffffff85166115ab5786866040517f6c1719d20000000000000000000000000000000000000000000000000000000081526004016103c0929190611ff7565b505050509392505050565b60008083836115c660018261200b565b8181106115d5576115d5611d70565b919091013560f81c91505060018114806115ef5750600281145b15611634578473ffffffffffffffffffffffffffffffffffffffff166116168786866112f3565b73ffffffffffffffffffffffffffffffffffffffff1614915061175a565b6003810361171f5773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e878660008761166860018261200b565b9261167593929190611edf565b6040518463ffffffff1660e01b815260040161169393929190612095565b602060405180830381865afa1580156116b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d491906120b8565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014915061175a565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c09493929190612069565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801610816565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146103d257600080fd5b6000602082840312156117de57600080fd5b81356103178161179e565b60008083601f8401126117fb57600080fd5b50813567ffffffffffffffff81111561181357600080fd5b60208301915083602082850101111561182b57600080fd5b9250929050565b60008060006040848603121561184757600080fd5b83359250602084013567ffffffffffffffff81111561186557600080fd5b611871868287016117e9565b9497909650939450505050565b6000806000806040858703121561189457600080fd5b843567ffffffffffffffff808211156118ac57600080fd5b6118b8888389016117e9565b909650945060208701359150808211156118d157600080fd5b506118de878288016117e9565b95989497509550505050565b6000602082840312156118fc57600080fd5b5035919050565b60008083601f84011261191557600080fd5b50813567ffffffffffffffff81111561192d57600080fd5b6020830191508360208260051b850101111561182b57600080fd5b6000806020838503121561195b57600080fd5b823567ffffffffffffffff81111561197257600080fd5b61197e85828601611903565b90969095509350505050565b6000806000806000606086880312156119a257600080fd5b853567ffffffffffffffff808211156119ba57600080fd5b6119c689838a01611903565b90975095506020880135945060408801359150808211156119e657600080fd5b506119f3888289016117e9565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611a4557600080fd5b813567ffffffffffffffff80821115611a5d57600080fd5b818401915084601f830112611a7157600080fd5b813581811115611a8357611a83611a04565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611ac957611ac9611a04565b81604052828152876020848701011115611ae257600080fd5b826020860160208301376000928101602001929092525095945050505050565b8183823760009101908152919050565b80358015158114611b2257600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611b2257600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b818352600060208085019450848460051b86018460005b87811015611cd357838303895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41883603018112611bea57600080fd5b870160c0611bf782611b12565b15158552611c06878301611b12565b15158588015260408281013590860152606073ffffffffffffffffffffffffffffffffffffffff611c38828501611b27565b16908601526080828101359086015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611c7e57600080fd5b90920187810192903567ffffffffffffffff811115611c9c57600080fd5b803603841315611cab57600080fd5b8282880152611cbd8388018286611b4b565b9c89019c96505050928601925050600101611bab565b5090979650505050505050565b60408152600560408201527f73656c663a000000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611b94565b60408152600660408201527f67756573743a0000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611b94565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112611dd357600080fd5b9190910192915050565b600060208284031215611def57600080fd5b61031782611b12565b600060208284031215611e0a57600080fd5b61031782611b27565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e4857600080fd5b83018035915067ffffffffffffffff821115611e6357600080fd5b60200191503681900382131561182b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611ed857611ed8611e78565b5060010190565b60008085851115611eef57600080fd5b83861115611efc57600080fd5b5050820193919092039150565b808201808211156102cb576102cb611e78565b606081526000611f30606083018688611b4b565b6020830194909452506040015292915050565b82815260006020604081840152835180604085015260005b81811015611f7757858101830151858201606001528201611f5b565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509392505050565b84815273ffffffffffffffffffffffffffffffffffffffff84166020820152606060408201526000611fed606083018486611b4b565b9695505050505050565b60208152600061037b602083018486611b4b565b818103818111156102cb576102cb611e78565b604081526000612032604083018587611b4b565b9050826020830152949350505050565b604081526000612056604083018587611b4b565b905060ff83166020830152949350505050565b60608152600061207d606083018688611b4b565b60208301949094525090151560409091015292915050565b8381526040602082015260006120af604083018486611b4b565b95945050505050565b6000602082840312156120ca57600080fd5b81516103178161179e56fea264697066735822122075ce1ed9c453c8c833ec89aa2911db2e9a1e07c0a29fc3ed180acba619d449be64736f6c63430008110033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v2/artifacts/MainModule.ts b/packages/tests/src/builds/v2/artifacts/MainModule.ts new file mode 100644 index 000000000..52602897d --- /dev/null +++ b/packages/tests/src/builds/v2/artifacts/MainModule.ts @@ -0,0 +1,1104 @@ +export const mainModule = { + _format: 'hh-sol-artifact-1', + contractName: 'MainModule', + sourceName: 'contracts/modules/MainModule.sol', + abi: [ + { + inputs: [ + { + internalType: 'address', + name: '_factory', + type: 'address' + }, + { + internalType: 'address', + name: '_mainModuleUpgradable', + type: 'address' + } + ], + stateMutability: 'nonpayable', + type: 'constructor' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_provided', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_current', + type: 'uint256' + } + ], + name: 'BadNonce', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'HookAlreadyExists', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'HookDoesNotExist', + type: 'error' + }, + { + inputs: [], + name: 'ImageHashIsZero', + type: 'error' + }, + { + inputs: [ + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'InvalidImplementation', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'address', + name: '_addr', + type: 'address' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidNestedSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'bytes32', + name: '_s', + type: 'bytes32' + } + ], + name: 'InvalidSValue', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_flag', + type: 'uint256' + } + ], + name: 'InvalidSignatureFlag', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidSignatureLength', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes1', + name: '_type', + type: 'bytes1' + } + ], + name: 'InvalidSignatureType', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_v', + type: 'uint256' + } + ], + name: 'InvalidVValue', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: 'threshold', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_weight', + type: 'uint256' + } + ], + name: 'LowWeightChainedSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_index', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_requested', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_available', + type: 'uint256' + } + ], + name: 'NotEnoughGas', + type: 'error' + }, + { + inputs: [ + { + internalType: 'address', + name: '_sender', + type: 'address' + }, + { + internalType: 'address', + name: '_self', + type: 'address' + } + ], + name: 'OnlySelfAuth', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'SignerIsAddress0', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_type', + type: 'uint256' + }, + { + internalType: 'bool', + name: '_recoverMode', + type: 'bool' + } + ], + name: 'UnsupportedSignatureType', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_current', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_prev', + type: 'uint256' + } + ], + name: 'WrongChainedCheckpointOrder', + type: 'error' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + name: 'CreatedContract', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + } + ], + name: 'IPFSRootUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: 'newImageHash', + type: 'bytes32' + } + ], + name: 'ImageHashUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'newImplementation', + type: 'address' + } + ], + name: 'ImplementationUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + indexed: false, + internalType: 'uint256', + name: '_newNonce', + type: 'uint256' + } + ], + name: 'NonceChange', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'SetExtraImageHash', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'SetStaticDigest', + type: 'event' + }, + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + } + ], + name: 'TxExecuted', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'bytes', + name: '_reason', + type: 'bytes' + } + ], + name: 'TxFailed', + type: 'event' + }, + { + stateMutability: 'payable', + type: 'fallback' + }, + { + inputs: [], + name: 'FACTORY', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'INIT_CODE_HASH', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'SET_IMAGE_HASH_TYPE_HASH', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'UPGRADEABLE_IMPLEMENTATION', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + }, + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'addHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32[]', + name: '_digests', + type: 'bytes32[]' + } + ], + name: 'addStaticDigests', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32[]', + name: '_imageHashes', + type: 'bytes32[]' + } + ], + name: 'clearExtraImageHashes', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_code', + type: 'bytes' + } + ], + name: 'createContract', + outputs: [ + { + internalType: 'address', + name: 'addr', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + }, + { + internalType: 'uint256', + name: '_nonce', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'execute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + } + ], + name: 'extraImageHash', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'ipfsRoot', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'ipfsRootBytes32', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signatures', + type: 'bytes' + } + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_data', + type: 'bytes' + }, + { + internalType: 'bytes', + name: '_signatures', + 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: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155BatchReceived', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC721Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'readHook', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + } + ], + name: 'readNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'removeHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'selfExecute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'setExtraImageHash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'setStaticDigest', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'signatureRecovery', + outputs: [ + { + internalType: 'uint256', + name: 'threshold', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'weight', + type: 'uint256' + }, + { + internalType: 'bytes32', + name: 'imageHash', + type: 'bytes32' + }, + { + internalType: 'bytes32', + name: 'subDigest', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: 'checkpoint', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + } + ], + name: 'staticDigest', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_interfaceID', + type: 'bytes4' + } + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + } + ], + name: 'updateIPFSRoot', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + } + ], + name: 'updateImageHash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + }, + { + internalType: 'bytes32', + name: '_ipfsRoot', + type: 'bytes32' + } + ], + name: 'updateImageHashAndIPFS', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'updateImplementation', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + stateMutability: 'payable', + type: 'receive' + } + ], + bytecode: + '0x60e06040523480156200001157600080fd5b5060405162003b9e38038062003b9e8339810160408190526200003491620000ba565b8181600060405180606001604052806028815260200162003b76602891396040516200006691903090602001620000f2565b60408051601f198184030181529190528051602090910120608052506001600160a01b0391821660a0521660c05250620001269050565b80516001600160a01b0381168114620000b557600080fd5b919050565b60008060408385031215620000ce57600080fd5b620000d9836200009d565b9150620000e9602084016200009d565b90509250929050565b6000835160005b81811015620001155760208187018101518583015201620000f9565b509190910191825250602001919050565b60805160a05160c051613a0b6200016b6000396000818161060b015261171f01526000818161049b0152612ca30152600081816104390152612cd40152613a0b6000f3fe6080604052600436106101dc5760003560e01c806379e472c911610102578063a4ab5f9f11610095578063c71f1f9611610064578063c71f1f961461073f578063d0748f7114610754578063d59f788514610774578063f23a6e6114610794576101e3565b8063a4ab5f9f146106a2578063affed0e0146106c2578063b93ea7ad146106d7578063bc197c81146106f7576101e3565b80638c3f5563116100d15780638c3f55631461062d5780638efa64411461064d57806390042baf1461066f578063a38cef1914610682576101e3565b806379e472c9146105715780637a9a162814610591578063853c5068146105b1578063888eeec6146105f9576101e3565b8063257671f51161017a5780634598154f116101495780634598154f146104dd5780634fcf3eca146104fd57806357c56d6b1461051d57806361c2926c14610551576101e3565b8063257671f51461042757806329561426146104695780632dd310001461048957806341ea0302146104bd576101e3565b8063150b7a02116101b6578063150b7a021461032c5780631626ba7e146103a25780631a9b2337146103c257806320c13b0b14610407576101e3565b806301ffc9a7146102b7578063025b22bc146102ec578063038dbaac1461030c576101e3565b366101e357005b60006102126000357fffffffff00000000000000000000000000000000000000000000000000000000166107da565b905073ffffffffffffffffffffffffffffffffffffffff8116156102b5576000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161025b929190612e69565b600060405180830381855af49150503d8060008114610296576040519150601f19603f3d011682016040523d82523d6000602084013e61029b565b606091505b5091509150816102ad57805160208201fd5b805160208201f35b005b3480156102c357600080fd5b506102d76102d2366004612ea7565b61082e565b60405190151581526020015b60405180910390f35b3480156102f857600080fd5b506102b5610307366004612eed565b610839565b34801561031857600080fd5b506102b5610327366004612f54565b61088b565b34801561033857600080fd5b50610371610347366004612fd8565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102e3565b3480156103ae57600080fd5b506103716103bd366004613047565b610996565b3480156103ce57600080fd5b506103e26103dd366004612ea7565b6109e3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e3565b34801561041357600080fd5b50610371610422366004613093565b6109ee565b34801561043357600080fd5b5061045b7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016102e3565b34801561047557600080fd5b506102b56104843660046130ff565b610a53565b34801561049557600080fd5b506103e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c957600080fd5b5061045b6104d83660046130ff565b610a9d565b3480156104e957600080fd5b506102b56104f8366004613118565b610aa8565b34801561050957600080fd5b506102b5610518366004612ea7565b610b6e565b34801561052957600080fd5b5061045b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b34801561055d57600080fd5b506102b561056c366004612f54565b610c9d565b34801561057d57600080fd5b506102b561058c366004613118565b610d23565b34801561059d57600080fd5b506102b56105ac36600461313a565b610de1565b3480156105bd57600080fd5b506105d16105cc366004613047565b610e77565b604080519586526020860194909452928401919091526060830152608082015260a0016102e3565b34801561060557600080fd5b506103e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561063957600080fd5b5061045b6106483660046130ff565b61103f565b34801561065957600080fd5b5061066261106b565b6040516102e39190613211565b6103e261067d366004613253565b6110ec565b34801561068e57600080fd5b506102b561069d3660046130ff565b611188565b3480156106ae57600080fd5b5061045b6106bd3660046130ff565b6111d2565b3480156106ce57600080fd5b5061045b6111dd565b3480156106e357600080fd5b506102b56106f2366004613322565b6111ee565b34801561070357600080fd5b50610371610712366004613357565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561074b57600080fd5b5061045b611337565b34801561076057600080fd5b506102b561076f366004613118565b611361565b34801561078057600080fd5b506102b561078f366004612f54565b6113b4565b3480156107a057600080fd5b506103716107af366004613412565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60006108287fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff0000000000000000000000000000000000000000000000000000000084166114f7565b92915050565b600061082882611555565b33301461087f576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b610888816115b1565b50565b3330146108cc576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b8060005b818110156109905760008484838181106108ec576108ec61348a565b90506020020135905061094c816000604080517f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de602080830191909152818301859052825180830384018152606090920190925280519101208190555050565b807f804f6171d6008d9e16ee3aa0561fec328397f4ba2827a6605db388cfdefa3b0c600060405161097f91815260200190565b60405180910390a2506001016108d0565b50505050565b6000806109a485858561166c565b50905080156109d657507f1626ba7e0000000000000000000000000000000000000000000000000000000090506109dc565b50600090505b9392505050565b6000610828826107da565b600080610a138686604051610a04929190612e69565b6040518091039020858561166c565b5090508015610a4557507f20c13b0b000000000000000000000000000000000000000000000000000000009050610a4b565b50600090505b949350505050565b333014610a94576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b61088881611687565b600061082882611743565b333014610ae9576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b604080517f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de602080830191909152818301859052825180830384018152606083019384905280519101208390559082905282907f804f6171d6008d9e16ee3aa0561fec328397f4ba2827a6605db388cfdefa3b0c906080015b60405180910390a25050565b333014610baf576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b6000610bba826107da565b73ffffffffffffffffffffffffffffffffffffffff1603610c2b576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000082166004820152602401610876565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff00000000000000000000000000000000000000000000000000000000841682840152825180830384018152606090920190925280519101206000905550565b333014610cde576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b6000610d118383604051602001610cf6929190613661565b6040516020818303038152906040528051906020012061176f565b9050610d1e8184846117f4565b505050565b333014610d64576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454602080830191909152818301859052825180830384018152606083019384905280519101208390559082905282907f180e56184e3025975e8449fab79ff135cc5c3b3fe517a19bf8f111d69b33d2e290608001610b62565b610dea83611952565b600080610e22858888604051602001610e05939291906136a9565b60405160208183030381529060405280519060200120858561166c565b9150915081610e63578084846040517f8f4a234f000000000000000000000000000000000000000000000000000000008152600401610876939291906136cc565b610e6e8188886117f4565b50505050505050565b60008060008060008087876000818110610e9357610e9361348a565b909101357fff00000000000000000000000000000000000000000000000000000000000000169150819050610ee957610ecb8961176f565b9250610ed8838989611a4f565b929850909650945091506110349050565b7fff0000000000000000000000000000000000000000000000000000000000000081811601610f2857610f1b8961176f565b9250610ed8838989611aa0565b7ffe000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610f7a57610f1b89611acc565b7ffd000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610fde57610fce898989611b39565b9550955095509550955050611034565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff0000000000000000000000000000000000000000000000000000000000000082166004820152602401610876565b939792965093509350565b60006108287f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e836114f7565b60606110c86110c361107b611337565b6040517f017012200000000000000000000000000000000000000000000000000000000060208201526024810191909152604401604051602081830303815290604052611cb6565b611ecf565b6040516020016110d891906136e6565b604051602081830303815290604052905090565b600033301461112f576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b81516020830134f060405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b3330146111c9576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b61088881611ef8565b600061082882611f51565b60006111e9600061103f565b905090565b33301461122f576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b600061123a836107da565b73ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000083166004820152602401610876565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401528251808303840181526060909201909252805191012073ffffffffffffffffffffffffffffffffffffffff821690555050565b5050565b60006111e97f0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d0335490565b3330146113a2576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b6113ab82611687565b61133381611ef8565b3330146113f5576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b8060005b818110156109905760008484838181106114155761141561348a565b905060200201359050611494817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454602080830191909152818301859052825180830384018152606090920190925280519101208190555050565b807f180e56184e3025975e8449fab79ff135cc5c3b3fe517a19bf8f111d69b33d2e27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516114e691815260200190565b60405180910390a2506001016113f9565b6000808383604051602001611516929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016115a857506001919050565b61082882611f7d565b73ffffffffffffffffffffffffffffffffffffffff81163b611617576040517f0c76093700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610876565b61161f813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b60008061167a8585856120be565b915091505b935093915050565b806116be576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116e77fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa9060200160405180910390a16108887f00000000000000000000000000000000000000000000000000000000000000006115b1565b60006108287f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454836114f7565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b8181101561194b57368484838181106118135761181361348a565b9050602002810190611825919061372b565b90506040810135805a101561187a5782815a6040517f2bb3e3ba000000000000000000000000000000000000000000000000000000008152600481019390935260248301919091526044820152606401610876565b60006118896020840184613769565b156118c8576118c16118a16080850160608601612eed565b83156118ad57836118af565b5a5b6118bc60a0870187613784565b6120f2565b9050611903565b6119006118db6080850160608601612eed565b608085013584156118ec57846118ee565b5a5b6118fb60a0880188613784565b61210d565b90505b801561191f5760405188815260200160405180910390a0611940565b6119406119326040850160208601613769565b8961193b61212a565b612149565b5050506001016117f8565b5050505050565b606081901c6bffffffffffffffffffffffff821660006119718361103f565b90508181146119bd576040517f9b6514f4000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260448101829052606401610876565b604080517f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e60208083019190915281830186905282518083038401815260609092019092528051910120600183019081905560408051858152602081018390527f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881910160405180910390a15050505050565b6000808080611a6a87611a65876006818b6137e9565b612195565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080611abb87611ab6876001818b6137e9565b611a4f565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b16604283015260568201839052906076016117d7565b6000808080806004600188013560e81c82611b548383613842565b9050611b668b6105cc83868d8f6137e9565b939b5091995097509550935087871015611bbe57611b8681848b8d6137e9565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016108769493929190613855565b8092505b88831015611ca85760038301928a013560e81c9150611be18383613842565b90506000611c03611bf18861262b565b8c8c879086926105cc939291906137e9565b939c50919a5098509091505088881015611c5b57611c2382858c8e6137e9565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016108769493929190613855565b848110611c9e576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610876565b9350915081611bc2565b505050939792965093509350565b8051606090600381901b60006005600483010467ffffffffffffffff811115611ce157611ce1613224565b6040519080825280601f01601f191660200182016040528015611d0b576020820181803683370190505b5090506000806000805b86811015611e1f57888181518110611d2f57611d2f61348a565b01602001516008948501949390931b60f89390931c92909217915b60058410611e17576040805180820190915260208082527f6162636465666768696a6b6c6d6e6f707172737475767778797a323334353637818301527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb90950194601f85871c16908110611dc057611dc061348a565b602001015160f81c60f81b858381518110611ddd57611ddd61348a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190611d4a565b600101611d15565b508215611ec3576040518060400160405280602081526020017f6162636465666768696a6b6c6d6e6f707172737475767778797a3233343536378152508360050383901b601f1681518110611e7657611e7661348a565b602001015160f81c60f81b848281518110611e9357611e9361348a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b50919695505050505050565b606081604051602001611ee2919061387c565b6040516020818303038152906040529050919050565b611f217f0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d033829055565b6040518181527f20d3ef1b5738a9f6d7beae515432206e7a8e2740ca6dcf46a952190ad01bcb5190602001611661565b60006108287f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de836114f7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba5000000000000000000000000000000000000000000000000000000000148061201057507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061205c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806120a857507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b156120b557506001919050565b6108288261265f565b600080426120cb86611743565b11915081156120e757816120de866126bb565b9150915061167f565b61167a8585856126f6565b60006040518284823760008084838989f49695505050505050565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b821561215757805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd782826040516121889291906138c1565b60405180910390a1505050565b60008060005b8381101561262257600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810161223c57601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff0000000000000000000000000000000000000000168117856122225780612231565b60008681526020829052604090205b95505050505061219b565b806122d25760018201918681013560f81c9060430160006122688a61226384888c8e6137e9565b612734565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff821617866122b757806122c6565b60008781526020829052604090205b9650505050505061219b565b600281036123fa576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff16915080965081925050506000818601905061234b8b848c8c8a908692612346939291906137e9565b6129f7565b612393578a8361235d83898d8f6137e9565b6040517f9a94623200000000000000000000000000000000000000000000000000000000815260040161087694939291906138da565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617876123de57806123ed565b60008881526020829052604090205b975050505050505061219b565b6003810361242d576020820191860135836124155780612424565b60008481526020829052604090205b9350505061219b565b60048103612479576003808301928781013560e81c919082010160008061245a8b611a6585898d8f6137e9565b6000988952602052604090972096909701965090935061219b92505050565b600681036125815760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506000806124e78d8d8d8b908792611a65939291906137e9565b939850889390925090508482106124fd57988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a90528351808403909101815260989092019092528051910120896125635780612572565b60008a81526020829052604090205b9950505050505050505061219b565b600581036125ed5760208201918601358781036125bc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b60006125c782612ba4565b9050846125d457806125e3565b60008581526020829052604090205b945050505061219b565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610876565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d16000908152602082905260408120610828565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016126b257506001919050565b61082882612bdf565b604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd945460208201529081018290526000906060016117d7565b6000806000806000612709888888610e77565b50965091945092509050828210801590612727575061272781612bea565b9450505050935093915050565b6000604282146127745782826040517f2ee17a3d00000000000000000000000000000000000000000000000000000000815260040161087692919061391a565b600061278d61278460018561392e565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115612801578686826040517fad4aac7600000000000000000000000000000000000000000000000000000000815260040161087693929190613941565b8260ff16601b1415801561281957508260ff16601c14155b15612856578686846040517fe578897e00000000000000000000000000000000000000000000000000000000815260040161087693929190613965565b600184036128c3576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa1580156128b2573d6000803e3d6000fd5b50505060206040510351945061299b565b60028403612960576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a001612890565b86868560016040517f9dfba852000000000000000000000000000000000000000000000000000000008152600401610876949392919061398c565b73ffffffffffffffffffffffffffffffffffffffff85166129ec5786866040517f6c1719d200000000000000000000000000000000000000000000000000000000815260040161087692919061391a565b505050509392505050565b6000808383612a0760018261392e565b818110612a1657612a1661348a565b919091013560f81c9150506001811480612a305750600281145b15612a75578473ffffffffffffffffffffffffffffffffffffffff16612a57878686612734565b73ffffffffffffffffffffffffffffffffffffffff16149150612b9b565b60038103612b605773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e8786600087612aa960018261392e565b92612ab6939291906137e9565b6040518463ffffffff1660e01b8152600401612ad4939291906136cc565b602060405180830381865afa158015612af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1591906139b8565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150612b9b565b83838260006040517f9dfba852000000000000000000000000000000000000000000000000000000008152600401610876949392919061398c565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a00000000000000006020820152603881018290526000906058016117d7565b600061082882612bf5565b600061082882612c51565b60007ffda4dd44000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612c4857506001919050565b61082882612d7f565b6000612d53826040517fff0000000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021820152603581018290527f000000000000000000000000000000000000000000000000000000000000000060558201526000903090607501604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012073ffffffffffffffffffffffffffffffffffffffff161492915050565b15612d6057506001919050565b6000612d6b83611f51565b905080158015906109dc5750421092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e000000000000000000000000000000000000000000000000000000001480612e1257507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15612e1f57506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610828565b8183823760009101908152919050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461088857600080fd5b600060208284031215612eb957600080fd5b81356109dc81612e79565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ee857600080fd5b919050565b600060208284031215612eff57600080fd5b6109dc82612ec4565b60008083601f840112612f1a57600080fd5b50813567ffffffffffffffff811115612f3257600080fd5b6020830191508360208260051b8501011115612f4d57600080fd5b9250929050565b60008060208385031215612f6757600080fd5b823567ffffffffffffffff811115612f7e57600080fd5b612f8a85828601612f08565b90969095509350505050565b60008083601f840112612fa857600080fd5b50813567ffffffffffffffff811115612fc057600080fd5b602083019150836020828501011115612f4d57600080fd5b600080600080600060808688031215612ff057600080fd5b612ff986612ec4565b945061300760208701612ec4565b935060408601359250606086013567ffffffffffffffff81111561302a57600080fd5b61303688828901612f96565b969995985093965092949392505050565b60008060006040848603121561305c57600080fd5b83359250602084013567ffffffffffffffff81111561307a57600080fd5b61308686828701612f96565b9497909650939450505050565b600080600080604085870312156130a957600080fd5b843567ffffffffffffffff808211156130c157600080fd5b6130cd88838901612f96565b909650945060208701359150808211156130e657600080fd5b506130f387828801612f96565b95989497509550505050565b60006020828403121561311157600080fd5b5035919050565b6000806040838503121561312b57600080fd5b50508035926020909101359150565b60008060008060006060868803121561315257600080fd5b853567ffffffffffffffff8082111561316a57600080fd5b61317689838a01612f08565b909750955060208801359450604088013591508082111561319657600080fd5b5061303688828901612f96565b60005b838110156131be5781810151838201526020016131a6565b50506000910152565b600081518084526131df8160208601602086016131a3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006109dc60208301846131c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561326557600080fd5b813567ffffffffffffffff8082111561327d57600080fd5b818401915084601f83011261329157600080fd5b8135818111156132a3576132a3613224565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156132e9576132e9613224565b8160405282815287602084870101111561330257600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000806040838503121561333557600080fd5b823561334081612e79565b915061334e60208401612ec4565b90509250929050565b60008060008060008060008060a0898b03121561337357600080fd5b61337c89612ec4565b975061338a60208a01612ec4565b9650604089013567ffffffffffffffff808211156133a757600080fd5b6133b38c838d01612f08565b909850965060608b01359150808211156133cc57600080fd5b6133d88c838d01612f08565b909650945060808b01359150808211156133f157600080fd5b506133fe8b828c01612f96565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561342b57600080fd5b61343487612ec4565b955061344260208801612ec4565b94506040870135935060608701359250608087013567ffffffffffffffff81111561346c57600080fd5b61347889828a01612f96565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80358015158114612ee857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b8781101561365457828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4188360301811261356b57600080fd5b870160c0613578826134b9565b151586526135878783016134b9565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff6135b9828501612ec4565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126135ff57600080fd5b90920187810192903567ffffffffffffffff81111561361d57600080fd5b80360384131561362c57600080fd5b828289015261363e83890182866134c9565b9c89019c9750505092860192505060010161352c565b5091979650505050505050565b60408152600560408201527f73656c663a0000000000000000000000000000000000000000000000000000006060820152608060208201526000610a4b608083018486613512565b8381526040602082015260006136c3604083018486613512565b95945050505050565b8381526040602082015260006136c36040830184866134c9565b7f697066733a2f2f0000000000000000000000000000000000000000000000000081526000825161371e8160078501602087016131a3565b9190910160070192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261375f57600080fd5b9190910192915050565b60006020828403121561377b57600080fd5b6109dc826134b9565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137b957600080fd5b83018035915067ffffffffffffffff8211156137d457600080fd5b602001915036819003821315612f4d57600080fd5b600080858511156137f957600080fd5b8386111561380657600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082857610828613813565b6060815260006138696060830186886134c9565b6020830194909452506040015292915050565b7f62000000000000000000000000000000000000000000000000000000000000008152600082516138b48160018501602087016131a3565b9190910160010192915050565b828152604060208201526000610a4b60408301846131c7565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006139106060830184866134c9565b9695505050505050565b602081526000610a4b6020830184866134c9565b8181038181111561082857610828613813565b6040815260006139556040830185876134c9565b9050826020830152949350505050565b6040815260006139796040830185876134c9565b905060ff83166020830152949350505050565b6060815260006139a06060830186886134c9565b60208301949094525090151560409091015292915050565b6000602082840312156139ca57600080fd5b81516109dc81612e7956fea2646970667358221220e6905b82ca2ea91a0c6cc4a371ce0a85eb88794fb3bc7734ed5414f524c47c4264736f6c63430008110033603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3', + deployedBytecode: + '0x6080604052600436106101dc5760003560e01c806379e472c911610102578063a4ab5f9f11610095578063c71f1f9611610064578063c71f1f961461073f578063d0748f7114610754578063d59f788514610774578063f23a6e6114610794576101e3565b8063a4ab5f9f146106a2578063affed0e0146106c2578063b93ea7ad146106d7578063bc197c81146106f7576101e3565b80638c3f5563116100d15780638c3f55631461062d5780638efa64411461064d57806390042baf1461066f578063a38cef1914610682576101e3565b806379e472c9146105715780637a9a162814610591578063853c5068146105b1578063888eeec6146105f9576101e3565b8063257671f51161017a5780634598154f116101495780634598154f146104dd5780634fcf3eca146104fd57806357c56d6b1461051d57806361c2926c14610551576101e3565b8063257671f51461042757806329561426146104695780632dd310001461048957806341ea0302146104bd576101e3565b8063150b7a02116101b6578063150b7a021461032c5780631626ba7e146103a25780631a9b2337146103c257806320c13b0b14610407576101e3565b806301ffc9a7146102b7578063025b22bc146102ec578063038dbaac1461030c576101e3565b366101e357005b60006102126000357fffffffff00000000000000000000000000000000000000000000000000000000166107da565b905073ffffffffffffffffffffffffffffffffffffffff8116156102b5576000808273ffffffffffffffffffffffffffffffffffffffff1660003660405161025b929190612e69565b600060405180830381855af49150503d8060008114610296576040519150601f19603f3d011682016040523d82523d6000602084013e61029b565b606091505b5091509150816102ad57805160208201fd5b805160208201f35b005b3480156102c357600080fd5b506102d76102d2366004612ea7565b61082e565b60405190151581526020015b60405180910390f35b3480156102f857600080fd5b506102b5610307366004612eed565b610839565b34801561031857600080fd5b506102b5610327366004612f54565b61088b565b34801561033857600080fd5b50610371610347366004612fd8565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102e3565b3480156103ae57600080fd5b506103716103bd366004613047565b610996565b3480156103ce57600080fd5b506103e26103dd366004612ea7565b6109e3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102e3565b34801561041357600080fd5b50610371610422366004613093565b6109ee565b34801561043357600080fd5b5061045b7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016102e3565b34801561047557600080fd5b506102b56104843660046130ff565b610a53565b34801561049557600080fd5b506103e27f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c957600080fd5b5061045b6104d83660046130ff565b610a9d565b3480156104e957600080fd5b506102b56104f8366004613118565b610aa8565b34801561050957600080fd5b506102b5610518366004612ea7565b610b6e565b34801561052957600080fd5b5061045b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b34801561055d57600080fd5b506102b561056c366004612f54565b610c9d565b34801561057d57600080fd5b506102b561058c366004613118565b610d23565b34801561059d57600080fd5b506102b56105ac36600461313a565b610de1565b3480156105bd57600080fd5b506105d16105cc366004613047565b610e77565b604080519586526020860194909452928401919091526060830152608082015260a0016102e3565b34801561060557600080fd5b506103e27f000000000000000000000000000000000000000000000000000000000000000081565b34801561063957600080fd5b5061045b6106483660046130ff565b61103f565b34801561065957600080fd5b5061066261106b565b6040516102e39190613211565b6103e261067d366004613253565b6110ec565b34801561068e57600080fd5b506102b561069d3660046130ff565b611188565b3480156106ae57600080fd5b5061045b6106bd3660046130ff565b6111d2565b3480156106ce57600080fd5b5061045b6111dd565b3480156106e357600080fd5b506102b56106f2366004613322565b6111ee565b34801561070357600080fd5b50610371610712366004613357565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561074b57600080fd5b5061045b611337565b34801561076057600080fd5b506102b561076f366004613118565b611361565b34801561078057600080fd5b506102b561078f366004612f54565b6113b4565b3480156107a057600080fd5b506103716107af366004613412565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60006108287fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff0000000000000000000000000000000000000000000000000000000084166114f7565b92915050565b600061082882611555565b33301461087f576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b610888816115b1565b50565b3330146108cc576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b8060005b818110156109905760008484838181106108ec576108ec61348a565b90506020020135905061094c816000604080517f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de602080830191909152818301859052825180830384018152606090920190925280519101208190555050565b807f804f6171d6008d9e16ee3aa0561fec328397f4ba2827a6605db388cfdefa3b0c600060405161097f91815260200190565b60405180910390a2506001016108d0565b50505050565b6000806109a485858561166c565b50905080156109d657507f1626ba7e0000000000000000000000000000000000000000000000000000000090506109dc565b50600090505b9392505050565b6000610828826107da565b600080610a138686604051610a04929190612e69565b6040518091039020858561166c565b5090508015610a4557507f20c13b0b000000000000000000000000000000000000000000000000000000009050610a4b565b50600090505b949350505050565b333014610a94576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b61088881611687565b600061082882611743565b333014610ae9576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b604080517f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de602080830191909152818301859052825180830384018152606083019384905280519101208390559082905282907f804f6171d6008d9e16ee3aa0561fec328397f4ba2827a6605db388cfdefa3b0c906080015b60405180910390a25050565b333014610baf576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b6000610bba826107da565b73ffffffffffffffffffffffffffffffffffffffff1603610c2b576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000082166004820152602401610876565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff00000000000000000000000000000000000000000000000000000000841682840152825180830384018152606090920190925280519101206000905550565b333014610cde576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b6000610d118383604051602001610cf6929190613661565b6040516020818303038152906040528051906020012061176f565b9050610d1e8184846117f4565b505050565b333014610d64576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454602080830191909152818301859052825180830384018152606083019384905280519101208390559082905282907f180e56184e3025975e8449fab79ff135cc5c3b3fe517a19bf8f111d69b33d2e290608001610b62565b610dea83611952565b600080610e22858888604051602001610e05939291906136a9565b60405160208183030381529060405280519060200120858561166c565b9150915081610e63578084846040517f8f4a234f000000000000000000000000000000000000000000000000000000008152600401610876939291906136cc565b610e6e8188886117f4565b50505050505050565b60008060008060008087876000818110610e9357610e9361348a565b909101357fff00000000000000000000000000000000000000000000000000000000000000169150819050610ee957610ecb8961176f565b9250610ed8838989611a4f565b929850909650945091506110349050565b7fff0000000000000000000000000000000000000000000000000000000000000081811601610f2857610f1b8961176f565b9250610ed8838989611aa0565b7ffe000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610f7a57610f1b89611acc565b7ffd000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610fde57610fce898989611b39565b9550955095509550955050611034565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff0000000000000000000000000000000000000000000000000000000000000082166004820152602401610876565b939792965093509350565b60006108287f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e836114f7565b60606110c86110c361107b611337565b6040517f017012200000000000000000000000000000000000000000000000000000000060208201526024810191909152604401604051602081830303815290604052611cb6565b611ecf565b6040516020016110d891906136e6565b604051602081830303815290604052905090565b600033301461112f576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b81516020830134f060405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b3330146111c9576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b61088881611ef8565b600061082882611f51565b60006111e9600061103f565b905090565b33301461122f576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b600061123a836107da565b73ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000083166004820152602401610876565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401528251808303840181526060909201909252805191012073ffffffffffffffffffffffffffffffffffffffff821690555050565b5050565b60006111e97f0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d0335490565b3330146113a2576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b6113ab82611687565b61133381611ef8565b3330146113f5576040517fe1258894000000000000000000000000000000000000000000000000000000008152336004820152306024820152604401610876565b8060005b818110156109905760008484838181106114155761141561348a565b905060200201359050611494817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454602080830191909152818301859052825180830384018152606090920190925280519101208190555050565b807f180e56184e3025975e8449fab79ff135cc5c3b3fe517a19bf8f111d69b33d2e27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040516114e691815260200190565b60405180910390a2506001016113f9565b6000808383604051602001611516929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016115a857506001919050565b61082882611f7d565b73ffffffffffffffffffffffffffffffffffffffff81163b611617576040517f0c76093700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610876565b61161f813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b60008061167a8585856120be565b915091505b935093915050565b806116be576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116e77fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa9060200160405180910390a16108887f00000000000000000000000000000000000000000000000000000000000000006115b1565b60006108287f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454836114f7565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b8181101561194b57368484838181106118135761181361348a565b9050602002810190611825919061372b565b90506040810135805a101561187a5782815a6040517f2bb3e3ba000000000000000000000000000000000000000000000000000000008152600481019390935260248301919091526044820152606401610876565b60006118896020840184613769565b156118c8576118c16118a16080850160608601612eed565b83156118ad57836118af565b5a5b6118bc60a0870187613784565b6120f2565b9050611903565b6119006118db6080850160608601612eed565b608085013584156118ec57846118ee565b5a5b6118fb60a0880188613784565b61210d565b90505b801561191f5760405188815260200160405180910390a0611940565b6119406119326040850160208601613769565b8961193b61212a565b612149565b5050506001016117f8565b5050505050565b606081901c6bffffffffffffffffffffffff821660006119718361103f565b90508181146119bd576040517f9b6514f4000000000000000000000000000000000000000000000000000000008152600481018490526024810183905260448101829052606401610876565b604080517f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e60208083019190915281830186905282518083038401815260609092019092528051910120600183019081905560408051858152602081018390527f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881910160405180910390a15050505050565b6000808080611a6a87611a65876006818b6137e9565b612195565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080611abb87611ab6876001818b6137e9565b611a4f565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b16604283015260568201839052906076016117d7565b6000808080806004600188013560e81c82611b548383613842565b9050611b668b6105cc83868d8f6137e9565b939b5091995097509550935087871015611bbe57611b8681848b8d6137e9565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016108769493929190613855565b8092505b88831015611ca85760038301928a013560e81c9150611be18383613842565b90506000611c03611bf18861262b565b8c8c879086926105cc939291906137e9565b939c50919a5098509091505088881015611c5b57611c2382858c8e6137e9565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016108769493929190613855565b848110611c9e576040517f37daf62b0000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610876565b9350915081611bc2565b505050939792965093509350565b8051606090600381901b60006005600483010467ffffffffffffffff811115611ce157611ce1613224565b6040519080825280601f01601f191660200182016040528015611d0b576020820181803683370190505b5090506000806000805b86811015611e1f57888181518110611d2f57611d2f61348a565b01602001516008948501949390931b60f89390931c92909217915b60058410611e17576040805180820190915260208082527f6162636465666768696a6b6c6d6e6f707172737475767778797a323334353637818301527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb90950194601f85871c16908110611dc057611dc061348a565b602001015160f81c60f81b858381518110611ddd57611ddd61348a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190611d4a565b600101611d15565b508215611ec3576040518060400160405280602081526020017f6162636465666768696a6b6c6d6e6f707172737475767778797a3233343536378152508360050383901b601f1681518110611e7657611e7661348a565b602001015160f81c60f81b848281518110611e9357611e9361348a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b50919695505050505050565b606081604051602001611ee2919061387c565b6040516020818303038152906040529050919050565b611f217f0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d033829055565b6040518181527f20d3ef1b5738a9f6d7beae515432206e7a8e2740ca6dcf46a952190ad01bcb5190602001611661565b60006108287f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de836114f7565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba5000000000000000000000000000000000000000000000000000000000148061201057507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061205c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806120a857507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b156120b557506001919050565b6108288261265f565b600080426120cb86611743565b11915081156120e757816120de866126bb565b9150915061167f565b61167a8585856126f6565b60006040518284823760008084838989f49695505050505050565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b821561215757805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd782826040516121889291906138c1565b60405180910390a1505050565b60008060005b8381101561262257600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810161223c57601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff0000000000000000000000000000000000000000168117856122225780612231565b60008681526020829052604090205b95505050505061219b565b806122d25760018201918681013560f81c9060430160006122688a61226384888c8e6137e9565b612734565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff821617866122b757806122c6565b60008781526020829052604090205b9650505050505061219b565b600281036123fa576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff16915080965081925050506000818601905061234b8b848c8c8a908692612346939291906137e9565b6129f7565b612393578a8361235d83898d8f6137e9565b6040517f9a94623200000000000000000000000000000000000000000000000000000000815260040161087694939291906138da565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617876123de57806123ed565b60008881526020829052604090205b975050505050505061219b565b6003810361242d576020820191860135836124155780612424565b60008481526020829052604090205b9350505061219b565b60048103612479576003808301928781013560e81c919082010160008061245a8b611a6585898d8f6137e9565b6000988952602052604090972096909701965090935061219b92505050565b600681036125815760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506000806124e78d8d8d8b908792611a65939291906137e9565b939850889390925090508482106124fd57988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a90528351808403909101815260989092019092528051910120896125635780612572565b60008a81526020829052604090205b9950505050505050505061219b565b600581036125ed5760208201918601358781036125bc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b60006125c782612ba4565b9050846125d457806125e3565b60008581526020829052604090205b945050505061219b565b6040517fb2505f7c00000000000000000000000000000000000000000000000000000000815260048101829052602401610876565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d16000908152602082905260408120610828565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016126b257506001919050565b61082882612bdf565b604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd945460208201529081018290526000906060016117d7565b6000806000806000612709888888610e77565b50965091945092509050828210801590612727575061272781612bea565b9450505050935093915050565b6000604282146127745782826040517f2ee17a3d00000000000000000000000000000000000000000000000000000000815260040161087692919061391a565b600061278d61278460018561392e565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115612801578686826040517fad4aac7600000000000000000000000000000000000000000000000000000000815260040161087693929190613941565b8260ff16601b1415801561281957508260ff16601c14155b15612856578686846040517fe578897e00000000000000000000000000000000000000000000000000000000815260040161087693929190613965565b600184036128c3576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa1580156128b2573d6000803e3d6000fd5b50505060206040510351945061299b565b60028403612960576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a001612890565b86868560016040517f9dfba852000000000000000000000000000000000000000000000000000000008152600401610876949392919061398c565b73ffffffffffffffffffffffffffffffffffffffff85166129ec5786866040517f6c1719d200000000000000000000000000000000000000000000000000000000815260040161087692919061391a565b505050509392505050565b6000808383612a0760018261392e565b818110612a1657612a1661348a565b919091013560f81c9150506001811480612a305750600281145b15612a75578473ffffffffffffffffffffffffffffffffffffffff16612a57878686612734565b73ffffffffffffffffffffffffffffffffffffffff16149150612b9b565b60038103612b605773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e8786600087612aa960018261392e565b92612ab6939291906137e9565b6040518463ffffffff1660e01b8152600401612ad4939291906136cc565b602060405180830381865afa158015612af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1591906139b8565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150612b9b565b83838260006040517f9dfba852000000000000000000000000000000000000000000000000000000008152600401610876949392919061398c565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a00000000000000006020820152603881018290526000906058016117d7565b600061082882612bf5565b600061082882612c51565b60007ffda4dd44000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612c4857506001919050565b61082882612d7f565b6000612d53826040517fff0000000000000000000000000000000000000000000000000000000000000060208201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021820152603581018290527f000000000000000000000000000000000000000000000000000000000000000060558201526000903090607501604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012073ffffffffffffffffffffffffffffffffffffffff161492915050565b15612d6057506001919050565b6000612d6b83611f51565b905080158015906109dc5750421092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e000000000000000000000000000000000000000000000000000000001480612e1257507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15612e1f57506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610828565b8183823760009101908152919050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461088857600080fd5b600060208284031215612eb957600080fd5b81356109dc81612e79565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ee857600080fd5b919050565b600060208284031215612eff57600080fd5b6109dc82612ec4565b60008083601f840112612f1a57600080fd5b50813567ffffffffffffffff811115612f3257600080fd5b6020830191508360208260051b8501011115612f4d57600080fd5b9250929050565b60008060208385031215612f6757600080fd5b823567ffffffffffffffff811115612f7e57600080fd5b612f8a85828601612f08565b90969095509350505050565b60008083601f840112612fa857600080fd5b50813567ffffffffffffffff811115612fc057600080fd5b602083019150836020828501011115612f4d57600080fd5b600080600080600060808688031215612ff057600080fd5b612ff986612ec4565b945061300760208701612ec4565b935060408601359250606086013567ffffffffffffffff81111561302a57600080fd5b61303688828901612f96565b969995985093965092949392505050565b60008060006040848603121561305c57600080fd5b83359250602084013567ffffffffffffffff81111561307a57600080fd5b61308686828701612f96565b9497909650939450505050565b600080600080604085870312156130a957600080fd5b843567ffffffffffffffff808211156130c157600080fd5b6130cd88838901612f96565b909650945060208701359150808211156130e657600080fd5b506130f387828801612f96565b95989497509550505050565b60006020828403121561311157600080fd5b5035919050565b6000806040838503121561312b57600080fd5b50508035926020909101359150565b60008060008060006060868803121561315257600080fd5b853567ffffffffffffffff8082111561316a57600080fd5b61317689838a01612f08565b909750955060208801359450604088013591508082111561319657600080fd5b5061303688828901612f96565b60005b838110156131be5781810151838201526020016131a6565b50506000910152565b600081518084526131df8160208601602086016131a3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006109dc60208301846131c7565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561326557600080fd5b813567ffffffffffffffff8082111561327d57600080fd5b818401915084601f83011261329157600080fd5b8135818111156132a3576132a3613224565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156132e9576132e9613224565b8160405282815287602084870101111561330257600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000806040838503121561333557600080fd5b823561334081612e79565b915061334e60208401612ec4565b90509250929050565b60008060008060008060008060a0898b03121561337357600080fd5b61337c89612ec4565b975061338a60208a01612ec4565b9650604089013567ffffffffffffffff808211156133a757600080fd5b6133b38c838d01612f08565b909850965060608b01359150808211156133cc57600080fd5b6133d88c838d01612f08565b909650945060808b01359150808211156133f157600080fd5b506133fe8b828c01612f96565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561342b57600080fd5b61343487612ec4565b955061344260208801612ec4565b94506040870135935060608701359250608087013567ffffffffffffffff81111561346c57600080fd5b61347889828a01612f96565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80358015158114612ee857600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b8781101561365457828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4188360301811261356b57600080fd5b870160c0613578826134b9565b151586526135878783016134b9565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff6135b9828501612ec4565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126135ff57600080fd5b90920187810192903567ffffffffffffffff81111561361d57600080fd5b80360384131561362c57600080fd5b828289015261363e83890182866134c9565b9c89019c9750505092860192505060010161352c565b5091979650505050505050565b60408152600560408201527f73656c663a0000000000000000000000000000000000000000000000000000006060820152608060208201526000610a4b608083018486613512565b8381526040602082015260006136c3604083018486613512565b95945050505050565b8381526040602082015260006136c36040830184866134c9565b7f697066733a2f2f0000000000000000000000000000000000000000000000000081526000825161371e8160078501602087016131a3565b9190910160070192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261375f57600080fd5b9190910192915050565b60006020828403121561377b57600080fd5b6109dc826134b9565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126137b957600080fd5b83018035915067ffffffffffffffff8211156137d457600080fd5b602001915036819003821315612f4d57600080fd5b600080858511156137f957600080fd5b8386111561380657600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561082857610828613813565b6060815260006138696060830186886134c9565b6020830194909452506040015292915050565b7f62000000000000000000000000000000000000000000000000000000000000008152600082516138b48160018501602087016131a3565b9190910160010192915050565b828152604060208201526000610a4b60408301846131c7565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006139106060830184866134c9565b9695505050505050565b602081526000610a4b6020830184866134c9565b8181038181111561082857610828613813565b6040815260006139556040830185876134c9565b9050826020830152949350505050565b6040815260006139796040830185876134c9565b905060ff83166020830152949350505050565b6060815260006139a06060830186886134c9565b60208301949094525090151560409091015292915050565b6000602082840312156139ca57600080fd5b81516109dc81612e7956fea2646970667358221220e6905b82ca2ea91a0c6cc4a371ce0a85eb88794fb3bc7734ed5414f524c47c4264736f6c63430008110033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v2/artifacts/MainModuleUpgradable.ts b/packages/tests/src/builds/v2/artifacts/MainModuleUpgradable.ts new file mode 100644 index 000000000..6edae5d5e --- /dev/null +++ b/packages/tests/src/builds/v2/artifacts/MainModuleUpgradable.ts @@ -0,0 +1,1062 @@ +export const mainModuleUpgradable = { + _format: 'hh-sol-artifact-1', + contractName: 'MainModuleUpgradable', + sourceName: 'contracts/modules/MainModuleUpgradable.sol', + abi: [ + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_provided', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_current', + type: 'uint256' + } + ], + name: 'BadNonce', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'HookAlreadyExists', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'HookDoesNotExist', + type: 'error' + }, + { + inputs: [], + name: 'ImageHashIsZero', + type: 'error' + }, + { + inputs: [ + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'InvalidImplementation', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'address', + name: '_addr', + type: 'address' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidNestedSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'bytes32', + name: '_s', + type: 'bytes32' + } + ], + name: 'InvalidSValue', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_flag', + type: 'uint256' + } + ], + name: 'InvalidSignatureFlag', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'InvalidSignatureLength', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes1', + name: '_type', + type: 'bytes1' + } + ], + name: 'InvalidSignatureType', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_v', + type: 'uint256' + } + ], + name: 'InvalidVValue', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: 'threshold', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_weight', + type: 'uint256' + } + ], + name: 'LowWeightChainedSignature', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_index', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_requested', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_available', + type: 'uint256' + } + ], + name: 'NotEnoughGas', + type: 'error' + }, + { + inputs: [ + { + internalType: 'address', + name: '_sender', + type: 'address' + }, + { + internalType: 'address', + name: '_self', + type: 'address' + } + ], + name: 'OnlySelfAuth', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'SignerIsAddress0', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'uint256', + name: '_type', + type: 'uint256' + }, + { + internalType: 'bool', + name: '_recoverMode', + type: 'bool' + } + ], + name: 'UnsupportedSignatureType', + type: 'error' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_current', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '_prev', + type: 'uint256' + } + ], + name: 'WrongChainedCheckpointOrder', + type: 'error' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: '_contract', + type: 'address' + } + ], + name: 'CreatedContract', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + } + ], + name: 'IPFSRootUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: 'newImageHash', + type: 'bytes32' + } + ], + name: 'ImageHashUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'address', + name: 'newImplementation', + type: 'address' + } + ], + name: 'ImplementationUpdated', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'uint256', + name: '_space', + type: 'uint256' + }, + { + indexed: false, + internalType: 'uint256', + name: '_newNonce', + type: 'uint256' + } + ], + name: 'NonceChange', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'SetExtraImageHash', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'SetStaticDigest', + type: 'event' + }, + { + anonymous: true, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + } + ], + name: 'TxExecuted', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: 'bytes32', + name: '_tx', + type: 'bytes32' + }, + { + indexed: false, + internalType: 'bytes', + name: '_reason', + type: 'bytes' + } + ], + name: 'TxFailed', + type: 'event' + }, + { + stateMutability: 'payable', + type: 'fallback' + }, + { + inputs: [], + name: 'SET_IMAGE_HASH_TYPE_HASH', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + }, + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'addHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32[]', + name: '_digests', + type: 'bytes32[]' + } + ], + name: 'addStaticDigests', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32[]', + name: '_imageHashes', + type: 'bytes32[]' + } + ], + name: 'clearExtraImageHashes', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_code', + type: 'bytes' + } + ], + name: 'createContract', + outputs: [ + { + internalType: 'address', + name: 'addr', + type: 'address' + } + ], + stateMutability: 'payable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + }, + { + internalType: 'uint256', + name: '_nonce', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'execute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + } + ], + name: 'extraImageHash', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'imageHash', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'ipfsRoot', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'ipfsRootBytes32', + outputs: [ + { + internalType: 'bytes32', + name: '', + type: 'bytes32' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signatures', + type: 'bytes' + } + ], + name: 'isValidSignature', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes', + name: '_data', + type: 'bytes' + }, + { + internalType: 'bytes', + name: '_signatures', + 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: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'uint256[]', + name: '', + type: 'uint256[]' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155BatchReceived', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC1155Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'uint256', + name: '', + type: 'uint256' + }, + { + internalType: 'bytes', + name: '', + type: 'bytes' + } + ], + name: 'onERC721Received', + outputs: [ + { + internalType: 'bytes4', + name: '', + type: 'bytes4' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'readHook', + outputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'uint256', + name: '_space', + type: 'uint256' + } + ], + name: 'readNonce', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_signature', + type: 'bytes4' + } + ], + name: 'removeHook', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + components: [ + { + internalType: 'bool', + name: 'delegateCall', + type: 'bool' + }, + { + internalType: 'bool', + name: 'revertOnError', + type: 'bool' + }, + { + internalType: 'uint256', + name: 'gasLimit', + type: 'uint256' + }, + { + internalType: 'address', + name: 'target', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + }, + { + internalType: 'bytes', + name: 'data', + type: 'bytes' + } + ], + internalType: 'struct IModuleCalls.Transaction[]', + name: '_txs', + type: 'tuple[]' + } + ], + name: 'selfExecute', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'setExtraImageHash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: '_expiration', + type: 'uint256' + } + ], + name: 'setStaticDigest', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'signatureRecovery', + outputs: [ + { + internalType: 'uint256', + name: 'threshold', + type: 'uint256' + }, + { + internalType: 'uint256', + name: 'weight', + type: 'uint256' + }, + { + internalType: 'bytes32', + name: 'imageHash', + type: 'bytes32' + }, + { + internalType: 'bytes32', + name: 'subDigest', + type: 'bytes32' + }, + { + internalType: 'uint256', + name: 'checkpoint', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_digest', + type: 'bytes32' + } + ], + name: 'staticDigest', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes4', + name: '_interfaceID', + type: 'bytes4' + } + ], + name: 'supportsInterface', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'pure', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + } + ], + name: 'updateIPFSRoot', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + } + ], + name: 'updateImageHash', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'bytes32', + name: '_imageHash', + type: 'bytes32' + }, + { + internalType: 'bytes32', + name: '_ipfsRoot', + type: 'bytes32' + } + ], + name: 'updateImageHashAndIPFS', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_implementation', + type: 'address' + } + ], + name: 'updateImplementation', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + stateMutability: 'payable', + type: 'receive' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b506138f9806100206000396000f3fe6080604052600436106101c65760003560e01c806379e472c9116100f7578063a4ab5f9f11610095578063c71f1f9611610064578063c71f1f96146106a2578063d0748f71146106b7578063d59f7885146106d7578063f23a6e61146106f7576101cd565b8063a4ab5f9f14610605578063affed0e014610625578063b93ea7ad1461063a578063bc197c811461065a576101cd565b80638c3f5563116100d15780638c3f5563146105905780638efa6441146105b057806390042baf146105d2578063a38cef19146105e5576101cd565b806379e472c9146105085780637a9a162814610528578063853c506814610548576101cd565b806329561426116101645780634fcf3eca1161013e5780634fcf3eca1461047f57806351605d801461049f57806357c56d6b146104b457806361c2926c146104e8576101cd565b8063295614261461041157806341ea0302146104315780634598154f1461045f576101cd565b8063150b7a02116101a0578063150b7a02146103165780631626ba7e1461038c5780631a9b2337146103ac57806320c13b0b146103f1576101cd565b806301ffc9a7146102a1578063025b22bc146102d6578063038dbaac146102f6576101cd565b366101cd57005b60006101fc6000357fffffffff000000000000000000000000000000000000000000000000000000001661073d565b905073ffffffffffffffffffffffffffffffffffffffff81161561029f576000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610245929190612d57565b600060405180830381855af49150503d8060008114610280576040519150601f19603f3d011682016040523d82523d6000602084013e610285565b606091505b50915091508161029757805160208201fd5b805160208201f35b005b3480156102ad57600080fd5b506102c16102bc366004612d95565b610791565b60405190151581526020015b60405180910390f35b3480156102e257600080fd5b5061029f6102f1366004612ddb565b61079c565b34801561030257600080fd5b5061029f610311366004612e42565b6107ee565b34801561032257600080fd5b5061035b610331366004612ec6565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102cd565b34801561039857600080fd5b5061035b6103a7366004612f35565b6108f9565b3480156103b857600080fd5b506103cc6103c7366004612d95565b610946565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102cd565b3480156103fd57600080fd5b5061035b61040c366004612f81565b610951565b34801561041d57600080fd5b5061029f61042c366004612fed565b6109b6565b34801561043d57600080fd5b5061045161044c366004612fed565b610a00565b6040519081526020016102cd565b34801561046b57600080fd5b5061029f61047a366004613006565b610a0b565b34801561048b57600080fd5b5061029f61049a366004612d95565b610ad1565b3480156104ab57600080fd5b50610451610c00565b3480156104c057600080fd5b506104517f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b3480156104f457600080fd5b5061029f610503366004612e42565b610c2f565b34801561051457600080fd5b5061029f610523366004613006565b610cb5565b34801561053457600080fd5b5061029f610543366004613028565b610d73565b34801561055457600080fd5b50610568610563366004612f35565b610e09565b604080519586526020860194909452928401919091526060830152608082015260a0016102cd565b34801561059c57600080fd5b506104516105ab366004612fed565b610fd1565b3480156105bc57600080fd5b506105c5610ffd565b6040516102cd91906130ff565b6103cc6105e0366004613141565b61107e565b3480156105f157600080fd5b5061029f610600366004612fed565b61111a565b34801561061157600080fd5b50610451610620366004612fed565b611164565b34801561063157600080fd5b5061045161116f565b34801561064657600080fd5b5061029f610655366004613210565b61117b565b34801561066657600080fd5b5061035b610675366004613245565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156106ae57600080fd5b506104516112c4565b3480156106c357600080fd5b5061029f6106d2366004613006565b6112ee565b3480156106e357600080fd5b5061029f6106f2366004612e42565b611341565b34801561070357600080fd5b5061035b610712366004613300565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b600061078b7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416611484565b92915050565b600061078b826114e2565b3330146107e2576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b6107eb8161153e565b50565b33301461082f576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b8060005b818110156108f357600084848381811061084f5761084f613378565b9050602002013590506108af816000604080517f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de602080830191909152818301859052825180830384018152606090920190925280519101208190555050565b807f804f6171d6008d9e16ee3aa0561fec328397f4ba2827a6605db388cfdefa3b0c60006040516108e291815260200190565b60405180910390a250600101610833565b50505050565b6000806109078585856115f9565b509050801561093957507f1626ba7e00000000000000000000000000000000000000000000000000000000905061093f565b50600090505b9392505050565b600061078b8261073d565b6000806109768686604051610967929190612d57565b604051809103902085856115f9565b50905080156109a857507f20c13b0b0000000000000000000000000000000000000000000000000000000090506109ae565b50600090505b949350505050565b3330146109f7576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b6107eb81611614565b600061078b826116a4565b333014610a4c576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b604080517f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de602080830191909152818301859052825180830384018152606083019384905280519101208390559082905282907f804f6171d6008d9e16ee3aa0561fec328397f4ba2827a6605db388cfdefa3b0c906080015b60405180910390a25050565b333014610b12576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b6000610b1d8261073d565b73ffffffffffffffffffffffffffffffffffffffff1603610b8e576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016107d9565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff00000000000000000000000000000000000000000000000000000000841682840152825180830384018152606090920190925280519101206000905550565b6000610c2a7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85490565b905090565b333014610c70576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b6000610ca38383604051602001610c8892919061354f565b604051602081830303815290604052805190602001206116d0565b9050610cb0818484611755565b505050565b333014610cf6576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454602080830191909152818301859052825180830384018152606083019384905280519101208390559082905282907f180e56184e3025975e8449fab79ff135cc5c3b3fe517a19bf8f111d69b33d2e290608001610ac5565b610d7c836118b3565b600080610db4858888604051602001610d9793929190613597565b6040516020818303038152906040528051906020012085856115f9565b9150915081610df5578084846040517f8f4a234f0000000000000000000000000000000000000000000000000000000081526004016107d9939291906135ba565b610e00818888611755565b50505050505050565b60008060008060008087876000818110610e2557610e25613378565b909101357fff00000000000000000000000000000000000000000000000000000000000000169150819050610e7b57610e5d896116d0565b9250610e6a8389896119b0565b92985090965094509150610fc69050565b7fff0000000000000000000000000000000000000000000000000000000000000081811601610eba57610ead896116d0565b9250610e6a838989611a01565b7ffe000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610f0c57610ead89611a2d565b7ffd000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610f7057610f60898989611a9a565b9550955095509550955050610fc6565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff00000000000000000000000000000000000000000000000000000000000000821660048201526024016107d9565b939792965093509350565b600061078b7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83611484565b606061105a61105561100d6112c4565b6040517f017012200000000000000000000000000000000000000000000000000000000060208201526024810191909152604401604051602081830303815290604052611c17565b611e30565b60405160200161106a91906135d4565b604051602081830303815290604052905090565b60003330146110c1576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b81516020830134f060405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b33301461115b576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b6107eb81611e59565b600061078b82611eb2565b6000610c2a6000610fd1565b3330146111bc576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b60006111c78361073d565b73ffffffffffffffffffffffffffffffffffffffff1614611238576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000831660048201526024016107d9565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401528251808303840181526060909201909252805191012073ffffffffffffffffffffffffffffffffffffffff821690555050565b5050565b6000610c2a7f0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d0335490565b33301461132f576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b61133882611614565b6112c081611e59565b333014611382576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b8060005b818110156108f35760008484838181106113a2576113a2613378565b905060200201359050611421817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454602080830191909152818301859052825180830384018152606090920190925280519101208190555050565b807f180e56184e3025975e8449fab79ff135cc5c3b3fe517a19bf8f111d69b33d2e27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60405161147391815260200190565b60405180910390a250600101611386565b60008083836040516020016114a3929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161153557506001919050565b61078b82611ede565b73ffffffffffffffffffffffffffffffffffffffff81163b6115a4576040517f0c76093700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016107d9565b6115ac813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b60008061160785858561201f565b915091505b935093915050565b8061164b576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116747fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa906020016115ee565b600061078b7f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd945483611484565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b818110156118ac573684848381811061177457611774613378565b90506020028101906117869190613619565b90506040810135805a10156117db5782815a6040517f2bb3e3ba0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016107d9565b60006117ea6020840184613657565b15611829576118226118026080850160608601612ddb565b831561180e5783611810565b5a5b61181d60a0870187613672565b612053565b9050611864565b61186161183c6080850160608601612ddb565b6080850135841561184d578461184f565b5a5b61185c60a0880188613672565b61206e565b90505b80156118805760405188815260200160405180910390a06118a1565b6118a16118936040850160208601613657565b8961189c61208b565b6120aa565b505050600101611759565b5050505050565b606081901c6bffffffffffffffffffffffff821660006118d283610fd1565b905081811461191e576040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604481018290526064016107d9565b604080517f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e60208083019190915281830186905282518083038401815260609092019092528051910120600183019081905560408051858152602081018390527f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881910160405180910390a15050505050565b60008080806119cb876119c6876006818b6136d7565b6120f6565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080611a1c87611a17876001818b6136d7565b6119b0565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601611738565b6000808080806004600188013560e81c82611ab58383613730565b9050611ac78b61056383868d8f6136d7565b939b5091995097509550935087871015611b1f57611ae781848b8d6136d7565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016107d99493929190613743565b8092505b88831015611c095760038301928a013560e81c9150611b428383613730565b90506000611b64611b528861258c565b8c8c87908692610563939291906136d7565b939c50919a5098509091505088881015611bbc57611b8482858c8e6136d7565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016107d99493929190613743565b848110611bff576040517f37daf62b00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107d9565b9350915081611b23565b505050939792965093509350565b8051606090600381901b60006005600483010467ffffffffffffffff811115611c4257611c42613112565b6040519080825280601f01601f191660200182016040528015611c6c576020820181803683370190505b5090506000806000805b86811015611d8057888181518110611c9057611c90613378565b01602001516008948501949390931b60f89390931c92909217915b60058410611d78576040805180820190915260208082527f6162636465666768696a6b6c6d6e6f707172737475767778797a323334353637818301527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb90950194601f85871c16908110611d2157611d21613378565b602001015160f81c60f81b858381518110611d3e57611d3e613378565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190611cab565b600101611c76565b508215611e24576040518060400160405280602081526020017f6162636465666768696a6b6c6d6e6f707172737475767778797a3233343536378152508360050383901b601f1681518110611dd757611dd7613378565b602001015160f81c60f81b848281518110611df457611df4613378565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b50919695505050505050565b606081604051602001611e43919061376a565b6040516020818303038152906040529050919050565b611e827f0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d033829055565b6040518181527f20d3ef1b5738a9f6d7beae515432206e7a8e2740ca6dcf46a952190ad01bcb51906020016115ee565b600061078b7f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de83611484565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba50000000000000000000000000000000000000000000000000000000001480611f7157507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b80611fbd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b8061200957507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561201657506001919050565b61078b826125c0565b6000804261202c866116a4565b1191508115612048578161203f8661261c565b9150915061160c565b611607858585612657565b60006040518284823760008084838989f49695505050505050565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b82156120b857805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd782826040516120e99291906137af565b60405180910390a1505050565b60008060005b8381101561258357600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810161219d57601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff0000000000000000000000000000000000000000168117856121835780612192565b60008681526020829052604090205b9550505050506120fc565b806122335760018201918681013560f81c9060430160006121c98a6121c484888c8e6136d7565b612695565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff821617866122185780612227565b60008781526020829052604090205b965050505050506120fc565b6002810361235b576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506122ac8b848c8c8a9086926122a7939291906136d7565b612958565b6122f4578a836122be83898d8f6136d7565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016107d994939291906137c8565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416178761233f578061234e565b60008881526020829052604090205b97505050505050506120fc565b6003810361238e576020820191860135836123765780612385565b60008481526020829052604090205b935050506120fc565b600481036123da576003808301928781013560e81c91908201016000806123bb8b6119c685898d8f6136d7565b600098895260205260409097209690970196509093506120fc92505050565b600681036124e25760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506000806124488d8d8d8b9087926119c6939291906136d7565b9398508893909250905084821061245e57988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a90528351808403909101815260989092019092528051910120896124c457806124d3565b60008a81526020829052604090205b995050505050505050506120fc565b6005810361254e57602082019186013587810361251d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b600061252882612b05565b9050846125355780612544565b60008581526020829052604090205b94505050506120fc565b6040517fb2505f7c000000000000000000000000000000000000000000000000000000008152600481018290526024016107d9565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d1600090815260208290526040812061078b565b60007ffda4dd44000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161261357506001919050565b61078b82612b40565b604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd94546020820152908101829052600090606001611738565b600080600080600061266a888888610e09565b50965091945092509050828210801590612688575061268881612b9c565b9450505050935093915050565b6000604282146126d55782826040517f2ee17a3d0000000000000000000000000000000000000000000000000000000081526004016107d9929190613808565b60006126ee6126e560018561381c565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115612762578686826040517fad4aac760000000000000000000000000000000000000000000000000000000081526004016107d99392919061382f565b8260ff16601b1415801561277a57508260ff16601c14155b156127b7578686846040517fe578897e0000000000000000000000000000000000000000000000000000000081526004016107d993929190613853565b60018403612824576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa158015612813573d6000803e3d6000fd5b5050506020604051035194506128fc565b600284036128c1576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a0016127f1565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016107d9949392919061387a565b73ffffffffffffffffffffffffffffffffffffffff851661294d5786866040517f6c1719d20000000000000000000000000000000000000000000000000000000081526004016107d9929190613808565b505050509392505050565b600080838361296860018261381c565b81811061297757612977613378565b919091013560f81c91505060018114806129915750600281145b156129d6578473ffffffffffffffffffffffffffffffffffffffff166129b8878686612695565b73ffffffffffffffffffffffffffffffffffffffff16149150612afc565b60038103612ac15773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e8786600087612a0a60018261381c565b92612a17939291906136d7565b6040518463ffffffff1660e01b8152600401612a35939291906135ba565b602060405180830381865afa158015612a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7691906138a6565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150612afc565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016107d9949392919061387a565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801611738565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612b9357506001919050565b61078b82612ba7565b600061078b82612c03565b60007fae9fa280000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612bfa57506001919050565b61078b82612c3a565b6000612c0e82612d24565b15612c1b57506001919050565b6000612c2683611eb2565b9050801580159061093f5750421092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e000000000000000000000000000000000000000000000000000000001480612ccd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15612cda57506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461078b565b6000811580159061078b5750507fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8541490565b8183823760009101908152919050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146107eb57600080fd5b600060208284031215612da757600080fd5b813561093f81612d67565b803573ffffffffffffffffffffffffffffffffffffffff81168114612dd657600080fd5b919050565b600060208284031215612ded57600080fd5b61093f82612db2565b60008083601f840112612e0857600080fd5b50813567ffffffffffffffff811115612e2057600080fd5b6020830191508360208260051b8501011115612e3b57600080fd5b9250929050565b60008060208385031215612e5557600080fd5b823567ffffffffffffffff811115612e6c57600080fd5b612e7885828601612df6565b90969095509350505050565b60008083601f840112612e9657600080fd5b50813567ffffffffffffffff811115612eae57600080fd5b602083019150836020828501011115612e3b57600080fd5b600080600080600060808688031215612ede57600080fd5b612ee786612db2565b9450612ef560208701612db2565b935060408601359250606086013567ffffffffffffffff811115612f1857600080fd5b612f2488828901612e84565b969995985093965092949392505050565b600080600060408486031215612f4a57600080fd5b83359250602084013567ffffffffffffffff811115612f6857600080fd5b612f7486828701612e84565b9497909650939450505050565b60008060008060408587031215612f9757600080fd5b843567ffffffffffffffff80821115612faf57600080fd5b612fbb88838901612e84565b90965094506020870135915080821115612fd457600080fd5b50612fe187828801612e84565b95989497509550505050565b600060208284031215612fff57600080fd5b5035919050565b6000806040838503121561301957600080fd5b50508035926020909101359150565b60008060008060006060868803121561304057600080fd5b853567ffffffffffffffff8082111561305857600080fd5b61306489838a01612df6565b909750955060208801359450604088013591508082111561308457600080fd5b50612f2488828901612e84565b60005b838110156130ac578181015183820152602001613094565b50506000910152565b600081518084526130cd816020860160208601613091565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061093f60208301846130b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561315357600080fd5b813567ffffffffffffffff8082111561316b57600080fd5b818401915084601f83011261317f57600080fd5b81358181111561319157613191613112565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156131d7576131d7613112565b816040528281528760208487010111156131f057600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000806040838503121561322357600080fd5b823561322e81612d67565b915061323c60208401612db2565b90509250929050565b60008060008060008060008060a0898b03121561326157600080fd5b61326a89612db2565b975061327860208a01612db2565b9650604089013567ffffffffffffffff8082111561329557600080fd5b6132a18c838d01612df6565b909850965060608b01359150808211156132ba57600080fd5b6132c68c838d01612df6565b909650945060808b01359150808211156132df57600080fd5b506132ec8b828c01612e84565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561331957600080fd5b61332287612db2565b955061333060208801612db2565b94506040870135935060608701359250608087013567ffffffffffffffff81111561335a57600080fd5b61336689828a01612e84565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80358015158114612dd657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b8781101561354257828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4188360301811261345957600080fd5b870160c0613466826133a7565b151586526134758783016133a7565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff6134a7828501612db2565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126134ed57600080fd5b90920187810192903567ffffffffffffffff81111561350b57600080fd5b80360384131561351a57600080fd5b828289015261352c83890182866133b7565b9c89019c9750505092860192505060010161341a565b5091979650505050505050565b60408152600560408201527f73656c663a00000000000000000000000000000000000000000000000000000060608201526080602082015260006109ae608083018486613400565b8381526040602082015260006135b1604083018486613400565b95945050505050565b8381526040602082015260006135b16040830184866133b7565b7f697066733a2f2f0000000000000000000000000000000000000000000000000081526000825161360c816007850160208701613091565b9190910160070192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261364d57600080fd5b9190910192915050565b60006020828403121561366957600080fd5b61093f826133a7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126136a757600080fd5b83018035915067ffffffffffffffff8211156136c257600080fd5b602001915036819003821315612e3b57600080fd5b600080858511156136e757600080fd5b838611156136f457600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561078b5761078b613701565b6060815260006137576060830186886133b7565b6020830194909452506040015292915050565b7f62000000000000000000000000000000000000000000000000000000000000008152600082516137a2816001850160208701613091565b9190910160010192915050565b8281526040602082015260006109ae60408301846130b5565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006137fe6060830184866133b7565b9695505050505050565b6020815260006109ae6020830184866133b7565b8181038181111561078b5761078b613701565b6040815260006138436040830185876133b7565b9050826020830152949350505050565b6040815260006138676040830185876133b7565b905060ff83166020830152949350505050565b60608152600061388e6060830186886133b7565b60208301949094525090151560409091015292915050565b6000602082840312156138b857600080fd5b815161093f81612d6756fea264697066735822122030f6a03eecf061513999472455e58728f2693e3a3541e4333a309b089861d90064736f6c63430008110033', + deployedBytecode: + '0x6080604052600436106101c65760003560e01c806379e472c9116100f7578063a4ab5f9f11610095578063c71f1f9611610064578063c71f1f96146106a2578063d0748f71146106b7578063d59f7885146106d7578063f23a6e61146106f7576101cd565b8063a4ab5f9f14610605578063affed0e014610625578063b93ea7ad1461063a578063bc197c811461065a576101cd565b80638c3f5563116100d15780638c3f5563146105905780638efa6441146105b057806390042baf146105d2578063a38cef19146105e5576101cd565b806379e472c9146105085780637a9a162814610528578063853c506814610548576101cd565b806329561426116101645780634fcf3eca1161013e5780634fcf3eca1461047f57806351605d801461049f57806357c56d6b146104b457806361c2926c146104e8576101cd565b8063295614261461041157806341ea0302146104315780634598154f1461045f576101cd565b8063150b7a02116101a0578063150b7a02146103165780631626ba7e1461038c5780631a9b2337146103ac57806320c13b0b146103f1576101cd565b806301ffc9a7146102a1578063025b22bc146102d6578063038dbaac146102f6576101cd565b366101cd57005b60006101fc6000357fffffffff000000000000000000000000000000000000000000000000000000001661073d565b905073ffffffffffffffffffffffffffffffffffffffff81161561029f576000808273ffffffffffffffffffffffffffffffffffffffff16600036604051610245929190612d57565b600060405180830381855af49150503d8060008114610280576040519150601f19603f3d011682016040523d82523d6000602084013e610285565b606091505b50915091508161029757805160208201fd5b805160208201f35b005b3480156102ad57600080fd5b506102c16102bc366004612d95565b610791565b60405190151581526020015b60405180910390f35b3480156102e257600080fd5b5061029f6102f1366004612ddb565b61079c565b34801561030257600080fd5b5061029f610311366004612e42565b6107ee565b34801561032257600080fd5b5061035b610331366004612ec6565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102cd565b34801561039857600080fd5b5061035b6103a7366004612f35565b6108f9565b3480156103b857600080fd5b506103cc6103c7366004612d95565b610946565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102cd565b3480156103fd57600080fd5b5061035b61040c366004612f81565b610951565b34801561041d57600080fd5b5061029f61042c366004612fed565b6109b6565b34801561043d57600080fd5b5061045161044c366004612fed565b610a00565b6040519081526020016102cd565b34801561046b57600080fd5b5061029f61047a366004613006565b610a0b565b34801561048b57600080fd5b5061029f61049a366004612d95565b610ad1565b3480156104ab57600080fd5b50610451610c00565b3480156104c057600080fd5b506104517f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b3480156104f457600080fd5b5061029f610503366004612e42565b610c2f565b34801561051457600080fd5b5061029f610523366004613006565b610cb5565b34801561053457600080fd5b5061029f610543366004613028565b610d73565b34801561055457600080fd5b50610568610563366004612f35565b610e09565b604080519586526020860194909452928401919091526060830152608082015260a0016102cd565b34801561059c57600080fd5b506104516105ab366004612fed565b610fd1565b3480156105bc57600080fd5b506105c5610ffd565b6040516102cd91906130ff565b6103cc6105e0366004613141565b61107e565b3480156105f157600080fd5b5061029f610600366004612fed565b61111a565b34801561061157600080fd5b50610451610620366004612fed565b611164565b34801561063157600080fd5b5061045161116f565b34801561064657600080fd5b5061029f610655366004613210565b61117b565b34801561066657600080fd5b5061035b610675366004613245565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156106ae57600080fd5b506104516112c4565b3480156106c357600080fd5b5061029f6106d2366004613006565b6112ee565b3480156106e357600080fd5b5061029f6106f2366004612e42565b611341565b34801561070357600080fd5b5061035b610712366004613300565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b600061078b7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416611484565b92915050565b600061078b826114e2565b3330146107e2576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b6107eb8161153e565b50565b33301461082f576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b8060005b818110156108f357600084848381811061084f5761084f613378565b9050602002013590506108af816000604080517f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de602080830191909152818301859052825180830384018152606090920190925280519101208190555050565b807f804f6171d6008d9e16ee3aa0561fec328397f4ba2827a6605db388cfdefa3b0c60006040516108e291815260200190565b60405180910390a250600101610833565b50505050565b6000806109078585856115f9565b509050801561093957507f1626ba7e00000000000000000000000000000000000000000000000000000000905061093f565b50600090505b9392505050565b600061078b8261073d565b6000806109768686604051610967929190612d57565b604051809103902085856115f9565b50905080156109a857507f20c13b0b0000000000000000000000000000000000000000000000000000000090506109ae565b50600090505b949350505050565b3330146109f7576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b6107eb81611614565b600061078b826116a4565b333014610a4c576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b604080517f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de602080830191909152818301859052825180830384018152606083019384905280519101208390559082905282907f804f6171d6008d9e16ee3aa0561fec328397f4ba2827a6605db388cfdefa3b0c906080015b60405180910390a25050565b333014610b12576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b6000610b1d8261073d565b73ffffffffffffffffffffffffffffffffffffffff1603610b8e576040517f1c3812cc0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000821660048201526024016107d9565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff00000000000000000000000000000000000000000000000000000000841682840152825180830384018152606090920190925280519101206000905550565b6000610c2a7fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf85490565b905090565b333014610c70576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b6000610ca38383604051602001610c8892919061354f565b604051602081830303815290604052805190602001206116d0565b9050610cb0818484611755565b505050565b333014610cf6576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454602080830191909152818301859052825180830384018152606083019384905280519101208390559082905282907f180e56184e3025975e8449fab79ff135cc5c3b3fe517a19bf8f111d69b33d2e290608001610ac5565b610d7c836118b3565b600080610db4858888604051602001610d9793929190613597565b6040516020818303038152906040528051906020012085856115f9565b9150915081610df5578084846040517f8f4a234f0000000000000000000000000000000000000000000000000000000081526004016107d9939291906135ba565b610e00818888611755565b50505050505050565b60008060008060008087876000818110610e2557610e25613378565b909101357fff00000000000000000000000000000000000000000000000000000000000000169150819050610e7b57610e5d896116d0565b9250610e6a8389896119b0565b92985090965094509150610fc69050565b7fff0000000000000000000000000000000000000000000000000000000000000081811601610eba57610ead896116d0565b9250610e6a838989611a01565b7ffe000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610f0c57610ead89611a2d565b7ffd000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821601610f7057610f60898989611a9a565b9550955095509550955050610fc6565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff00000000000000000000000000000000000000000000000000000000000000821660048201526024016107d9565b939792965093509350565b600061078b7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83611484565b606061105a61105561100d6112c4565b6040517f017012200000000000000000000000000000000000000000000000000000000060208201526024810191909152604401604051602081830303815290604052611c17565b611e30565b60405160200161106a91906135d4565b604051602081830303815290604052905090565b60003330146110c1576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b81516020830134f060405173ffffffffffffffffffffffffffffffffffffffff821681529091507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b33301461115b576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b6107eb81611e59565b600061078b82611eb2565b6000610c2a6000610fd1565b3330146111bc576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b60006111c78361073d565b73ffffffffffffffffffffffffffffffffffffffff1614611238576040517f5b4d6d6a0000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000831660048201526024016107d9565b604080517fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1206020808301919091527fffffffff000000000000000000000000000000000000000000000000000000008516828401528251808303840181526060909201909252805191012073ffffffffffffffffffffffffffffffffffffffff821690555050565b5050565b6000610c2a7f0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d0335490565b33301461132f576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b61133882611614565b6112c081611e59565b333014611382576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016107d9565b8060005b818110156108f35760008484838181106113a2576113a2613378565b905060200201359050611421817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd9454602080830191909152818301859052825180830384018152606090920190925280519101208190555050565b807f180e56184e3025975e8449fab79ff135cc5c3b3fe517a19bf8f111d69b33d2e27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60405161147391815260200190565b60405180910390a250600101611386565b60008083836040516020016114a3929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161153557506001919050565b61078b82611ede565b73ffffffffffffffffffffffffffffffffffffffff81163b6115a4576040517f0c76093700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016107d9565b6115ac813055565b60405173ffffffffffffffffffffffffffffffffffffffff821681527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca03906020015b60405180910390a150565b60008061160785858561201f565b915091505b935093915050565b8061164b576040517f4294d12700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116747fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8829055565b6040518181527f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa906020016115ee565b600061078b7f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd945483611484565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b818110156118ac573684848381811061177457611774613378565b90506020028101906117869190613619565b90506040810135805a10156117db5782815a6040517f2bb3e3ba0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016107d9565b60006117ea6020840184613657565b15611829576118226118026080850160608601612ddb565b831561180e5783611810565b5a5b61181d60a0870187613672565b612053565b9050611864565b61186161183c6080850160608601612ddb565b6080850135841561184d578461184f565b5a5b61185c60a0880188613672565b61206e565b90505b80156118805760405188815260200160405180910390a06118a1565b6118a16118936040850160208601613657565b8961189c61208b565b6120aa565b505050600101611759565b5050505050565b606081901c6bffffffffffffffffffffffff821660006118d283610fd1565b905081811461191e576040517f9b6514f40000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604481018290526064016107d9565b604080517f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e60208083019190915281830186905282518083038401815260609092019092528051910120600183019081905560408051858152602081018390527f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881910160405180910390a15050505050565b60008080806119cb876119c6876006818b6136d7565b6120f6565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080611a1c87611a17876001818b6136d7565b6119b0565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601611738565b6000808080806004600188013560e81c82611ab58383613730565b9050611ac78b61056383868d8f6136d7565b939b5091995097509550935087871015611b1f57611ae781848b8d6136d7565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016107d99493929190613743565b8092505b88831015611c095760038301928a013560e81c9150611b428383613730565b90506000611b64611b528861258c565b8c8c87908692610563939291906136d7565b939c50919a5098509091505088881015611bbc57611b8482858c8e6136d7565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016107d99493929190613743565b848110611bff576040517f37daf62b00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016107d9565b9350915081611b23565b505050939792965093509350565b8051606090600381901b60006005600483010467ffffffffffffffff811115611c4257611c42613112565b6040519080825280601f01601f191660200182016040528015611c6c576020820181803683370190505b5090506000806000805b86811015611d8057888181518110611c9057611c90613378565b01602001516008948501949390931b60f89390931c92909217915b60058410611d78576040805180820190915260208082527f6162636465666768696a6b6c6d6e6f707172737475767778797a323334353637818301527ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb90950194601f85871c16908110611d2157611d21613378565b602001015160f81c60f81b858381518110611d3e57611d3e613378565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190611cab565b600101611c76565b508215611e24576040518060400160405280602081526020017f6162636465666768696a6b6c6d6e6f707172737475767778797a3233343536378152508360050383901b601f1681518110611dd757611dd7613378565b602001015160f81c60f81b848281518110611df457611df4613378565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b50919695505050505050565b606081604051602001611e43919061376a565b6040516020818303038152906040529050919050565b611e827f0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d033829055565b6040518181527f20d3ef1b5738a9f6d7beae515432206e7a8e2740ca6dcf46a952190ad01bcb51906020016115ee565b600061078b7f849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de83611484565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba50000000000000000000000000000000000000000000000000000000001480611f7157507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b80611fbd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b8061200957507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561201657506001919050565b61078b826125c0565b6000804261202c866116a4565b1191508115612048578161203f8661261c565b9150915061160c565b611607858585612657565b60006040518284823760008084838989f49695505050505050565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b82156120b857805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd782826040516120e99291906137af565b60405180910390a1505050565b60008060005b8381101561258357600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810161219d57601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff0000000000000000000000000000000000000000168117856121835780612192565b60008681526020829052604090205b9550505050506120fc565b806122335760018201918681013560f81c9060430160006121c98a6121c484888c8e6136d7565b612695565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff821617866122185780612227565b60008781526020829052604090205b965050505050506120fc565b6002810361235b576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506122ac8b848c8c8a9086926122a7939291906136d7565b612958565b6122f4578a836122be83898d8f6136d7565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016107d994939291906137c8565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416178761233f578061234e565b60008881526020829052604090205b97505050505050506120fc565b6003810361238e576020820191860135836123765780612385565b60008481526020829052604090205b935050506120fc565b600481036123da576003808301928781013560e81c91908201016000806123bb8b6119c685898d8f6136d7565b600098895260205260409097209690970196509093506120fc92505050565b600681036124e25760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff1691508096508192505050600081860190506000806124488d8d8d8b9087926119c6939291906136d7565b9398508893909250905084821061245e57988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a90528351808403909101815260989092019092528051910120896124c457806124d3565b60008a81526020829052604090205b995050505050505050506120fc565b6005810361254e57602082019186013587810361251d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b600061252882612b05565b9050846125355780612544565b60008581526020829052604090205b94505050506120fc565b6040517fb2505f7c000000000000000000000000000000000000000000000000000000008152600481018290526024016107d9565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d1600090815260208290526040812061078b565b60007ffda4dd44000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161261357506001919050565b61078b82612b40565b604080517f7f25a23abc421d10864063e9a8ae5fd3fbd5116e156f148428b6a3a02ffd94546020820152908101829052600090606001611738565b600080600080600061266a888888610e09565b50965091945092509050828210801590612688575061268881612b9c565b9450505050935093915050565b6000604282146126d55782826040517f2ee17a3d0000000000000000000000000000000000000000000000000000000081526004016107d9929190613808565b60006126ee6126e560018561381c565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115612762578686826040517fad4aac760000000000000000000000000000000000000000000000000000000081526004016107d99392919061382f565b8260ff16601b1415801561277a57508260ff16601c14155b156127b7578686846040517fe578897e0000000000000000000000000000000000000000000000000000000081526004016107d993929190613853565b60018403612824576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa158015612813573d6000803e3d6000fd5b5050506020604051035194506128fc565b600284036128c1576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a0016127f1565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016107d9949392919061387a565b73ffffffffffffffffffffffffffffffffffffffff851661294d5786866040517f6c1719d20000000000000000000000000000000000000000000000000000000081526004016107d9929190613808565b505050509392505050565b600080838361296860018261381c565b81811061297757612977613378565b919091013560f81c91505060018114806129915750600281145b156129d6578473ffffffffffffffffffffffffffffffffffffffff166129b8878686612695565b73ffffffffffffffffffffffffffffffffffffffff16149150612afc565b60038103612ac15773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e8786600087612a0a60018261381c565b92612a17939291906136d7565b6040518463ffffffff1660e01b8152600401612a35939291906135ba565b602060405180830381865afa158015612a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a7691906138a6565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150612afc565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016107d9949392919061387a565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801611738565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612b9357506001919050565b61078b82612ba7565b600061078b82612c03565b60007fae9fa280000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612bfa57506001919050565b61078b82612c3a565b6000612c0e82612d24565b15612c1b57506001919050565b6000612c2683611eb2565b9050801580159061093f5750421092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e000000000000000000000000000000000000000000000000000000001480612ccd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15612cda57506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461078b565b6000811580159061078b5750507fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8541490565b8183823760009101908152919050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146107eb57600080fd5b600060208284031215612da757600080fd5b813561093f81612d67565b803573ffffffffffffffffffffffffffffffffffffffff81168114612dd657600080fd5b919050565b600060208284031215612ded57600080fd5b61093f82612db2565b60008083601f840112612e0857600080fd5b50813567ffffffffffffffff811115612e2057600080fd5b6020830191508360208260051b8501011115612e3b57600080fd5b9250929050565b60008060208385031215612e5557600080fd5b823567ffffffffffffffff811115612e6c57600080fd5b612e7885828601612df6565b90969095509350505050565b60008083601f840112612e9657600080fd5b50813567ffffffffffffffff811115612eae57600080fd5b602083019150836020828501011115612e3b57600080fd5b600080600080600060808688031215612ede57600080fd5b612ee786612db2565b9450612ef560208701612db2565b935060408601359250606086013567ffffffffffffffff811115612f1857600080fd5b612f2488828901612e84565b969995985093965092949392505050565b600080600060408486031215612f4a57600080fd5b83359250602084013567ffffffffffffffff811115612f6857600080fd5b612f7486828701612e84565b9497909650939450505050565b60008060008060408587031215612f9757600080fd5b843567ffffffffffffffff80821115612faf57600080fd5b612fbb88838901612e84565b90965094506020870135915080821115612fd457600080fd5b50612fe187828801612e84565b95989497509550505050565b600060208284031215612fff57600080fd5b5035919050565b6000806040838503121561301957600080fd5b50508035926020909101359150565b60008060008060006060868803121561304057600080fd5b853567ffffffffffffffff8082111561305857600080fd5b61306489838a01612df6565b909750955060208801359450604088013591508082111561308457600080fd5b50612f2488828901612e84565b60005b838110156130ac578181015183820152602001613094565b50506000910152565b600081518084526130cd816020860160208601613091565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061093f60208301846130b5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020828403121561315357600080fd5b813567ffffffffffffffff8082111561316b57600080fd5b818401915084601f83011261317f57600080fd5b81358181111561319157613191613112565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156131d7576131d7613112565b816040528281528760208487010111156131f057600080fd5b826020860160208301376000928101602001929092525095945050505050565b6000806040838503121561322357600080fd5b823561322e81612d67565b915061323c60208401612db2565b90509250929050565b60008060008060008060008060a0898b03121561326157600080fd5b61326a89612db2565b975061327860208a01612db2565b9650604089013567ffffffffffffffff8082111561329557600080fd5b6132a18c838d01612df6565b909850965060608b01359150808211156132ba57600080fd5b6132c68c838d01612df6565b909650945060808b01359150808211156132df57600080fd5b506132ec8b828c01612e84565b999c989b5096995094979396929594505050565b60008060008060008060a0878903121561331957600080fd5b61332287612db2565b955061333060208801612db2565b94506040870135935060608701359250608087013567ffffffffffffffff81111561335a57600080fd5b61336689828a01612e84565b979a9699509497509295939492505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80358015158114612dd657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b8781101561354257828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4188360301811261345957600080fd5b870160c0613466826133a7565b151586526134758783016133a7565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff6134a7828501612db2565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10181126134ed57600080fd5b90920187810192903567ffffffffffffffff81111561350b57600080fd5b80360384131561351a57600080fd5b828289015261352c83890182866133b7565b9c89019c9750505092860192505060010161341a565b5091979650505050505050565b60408152600560408201527f73656c663a00000000000000000000000000000000000000000000000000000060608201526080602082015260006109ae608083018486613400565b8381526040602082015260006135b1604083018486613400565b95945050505050565b8381526040602082015260006135b16040830184866133b7565b7f697066733a2f2f0000000000000000000000000000000000000000000000000081526000825161360c816007850160208701613091565b9190910160070192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4183360301811261364d57600080fd5b9190910192915050565b60006020828403121561366957600080fd5b61093f826133a7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126136a757600080fd5b83018035915067ffffffffffffffff8211156136c257600080fd5b602001915036819003821315612e3b57600080fd5b600080858511156136e757600080fd5b838611156136f457600080fd5b5050820193919092039150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561078b5761078b613701565b6060815260006137576060830186886133b7565b6020830194909452506040015292915050565b7f62000000000000000000000000000000000000000000000000000000000000008152600082516137a2816001850160208701613091565b9190910160010192915050565b8281526040602082015260006109ae60408301846130b5565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006137fe6060830184866133b7565b9695505050505050565b6020815260006109ae6020830184866133b7565b8181038181111561078b5761078b613701565b6040815260006138436040830185876133b7565b9050826020830152949350505050565b6040815260006138676040830185876133b7565b905060ff83166020830152949350505050565b60608152600061388e6060830186886133b7565b60208301949094525090151560409091015292915050565b6000602082840312156138b857600080fd5b815161093f81612d6756fea264697066735822122030f6a03eecf061513999472455e58728f2693e3a3541e4333a309b089861d90064736f6c63430008110033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v2/artifacts/UniversalSigValidator.ts b/packages/tests/src/builds/v2/artifacts/UniversalSigValidator.ts new file mode 100644 index 000000000..e1e10b087 --- /dev/null +++ b/packages/tests/src/builds/v2/artifacts/UniversalSigValidator.ts @@ -0,0 +1,190 @@ +export const universalSigValidator = { + _format: 'hh-sol-artifact-1', + contractName: 'UniversalSigValidator', + sourceName: 'contracts/EIP6492.sol', + abi: [ + { + inputs: [ + { + internalType: 'bytes', + name: 'error', + type: 'bytes' + } + ], + name: 'ERC1271Revert', + type: 'error' + }, + { + inputs: [ + { + internalType: 'bytes', + name: 'error', + type: 'bytes' + } + ], + name: 'ERC6492DeployFailed', + type: 'error' + }, + { + inputs: [ + { + internalType: 'address', + name: '_signer', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'isValidSig', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_signer', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + }, + { + internalType: 'bool', + name: 'allowSideEffects', + type: 'bool' + }, + { + internalType: 'bool', + name: 'deployAlreadyDeployed', + type: 'bool' + } + ], + name: 'isValidSigImpl', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_signer', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'isValidSigNoThrow', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_signer', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'isValidSigWithSideEffects', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '_signer', + type: 'address' + }, + { + internalType: 'bytes32', + name: '_hash', + type: 'bytes32' + }, + { + internalType: 'bytes', + name: '_signature', + type: 'bytes' + } + ], + name: 'isValidSigWithSideEffectsNoThrow', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'nonpayable', + type: 'function' + } + ], + bytecode: + '0x608060405234801561001057600080fd5b50610fbc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c806376be4cea1161005057806376be4cea146100a65780638f068430146100b957806398ef1ed8146100cc57600080fd5b80631c6453271461006c5780633d787b6314610093575b600080fd5b61007f61007a366004610ad4565b6100df565b604051901515815260200160405180910390f35b61007f6100a1366004610ad4565b61023d565b61007f6100b4366004610b3e565b61031e565b61007f6100c7366004610ad4565b6108e1565b61007f6100da366004610ad4565b61096e565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea9061012890889088908890889088908190600401610bc3565b6020604051808303816000875af1925050508015610181575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261017e91810190610c45565b60015b610232573d8080156101af576040519150601f19603f3d011682016040523d82523d6000602084013e6101b4565b606091505b508051600181900361022757816000815181106101d3576101d3610c69565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0100000000000000000000000000000000000000000000000000000000000000149250610235915050565b600092505050610235565b90505b949350505050565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea906102879088908890889088906001908990600401610bc3565b6020604051808303816000875af19250505080156102e0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526102dd91810190610c45565b60015b610232573d80801561030e576040519150601f19603f3d011682016040523d82523d6000602084013e610313565b606091505b506000915050610235565b600073ffffffffffffffffffffffffffffffffffffffff87163b6060827f64926492649264926492649264926492649264926492649264926492649264928888610369602082610c98565b610375928b9290610cd8565b61037e91610d02565b1490508015610484576000606089828a610399602082610c98565b926103a693929190610cd8565b8101906103b39190610e18565b955090925090508415806103c45750865b1561047d576000808373ffffffffffffffffffffffffffffffffffffffff16836040516103f19190610eb2565b6000604051808303816000865af19150503d806000811461042e576040519150601f19603f3d011682016040523d82523d6000602084013e610433565b606091505b50915091508161047a57806040517f9d0d6e2d0000000000000000000000000000000000000000000000000000000081526004016104719190610f18565b60405180910390fd5b50505b50506104be565b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294505050505b80806104ca5750600083115b156106bb576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90610523908c908690600401610f2b565b602060405180830381865afa92505050801561057a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261057791810190610f44565b60015b61060f573d8080156105a8576040519150601f19603f3d011682016040523d82523d6000602084013e6105ad565b606091505b50851580156105bc5750600084115b156105db576105d08b8b8b8b8b600161031e565b9450505050506108d7565b806040517f6f2a95990000000000000000000000000000000000000000000000000000000081526004016104719190610f18565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f1626ba7e000000000000000000000000000000000000000000000000000000001480158161065f575086155b801561066b5750600085115b1561068b5761067f8c8c8c8c8c600161031e565b955050505050506108d7565b841580156106965750825b80156106a0575087155b156106af57806000526001601ffd5b94506108d79350505050565b6041871461074b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5369676e617475726556616c696461746f72237265636f7665725369676e657260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610471565b600061075a6020828a8c610cd8565b61076391610d02565b90506000610775604060208b8d610cd8565b61077e91610d02565b905060008a8a604081811061079557610795610c69565b919091013560f81c915050601b81148015906107b557508060ff16601c14155b15610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5369676e617475726556616c696461746f723a20696e76616c6964207369676e60448201527f617475726520762076616c7565000000000000000000000000000000000000006064820152608401610471565b6040805160008152602081018083528e905260ff831691810191909152606081018490526080810183905273ffffffffffffffffffffffffffffffffffffffff8e169060019060a0016020604051602081039080840390855afa1580156108ad573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161496505050505050505b9695505050505050565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea9061092b9088908890889088906001908990600401610bc3565b6020604051808303816000875af115801561094a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102329190610c45565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea906109b790889088908890889088908190600401610bc3565b6020604051808303816000875af1925050508015610a10575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610a0d91810190610c45565b60015b610232573d808015610a3e576040519150601f19603f3d011682016040523d82523d6000602084013e610a43565b606091505b5080516001819003610a6257816000815181106101d3576101d3610c69565b8082fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610a8857600080fd5b50565b60008083601f840112610a9d57600080fd5b50813567ffffffffffffffff811115610ab557600080fd5b602083019150836020828501011115610acd57600080fd5b9250929050565b60008060008060608587031215610aea57600080fd5b8435610af581610a66565b935060208501359250604085013567ffffffffffffffff811115610b1857600080fd5b610b2487828801610a8b565b95989497509550505050565b8015158114610a8857600080fd5b60008060008060008060a08789031215610b5757600080fd5b8635610b6281610a66565b955060208701359450604087013567ffffffffffffffff811115610b8557600080fd5b610b9189828a01610a8b565b9095509350506060870135610ba581610b30565b91506080870135610bb581610b30565b809150509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201528360a0820152838560c0830137600060c085830181019190915292151560608201529015156080820152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909101019392505050565b600060208284031215610c5757600080fd5b8151610c6281610b30565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81810381811115610cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60008085851115610ce857600080fd5b83861115610cf557600080fd5b5050820193919092039150565b80356020831015610cd2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610d7e57600080fd5b813567ffffffffffffffff80821115610d9957610d99610d3e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610ddf57610ddf610d3e565b81604052838152866020858801011115610df857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610e2d57600080fd5b8335610e3881610a66565b9250602084013567ffffffffffffffff80821115610e5557600080fd5b610e6187838801610d6d565b93506040860135915080821115610e7757600080fd5b50610e8486828701610d6d565b9150509250925092565b60005b83811015610ea9578181015183820152602001610e91565b50506000910152565b60008251610ec4818460208701610e8e565b9190910192915050565b60008151808452610ee6816020860160208601610e8e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610c626020830184610ece565b8281526040602082015260006102356040830184610ece565b600060208284031215610f5657600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610c6257600080fdfea26469706673582212201a72aed4b15ffb05b6502997a9bb655992e06590bd26b336dfbb153d7ff6f34b64736f6c63430008120033', + deployedBytecode: + '0x608060405234801561001057600080fd5b50600436106100675760003560e01c806376be4cea1161005057806376be4cea146100a65780638f068430146100b957806398ef1ed8146100cc57600080fd5b80631c6453271461006c5780633d787b6314610093575b600080fd5b61007f61007a366004610ad4565b6100df565b604051901515815260200160405180910390f35b61007f6100a1366004610ad4565b61023d565b61007f6100b4366004610b3e565b61031e565b61007f6100c7366004610ad4565b6108e1565b61007f6100da366004610ad4565b61096e565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea9061012890889088908890889088908190600401610bc3565b6020604051808303816000875af1925050508015610181575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261017e91810190610c45565b60015b610232573d8080156101af576040519150601f19603f3d011682016040523d82523d6000602084013e6101b4565b606091505b508051600181900361022757816000815181106101d3576101d3610c69565b6020910101517fff00000000000000000000000000000000000000000000000000000000000000167f0100000000000000000000000000000000000000000000000000000000000000149250610235915050565b600092505050610235565b90505b949350505050565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea906102879088908890889088906001908990600401610bc3565b6020604051808303816000875af19250505080156102e0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526102dd91810190610c45565b60015b610232573d80801561030e576040519150601f19603f3d011682016040523d82523d6000602084013e610313565b606091505b506000915050610235565b600073ffffffffffffffffffffffffffffffffffffffff87163b6060827f64926492649264926492649264926492649264926492649264926492649264928888610369602082610c98565b610375928b9290610cd8565b61037e91610d02565b1490508015610484576000606089828a610399602082610c98565b926103a693929190610cd8565b8101906103b39190610e18565b955090925090508415806103c45750865b1561047d576000808373ffffffffffffffffffffffffffffffffffffffff16836040516103f19190610eb2565b6000604051808303816000865af19150503d806000811461042e576040519150601f19603f3d011682016040523d82523d6000602084013e610433565b606091505b50915091508161047a57806040517f9d0d6e2d0000000000000000000000000000000000000000000000000000000081526004016104719190610f18565b60405180910390fd5b50505b50506104be565b87878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509294505050505b80806104ca5750600083115b156106bb576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90610523908c908690600401610f2b565b602060405180830381865afa92505050801561057a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261057791810190610f44565b60015b61060f573d8080156105a8576040519150601f19603f3d011682016040523d82523d6000602084013e6105ad565b606091505b50851580156105bc5750600084115b156105db576105d08b8b8b8b8b600161031e565b9450505050506108d7565b806040517f6f2a95990000000000000000000000000000000000000000000000000000000081526004016104719190610f18565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f1626ba7e000000000000000000000000000000000000000000000000000000001480158161065f575086155b801561066b5750600085115b1561068b5761067f8c8c8c8c8c600161031e565b955050505050506108d7565b841580156106965750825b80156106a0575087155b156106af57806000526001601ffd5b94506108d79350505050565b6041871461074b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f5369676e617475726556616c696461746f72237265636f7665725369676e657260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610471565b600061075a6020828a8c610cd8565b61076391610d02565b90506000610775604060208b8d610cd8565b61077e91610d02565b905060008a8a604081811061079557610795610c69565b919091013560f81c915050601b81148015906107b557508060ff16601c14155b15610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5369676e617475726556616c696461746f723a20696e76616c6964207369676e60448201527f617475726520762076616c7565000000000000000000000000000000000000006064820152608401610471565b6040805160008152602081018083528e905260ff831691810191909152606081018490526080810183905273ffffffffffffffffffffffffffffffffffffffff8e169060019060a0016020604051602081039080840390855afa1580156108ad573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff161496505050505050505b9695505050505050565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea9061092b9088908890889088906001908990600401610bc3565b6020604051808303816000875af115801561094a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102329190610c45565b6040517f76be4cea00000000000000000000000000000000000000000000000000000000815260009030906376be4cea906109b790889088908890889088908190600401610bc3565b6020604051808303816000875af1925050508015610a10575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610a0d91810190610c45565b60015b610232573d808015610a3e576040519150601f19603f3d011682016040523d82523d6000602084013e610a43565b606091505b5080516001819003610a6257816000815181106101d3576101d3610c69565b8082fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610a8857600080fd5b50565b60008083601f840112610a9d57600080fd5b50813567ffffffffffffffff811115610ab557600080fd5b602083019150836020828501011115610acd57600080fd5b9250929050565b60008060008060608587031215610aea57600080fd5b8435610af581610a66565b935060208501359250604085013567ffffffffffffffff811115610b1857600080fd5b610b2487828801610a8b565b95989497509550505050565b8015158114610a8857600080fd5b60008060008060008060a08789031215610b5757600080fd5b8635610b6281610a66565b955060208701359450604087013567ffffffffffffffff811115610b8557600080fd5b610b9189828a01610a8b565b9095509350506060870135610ba581610b30565b91506080870135610bb581610b30565b809150509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201528360a0820152838560c0830137600060c085830181019190915292151560608201529015156080820152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909101019392505050565b600060208284031215610c5757600080fd5b8151610c6281610b30565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81810381811115610cd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60008085851115610ce857600080fd5b83861115610cf557600080fd5b5050820193919092039150565b80356020831015610cd2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112610d7e57600080fd5b813567ffffffffffffffff80821115610d9957610d99610d3e565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610ddf57610ddf610d3e565b81604052838152866020858801011115610df857600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215610e2d57600080fd5b8335610e3881610a66565b9250602084013567ffffffffffffffff80821115610e5557600080fd5b610e6187838801610d6d565b93506040860135915080821115610e7757600080fd5b50610e8486828701610d6d565b9150509250925092565b60005b83811015610ea9578181015183820152602001610e91565b50506000910152565b60008251610ec4818460208701610e8e565b9190910192915050565b60008151808452610ee6816020860160208601610e8e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610c626020830184610ece565b8281526040602082015260006102356040830184610ece565b600060208284031215610f5657600080fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610c6257600080fdfea26469706673582212201a72aed4b15ffb05b6502997a9bb655992e06590bd26b336dfbb153d7ff6f34b64736f6c63430008120033', + linkReferences: {}, + deployedLinkReferences: {} +} diff --git a/packages/tests/src/builds/v2/index.ts b/packages/tests/src/builds/v2/index.ts new file mode 100644 index 000000000..100e9f06b --- /dev/null +++ b/packages/tests/src/builds/v2/index.ts @@ -0,0 +1,5 @@ +export { factory } from './artifacts/Factory' +export { guestModule } from './artifacts/GuestModule' +export { mainModule } from './artifacts/MainModule' +export { mainModuleUpgradable } from './artifacts/MainModuleUpgradable' +export { universalSigValidator } from './artifacts/UniversalSigValidator' diff --git a/packages/tests/src/configs/index.ts b/packages/tests/src/configs/index.ts new file mode 100644 index 000000000..5b1f4b7f7 --- /dev/null +++ b/packages/tests/src/configs/index.ts @@ -0,0 +1 @@ +export * as random from './random' diff --git a/packages/tests/src/configs/random.ts b/packages/tests/src/configs/random.ts new file mode 100644 index 000000000..e25d84129 --- /dev/null +++ b/packages/tests/src/configs/random.ts @@ -0,0 +1,47 @@ +import { v1, v2 } from '@0xsequence/core' +import { ethers } from 'ethers' +import { maxForBits, randomBigNumber, randomBool } from '../utils' + +export function genRandomV1Config( + threshold: ethers.BigNumberish = randomBigNumber(0, maxForBits(16)), + numSigners: ethers.BigNumberish = randomBigNumber(1, 24) +): v1.config.WalletConfig { + const signers: v1.config.AddressMember[] = [] + + for (let i = ethers.constants.Zero; i.lt(numSigners); i = i.add(1)) { + signers.push({ + address: ethers.Wallet.createRandom().address, + weight: randomBigNumber(0, maxForBits(8)) + }) + } + + return { version: 1, threshold, signers } +} + +export function genRandomV2Config( + threshold: ethers.BigNumberish = randomBigNumber(0, maxForBits(16)), + checkpoint: ethers.BigNumberish = randomBigNumber(0, maxForBits(32)), + numSigners: ethers.BigNumberish = randomBigNumber(1, 24), + numSubdigests: ethers.BigNumberish = randomBigNumber(0, 24), + useMerkleTopology: boolean = randomBool() +): v2.config.WalletConfig { + const signers: v2.config.SignerLeaf[] = [] + for (let i = ethers.constants.Zero; i.lt(numSigners); i = i.add(1)) { + signers.push({ + address: ethers.Wallet.createRandom().address, + weight: randomBigNumber(0, maxForBits(8)) + }) + } + + const subdigests: v2.config.SubdigestLeaf[] = [] + for (let i = ethers.constants.Zero; i.lt(numSubdigests); i = i.add(1)) { + subdigests.push({ + subdigest: ethers.utils.hexlify(ethers.utils.randomBytes(32)) + }) + } + + const topologyBuilder = useMerkleTopology ? v2.config.merkleTopologyBuilder : v2.config.legacyTopologyBuilder + const tree = topologyBuilder([...signers, ...subdigests]) + + return { version: 2, threshold, checkpoint, tree } +} diff --git a/packages/tests/src/context/index.ts b/packages/tests/src/context/index.ts new file mode 100644 index 000000000..bbf4f864e --- /dev/null +++ b/packages/tests/src/context/index.ts @@ -0,0 +1,13 @@ +import { ethers } from 'ethers' + +import { deployV1Context } from './v1' +import { deployV2Context } from './v2' + +export async function deploySequenceContexts(signer: ethers.Signer) { + const v1 = await deployV1Context(signer) + const v2 = await deployV2Context(signer) + return { 1: v1, 2: v2 } +} + +export * as v1 from './v1' +export * as v2 from './v2' diff --git a/packages/tests/src/context/v1.ts b/packages/tests/src/context/v1.ts new file mode 100644 index 000000000..cce948bbd --- /dev/null +++ b/packages/tests/src/context/v1.ts @@ -0,0 +1,103 @@ +import { ethers } from 'ethers' +import { isContract } from '../utils' + +// These are the Sequence v1 contracts +// we use them if they are available +const predefinedAddresses = { + factory: '0xf9D09D634Fb818b05149329C1dcCFAeA53639d96', + mainModule: '0xd01F11855bCcb95f88D7A48492F66410d4637313', + mainModuleUpgradable: '0x7EFE6cE415956c5f80C6530cC6cc81b4808F6118', + guestModule: '0x02390F3E6E5FD1C6786CB78FD3027C117a9955A7', + multiCallUtils: '0xd130B43062D875a4B7aF3f8fc036Bc6e9D3E1B3E' +} + +export async function deployV1Context(signer: ethers.Signer): Promise<{ + version: 1 + factory: string + mainModule: string + mainModuleUpgradable: string + guestModule: string + multiCallUtils: string + walletCreationCode: string +}> { + // See if signer's provider has the contracts already deployed + const provider = signer.provider + if (!provider) { + throw new Error('Signer has no provider') + } + + if ( + await Promise.all(Object.values(predefinedAddresses).map(address => isContract(provider, address))).then(r => r.every(x => x)) + ) { + console.log('Using predefined addresses for V1 contracts') + + return { + version: 1, + + factory: predefinedAddresses.factory, + mainModule: predefinedAddresses.mainModule, + mainModuleUpgradable: predefinedAddresses.mainModuleUpgradable, + guestModule: predefinedAddresses.guestModule, + multiCallUtils: predefinedAddresses.multiCallUtils, + + walletCreationCode: '0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3' + } + } + + console.log('Predefined addresses for V1 contracts not found, deploying new ones') + + // Try deploying the v1 contracts using the v1 singleton factory + await signer.sendTransaction({ + to: '0x9c5a87452d4FAC0cbd53BDCA580b20A45526B3AB', + value: ethers.utils.parseEther('0.02170000000014'), + gasLimit: 8000000 + }) + + await signer.provider?.sendTransaction( + '0xf9010880852416b84e01830222e08080b8b66080604052348015600f57600080fd5b50609980601d6000396000f3fe60a06020601f369081018290049091028201604052608081815260009260609284918190838280828437600092018290525084519495509392505060208401905034f5604080516001600160a01b0383168152905191935081900360200190a0505000fea26469706673582212205a310755225e3c740b2f013fb6343f4c205e7141fcdf15947f5f0e0e818727fb64736f6c634300060a00331ca01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820' + ) + + // Deploy universal deployer + await signer.sendTransaction({ + to: '0x1b926fbb24a9f78dcdd3272f2d86f5d0660e59c0', + data: '0x608060405234801561001057600080fd5b5061013d806100206000396000f3fe60806040526004361061001e5760003560e01c80639c4ae2d014610023575b600080fd5b6100cb6004803603604081101561003957600080fd5b81019060208101813564010000000081111561005457600080fd5b82018360208201111561006657600080fd5b8035906020019184600183028401116401000000008311171561008857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506100cd915050565b005b60008183516020850134f56040805173ffffffffffffffffffffffffffffffffffffffff83168152905191925081900360200190a050505056fea264697066735822122033609f614f03931b92d88c309d698449bb77efcd517328d341fa4f923c5d8c7964736f6c63430007060033', + gasLimit: 8000000 + }) + + // Deploy factory + await signer.sendTransaction({ + to: '0x8a5bc19e22d6ad55a2c763b93a75d09f321fe764', + data: '0x9c4ae2d00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e8608060405234801561001057600080fd5b506101c8806100206000396000f3fe60806040526004361061001e5760003560e01c806332c02a1414610023575b600080fd5b61005c6004803603604081101561003957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610085565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60008060405180606001604052806028815260200161016b602891398473ffffffffffffffffffffffffffffffffffffffff166040516020018083805190602001908083835b6020831061010857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100cb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920193845250604080518085038152938201905282519294508693508401905034f594935050505056fe603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3a26469706673582212209b0bce93afab3297b9ebf4e58fa642ef123d74bcbd3bdb4e48b662eb12b430ca64736f6c63430007060033000000000000000000000000000000000000000000000000', + gasLimit: 8000000 + }) + + // Deploy mainModule + await signer.sendTransaction({ + to: '0x8a5bc19e22d6ad55a2c763b93a75d09f321fe764', + data: '0x9c4ae2d0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d8360c06040523480156200001157600080fd5b5060405162002d6338038062002d638339810160408190526200003491620000e2565b80600060405180606001604052806028815260200162002d3b60289139306001600160a01b03166040516020018083805190602001908083835b602083106200008f5780518252601f1990920191602091820191016200006e565b51815160209384036101000a60001901801990921691161790529201938452506040805180850381529382019052825192019190912060805250505060601b6001600160601b03191660a0525062000112565b600060208284031215620000f4578081fd5b81516001600160a01b03811681146200010b578182fd5b9392505050565b60805160a05160601c612bf862000143600039806106d55280611baa5250806106b15280611bdb5250612bf86000f3fe6080604052600436106101125760003560e01c80634fcf3eca116100a557806390042baf11610074578063b93ea7ad11610059578063b93ea7ad146103c5578063bc197c81146103e5578063f23a6e611461040557610119565b806390042baf1461039d578063affed0e0146103b057610119565b80634fcf3eca1461031d57806361c2926c1461033d5780637a9a16281461035d5780638c3f55631461037d57610119565b80631a9b2337116100e15780631a9b23371461029957806320c13b0b146102c6578063257671f5146102e65780632dd310001461030857610119565b806301ffc9a7146101f4578063025b22bc1461022a578063150b7a021461024c5780631626ba7e1461027957610119565b3661011957005b60006101486000357fffffffff0000000000000000000000000000000000000000000000000000000016610425565b905073ffffffffffffffffffffffffffffffffffffffff8116156101f1576000808273ffffffffffffffffffffffffffffffffffffffff166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101d2576040519150601f19603f3d011682016040523d82523d6000602084013e6101d7565b606091505b5091509150816101e957805160208201fd5b805160208201f35b50005b34801561020057600080fd5b5061021461020f366004612401565b61047b565b6040516102219190612633565b60405180910390f35b34801561023657600080fd5b5061024a610245366004612166565b610486565b005b34801561025857600080fd5b5061026c610267366004612237565b6105a7565b6040516102219190612660565b34801561028557600080fd5b5061026c6102943660046123b7565b6105d1565b3480156102a557600080fd5b506102b96102b4366004612401565b61064a565b6040516102219190612612565b3480156102d257600080fd5b5061026c6102e136600461244d565b610655565b3480156102f257600080fd5b506102fb6106af565b604051610221919061263e565b34801561031457600080fd5b506102b96106d3565b34801561032957600080fd5b5061024a610338366004612401565b6106f7565b34801561034957600080fd5b5061024a61035836600461231a565b6107d5565b34801561036957600080fd5b5061024a61037836600461234d565b61086e565b34801561038957600080fd5b506102fb6103983660046124e9565b6108ea565b6102b96103ab3660046124b6565b610916565b3480156103bc57600080fd5b506102fb6109ca565b3480156103d157600080fd5b5061024a6103e036600461241b565b6109db565b3480156103f157600080fd5b5061026c610400366004612180565b610ab4565b34801561041157600080fd5b5061026c6104203660046122a4565b610ae1565b60006104737fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610b0c565b90505b919050565b600061047382610b39565b3330146104de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b6104fd8173ffffffffffffffffffffffffffffffffffffffff16610b96565b610552576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180612a826039913960400191505060405180910390fd5b61055b81610b9c565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039181900360200190a150565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b600061061b6105df85610ba0565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c0092505050565b1561064357507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061047382610425565b600061067f6105df86866040518083838082843760405192018290039091209350610ba092505050565b156106a757507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b33301461074f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b600061075a82610425565b73ffffffffffffffffffffffffffffffffffffffff1614156107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806128e0602b913960400191505060405180910390fd5b6107d2816000610df8565b50565b33301461082d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b600061085e82604051602001610843919061277e565b60405160208183030381529060405280519060200120610ba0565b905061086a8183610e5b565b5050565b6108778261102a565b600061088f83856040516020016108439291906127c5565b905061089b8183610c00565b6108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190612721565b60405180910390fd5b6108e48185610e5b565b50505050565b60006104737f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610b0c565b6000333014610970576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006109d660006108ea565b905090565b333014610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612b9c6027913960400191505060405180910390fd5b6000610a3e83610425565b73ffffffffffffffffffffffffffffffffffffffff1614610aaa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806129f4602c913960400191505060405180910390fd5b61086a8282610df8565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf000000000000000000000000000000000000000000000000000000001415610b8d57506001610476565b610473826110ce565b3b151590565b3055565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b6000806000610c0e8461120f565b909250905061ffff821660005b8551831015610dd55760008080610c32898761127d565b975060ff91821694501691506001831415610c5a57610c5189876112fe565b96509050610d7e565b82610c86576060610c6b8a88611376565b97509050610c798b82611427565b9150828501945050610d7e565b6002831415610d2d57610c9989876112fe565b965090506000610ca98a886117b1565b975061ffff1690506060610cbe8b8984611822565b98509050610ccd8c8483611911565b610d22576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806129c26032913960400191505060405180910390fd5b505092810192610d7e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806128b4602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019350505050604051602081830303815290604052805190602001209450505050610c1b565b8361ffff168110158015610ded5750610ded82611b59565b979650505050505050565b61086a7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff00000000000000000000000000000000000000000000000000000000841673ffffffffffffffffffffffffffffffffffffffff8416611c37565b60005b8151811015611025576000828281518110610e7557fe5b602002602001015190506000606082604001515a1015610ec1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d1906126c4565b825115610f5957826060015173ffffffffffffffffffffffffffffffffffffffff168360400151600014610ef9578360400151610efb565b5a5b8460a00151604051610f0d91906125f6565b6000604051808303818686f4925050503d8060008114610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b509092509050610fee565b826060015173ffffffffffffffffffffffffffffffffffffffff1683608001518460400151600014610f8f578460400151610f91565b5a5b908560a00151604051610fa491906125f6565b600060405180830381858888f193505050503d8060008114610fe2576040519150601f19603f3d011682016040523d82523d6000602084013e610fe7565b606091505b5090925090505b811561100f5785604051611002919061263e565b60405180910390a061101a565b61101a838783611c65565b505050600101610e5e565b505050565b60008061103683611cb5565b915091506000611045836108ea565b9050808214611080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d19061268d565b6001820161108e8482611cce565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f88184826040516110bf9291906127de565b60405180910390a15050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba5000000000000000000000000000000000000000000000000000000000148061116157507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806111ad57507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806111f957507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561120657506001610476565b61047382611cf9565b6020810151815160f09190911c90600290811115611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061292e6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161129d57fe5b84518111156112f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612af76026913960400191505060405180910390fd5b9250925092565b8082016020015160601c6014820182811161131557fe5b835181111561136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061290b6023913960400191505060405180910390fd5b9250929050565b6040805160428082526080820190925260609160009190602082018180368337019050509150828401602001805160208401526020810151604084015260228101516042840152506042830190508281116113cd57fe5b835181111561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612a5f6023913960400191505060405180910390fd5b60008151604214611483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061287a603a913960400191505060405180910390fd5b60008260018451038151811061149557fe5b602001015160f81c60f81b60f81c60ff1690506000836040815181106114b757fe5b016020015160f81c905060006114cd8582611d56565b905060006114dc866020611d56565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d81526020018061283d603d913960400191505060405180910390fd5b8260ff16601b1415801561156f57508260ff16601c14155b156115c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612955603d913960400191505060405180910390fd5b60018414156116395760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611628573d6000803e3d6000fd5b50505060206040510351945061173b565b60028414156116ea5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611628573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612abb603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166117a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806129926030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c600282018281116117c857fe5b835181111561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612b3e6022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561183d57600080fd5b506040519080825280601f01601f191660200182016040528015611868576020820181803683370190505b509150838501602001600060205b8581101561188f57908201518482015260208101611876565b84860160200180519390920151908501525250828201838110156118af57fe5b8451811115611909576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612b1d6021913960400191505060405180910390fd5b935093915050565b6000808260018451038151811061192457fe5b016020015160f81c9050600181148061193d5750600281145b15611981578373ffffffffffffffffffffffffffffffffffffffff166119638685611427565b73ffffffffffffffffffffffffffffffffffffffff16149150611b51565b6003811415611b005782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b83811015611a3b578181015183820152602001611a23565b50505050905090810190601f168015611a685780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611a8657600080fd5b505afa158015611a9a573d6000803e3d6000fd5b505050506040513d6020811015611ab057600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611b51565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180612a20603f913960400191505060405180910390fd5b509392505050565b604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060601b166021830152603582018490527f0000000000000000000000000000000000000000000000000000000000000000605580840191909152835180840390910181526075909201909252805191012073ffffffffffffffffffffffffffffffffffffffff163014919050565b6040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b826020015115611c7757805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051611ca8929190612647565b60405180910390a1505050565b606081901c916bffffffffffffffffffffffff90911690565b61086a7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e8383611c37565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f025b22bc000000000000000000000000000000000000000000000000000000001415611d4d57506001610476565b61047382611dbe565b60008160200183511015611db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612b60603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415611e1257506001610476565b6104738260007fffffffff0000000000000000000000000000000000000000000000000000000082161580611e8857507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15611e9557506001610476565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610473565b803573ffffffffffffffffffffffffffffffffffffffff8116811461047657600080fd5b600082601f830112611f13578081fd5b8135602067ffffffffffffffff80831115611f2a57fe5b611f3782838502016127ec565b83815282810190868401865b86811015612013578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e03011215611f8157898afd5b604080518281018181108a82111715611f9657fe5b8252611fa3848b01612063565b8152611fb0828501612063565b8a8201526060808501358383015260809250611fcd838601611edf565b9082015260a08481013583830152928401359289841115611fec578c8dfd5b611ffa8f8c868801016120e3565b9082015287525050509285019290850190600101611f43565b509098975050505050505050565b60008083601f840112612032578182fd5b50813567ffffffffffffffff811115612049578182fd5b602083019150836020808302850101111561136f57600080fd5b8035801515811461047657600080fd5b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461047657600080fd5b60008083601f8401126120b4578182fd5b50813567ffffffffffffffff8111156120cb578182fd5b60208301915083602082850101111561136f57600080fd5b600082601f8301126120f3578081fd5b813567ffffffffffffffff81111561210757fe5b61213860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016127ec565b81815284602083860101111561214c578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612177578081fd5b61064382611edf565b60008060008060008060008060a0898b03121561219b578384fd5b6121a489611edf565b97506121b260208a01611edf565b9650604089013567ffffffffffffffff808211156121ce578586fd5b6121da8c838d01612021565b909850965060608b01359150808211156121f2578586fd5b6121fe8c838d01612021565b909650945060808b0135915080821115612216578384fd5b506122238b828c016120a3565b999c989b5096995094979396929594505050565b60008060008060006080868803121561224e578081fd5b61225786611edf565b945061226560208701611edf565b935060408601359250606086013567ffffffffffffffff811115612287578182fd5b612293888289016120a3565b969995985093965092949392505050565b60008060008060008060a087890312156122bc578182fd5b6122c587611edf565b95506122d360208801611edf565b94506040870135935060608701359250608087013567ffffffffffffffff8111156122fc578283fd5b61230889828a016120a3565b979a9699509497509295939492505050565b60006020828403121561232b578081fd5b813567ffffffffffffffff811115612341578182fd5b6106a784828501611f03565b600080600060608486031215612361578283fd5b833567ffffffffffffffff80821115612378578485fd5b61238487838801611f03565b94506020860135935060408601359150808211156123a0578283fd5b506123ad868287016120e3565b9150509250925092565b6000806000604084860312156123cb578283fd5b83359250602084013567ffffffffffffffff8111156123e8578283fd5b6123f4868287016120a3565b9497909650939450505050565b600060208284031215612412578081fd5b61064382612073565b6000806040838503121561242d578182fd5b61243683612073565b915061244460208401611edf565b90509250929050565b60008060008060408587031215612462578182fd5b843567ffffffffffffffff80821115612479578384fd5b612485888389016120a3565b9096509450602087013591508082111561249d578384fd5b506124aa878288016120a3565b95989497509550505050565b6000602082840312156124c7578081fd5b813567ffffffffffffffff8111156124dd578182fd5b6106a7848285016120e3565b6000602082840312156124fa578081fd5b5035919050565b6000815180845260208085018081965082840281019150828601855b8581101561259f5782840389528151805115158552858101511515868601526040808201519086015260608082015173ffffffffffffffffffffffffffffffffffffffff16908601526080808201519086015260a09081015160c09186018290529061258b818701836125ac565b9a87019a955050509084019060010161251d565b5091979650505050505050565b600081518084526125c4816020860160208601612810565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251612608818460208701612810565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526106a760408301846125ac565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6020808252601f908201527f4d61696e4d6f64756c65235f617574683a20494e56414c49445f4e4f4e434500604082015260600190565b60208082526024908201527f4d6f64756c6543616c6c73235f657865637574653a204e4f545f454e4f55474860408201527f5f47415300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d6f64756c6543616c6c7323657865637574653a20494e56414c49445f53494760408201527f4e41545552450000000000000000000000000000000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a0000000000000000000000000000000000000000000000000000006060830152608060208301526106436080830184612501565b6000838252604060208301526106a76040830184612501565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561280857fe5b604052919050565b60005b8381101561282b578181015183820152602001612813565b838111156108e4575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474d6f64756c65486f6f6b732372656d6f7665486f6f6b3a20484f4f4b5f4e4f545f524547495354455245444c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552454d6f64756c65486f6f6b7323616464486f6f6b3a20484f4f4b5f414c52454144595f524547495354455245445369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44534d6f64756c6555706461746523757064617465496d706c656d656e746174696f6e3a20494e56414c49445f494d504c454d454e544154494f4e5369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220b34deca9dd75815e4ef8a9279e45750ec5554b22c673e160bdba849d80f5888564736f6c63430007060033603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3000000000000000000000000f9d09d634fb818b05149329c1dccfaea53639d960000000000000000000000000000000000000000000000000000000000', + gasLimit: 8000000 + }) + + // Deploy mainModuleUpgradable + await signer.sendTransaction({ + to: '0x8A5Bc19e22D6aD55a2c763B93A75d09F321fe764', + data: '0x9c4ae2d0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d07608060405234801561001057600080fd5b50612ce7806100206000396000f3fe6080604052600436106101125760003560e01c806351605d80116100a557806390042baf11610074578063b93ea7ad11610059578063b93ea7ad146103d0578063bc197c81146103f0578063f23a6e611461041057610119565b806390042baf146103a8578063affed0e0146103bb57610119565b806351605d801461032657806361c2926c146103485780637a9a1628146103685780638c3f55631461038857610119565b80631a9b2337116100e15780631a9b23371461029957806320c13b0b146102c657806329561426146102e65780634fcf3eca1461030657610119565b806301ffc9a7146101f4578063025b22bc1461022a578063150b7a021461024c5780631626ba7e1461027957610119565b3661011957005b60006101486000357fffffffff0000000000000000000000000000000000000000000000000000000016610430565b905073ffffffffffffffffffffffffffffffffffffffff8116156101f1576000808273ffffffffffffffffffffffffffffffffffffffff166000366040518083838082843760405192019450600093509091505080830381855af49150503d80600081146101d2576040519150601f19603f3d011682016040523d82523d6000602084013e6101d7565b606091505b5091509150816101e957805160208201fd5b805160208201f35b50005b34801561020057600080fd5b5061021461020f3660046124d4565b610486565b60405161022191906126eb565b60405180910390f35b34801561023657600080fd5b5061024a610245366004612221565b610491565b005b34801561025857600080fd5b5061026c6102673660046122f2565b6105b2565b6040516102219190612718565b34801561028557600080fd5b5061026c61029436600461248a565b6105dc565b3480156102a557600080fd5b506102b96102b43660046124d4565b610655565b60405161022191906126ca565b3480156102d257600080fd5b5061026c6102e1366004612520565b610660565b3480156102f257600080fd5b5061024a610301366004612472565b6106ba565b34801561031257600080fd5b5061024a6103213660046124d4565b6107c8565b34801561033257600080fd5b5061033b6108a6565b60405161022191906126f6565b34801561035457600080fd5b5061024a6103633660046123d5565b6108d6565b34801561037457600080fd5b5061024a610383366004612408565b61096f565b34801561039457600080fd5b5061033b6103a3366004612472565b6109eb565b6102b96103b6366004612589565b610a17565b3480156103c757600080fd5b5061033b610acb565b3480156103dc57600080fd5b5061024a6103eb3660046124ee565b610ad7565b3480156103fc57600080fd5b5061026c61040b36600461223b565b610bb0565b34801561041c57600080fd5b5061026c61042b36600461235f565b610bdd565b600061047e7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff000000000000000000000000000000000000000000000000000000008416610c08565b90505b919050565b600061047e82610c35565b3330146104e9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b6105088173ffffffffffffffffffffffffffffffffffffffff16610c92565b61055d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180612b716039913960400191505060405180910390fd5b61056681610c98565b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039181900360200190a150565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b60006106266105ea85610c9c565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cfc92505050565b1561064e57507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061047e82610430565b600061068a6105ea86866040518083838082843760405192018290039091209350610c9c92505050565b156106b257507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b333014610712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b80610768576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806129986037913960400191505060405180910390fd5b6107927fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf882610ef4565b6040805182815290517f307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa9181900360200190a150565b333014610820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b600061082b82610430565b73ffffffffffffffffffffffffffffffffffffffff161415610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806129cf602b913960400191505060405180910390fd5b6108a3816000610ef8565b50565b60006108d17fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8610f5b565b905090565b33301461092e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b600061095f826040516020016109449190612836565b60405160208183030381529060405280519060200120610c9c565b905061096b8183610f5f565b5050565b6109788261112e565b6000610990838560405160200161094492919061287d565b905061099c8183610cfc565b6109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d2906127d9565b60405180910390fd5b6109e58185610f5f565b50505050565b600061047e7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610c08565b6000333014610a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006108d160006109eb565b333014610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612c8b6027913960400191505060405180910390fd5b6000610b3a83610430565b73ffffffffffffffffffffffffffffffffffffffff1614610ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180612ae3602c913960400191505060405180910390fd5b61096b8282610ef8565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf000000000000000000000000000000000000000000000000000000001415610c8957506001610481565b61047e826111d2565b3b151590565b3055565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b6000806000610d0a84611313565b909250905061ffff821660005b8551831015610ed15760008080610d2e8987611381565b975060ff91821694501691506001831415610d5657610d4d8987611402565b96509050610e7a565b82610d82576060610d678a8861147a565b97509050610d758b8261152b565b9150828501945050610e7a565b6002831415610e2957610d958987611402565b965090506000610da58a886118b5565b975061ffff1690506060610dba8b8984611926565b98509050610dc98c8483611a15565b610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180612ab16032913960400191505060405180910390fd5b505092810192610e7a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061296c602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019350505050604051602081830303815290604052805190602001209450505050610d17565b8361ffff168110158015610ee95750610ee982611c5d565b979650505050505050565b9055565b61096b7fbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a1207fffffffff00000000000000000000000000000000000000000000000000000000841673ffffffffffffffffffffffffffffffffffffffff8416611c9a565b5490565b60005b8151811015611129576000828281518110610f7957fe5b602002602001015190506000606082604001515a1015610fc5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d29061277c565b82511561105d57826060015173ffffffffffffffffffffffffffffffffffffffff168360400151600014610ffd578360400151610fff565b5a5b8460a0015160405161101191906126ae565b6000604051808303818686f4925050503d806000811461104d576040519150601f19603f3d011682016040523d82523d6000602084013e611052565b606091505b5090925090506110f2565b826060015173ffffffffffffffffffffffffffffffffffffffff1683608001518460400151600014611093578460400151611095565b5a5b908560a001516040516110a891906126ae565b600060405180830381858888f193505050503d80600081146110e6576040519150601f19603f3d011682016040523d82523d6000602084013e6110eb565b606091505b5090925090505b8115611113578560405161110691906126f6565b60405180910390a061111e565b61111e838783611cc8565b505050600101610f62565b505050565b60008061113a83611d18565b915091506000611149836109eb565b9050808214611184576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d290612745565b600182016111928482611d31565b7f1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f88184826040516111c3929190612896565b60405180910390a15050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fec6aba5000000000000000000000000000000000000000000000000000000000148061126557507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b806112b157507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b806112fd57507fffffffff0000000000000000000000000000000000000000000000000000000082167fc0ee0b8a00000000000000000000000000000000000000000000000000000000145b1561130a57506001610481565b61047e82611d5c565b6020810151815160f09190911c9060029081111561137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612a1d6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff16600283018381116113a157fe5b84518111156113fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612be66026913960400191505060405180910390fd5b9250925092565b8082016020015160601c6014820182811161141957fe5b8351811115611473576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806129fa6023913960400191505060405180910390fd5b9250929050565b6040805160428082526080820190925260609160009190602082018180368337019050509150828401602001805160208401526020810151604084015260228101516042840152506042830190508281116114d157fe5b8351811115611473576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180612b4e6023913960400191505060405180910390fd5b60008151604214611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180612932603a913960400191505060405180910390fd5b60008260018451038151811061159957fe5b602001015160f81c60f81b60f81c60ff1690506000836040815181106115bb57fe5b016020015160f81c905060006115d18582611db9565b905060006115e0866020611db9565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806128f5603d913960400191505060405180910390fd5b8260ff16601b1415801561167357508260ff16601c14155b156116c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612a44603d913960400191505060405180910390fd5b600184141561173d5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561172c573d6000803e3d6000fd5b50505060206040510351945061183f565b60028414156117ee5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561172c573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612baa603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85166118ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180612a816030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c600282018281116118cc57fe5b8351811115611473576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180612c2d6022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561194157600080fd5b506040519080825280601f01601f19166020018201604052801561196c576020820181803683370190505b509150838501602001600060205b858110156119935790820151848201526020810161197a565b84860160200180519390920151908501525250828201838110156119b357fe5b8451811115611a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612c0c6021913960400191505060405180910390fd5b935093915050565b60008082600184510381518110611a2857fe5b016020015160f81c90506001811480611a415750600281145b15611a85578373ffffffffffffffffffffffffffffffffffffffff16611a67868561152b565b73ffffffffffffffffffffffffffffffffffffffff16149150611c55565b6003811415611c045782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b83811015611b3f578181015183820152602001611b27565b50505050905090810190601f168015611b6c5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611b8a57600080fd5b505afa158015611b9e573d6000803e3d6000fd5b505050506040513d6020811015611bb457600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611c55565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180612b0f603f913960400191505060405180910390fd5b509392505050565b6000811580159061047e5750611c927fea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8610f5b565b909114919050565b6040805160208082019590955280820193909352805180840382018152606090930190528151919092012055565b826020015115611cda57805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd78282604051611d0b9291906126ff565b60405180910390a1505050565b606081901c916bffffffffffffffffffffffff90911690565b61096b7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e8383611c9a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f025b22bc000000000000000000000000000000000000000000000000000000001415611db057506001610481565b61047e82611e21565b60008160200183511015611e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612c4f603c913960400191505060405180910390fd5b50016020015190565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415611e7557506001610481565b61047e8260007fffffffff0000000000000000000000000000000000000000000000000000000082167f783649a6000000000000000000000000000000000000000000000000000000001415611ecd57506001610481565b61047e8260007fffffffff0000000000000000000000000000000000000000000000000000000082161580611f4357507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b15611f5057506001610481565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461047e565b803573ffffffffffffffffffffffffffffffffffffffff8116811461048157600080fd5b600082601f830112611fce578081fd5b8135602067ffffffffffffffff80831115611fe557fe5b611ff282838502016128a4565b83815282810190868401865b868110156120ce578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e0301121561203c57898afd5b604080518281018181108a8211171561205157fe5b825261205e848b0161211e565b815261206b82850161211e565b8a8201526060808501358383015260809250612088838601611f9a565b9082015260a084810135838301529284013592898411156120a7578c8dfd5b6120b58f8c8688010161219e565b9082015287525050509285019290850190600101611ffe565b509098975050505050505050565b60008083601f8401126120ed578182fd5b50813567ffffffffffffffff811115612104578182fd5b602083019150836020808302850101111561147357600080fd5b8035801515811461048157600080fd5b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461048157600080fd5b60008083601f84011261216f578182fd5b50813567ffffffffffffffff811115612186578182fd5b60208301915083602082850101111561147357600080fd5b600082601f8301126121ae578081fd5b813567ffffffffffffffff8111156121c257fe5b6121f360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016128a4565b818152846020838601011115612207578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612232578081fd5b61064e82611f9a565b60008060008060008060008060a0898b031215612256578384fd5b61225f89611f9a565b975061226d60208a01611f9a565b9650604089013567ffffffffffffffff80821115612289578586fd5b6122958c838d016120dc565b909850965060608b01359150808211156122ad578586fd5b6122b98c838d016120dc565b909650945060808b01359150808211156122d1578384fd5b506122de8b828c0161215e565b999c989b5096995094979396929594505050565b600080600080600060808688031215612309578081fd5b61231286611f9a565b945061232060208701611f9a565b935060408601359250606086013567ffffffffffffffff811115612342578182fd5b61234e8882890161215e565b969995985093965092949392505050565b60008060008060008060a08789031215612377578182fd5b61238087611f9a565b955061238e60208801611f9a565b94506040870135935060608701359250608087013567ffffffffffffffff8111156123b7578283fd5b6123c389828a0161215e565b979a9699509497509295939492505050565b6000602082840312156123e6578081fd5b813567ffffffffffffffff8111156123fc578182fd5b6106b284828501611fbe565b60008060006060848603121561241c578283fd5b833567ffffffffffffffff80821115612433578485fd5b61243f87838801611fbe565b945060208601359350604086013591508082111561245b578283fd5b506124688682870161219e565b9150509250925092565b600060208284031215612483578081fd5b5035919050565b60008060006040848603121561249e578283fd5b83359250602084013567ffffffffffffffff8111156124bb578283fd5b6124c78682870161215e565b9497909650939450505050565b6000602082840312156124e5578081fd5b61064e8261212e565b60008060408385031215612500578182fd5b6125098361212e565b915061251760208401611f9a565b90509250929050565b60008060008060408587031215612535578182fd5b843567ffffffffffffffff8082111561254c578384fd5b6125588883890161215e565b90965094506020870135915080821115612570578384fd5b5061257d8782880161215e565b95989497509550505050565b60006020828403121561259a578081fd5b813567ffffffffffffffff8111156125b0578182fd5b6106b28482850161219e565b6000815180845260208085019450848183028601828601855b858110156126575783830389528151805115158452858101511515868501526040808201519085015260608082015173ffffffffffffffffffffffffffffffffffffffff16908501526080808201519085015260a09081015160c09185018290529061264381860183612664565b9a87019a94505050908401906001016125d5565b5090979650505050505050565b6000815180845261267c8160208601602086016128c8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b600082516126c08184602087016128c8565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526106b26040830184612664565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b6020808252601f908201527f4d61696e4d6f64756c65235f617574683a20494e56414c49445f4e4f4e434500604082015260600190565b60208082526024908201527f4d6f64756c6543616c6c73235f657865637574653a204e4f545f454e4f55474860408201527f5f47415300000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4d6f64756c6543616c6c7323657865637574653a20494e56414c49445f53494760408201527f4e41545552450000000000000000000000000000000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a00000000000000000000000000000000000000000000000000000060608301526080602083015261064e60808301846125bc565b6000838252604060208301526106b260408301846125bc565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156128c057fe5b604052919050565b60005b838110156128e35781810151838201526020016128cb565b838111156109e5575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474d6f64756c654175746855706772616461626c6523757064617465496d6167654861736820494e56414c49445f494d4147455f484153484d6f64756c65486f6f6b732372656d6f7665486f6f6b3a20484f4f4b5f4e4f545f524547495354455245444c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552454d6f64756c65486f6f6b7323616464486f6f6b3a20484f4f4b5f414c52454144595f524547495354455245445369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44534d6f64756c6555706461746523757064617465496d706c656d656e746174696f6e3a20494e56414c49445f494d504c454d454e544154494f4e5369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220aebb8d931ef86555b6441c416b208bb9fe8fe0974c5733ebbccce548296c37ce64736f6c6343000706003300000000000000000000000000000000000000000000000000', + gasLimit: 8000000 + }) + + // Deploy guestModule + await signer.sendTransaction({ + to: '0x8A5Bc19e22D6aD55a2c763B93A75d09F321fe764', + data: '0x9c4ae2d0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dfc608060405234801561001057600080fd5b50611ddc806100206000396000f3fe60806040526004361061007b5760003560e01c80637a9a16281161004e5780637a9a1628146101255780638c3f55631461014557806390042baf14610172578063affed0e0146101925761007b565b806301ffc9a7146100805780631626ba7e146100b657806320c13b0b146100e357806361c2926c14610103575b600080fd5b34801561008c57600080fd5b506100a061009b366004611677565b6101a7565b6040516100ad91906118be565b60405180910390f35b3480156100c257600080fd5b506100d66100d136600461162d565b6101ba565b6040516100ad91906118eb565b3480156100ef57600080fd5b506100d66100fe3660046116b7565b610233565b34801561010f57600080fd5b5061012361011e366004611590565b61028d565b005b34801561013157600080fd5b506101236101403660046115c3565b6102ce565b34801561015157600080fd5b50610165610160366004611753565b6102f6565b6040516100ad91906118c9565b610185610180366004611720565b610322565b6040516100ad919061189d565b34801561019e57600080fd5b506101656103d6565b60006101b2826103e7565b90505b919050565b60006102046101c885610444565b84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506104a492505050565b1561022c57507f1626ba7e000000000000000000000000000000000000000000000000000000005b9392505050565b600061025d6101c88686604051808383808284376040519201829003909120935061044492505050565b1561028557507f20c13b0b000000000000000000000000000000000000000000000000000000005b949350505050565b60006102be826040516020016102a39190611a19565b60405160208183030381529060405280519060200120610444565b90506102ca818361069c565b5050565b60006102e4846040516020016102a39190611975565b90506102f0818561069c565b50505050565b60006101b27f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610817565b600033301461037c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611d806027913960400191505060405180910390fd5b81516020830134f06040805173ffffffffffffffffffffffffffffffffffffffff8316815290519192507fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c919081900360200190a1919050565b60006103e260006102f6565b905090565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f90042baf00000000000000000000000000000000000000000000000000000000141561043b575060016101b5565b6101b282610844565b604080517f19010000000000000000000000000000000000000000000000000000000000006020808301919091524660228301523060601b6042830152605680830194909452825180830390940184526076909101909152815191012090565b60008060006104b2846108a1565b909250905061ffff821660005b855183101561067957600080806104d6898761090f565b975060ff918216945016915060018314156104fe576104f58987610990565b96509050610622565b8261052a57606061050f8a88610a08565b9750905061051d8b82610ab9565b9150828501945050610622565b60028314156105d15761053d8987610990565b96509050600061054d8a88610e43565b975061ffff16905060606105628b8984610eb4565b985090506105718c8483610fa3565b6105c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611c0b6032913960400191505060405180910390fd5b505092810192610622565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180611b28602c913960400191505060405180910390fd5b848282604051602001808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200193505050506040516020818303038152906040528051906020012094505050506104bf565b8361ffff1681101580156106915750610691826111eb565b979650505050505050565b60005b81518110156108125760008282815181106106b657fe5b6020026020010151905060006060826000015115610709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610700906119bc565b60405180910390fd5b82604001515a1015610747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070090611918565b826060015173ffffffffffffffffffffffffffffffffffffffff168360800151846040015160001461077d57846040015161077f565b5a5b908560a001516040516107929190611881565b600060405180830381858888f193505050503d80600081146107d0576040519150601f19603f3d011682016040523d82523d6000602084013e6107d5565b606091505b50909250905081156107fc57856040516107ef91906118c9565b60405180910390a0610807565b6108078387836111f1565b50505060010161069f565b505050565b60408051602080820194909452808201929092528051808303820181526060909201905280519101205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f389901c7000000000000000000000000000000000000000000000000000000001415610898575060016101b5565b6101b282611241565b6020810151815160f09190911c9060029081111561090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611b776027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161092f57fe5b8451811115610989576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611cdb6026913960400191505060405180910390fd5b9250925092565b8082016020015160601c601482018281116109a757fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611b546023913960400191505060405180910390fd5b9250929050565b604080516042808252608082019092526060916000919060208201818036833701905050915082840160200180516020840152602081015160408401526022810151604284015250604283019050828111610a5f57fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611c7c6023913960400191505060405180910390fd5b60008151604214610b15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180611aee603a913960400191505060405180910390fd5b600082600184510381518110610b2757fe5b602001015160f81c60f81b60f81c60ff169050600083604081518110610b4957fe5b016020015160f81c90506000610b5f85826112c9565b90506000610b6e8660206112c9565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0811115610be9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611ab1603d913960400191505060405180910390fd5b8260ff16601b14158015610c0157508260ff16601c14155b15610c57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180611b9e603d913960400191505060405180910390fd5b6001841415610ccb5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610cba573d6000803e3d6000fd5b505050602060405103519450610dcd565b6002841415610d7c5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015610cba573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611c9f603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8516610e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180611bdb6030913960400191505060405180910390fd5b5050505092915050565b8082016020015160f01c60028201828111610e5a57fe5b8351811115610a01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611d226022913960400191505060405180910390fd5b606060008267ffffffffffffffff81118015610ecf57600080fd5b506040519080825280601f01601f191660200182016040528015610efa576020820181803683370190505b509150838501602001600060205b85811015610f2157908201518482015260208101610f08565b8486016020018051939092015190850152525082820183811015610f4157fe5b8451811115610f9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611d016021913960400191505060405180910390fd5b935093915050565b60008082600184510381518110610fb657fe5b016020015160f81c90506001811480610fcf5750600281145b15611013578373ffffffffffffffffffffffffffffffffffffffff16610ff58685610ab9565b73ffffffffffffffffffffffffffffffffffffffff161491506111e3565b60038114156111925782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b838110156110cd5781810151838201526020016110b5565b50505050905090810190601f1680156110fa5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b15801561111857600080fd5b505afa15801561112c573d6000803e3d6000fd5b505050506040513d602081101561114257600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e000000000000000000000000000000000000000000000000000000001491506111e3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180611c3d603f913960400191505060405180910390fd5b509392505050565b50600190565b82602001511561120357805160208201fd5b7f3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd782826040516112349291906118d2565b60405180910390a1505050565b60007fffffffff00000000000000000000000000000000000000000000000000000000821615806112b357507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b156112c0575060016101b5565b6101b282611331565b60008160200183511015611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180611d44603c913960400191505060405180910390fd5b50016020015190565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101b557600080fd5b600082601f8301126113af578081fd5b8135602067ffffffffffffffff808311156113c657fe5b6113d38283850201611a60565b83815282810190868401865b868110156114af578135890160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838e0301121561141d57898afd5b604080518281018181108a8211171561143257fe5b825261143f848b016114bd565b815261144c8285016114bd565b8a820152606080850135838301526080925061146983860161137b565b9082015260a08481013583830152928401359289841115611488578c8dfd5b6114968f8c8688010161150d565b90820152875250505092850192908501906001016113df565b509098975050505050505050565b803580151581146101b557600080fd5b60008083601f8401126114de578182fd5b50813567ffffffffffffffff8111156114f5578182fd5b602083019150836020828501011115610a0157600080fd5b600082601f83011261151d578081fd5b813567ffffffffffffffff81111561153157fe5b61156260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611a60565b818152846020838601011115611576578283fd5b816020850160208301379081016020019190915292915050565b6000602082840312156115a1578081fd5b813567ffffffffffffffff8111156115b7578182fd5b6102858482850161139f565b6000806000606084860312156115d7578182fd5b833567ffffffffffffffff808211156115ee578384fd5b6115fa8783880161139f565b9450602086013593506040860135915080821115611616578283fd5b506116238682870161150d565b9150509250925092565b600080600060408486031215611641578283fd5b83359250602084013567ffffffffffffffff81111561165e578283fd5b61166a868287016114cd565b9497909650939450505050565b600060208284031215611688578081fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461022c578182fd5b600080600080604085870312156116cc578081fd5b843567ffffffffffffffff808211156116e3578283fd5b6116ef888389016114cd565b90965094506020870135915080821115611707578283fd5b50611714878288016114cd565b95989497509550505050565b600060208284031215611731578081fd5b813567ffffffffffffffff811115611747578182fd5b6102858482850161150d565b600060208284031215611764578081fd5b5035919050565b60008282518085526020808601955080818302840101818601855b8481101561182a578583037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00189528151805115158452848101511515858501526040808201519085015260608082015173ffffffffffffffffffffffffffffffffffffffff16908501526080808201519085015260a09081015160c09185018290529061181681860183611837565b9a86019a9450505090830190600101611786565b5090979650505050505050565b6000815180845261184f816020860160208601611a84565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008251611893818460208701611a84565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b901515815260200190565b90815260200190565b6000838252604060208301526102856040830184611837565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b60208082526029908201527f47756573744d6f64756c65235f6578656375746547756573743a204e4f545f4560408201527f4e4f5547485f4741530000000000000000000000000000000000000000000000606082015260800190565b600060408252600660408301527f67756573743a000000000000000000000000000000000000000000000000000060608301526080602083015261022c608083018461176b565b60208082526033908201527f47756573744d6f64756c65235f6578656375746547756573743a2064656c656760408201527f61746543616c6c206e6f7420616c6c6f77656400000000000000000000000000606082015260800190565b600060408252600560408301527f73656c663a00000000000000000000000000000000000000000000000000000060608301526080602083015261022c608083018461176b565b60405181810167ffffffffffffffff81118282101715611a7c57fe5b604052919050565b60005b83811015611a9f578181015183820152602001611a87565b838111156102f0575050600091015256fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684d6f64756c6541757468235f7369676e617475726556616c69646174696f6e20494e56414c49445f464c41474c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45524d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a20494e56414c49445f5349474e41545552455369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f52455155495245444d6f64756c6553656c6641757468236f6e6c7953656c663a204e4f545f415554484f52495a4544a2646970667358221220f5a1de0b650baa2ee828e8766bc6dbd0c74da0cc4735a143852d24f868e4b62464736f6c6343000706003300000000', + gasLimit: 8000000 + }) + + // Deploy multiCallUtils + await signer.sendTransaction({ + to: '0x8A5Bc19e22D6aD55a2c763B93A75d09F321fe764', + data: '0x9c4ae2d0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002b1660c06040523480156200001157600080fd5b5060405162002ad638038062002ad68339810160408190526200003491620000cd565b8181816001600160a01b031660a0816001600160a01b031660601b8152505060405180606001604052806028815260200162002aae60289139816001600160a01b03166040516020016200008a92919062000104565b60408051601f198184030181529190528051602090910120608052506200014692505050565b80516001600160a01b0381168114620000c857600080fd5b919050565b60008060408385031215620000e0578182fd5b620000eb83620000b0565b9150620000fb60208401620000b0565b90509250929050565b60008351815b818110156200012657602081870181015185830152016200010a565b81811115620001355782828501525b509190910191825250602001919050565b60805160a05160601c61293762000177600039806106515280610b1b5250806106755280610b3f52506129376000f3fe6080604052600436106101805760003560e01c806398f9fbc4116100d6578063d1db39071161007f578063e90f13e711610059578063e90f13e714610395578063f209883a146103ea578063ffd7d741146103ff57610180565b8063d1db390714610395578063d5b5337f146103aa578063e717aba9146103ca57610180565b8063c272d5c3116100b0578063c272d5c314610333578063c39f2d5c14610348578063c66764e11461036857610180565b806398f9fbc4146102e9578063aeea5fb5146102fe578063b472f0a21461031357610180565b806348acd29f116101385780637ae99638116101125780637ae99638146102875780637f29d538146102a7578063984395bc146102c757610180565b806348acd29f14610227578063543196eb146102475780637082503b1461026757610180565b80631cd05dc4116101695780631cd05dc4146101d057806343d9c935146101f057806344d466c21461020557610180565b80630fdecfac146101855780631551f0ab146101b0575b600080fd5b34801561019157600080fd5b5061019a610420565b6040516101a79190612190565b60405180910390f35b3480156101bc57600080fd5b5061019a6101cb366004611e76565b610424565b3480156101dc57600080fd5b5061019a6101eb366004611bea565b610436565b3480156101fc57600080fd5b5061019a610448565b34801561021157600080fd5b50610225610220366004611ca4565b610450565b005b34801561023357600080fd5b5061019a610242366004611bea565b61080a565b34801561025357600080fd5b5061019a610262366004611bea565b610828565b34801561027357600080fd5b50610225610282366004611c0b565b61082c565b34801561029357600080fd5b5061019a6102a2366004611bea565b610cb0565b3480156102b357600080fd5b506102256102c2366004611e76565b610cc2565b3480156102d357600080fd5b506102dc610cfe565b6040516101a79190612000565b3480156102f557600080fd5b506102dc610d02565b34801561030a57600080fd5b5061019a610d06565b34801561031f57600080fd5b5061022561032e366004611c7b565b610d0a565b34801561033f57600080fd5b5061019a610de8565b34801561035457600080fd5b5061019a610363366004611bea565b610dec565b34801561037457600080fd5b50610388610383366004611bea565b610df0565b6040516101a791906121c5565b3480156103a157600080fd5b5061019a610e35565b3480156103b657600080fd5b5061019a6103c5366004611e76565b610e39565b3480156103d657600080fd5b5061019a6103e5366004611bea565b610e3d565b3480156103f657600080fd5b5061019a610e4f565b61041261040d366004611d34565b610e53565b6040516101a7929190612021565b4690565b60036020526000908152604090205481565b60006020819052908152604090205481565b60005a905090565b8360005b838110156104e9578185858381811061046957fe5b9050604002016000013586868481811061047f57fe5b90506040020160200160208101906104979190611bea565b6040516020016104a993929190612199565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209150600101610454565b506000808773ffffffffffffffffffffffffffffffffffffffff166351605d8060e01b60405160200161051c9190611f54565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261055491611f81565b6000604051808303816000865af19150503d8060008114610591576040519150601f19603f3d011682016040523d82523d6000602084013e610596565b606091505b50915091508180156105a9575080516020145b1561060e576000818060200190518101906105c49190611e8e565b9050838114610608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612543565b60405180910390fd5b50610732565b60405173ffffffffffffffffffffffffffffffffffffffff89169061069d907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009087907f000000000000000000000000000000000000000000000000000000000000000090602001611ef0565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614610703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906125a0565b83156107325773ffffffffffffffffffffffffffffffffffffffff881660009081526002602052604090208390555b828873ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee89898960405160200161077f9291906120c7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526107b89291612623565b60405180910390a383156108005773ffffffffffffffffffffffffffffffffffffffff8816600090815260016020908152604080832043908190558684526003909252909120555b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116315b919050565b3f90565b600080610838846110c3565b9150915060008046905080898960405160200161085793929190611f9d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012091505061ffff831660008767ffffffffffffffff811180156108ae57600080fd5b506040519080825280602002602001820160405280156108e857816020015b6108d5611b1c565b8152602001906001900390816108cd5790505b50905060005b8751851015610a9f57600080806109058b89611131565b995060ff9182169450169150600183141561092d576109248b896111b2565b98509050610a20565b8261095f57606061093e8c8a61122a565b9950905061094c88826112db565b91506109598f838d611665565b50610a20565b60028314156109ee576109728b896111b2565b9850905060006109828c8a6116f3565b995061ffff16905060606109978d8b84611764565b9a5090506109a6898483611853565b6109dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff9061242c565b50506109e98e828c611665565b610a20565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906121d8565b60405180604001604052808381526020018273ffffffffffffffffffffffffffffffffffffffff16815250858581518110610a5757fe5b60200260200101819052508380600101945050858282604051602001610a7f93929190612199565b6040516020818303038152906040528051906020012095505050506108ee565b888114610ad8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906124e6565b60405173ffffffffffffffffffffffffffffffffffffffff8c1690610b67907fff00000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009087907f000000000000000000000000000000000000000000000000000000000000000090602001611ef0565b6040516020818303038152906040528051906020012060001c73ffffffffffffffffffffffffffffffffffffffff1614610bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906123a9565b828b73ffffffffffffffffffffffffffffffffffffffff167fb502b7446ca079086188acf3abef47c2f464f2ee9a72fcdf05ffcb74dcc17cee8885604051602001610c18919061212b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815290829052610c5192916125fe565b60405180910390a38615610ca35773ffffffffffffffffffffffffffffffffffffffff8b1660008181526001602090815260408083204390819055878452600383528184205592825260029052208390555b5050505050505050505050565b60026020526000908152604090205481565b804210610cfb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff9061234c565b50565b3290565b4190565b4490565b600080610d1683611a9b565b9150915060008473ffffffffffffffffffffffffffffffffffffffff16638c3f5563846040518263ffffffff1660e01b8152600401610d559190612190565b60206040518083038186803b158015610d6d57600080fd5b505afa158015610d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da59190611e8e565b905081811015610de1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff906122ef565b5050505050565b3a90565b3b90565b60408051603f833b9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092528181529080600060208401853c50919050565b4590565b4090565b60016020526000908152604090205481565b4290565b606080825167ffffffffffffffff81118015610e6e57600080fd5b50604051908082528060200260200182016040528015610e98578160200160208202803683370190505b509150825167ffffffffffffffff81118015610eb357600080fd5b50604051908082528060200260200182016040528015610ee757816020015b6060815260200190600190039081610ed25790505b50905060005b83518110156110bd576000848281518110610f0457fe5b60200260200101519050806000015115610f4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612489565b80604001515a1015610f88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612292565b806060015173ffffffffffffffffffffffffffffffffffffffff1681608001518260400151600014610fbe578260400151610fc0565b5a5b908360a00151604051610fd39190611f81565b600060405180830381858888f193505050503d8060008114611011576040519150601f19603f3d011682016040523d82523d6000602084013e611016565b606091505b5085848151811061102357fe5b6020026020010185858151811061103657fe5b602002602001018290528215151515815250505083828151811061105657fe5b60200260200101518061107e575084828151811061107057fe5b602002602001015160200151155b6110b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ff90612235565b50600101610eed565b50915091565b6020810151815160f09190911c9060029081111561112c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061272b6027913960400191505060405180910390fd5b915091565b8082016020015160f881901c9060f01c60ff166002830183811161115157fe5b84518111156111ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061285d6026913960400191505060405180910390fd5b9250925092565b8082016020015160601c601482018281116111c957fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806127086023913960400191505060405180910390fd5b9250929050565b60408051604280825260808201909252606091600091906020820181803683370190505091508284016020018051602084015260208101516040840152602281015160428401525060428301905082811161128157fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806127fe6023913960400191505060405180910390fd5b60008151604214611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806126ce603a913960400191505060405180910390fd5b60008260018451038151811061134957fe5b602001015160f81c60f81b60f81c60ff16905060008360408151811061136b57fe5b016020015160f81c905060006113818582611ab4565b90506000611390866020611ab4565b90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561140b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612691603d913960400191505060405180910390fd5b8260ff16601b1415801561142357508260ff16601c14155b15611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180612752603d913960400191505060405180910390fd5b60018414156114ed5760018784848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156114dc573d6000803e3d6000fd5b5050506020604051035194506115ef565b600284141561159e5760018760405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012084848460405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156114dc573d6000803e3d6000fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c815260200180612821603c913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851661165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061278f6030913960400191505060405180910390fd5b5050505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f600ba597427f042bcd559a0d06fa1732cc104d6dd43cbe8845b5a0e804b2b39f60405160405180910390a380156116ee5773ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090204390555b505050565b8082016020015160f01c6002820182811161170a57fe5b8351811115611223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806128a46022913960400191505060405180910390fd5b606060008267ffffffffffffffff8111801561177f57600080fd5b506040519080825280601f01601f1916602001820160405280156117aa576020820181803683370190505b509150838501602001600060205b858110156117d1579082015184820152602081016117b8565b84860160200180519390920151908501525250828201838110156117f157fe5b845181111561184b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128836021913960400191505060405180910390fd5b935093915050565b6000808260018451038151811061186657fe5b016020015160f81c9050600181148061187f5750600281145b156118c3578373ffffffffffffffffffffffffffffffffffffffff166118a586856112db565b73ffffffffffffffffffffffffffffffffffffffff16149150611a93565b6003811415611a425782517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018452604080517f1626ba7e000000000000000000000000000000000000000000000000000000008152600481018881526024820192835286516044830152865173ffffffffffffffffffffffffffffffffffffffff891693631626ba7e938b938a9390929160640190602085019080838360005b8381101561197d578181015183820152602001611965565b50505050905090810190601f1680156119aa5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b1580156119c857600080fd5b505afa1580156119dc573d6000803e3d6000fd5b505050506040513d60208110156119f257600080fd5b50519084527fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e00000000000000000000000000000000000000000000000000000000149150611a93565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f8152602001806127bf603f913960400191505060405180910390fd5b509392505050565b606081901c916bffffffffffffffffffffffff90911690565b60008160200183511015611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001806128c6603c913960400191505060405180910390fd5b50016020015190565b604080518082019091526000808252602082015290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461082357600080fd5b8035801515811461082357600080fd5b600082601f830112611b77578081fd5b813567ffffffffffffffff811115611b8b57fe5b611bbc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161263c565b818152846020838601011115611bd0578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611bfb578081fd5b611c0482611b33565b9392505050565b600080600080600060a08688031215611c22578081fd5b611c2b86611b33565b94506020860135935060408601359250606086013567ffffffffffffffff811115611c54578182fd5b611c6088828901611b67565b925050611c6f60808701611b57565b90509295509295909350565b60008060408385031215611c8d578182fd5b611c9683611b33565b946020939093013593505050565b600080600080600060808688031215611cbb578081fd5b611cc486611b33565b945060208601359350604086013567ffffffffffffffff80821115611ce7578283fd5b818801915088601f830112611cfa578283fd5b813581811115611d08578384fd5b896020604083028501011115611d1c578384fd5b602083019550809450505050611c6f60608701611b57565b60006020808385031215611d46578182fd5b823567ffffffffffffffff80821115611d5d578384fd5b818501915085601f830112611d70578384fd5b813581811115611d7c57fe5b611d89848583020161263c565b81815284810190848601875b84811015611e67578135870160c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f03011215611dd3578a8bfd5b604080518281018181108b82111715611de857fe5b8252611df5848d01611b57565b8152611e02828501611b57565b8c82015260608085013583830152611e1c60808601611b33565b9082015260a08481013560808301529284013592915089831115611e3e578c8dfd5b611e4c8f8d85870101611b67565b91810191909152865250509287019290870190600101611d95565b50909998505050505050505050565b600060208284031215611e87578081fd5b5035919050565b600060208284031215611e9f578081fd5b5051919050565b60008151808452611ebe816020860160208601612660565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260040190565b60008251611f93818460208701612660565b9190910192915050565b7f19010000000000000000000000000000000000000000000000000000000000008152600281019390935260609190911b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166022830152603682015260560190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b604080825283519082018190526000906020906060840190828701845b8281101561205c57815115158452928401929084019060010161203e565b5050508381038285015284518082528282019080840283018401878501865b83811015611e67577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526120b5838351611ea6565b9487019492509086019060010161207b565b6020808252818101839052600090604080840186845b8781101561211e578135835273ffffffffffffffffffffffffffffffffffffffff612109868401611b33565b168386015291830191908301906001016120dd565b5090979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156121835781518051855286015173ffffffffffffffffffffffffffffffffffffffff16868501529284019290850190600101612148565b5091979650505050505050565b90815260200190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b600060208252611c046020830184611ea6565b6020808252603a908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f5349474e41545552455f464c4147000000000000606082015260800190565b60208082526027908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2043414c4c5f5260408201527f4556455254454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a204e4f545f454e60408201527f4f5547485f474153000000000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f526571756972655574696c7323726571756972654d696e4e6f6e63653a204e4f60408201527f4e43455f42454c4f575f52455155495245440000000000000000000000000000606082015260800190565b60208082526027908201527f526571756972655574696c7323726571756972654e6f6e457870697265643a2060408201527f4558504952454400000000000000000000000000000000000000000000000000606082015260800190565b60208082526048908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20554e45585045435445445f434f554e5445524641435455414c5f494d60608201527f4147455f48415348000000000000000000000000000000000000000000000000608082015260a00190565b60208082526032908201527f4d6f64756c6541757468235f7369676e617475726556616c69646174696f6e3a60408201527f20494e56414c49445f5349474e41545552450000000000000000000000000000606082015260800190565b60208082526032908201527f4d756c746943616c6c5574696c73236d756c746943616c6c3a2064656c65676160408201527f746543616c6c206e6f7420616c6c6f7765640000000000000000000000000000606082015260800190565b60208082526039908201527f526571756972655574696c73237075626c697368496e697469616c5369676e6560408201527f72733a20494e56414c49445f4d454d424552535f434f554e5400000000000000606082015260800190565b60208082526031908201527f526571756972655574696c73237075626c697368436f6e6669673a20554e455860408201527f5045435445445f494d4147455f48415348000000000000000000000000000000606082015260800190565b602080825260409082018190527f526571756972655574696c73237075626c697368436f6e6669673a20554e4558908201527f5045435445445f434f554e5445524641435455414c5f494d4147455f48415348606082015260800190565b600061ffff841682526040602083015261261b6040830184611ea6565b949350505050565b60008382526040602083015261261b6040830184611ea6565b60405181810167ffffffffffffffff8111828210171561265857fe5b604052919050565b60005b8381101561267b578181015183820152602001612663565b8381111561268a576000848401525b5050505056fe5369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202773272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265206c656e6774684c696242797465732372656164416464726573733a204f55545f4f465f424f554e44534c696242797465732372656164466972737455696e7431363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20696e76616c6964207369676e6174757265202776272076616c75655369676e617475726556616c696461746f72237265636f7665725369676e65723a20494e56414c49445f5349474e45525369676e617475726556616c696461746f7223697356616c69645369676e61747572653a20554e535550504f525445445f5349474e41545552455f545950454c696242797465732372656164427974657336363a204f55545f4f465f424f554e44535369676e617475726556616c696461746f72237265636f7665725369676e65723a20554e535550504f525445445f5349474e41545552455f545950454c69624279746573237265616455696e743855696e74383a204f55545f4f465f424f554e44534c69624279746573237265616442797465733a204f55545f4f465f424f554e44534c69624279746573237265616455696e7431363a204f55545f4f465f424f554e44534c696242797465732372656164427974657333323a20475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f5245515549524544a26469706673582212200abb842b6eea58df953f048e3a9aa7589fd3ce15ca086e43b61cdb0c0c42723564736f6c63430007060033603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3000000000000000000000000f9d09d634fb818b05149329c1dccfaea53639d96000000000000000000000000d01f11855bccb95f88d7a48492f66410d463731300000000000000000000', + gasLimit: 8000000 + }) + + return deployV1Context(signer) +} diff --git a/packages/tests/src/context/v2.ts b/packages/tests/src/context/v2.ts new file mode 100644 index 000000000..a76e97fd2 --- /dev/null +++ b/packages/tests/src/context/v2.ts @@ -0,0 +1,24 @@ +import { ethers } from 'ethers' +import { v2 } from '../builds' +import { deployContract } from '../singletonFactory' + +export async function deployV2Context(signer: ethers.Signer) { + // See if signer's provider has the contracts already deployed + const factory = await deployContract(signer, v2.factory) + const mainModuleUpgradable = await deployContract(signer, v2.mainModuleUpgradable) + const mainModule = await deployContract(signer, v2.mainModule, factory.address, mainModuleUpgradable.address) + const guestModule = await deployContract(signer, v2.guestModule) + const universalSigValidator = await deployContract(signer, v2.universalSigValidator) + + return { + version: 2, + + factory: factory.address, + mainModule: mainModule.address, + mainModuleUpgradable: mainModuleUpgradable.address, + guestModule: guestModule.address, + universalSigValidator: universalSigValidator.address, + + walletCreationCode: '0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3' + } +} diff --git a/packages/tests/src/index.ts b/packages/tests/src/index.ts new file mode 100644 index 000000000..37c060faa --- /dev/null +++ b/packages/tests/src/index.ts @@ -0,0 +1,8 @@ +export * as context from './context' +export * as builds from './builds' + +export * as utils from './utils' + +export * as configs from './configs' +export * as singleton from './singletonFactory' +export * as erc20 from './tokens/erc20' diff --git a/packages/tests/src/singletonFactory.ts b/packages/tests/src/singletonFactory.ts new file mode 100644 index 000000000..ff9431dee --- /dev/null +++ b/packages/tests/src/singletonFactory.ts @@ -0,0 +1,95 @@ +import { ethers } from 'ethers' +import { Artifact } from './builds' +import { isContract } from './utils' + +export const deployment = { + tx: '0xf9016c8085174876e8008303c4d88080b90154608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634af63f0214602d575b600080fd5b60cf60048036036040811015604157600080fd5b810190602081018135640100000000811115605b57600080fd5b820183602082011115606c57600080fd5b80359060200191846001830284011164010000000083111715608d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925060eb915050565b604080516001600160a01b039092168252519081900360200190f35b6000818351602085016000f5939250505056fea26469706673582212206b44f8a82cb6b156bfcc3dc6aadd6df4eefd204bc928a4397fd15dacf6d5320564736f6c634300060200331b83247000822470', + deployer: '0xBb6e024b9cFFACB947A71991E386681B1Cd1477D', + funding: '24700000000000000' +} + +export const address = '0xce0042B868300000d44A59004Da54A005ffdcf9f' + +export const abi = [ + { + constant: false, + inputs: [ + { + internalType: 'bytes', + type: 'bytes' + }, + { + internalType: 'bytes32', + type: 'bytes32' + } + ], + name: 'deploy', + outputs: [ + { + internalType: 'address payable', + type: 'address' + } + ], + payable: false, + stateMutability: 'nonpayable', + type: 'function' + } +] + +export async function mustExistEIP2470(signer: ethers.Signer): Promise { + const provider = signer.provider + if (!provider) throw new Error('signer has no provider') + + if (!(await isContract(provider, address))) { + const balanceDeployer = await provider.getBalance(deployment.deployer) + if (balanceDeployer.lt(deployment.funding)) { + await signer.sendTransaction({ + to: deployment.deployer, + value: ethers.BigNumber.from(deployment.funding).sub(balanceDeployer) + }) + } + + await provider.sendTransaction(deployment.tx) + if (!(await isContract(provider, address))) { + throw new Error('EIP2470 deployment failed') + } + } + + return new ethers.Contract(address, abi, signer) +} + +export async function deployContract(signer: ethers.Signer, artifact: Artifact, ...args: any[]): Promise { + const provider = signer.provider + if (!provider) throw new Error('signer has no provider') + + const singletonFactory = await mustExistEIP2470(signer) + + const factory = new ethers.ContractFactory(artifact.abi, artifact.bytecode) + const data = factory.getDeployTransaction(...args).data + if (!data) throw new Error('no deploy data') + + const address = ethers.utils.getAddress( + ethers.utils.hexDataSlice( + ethers.utils.keccak256( + ethers.utils.solidityPack( + ['bytes1', 'address', 'bytes32', 'bytes32'], + ['0xff', singletonFactory.address, ethers.constants.HashZero, ethers.utils.keccak256(data)] + ) + ), + 12 + ) + ) + + if (await isContract(provider, address)) { + return new ethers.Contract(address, artifact.abi, signer) + } + + const maxGasLimit = await provider.getBlock('latest').then(b => b.gasLimit.div(2)) + await singletonFactory.deploy(data, ethers.constants.HashZero, { gasLimit: maxGasLimit }).then((tx: any) => tx.wait()) + + if (!(await isContract(provider, address))) { + throw new Error('contract deployment failed') + } + + return new ethers.Contract(address, artifact.abi, signer) +} diff --git a/packages/tests/src/tokens/erc20.ts b/packages/tests/src/tokens/erc20.ts new file mode 100644 index 000000000..5b20ebb67 --- /dev/null +++ b/packages/tests/src/tokens/erc20.ts @@ -0,0 +1,324 @@ +/* +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.3; + +contract SimpleERC20 { + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + uint256 public totalSupply; + + string public name; + string public symbol; + uint8 public decimals; + + constructor(string memory _name, string memory _symbol, uint8 _decimals) { + name = _name; + symbol = _symbol; + decimals = _decimals; + } + + function mint(address to, uint256 amount) public { + totalSupply += amount; + balanceOf[to] += amount; + emit Transfer(address(0), to, amount); + } + + function transfer(address to, uint256 value) public returns (bool) { + balanceOf[msg.sender] -= value; + balanceOf[to] += value; + emit Transfer(msg.sender, to, value); + return true; + } + + function approve(address spender, uint256 value) public returns (bool) { + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + return true; + } + + function transferFrom(address from, address to, uint256 value) public returns (bool) { + balanceOf[from] -= value; + balanceOf[to] += value; + allowance[from][msg.sender] -= value; + + emit Transfer(from, to, value); + return true; + } + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); +} +*/ + +import { ethers } from 'ethers' + +export const TEST_ERC20_ABI = [ + { + inputs: [ + { + internalType: 'string', + name: '_name', + type: 'string' + }, + { + internalType: 'string', + name: '_symbol', + type: 'string' + }, + { + internalType: 'uint8', + name: '_decimals', + type: 'uint8' + } + ], + stateMutability: 'nonpayable', + type: 'constructor' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'owner', + type: 'address' + }, + { + indexed: true, + internalType: 'address', + name: 'spender', + type: 'address' + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256' + } + ], + name: 'Approval', + type: 'event' + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: 'address', + name: 'from', + type: 'address' + }, + { + indexed: true, + internalType: 'address', + name: 'to', + type: 'address' + }, + { + indexed: false, + internalType: 'uint256', + name: 'value', + type: 'uint256' + } + ], + name: 'Transfer', + type: 'event' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + }, + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'allowance', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: 'spender', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + } + ], + name: 'approve', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: '', + type: 'address' + } + ], + name: 'balanceOf', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'decimals', + outputs: [ + { + internalType: 'uint8', + name: '', + type: 'uint8' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address' + }, + { + internalType: 'uint256', + name: 'amount', + type: 'uint256' + } + ], + name: 'mint', + outputs: [], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [], + name: 'name', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'symbol', + outputs: [ + { + internalType: 'string', + name: '', + type: 'string' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [], + name: 'totalSupply', + outputs: [ + { + internalType: 'uint256', + name: '', + type: 'uint256' + } + ], + stateMutability: 'view', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: 'to', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + } + ], + name: 'transfer', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'nonpayable', + type: 'function' + }, + { + inputs: [ + { + internalType: 'address', + name: 'from', + type: 'address' + }, + { + internalType: 'address', + name: 'to', + type: 'address' + }, + { + internalType: 'uint256', + name: 'value', + type: 'uint256' + } + ], + name: 'transferFrom', + outputs: [ + { + internalType: 'bool', + name: '', + type: 'bool' + } + ], + stateMutability: 'nonpayable', + type: 'function' + } +] + +export const TEST_ERC20_BYTECODE = + '0x60806040523480156200001157600080fd5b506040516200128b3803806200128b833981810160405281019062000037919062000250565b82600390816200004891906200053b565b5081600490816200005a91906200053b565b5080600560006101000a81548160ff021916908360ff16021790555050505062000622565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000e8826200009d565b810181811067ffffffffffffffff821117156200010a5762000109620000ae565b5b80604052505050565b60006200011f6200007f565b90506200012d8282620000dd565b919050565b600067ffffffffffffffff82111562000150576200014f620000ae565b5b6200015b826200009d565b9050602081019050919050565b60005b83811015620001885780820151818401526020810190506200016b565b60008484015250505050565b6000620001ab620001a58462000132565b62000113565b905082815260208101848484011115620001ca57620001c962000098565b5b620001d784828562000168565b509392505050565b600082601f830112620001f757620001f662000093565b5b81516200020984826020860162000194565b91505092915050565b600060ff82169050919050565b6200022a8162000212565b81146200023657600080fd5b50565b6000815190506200024a816200021f565b92915050565b6000806000606084860312156200026c576200026b62000089565b5b600084015167ffffffffffffffff8111156200028d576200028c6200008e565b5b6200029b86828701620001df565b935050602084015167ffffffffffffffff811115620002bf57620002be6200008e565b5b620002cd86828701620001df565b9250506040620002e08682870162000239565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620003c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200037e565b620003cc86836200037e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000419620004136200040d84620003e4565b620003ee565b620003e4565b9050919050565b6000819050919050565b6200043583620003f8565b6200044d620004448262000420565b8484546200038e565b825550505050565b600090565b6200046462000455565b620004718184846200042a565b505050565b5b8181101562000499576200048d6000826200045a565b60018101905062000477565b5050565b601f821115620004e857620004b28162000359565b620004bd846200036e565b81016020851015620004cd578190505b620004e5620004dc856200036e565b83018262000476565b50505b505050565b60008160020a8304905092915050565b60006200051060001984600802620004ed565b1980831691505092915050565b60006200052b8383620004fd565b9150826002028217905092915050565b6200054682620002ea565b67ffffffffffffffff811115620005625762000561620000ae565b5b6200056e825462000324565b6200057b8282856200049d565b600060209050601f831160018114620005b357600084156200059e578287015190505b620005aa85826200051d565b8655506200061a565b601f198416620005c38662000359565b60005b82811015620005ed57848901518255600182019150602085019450602081019050620005c6565b868310156200060d578489015162000609601f891682620004fd565b8355505b6001600288020188555050505b505050505050565b610c5980620006326000396000f3fe608060405234801561001057600080fd5b50600436106100bb576000357c01000000000000000000000000000000000000000000000000000000009004806340c10f191161008357806340c10f191461017a57806370a082311461019657806395d89b41146101c6578063a9059cbb146101e4578063dd62ed3e14610214576100bb565b806306fdde03146100c0578063095ea7b3146100de57806318160ddd1461010e57806323b872dd1461012c578063313ce5671461015c575b600080fd5b6100c8610244565b6040516100d591906108da565b60405180910390f35b6100f860048036038101906100f39190610995565b6102d2565b60405161010591906109f0565b60405180910390f35b6101166103c4565b6040516101239190610a1a565b60405180910390f35b61014660048036038101906101419190610a35565b6103ca565b60405161015391906109f0565b60405180910390f35b610164610579565b6040516101719190610aa4565b60405180910390f35b610194600480360381019061018f9190610995565b61058c565b005b6101b060048036038101906101ab9190610abf565b610664565b6040516101bd9190610a1a565b60405180910390f35b6101ce61067c565b6040516101db91906108da565b60405180910390f35b6101fe60048036038101906101f99190610995565b61070a565b60405161020b91906109f0565b60405180910390f35b61022e60048036038101906102299190610aec565b610825565b60405161023b9190610a1a565b60405180910390f35b6003805461025190610b5b565b80601f016020809104026020016040519081016040528092919081815260200182805461027d90610b5b565b80156102ca5780601f1061029f576101008083540402835291602001916102ca565b820191906000526020600020905b8154815290600101906020018083116102ad57829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516103b29190610a1a565b60405180910390a36001905092915050565b60025481565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461041a9190610bbb565b92505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461046f9190610bef565b9250508190555081600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105029190610bbb565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516105669190610a1a565b60405180910390a3600190509392505050565b600560009054906101000a900460ff1681565b806002600082825461059e9190610bef565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546105f39190610bef565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106589190610a1a565b60405180910390a35050565b60006020528060005260406000206000915090505481565b6004805461068990610b5b565b80601f01602080910402602001604051908101604052809291908181526020018280546106b590610b5b565b80156107025780601f106106d757610100808354040283529160200191610702565b820191906000526020600020905b8154815290600101906020018083116106e557829003601f168201915b505050505081565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461075a9190610bbb565b92505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107af9190610bef565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108139190610a1a565b60405180910390a36001905092915050565b6001602052816000526040600020602052806000526040600020600091509150505481565b600081519050919050565b600082825260208201905092915050565b60005b83811015610884578082015181840152602081019050610869565b60008484015250505050565b6000601f19601f8301169050919050565b60006108ac8261084a565b6108b68185610855565b93506108c6818560208601610866565b6108cf81610890565b840191505092915050565b600060208201905081810360008301526108f481846108a1565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061092c82610901565b9050919050565b61093c81610921565b811461094757600080fd5b50565b60008135905061095981610933565b92915050565b6000819050919050565b6109728161095f565b811461097d57600080fd5b50565b60008135905061098f81610969565b92915050565b600080604083850312156109ac576109ab6108fc565b5b60006109ba8582860161094a565b92505060206109cb85828601610980565b9150509250929050565b60008115159050919050565b6109ea816109d5565b82525050565b6000602082019050610a0560008301846109e1565b92915050565b610a148161095f565b82525050565b6000602082019050610a2f6000830184610a0b565b92915050565b600080600060608486031215610a4e57610a4d6108fc565b5b6000610a5c8682870161094a565b9350506020610a6d8682870161094a565b9250506040610a7e86828701610980565b9150509250925092565b600060ff82169050919050565b610a9e81610a88565b82525050565b6000602082019050610ab96000830184610a95565b92915050565b600060208284031215610ad557610ad46108fc565b5b6000610ae38482850161094a565b91505092915050565b60008060408385031215610b0357610b026108fc565b5b6000610b118582860161094a565b9250506020610b228582860161094a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610b7357607f821691505b602082108103610b8657610b85610b2c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610bc68261095f565b9150610bd18361095f565b9250828203905081811115610be957610be8610b8c565b5b92915050565b6000610bfa8261095f565b9150610c058361095f565b9250828201905080821115610c1d57610c1c610b8c565b5b9291505056fea2646970667358221220129f37bd61cdb5c232d63f8cc989264602a3f614c75e0376a02d7d2d2d8910a164736f6c63430008150033' + +export function createERC20(signer: ethers.Signer, name: string, symbol: string, decimals: number) { + return new ethers.ContractFactory(TEST_ERC20_ABI, TEST_ERC20_BYTECODE, signer).deploy(name, symbol, decimals) +} diff --git a/packages/tests/src/utils.ts b/packages/tests/src/utils.ts new file mode 100644 index 000000000..00924003a --- /dev/null +++ b/packages/tests/src/utils.ts @@ -0,0 +1,37 @@ +import { ethers } from 'ethers' +import { Artifact } from './builds' + +export function deployContract(signer: ethers.Signer, artifact: Artifact, ...args: any[]): Promise { + const factory = new ethers.ContractFactory(artifact.abi, artifact.bytecode, signer) + return factory.deploy(...args) +} + +export function randomBigNumber( + min: ethers.BigNumberish = 0, + max: ethers.BigNumberish = ethers.constants.MaxUint256 +): ethers.BigNumber { + const randomHex = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + const randomBn = ethers.BigNumber.from(randomHex) + const minBn = ethers.BigNumber.from(min) + const maxBn = ethers.BigNumber.from(max) + const range = maxBn.sub(minBn) + + if (range.isNegative() || range.isZero()) { + throw new Error('max must be greater than min') + } + + return randomBn.mod(range).add(minBn) +} + +export function maxForBits(bits: number): ethers.BigNumber { + return ethers.BigNumber.from(2).pow(bits).sub(1) +} + +export function randomBool(): boolean { + return Math.random() >= 0.5 +} + +export async function isContract(provider: ethers.providers.Provider, address: string): Promise { + const c = await provider.getCode(address) + return ethers.utils.arrayify(c).length > 0 +} diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md new file mode 100644 index 000000000..8dfed7e18 --- /dev/null +++ b/packages/utils/CHANGELOG.md @@ -0,0 +1,1670 @@ +# @0xsequence/utils + +## 1.10.8 + +### Patch Changes + +- update metadata bindings + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia + +## 1.10.3 + +### Patch Changes + +- typing fix + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants + +## 1.9.36 + +### Patch Changes + +- guard: export client + +## 1.9.35 + +### Patch Changes + +- guard: update bindings + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email + +## 1.9.33 + +### Patch Changes + +- waas: umd build + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes + +## 1.9.30 + +### Patch Changes + +- update + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore + +## 1.9.23 + +### Patch Changes + +- update api client bindings + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings + +## 1.9.21 + +### Patch Changes + +- api client bindings + +## 1.9.20 + +### Patch Changes + +- api client bindings update + +## 1.9.19 + +### Patch Changes + +- waas update + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client + +## 1.9.8 + +### Patch Changes + +- waas client update + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer + +## 1.9.6 + +### Patch Changes + +- waas package update + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia + +## 1.9.1 + +### Patch Changes + +- analytics fix + +## 1.9.0 + +### Minor Changes + +- waas release + +## 1.8.8 + +### Patch Changes + +- update metadata bindings + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested + +## 1.8.1 + +### Patch Changes + +- update to analytics provider + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks + +## 1.6.3 + +### Patch Changes + +- network list update + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods + +## 1.4.2 + +### Patch Changes + +- guard: update bindings + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic + +## 1.4.0 + +### Minor Changes + +- project access key support + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions + +## 1.1.11 + +### Patch Changes + +- add homeverse configs + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object + +## 0.43.28 + +### Patch Changes + +- update api bindings + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM + +## 0.43.22 + +### Patch Changes + +- add zkevm chain + +## 0.43.21 + +### Patch Changes + +- api: update client bindings + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings + +## 0.43.19 + +### Patch Changes + +- session proof update + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods + +## 0.43.14 + +### Patch Changes + +- bump + +## 0.43.13 + +### Patch Changes + +- update rpc bindings + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter + +## 0.43.10 + +### Patch Changes + +- various improvements + +## 0.43.9 + +### Patch Changes + +- update deps + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings + +## 0.42.6 + +### Patch Changes + +- api bindings update + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options + +## 0.42.3 + +### Patch Changes + +- update api bindings + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' + +## 0.41.3 + +### Patch Changes + +- api bindings update + +## 0.41.2 + +### Patch Changes + +- api bindings update + +## 0.41.1 + +### Patch Changes + +- update default networks + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain + +## 0.40.5 + +### Patch Changes + +- api: update bindings + +## 0.40.4 + +### Patch Changes + +- add unreal transport + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option + +## 0.39.4 + +### Patch Changes + +- api: update client bindings + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider + +## 0.39.2 + +### Patch Changes + +- update umd name + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) + +## 0.36.7 + +### Patch Changes + +- fix missing break + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation + +## 0.35.10 + +### Patch Changes + +- upgrade deps + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +## 0.29.8 + +### Patch Changes + +- update api + +## 0.29.0 + +### Minor Changes + +- major architectural changes in Sequence design + + - only one API instance, API is no longer a per-chain service + - separate per-chain indexer service, API no longer handles indexing + - single contract metadata service, API no longer serves metadata + + chaind package has been removed, indexer and metadata packages have been added + + stronger typing with new explicit ChainId type + + multicall fixes and improvements + + forbid "wait" transactions in sendTransactionBatch calls + +## 0.28.0 + +### Minor Changes + +- extension provider + +## 0.27.0 + +### Minor Changes + +- Add requireFreshSigner lib to sessions + +## 0.25.1 + +### Patch Changes + +- Fix build typescrypt issue + +## 0.25.0 + +### Minor Changes + +- 10c8af8: Add estimator package + Fix multicall few calls bug + +## 0.23.0 + +### Minor Changes + +- - relayer: offer variety of gas fee options from the relayer service" + +## 0.22.2 + +### Patch Changes + +- e1c109e: Fix authProof on expired sessions + +## 0.22.1 + +### Patch Changes + +- transport session cache + +## 0.22.0 + +### Minor Changes + +- e667b65: Expose all relayer options on networks + +## 0.21.5 + +### Patch Changes + +- Give priority to metaTxnId returned by relayer + +## 0.21.4 + +### Patch Changes + +- Add has enough signers method + +## 0.21.3 + +### Patch Changes + +- add window session cache + +## 0.21.2 + +### Patch Changes + +- exception handlind in relayer + +## 0.21.0 + +### Minor Changes + +- - fix gas estimation on wallets with large number of signers + - update to session handling and wallet config construction upon auth + +## 0.19.3 + +### Patch Changes + +- jwtAuth visibility, package version sync + +## 0.19.0 + +### Minor Changes + +- - provider, improve dapp / wallet transport io + +## 0.18.0 + +### Minor Changes + +- relayer improvements and pending transaction handling + +## 0.16.0 + +### Minor Changes + +- relayer as its own service separate from chaind + +## 0.15.1 + +### Patch Changes + +- update api clients + +## 0.14.3 + +### Patch Changes + +- Fix 0xSequence relayer dependencies + +## 0.14.2 + +### Patch Changes + +- Add debug logs to rpc-relayer + +## 0.14.0 + +### Minor Changes + +- update sequence utils finder which includes optimization + +## 0.13.0 + +### Minor Changes + +- Update SequenceUtils deployed contract + +## 0.12.1 + +### Patch Changes + +- npm bump + +## 0.12.0 + +### Minor Changes + +- provider: improvements to window transport + +## 0.11.4 + +### Patch Changes + +- update api client + +## 0.11.3 + +### Patch Changes + +- improve openWindow state options handling + +## 0.11.2 + +### Patch Changes + +- Fix multicall proxy scopes + +## 0.11.1 + +### Patch Changes + +- Add support for dynamic and nested signatures + +## 0.11.0 + +### Minor Changes + +- Update wallet context to 1.7 contracts + +## 0.10.9 + +### Patch Changes + +- add support for public addresses as signers in session.open + +## 0.10.8 + +### Patch Changes + +- Multicall production configuration + +## 0.10.7 + +### Patch Changes + +- allow provider transport to force disconnect + +## 0.10.6 + +### Patch Changes + +- - fix getWalletState method + +## 0.10.5 + +### Patch Changes + +- update relayer gas refund options + +## 0.10.4 + +### Patch Changes + +- Update api proto + +## 0.10.3 + +### Patch Changes + +- Fix loading config cross-chain + +## 0.10.2 + +### Patch Changes + +- - message digest fix + +## 0.10.1 + +### Patch Changes + +- upgrade deps + +## 0.10.0 + +### Minor Changes + +- Deployed new contracts with ERC1271 signer support + +## 0.9.6 + +### Patch Changes + +- Update ABIs for latest sequence contracts + +## 0.9.5 + +### Patch Changes + +- Implemented session class + +## 0.9.3 + +### Patch Changes + +- - minor improvements + +## 0.9.1 + +### Patch Changes + +- - patch bump + +## 0.9.0 + +### Minor Changes + +- - provider transport hardening + +## 0.8.5 + +### Patch Changes + +- - use latest wallet-contracts + +## 0.8.4 + +### Patch Changes + +- - minor improvements, name updates and comments + +## 0.8.3 + +### Patch Changes + +- - refinements + + - normalize signer address in config + + - provider: getWalletState() method to WalletProvider + +## 0.8.2 + +### Patch Changes + +- - field rename and ethauth dependency bump + +## 0.8.1 + +### Patch Changes + +- - variety of optimizations + +## 0.8.0 + +### Minor Changes + +- - changeset fix + +## 0.7.1 + +### Patch Changes + +- 02377ab: Minor improvements + +## 0.7.0 + +### Patch Changes + +- 6f11ed7: sequence.js, init release diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md index aa0333e53..15772c27d 100644 --- a/packages/utils/abi/CHANGELOG.md +++ b/packages/utils/abi/CHANGELOG.md @@ -1422,7 +1422,6 @@ - relayer: fix Relayer.wait() interface The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: - - timeout: the maximum time to wait for the transaction receipt - delay: the polling interval, i.e. the time to wait between requests - maxFails: the maximum number of hard failures to tolerate before giving up @@ -1761,7 +1760,6 @@ ### Minor Changes - major architectural changes in Sequence design - - only one API instance, API is no longer a per-chain service - separate per-chain indexer service, API no longer handles indexing - single contract metadata service, API no longer serves metadata diff --git a/packages/utils/src/base64.ts b/packages/utils/src/base64.ts new file mode 100644 index 000000000..098abf26a --- /dev/null +++ b/packages/utils/src/base64.ts @@ -0,0 +1,23 @@ +import { Base64 } from 'js-base64' + +export const base64Encode = (val: string): string => { + return Base64.encode(val, true) +} + +export const base64EncodeObject = (obj: any): string => { + return Base64.encode(JSON.stringify(obj), true) +} + +export const base64Decode = (encodedString: string): string | undefined => { + if (encodedString === null || encodedString === undefined) { + return undefined + } + return Base64.decode(encodedString) +} + +export const base64DecodeObject = (encodedObject: string | null): T | undefined => { + if (encodedObject === null || encodedObject === undefined) { + return undefined + } + return JSON.parse(Base64.decode(encodedObject)) as T +} diff --git a/packages/utils/src/big-number.ts b/packages/utils/src/big-number.ts new file mode 100644 index 000000000..e5ae37e34 --- /dev/null +++ b/packages/utils/src/big-number.ts @@ -0,0 +1,14 @@ +import { BigNumber, BigNumberish, utils } from 'ethers' + +// ethers implement this method but doesn't exports it +export function isBigNumberish(value: any): value is BigNumberish { + return ( + value != null && + (BigNumber.isBigNumber(value) || + (typeof value === 'number' && value % 1 === 0) || + (typeof value === 'string' && !!value.match(/^-?[0-9]+$/)) || + utils.isHexString(value) || + typeof value === 'bigint' || + utils.isBytes(value)) + ) +} diff --git a/packages/utils/src/digest.ts b/packages/utils/src/digest.ts new file mode 100644 index 000000000..970dd4355 --- /dev/null +++ b/packages/utils/src/digest.ts @@ -0,0 +1,18 @@ +import { ethers } from 'ethers' + +export const encodeMessageDigest = (message: string | Uint8Array) => { + if (typeof message === 'string') { + return ethers.utils.arrayify(ethers.utils.keccak256(ethers.utils.toUtf8Bytes(message))) + } else { + return ethers.utils.arrayify(ethers.utils.keccak256(message)) + } +} + +// packMessageData encodes the specified data ready for the Sequence Wallet contracts. +export const packMessageData = (walletAddress: string, chainId: ethers.BigNumberish, digest: ethers.BytesLike): string => { + return ethers.utils.solidityPack(['string', 'uint256', 'address', 'bytes32'], ['\x19\x01', chainId, walletAddress, digest]) +} + +export const subDigestOf = (address: string, chainId: ethers.BigNumberish, digest: ethers.BytesLike): string => { + return ethers.utils.keccak256(packMessageData(address, chainId, digest)) +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts new file mode 100644 index 000000000..aa547dd9a --- /dev/null +++ b/packages/utils/src/index.ts @@ -0,0 +1,17 @@ +export * from './base64' +export * from './big-number' +export * from './digest' +export * from './is-node-or-browser' +export * from './jwt-decode' +export * from './logger' +export * from './merkle' +export * from './network' +export * from './promise-cache' +export * from './promisify' +export * from './query-string' +export * from './rand' +export * from './sanitize' +export * from './sleep' +export * from './typed-data' +export * from './types' +export * from './web' diff --git a/packages/utils/src/is-node-or-browser.ts b/packages/utils/src/is-node-or-browser.ts new file mode 100644 index 000000000..f84032c78 --- /dev/null +++ b/packages/utils/src/is-node-or-browser.ts @@ -0,0 +1,9 @@ +export const isNode = () => { + if (typeof window === 'undefined' && typeof process === 'object') { + return true + } else { + return false + } +} + +export const isBrowser = () => !isNode() diff --git a/packages/utils/src/jwt-decode.ts b/packages/utils/src/jwt-decode.ts new file mode 100644 index 000000000..baa862bf1 --- /dev/null +++ b/packages/utils/src/jwt-decode.ts @@ -0,0 +1,10 @@ +import { Base64 } from 'js-base64' + +export const jwtDecodeClaims = (jwt: string) => { + const parts = jwt.split('.') + if (parts.length !== 3) { + throw new Error('invalid jwt') + } + const claims = JSON.parse(Base64.decode(parts[1])) as T + return claims +} diff --git a/packages/utils/src/logger.ts b/packages/utils/src/logger.ts new file mode 100644 index 000000000..2da1ebf1f --- /dev/null +++ b/packages/utils/src/logger.ts @@ -0,0 +1,98 @@ +export type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'DISABLED' + +enum logLevel { + DEBUG = 1, + INFO = 2, + WARN = 3, + ERROR = 4, + DISABLED = 5 +} + +export interface LoggerConfig { + logLevel: LogLevel + silence?: boolean + + onwarn?: (message: any, ...optionalParams: any[]) => void + onerror?: (message: any, ...optionalParams: any[]) => void +} + +export class Logger { + logLevel: logLevel + + constructor(private config: LoggerConfig) { + this.configure(config) + } + + configure(config: Partial) { + this.config = { ...this.config, ...config } + switch (this.config.logLevel) { + case 'DEBUG': + this.logLevel = logLevel.DEBUG + break + case 'INFO': + this.logLevel = logLevel.INFO + break + case 'WARN': + this.logLevel = logLevel.WARN + break + case 'ERROR': + this.logLevel = logLevel.ERROR + break + case 'DISABLED': + this.logLevel = logLevel.DISABLED + break + default: + this.logLevel = logLevel.INFO + break + } + + // undefined silence value will disable the default silence flag + if (this.config.silence === undefined) { + this.config.silence = false + } + } + + debug(message: any, ...optionalParams: any[]) { + if (this.config.silence === true) return + if (this.logLevel === logLevel.DEBUG) { + console.log(message, ...optionalParams) + } + } + + info(message: any, ...optionalParams: any[]) { + if (this.config.silence === true) return + if (this.logLevel <= logLevel.INFO) { + console.log(message, ...optionalParams) + } + } + + warn(message: any, ...optionalParams: any[]) { + if (this.config.silence === true) return + if (this.logLevel <= logLevel.WARN) { + console.warn(message, ...optionalParams) + if (this.config.onwarn) { + this.config.onwarn(message, optionalParams) + } + } + } + + error(message: any, ...optionalParams: any[]) { + if (this.config.silence === true) return + if (this.logLevel <= logLevel.ERROR) { + console.error(message, ...optionalParams) + if (this.config.onerror) { + this.config.onerror(message, optionalParams) + } + } + } +} + +export const logger = new Logger({ + logLevel: 'INFO', + + // By default we silence the logger. In tests we should call `configureLogger` + // below to set silence: false. + silence: true +}) + +export const configureLogger = (config: Partial) => logger.configure(config) diff --git a/packages/utils/src/merkle.ts b/packages/utils/src/merkle.ts new file mode 100644 index 000000000..6767fbc7f --- /dev/null +++ b/packages/utils/src/merkle.ts @@ -0,0 +1,49 @@ +import { BigNumberish, utils } from 'ethers' +import { MerkleTree } from './merkletree' + +export type ToLeaf = (element: T) => string +export type Proof = string[] + +export class MerkleTreeGenerator { + private elements: T[] + private toLeaf: ToLeaf + private tree: MerkleTree + + constructor(elements: T[], toLeaf: ToLeaf) { + this.elements = elements + this.toLeaf = toLeaf + } + + generateTree(): MerkleTree { + const hashed = this.elements.map(e => this.toLeaf(e)) + return new MerkleTree(hashed, { + sortPairs: true, + sortLeaves: true + }) + } + + generateRoot(): string { + if (!this.tree) this.tree = this.generateTree() + return this.tree.getHexRoot() + } + + generateProof(element: T): Proof { + if (!this.elements.includes(element)) throw new Error('Element not found') + if (!this.tree) this.tree = this.generateTree() + return this.tree.getHexProof(this.toLeaf(element)) + } + + verifyProof(element: T, proof: Proof): boolean { + if (!this.elements.includes(element)) throw new Error('Element not found') + if (!this.tree) this.tree = this.generateTree() + return this.tree.verify(proof, this.toLeaf(element), this.generateRoot()) + } +} + +export type SaleItemsElement = { + address: string + tokenId: BigNumberish +} + +export const getSaleItemsLeaf: ToLeaf = element => + utils.solidityKeccak256(['address', 'uint256'], [element.address.toLowerCase(), element.tokenId]) diff --git a/packages/utils/src/merkletree/Base.ts b/packages/utils/src/merkletree/Base.ts new file mode 100644 index 000000000..71dd9549e --- /dev/null +++ b/packages/utils/src/merkletree/Base.ts @@ -0,0 +1,109 @@ +import { ethers } from 'ethers' + +export class Base { + static bufferIndexOf(array: Uint8Array[], element: Uint8Array, isSorted: boolean = false): number { + if (isSorted) { + return Base.binarySearch(array, element, Base.compare) + } + + const eqChecker = (buffer1: Uint8Array, buffer2: Uint8Array): boolean => { + if (buffer1 === buffer2) { + return true + } + if (buffer1.length !== buffer2.length) { + return false + } + for (let i = 0; i < buffer1.length; i++) { + if (buffer1[i] !== buffer2[i]) { + return false + } + } + return true + } + + return Base.linearSearch(array, element, eqChecker) + } + + static binarySearch( + array: Uint8Array[], + element: Uint8Array, + compareFunction: (a: Uint8Array, b: Uint8Array) => number + ): number { + let start = 0 + let end = array.length - 1 + + // Iterate while start not meets end + while (start <= end) { + // Find the mid index + const mid = Math.floor((start + end) / 2) + + // Check if the mid value is greater than, equal to, or less than search element. + const ordering = compareFunction(array[mid], element) + + // If element is present at mid, start iterating for searching first appearance. + if (ordering === 0) { + // Linear reverse iteration until the first matching item index is found. + for (let i = mid - 1; i >= 0; i--) { + if (compareFunction(array[i], element) === 0) continue + return i + 1 + } + return 0 + } /* Else look in left or right half accordingly */ else if (ordering < 0) { + start = mid + 1 + } else { + end = mid - 1 + } + } + + return -1 + } + + static compare(a: Uint8Array, b: Uint8Array): number { + // Determine the minimum length to compare + const len = Math.min(a.length, b.length) + + // Compare byte by byte + for (let i = 0; i < len; i++) { + if (a[i] !== b[i]) { + return a[i] - b[i] + } + } + + // If all compared bytes are equal, compare lengths + return a.length - b.length + } + + static linearSearch(array: Uint8Array[], element: Uint8Array, eqChecker: (a: Uint8Array, b: Uint8Array) => boolean): number { + for (let i = 0; i < array.length; i++) { + if (eqChecker(array[i], element)) { + return i + } + } + + return -1 + } + + static bufferify(value: Uint8Array | string): Uint8Array { + if (typeof value === 'string') { + return ethers.utils.arrayify(value) + } + return value + } + + static isHexString(v: string): boolean { + return typeof v === 'string' && /^(0x)?[0-9A-Fa-f]*$/.test(v) + } + + static bufferToHex(value: Uint8Array, withPrefix: boolean = true): string { + const prefixed = ethers.utils.hexlify(value, { + allowMissingPrefix: true + }) + return withPrefix ? prefixed : prefixed.substring(2) + } + + static bufferifyFn(f: any): any { + return (value: any): Uint8Array => { + return Base.bufferify(f(value)) + } + } +} diff --git a/packages/utils/src/merkletree/MerkleTree.ts b/packages/utils/src/merkletree/MerkleTree.ts new file mode 100644 index 000000000..bccea58d9 --- /dev/null +++ b/packages/utils/src/merkletree/MerkleTree.ts @@ -0,0 +1,186 @@ +import { ethers } from 'ethers' +import { Base } from './Base' + +type TValue = string +type TLeaf = Uint8Array +type TLayer = TLeaf[] +type THashFn = (value: TValue | TLeaf) => TLeaf + +export interface Options { + sortLeaves?: boolean + sortPairs?: boolean +} + +export type Proof = { position: 'left' | 'right'; data: Uint8Array }[] + +export class MerkleTree extends Base { + private hashFn: THashFn + private leaves: TLeaf[] = [] + private layers: TLayer[] = [] + private sortLeaves: boolean = false + private sortPairs: boolean = false + + constructor(leaves: any[], options: Options = {}) { + super() + + this.sortLeaves = !!options.sortLeaves + this.sortPairs = !!options.sortPairs + + this.hashFn = Base.bufferifyFn(ethers.utils.keccak256) + this.processLeaves(leaves) + } + + public getOptions() { + return { + sortLeaves: this.sortLeaves, + sortPairs: this.sortPairs + } + } + + private processLeaves(leaves: TLeaf[]) { + this.leaves = leaves.map(Base.bufferify) + if (this.sortLeaves) { + this.leaves = this.leaves.sort(Base.compare) + } + + this.createHashes(this.leaves) + } + + private createHashes(nodes: Uint8Array[]) { + this.layers = [nodes] + while (nodes.length > 1) { + const layerIndex = this.layers.length + + this.layers.push([]) + + const layerLimit = nodes.length + + for (let i = 0; i < nodes.length; i += 2) { + if (i >= layerLimit) { + this.layers[layerIndex].push(...nodes.slice(layerLimit)) + break + } else if (i + 1 === nodes.length) { + if (nodes.length % 2 === 1) { + // push copy of hash and continue iteration + this.layers[layerIndex].push(nodes[i]) + continue + } + } + + const left = nodes[i] + const right = i + 1 === nodes.length ? left : nodes[i + 1] + const combined = [left, right] + + if (this.sortPairs) { + combined.sort(Base.compare) + } + + const hash = this.hashFn(ethers.utils.concat(combined)) + this.layers[layerIndex].push(hash) + } + + nodes = this.layers[layerIndex] + } + } + + getRoot(): Uint8Array { + if (this.layers.length === 0) { + return Uint8Array.from([]) + } + + return this.layers[this.layers.length - 1][0] || Uint8Array.from([]) + } + + getHexRoot(): string { + return Base.bufferToHex(this.getRoot()) + } + + getProof(leaf: Uint8Array | string, index?: number): Proof { + if (typeof leaf === 'undefined') { + throw new Error('leaf is required') + } + leaf = Base.bufferify(leaf) + const proof: Proof = [] + + if (!Number.isInteger(index)) { + index = -1 + + for (let i = 0; i < this.leaves.length; i++) { + if (Base.compare(leaf, this.leaves[i]) === 0) { + index = i + } + } + } + + // Type fix + index = index as number + + if (index <= -1) { + return [] + } + + for (let i = 0; i < this.layers.length; i++) { + const layer = this.layers[i] + const isRightNode = index % 2 + const pairIndex = isRightNode ? index - 1 : index + 1 + + if (pairIndex < layer.length) { + proof.push({ + position: isRightNode ? 'left' : 'right', + data: layer[pairIndex] + }) + } + + // set index to parent index + index = (index / 2) | 0 + } + + return proof + } + + getHexProof(leaf: Uint8Array | string, index?: number): string[] { + return this.getProof(leaf, index).map(item => Base.bufferToHex(item.data)) + } + + verify(proof: Proof | string[], targetNode: Uint8Array | string, root: Uint8Array | string): boolean { + let hash = Base.bufferify(targetNode) + root = Base.bufferify(root) + + if (!Array.isArray(proof) || !targetNode || !root) { + return false + } + + for (let i = 0; i < proof.length; i++) { + const node = proof[i] + let data: Uint8Array + let isLeftNode: boolean + + if (typeof node === 'string') { + data = Base.bufferify(node) + isLeftNode = true + } else if (node instanceof Object) { + data = node.data + isLeftNode = node.position === 'left' + } else { + throw new Error('Expected node to be of type string or object') + } + + const buffers: Uint8Array[] = [] + + if (this.sortPairs) { + if (Base.compare(hash, data) < 0) { + buffers.push(hash, data) + } else { + buffers.push(data, hash) + } + hash = this.hashFn(ethers.utils.concat(buffers)) + } else { + buffers.push(hash) + buffers[isLeftNode ? 'unshift' : 'push'](data) + hash = this.hashFn(ethers.utils.concat(buffers)) + } + } + + return Base.compare(hash, root) === 0 + } +} diff --git a/packages/utils/src/merkletree/README.md b/packages/utils/src/merkletree/README.md new file mode 100644 index 000000000..7ad9d73cf --- /dev/null +++ b/packages/utils/src/merkletree/README.md @@ -0,0 +1 @@ +This folder is a minimal fork of https://github.com/merkletreejs/merkletreejs with dependencies replaced with ethers. diff --git a/packages/utils/src/merkletree/index.ts b/packages/utils/src/merkletree/index.ts new file mode 100644 index 000000000..136d7afdc --- /dev/null +++ b/packages/utils/src/merkletree/index.ts @@ -0,0 +1 @@ +export { MerkleTree } from './MerkleTree' diff --git a/packages/utils/src/network.ts b/packages/utils/src/network.ts new file mode 100644 index 000000000..a2400e3c6 --- /dev/null +++ b/packages/utils/src/network.ts @@ -0,0 +1,27 @@ +import { ethers } from 'ethers' + +export const getEthersConnectionInfo = (url: string, projectAccessKey?: string, jwt?: string): ethers.utils.ConnectionInfo => { + const headers: { + [key: string]: string | number + } = {} + + if (jwt && jwt.length > 0) { + headers['Authorization'] = `BEARER ${jwt}` + } + if (projectAccessKey && projectAccessKey.length > 0) { + headers['X-Access-Key'] = projectAccessKey + } + + return { + url, + headers, + skipFetchSetup: true, + fetchOptions: { + mode: 'cors', + cache: 'force-cache', + credentials: 'same-origin', + redirect: 'follow', + referrer: 'client' + } + } +} diff --git a/packages/utils/src/promise-cache.ts b/packages/utils/src/promise-cache.ts new file mode 100644 index 000000000..0504adda8 --- /dev/null +++ b/packages/utils/src/promise-cache.ts @@ -0,0 +1,58 @@ +import { ethers } from 'ethers' + +export class PromiseCache { + private readonly cache: Map + + constructor() { + this.cache = new Map() + } + + do, T>( + key: string, + validMilliseconds: number | undefined, + task: (...args: S) => Promise, + ...args: S + ): Promise { + key = `${key}:${ethers.utils.keccak256(ethers.utils.toUtf8Bytes(JSON.stringify(args, deterministically)))}` + + let entry = this.cache.get(key) + + if (entry) { + if (entry.expiration) { + if (new Date() >= entry.expiration) { + entry = undefined + this.cache.delete(key) + } + } + } + + if (!entry) { + const entry_: Entry = { promise: task(...args) } + + if (validMilliseconds !== undefined) { + entry_.promise = entry_.promise.then(result => { + entry_.expiration = new Date(Date.now() + validMilliseconds) + return result + }) + } + + entry = entry_ + this.cache.set(key, entry) + } + + return entry.promise as Promise + } +} + +type Entry = { + promise: Promise + expiration?: Date +} + +function deterministically(_key: string, value: any): any { + if (typeof value === 'object' && value !== null && !Array.isArray(value)) { + return Object.fromEntries(Object.entries(value).sort()) + } + + return value +} diff --git a/packages/utils/src/promisify.ts b/packages/utils/src/promisify.ts new file mode 100644 index 000000000..537b3e018 --- /dev/null +++ b/packages/utils/src/promisify.ts @@ -0,0 +1,32 @@ +export function promisify(f: (cb: (err: any, res: T) => void) => void, thisContext?: any): () => Promise +export function promisify(f: (arg: A, cb: (err: any, res: T) => void) => void, thisContext?: any): (arg: A) => Promise +export function promisify( + f: (arg: A, arg2: A2, cb: (err: any, res: T) => void) => void, + thisContext?: any +): (arg: A, arg2: A2) => Promise +export function promisify( + f: (arg: A, arg2: A2, arg3: A3, cb: (err: any, res: T) => void) => void, + thisContext?: any +): (arg: A, arg2: A2, arg3: A3) => Promise +export function promisify( + f: (arg: A, arg2: A2, arg3: A3, arg4: A4, cb: (err: any, res: T) => void) => void, + thisContext?: any +): (arg: A, arg2: A2, arg3: A3, arg4: A4) => Promise +export function promisify( + f: (arg: A, arg2: A2, arg3: A3, arg4: A4, arg5: A5, cb: (err: any, res: T) => void) => void, + thisContext?: any +): (arg: A, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Promise + +export function promisify(f: any, thisContext?: any) { + return function (...a: any[]) { + const args = Array.prototype.slice.call(a) + return new Promise(async (resolve, reject) => { + try { + args.push((err: any, result: any) => (err ? reject(err) : resolve(result))) + await f.apply(thisContext, args) + } catch (e) { + reject(e) + } + }) + } +} diff --git a/packages/utils/src/query-string.ts b/packages/utils/src/query-string.ts new file mode 100644 index 000000000..3980c0e18 --- /dev/null +++ b/packages/utils/src/query-string.ts @@ -0,0 +1,15 @@ +export function queryStringFromObject(name: string, obj: any) { + const k = encodeURIComponent(name) + const v = encodeURIComponent(JSON.stringify(obj)) + return `${k}=${v}` +} + +export function queryStringToObject(qs: string): { [key: string]: any } { + const p = qs.split('&') + const o: { [key: string]: any } = {} + for (const v of p) { + const z = v.split('=') + o[decodeURIComponent(z[0])] = JSON.parse(decodeURIComponent(z[1])) + } + return o +} diff --git a/packages/utils/src/rand.ts b/packages/utils/src/rand.ts new file mode 100644 index 000000000..50d4ea6d5 --- /dev/null +++ b/packages/utils/src/rand.ts @@ -0,0 +1,5 @@ +export const getRandomInt = (min: number = 0, max: number = Number.MAX_SAFE_INTEGER): number => { + min = Math.ceil(min) + max = Math.floor(max) + return Math.floor(Math.random() * (max - min + 1)) + min +} diff --git a/packages/utils/src/sanitize.ts b/packages/utils/src/sanitize.ts new file mode 100644 index 000000000..7f1044b39 --- /dev/null +++ b/packages/utils/src/sanitize.ts @@ -0,0 +1,27 @@ +// sanitizeNumberString accepts a number string and returns back a clean number string. +// For example, input '1234.5678' will return '1234.5678' but '12javascript:{}etc' will return '12' +export const sanitizeNumberString = (numString: string | null): string => { + if (!numString || typeof numString !== 'string') { + return '' + } + const v = numString.match(/[\d.]+/) + return v && v.length > 0 ? v[0].trim() : '' +} + +// sanitizeAlphanumeric accepts any string and returns alphanumeric contents only +export const sanitizeAlphanumeric = (alphanum: string): string => { + if (!alphanum || typeof alphanum !== 'string') { + return '' + } + const v = alphanum.match(/[\w\s\d]+/) + return v && v.length > 0 ? v[0].trim() : '' +} + +// sanitizeHost accepts any string and returns valid host string +export const sanitizeHost = (host: string): string => { + if (!host || typeof host !== 'string') { + return '' + } + const v = host.match(/[\w\d.\-:\/]+/) + return v && v.length > 0 ? v[0].trim() : '' +} diff --git a/packages/utils/src/sleep.ts b/packages/utils/src/sleep.ts new file mode 100644 index 000000000..6120453e0 --- /dev/null +++ b/packages/utils/src/sleep.ts @@ -0,0 +1,8 @@ +export const sleep = (t: number) => { + return new Promise(resolve => { + const timeout = setTimeout(() => { + clearTimeout(timeout) + resolve() + }, t) + }) +} diff --git a/packages/utils/src/typed-data.ts b/packages/utils/src/typed-data.ts new file mode 100644 index 000000000..5481cdef9 --- /dev/null +++ b/packages/utils/src/typed-data.ts @@ -0,0 +1,24 @@ +import { ethers, TypedDataDomain, TypedDataField } from 'ethers' + +export interface TypedData { + domain: TypedDataDomain + types: Record> + message: Record + primaryType?: string +} + +export type { TypedDataDomain, TypedDataField } + +export const encodeTypedDataHash = (typedData: TypedData): string => { + const types = { ...typedData.types } + + // remove EIP712Domain key from types as ethers will auto-gen it in + // the hash encoder below + delete types['EIP712Domain'] + + return ethers.utils._TypedDataEncoder.hash(typedData.domain, types, typedData.message) +} + +export const encodeTypedDataDigest = (typedData: TypedData): Uint8Array => { + return ethers.utils.arrayify(encodeTypedDataHash(typedData)) +} diff --git a/packages/utils/src/types.ts b/packages/utils/src/types.ts new file mode 100644 index 000000000..63814fd59 --- /dev/null +++ b/packages/utils/src/types.ts @@ -0,0 +1,25 @@ +import { utils } from 'ethers' + +type Deferrable = utils.Deferrable + +const { defineReadOnly, getStatic, resolveProperties, checkProperties, shallowCopy, deepCopy } = utils + +export type { Deferrable } + +export { defineReadOnly, getStatic, resolveProperties, checkProperties, shallowCopy, deepCopy } + +export type Optionals = Omit< + T, + Exclude< + { + [K in keyof T]: T extends Record ? K : never + }[keyof T], + undefined + > +> + +export type Mask = Omit + +export type Forbid = T & { + [P in K]?: never +} diff --git a/packages/utils/src/web.ts b/packages/utils/src/web.ts new file mode 100644 index 000000000..d8316e978 --- /dev/null +++ b/packages/utils/src/web.ts @@ -0,0 +1,2 @@ +// urlClean removes double slashes from url path +export const urlClean = (url: string) => url.replace(/([^:]\/)\/+/g, '$1') diff --git a/packages/utils/tests/base64.spec.ts b/packages/utils/tests/base64.spec.ts new file mode 100644 index 000000000..d56c24c83 --- /dev/null +++ b/packages/utils/tests/base64.spec.ts @@ -0,0 +1,49 @@ +import { expect } from 'chai' +import { base64EncodeObject, base64DecodeObject } from '@0xsequence/utils' + +describe('base64', function () { + it('encoding, a', () => { + const object = { + a: 1, + b: 2, + c: 'hihi', + d: '1.234' + } + + const encoded = base64EncodeObject(object) + expect(encoded).to.be.equal('eyJhIjoxLCJiIjoyLCJjIjoiaGloaSIsImQiOiIxLjIzNCJ9') + + const o = base64DecodeObject(encoded) + expect(object).to.deep.equal(o) + }) + + it('encoding, b', () => { + const object = { + a: 1, + b: 2, + c: 'hihi', + d: `how do quote's "work+out"?` + } + + const encoded = base64EncodeObject(object) + expect(encoded).to.be.equal('eyJhIjoxLCJiIjoyLCJjIjoiaGloaSIsImQiOiJob3cgZG8gcXVvdGUncyBcIndvcmsrb3V0XCI_In0') + + const o = base64DecodeObject(encoded) + expect(object).to.deep.equal(o) + }) + + it('encoding, c', () => { + const object = { + a: 1, + b: 2, + c: 'hihi', + d: { nest: '123' } + } + + const encoded = base64EncodeObject(object) + expect(encoded).to.be.equal('eyJhIjoxLCJiIjoyLCJjIjoiaGloaSIsImQiOnsibmVzdCI6IjEyMyJ9fQ') + + const o = base64DecodeObject(encoded) + expect(object).to.deep.equal(o) + }) +}) diff --git a/packages/utils/tests/jwt-decode.spec.ts b/packages/utils/tests/jwt-decode.spec.ts new file mode 100644 index 000000000..f9af7073d --- /dev/null +++ b/packages/utils/tests/jwt-decode.spec.ts @@ -0,0 +1,13 @@ +import { expect } from 'chai' +import { jwtDecodeClaims } from '@0xsequence/utils' + +describe('jwt-decode', function () { + it('decode', () => { + const jwt = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50IjoiMHg4ZTNlMzhmZTczNjdkZDNiNTJkMWUyODFlNGU4NDAwNDQ3YzhkOGI5IiwiYXBwIjoiU2VxdWVuY2UgV2FsbGV0IiwiZXhwIjoxNjIyNzY3MTcwLCJpYXQiOjE2MjAxNzUxNzB9.21AuC33BF6GR67_kixfhoRfpSfN-G98fSe1MEvrcgO0' + + const claims = jwtDecodeClaims(jwt) + expect(claims.account).to.equal('0x8e3e38fe7367dd3b52d1e281e4e8400447c8d8b9') + expect(claims.exp).to.equal(1622767170) + }) +}) diff --git a/packages/utils/tests/merkle.spec.ts b/packages/utils/tests/merkle.spec.ts new file mode 100644 index 000000000..0713189ef --- /dev/null +++ b/packages/utils/tests/merkle.spec.ts @@ -0,0 +1,34 @@ +import { expect } from 'chai' +import { MerkleTreeGenerator, SaleItemsElement, getSaleItemsLeaf } from '@0xsequence/utils' +import { BigNumber, Wallet, constants, utils } from 'ethers' + +describe('merkle', function () { + const addrs = Array.from({ length: 10 }, () => Wallet.createRandom().address) + const elements: SaleItemsElement[] = addrs.map(addr => ({ address: addr, tokenId: BigNumber.from(1) })) + + it('generates tree, root and proof for custom elements', () => { + const getLeaf = (element: string) => utils.solidityKeccak256(['address'], [element.toLowerCase()]) + const merkleGenerator = new MerkleTreeGenerator(addrs, getLeaf) + expect(merkleGenerator.generateRoot()).to.be.a('string') + const proof = merkleGenerator.generateProof(addrs[0]) + expect(proof).to.be.an('array') + expect(merkleGenerator.verifyProof(addrs[0], proof)).to.be.true + }) + + it('generates tree, root and proof for sale items', () => { + const merkleGenerator = new MerkleTreeGenerator(elements, getSaleItemsLeaf) + expect(merkleGenerator.generateRoot()).to.be.a('string') + const proof = merkleGenerator.generateProof(elements[0]) + expect(proof).to.be.an('array') + expect(merkleGenerator.verifyProof(elements[0], proof)).to.be.true + }) + + it('errors when invalid element', () => { + const merkleGenerator = new MerkleTreeGenerator(elements, getSaleItemsLeaf) + const invalidElement: SaleItemsElement = { + address: Wallet.createRandom().address, + tokenId: constants.Zero + } + expect(() => merkleGenerator.generateProof(invalidElement)).to.throw('Element not found') + }) +}) diff --git a/packages/utils/tests/query-string.spec.ts b/packages/utils/tests/query-string.spec.ts new file mode 100644 index 000000000..775797c00 --- /dev/null +++ b/packages/utils/tests/query-string.spec.ts @@ -0,0 +1,51 @@ +import { expect } from 'chai' +import { queryStringFromObject, queryStringToObject } from '@0xsequence/utils' + +describe('query-string', function () { + it('encoding, a', () => { + const object = { + a: 1, + b: 2, + c: 'hihi', + d: '1.234' + } + + const qs = queryStringFromObject('k', object) + expect(qs).to.be.equal('k=%7B%22a%22%3A1%2C%22b%22%3A2%2C%22c%22%3A%22hihi%22%2C%22d%22%3A%221.234%22%7D') + + const o = queryStringToObject(qs) + expect({ k: object }).to.deep.equal(o) + }) + + it('encoding, b', () => { + const object = { + a: 1, + b: 2, + c: 'hihi', + d: `how do quote's "work+out"?` + } + + const qs = queryStringFromObject('k', object) + expect(qs).to.be.equal( + "k=%7B%22a%22%3A1%2C%22b%22%3A2%2C%22c%22%3A%22hihi%22%2C%22d%22%3A%22how%20do%20quote's%20%5C%22work%2Bout%5C%22%3F%22%7D" + ) + + const o = queryStringToObject(qs) + expect({ k: object }).to.deep.equal(o) + }) + + it('encoding, c', () => { + const object = { + a: 1, + b: 2, + c: 'hihi', + d: { nest: '123' } + } + + const qs = queryStringFromObject('k', object) + expect(qs).to.be.equal('k=%7B%22a%22%3A1%2C%22b%22%3A2%2C%22c%22%3A%22hihi%22%2C%22d%22%3A%7B%22nest%22%3A%22123%22%7D%7D') + + const o = queryStringToObject(qs) + expect({ k: object }).to.deep.equal(o) + }) +}) diff --git a/packages/utils/tests/sanitize.spec.ts b/packages/utils/tests/sanitize.spec.ts new file mode 100644 index 000000000..960113319 --- /dev/null +++ b/packages/utils/tests/sanitize.spec.ts @@ -0,0 +1,21 @@ +import { expect } from 'chai' +import { sanitizeHost } from '@0xsequence/utils' + +describe('sanitize', function () { + it('sanitize host', () => { + const a = 'http://localhost:4000' + expect(sanitizeHost(a)).to.equal('http://localhost:4000') + + const b = 'https://localhost:4000' + expect(sanitizeHost(b)).to.equal('https://localhost:4000') + + const c = 'http://play.skyweaver.net' + expect(sanitizeHost(c)).to.equal('http://play.skyweaver.net') + + const d = 'http://hello123-world4.com' + expect(sanitizeHost(d)).to.equal('http://hello123-world4.com') + + const e = 'http://hello-w(!#@%$#%^@orld.com' + expect(sanitizeHost(e)).to.equal('http://hello-w') + }) +}) diff --git a/packages/waas-ethers/README.md b/packages/waas-ethers/README.md new file mode 100644 index 000000000..5fa1f9b1b --- /dev/null +++ b/packages/waas-ethers/README.md @@ -0,0 +1,4 @@ +@0xsequence/waas-ethers +================= + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/waas-ethers/src/index.ts b/packages/waas-ethers/src/index.ts new file mode 100644 index 000000000..eb0b67f6d --- /dev/null +++ b/packages/waas-ethers/src/index.ts @@ -0,0 +1 @@ +export * from './signer' diff --git a/packages/waas-ethers/src/signer.ts b/packages/waas-ethers/src/signer.ts new file mode 100644 index 000000000..7afeaca8b --- /dev/null +++ b/packages/waas-ethers/src/signer.ts @@ -0,0 +1,135 @@ +import { BigNumber, ethers } from 'ethers' +import { CommonAuthArgs, ExtendedSequenceConfig, SequenceWaaS, SequenceConfig, networks, store } from '@0xsequence/waas' + +export class SequenceSigner extends ethers.Signer { + constructor( + private readonly sequence: SequenceWaaS, + readonly provider?: ethers.providers.BaseProvider + ) { + super() + } + + public static fromConfig( + config: SequenceConfig & Partial, + store?: store.Store, + provider?: ethers.providers.BaseProvider + ): SequenceSigner { + return new SequenceSigner(new SequenceWaaS(config, store), provider) + } + + async getAddress(): Promise { + return this.sequence.getAddress() + } + + // Ensure the provider has a sequence supported network + private async _ensureNetworkValid(providerRequired: boolean): Promise { + if (providerRequired && !this.provider) { + throw new Error('Provider is required') + } + if (this.provider && networks.isSimpleNetwork((await this.provider.getNetwork()).chainId)) { + throw new Error('Provider and WaaS configured with different networks') + } + } + + async getSimpleNetwork(): Promise { + if (this.provider) { + return this.provider.getNetwork().then(n => n.chainId) + } + return undefined + } + + async signMessage(message: ethers.utils.Bytes | string, authArgs?: CommonAuthArgs): Promise { + await this._ensureNetworkValid(false) + + const args = { + message: message.toString(), + network: await this.getSimpleNetwork(), + ...authArgs + } + return this.sequence.signMessage(args).then(response => response.data.signature) + } + + async signTransaction(_transaction: ethers.utils.Deferrable): Promise { + // Not supported. Use sendTransaction or signMessage instead. + throw new Error('SequenceSigner does not support signTransaction') + } + + async sendTransaction( + transaction: ethers.utils.Deferrable, + authArgs?: CommonAuthArgs + ): Promise { + await this._ensureNetworkValid(true) + + const args = { + transactions: [await ethers.utils.resolveProperties(transaction)], + network: await this.getSimpleNetwork(), + ...authArgs + } + const response = await this.sequence.sendTransaction(args) + + if (response.code === 'transactionFailed') { + // Failed + throw new Error(`Unable to send transaction: ${response.data.error}`) + } + + if (response.code === 'transactionReceipt') { + // Success + const { txHash } = response.data + // eslint-disable-next-line @typescript-eslint/no-extra-non-null-assertion + return this.provider!!.getTransaction(txHash) + } + + // Impossible + throw new Error('Unknown return value') + } + + connect(provider: ethers.providers.BaseProvider, sequence?: SequenceWaaS): SequenceSigner { + return new SequenceSigner(sequence ?? this.sequence, provider) + } + + // + // Provider required + // + async getBalance(blockTag?: ethers.providers.BlockTag): Promise { + await this._ensureNetworkValid(true) + return super.getBalance(blockTag) + } + + async getTransactionCount(_blockTag?: ethers.providers.BlockTag): Promise { + throw new Error('SequenceSigner does not support getTransactionCount') + } + + async estimateGas(transaction: ethers.utils.Deferrable): Promise { + await this._ensureNetworkValid(true) + //FIXME This won't be accurate + return super.estimateGas(transaction) + } + + async call( + transaction: ethers.utils.Deferrable, + blockTag?: ethers.providers.BlockTag + ): Promise { + await this._ensureNetworkValid(true) + return super.call(transaction, blockTag) + } + + async getChainId(): Promise { + await this._ensureNetworkValid(true) // Prevent mismatched configurations + return super.getChainId() + } + + async getGasPrice(): Promise { + await this._ensureNetworkValid(true) + return super.getGasPrice() + } + + async getFeeData(): Promise { + await this._ensureNetworkValid(true) + return super.getFeeData() + } + + async resolveName(name: string): Promise { + await this._ensureNetworkValid(true) + return super.resolveName(name) + } +} diff --git a/packages/waas/README.md b/packages/waas/README.md new file mode 100644 index 000000000..2811b84f9 --- /dev/null +++ b/packages/waas/README.md @@ -0,0 +1,4 @@ +@0xsequence/waas +================= + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/waas/src/auth.ts b/packages/waas/src/auth.ts new file mode 100644 index 000000000..1a5136c08 --- /dev/null +++ b/packages/waas/src/auth.ts @@ -0,0 +1,712 @@ +import { Observer, SequenceWaaSBase } from './base' +import { + Account, + IdentityType, + IntentDataOpenSession, + IntentDataSendTransaction, + IntentResponseIdToken +} from './clients/intent.gen' +import { newSessionFromSessionId } from './session' +import { LocalStore, Store, StoreObj } from './store' +import { + GetTransactionReceiptArgs, + SendDelayedEncodeArgs, + SendERC1155Args, + SendERC20Args, + SendERC721Args, + SendTransactionsArgs, + SignedIntent, + SignMessageArgs +} from './intents' +import { + FeeOptionsResponse, + isCloseSessionResponse, + isFeeOptionsResponse, + isFinishValidateSessionResponse, + isGetIdTokenResponse, + isGetSessionResponse, + isInitiateAuthResponse, + isIntentTimeError, + isLinkAccountResponse, + isListAccountsResponse, + isMaySentTransactionResponse, + isSessionAuthProofResponse, + isSignedMessageResponse, + isTimedOutTransactionResponse, + isValidationRequiredResponse, + MaySentTransactionResponse, + SignedMessageResponse +} from './intents/responses' +import { WaasAuthenticator, AnswerIncorrectError, Chain, EmailAlreadyInUseError, Session } from './clients/authenticator.gen' +import { SimpleNetwork, WithSimpleNetwork } from './networks' +import { EmailAuth } from './email' +import { ethers } from 'ethers' +import { getDefaultSubtleCryptoBackend, SubtleCryptoBackend } from './subtle-crypto' +import { getDefaultSecureStoreBackend, SecureStoreBackend } from './secure-store' +import { Challenge, EmailChallenge, GuestChallenge, IdTokenChallenge, PlayFabChallenge, StytchChallenge } from './challenge' +import { jwtDecode } from 'jwt-decode' + +export type Sessions = (Session & { isThis: boolean })[] +export type { Account } +export { IdentityType } + +export type SequenceConfig = { + projectAccessKey: string + waasConfigKey: string + network?: SimpleNetwork +} + +export type ExtendedSequenceConfig = { + rpcServer: string + emailRegion?: string +} + +export type WaaSConfigKey = { + projectId: number + emailClientId?: string +} + +export type GuestIdentity = { guest: true } +export type IdTokenIdentity = { idToken: string } +export type EmailIdentity = { email: string } +export type PlayFabIdentity = { + playFabTitleId: string + playFabSessionTicket: string +} + +export type Identity = IdTokenIdentity | EmailIdentity | PlayFabIdentity | GuestIdentity + +export type SignInResponse = { + sessionId: string + wallet: string + email?: string +} + +function encodeHex(data: string | Uint8Array) { + return ( + '0x' + + Array.from(typeof data === 'string' ? new TextEncoder().encode(data) : data, byte => byte.toString(16).padStart(2, '0')).join( + '' + ) + ) +} + +function decodeHex(hex: string) { + return new Uint8Array( + hex + .substring(2) + .match(/.{1,2}/g)! + .map(byte => parseInt(byte, 16)) + ) +} + +export type ValidationArgs = { + onValidationRequired?: () => boolean +} + +export type CommonAuthArgs = { + validation?: ValidationArgs + identifier?: string +} + +export type Network = Chain + +export type NetworkList = Network[] + +export type EmailConflictInfo = { + type: IdentityType + email: string + issuer: string +} + +export function parseSequenceWaaSConfigKey(key: string): Partial { + return JSON.parse(atob(key)) +} + +export function defaultArgsOrFail( + config: SequenceConfig & Partial +): Required & Required & ExtendedSequenceConfig { + const key = (config as any).waasConfigKey + const keyOverrides = key ? parseSequenceWaaSConfigKey(key) : {} + const preconfig = { ...config, ...keyOverrides } + + if (preconfig.network === undefined) { + preconfig.network = 1 + } + + if (preconfig.projectId === undefined) { + throw new Error('Missing project id') + } + + if (preconfig.projectAccessKey === undefined) { + throw new Error('Missing access key') + } + + return preconfig as Required & Required & ExtendedSequenceConfig +} + +export class SequenceWaaS { + private waas: SequenceWaaSBase + private client: WaasAuthenticator + + private validationRequiredCallback: (() => void)[] = [] + private emailConflictCallback: ((info: EmailConflictInfo, forceCreate: () => Promise) => Promise)[] = [] + private emailAuthCodeRequiredCallback: ((respondWithCode: (code: string) => Promise) => Promise)[] = [] + private validationRequiredSalt: string + + public readonly config: Required & Required & ExtendedSequenceConfig + + private readonly deviceName: StoreObj + + private emailClient: EmailAuth | undefined + + // The last Date header value returned by the server, used for users with desynchronised clocks + private lastDate: Date | undefined + + constructor( + config: SequenceConfig & Partial, + private readonly store: Store = new LocalStore(), + private readonly cryptoBackend: SubtleCryptoBackend | null = getDefaultSubtleCryptoBackend(), + private readonly secureStoreBackend: SecureStoreBackend | null = getDefaultSecureStoreBackend() + ) { + this.config = defaultArgsOrFail(config) + this.waas = new SequenceWaaSBase({ network: 1, ...config }, this.store, this.cryptoBackend, this.secureStoreBackend) + this.client = new WaasAuthenticator(this.config.rpcServer, this.fetch.bind(this)) + this.deviceName = new StoreObj(this.store, '@0xsequence.waas.auth.deviceName', undefined) + } + + public get email() { + if (this.emailClient) { + return this.emailClient + } + + if (!this.config.emailRegion) { + throw new Error('Missing emailRegion') + } + + if (!this.config.emailClientId) { + throw new Error('Missing emailClientId') + } + + this.emailClient = new EmailAuth(this.config.emailRegion, this.config.emailClientId) + return this.emailClient + } + + async onValidationRequired(callback: () => void) { + this.validationRequiredCallback.push(callback) + return () => { + this.validationRequiredCallback = this.validationRequiredCallback.filter(c => c !== callback) + } + } + + onEmailConflict(callback: (info: EmailConflictInfo, forceCreate: () => Promise) => Promise) { + this.emailConflictCallback.push(callback) + return () => { + this.emailConflictCallback = this.emailConflictCallback.filter(c => c !== callback) + } + } + + onEmailAuthCodeRequired(callback: (respondWithCode: (code: string) => Promise) => Promise) { + this.emailAuthCodeRequiredCallback.push(callback) + return () => { + this.emailAuthCodeRequiredCallback = this.emailAuthCodeRequiredCallback.filter(c => c !== callback) + } + } + + private async handleValidationRequired({ onValidationRequired }: ValidationArgs = {}): Promise { + const proceed = onValidationRequired ? onValidationRequired() : true + if (!proceed) { + return false + } + + const intent = await this.waas.validateSession({ + deviceMetadata: (await this.deviceName.get()) ?? 'Unknown device' + }) + + const sendIntent = await this.sendIntent(intent) + this.validationRequiredSalt = sendIntent.data.salt + + for (const callback of this.validationRequiredCallback) { + callback() + } + + return this.waitForSessionValid() + } + + private headers() { + return { + 'X-Access-Key': this.config.projectAccessKey + } + } + + private async sendIntent(intent: SignedIntent) { + const sessionId = await this.waas.getSessionId() + if (!sessionId) { + throw new Error('session not open') + } + + try { + const res = await this.client.sendIntent({ intent: intent }, this.headers()) + return res.response + } catch (e) { + if (isIntentTimeError(e) && this.lastDate) { + const newIntent = await this.waas.updateIntentTime(intent, this.lastDate) + const res = await this.client.sendIntent({ intent: newIntent }, this.headers()) + return res.response + } + throw e + } + } + + async isSignedIn() { + return this.waas.isSignedIn() + } + + signIn(creds: Identity, sessionName: string): Promise { + const isEmailAuth = 'email' in creds + if (isEmailAuth && this.emailAuthCodeRequiredCallback.length == 0) { + return Promise.reject('Missing emailAuthCodeRequired callback') + } + + return new Promise(async (resolve, reject) => { + const challenge = await this.initAuth(creds) + + const respondToChallenge = async (answer: string) => { + try { + const res = await this.completeAuth(challenge.withAnswer(answer), { sessionName }) + resolve(res) + } catch (e) { + if (e instanceof AnswerIncorrectError) { + // This will NOT resolve NOR reject the top-level promise returned from signIn, it'll keep being pending + // It allows the caller to retry calling the respondToChallenge callback + throw e + } else if (e instanceof EmailAlreadyInUseError) { + const forceCreate = async () => { + try { + const res = await this.completeAuth(challenge.withAnswer(answer), { sessionName, forceCreateAccount: true }) + resolve(res) + } catch (e) { + reject(e) + } + } + const info: EmailConflictInfo = { + type: IdentityType.None, + email: '', + issuer: '' + } + if (e.cause) { + const parts = e.cause.split('|') + if (parts.length >= 2) { + info.type = parts[0] as IdentityType + info.email = parts[1] + } + if (parts.length >= 3) { + info.issuer = parts[2] + } + } + for (const callback of this.emailConflictCallback) { + callback(info, forceCreate) + } + } else { + reject(e) + } + } + } + + if (isEmailAuth) { + for (const callback of this.emailAuthCodeRequiredCallback) { + callback(respondToChallenge) + } + } else { + respondToChallenge('') + } + }) + } + + async initAuth(identity: Identity): Promise { + if ('guest' in identity && identity.guest) { + return this.initGuestAuth() + } else if ('idToken' in identity) { + return this.initIdTokenAuth(identity.idToken) + } else if ('email' in identity) { + return this.initEmailAuth(identity.email) + } else if ('playFabTitleId' in identity) { + return this.initPlayFabAuth(identity.playFabTitleId, identity.playFabSessionTicket) + } + + throw new Error('invalid identity') + } + + private async initGuestAuth() { + const sessionId = await this.waas.getSessionId() + const intent = await this.waas.initiateGuestAuth() + const res = await this.sendIntent(intent) + + if (!isInitiateAuthResponse(res)) { + throw new Error(`Invalid response: ${JSON.stringify(res)}`) + } + return new GuestChallenge(sessionId, res.data.challenge!) + } + + private async initIdTokenAuth(idToken: string) { + const decoded = jwtDecode(idToken) + const isStytch = decoded.iss?.startsWith('stytch.com/') || false + const intent = isStytch + ? await this.waas.initiateStytchAuth(idToken, decoded.exp) + : await this.waas.initiateIdTokenAuth(idToken, decoded.exp) + const res = await this.sendIntent(intent) + + if (!isInitiateAuthResponse(res)) { + throw new Error(`Invalid response: ${JSON.stringify(res)}`) + } + return isStytch ? new StytchChallenge(idToken) : new IdTokenChallenge(idToken) + } + + private async initEmailAuth(email: string) { + const sessionId = await this.waas.getSessionId() + const intent = await this.waas.initiateEmailAuth(email) + const res = await this.sendIntent(intent) + + if (!isInitiateAuthResponse(res)) { + throw new Error(`Invalid response: ${JSON.stringify(res)}`) + } + return new EmailChallenge(email, sessionId, res.data.challenge!) + } + + private async initPlayFabAuth(titleId: string, sessionTicket: string) { + const intent = await this.waas.initiatePlayFabAuth(titleId, sessionTicket) + const res = await this.sendIntent(intent) + + if (!isInitiateAuthResponse(res)) { + throw new Error(`Invalid response: ${JSON.stringify(res)}`) + } + return new PlayFabChallenge(titleId, sessionTicket) + } + + async completeAuth( + challenge: Challenge, + opts?: { sessionName?: string; forceCreateAccount?: boolean } + ): Promise { + if (!opts) { + opts = {} + } + if (!opts.sessionName) { + opts.sessionName = 'session name' + } + + const intent = await this.waas.completeAuth(challenge.getIntentParams(), { forceCreateAccount: opts.forceCreateAccount }) + try { + const res = await this.registerSession(intent, opts.sessionName) + + await this.waas.completeSignIn({ + code: 'sessionOpened', + data: { + sessionId: res.session.id, + wallet: res.response.data.wallet + } + }) + + return { + sessionId: res.session.id, + wallet: res.response.data.wallet, + email: res.session.identity.email + } + } catch (e) { + if (!(e instanceof EmailAlreadyInUseError) && !(e instanceof AnswerIncorrectError)) { + await this.waas.completeSignOut() + } + throw e + } + } + + async registerSession(intent: SignedIntent, name: string) { + try { + const res = await this.client.registerSession({ intent, friendlyName: name }, this.headers()) + return res + } catch (e) { + if (isIntentTimeError(e) && this.lastDate) { + const newIntent = await this.waas.updateIntentTime(intent, this.lastDate) + return await this.client.registerSession({ intent: newIntent, friendlyName: name }, this.headers()) + } + throw e + } + } + + private async refreshSession() { + throw new Error('Not implemented') + } + + async getSessionId() { + return this.waas.getSessionId() + } + + async getSessionHash() { + const sessionId = (await this.waas.getSessionId()).toLowerCase() + return ethers.utils.keccak256(ethers.utils.toUtf8Bytes(sessionId)) + } + + async dropSession({ sessionId, strict }: { sessionId?: string; strict?: boolean } = {}) { + const thisSessionId = await this.waas.getSessionId() + if (!thisSessionId) { + throw new Error('session not open') + } + + const closeSessionId = sessionId || thisSessionId + + try { + const intent = await this.waas.signOutSession(closeSessionId) + const result = await this.sendIntent(intent) + + if (!isCloseSessionResponse(result)) { + throw new Error(`Invalid response: ${JSON.stringify(result)}`) + } + } catch (e) { + if (strict) { + throw e + } + + console.error(e) + } + + if (closeSessionId === thisSessionId) { + if (!this.secureStoreBackend) { + throw new Error('No secure store available') + } + + const session = await newSessionFromSessionId(thisSessionId, this.cryptoBackend, this.secureStoreBackend) + session.clear() + await this.waas.completeSignOut() + await this.deviceName.set(undefined) + } + } + + async listSessions(): Promise { + const sessionId = await this.waas.getSessionId() + if (!sessionId) { + throw new Error('session not open') + } + + const intent = await this.waas.listSessions() + const res = await this.sendIntent(intent) + + return (res.data as Session[]).map(session => ({ + ...session, + isThis: session.id === sessionId + })) + } + + // WaaS specific methods + async getAddress() { + return this.waas.getAddress() + } + + async validateSession(args?: ValidationArgs) { + if (await this.isSessionValid()) { + return true + } + + return this.handleValidationRequired(args) + } + + async finishValidateSession(challenge: string): Promise { + const intent = await this.waas.finishValidateSession(this.validationRequiredSalt, challenge) + const result = await this.sendIntent(intent) + + if (!isFinishValidateSessionResponse(result)) { + throw new Error(`Invalid response: ${JSON.stringify(result)}`) + } + + this.validationRequiredSalt = '' + return result.data.isValid + } + + async isSessionValid(): Promise { + const intent = await this.waas.getSession() + const result = await this.sendIntent(intent) + + if (!isGetSessionResponse(result)) { + throw new Error(`Invalid response: ${JSON.stringify(result)}`) + } + + return result.data.validated + } + + async waitForSessionValid(timeout: number = 600000, pollRate: number = 2000) { + const start = Date.now() + + while (Date.now() - start < timeout) { + if (await this.isSessionValid()) { + return true + } + + await new Promise(resolve => setTimeout(resolve, pollRate)) + } + + return false + } + + async sessionAuthProof({ nonce, network, validation }: { nonce?: string; network?: string; validation?: ValidationArgs }) { + const intent = await this.waas.sessionAuthProof({ nonce, network }) + return await this.trySendIntent({ validation }, intent, isSessionAuthProofResponse) + } + + async listAccounts() { + const intent = await this.waas.listAccounts() + const res = await this.sendIntent(intent) + + if (!isListAccountsResponse(res)) { + throw new Error(`Invalid response: ${JSON.stringify(res)}`) + } + + return res.data + } + + async linkAccount(challenge: Challenge) { + const intent = await this.waas.linkAccount(challenge.getIntentParams()) + const res = await this.sendIntent(intent) + + if (!isLinkAccountResponse(res)) { + throw new Error(`Invalid response: ${JSON.stringify(res)}`) + } + + return res.data + } + + async removeAccount(accountId: string) { + const intent = await this.waas.removeAccount({ accountId }) + await this.sendIntent(intent) + } + + async getIdToken(args?: { nonce?: string }): Promise { + const intent = await this.waas.getIdToken({ nonce: args?.nonce }) + const res = await this.sendIntent(intent) + + if (!isGetIdTokenResponse(res)) { + throw new Error(`Invalid response: ${JSON.stringify(res)}`) + } + + return res.data + } + + async useIdentifier(args: T): Promise { + if (args.identifier) { + return args as T & { identifier: string } + } + + // Generate a new identifier + const identifier = `ts-sdk-${Date.now()}-${await this.waas.getSessionId()}` + return { ...args, identifier } as T & { identifier: string } + } + + private async trySendIntent( + args: CommonAuthArgs, + intent: SignedIntent, + isExpectedResponse: (response: any) => response is T + ): Promise { + const response = await this.sendIntent(intent) + + if (isExpectedResponse(response)) { + return response + } + + if (isValidationRequiredResponse(response)) { + const proceed = await this.handleValidationRequired(args.validation) + + if (proceed) { + const response2 = await this.sendIntent(intent) + if (isExpectedResponse(response2)) { + return response2 + } + } + } + + throw new Error(JSON.stringify(response)) + } + + async signMessage(args: WithSimpleNetwork & CommonAuthArgs): Promise { + const intent = await this.waas.signMessage(await this.useIdentifier(args)) + return this.trySendIntent(args, intent, isSignedMessageResponse) + } + + private async trySendTransactionIntent( + intent: SignedIntent, + args: CommonAuthArgs + ): Promise { + let result = await this.trySendIntent(args, intent, isMaySentTransactionResponse) + + while (isTimedOutTransactionResponse(result)) { + await new Promise(resolve => setTimeout(resolve, 1000)) + + const receiptArgs: WithSimpleNetwork & CommonAuthArgs = { + metaTxHash: result.data.metaTxHash, + network: intent.data.network, + identifier: intent.data.identifier, + validation: args.validation + } + const receiptIntent = await this.waas.getTransactionReceipt(await this.useIdentifier(receiptArgs)) + result = await this.trySendIntent(receiptArgs, receiptIntent, isMaySentTransactionResponse) + } + + return result + } + + async sendTransaction(args: WithSimpleNetwork & CommonAuthArgs): Promise { + const intent = await this.waas.sendTransaction(await this.useIdentifier(args)) + return this.trySendTransactionIntent(intent, args) + } + + async sendERC20(args: WithSimpleNetwork & CommonAuthArgs): Promise { + const intent = await this.waas.sendERC20(await this.useIdentifier(args)) + return this.trySendTransactionIntent(intent, args) + } + + async sendERC721(args: WithSimpleNetwork & CommonAuthArgs): Promise { + const intent = await this.waas.sendERC721(await this.useIdentifier(args)) + return this.trySendTransactionIntent(intent, args) + } + + async sendERC1155(args: WithSimpleNetwork & CommonAuthArgs): Promise { + const intent = await this.waas.sendERC1155(await this.useIdentifier(args)) + return this.trySendTransactionIntent(intent, args) + } + + async callContract(args: WithSimpleNetwork & CommonAuthArgs): Promise { + const intent = await this.waas.callContract(await this.useIdentifier(args)) + return this.trySendTransactionIntent(intent, args) + } + + async feeOptions(args: WithSimpleNetwork & CommonAuthArgs): Promise { + const intent = await this.waas.feeOptions(await this.useIdentifier(args)) + return this.trySendIntent(args, intent, isFeeOptionsResponse) + } + + async networkList(): Promise { + const networks: NetworkList = [] + const chainList = await this.client.chainList({ + 'X-Access-Key': this.config.projectAccessKey + }) + + for (const chain of chainList.chains) { + networks.push({ + id: chain.id, + name: chain.name, + isEnabled: chain.isEnabled + }) + } + return networks + } + + onSessionStateChanged(callback: Observer) { + return this.waas.onSessionStateChanged(callback) + } + + // Special version of fetch that keeps track of the last seen Date header + async fetch(input: RequestInfo, init?: RequestInit) { + const res = await window.fetch(input, init) + const headerValue = res.headers.get('date') + if (headerValue) { + this.lastDate = new Date(headerValue) + } + return res + } +} diff --git a/packages/waas/src/base.ts b/packages/waas/src/base.ts new file mode 100644 index 000000000..de6fa2139 --- /dev/null +++ b/packages/waas/src/base.ts @@ -0,0 +1,605 @@ +import { + changeIntentTime, + closeSession, + combineTransactionIntents, + feeOptions, + finishValidateSession, + getIdToken, + getSession, + getTransactionReceipt, + GetTransactionReceiptArgs, + initiateAuth, + Intent, + listSessions, + openSession, + OpenSessionArgs, + sendDelayedEncode, + SendDelayedEncodeArgs, + sendERC1155, + SendERC1155Args, + sendERC20, + SendERC20Args, + sendERC721, + SendERC721Args, + sendTransactions, + SendTransactionsArgs, + sessionAuthProof, + SignedIntent, + signIntent, + signMessage, + SignMessageArgs, + validateSession +} from './intents' +import { LocalStore, Store, StoreObj } from './store' +import { newSession, newSessionFromSessionId } from './session' +import { OpenSessionResponse } from './intents/responses' +import { federateAccount, listAccounts, removeAccount } from './intents/accounts' +import { SimpleNetwork, toNetworkID, WithSimpleNetwork } from './networks' +import { + IdentityType, + IntentDataFederateAccount, + IntentDataFeeOptions, + IntentDataFinishValidateSession, + IntentDataGetSession, + IntentDataGetTransactionReceipt, + IntentDataInitiateAuth, + IntentDataListAccounts, + IntentDataOpenSession, + IntentDataSendTransaction, + IntentDataSignMessage, + IntentDataValidateSession +} from './clients/intent.gen' +import { getDefaultSubtleCryptoBackend, SubtleCryptoBackend } from './subtle-crypto' +import { getDefaultSecureStoreBackend, SecureStoreBackend } from './secure-store' +import { ethers } from 'ethers' +import { ChallengeIntentParams } from './challenge' + +type Status = 'pending' | 'signed-in' | 'signed-out' + +const SEQUENCE_WAAS_WALLET_KEY = '@0xsequence.waas.wallet' +const SEQUENCE_WAAS_SESSION_ID_KEY = '@0xsequence.waas.session_id' +const SEQUENCE_WAAS_STATUS_KEY = '@0xsequence.waas.status' + +// 5 minutes of default lifespan +const DEFAULT_LIFESPAN = 5 * 60 + +export type SessionAuthProofArgs = { + nonce?: string +} + +export type ExtraArgs = { + lifespan?: number +} + +export type ExtraTransactionArgs = ExtraArgs & { + identifier: string +} + +export type SequenceBaseConfig = { + network: SimpleNetwork +} + +export type Observer = (value: T | null) => any + +export class SequenceWaaSBase { + private readonly status: StoreObj + private readonly sessionId: StoreObj + private readonly wallet: StoreObj + + private sessionObservers: Observer[] = [] + + constructor( + public readonly config = { network: 1 } as SequenceBaseConfig, + private readonly store: Store = new LocalStore(), + private readonly cryptoBackend: SubtleCryptoBackend | null = getDefaultSubtleCryptoBackend(), + private readonly secureStoreBackend: SecureStoreBackend | null = getDefaultSecureStoreBackend() + ) { + this.status = new StoreObj(this.store, SEQUENCE_WAAS_STATUS_KEY, 'signed-out') + this.sessionId = new StoreObj(this.store, SEQUENCE_WAAS_SESSION_ID_KEY, undefined) + this.wallet = new StoreObj(this.store, SEQUENCE_WAAS_WALLET_KEY, undefined) + } + + async getAddress() { + return this.getWalletAddress() + } + + private async getWalletAddress() { + if (!(await this.isSignedIn())) { + throw new Error('Not signed in') + } + + const wallet = await this.wallet.get() + if (!wallet) { + throw new Error('No wallet') + } + + return wallet + } + + private async commonArgs( + args: T & { + identifier: string + lifespan?: number + network?: SimpleNetwork + } + ): Promise< + T & { + identifier: string + wallet: string + lifespan: number + chainId: number + } + > { + return { + ...args, + identifier: args?.identifier, + wallet: await this.getWalletAddress(), + lifespan: args?.lifespan ?? DEFAULT_LIFESPAN, + chainId: toNetworkID(args.network || this.config.network) + } + } + + /** + * Builds a payload that can be sent to the WaaS API to sign a transaction. + * It automatically signs the payload, and attaches the current wallet address. + * + * @param packet The action already packed into a packet + * @returns A payload that can be sent to the WaaS API + */ + private async signIntent(intent: Intent): Promise> { + const sessionId = await this.getSessionId() + if (sessionId === undefined) { + throw new Error('session not open') + } + + const session = await newSessionFromSessionId(sessionId, this.cryptoBackend, this.secureStoreBackend) + return signIntent(session, intent) + } + + public async signUsingSessionKey(message: string | Uint8Array) { + const sessionId = await this.getSessionId() + if (!sessionId) { + throw new Error('session not open') + } + + const signer = await newSessionFromSessionId(sessionId, this.cryptoBackend, this.secureStoreBackend) + return signer.sign(message) + } + + private gettingSessionIdPromise: Promise | undefined + + /** + * This method will return session id. + * + * @returns an id of the session + */ + public async getSessionId(): Promise { + if (this.gettingSessionIdPromise) { + return this.gettingSessionIdPromise + } + + const promiseGenerator = async () => { + let sessionId = await this.sessionId.get() + if (!sessionId) { + const session = await newSession(this.cryptoBackend, this.secureStoreBackend) + sessionId = await session.sessionId() + await this.sessionId.set(sessionId) + this.signalObservers(this.sessionObservers, sessionId) + } + this.gettingSessionIdPromise = undefined + return sessionId + } + + this.gettingSessionIdPromise = promiseGenerator() + return this.gettingSessionIdPromise + } + + /** + * This method will initiate a sign-in process with the waas API. It must be performed + * when the user wants to sign in to the app, in parallel with the authentication of the + * application's own authentication system. + * + * This method begins the sign-in process, but does not complete it. The returned payload + * must be sent to the waas API to complete the sign-in. The waas API will return a receipt + * that must be sent to the `completeSignIn` method to complete the sign-in. + * + * @param idToken Information about the user that can be used to prove their identity + * @returns a session payload that **must** be sent to the waas API to complete the sign-in + * @throws {Error} If the session is already signed in or there is a pending sign-in + */ + async signInWithIdToken(idToken: string): Promise> { + const status = await this.status.get() + if (status !== 'signed-out') { + await this.completeSignOut() + throw new Error('you are already signed in') // TODO change this awful msg + } + + const sessionId = await this.getSessionId() + const intent = await openSession({ + sessionId, + identityType: IdentityType.None, + idToken, + lifespan: DEFAULT_LIFESPAN + }) + + await this.status.set('pending') + + return this.signIntent(intent) + } + + async initiateGuestAuth(): Promise> { + const sessionId = await this.getSessionId() + const intent = await initiateAuth({ + sessionId, + identityType: IdentityType.Guest, + verifier: sessionId, + lifespan: DEFAULT_LIFESPAN + }) + + return this.signIntent(intent) + } + + async initiateEmailAuth(email: string): Promise> { + const sessionId = await this.getSessionId() + const intent = await initiateAuth({ + sessionId, + identityType: IdentityType.Email, + verifier: `${email};${sessionId}`, + lifespan: DEFAULT_LIFESPAN + }) + + return this.signIntent(intent) + } + + async initiateIdTokenAuth(idToken: string, exp?: number): Promise> { + const sessionId = await this.getSessionId() + const idTokenHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(idToken)) + const intent = await initiateAuth({ + sessionId, + identityType: IdentityType.OIDC, + verifier: `${idTokenHash};${exp}`, + lifespan: DEFAULT_LIFESPAN + }) + + return this.signIntent(intent) + } + + async initiateStytchAuth(idToken: string, exp?: number): Promise> { + const sessionId = await this.getSessionId() + const idTokenHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(idToken)) + const intent = await initiateAuth({ + sessionId, + identityType: IdentityType.Stytch, + verifier: `${idTokenHash};${exp}`, + lifespan: DEFAULT_LIFESPAN + }) + + return this.signIntent(intent) + } + + async initiatePlayFabAuth(titleId: string, sessionTicket: string): Promise> { + const sessionId = await this.getSessionId() + const ticketHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(sessionTicket)) + const intent = await initiateAuth({ + sessionId, + identityType: IdentityType.PlayFab, + verifier: `${titleId}|${ticketHash}`, + lifespan: DEFAULT_LIFESPAN + }) + + return this.signIntent(intent) + } + + async completeAuth(params: ChallengeIntentParams, optParams: Partial) { + const sessionId = await this.getSessionId() + const intent = await openSession({ + ...optParams, + sessionId, + lifespan: DEFAULT_LIFESPAN, + ...params + }) + + await this.status.set('pending') + + return this.signIntent(intent) + } + + onSessionStateChanged(callback: Observer): () => void { + this.sessionObservers.push(callback) + return () => { + this.sessionObservers = this.sessionObservers.filter(o => o != callback) + } + } + + async signOut({ lifespan, sessionId }: { sessionId?: string } & ExtraArgs = {}) { + sessionId = sessionId || (await this.sessionId.get()) + if (!sessionId) { + throw new Error('session not open') + } + + const intent = closeSession({ + lifespan: lifespan || DEFAULT_LIFESPAN, + sessionId: sessionId + }) + + return this.signIntent(intent) + } + + async signOutSession(sessionId: string) { + const intent = closeSession({ + lifespan: DEFAULT_LIFESPAN, + sessionId: sessionId + }) + + return this.signIntent(intent) + } + + async listSessions() { + const intent = listSessions({ + lifespan: DEFAULT_LIFESPAN, + wallet: await this.getWalletAddress() + }) + + return this.signIntent(intent) + } + + async completeSignOut() { + await Promise.all([this.status.set('signed-out'), this.wallet.set(undefined), this.sessionId.set(undefined)]) + this.signalObservers(this.sessionObservers, null) + } + + /** + * This method will complete a sign-in process with the waas API. It must be performed + * after the `signIn` method, when the waas API has returned a receipt. + * + * This method completes the sign-in process by validating the receipt's proof. + * If the proof is invalid or there is no pending sign-in, it will throw an error. + * + * After this method is called, the wallet is ready to be used to sign transactions. + * + * @param receipt The receipt returned by the waas API after the `signIn` method + * @returns The wallet address of the user that signed in + * @throws {Error} If there is no pending sign-in or the receipt is invalid + */ + async completeSignIn(receipt: OpenSessionResponse): Promise { + if ((receipt as any).result) { + return this.completeSignIn((receipt as any).result) + } + + const status = await this.status.get() + + if (receipt.code !== 'sessionOpened') { + throw new Error('Invalid receipt') + } + + if (status !== 'pending') { + throw new Error('No pending sign in') + } + + await Promise.all([this.status.set('signed-in'), this.wallet.set(receipt.data.wallet)]) + + return receipt.data.wallet + } + + async isSignedIn() { + const status = await this.status.get() + return status === 'signed-in' + } + + async sessionAuthProof(args: WithSimpleNetwork & ExtraArgs) { + const packet = sessionAuthProof({ + lifespan: args.lifespan ?? DEFAULT_LIFESPAN, + network: toNetworkID(args.network || this.config.network).toString(), + wallet: await this.getWalletAddress(), + nonce: args.nonce + }) + return this.signIntent(packet) + } + + // + // Signer methods + // + + /** + * This method can be used to sign message using waas API. It can only be used + * after successfully signing in with the `signIn` and `completeSignIn` methods. + * + * The method does not sign the message. It only returns a payload + * that must be sent to the waas API to complete the sign process. + * + * @param chainId The network on which the message will be signed + * @param message The message that will be signed + * @return a payload that must be sent to the waas API to complete sign process + */ + async signMessage(args: WithSimpleNetwork & ExtraArgs): Promise> { + const packet = signMessage({ + chainId: toNetworkID(args.network || this.config.network), + ...args, + lifespan: args.lifespan ?? DEFAULT_LIFESPAN, + wallet: await this.getWalletAddress() + }) + + return this.signIntent(packet) + } + + /** + * This method can be used to send transactions to the waas API. It can only be used + * after successfully signing in with the `signIn` and `completeSignIn` methods. + * + * The method does not send the transactions to the network. It only returns a payload + * that must be sent to the waas API to complete the transaction. + * + * @param transactions The transactions to be sent + * @param chainId The network on which the transactions will be sent + * @returns a payload that must be sent to the waas API to complete the transaction + */ + async sendTransaction( + args: WithSimpleNetwork & ExtraTransactionArgs + ): Promise> { + const intent = sendTransactions(await this.commonArgs(args)) + return this.signIntent(intent) + } + + async getTransactionReceipt( + args: WithSimpleNetwork & ExtraTransactionArgs + ): Promise> { + const intent = getTransactionReceipt(await this.commonArgs(args)) + return this.signIntent(intent) + } + + async sendERC20( + args: WithSimpleNetwork & ExtraTransactionArgs + ): Promise> { + if (args.token.toLowerCase() === args.to.toLowerCase()) { + throw new Error('Cannot burn tokens using sendERC20') + } + + const intent = sendERC20(await this.commonArgs(args)) + return this.signIntent(intent) + } + + async sendERC721( + args: WithSimpleNetwork & ExtraTransactionArgs + ): Promise> { + if (args.token.toLowerCase() === args.to.toLowerCase()) { + throw new Error('Cannot burn tokens using sendERC721') + } + + const intent = sendERC721(await this.commonArgs(args)) + return this.signIntent(intent) + } + + async sendERC1155( + args: WithSimpleNetwork & ExtraTransactionArgs + ): Promise> { + if (args.token.toLowerCase() === args.to.toLowerCase()) { + throw new Error('Cannot burn tokens using sendERC1155') + } + + const intent = sendERC1155(await this.commonArgs(args)) + return this.signIntent(intent) + } + + async callContract( + args: WithSimpleNetwork & ExtraTransactionArgs + ): Promise> { + const intent = sendDelayedEncode(await this.commonArgs(args)) + return this.signIntent(intent) + } + + async feeOptions( + args: WithSimpleNetwork & ExtraTransactionArgs + ): Promise> { + const intent = feeOptions(await this.commonArgs(args)) + return this.signIntent(intent) + } + + async validateSession({ deviceMetadata }: { deviceMetadata: string }): Promise> { + const sessionId = await this.sessionId.get() + if (!sessionId) { + throw new Error('session not open') + } + + const intent = await validateSession({ + lifespan: DEFAULT_LIFESPAN, + sessionId: sessionId, + deviceMetadata, + wallet: await this.getWalletAddress() + }) + + return this.signIntent(intent) + } + + async getSession(): Promise> { + const sessionId = await this.sessionId.get() + if (!sessionId) { + throw new Error('session not open') + } + + const intent = getSession({ + sessionId, + wallet: await this.getWalletAddress(), + lifespan: DEFAULT_LIFESPAN + }) + + return this.signIntent(intent) + } + + async finishValidateSession(salt: string, challenge: string): Promise> { + const sessionId = await this.sessionId.get() + if (!sessionId) { + throw new Error('session not open') + } + + const wallet = await this.getWalletAddress() + const intent = finishValidateSession({ + sessionId, + wallet, + lifespan: DEFAULT_LIFESPAN, + salt, + challenge + }) + return this.signIntent(intent) + } + + async listAccounts(): Promise> { + const intent = listAccounts({ + wallet: await this.getWalletAddress(), + lifespan: DEFAULT_LIFESPAN + }) + return this.signIntent(intent) + } + + async linkAccount(params: ChallengeIntentParams): Promise> { + const sessionId = await this.sessionId.get() + if (!sessionId) { + throw new Error('session not open') + } + + const intent = federateAccount({ + wallet: await this.getWalletAddress(), + lifespan: DEFAULT_LIFESPAN, + sessionId, + ...params + }) + return this.signIntent(intent) + } + + async removeAccount({ accountId }: { accountId: string }) { + const intent = removeAccount({ + wallet: await this.getWalletAddress(), + lifespan: DEFAULT_LIFESPAN, + accountId + }) + return this.signIntent(intent) + } + + async getIdToken({ nonce }: { nonce?: string }) { + const sessionId = await this.sessionId.get() + if (!sessionId) { + throw new Error('session not open') + } + + const intent = getIdToken({ + wallet: await this.getWalletAddress(), + lifespan: DEFAULT_LIFESPAN, + sessionId, + nonce + }) + return this.signIntent(intent) + } + + async batch(intents: Intent[]): Promise> { + const combined = combineTransactionIntents(intents) + return this.signIntent(combined) + } + + private signalObservers(observers: Observer[], value: T | null) { + observers.forEach(observer => observer(value)) + } + + async updateIntentTime(intent: SignedIntent, time: Date): Promise> { + const newIntent = changeIntentTime(intent, time) + return this.signIntent(newIntent) + } +} diff --git a/packages/waas/src/challenge.ts b/packages/waas/src/challenge.ts new file mode 100644 index 000000000..9effd946f --- /dev/null +++ b/packages/waas/src/challenge.ts @@ -0,0 +1,121 @@ +import { IdentityType } from './clients/intent.gen' +import { ethers } from 'ethers' +import { jwtDecode } from 'jwt-decode' + +export interface ChallengeIntentParams { + identityType: IdentityType + verifier: string + answer?: string +} + +export abstract class Challenge { + public abstract getIntentParams(): ChallengeIntentParams + public abstract withAnswer(answer: string): Challenge +} + +export class GuestChallenge extends Challenge { + constructor( + readonly sessionId: string, + readonly challenge: string + ) { + super() + } + + getIntentParams(): ChallengeIntentParams { + const answer = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(this.challenge + this.sessionId)) + return { + identityType: IdentityType.Guest, + verifier: this.sessionId, + answer + } + } + + withAnswer(answer: string): Challenge { + return this + } +} + +export class EmailChallenge extends Challenge { + private hashedAnswer?: string + + constructor( + readonly email: string, + readonly sessionId: string, + readonly challenge: string + ) { + super() + } + + getIntentParams(): ChallengeIntentParams { + return { + identityType: IdentityType.Email, + verifier: `${this.email};${this.sessionId}`, + answer: this.hashedAnswer + } + } + + setAnswer(answer: string): void { + this.hashedAnswer = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(this.challenge + answer)) + } + + withAnswer(answer: string) { + const challenge = new EmailChallenge(this.email, this.sessionId, this.challenge) + challenge.setAnswer(answer) + return challenge + } +} + +export class IdTokenChallenge extends Challenge { + constructor(readonly idToken: string) { + super() + } + + getIntentParams(): ChallengeIntentParams { + const decoded = jwtDecode(this.idToken) + const idTokenHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(this.idToken)) + return { + identityType: IdentityType.OIDC, + verifier: `${idTokenHash};${decoded.exp}`, + answer: this.idToken + } + } + + withAnswer() { + return this + } +} + +export class StytchChallenge extends IdTokenChallenge { + constructor(readonly idToken: string) { + super(idToken) + } + + getIntentParams(): ChallengeIntentParams { + return { + ...super.getIntentParams(), + identityType: IdentityType.Stytch + } + } +} + +export class PlayFabChallenge extends Challenge { + constructor( + readonly titleId: string, + readonly sessionTicket: string + ) { + super() + } + + getIntentParams(): ChallengeIntentParams { + const ticketHash = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(this.sessionTicket)) + return { + identityType: IdentityType.PlayFab, + verifier: `${this.titleId}|${ticketHash}`, + answer: this.sessionTicket + } + } + + withAnswer() { + return this + } +} diff --git a/packages/waas/src/clients/authenticator.gen.ts b/packages/waas/src/clients/authenticator.gen.ts new file mode 100644 index 000000000..fa192f665 --- /dev/null +++ b/packages/waas/src/clients/authenticator.gen.ts @@ -0,0 +1,823 @@ +/* eslint-disable */ +// sequence-waas-authenticator v0.1.0 35f86317a98af91896d1114ad52dd22102d9de9f +// -- +// Code generated by webrpc-gen@v0.18.8 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=authenticator.ridl -target=typescript -client -out=./clients/authenticator.gen.ts + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.1.0' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = '35f86317a98af91896d1114ad52dd22102d9de9f' + +// +// Types +// + +export enum IntentName { + initiateAuth = 'initiateAuth', + openSession = 'openSession', + closeSession = 'closeSession', + validateSession = 'validateSession', + finishValidateSession = 'finishValidateSession', + listSessions = 'listSessions', + getSession = 'getSession', + sessionAuthProof = 'sessionAuthProof', + feeOptions = 'feeOptions', + signMessage = 'signMessage', + sendTransaction = 'sendTransaction', + getTransactionReceipt = 'getTransactionReceipt', + federateAccount = 'federateAccount', + removeAccount = 'removeAccount', + listAccounts = 'listAccounts', + getIdToken = 'getIdToken' +} + +export enum IntentResponseCode { + authInitiated = 'authInitiated', + sessionOpened = 'sessionOpened', + sessionClosed = 'sessionClosed', + sessionList = 'sessionList', + validationRequired = 'validationRequired', + validationStarted = 'validationStarted', + validationFinished = 'validationFinished', + sessionAuthProof = 'sessionAuthProof', + signedMessage = 'signedMessage', + feeOptions = 'feeOptions', + transactionReceipt = 'transactionReceipt', + transactionFailed = 'transactionFailed', + getSessionResponse = 'getSessionResponse', + accountList = 'accountList', + accountFederated = 'accountFederated', + accountRemoved = 'accountRemoved', + idToken = 'idToken' +} + +export enum IdentityType { + None = 'None', + Guest = 'Guest', + OIDC = 'OIDC', + Email = 'Email', + PlayFab = 'PlayFab', + Stytch = 'Stytch' +} + +export interface Intent { + version: string + name: IntentName + expiresAt: number + issuedAt: number + data: any + signatures: Array +} + +export interface Signature { + sessionId: string + signature: string +} + +export interface IntentResponse { + code: IntentResponseCode + data: any +} + +export interface Version { + webrpcVersion: string + schemaVersion: string + schemaHash: string + appVersion: string +} + +export interface RuntimeStatus { + healthOK: boolean + startTime: string + uptime: number + ver: string + pcr0: string +} + +export interface Chain { + id: number + name: string + isEnabled: boolean +} + +export interface Identity { + type: IdentityType + iss: string + sub: string + email: string +} + +export interface OpenIdProvider { + iss: string + aud: Array +} + +export interface AuthEmailConfig { + enabled: boolean +} + +export interface AuthGuestConfig { + enabled: boolean +} + +export interface AuthPlayfabConfig { + enabled: boolean + titleId?: string +} + +export interface AuthStytchConfig { + enabled: boolean + projectId?: string +} + +export interface AuthConfig { + email?: AuthEmailConfig + guest?: AuthGuestConfig + playfab?: AuthPlayfabConfig + stytch?: AuthStytchConfig +} + +export interface Tenant { + projectId: number + version: number + oidcProviders: Array + allowedOrigins: Array + authConfig: AuthConfig + updatedAt: string +} + +export interface TenantData { + projectId: number + privateKey: string + parentAddress: string + userSalt: string + sequenceContext: MiniSequenceContext + upgradeCode: string + waasAccessToken: string + authConfig: AuthConfig + oidcProviders: Array + kmsKeys: Array + allowedOrigins: Array +} + +export interface MiniSequenceContext { + factory: string + mainModule: string +} + +export interface AccountData { + projectId: number + userId: string + identity: string + createdAt: string +} + +export interface Session { + id: string + projectId: number + userId: string + identity: Identity + friendlyName: string + createdAt: string + refreshedAt: string + expiresAt: string +} + +export interface SessionData { + id: string + projectId: number + userId: string + identity: string + createdAt: string + expiresAt: string +} + +export interface VerificationContext { + projectId: number + sessionId: string + identityType: IdentityType + verifier: string + challenge?: string + answer?: string + attempts: number + lastAttemptAt?: string + expiresAt: string +} + +export interface WaasAuthenticator { + registerSession(args: RegisterSessionArgs, headers?: object, signal?: AbortSignal): Promise + sendIntent(args: SendIntentArgs, headers?: object, signal?: AbortSignal): Promise + chainList(headers?: object, signal?: AbortSignal): Promise +} + +export interface RegisterSessionArgs { + intent: Intent + friendlyName: string +} + +export interface RegisterSessionReturn { + session: Session + response: IntentResponse +} +export interface SendIntentArgs { + intent: Intent +} + +export interface SendIntentReturn { + response: IntentResponse +} +export interface ChainListArgs {} + +export interface ChainListReturn { + chains: Array +} + +export interface WaasAuthenticatorAdmin { + version(headers?: object, signal?: AbortSignal): Promise + runtimeStatus(headers?: object, signal?: AbortSignal): Promise + clock(headers?: object, signal?: AbortSignal): Promise + getTenant(args: GetTenantArgs, headers?: object, signal?: AbortSignal): Promise + createTenant(args: CreateTenantArgs, headers?: object, signal?: AbortSignal): Promise + updateTenant(args: UpdateTenantArgs, headers?: object, signal?: AbortSignal): Promise +} + +export interface VersionArgs {} + +export interface VersionReturn { + version: Version +} +export interface RuntimeStatusArgs {} + +export interface RuntimeStatusReturn { + status: RuntimeStatus +} +export interface ClockArgs {} + +export interface ClockReturn { + serverTime: string +} +export interface GetTenantArgs { + projectId: number +} + +export interface GetTenantReturn { + tenant: Tenant +} +export interface CreateTenantArgs { + projectId: number + waasAccessToken: string + authConfig: AuthConfig + oidcProviders: Array + allowedOrigins: Array + password?: string +} + +export interface CreateTenantReturn { + tenant: Tenant + upgradeCode: string +} +export interface UpdateTenantArgs { + projectId: number + upgradeCode: string + authConfig: AuthConfig + oidcProviders: Array + allowedOrigins: Array +} + +export interface UpdateTenantReturn { + tenant: Tenant +} + +// +// Client +// +export class WaasAuthenticator implements WaasAuthenticator { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/WaasAuthenticator/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + registerSession = (args: RegisterSessionArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RegisterSession'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + session: _data.session, + response: _data.response + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + sendIntent = (args: SendIntentArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('SendIntent'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + response: _data.response + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + chainList = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('ChainList'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + chains: >_data.chains + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} +export class WaasAuthenticatorAdmin implements WaasAuthenticatorAdmin { + protected hostname: string + protected fetch: Fetch + protected path = '/rpc/WaasAuthenticatorAdmin/' + + constructor(hostname: string, fetch: Fetch) { + this.hostname = hostname + this.fetch = (input: RequestInfo, init?: RequestInit) => fetch(input, init) + } + + private url(name: string): string { + return this.hostname + this.path + name + } + + version = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Version'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + version: _data.version + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + runtimeStatus = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('RuntimeStatus'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + status: _data.status + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + clock = (headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('Clock'), createHTTPRequest({}, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + serverTime: _data.serverTime + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + getTenant = (args: GetTenantArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('GetTenant'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + tenant: _data.tenant + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + createTenant = (args: CreateTenantArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('CreateTenant'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + tenant: _data.tenant, + upgradeCode: _data.upgradeCode + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } + + updateTenant = (args: UpdateTenantArgs, headers?: object, signal?: AbortSignal): Promise => { + return this.fetch(this.url('UpdateTenant'), createHTTPRequest(args, headers, signal)).then( + res => { + return buildResponse(res).then(_data => { + return { + tenant: _data.tenant + } + }) + }, + error => { + throw WebrpcRequestFailedError.new({ cause: `fetch(): ${error.message || ''}` }) + } + ) + } +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + return { + method: 'POST', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body || {}), + signal + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then(text => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}` + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = 'endpoint error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = 'request failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = 'bad route', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = 'bad method', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = 'bad request', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = 'bad response', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = 'server panic', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = 'internal error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = 'client disconnected', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = 'stream lost', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = 'stream finished', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export class UnauthorizedError extends WebrpcError { + constructor( + name: string = 'Unauthorized', + code: number = 1000, + message: string = 'Unauthorized access', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, UnauthorizedError.prototype) + } +} + +export class TenantNotFoundError extends WebrpcError { + constructor( + name: string = 'TenantNotFound', + code: number = 1001, + message: string = 'Tenant not found', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, TenantNotFoundError.prototype) + } +} + +export class EmailAlreadyInUseError extends WebrpcError { + constructor( + name: string = 'EmailAlreadyInUse', + code: number = 7000, + message: string = 'Could not create account as the email is already in use', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, EmailAlreadyInUseError.prototype) + } +} + +export class AccountAlreadyLinkedError extends WebrpcError { + constructor( + name: string = 'AccountAlreadyLinked', + code: number = 7001, + message: string = 'Could not link account as it is linked to another wallet', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AccountAlreadyLinkedError.prototype) + } +} + +export class ProofVerificationFailedError extends WebrpcError { + constructor( + name: string = 'ProofVerificationFailed', + code: number = 7002, + message: string = 'The authentication proof could not be verified', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ProofVerificationFailedError.prototype) + } +} + +export class AnswerIncorrectError extends WebrpcError { + constructor( + name: string = 'AnswerIncorrect', + code: number = 7003, + message: string = 'The provided answer is incorrect', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, AnswerIncorrectError.prototype) + } +} + +export class ChallengeExpiredError extends WebrpcError { + constructor( + name: string = 'ChallengeExpired', + code: number = 7004, + message: string = 'The challenge has expired', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, ChallengeExpiredError.prototype) + } +} + +export class TooManyAttemptsError extends WebrpcError { + constructor( + name: string = 'TooManyAttempts', + code: number = 7005, + message: string = 'Too many attempts', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, TooManyAttemptsError.prototype) + } +} + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished', + Unauthorized = 'Unauthorized', + TenantNotFound = 'TenantNotFound', + EmailAlreadyInUse = 'EmailAlreadyInUse', + AccountAlreadyLinked = 'AccountAlreadyLinked', + ProofVerificationFailed = 'ProofVerificationFailed', + AnswerIncorrect = 'AnswerIncorrect', + ChallengeExpired = 'ChallengeExpired', + TooManyAttempts = 'TooManyAttempts' +} + +const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError, + [1000]: UnauthorizedError, + [1001]: TenantNotFoundError, + [7000]: EmailAlreadyInUseError, + [7001]: AccountAlreadyLinkedError, + [7002]: ProofVerificationFailedError, + [7003]: AnswerIncorrectError, + [7004]: ChallengeExpiredError, + [7005]: TooManyAttemptsError +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/waas/src/clients/intent.gen.ts b/packages/waas/src/clients/intent.gen.ts new file mode 100644 index 000000000..bb8189be9 --- /dev/null +++ b/packages/waas/src/clients/intent.gen.ts @@ -0,0 +1,593 @@ +/* eslint-disable */ +// sequence-waas-intents v0.1.0 1fe0a24abef81231c54c0886157c65ef738d5ed6 +// -- +// Code generated by webrpc-gen@v0.19.3 with typescript generator. DO NOT EDIT. +// +// webrpc-gen -schema=intent.ridl -target=typescript -client -out=./intent.gen.ts + +// WebRPC description and code-gen version +export const WebRPCVersion = 'v1' + +// Schema version of your RIDL schema +export const WebRPCSchemaVersion = 'v0.1.0' + +// Schema hash generated from your RIDL schema +export const WebRPCSchemaHash = '1fe0a24abef81231c54c0886157c65ef738d5ed6' + +// +// Types +// + +export enum IntentName { + initiateAuth = 'initiateAuth', + openSession = 'openSession', + closeSession = 'closeSession', + validateSession = 'validateSession', + finishValidateSession = 'finishValidateSession', + listSessions = 'listSessions', + getSession = 'getSession', + sessionAuthProof = 'sessionAuthProof', + feeOptions = 'feeOptions', + signMessage = 'signMessage', + sendTransaction = 'sendTransaction', + getTransactionReceipt = 'getTransactionReceipt', + federateAccount = 'federateAccount', + removeAccount = 'removeAccount', + listAccounts = 'listAccounts', + getIdToken = 'getIdToken' +} + +export enum TransactionType { + transaction = 'transaction', + erc20send = 'erc20send', + erc721send = 'erc721send', + erc1155send = 'erc1155send', + delayedEncode = 'delayedEncode' +} + +export enum IntentResponseCode { + authInitiated = 'authInitiated', + sessionOpened = 'sessionOpened', + sessionClosed = 'sessionClosed', + sessionList = 'sessionList', + validationRequired = 'validationRequired', + validationStarted = 'validationStarted', + validationFinished = 'validationFinished', + sessionAuthProof = 'sessionAuthProof', + signedMessage = 'signedMessage', + feeOptions = 'feeOptions', + transactionReceipt = 'transactionReceipt', + transactionFailed = 'transactionFailed', + getSessionResponse = 'getSessionResponse', + accountList = 'accountList', + accountFederated = 'accountFederated', + accountRemoved = 'accountRemoved', + idToken = 'idToken' +} + +export enum FeeTokenType { + unknown = 'unknown', + erc20Token = 'erc20Token', + erc1155Token = 'erc1155Token' +} + +export enum IdentityType { + None = 'None', + Guest = 'Guest', + OIDC = 'OIDC', + Email = 'Email', + PlayFab = 'PlayFab', + Stytch = 'Stytch' +} + +export interface Intent { + version: string + name: IntentName + expiresAt: number + issuedAt: number + data: any + signatures: Array +} + +export interface Signature { + sessionId: string + signature: string +} + +export interface IntentDataInitiateAuth { + sessionId: string + identityType: IdentityType + verifier: string + metadata?: string +} + +export interface IntentDataOpenSession { + sessionId: string + identityType: IdentityType + verifier?: string + answer?: string + forceCreateAccount?: boolean + email?: string + idToken?: string +} + +export interface IntentDataCloseSession { + sessionId: string +} + +export interface IntentDataValidateSession { + sessionId: string + wallet: string + deviceMetadata: string +} + +export interface IntentDataFinishValidateSession { + sessionId: string + wallet: string + salt: string + challenge: string +} + +export interface IntentDataListSessions { + wallet: string +} + +export interface IntentDataGetSession { + sessionId: string + wallet: string +} + +export interface IntentDataSessionAuthProof { + network: string + wallet: string + nonce?: string +} + +export interface IntentDataSignMessage { + network: string + wallet: string + message: string +} + +export interface IntentDataFeeOptions { + network: string + wallet: string + identifier: string + transactions: Array +} + +export interface IntentDataSendTransaction { + network: string + wallet: string + identifier: string + transactions: Array + transactionsFeeQuote?: string +} + +export interface IntentDataGetTransactionReceipt { + network: string + wallet: string + metaTxHash: string +} + +export interface IntentDataFederateAccount { + sessionId: string + wallet: string + identityType: IdentityType + verifier?: string + answer?: string +} + +export interface IntentDataListAccounts { + wallet: string +} + +export interface IntentDataRemoveAccount { + wallet: string + accountId: string +} + +export interface IntentDataGetIdToken { + sessionId: string + wallet: string + nonce?: string +} + +export interface TransactionRaw { + type: string + to: string + value: string + data: string +} + +export interface TransactionERC20 { + type: string + tokenAddress: string + to: string + value: string +} + +export interface TransactionERC721 { + type: string + tokenAddress: string + to: string + id: string + safe?: boolean + data?: string +} + +export interface TransactionERC1155Value { + id: string + amount: string +} + +export interface TransactionDelayedEncode { + type: string + to: string + value: string + data: any +} + +export interface TransactionERC1155 { + type: string + tokenAddress: string + to: string + vals: Array + data?: string +} + +export interface IntentResponse { + code: IntentResponseCode + data: any +} + +export interface IntentResponseAuthInitiated { + sessionId: string + identityType: IdentityType + expiresIn: number + challenge?: string +} + +export interface IntentResponseSessionOpened { + sessionId: string + wallet: string +} + +export interface IntentResponseSessionClosed {} + +export interface IntentResponseValidateSession {} + +export interface IntentResponseValidationRequired { + sessionId: string +} + +export interface IntentResponseValidationStarted { + salt: string +} + +export interface IntentResponseValidationFinished { + isValid: boolean +} + +export interface IntentResponseListSessions { + sessions: Array +} + +export interface IntentResponseGetSession { + sessionId: string + wallet: string + validated: boolean +} + +export interface IntentResponseSessionAuthProof { + sessionId: string + network: string + wallet: string + message: string + signature: string +} + +export interface IntentResponseSignedMessage { + signature: string + message: string +} + +export interface FeeOption { + token: FeeToken + to: string + value: string + gasLimit: number +} + +export interface FeeToken { + chainId: number + name: string + symbol: string + type: FeeTokenType + decimals?: number + logoURL: string + contractAddress?: string + tokenID?: string +} + +export interface IntentResponseFeeOptions { + feeOptions: Array + feeQuote?: string +} + +export interface IntentResponseTransactionReceipt { + request: any + txHash: string + metaTxHash: string + receipt: any + nativeReceipt: any + simulations: any +} + +export interface IntentResponseTransactionFailed { + error: string + request: any + simulations: any +} + +export interface IntentResponseAccountList { + accounts: Array + currentAccountId: string +} + +export interface IntentResponseAccountFederated { + account: Account +} + +export interface IntentResponseAccountRemoved {} + +export interface IntentResponseIdToken { + idToken: string + expiresIn: number +} + +export interface Account { + id: string + type: IdentityType + issuer?: string + email?: string +} + +const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => { + return { + method: 'POST', + headers: { ...headers, 'Content-Type': 'application/json' }, + body: JSON.stringify(body || {}), + signal + } +} + +const buildResponse = (res: Response): Promise => { + return res.text().then(text => { + let data + try { + data = JSON.parse(text) + } catch (error) { + let message = '' + if (error instanceof Error) { + message = error.message + } + throw WebrpcBadResponseError.new({ + status: res.status, + cause: `JSON.parse(): ${message}: response text: ${text}` + }) + } + if (!res.ok) { + const code: number = typeof data.code === 'number' ? data.code : 0 + throw (webrpcErrorByCode[code] || WebrpcError).new(data) + } + return data + }) +} + +// +// Errors +// + +export class WebrpcError extends Error { + name: string + code: number + message: string + status: number + cause?: string + + /** @deprecated Use message instead of msg. Deprecated in webrpc v0.11.0. */ + msg: string + + constructor(name: string, code: number, message: string, status: number, cause?: string) { + super(message) + this.name = name || 'WebrpcError' + this.code = typeof code === 'number' ? code : 0 + this.message = message || `endpoint error ${this.code}` + this.msg = this.message + this.status = typeof status === 'number' ? status : 0 + this.cause = cause + Object.setPrototypeOf(this, WebrpcError.prototype) + } + + static new(payload: any): WebrpcError { + return new this(payload.error, payload.code, payload.message || payload.msg, payload.status, payload.cause) + } +} + +// Webrpc errors + +export class WebrpcEndpointError extends WebrpcError { + constructor( + name: string = 'WebrpcEndpoint', + code: number = 0, + message: string = 'endpoint error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcEndpointError.prototype) + } +} + +export class WebrpcRequestFailedError extends WebrpcError { + constructor( + name: string = 'WebrpcRequestFailed', + code: number = -1, + message: string = 'request failed', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcRequestFailedError.prototype) + } +} + +export class WebrpcBadRouteError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRoute', + code: number = -2, + message: string = 'bad route', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRouteError.prototype) + } +} + +export class WebrpcBadMethodError extends WebrpcError { + constructor( + name: string = 'WebrpcBadMethod', + code: number = -3, + message: string = 'bad method', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadMethodError.prototype) + } +} + +export class WebrpcBadRequestError extends WebrpcError { + constructor( + name: string = 'WebrpcBadRequest', + code: number = -4, + message: string = 'bad request', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadRequestError.prototype) + } +} + +export class WebrpcBadResponseError extends WebrpcError { + constructor( + name: string = 'WebrpcBadResponse', + code: number = -5, + message: string = 'bad response', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcBadResponseError.prototype) + } +} + +export class WebrpcServerPanicError extends WebrpcError { + constructor( + name: string = 'WebrpcServerPanic', + code: number = -6, + message: string = 'server panic', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcServerPanicError.prototype) + } +} + +export class WebrpcInternalErrorError extends WebrpcError { + constructor( + name: string = 'WebrpcInternalError', + code: number = -7, + message: string = 'internal error', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcInternalErrorError.prototype) + } +} + +export class WebrpcClientDisconnectedError extends WebrpcError { + constructor( + name: string = 'WebrpcClientDisconnected', + code: number = -8, + message: string = 'client disconnected', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcClientDisconnectedError.prototype) + } +} + +export class WebrpcStreamLostError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamLost', + code: number = -9, + message: string = 'stream lost', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamLostError.prototype) + } +} + +export class WebrpcStreamFinishedError extends WebrpcError { + constructor( + name: string = 'WebrpcStreamFinished', + code: number = -10, + message: string = 'stream finished', + status: number = 0, + cause?: string + ) { + super(name, code, message, status, cause) + Object.setPrototypeOf(this, WebrpcStreamFinishedError.prototype) + } +} + +// Schema errors + +export enum errors { + WebrpcEndpoint = 'WebrpcEndpoint', + WebrpcRequestFailed = 'WebrpcRequestFailed', + WebrpcBadRoute = 'WebrpcBadRoute', + WebrpcBadMethod = 'WebrpcBadMethod', + WebrpcBadRequest = 'WebrpcBadRequest', + WebrpcBadResponse = 'WebrpcBadResponse', + WebrpcServerPanic = 'WebrpcServerPanic', + WebrpcInternalError = 'WebrpcInternalError', + WebrpcClientDisconnected = 'WebrpcClientDisconnected', + WebrpcStreamLost = 'WebrpcStreamLost', + WebrpcStreamFinished = 'WebrpcStreamFinished' +} + +const webrpcErrorByCode: { [code: number]: any } = { + [0]: WebrpcEndpointError, + [-1]: WebrpcRequestFailedError, + [-2]: WebrpcBadRouteError, + [-3]: WebrpcBadMethodError, + [-4]: WebrpcBadRequestError, + [-5]: WebrpcBadResponseError, + [-6]: WebrpcServerPanicError, + [-7]: WebrpcInternalErrorError, + [-8]: WebrpcClientDisconnectedError, + [-9]: WebrpcStreamLostError, + [-10]: WebrpcStreamFinishedError +} + +export type Fetch = (input: RequestInfo, init?: RequestInit) => Promise diff --git a/packages/waas/src/email.ts b/packages/waas/src/email.ts new file mode 100644 index 000000000..52d970f8d --- /dev/null +++ b/packages/waas/src/email.ts @@ -0,0 +1,134 @@ +import { + CognitoIdentityProviderClient, + InitiateAuthCommand, + InitiateAuthCommandOutput, + RespondToAuthChallengeCommand, + SignUpCommand, + UserLambdaValidationException +} from '@aws-sdk/client-cognito-identity-provider' + +import { IdTokenIdentity } from './auth' + +export class EmailAuth { + private cognitoMemo: CognitoIdentityProviderClient + + constructor( + public readonly region: string, + public readonly clientId: string + ) {} + + private cognito() { + if (!this.cognitoMemo) { + this.cognitoMemo = new CognitoIdentityProviderClient({ + region: this.region + }) + } + + return this.cognitoMemo + } + + private signUp(email: string) { + email = email.toLowerCase().trim() + return this.cognito().send( + new SignUpCommand({ + ClientId: this.clientId, + Username: email, + Password: 'aB1%' + getRandomString(14), + UserAttributes: [{ Name: 'email', Value: email }] + }) + ) + } + + private signIn(email: string) { + email = email.toLowerCase().trim() + return this.cognito().send( + new InitiateAuthCommand({ + AuthFlow: 'CUSTOM_AUTH', + ClientId: this.clientId, + AuthParameters: { + USERNAME: email + } + }) + ) + } + + public async initiateAuth({ email }: { email: string }): Promise<{ email: string; instance: string }> { + let res: InitiateAuthCommandOutput + email = email.toLowerCase().trim() + + try { + // Try sign in directly first + res = await this.signIn(email) + } catch (e) { + if (e instanceof UserLambdaValidationException && e.message.includes('user not found')) { + // Sign up and sign in + await this.signUp(email) + res = await this.signIn(email) + } else { + throw e + } + } + + if (!res.Session) { + throw new Error('response session is empty') + } + + return { + // Notice: rename session to instance to avoid + // confusion with the native waas session + instance: res.Session, + email: email + } + } + + public async finalizeAuth({ + instance, + email, + answer, + sessionHash + }: { + instance: string + email: string + answer: string + sessionHash: string + }): Promise { + email = email.toLowerCase().trim() + + const res = await this.cognito().send( + new RespondToAuthChallengeCommand({ + ClientId: this.clientId, + Session: instance, + ChallengeName: 'CUSTOM_CHALLENGE', + ChallengeResponses: { USERNAME: email, ANSWER: answer }, + ClientMetadata: { SESSION_HASH: sessionHash } + }) + ) + + if (!res.AuthenticationResult || !res.AuthenticationResult.IdToken) { + throw new Error('AuthenticationResult.IdToken is empty') + } + + return { idToken: res.AuthenticationResult.IdToken } + } +} + +function getRandomString(len: number) { + return Array.from(getRandomValues(len)) + .map(nr => nr.toString(16).padStart(2, '0')) + .join('') +} + +function getRandomValues(len: number) { + const randomValues = new Uint8Array(len) + if (typeof window === 'object' && typeof window.crypto === 'object') { + return window.crypto.getRandomValues(randomValues) + } else { + console.warn('window.crypto.getRandomValues is not available. Falling back to less secure Math.random().') + const randomValues = new Uint8Array(len) + for (let i = 0; i < len; i++) { + const randomInteger = Math.floor(Math.random() * 256) + randomValues[i] = randomInteger + } + return randomValues + } +} diff --git a/packages/waas/src/index.ts b/packages/waas/src/index.ts new file mode 100644 index 000000000..dae112e9e --- /dev/null +++ b/packages/waas/src/index.ts @@ -0,0 +1,14 @@ +export * from './base' +export * from './auth' +export * from './challenge' + +export * as store from './store' +export * as networks from './networks' + +export type { Transaction } from './intents/transactions' +export { erc20, erc721, erc1155, delayedEncode } from './intents/transactions' + +export type { SecureStoreBackend } from './secure-store' + +export * from './intents/responses' +export * from './clients/intent.gen' diff --git a/packages/waas/src/intents/accounts.ts b/packages/waas/src/intents/accounts.ts new file mode 100644 index 000000000..e790a877e --- /dev/null +++ b/packages/waas/src/intents/accounts.ts @@ -0,0 +1,24 @@ +import { Intent, makeIntent } from './base' +import { IntentDataFederateAccount, IntentDataListAccounts, IntentDataRemoveAccount, IntentName } from '../clients/intent.gen' + +interface BaseArgs { + lifespan: number +} + +export type ListAccountsArgs = BaseArgs & IntentDataListAccounts + +export function listAccounts({ lifespan, ...data }: ListAccountsArgs): Intent { + return makeIntent(IntentName.listAccounts, lifespan, data) +} + +export type FederateAccountArgs = BaseArgs & IntentDataFederateAccount + +export function federateAccount({ lifespan, ...data }: FederateAccountArgs): Intent { + return makeIntent(IntentName.federateAccount, lifespan, data) +} + +export type RemoveAccountArgs = BaseArgs & IntentDataRemoveAccount + +export function removeAccount({ lifespan, ...data }: RemoveAccountArgs): Intent { + return makeIntent(IntentName.removeAccount, lifespan, data) +} diff --git a/packages/waas/src/intents/base.ts b/packages/waas/src/intents/base.ts new file mode 100644 index 000000000..856248e38 --- /dev/null +++ b/packages/waas/src/intents/base.ts @@ -0,0 +1,54 @@ +import { VERSION as PACKAGE_VERSION } from '@0xsequence/core' +import { Intent as RawIntent, IntentName } from '../clients/intent.gen' +import { useLifespan } from './utils' +import { ethers } from 'ethers' +import { canonicalize } from 'json-canonicalize' +import { Session } from '../session' + +export type Intent = Omit & { data: T } +export type SignedIntent = Omit & { data: T } + +const INTENTS_VERSION = 1 +const VERSION = `${INTENTS_VERSION} (Web ${PACKAGE_VERSION})` + +export function makeIntent(name: IntentName, lifespan: number, data: T): Intent { + const issuedAt = Math.floor(Date.now() / 1000) + const expiresAt = issuedAt + lifespan + return { + version: VERSION, + issuedAt, + expiresAt, + name, + data + } +} + +export async function signIntent(session: Session, intent: Intent): Promise> { + const hash = hashIntent(intent) + const signature = await session.sign(new Uint8Array(hash)) + return { + ...intent, + signatures: [ + { + sessionId: await session.sessionId(), + signature + } + ] + } +} + +export function hashIntent(intent: Intent): ethers.Bytes { + // Discard all fields other than the explicitly listed + const { version, issuedAt, expiresAt, name, data } = intent + const hashableIntent = { version, issuedAt, expiresAt, name, data } + const encoded = ethers.utils.toUtf8Bytes(canonicalize(hashableIntent)) + return ethers.utils.arrayify(ethers.utils.keccak256(encoded)) +} + +export function changeIntentTime(intent: SignedIntent, now: Date): Intent { + const { signatures, ...unsignedIntent } = intent + const lifespan = intent.expiresAt - intent.issuedAt + unsignedIntent.issuedAt = Math.floor(now.getTime() / 1000) + unsignedIntent.expiresAt = unsignedIntent.issuedAt + lifespan + return unsignedIntent +} diff --git a/packages/waas/src/intents/index.ts b/packages/waas/src/intents/index.ts new file mode 100644 index 000000000..814a601c5 --- /dev/null +++ b/packages/waas/src/intents/index.ts @@ -0,0 +1,4 @@ +export * from './base' +export * from './messages' +export * from './session' +export * from './transactions' diff --git a/packages/waas/src/intents/messages.ts b/packages/waas/src/intents/messages.ts new file mode 100644 index 000000000..7caca8c94 --- /dev/null +++ b/packages/waas/src/intents/messages.ts @@ -0,0 +1,21 @@ +import { ethers } from 'ethers' +import { IntentDataSignMessage, IntentName } from '../clients/intent.gen' +import { Intent, makeIntent } from './base' + +interface BaseArgs { + lifespan: number + wallet: string + chainId: number +} + +export type SignMessageArgs = { + message: string +} + +export function signMessage({ wallet, chainId, message, lifespan }: SignMessageArgs & BaseArgs): Intent { + return makeIntent(IntentName.signMessage, lifespan, { + wallet, + network: chainId.toString(), + message: message.startsWith('0x') ? message : ethers.utils.hexlify(ethers.utils.toUtf8Bytes(message)) + }) +} diff --git a/packages/waas/src/intents/responses.ts b/packages/waas/src/intents/responses.ts new file mode 100644 index 000000000..faa72f452 --- /dev/null +++ b/packages/waas/src/intents/responses.ts @@ -0,0 +1,290 @@ +import { + FeeOption, + IntentDataSendTransaction, + IntentResponseAccountFederated, + IntentResponseAccountList, + IntentResponseAuthInitiated, + IntentResponseCode, + IntentResponseGetSession, + IntentResponseIdToken, + IntentResponseValidationFinished, + IntentResponseValidationStarted +} from '../clients/intent.gen' +import { WebrpcEndpointError, WebrpcError } from '../clients/authenticator.gen' + +export type PayloadResponse = { + code: string + data: T +} + +export type ValidationRequiredResponse = { + code: 'validationRequired' + data: { + sessionId: string + } +} + +type MetaTxnReceiptLog = { + address: string + topics: string[] + data: string +} + +type MetaTxnReceipt = { + id: string + status: string + revertReason?: string | null + index: number + logs: MetaTxnReceiptLog[] + receipts: MetaTxnReceipt[] + txnReceipt: string +} + +type SimulateResult = { + executed: boolean + succeeded: boolean + result: string | null + reason: string | null + gasUsed: number + gasLimit: number +} + +export type SentTransactionResponse = { + code: 'transactionReceipt' + data: { + txHash: string + metaTxHash: string + request: IntentDataSendTransaction + receipt: MetaTxnReceipt + nativeReceipt?: any | null + simulations?: SimulateResult[] + } +} + +export type TransactionFailedResponse = { + code: 'transactionFailed' + data: { + error: string + request: IntentDataSendTransaction + simulations: SimulateResult[] + } +} + +export type MaySentTransactionResponse = SentTransactionResponse | TransactionFailedResponse + +export type FeeOptionsResponse = { + code: 'feeOptions' + data: { + feeOptions: FeeOption[] + feeQuote?: string + } +} + +export type OpenSessionResponse = { + code: 'sessionOpened' + data: { + sessionId: string + wallet: string + } +} + +export type CloseSessionResponse = { + code: 'sessionClosed' +} + +export type ListSessionsResponse = { + code: 'listSessions' + data: { + sessions: any[] + } +} + +export type SignedMessageResponse = { + code: 'signedMessage' + data: { + message: string + signature: string + } +} + +export type SessionAuthProofResponse = { + code: 'sessionAuthProof' + data: { + sessionId: string + network: string + wallet: string + message: string + signature: string + } +} + +export interface Response { + code: Code + data: Data +} + +export type InitiateAuthResponse = Response +export type ValidateSessionResponse = Response +export type FinishValidateSessionResponse = Response +export type GetSessionResponse = Response +export type LinkAccountResponse = Response +export type ListAccountsResponse = Response +export type IdTokenResponse = Response + +export function isInitiateAuthResponse(receipt: any): receipt is InitiateAuthResponse { + return ( + typeof receipt === 'object' && + receipt.code === IntentResponseCode.authInitiated && + typeof receipt.data === 'object' && + typeof receipt.data.sessionId === 'string' && + typeof receipt.data.identityType === 'string' && + typeof receipt.data.expiresIn === 'number' + ) +} + +export function isOpenSessionResponse(receipt: any): receipt is OpenSessionResponse { + return ( + typeof receipt === 'object' && + typeof receipt.code === 'string' && + receipt.code === 'sessionOpened' && + typeof receipt.data === 'object' && + typeof receipt.data.sessionId === 'string' && + typeof receipt.data.wallet === 'string' + ) +} + +export function isSentTransactionResponse(receipt: any): receipt is SentTransactionResponse { + return ( + typeof receipt === 'object' && + typeof receipt.code === 'string' && + receipt.code === 'transactionReceipt' && + typeof receipt.data === 'object' && + typeof receipt.data.txHash === 'string' && + typeof receipt.data.receipt === 'object' && + typeof receipt.data.request === 'object' + ) +} + +export function isTimedOutTransactionResponse(receipt: any): receipt is SentTransactionResponse { + return ( + typeof receipt === 'object' && + typeof receipt.code === 'string' && + receipt.code === 'transactionReceipt' && + typeof receipt.data === 'object' && + typeof receipt.data.metaTxHash === 'string' && + !receipt.data.txHash && + typeof receipt.data.request === 'object' + ) +} + +export function isFailedTransactionResponse(receipt: any): receipt is TransactionFailedResponse { + return ( + typeof receipt === 'object' && + typeof receipt.code === 'string' && + receipt.code === 'transactionFailed' && + typeof receipt.data === 'object' && + typeof receipt.data.request === 'object' && + Array.isArray(receipt.data.simulations) && + typeof receipt.data.error === 'string' + ) +} + +export function isMaySentTransactionResponse(receipt: any): receipt is MaySentTransactionResponse { + return isSentTransactionResponse(receipt) || isFailedTransactionResponse(receipt) || isTimedOutTransactionResponse(receipt) +} + +export function isSignedMessageResponse(receipt: any): receipt is SignedMessageResponse { + return ( + typeof receipt === 'object' && + typeof receipt.code === 'string' && + receipt.code === 'signedMessage' && + typeof receipt.data === 'object' && + typeof receipt.data.message === 'string' && + typeof receipt.data.signature === 'string' + ) +} + +export function isSessionAuthProofResponse(receipt: any): receipt is SessionAuthProofResponse { + return ( + typeof receipt === 'object' && + typeof receipt.code === 'string' && + receipt.code === 'sessionAuthProof' && + typeof receipt.data === 'object' && + typeof receipt.data.sessionId === 'string' && + typeof receipt.data.network === 'string' && + typeof receipt.data.wallet === 'string' && + typeof receipt.data.message === 'string' && + typeof receipt.data.signature === 'string' + ) +} + +export function isFeeOptionsResponse(receipt: any): receipt is FeeOptionsResponse { + return ( + typeof receipt === 'object' && + typeof receipt.code === 'string' && + receipt.code === 'feeOptions' && + typeof receipt.data === 'object' && + Array.isArray(receipt.data.feeOptions) + ) +} + +export function isValidationRequiredResponse(receipt: any): receipt is ValidationRequiredResponse { + return ( + typeof receipt === 'object' && + receipt.code === IntentResponseCode.validationRequired && + typeof receipt.data === 'object' && + typeof receipt.data.sessionId === 'string' + ) +} + +export function isValidateSessionResponse(receipt: any): receipt is ValidateSessionResponse { + return typeof receipt === 'object' && receipt.code === IntentResponseCode.validationStarted && typeof receipt.data === 'object' +} + +export function isFinishValidateSessionResponse(receipt: any): receipt is FinishValidateSessionResponse { + return typeof receipt === 'object' && receipt.code === IntentResponseCode.validationFinished && typeof receipt.data === 'object' +} + +export function isCloseSessionResponse(receipt: any): receipt is CloseSessionResponse { + return typeof receipt === 'object' && typeof receipt.code === 'string' && receipt.code === 'sessionClosed' +} + +export function isGetSessionResponse(receipt: any): receipt is GetSessionResponse { + return ( + typeof receipt === 'object' && + typeof receipt.code === 'string' && + receipt.code === 'getSessionResponse' && + typeof receipt.data === 'object' && + typeof receipt.data.session === 'string' && + typeof receipt.data.wallet === 'string' + ) +} + +export function isLinkAccountResponse(receipt: any): receipt is LinkAccountResponse { + return ( + typeof receipt === 'object' && + receipt.code === IntentResponseCode.accountFederated && + typeof receipt.data === 'object' && + typeof receipt.data.account === 'object' + ) +} + +export function isListAccountsResponse(receipt: any): receipt is ListAccountsResponse { + return typeof receipt === 'object' && receipt.code === IntentResponseCode.accountList && typeof receipt.data === 'object' +} +export function isIntentTimeError(error: any): error is WebrpcEndpointError { + return !!( + error instanceof WebrpcError && + (error.cause?.endsWith('intent is invalid: intent expired') || + error.cause?.endsWith('intent is invalid: intent issued in the future')) + ) +} + +export function isGetIdTokenResponse(receipt: any): receipt is IdTokenResponse { + return ( + typeof receipt === 'object' && + receipt.code === IntentResponseCode.idToken && + typeof receipt.data === 'object' && + typeof receipt.data.idToken === 'string' + ) +} diff --git a/packages/waas/src/intents/session.ts b/packages/waas/src/intents/session.ts new file mode 100644 index 000000000..74a114580 --- /dev/null +++ b/packages/waas/src/intents/session.ts @@ -0,0 +1,71 @@ +import { Intent, makeIntent } from './base' +import { + IntentDataCloseSession, + IntentDataFinishValidateSession, + IntentDataGetSession, + IntentDataListSessions, + IntentDataOpenSession, + IntentDataValidateSession, + IntentDataSessionAuthProof, + IntentDataInitiateAuth, + IntentDataGetIdToken, + IntentName +} from '../clients/intent.gen' + +interface BaseArgs { + lifespan: number +} + +export type InitiateAuthArgs = BaseArgs & IntentDataInitiateAuth + +export async function initiateAuth({ lifespan, ...data }: InitiateAuthArgs): Promise> { + return makeIntent(IntentName.initiateAuth, lifespan, data) +} + +export type OpenSessionArgs = BaseArgs & IntentDataOpenSession + +export async function openSession({ lifespan, ...data }: OpenSessionArgs): Promise> { + return makeIntent(IntentName.openSession, lifespan, data) +} + +export type ValidateSessionArgs = BaseArgs & IntentDataValidateSession + +export async function validateSession({ lifespan, ...data }: ValidateSessionArgs): Promise> { + return makeIntent(IntentName.validateSession, lifespan, data) +} + +export type FinishValidateSessionArgs = BaseArgs & IntentDataFinishValidateSession + +export function finishValidateSession({ lifespan, ...data }: FinishValidateSessionArgs): Intent { + return makeIntent(IntentName.finishValidateSession, lifespan, data) +} + +export type CloseSessionArgs = BaseArgs & IntentDataCloseSession + +export function closeSession({ lifespan, ...data }: CloseSessionArgs): Intent { + return makeIntent(IntentName.closeSession, lifespan, data) +} + +export type ListSessionsArgs = BaseArgs & IntentDataListSessions + +export function listSessions({ lifespan, ...data }: ListSessionsArgs): Intent { + return makeIntent(IntentName.listSessions, lifespan, data) +} + +export type GetSessionArgs = BaseArgs & IntentDataGetSession + +export function getSession({ lifespan, ...data }: GetSessionArgs): Intent { + return makeIntent(IntentName.getSession, lifespan, data) +} + +export type SessionAuthProof = BaseArgs & IntentDataSessionAuthProof + +export function sessionAuthProof({ lifespan, ...data }: SessionAuthProof): Intent { + return makeIntent(IntentName.sessionAuthProof, lifespan, data) +} + +export type GetIdTokenArgs = BaseArgs & IntentDataGetIdToken + +export function getIdToken({ lifespan, ...data }: GetIdTokenArgs): Intent { + return makeIntent(IntentName.getIdToken, lifespan, data) +} diff --git a/packages/waas/src/intents/transactions.ts b/packages/waas/src/intents/transactions.ts new file mode 100644 index 000000000..c341f6c0a --- /dev/null +++ b/packages/waas/src/intents/transactions.ts @@ -0,0 +1,383 @@ +import { Intent, makeIntent } from './base' +import { + IntentDataGetTransactionReceipt, + IntentDataSendTransaction, + IntentDataFeeOptions, + TransactionDelayedEncode, + TransactionERC1155, + TransactionERC20, + TransactionERC721, + TransactionRaw, + TransactionERC1155Value, + IntentName, + FeeOption, + FeeTokenType +} from '../clients/intent.gen' +import { ethers } from 'ethers' + +interface BaseArgs { + lifespan: number + wallet: string + identifier: string + chainId: number +} + +export type TransactionFeeArgs = { + transactionsFeeQuote?: string + transactionsFeeOption?: FeeOption +} + +export type SendTransactionsArgs = TransactionFeeArgs & { + transactions: Transaction[] +} + +export type SendERC20Args = TransactionFeeArgs & { + chainId: number + token: string + to: string + value: ethers.BigNumberish +} + +export type SendERC721Args = TransactionFeeArgs & { + chainId: number + token: string + to: string + id: string + safe?: boolean + data?: string +} + +export type SendERC1155Args = TransactionFeeArgs & { + chainId: number + token: string + to: string + values: { + id: string + amount: ethers.BigNumberish + }[] + data?: string +} + +export type SendDelayedEncodeArgs = TransactionFeeArgs & { + chainId: number + to: string + value: ethers.BigNumberish + abi: string + func: string + args: string[] | { [key: string]: string } +} + +export function feeOptions({ + lifespan, + wallet, + identifier, + chainId, + transactions +}: SendTransactionsArgs & BaseArgs): Intent { + return makeIntent(IntentName.feeOptions, lifespan, { + identifier, + wallet, + network: chainId.toString(), + transactions: transactions.map(tx => { + if (!tx.to || tx.to === ethers.constants.AddressZero) { + throw new Error('Contract creation not supported') + } + + if (!isEthersTx(tx)) { + return tx + } + + return { + type: 'transaction', + to: tx.to, + value: ethers.BigNumber.from(tx.value || 0).toHexString(), + data: ethers.utils.hexlify(tx.data || []) + } + }) + }) +} + +export function sendTransactions({ + lifespan, + wallet, + identifier, + chainId, + transactions, + transactionsFeeQuote, + transactionsFeeOption +}: SendTransactionsArgs & BaseArgs): Intent { + return makeIntent(IntentName.sendTransaction, lifespan, { + identifier, + wallet, + network: chainId.toString(), + transactions: withTransactionFee(transactions, transactionsFeeOption).map(tx => { + if (!tx.to || tx.to === ethers.constants.AddressZero) { + throw new Error('Contract creation not supported') + } + + if (!isEthersTx(tx)) { + return tx + } + + return { + type: 'transaction', + to: tx.to, + value: ethers.BigNumber.from(tx.value || 0).toHexString(), + data: ethers.utils.hexlify(tx.data || []) + } + }), + transactionsFeeQuote + }) +} + +function withTransactionFee(transactions: Transaction[], feeOption?: FeeOption): Transaction[] { + const extendedTransactions = [...transactions] + if (feeOption) { + switch (feeOption.token.type) { + case FeeTokenType.unknown: + extendedTransactions.push({ + to: feeOption.to, + value: feeOption.value + }) + break + case FeeTokenType.erc20Token: + if (!feeOption.token.contractAddress) { + throw new Error('contract address is required') + } + + extendedTransactions.push( + erc20({ + tokenAddress: feeOption.token.contractAddress, + to: feeOption.to, + value: feeOption.value + }) + ) + break + case FeeTokenType.erc1155Token: + if (!feeOption.token.contractAddress) { + throw new Error('contract address is required') + } + + if (!feeOption.token.tokenID) { + throw new Error('token ID is required') + } + + extendedTransactions.push( + erc1155({ + tokenAddress: feeOption.token.contractAddress, + to: feeOption.to, + vals: [{ id: feeOption.token.tokenID, amount: feeOption.value }] + }) + ) + break + } + } + + return extendedTransactions +} + +export type GetTransactionReceiptArgs = { + metaTxHash: string +} + +export function getTransactionReceipt({ + lifespan, + chainId, + wallet, + metaTxHash +}: GetTransactionReceiptArgs & BaseArgs): Intent { + return makeIntent(IntentName.getTransactionReceipt, lifespan, { + wallet, + network: chainId.toString(), + metaTxHash + }) +} + +export function sendERC20({ token, to, value, ...args }: SendERC20Args & BaseArgs): Intent { + return sendTransactions({ + transactions: [erc20({ tokenAddress: token, to, value: value.toString() })], + ...args + }) +} + +export function sendERC721({ token, to, id, safe, data, ...args }: SendERC721Args & BaseArgs): Intent { + return sendTransactions({ + transactions: [erc721({ tokenAddress: token, to, id, data, safe })], + ...args + }) +} + +export function sendERC1155({ token, to, values, data, ...args }: SendERC1155Args & BaseArgs): Intent { + const vals = values.map(v => ({ + id: v.id, + amount: ethers.BigNumber.from(v.amount).toString() + })) + + return sendTransactions({ + transactions: [erc1155({ tokenAddress: token, to, vals, data })], + ...args + }) +} + +export function sendDelayedEncode({ + to, + value, + abi, + func, + args, + ...otherArgs +}: SendDelayedEncodeArgs & BaseArgs): Intent { + return sendTransactions({ + transactions: [ + delayedEncode({ + to, + value: ethers.BigNumber.from(value).toString(), + data: { abi, func, args } + }) + ], + ...otherArgs + }) +} + +export type Transaction = + | ethers.providers.TransactionRequest + | TransactionRaw + | TransactionERC20 + | TransactionERC721 + | TransactionERC1155 + | TransactionDelayedEncode + +export function transaction(data: Omit): Transaction { + return { type: 'transaction', ...data } +} + +export function erc20(data: Omit | Omit): Transaction { + const sendERC20Args = data as Omit + const transactionERC20 = data as Omit + + if (sendERC20Args.token !== undefined) { + return { + type: 'erc20send', + tokenAddress: sendERC20Args.token, + to: sendERC20Args.to, + value: sendERC20Args.value.toString() + } + } else if (transactionERC20.tokenAddress !== undefined) { + return { type: 'erc20send', ...transactionERC20 } + } else { + throw new Error('Invalid ERC20 transaction') + } +} + +export function erc721(data: Omit | Omit): Transaction { + const sendERC721Args = data as Omit + const transactionERC721 = data as Omit + + if (sendERC721Args.token !== undefined) { + return { + type: 'erc721send', + tokenAddress: sendERC721Args.token, + to: sendERC721Args.to, + id: sendERC721Args.id, + data: sendERC721Args.data, + safe: sendERC721Args.safe + } + } else if (transactionERC721.tokenAddress !== undefined) { + return { type: 'erc721send', ...transactionERC721 } + } else { + throw new Error('Invalid ERC721 transaction') + } +} + +export function erc1155(data: Omit | Omit): Transaction { + const sendERC1155Args = data as Omit + const transactionERC1155 = data as Omit + + if (sendERC1155Args.values !== undefined) { + return { + type: 'erc1155send', + vals: sendERC1155Args.values.map(v => ({ + id: v.id, + amount: ethers.BigNumber.from(v.amount).toString() + })), + tokenAddress: sendERC1155Args.token, + to: sendERC1155Args.to, + data: sendERC1155Args.data + } + } else if (transactionERC1155.vals !== undefined) { + return { + type: 'erc1155send', + vals: transactionERC1155.vals.map(v => ({ + id: v.id, + amount: ethers.BigNumber.from(v.amount).toString() + })), + tokenAddress: transactionERC1155.tokenAddress, + to: transactionERC1155.to, + data: transactionERC1155.data + } + } else { + throw new Error('Invalid ERC1155 transaction') + } +} + +export function delayedEncode( + data: Omit | Omit +): Transaction { + const sendDelayedEncodeArgs = data as Omit + const transactionDelayedEncode = data as Omit + + if (sendDelayedEncodeArgs.abi !== undefined) { + return { + type: 'delayedEncode', + to: sendDelayedEncodeArgs.to, + value: ethers.BigNumber.from(sendDelayedEncodeArgs.value).toString(), + data: { + abi: sendDelayedEncodeArgs.abi, + func: sendDelayedEncodeArgs.func, + args: sendDelayedEncodeArgs.args + } + } + } else if (transactionDelayedEncode.data !== undefined) { + return { + type: 'delayedEncode', + to: transactionDelayedEncode.to, + value: transactionDelayedEncode.value, + data: transactionDelayedEncode.data + } + } else { + throw new Error('Invalid delayed encode transaction') + } +} + +export function combineTransactionIntents(intents: Intent[]): Intent { + if (intents.length === 0) { + throw new Error('No packets provided') + } + + // Ensure that all packets are for the same network and wallet + const network = intents[0].data.network + const wallet = intents[0].data.wallet + const lifespan = intents[0].expiresAt - intents[0].issuedAt + const identifier = intents[0].data.identifier + const transactionsFeeQuote = intents[0].data.transactionsFeeQuote + + if (!intents.every(intent => intent.data.network === network)) { + throw new Error('All packets must have the same chainId') + } + + if (!intents.every(intent => intent.data.wallet === wallet)) { + throw new Error('All packets must have the same wallet') + } + + return makeIntent(IntentName.sendTransaction, lifespan, { + network, + wallet, + identifier, + transactions: intents.flatMap(intent => intent.data.transactions), + transactionsFeeQuote + }) +} + +function isEthersTx(tx: Transaction): tx is ethers.providers.TransactionRequest { + return !['transaction', 'erc20send', 'erc721send', 'erc1155send', 'delayedEncode'].includes(tx.type as any) +} diff --git a/packages/waas/src/intents/utils.ts b/packages/waas/src/intents/utils.ts new file mode 100644 index 000000000..7a41587a5 --- /dev/null +++ b/packages/waas/src/intents/utils.ts @@ -0,0 +1,7 @@ +export function useLifespan(lifespan: number) { + const issuedAt = Math.floor(Date.now() / 1000) + return { + issuedAt, + expiresAt: issuedAt + lifespan + } +} diff --git a/packages/waas/src/networks.ts b/packages/waas/src/networks.ts new file mode 100644 index 000000000..058a36865 --- /dev/null +++ b/packages/waas/src/networks.ts @@ -0,0 +1,49 @@ +import { networks, ChainId } from '@0xsequence/network' + +const RPC_BASE = 'https://nodes.sequence.app/' + +const nameToId = Object.entries(networks).reduce( + (acc, [key, value]) => { + acc[value.name] = value.chainId + return acc + }, + {} as { [name: string]: (typeof networks)[ChainId.MAINNET]['chainId'] } +) + +type NameToIdType = typeof nameToId +type IdToNameType = { [K in keyof NameToIdType as NameToIdType[K]]: K } + +const idToName = Object.entries(nameToId).reduce((acc, [key, value]) => { + acc[value] = key as any + return acc +}, {} as IdToNameType) + +export type SimpleNetwork = keyof NameToIdType | keyof IdToNameType + +export function isSimpleNetwork(network: any): network is SimpleNetwork { + return toNetworkID(network) in nameToId +} + +export function toNetworkID(network: SimpleNetwork): keyof IdToNameType { + const networkNumber = typeof network === 'number' ? network : parseInt(network) + if (networkNumber in idToName) { + return networkNumber + } + + const networkLower = network.toString().toLowerCase() + if (networkLower in nameToId) { + return nameToId[networkLower as keyof NameToIdType] + } + + throw new Error(`Unknown network: ${network}`) +} + +export function nameOfNetwork(network: SimpleNetwork): keyof NameToIdType { + return idToName[toNetworkID(network)] +} + +export function rpcNode(network: SimpleNetwork): string { + return RPC_BASE + nameOfNetwork(network) +} + +export type WithSimpleNetwork = Omit & { network?: SimpleNetwork } diff --git a/packages/waas/src/secure-store.ts b/packages/waas/src/secure-store.ts new file mode 100644 index 000000000..ace34140e --- /dev/null +++ b/packages/waas/src/secure-store.ts @@ -0,0 +1,69 @@ +import { openDB, IDBPDatabase } from 'idb' + +export interface SecureStoreBackend { + get(dbName: string, dbStoreName: string, key: string): Promise + set(dbName: string, dbStoreName: string, key: string, value: any): Promise + delete(dbName: string, dbStoreName: string, key: string): Promise +} + +export const getDefaultSecureStoreBackend = (): SecureStoreBackend | null => { + if (isIndexedDbAvailable()) { + return new IndexedDbSecureStoreBackend() + } else { + return null + } +} + +export function isIndexedDbAvailable(): boolean { + return typeof indexedDB === 'object' +} + +export class IndexedDbSecureStoreBackend implements SecureStoreBackend { + private db: IDBPDatabase | null + + constructor() { + if (!isIndexedDbAvailable()) { + throw new Error('IndexedDB is not available') + } + + this.db = null + } + + private async openDB(dbName: string, dbStoreName: string, version: number): Promise { + if (this.db) { + return this.db + } + + this.db = await openDB(dbName, 1, { + upgrade(db) { + db.createObjectStore(dbStoreName) + } + }) + + return this.db + } + + async get(dbName: string, dbStoreName: string, key: string): Promise { + const db = await this.openDB(dbName, dbStoreName, 1) + const tx = db.transaction(dbStoreName, 'readonly') + const value = await db.get(dbStoreName, key) + await tx.done + return value + } + + async set(dbName: string, dbStoreName: string, key: string, value: any): Promise { + const db = await this.openDB(dbName, dbStoreName, 1) + const tx = db.transaction(dbStoreName, 'readwrite') + await db.put(dbStoreName, value, key) + await tx.done + return true + } + + async delete(dbName: string, dbStoreName: string, key: string): Promise { + const db = await this.openDB(dbName, dbStoreName, 1) + const tx = db.transaction(dbStoreName, 'readwrite') + await db.delete(dbStoreName, key) + await tx.done + return true + } +} diff --git a/packages/waas/src/session/index.ts b/packages/waas/src/session/index.ts new file mode 100644 index 000000000..5e88043c3 --- /dev/null +++ b/packages/waas/src/session/index.ts @@ -0,0 +1,42 @@ +import { newSECP256K1SessionFromSessionId, newSECP256K1Session } from './secp256k1' +import { newSECP256R1SessionFromSessionId, newSECP256R1Session } from './secp256r1' +import { SubtleCryptoBackend } from '../subtle-crypto' +import { SecureStoreBackend } from '../secure-store' + +export type Session = { + sessionId(): Promise + sign(message: string | Uint8Array): Promise + clear(): void +} + +export async function newSessionFromSessionId( + sessionId: string, + cryptoBackend: SubtleCryptoBackend | null, + secureStoreBackend: SecureStoreBackend | null +): Promise { + if (!secureStoreBackend) { + throw new Error('No secure store available') + } + if (cryptoBackend) { + return newSECP256R1SessionFromSessionId(sessionId, cryptoBackend, secureStoreBackend) + } else { + return newSECP256K1SessionFromSessionId(sessionId, secureStoreBackend) + } +} + +export async function newSession( + cryptoBackend: SubtleCryptoBackend | null, + secureStoreBackend: SecureStoreBackend | null +): Promise { + if (!secureStoreBackend) { + throw new Error('No secure store available') + } + if (cryptoBackend) { + return newSECP256R1Session(cryptoBackend, secureStoreBackend) + } else { + return newSECP256K1Session(secureStoreBackend) + } +} + +export * from './secp256r1' +export * from './secp256k1' diff --git a/packages/waas/src/session/keyTypes.ts b/packages/waas/src/session/keyTypes.ts new file mode 100644 index 000000000..d2296b980 --- /dev/null +++ b/packages/waas/src/session/keyTypes.ts @@ -0,0 +1,4 @@ +export enum KeyTypes { + ECDSAP256K1 = 0, + ECDSAP256R1 = 1 +} diff --git a/packages/waas/src/session/secp256k1.ts b/packages/waas/src/session/secp256k1.ts new file mode 100644 index 000000000..ec76507cb --- /dev/null +++ b/packages/waas/src/session/secp256k1.ts @@ -0,0 +1,48 @@ +import { ethers } from 'ethers' +import { SecureStoreBackend } from '../secure-store' +import { Session } from './index' + +const idbName = 'seq-waas-session-p256k1' +const idbStoreName = 'seq-waas-session' + +export async function newSECP256K1SessionFromSessionId( + sessionId: string, + secureStoreBackend: SecureStoreBackend +): Promise { + const privateKey = await secureStoreBackend.get(idbName, idbStoreName, sessionId) + + if (!privateKey) { + throw new Error('No private key found') + } + + const wallet = new ethers.Wallet(privateKey) + + return { + sessionId(): Promise { + return wallet.getAddress() + }, + sign(message: string | Uint8Array): Promise { + return wallet.signMessage(message) + }, + clear: async () => { + await secureStoreBackend.delete(idbName, idbStoreName, sessionId) + } + } as Session +} + +export async function newSECP256K1SessionFromPrivateKey( + privateKey: string, + secureStoreBackend: SecureStoreBackend +): Promise { + const wallet = new ethers.Wallet(privateKey) + const sessionId = await wallet.getAddress() + + await secureStoreBackend.set(idbName, idbStoreName, sessionId, privateKey) + + return newSECP256K1SessionFromSessionId(sessionId, secureStoreBackend) +} + +export async function newSECP256K1Session(secureStoreBackend: SecureStoreBackend): Promise { + const wallet = ethers.Wallet.createRandom() + return newSECP256K1SessionFromPrivateKey(wallet.privateKey, secureStoreBackend) +} diff --git a/packages/waas/src/session/secp256r1.ts b/packages/waas/src/session/secp256r1.ts new file mode 100644 index 000000000..fa95dd1e5 --- /dev/null +++ b/packages/waas/src/session/secp256r1.ts @@ -0,0 +1,92 @@ +import { ethers } from 'ethers' +import { Session } from './index' +import { KeyTypes } from './keyTypes' +import { SubtleCryptoBackend } from '../subtle-crypto' +import { SecureStoreBackend } from '../secure-store' + +const idbName = 'seq-waas-session-p256r1' +const idbStoreName = 'seq-waas-session' + +// TODO: We need to update this to use the secure store backend +// Currently it ignores the override and leverages idb +// This is because the CryptoKeyPair is a bit more complicated +// than a simple string that SecureStoreBackend can handle + +export async function newSECP256R1SessionFromSessionId( + sessionId: string, + cryptoBackend: SubtleCryptoBackend, + secureStoreBackend: SecureStoreBackend +): Promise { + const keys = await secureStoreBackend.get(idbName, idbStoreName, sessionId) + + if (!keys || !keys.privateKey) { + throw new Error('No private key found') + } + + const encoder = new TextEncoder() + return { + sessionId: async () => { + const pubKeyRaw = await cryptoBackend.exportKey('raw', keys.publicKey) + const pubKeyTypedRaw = new Uint8Array(pubKeyRaw.byteLength + 1) + + // set the first byte to the key type + pubKeyTypedRaw[0] = KeyTypes.ECDSAP256R1 + pubKeyTypedRaw.set(new Uint8Array(pubKeyRaw), 1) + + return ethers.utils.hexlify(pubKeyTypedRaw) + }, + sign: async (message: string | Uint8Array) => { + if (typeof message === 'string') { + if (message.startsWith('0x')) { + message = message.slice(2) + message = ethers.utils.arrayify(message) + } else { + message = encoder.encode(message) + } + } + const signatureBuff = await cryptoBackend.sign({ name: 'ECDSA', hash: { name: 'SHA-256' } }, keys.privateKey, message) + return ethers.utils.hexlify(new Uint8Array(signatureBuff)) + }, + clear: async () => { + await secureStoreBackend.delete(idbName, idbStoreName, sessionId) + } + } +} + +export async function newSECP256R1SessionFromKeyPair( + keyPair: CryptoKeyPair, + cryptoBackend: SubtleCryptoBackend, + secureStoreBackend: SecureStoreBackend +): Promise { + const sessionId = await pubKeyToSessionId(cryptoBackend, keyPair.publicKey) + + await secureStoreBackend.set(idbName, idbStoreName, sessionId, keyPair) + + return newSECP256R1SessionFromSessionId(sessionId, cryptoBackend, secureStoreBackend) +} + +export async function newSECP256R1Session( + cryptoBackend: SubtleCryptoBackend, + secureStoreBackend: SecureStoreBackend +): Promise { + const generatedKeys = await cryptoBackend.generateKey( + { + name: 'ECDSA', + namedCurve: 'P-256' + }, + false, + ['sign', 'verify'] + ) + return newSECP256R1SessionFromKeyPair(generatedKeys, cryptoBackend, secureStoreBackend) +} + +async function pubKeyToSessionId(cryptoBackend: SubtleCryptoBackend, pubKey: CryptoKey): Promise { + const pubKeyRaw = await cryptoBackend.exportKey('raw', pubKey) + const pubKeyTypedRaw = new Uint8Array(pubKeyRaw.byteLength + 1) + + // set the first byte to the key type + pubKeyTypedRaw[0] = KeyTypes.ECDSAP256R1 + pubKeyTypedRaw.set(new Uint8Array(pubKeyRaw), 1) + + return ethers.utils.hexlify(pubKeyTypedRaw) +} diff --git a/packages/waas/src/store.ts b/packages/waas/src/store.ts new file mode 100644 index 000000000..a2fb99753 --- /dev/null +++ b/packages/waas/src/store.ts @@ -0,0 +1,89 @@ +export interface Store { + get(key: string): Promise + set(key: string, value: string | null): Promise +} + +export class StoreObj { + constructor( + private readonly store: Store, + private readonly key: string, + private readonly defaultValue: T + ) {} + + async get(): Promise { + const value = await this.store.get(this.key) + return value ? (value as T) : this.defaultValue + } + + async set(value: T): Promise { + if (value) { + await this.store.set(this.key, value) + } else { + await this.store.set(this.key, null) + } + } +} + +export class LocalStore implements Store { + private readonly store: Store + + constructor() { + if (WindowLocalStorage.isAvailable()) { + this.store = new WindowLocalStorage() + } else { + this.store = new MemoryStore() + } + } + + async get(key: string): Promise { + return this.store.get(key) + } + + async set(key: string, value: string | null): Promise { + return this.store.set(key, value) + } +} + +export class WindowLocalStorage implements Store { + static isAvailable(): boolean { + return typeof window === 'object' && typeof window.localStorage === 'object' + } + + constructor() { + if (!WindowLocalStorage.isAvailable()) { + throw new Error('No localStorage') + } + } + + async get(key: string): Promise { + return window.localStorage.getItem(key) + } + + async set(key: string, value: string | null): Promise { + if (!value) { + window.localStorage.removeItem(key) + } else { + window.localStorage.setItem(key, value) + } + } +} + +export class MemoryStore implements Store { + private store: Record = {} + + constructor() { + this.store = {} + } + + async get(key: string): Promise { + return this.store[key] || null + } + + async set(key: string, value: string | null): Promise { + if (value) { + this.store[key] = value + } else { + delete this.store[key] + } + } +} diff --git a/packages/waas/src/subtle-crypto.ts b/packages/waas/src/subtle-crypto.ts new file mode 100644 index 000000000..838c743f0 --- /dev/null +++ b/packages/waas/src/subtle-crypto.ts @@ -0,0 +1,102 @@ +export interface SubtleCryptoBackend { + // generateKey is used to generate a new key pair. NOTE: its important to pass + // `false` to the extractable argument to ensure that the private key contents + // cannot be revealed. Note, that you can still use `extractable:false` and the + // `exportKey(..)` method, because the Browser is smart enough to keep the key + // opaque and only allow it to be exported in a wrapped format without revealing + // the private key contents. + generateKey( + algorithm: RsaHashedKeyGenParams | EcKeyGenParams, + extractable: boolean, + keyUsages: KeyUsage[] + ): Promise + + // exportKey is used to export a key pair. The `format` argument is used to + // specify the format of the exported key. The `key` argument is the key pair + // to export. In general we'll use `format: 'raw'` and `key: `. + // Contents will be opaque when `extractable: false` was passed to `generateKey(..)`. + exportKey(format: Exclude, key: CryptoKey): Promise + + // digest is used to hash a message. The `algorithm` argument is used to specify + // the hash algorithm to use. The `data` argument is the message to hash. + digest(algorithm: AlgorithmIdentifier, data: Uint8Array): Promise + + // sign is used to sign a message. The `algorithm` argument is used to specify + // the signing algorithm to use. The `key` argument is the private key to use + // for signing. The `data` argument is the message to sign. + // + // For our purposes we just care about ECDSA / P-256. + sign(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, data: Uint8Array): Promise + + // verify is used to verify a signature. The `algorithm` argument is used to + // specify the verification algorithm to use. The `key` argument is the public + // key to use for verification. The `signature` argument is the signature to + // verify. The `data` argument is the message to verify. + verify( + algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, + key: CryptoKey, + signature: Uint8Array, + data: Uint8Array + ): Promise + + // getRandomValues is used to generate random bytes. The `len` argument is the + // number of random bytes to generate. + getRandomValues(len: number): Uint8Array +} + +export const getDefaultSubtleCryptoBackend = (): SubtleCryptoBackend | null => { + if (isWindowSubtleCryptoAvailable()) { + return new WindowSubtleCryptoBackend() + } else { + return null + } +} + +export function isWindowSubtleCryptoAvailable(): boolean { + return typeof window === 'object' && typeof window.crypto === 'object' && typeof window.crypto.subtle === 'object' +} + +export class WindowSubtleCryptoBackend implements SubtleCryptoBackend { + constructor() { + if (!isWindowSubtleCryptoAvailable()) { + throw new Error('window.crypto.subtle is not available') + } + } + + async generateKey( + algorithm: RsaHashedKeyGenParams | EcKeyGenParams, + extractable: boolean, + keyUsages: KeyUsage[] + ): Promise { + return window.crypto.subtle.generateKey(algorithm, extractable, keyUsages) + } + + async exportKey(format: Exclude, key: CryptoKey): Promise { + const keyData = await window.crypto.subtle.exportKey(format, key) + return new Uint8Array(keyData) + } + + async digest(algorithm: AlgorithmIdentifier, data: Uint8Array): Promise { + const digest = await window.crypto.subtle.digest(algorithm, data) + return new Uint8Array(digest) + } + + async sign(algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, key: CryptoKey, data: Uint8Array): Promise { + const signature = await window.crypto.subtle.sign(algorithm, key, data) + return new Uint8Array(signature) + } + + async verify( + algorithm: AlgorithmIdentifier | RsaPssParams | EcdsaParams, + key: CryptoKey, + signature: Uint8Array, + data: Uint8Array + ): Promise { + return window.crypto.subtle.verify(algorithm, key, signature, data) + } + + getRandomValues(len: number) { + const randomValues = new Uint8Array(len) + return window.crypto.getRandomValues(randomValues) + } +} diff --git a/packages/waas/tests/intents.spec.ts b/packages/waas/tests/intents.spec.ts new file mode 100644 index 000000000..643c8f8ea --- /dev/null +++ b/packages/waas/tests/intents.spec.ts @@ -0,0 +1,168 @@ +import * as chai from 'chai' +import { ethers } from 'ethers' + +import { Intent, signIntent } from '../src/intents' +import { IntentDataSendTransaction, IntentDataSignMessage } from '../src/clients/intent.gen' +import { newSECP256K1SessionFromPrivateKey } from '../src/session' +import { getDefaultSecureStoreBackend } from '../src/secure-store' + +import 'fake-indexeddb/auto' + +const { expect } = chai + +describe('Payloads', () => { + it('Should sign a payload', async () => { + const intent: Intent = { + version: '1', + name: 'sendTransactions', + issuedAt: 1600000000, + expiresAt: 1600000000 + 86400, + data: { + identifier: 'test-identifier', + wallet: '0xD67FC48b298B09Ed3D03403d930769C527186c4e', + network: '1', + transactions: [ + { + type: 'erc20send', + token: ethers.constants.AddressZero, + to: '0x0dc9603d4da53841C1C83f3B550C6143e60e0425', + value: '0' + } + ] + } + } + + const secureStoreBackend = getDefaultSecureStoreBackend() + if (!secureStoreBackend) { + throw new Error('Secure store backend not available') + } + const session = await newSECP256K1SessionFromPrivateKey( + '0xecd39e2cdadc2427255042ca7e0f86368bd7aa6e3c99470444b7d073840c1b51', + secureStoreBackend + ) + const signedIntent = await signIntent(session, intent) + + expect(signedIntent.signatures.length).to.equal(1) + expect(signedIntent.signatures[0].sessionId).to.equal(await session.sessionId()) + expect(signedIntent.signatures[0].signature).to.equal( + '0x14682ca0eb116109cdf1d0bad6a84e29787787b4a1779d2b43c28d8705ade929267474e8a7725d5e7540ded2010897d3ecaad32b27c75fbfb4f63ff1cf1a948a1c' + ) + }) + + it('Should sign a message payload', async () => { + const intent: Intent = { + version: '1', + name: 'sendTransactions', + issuedAt: 1600000000, + expiresAt: 1600000000 + 86400, + data: { + network: '1', + wallet: '0xD67FC48b298B09Ed3D03403d930769C527186c4e', + message: '0xdeadbeef' + } + } + + const secureStoreBackend = getDefaultSecureStoreBackend() + if (!secureStoreBackend) { + throw new Error('Secure store backend not available') + } + const session = await newSECP256K1SessionFromPrivateKey( + '0xecd39e2cdadc2427255042ca7e0f86368bd7aa6e3c99470444b7d073840c1b51', + secureStoreBackend + ) + const signedIntent = await signIntent(session, intent) + + expect(signedIntent.signatures.length).to.equal(1) + expect(signedIntent.signatures[0].sessionId).to.equal(await session.sessionId()) + expect(signedIntent.signatures[0].signature).to.equal( + '0x768b25315317e551ed7b540e73fdf69d8816dcc763a50c648cf2966849f089a2495103f06c876c502bfb33cb348c4b77ffe39bbd6483b932b806a5817374f9ea1c' + ) + }) + + it('Should sign transaction payload', async () => { + const intent: Intent = { + version: '1', + name: 'sendTransactions', + issuedAt: 1600000000, + expiresAt: 1600000000 + 86400, + data: { + identifier: 'test-identifier', + wallet: '0xD67FC48b298B09Ed3D03403d930769C527186c4e', + network: '1', + transactions: [ + { + type: 'transaction', + to: '0x479F6a5b0C1728947318714963a583C56A78366A', + value: '39381', + data: '0x3251ba32' + }, + { + type: 'erc20send', + token: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + to: '0x7b1Bd3474D789e18e2E329E2c53F819B6E687b4A', + value: '1000' + }, + { + type: 'erc721send', + token: '0xF87E31492Faf9A91B02Ee0dEAAd50d51d56D5d4d', + to: '0x17fFA2d95b58228e1ECb0C6Ac25A6EfD20BA08E4', + id: '7', + safe: true, + data: '0x112233' + }, + { + type: 'erc1155send', + token: '0x631998e91476da5b870d741192fc5cbc55f5a52e', + to: '0x91E8aC543C5fEDf9F3Ef8b9dA1500dB84305681F', + vals: [ + { + id: '2', + amount: '5' + }, + { + id: '500', + amount: '1' + } + ], + data: '0x223344' + }, + { + type: 'delayedEncode', + to: '0x140d72763D1ce39Ad4E2e73EC6e8FC53E5b73B64', + value: '0', + data: { + abi: '[{"inputs":[{"internalType":"uint256","name":"_orderId","type":"uint256"},{"internalType":"uint256","name":"_maxCost","type":"uint256"},{"internalType":"address[]","name":"_fees","type":"address[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"fillOrKillOrder","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_val","type":"uint256"},{"internalType":"string","name":"_data","type":"string"}],"name":"notExpired","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"otherMethods","outputs":[],"stateMutability":"nonpayable","type":"function"}]', + func: 'fillOrKillOrder', + args: [ + '48774435471364917511246724398022004900255301025912680232738918790354204737320', + '1000000000000000000', + '["0x8541D65829f98f7D71A4655cCD7B2bB8494673bF"]', + { + abi: 'notExpired(uint256,string)', + func: 'notExpired', + args: ['1600000000', 'Nov 1st, 2020'] + } + ] + } + } + ] + } + } + + const secureStoreBackend = getDefaultSecureStoreBackend() + if (!secureStoreBackend) { + throw new Error('Secure store backend not available') + } + const session = await newSECP256K1SessionFromPrivateKey( + '0xecd39e2cdadc2427255042ca7e0f86368bd7aa6e3c99470444b7d073840c1b51', + secureStoreBackend + ) + const signedIntent = await signIntent(session, intent) + + expect(signedIntent.signatures.length).to.equal(1) + expect(signedIntent.signatures[0].sessionId).to.equal(await session.sessionId()) + expect(signedIntent.signatures[0].signature).to.equal( + '0x98dd84b3d4fe077b2f55e2839609b226d8119b9b0ee10756122615a5d68746bf60596069a305a7533123f212b576d16f3f14ad06faed9fc005c32a28bf8bafb21b' + ) + }) +}) diff --git a/packages/wallet/CHANGELOG.md b/packages/wallet/CHANGELOG.md new file mode 100644 index 000000000..1708df248 --- /dev/null +++ b/packages/wallet/CHANGELOG.md @@ -0,0 +1,3916 @@ +# @0xsequence/wallet + +## 1.10.8 + +### Patch Changes + +- update metadata bindings +- Updated dependencies + - @0xsequence/abi@1.10.8 + - @0xsequence/core@1.10.8 + - @0xsequence/network@1.10.8 + - @0xsequence/relayer@1.10.8 + - @0xsequence/signhub@1.10.8 + - @0xsequence/utils@1.10.8 + +## 1.10.7 + +### Patch Changes + +- minor fixes to waas client +- Updated dependencies + - @0xsequence/abi@1.10.7 + - @0xsequence/core@1.10.7 + - @0xsequence/network@1.10.7 + - @0xsequence/relayer@1.10.7 + - @0xsequence/signhub@1.10.7 + - @0xsequence/utils@1.10.7 + +## 1.10.6 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/abi@1.10.6 + - @0xsequence/core@1.10.6 + - @0xsequence/network@1.10.6 + - @0xsequence/relayer@1.10.6 + - @0xsequence/signhub@1.10.6 + - @0xsequence/utils@1.10.6 + +## 1.10.5 + +### Patch Changes + +- network: ape-chain-testnet -> apechain-testnet +- Updated dependencies + - @0xsequence/abi@1.10.5 + - @0xsequence/core@1.10.5 + - @0xsequence/network@1.10.5 + - @0xsequence/relayer@1.10.5 + - @0xsequence/signhub@1.10.5 + - @0xsequence/utils@1.10.5 + +## 1.10.4 + +### Patch Changes + +- network: add b3-sepolia, ape-chain-testnet, blast, blast-sepolia +- Updated dependencies + - @0xsequence/abi@1.10.4 + - @0xsequence/core@1.10.4 + - @0xsequence/network@1.10.4 + - @0xsequence/relayer@1.10.4 + - @0xsequence/signhub@1.10.4 + - @0xsequence/utils@1.10.4 + +## 1.10.3 + +### Patch Changes + +- typing fix +- Updated dependencies + - @0xsequence/abi@1.10.3 + - @0xsequence/core@1.10.3 + - @0xsequence/network@1.10.3 + - @0xsequence/relayer@1.10.3 + - @0xsequence/signhub@1.10.3 + - @0xsequence/utils@1.10.3 + +## 1.10.2 + +### Patch Changes + +- - waas: add getIdToken method + - indexer: update api client +- Updated dependencies + - @0xsequence/abi@1.10.2 + - @0xsequence/core@1.10.2 + - @0xsequence/network@1.10.2 + - @0xsequence/relayer@1.10.2 + - @0xsequence/signhub@1.10.2 + - @0xsequence/utils@1.10.2 + +## 1.10.1 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/abi@1.10.1 + - @0xsequence/core@1.10.1 + - @0xsequence/network@1.10.1 + - @0xsequence/relayer@1.10.1 + - @0xsequence/signhub@1.10.1 + - @0xsequence/utils@1.10.1 + +## 1.10.0 + +### Minor Changes + +- waas release v1.3.0 + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.10.0 + - @0xsequence/core@1.10.0 + - @0xsequence/network@1.10.0 + - @0xsequence/relayer@1.10.0 + - @0xsequence/signhub@1.10.0 + - @0xsequence/utils@1.10.0 + +## 1.9.37 + +### Patch Changes + +- network: adds nativeToken data to NetworkMetadata constants +- Updated dependencies + - @0xsequence/abi@1.9.37 + - @0xsequence/core@1.9.37 + - @0xsequence/network@1.9.37 + - @0xsequence/relayer@1.9.37 + - @0xsequence/signhub@1.9.37 + - @0xsequence/utils@1.9.37 + +## 1.9.36 + +### Patch Changes + +- guard: export client +- Updated dependencies + - @0xsequence/abi@1.9.36 + - @0xsequence/core@1.9.36 + - @0xsequence/network@1.9.36 + - @0xsequence/relayer@1.9.36 + - @0xsequence/signhub@1.9.36 + - @0xsequence/utils@1.9.36 + +## 1.9.35 + +### Patch Changes + +- guard: update bindings +- Updated dependencies + - @0xsequence/abi@1.9.35 + - @0xsequence/core@1.9.35 + - @0xsequence/network@1.9.35 + - @0xsequence/relayer@1.9.35 + - @0xsequence/signhub@1.9.35 + - @0xsequence/utils@1.9.35 + +## 1.9.34 + +### Patch Changes + +- waas: always use lowercase email +- Updated dependencies + - @0xsequence/abi@1.9.34 + - @0xsequence/core@1.9.34 + - @0xsequence/network@1.9.34 + - @0xsequence/relayer@1.9.34 + - @0xsequence/signhub@1.9.34 + - @0xsequence/utils@1.9.34 + +## 1.9.33 + +### Patch Changes + +- waas: umd build +- Updated dependencies + - @0xsequence/abi@1.9.33 + - @0xsequence/core@1.9.33 + - @0xsequence/network@1.9.33 + - @0xsequence/relayer@1.9.33 + - @0xsequence/signhub@1.9.33 + - @0xsequence/utils@1.9.33 + +## 1.9.32 + +### Patch Changes + +- indexer: update bindings +- Updated dependencies + - @0xsequence/abi@1.9.32 + - @0xsequence/core@1.9.32 + - @0xsequence/network@1.9.32 + - @0xsequence/relayer@1.9.32 + - @0xsequence/signhub@1.9.32 + - @0xsequence/utils@1.9.32 + +## 1.9.31 + +### Patch Changes + +- metadata: token directory changes +- Updated dependencies + - @0xsequence/abi@1.9.31 + - @0xsequence/core@1.9.31 + - @0xsequence/network@1.9.31 + - @0xsequence/relayer@1.9.31 + - @0xsequence/signhub@1.9.31 + - @0xsequence/utils@1.9.31 + +## 1.9.30 + +### Patch Changes + +- update +- Updated dependencies + - @0xsequence/abi@1.9.30 + - @0xsequence/core@1.9.30 + - @0xsequence/network@1.9.30 + - @0xsequence/relayer@1.9.30 + - @0xsequence/signhub@1.9.30 + - @0xsequence/utils@1.9.30 + +## 1.9.29 + +### Patch Changes + +- disable gnosis chain +- Updated dependencies + - @0xsequence/abi@1.9.29 + - @0xsequence/core@1.9.29 + - @0xsequence/network@1.9.29 + - @0xsequence/relayer@1.9.29 + - @0xsequence/signhub@1.9.29 + - @0xsequence/utils@1.9.29 + +## 1.9.28 + +### Patch Changes + +- add utils/merkletree +- Updated dependencies + - @0xsequence/abi@1.9.28 + - @0xsequence/core@1.9.28 + - @0xsequence/network@1.9.28 + - @0xsequence/relayer@1.9.28 + - @0xsequence/signhub@1.9.28 + - @0xsequence/utils@1.9.28 + +## 1.9.27 + +### Patch Changes + +- network: optimistic -> optimism +- waas: remove defaults +- api, sessions: update bindings +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.9.27 + - @0xsequence/core@1.9.27 + - @0xsequence/network@1.9.27 + - @0xsequence/relayer@1.9.27 + - @0xsequence/signhub@1.9.27 + - @0xsequence/utils@1.9.27 + +## 1.9.26 + +### Patch Changes + +- - add backend interfaces for pluggable interfaces + - introduce @0xsequence/react-native + - update pnpm to lockfile v9 +- Updated dependencies + - @0xsequence/abi@1.9.26 + - @0xsequence/core@1.9.26 + - @0xsequence/network@1.9.26 + - @0xsequence/relayer@1.9.26 + - @0xsequence/signhub@1.9.26 + - @0xsequence/utils@1.9.26 + +## 1.9.25 + +### Patch Changes + +- update webrpc clients with new error types +- Updated dependencies + - @0xsequence/abi@1.9.25 + - @0xsequence/core@1.9.25 + - @0xsequence/network@1.9.25 + - @0xsequence/relayer@1.9.25 + - @0xsequence/signhub@1.9.25 + - @0xsequence/utils@1.9.25 + +## 1.9.24 + +### Patch Changes + +- waas: add memoryStore backend to localStore +- Updated dependencies + - @0xsequence/abi@1.9.24 + - @0xsequence/core@1.9.24 + - @0xsequence/network@1.9.24 + - @0xsequence/relayer@1.9.24 + - @0xsequence/signhub@1.9.24 + - @0xsequence/utils@1.9.24 + +## 1.9.23 + +### Patch Changes + +- update api client bindings +- Updated dependencies + - @0xsequence/abi@1.9.23 + - @0xsequence/core@1.9.23 + - @0xsequence/network@1.9.23 + - @0xsequence/relayer@1.9.23 + - @0xsequence/signhub@1.9.23 + - @0xsequence/utils@1.9.23 + +## 1.9.22 + +### Patch Changes + +- update metadata client bindings +- Updated dependencies + - @0xsequence/abi@1.9.22 + - @0xsequence/core@1.9.22 + - @0xsequence/network@1.9.22 + - @0xsequence/relayer@1.9.22 + - @0xsequence/signhub@1.9.22 + - @0xsequence/utils@1.9.22 + +## 1.9.21 + +### Patch Changes + +- api client bindings +- Updated dependencies + - @0xsequence/abi@1.9.21 + - @0xsequence/core@1.9.21 + - @0xsequence/network@1.9.21 + - @0xsequence/relayer@1.9.21 + - @0xsequence/signhub@1.9.21 + - @0xsequence/utils@1.9.21 + +## 1.9.20 + +### Patch Changes + +- api client bindings update +- Updated dependencies + - @0xsequence/abi@1.9.20 + - @0xsequence/core@1.9.20 + - @0xsequence/network@1.9.20 + - @0xsequence/relayer@1.9.20 + - @0xsequence/signhub@1.9.20 + - @0xsequence/utils@1.9.20 + +## 1.9.19 + +### Patch Changes + +- waas update +- Updated dependencies + - @0xsequence/abi@1.9.19 + - @0xsequence/core@1.9.19 + - @0xsequence/network@1.9.19 + - @0xsequence/relayer@1.9.19 + - @0xsequence/signhub@1.9.19 + - @0xsequence/utils@1.9.19 + +## 1.9.18 + +### Patch Changes + +- provider: prohibit dangerous functions +- Updated dependencies + - @0xsequence/abi@1.9.18 + - @0xsequence/core@1.9.18 + - @0xsequence/network@1.9.18 + - @0xsequence/relayer@1.9.18 + - @0xsequence/signhub@1.9.18 + - @0xsequence/utils@1.9.18 + +## 1.9.17 + +### Patch Changes + +- network: add xr-sepolia +- Updated dependencies + - @0xsequence/network@1.9.17 + - @0xsequence/abi@1.9.17 + - @0xsequence/core@1.9.17 + - @0xsequence/relayer@1.9.17 + - @0xsequence/signhub@1.9.17 + - @0xsequence/utils@1.9.17 + +## 1.9.16 + +### Patch Changes + +- waas: sequence.feeOptions +- Updated dependencies + - @0xsequence/abi@1.9.16 + - @0xsequence/core@1.9.16 + - @0xsequence/network@1.9.16 + - @0xsequence/relayer@1.9.16 + - @0xsequence/signhub@1.9.16 + - @0xsequence/utils@1.9.16 + +## 1.9.15 + +### Patch Changes + +- metadata: collection external_link field name fix +- Updated dependencies + - @0xsequence/abi@1.9.15 + - @0xsequence/core@1.9.15 + - @0xsequence/network@1.9.15 + - @0xsequence/relayer@1.9.15 + - @0xsequence/signhub@1.9.15 + - @0xsequence/utils@1.9.15 + +## 1.9.14 + +### Patch Changes + +- network: astar-zkatana -> astar-zkyoto +- network: deprecate polygon mumbai network +- network: add xai and polygon amoy +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.9.14 + - @0xsequence/core@1.9.14 + - @0xsequence/network@1.9.14 + - @0xsequence/relayer@1.9.14 + - @0xsequence/signhub@1.9.14 + - @0xsequence/utils@1.9.14 + +## 1.9.13 + +### Patch Changes + +- waas: fix @0xsequence/network dependency +- Updated dependencies + - @0xsequence/abi@1.9.13 + - @0xsequence/core@1.9.13 + - @0xsequence/network@1.9.13 + - @0xsequence/relayer@1.9.13 + - @0xsequence/signhub@1.9.13 + - @0xsequence/utils@1.9.13 + +## 1.9.12 + +### Patch Changes + +- indexer: update rpc bindings +- provider: signMessage: Serialize the BytesLike or string message into hexstring before sending +- waas: SessionAuthProof +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.9.12 + - @0xsequence/core@1.9.12 + - @0xsequence/network@1.9.12 + - @0xsequence/relayer@1.9.12 + - @0xsequence/signhub@1.9.12 + - @0xsequence/utils@1.9.12 + +## 1.9.11 + +### Patch Changes + +- metdata, update rpc bindings +- Updated dependencies + - @0xsequence/abi@1.9.11 + - @0xsequence/core@1.9.11 + - @0xsequence/network@1.9.11 + - @0xsequence/relayer@1.9.11 + - @0xsequence/signhub@1.9.11 + - @0xsequence/utils@1.9.11 + +## 1.9.10 + +### Patch Changes + +- update metadata rpc bindings +- Updated dependencies + - @0xsequence/abi@1.9.10 + - @0xsequence/core@1.9.10 + - @0xsequence/network@1.9.10 + - @0xsequence/relayer@1.9.10 + - @0xsequence/signhub@1.9.10 + - @0xsequence/utils@1.9.10 + +## 1.9.9 + +### Patch Changes + +- metadata, add SequenceCollections rpc client +- Updated dependencies + - @0xsequence/abi@1.9.9 + - @0xsequence/core@1.9.9 + - @0xsequence/network@1.9.9 + - @0xsequence/relayer@1.9.9 + - @0xsequence/signhub@1.9.9 + - @0xsequence/utils@1.9.9 + +## 1.9.8 + +### Patch Changes + +- waas client update +- Updated dependencies + - @0xsequence/abi@1.9.8 + - @0xsequence/core@1.9.8 + - @0xsequence/network@1.9.8 + - @0xsequence/relayer@1.9.8 + - @0xsequence/signhub@1.9.8 + - @0xsequence/utils@1.9.8 + +## 1.9.7 + +### Patch Changes + +- update rpc client bindings for api, metadata and relayer +- Updated dependencies + - @0xsequence/abi@1.9.7 + - @0xsequence/core@1.9.7 + - @0xsequence/network@1.9.7 + - @0xsequence/relayer@1.9.7 + - @0xsequence/signhub@1.9.7 + - @0xsequence/utils@1.9.7 + +## 1.9.6 + +### Patch Changes + +- waas package update +- Updated dependencies + - @0xsequence/abi@1.9.6 + - @0xsequence/core@1.9.6 + - @0xsequence/network@1.9.6 + - @0xsequence/relayer@1.9.6 + - @0xsequence/signhub@1.9.6 + - @0xsequence/utils@1.9.6 + +## 1.9.5 + +### Patch Changes + +- RpcRelayer prioritize project access key +- Updated dependencies + - @0xsequence/abi@1.9.5 + - @0xsequence/core@1.9.5 + - @0xsequence/network@1.9.5 + - @0xsequence/relayer@1.9.5 + - @0xsequence/signhub@1.9.5 + - @0xsequence/utils@1.9.5 + +## 1.9.4 + +### Patch Changes + +- waas: fix network dependency +- Updated dependencies + - @0xsequence/abi@1.9.4 + - @0xsequence/core@1.9.4 + - @0xsequence/network@1.9.4 + - @0xsequence/relayer@1.9.4 + - @0xsequence/signhub@1.9.4 + - @0xsequence/utils@1.9.4 + +## 1.9.3 + +### Patch Changes + +- provider: don't append access key to RPC url if user has already provided it +- Updated dependencies + - @0xsequence/abi@1.9.3 + - @0xsequence/core@1.9.3 + - @0xsequence/network@1.9.3 + - @0xsequence/relayer@1.9.3 + - @0xsequence/signhub@1.9.3 + - @0xsequence/utils@1.9.3 + +## 1.9.2 + +### Patch Changes + +- network: add xai-sepolia +- Updated dependencies + - @0xsequence/abi@1.9.2 + - @0xsequence/core@1.9.2 + - @0xsequence/network@1.9.2 + - @0xsequence/relayer@1.9.2 + - @0xsequence/signhub@1.9.2 + - @0xsequence/utils@1.9.2 + +## 1.9.1 + +### Patch Changes + +- analytics fix +- Updated dependencies + - @0xsequence/abi@1.9.1 + - @0xsequence/core@1.9.1 + - @0xsequence/network@1.9.1 + - @0xsequence/relayer@1.9.1 + - @0xsequence/signhub@1.9.1 + - @0xsequence/utils@1.9.1 + +## 1.9.0 + +### Minor Changes + +- waas release + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.9.0 + - @0xsequence/core@1.9.0 + - @0xsequence/network@1.9.0 + - @0xsequence/relayer@1.9.0 + - @0xsequence/signhub@1.9.0 + - @0xsequence/utils@1.9.0 + +## 1.8.8 + +### Patch Changes + +- update metadata bindings +- Updated dependencies + - @0xsequence/abi@1.8.8 + - @0xsequence/core@1.8.8 + - @0xsequence/network@1.8.8 + - @0xsequence/relayer@1.8.8 + - @0xsequence/signhub@1.8.8 + - @0xsequence/utils@1.8.8 + +## 1.8.7 + +### Patch Changes + +- provider: update databeat to 0.9.1 +- Updated dependencies + - @0xsequence/abi@1.8.7 + - @0xsequence/core@1.8.7 + - @0xsequence/network@1.8.7 + - @0xsequence/relayer@1.8.7 + - @0xsequence/signhub@1.8.7 + - @0xsequence/utils@1.8.7 + +## 1.8.6 + +### Patch Changes + +- guard: SignedOwnershipProof +- Updated dependencies + - @0xsequence/abi@1.8.6 + - @0xsequence/core@1.8.6 + - @0xsequence/network@1.8.6 + - @0xsequence/relayer@1.8.6 + - @0xsequence/signhub@1.8.6 + - @0xsequence/utils@1.8.6 + +## 1.8.5 + +### Patch Changes + +- guard: signOwnershipProof and isSignedOwnershipProof +- Updated dependencies + - @0xsequence/abi@1.8.5 + - @0xsequence/core@1.8.5 + - @0xsequence/network@1.8.5 + - @0xsequence/relayer@1.8.5 + - @0xsequence/signhub@1.8.5 + - @0xsequence/utils@1.8.5 + +## 1.8.4 + +### Patch Changes + +- network: add homeverse to networks list +- Updated dependencies + - @0xsequence/abi@1.8.4 + - @0xsequence/core@1.8.4 + - @0xsequence/network@1.8.4 + - @0xsequence/relayer@1.8.4 + - @0xsequence/signhub@1.8.4 + - @0xsequence/utils@1.8.4 + +## 1.8.3 + +### Patch Changes + +- api: introduce basic linked wallet support +- Updated dependencies + - @0xsequence/abi@1.8.3 + - @0xsequence/core@1.8.3 + - @0xsequence/network@1.8.3 + - @0xsequence/relayer@1.8.3 + - @0xsequence/signhub@1.8.3 + - @0xsequence/utils@1.8.3 + +## 1.8.2 + +### Patch Changes + +- provider: don't initialize analytics unless explicitly requested +- Updated dependencies + - @0xsequence/abi@1.8.2 + - @0xsequence/core@1.8.2 + - @0xsequence/network@1.8.2 + - @0xsequence/relayer@1.8.2 + - @0xsequence/signhub@1.8.2 + - @0xsequence/utils@1.8.2 + +## 1.8.1 + +### Patch Changes + +- update to analytics provider +- Updated dependencies + - @0xsequence/abi@1.8.1 + - @0xsequence/core@1.8.1 + - @0xsequence/network@1.8.1 + - @0xsequence/relayer@1.8.1 + - @0xsequence/signhub@1.8.1 + - @0xsequence/utils@1.8.1 + +## 1.8.0 + +### Minor Changes + +- provider: project analytics + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.8.0 + - @0xsequence/core@1.8.0 + - @0xsequence/network@1.8.0 + - @0xsequence/relayer@1.8.0 + - @0xsequence/signhub@1.8.0 + - @0xsequence/utils@1.8.0 + +## 1.7.2 + +### Patch Changes + +- 0xsequence: ChainId should not be exported as a type +- account, wallet: fix nonce selection +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.7.2 + - @0xsequence/core@1.7.2 + - @0xsequence/network@1.7.2 + - @0xsequence/relayer@1.7.2 + - @0xsequence/signhub@1.7.2 + - @0xsequence/utils@1.7.2 + +## 1.7.1 + +### Patch Changes + +- network: add missing avalanche logoURI +- Updated dependencies + - @0xsequence/abi@1.7.1 + - @0xsequence/core@1.7.1 + - @0xsequence/network@1.7.1 + - @0xsequence/relayer@1.7.1 + - @0xsequence/signhub@1.7.1 + - @0xsequence/utils@1.7.1 + +## 1.7.0 + +### Minor Changes + +- provider: projectAccessKey is now required + +### Patch Changes + +- network: add NetworkMetadata.logoURI property for all networks +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.7.0 + - @0xsequence/core@1.7.0 + - @0xsequence/network@1.7.0 + - @0xsequence/relayer@1.7.0 + - @0xsequence/signhub@1.7.0 + - @0xsequence/utils@1.7.0 + +## 1.6.3 + +### Patch Changes + +- network list update +- Updated dependencies + - @0xsequence/abi@1.6.3 + - @0xsequence/core@1.6.3 + - @0xsequence/network@1.6.3 + - @0xsequence/relayer@1.6.3 + - @0xsequence/signhub@1.6.3 + - @0xsequence/utils@1.6.3 + +## 1.6.2 + +### Patch Changes + +- auth: projectAccessKey option +- wallet: use 12 bytes for random space +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.6.2 + - @0xsequence/core@1.6.2 + - @0xsequence/network@1.6.2 + - @0xsequence/relayer@1.6.2 + - @0xsequence/signhub@1.6.2 + - @0xsequence/utils@1.6.2 + +## 1.6.1 + +### Patch Changes + +- core: add simple config from subdigest support +- core: fix encode tree with subdigest +- account: implement buildOnChainSignature on Account +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.6.1 + - @0xsequence/core@1.6.1 + - @0xsequence/network@1.6.1 + - @0xsequence/relayer@1.6.1 + - @0xsequence/signhub@1.6.1 + - @0xsequence/utils@1.6.1 + +## 1.6.0 + +### Minor Changes + +- account, wallet: parallel transactions by default + +### Patch Changes + +- provider: emit disconnect on sign out +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.6.0 + - @0xsequence/core@1.6.0 + - @0xsequence/network@1.6.0 + - @0xsequence/relayer@1.6.0 + - @0xsequence/signhub@1.6.0 + - @0xsequence/utils@1.6.0 + +## 1.5.0 + +### Minor Changes + +- signhub: add 'signing' signer status + +### Patch Changes + +- auth: Session.open: onAccountAddress callback +- account: allow empty transaction bundles +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.5.0 + - @0xsequence/core@1.5.0 + - @0xsequence/network@1.5.0 + - @0xsequence/relayer@1.5.0 + - @0xsequence/signhub@1.5.0 + - @0xsequence/utils@1.5.0 + +## 1.4.9 + +### Patch Changes + +- rename SequenceMetadataClient to SequenceMetadata +- Updated dependencies + - @0xsequence/abi@1.4.9 + - @0xsequence/core@1.4.9 + - @0xsequence/network@1.4.9 + - @0xsequence/relayer@1.4.9 + - @0xsequence/signhub@1.4.9 + - @0xsequence/utils@1.4.9 + +## 1.4.8 + +### Patch Changes + +- account: Account.getSigners +- Updated dependencies + - @0xsequence/abi@1.4.8 + - @0xsequence/core@1.4.8 + - @0xsequence/network@1.4.8 + - @0xsequence/relayer@1.4.8 + - @0xsequence/signhub@1.4.8 + - @0xsequence/utils@1.4.8 + +## 1.4.7 + +### Patch Changes + +- update indexer client bindings +- Updated dependencies + - @0xsequence/abi@1.4.7 + - @0xsequence/core@1.4.7 + - @0xsequence/network@1.4.7 + - @0xsequence/relayer@1.4.7 + - @0xsequence/signhub@1.4.7 + - @0xsequence/utils@1.4.7 + +## 1.4.6 + +### Patch Changes + +- - add sepolia networks, mark goerli as deprecated + - update indexer client bindings +- Updated dependencies + - @0xsequence/abi@1.4.6 + - @0xsequence/core@1.4.6 + - @0xsequence/network@1.4.6 + - @0xsequence/relayer@1.4.6 + - @0xsequence/signhub@1.4.6 + - @0xsequence/utils@1.4.6 + +## 1.4.5 + +### Patch Changes + +- indexer/metadata: update client bindings +- auth: selectWallet with new address +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.4.5 + - @0xsequence/core@1.4.5 + - @0xsequence/network@1.4.5 + - @0xsequence/relayer@1.4.5 + - @0xsequence/signhub@1.4.5 + - @0xsequence/utils@1.4.5 + +## 1.4.4 + +### Patch Changes + +- indexer: update bindings +- auth: handle jwt expiry +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.4.4 + - @0xsequence/core@1.4.4 + - @0xsequence/network@1.4.4 + - @0xsequence/relayer@1.4.4 + - @0xsequence/signhub@1.4.4 + - @0xsequence/utils@1.4.4 + +## 1.4.3 + +### Patch Changes + +- guard: return active status from GuardSigner.getAuthMethods +- Updated dependencies + - @0xsequence/abi@1.4.3 + - @0xsequence/core@1.4.3 + - @0xsequence/network@1.4.3 + - @0xsequence/relayer@1.4.3 + - @0xsequence/signhub@1.4.3 + - @0xsequence/utils@1.4.3 + +## 1.4.2 + +### Patch Changes + +- guard: update bindings +- Updated dependencies + - @0xsequence/abi@1.4.2 + - @0xsequence/core@1.4.2 + - @0xsequence/network@1.4.2 + - @0xsequence/relayer@1.4.2 + - @0xsequence/signhub@1.4.2 + - @0xsequence/utils@1.4.2 + +## 1.4.1 + +### Patch Changes + +- network: remove unused networks +- signhub: orchestrator interface +- guard: auth methods interface +- guard: update bindings for pin and totp +- guard: no more retry logic +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.4.1 + - @0xsequence/core@1.4.1 + - @0xsequence/network@1.4.1 + - @0xsequence/relayer@1.4.1 + - @0xsequence/signhub@1.4.1 + - @0xsequence/utils@1.4.1 + +## 1.4.0 + +### Minor Changes + +- project access key support + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.4.0 + - @0xsequence/core@1.4.0 + - @0xsequence/network@1.4.0 + - @0xsequence/relayer@1.4.0 + - @0xsequence/signhub@1.4.0 + - @0xsequence/utils@1.4.0 + +## 1.3.0 + +### Minor Changes + +- signhub: account children + +### Patch Changes + +- guard: do not throw when building deploy transaction +- network: snowtrace.io -> subnets.avax.network/c-chain +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.3.0 + - @0xsequence/core@1.3.0 + - @0xsequence/network@1.3.0 + - @0xsequence/relayer@1.3.0 + - @0xsequence/signhub@1.3.0 + - @0xsequence/utils@1.3.0 + +## 1.2.9 + +### Patch Changes + +- account: AccountSigner.sendTransaction simulateForFeeOptions +- relayer: update bindings +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.2.9 + - @0xsequence/core@1.2.9 + - @0xsequence/network@1.2.9 + - @0xsequence/relayer@1.2.9 + - @0xsequence/signhub@1.2.9 + - @0xsequence/utils@1.2.9 + +## 1.2.8 + +### Patch Changes + +- rename X-Sequence-Token-Key header to X-Access-Key +- Updated dependencies + - @0xsequence/abi@1.2.8 + - @0xsequence/core@1.2.8 + - @0xsequence/network@1.2.8 + - @0xsequence/relayer@1.2.8 + - @0xsequence/signhub@1.2.8 + - @0xsequence/utils@1.2.8 + +## 1.2.7 + +### Patch Changes + +- add x-sequence-token-key to clients +- Updated dependencies + - @0xsequence/abi@1.2.7 + - @0xsequence/core@1.2.7 + - @0xsequence/network@1.2.7 + - @0xsequence/relayer@1.2.7 + - @0xsequence/signhub@1.2.7 + - @0xsequence/utils@1.2.7 + +## 1.2.6 + +### Patch Changes + +- Fix bind multicall provider +- Updated dependencies + - @0xsequence/abi@1.2.6 + - @0xsequence/core@1.2.6 + - @0xsequence/network@1.2.6 + - @0xsequence/relayer@1.2.6 + - @0xsequence/signhub@1.2.6 + - @0xsequence/utils@1.2.6 + +## 1.2.5 + +### Patch Changes + +- Multicall default configuration fixes +- Updated dependencies + - @0xsequence/abi@1.2.5 + - @0xsequence/core@1.2.5 + - @0xsequence/network@1.2.5 + - @0xsequence/relayer@1.2.5 + - @0xsequence/signhub@1.2.5 + - @0xsequence/utils@1.2.5 + +## 1.2.4 + +### Patch Changes + +- provider: Adding missing payment provider types to PaymentProviderOption +- provider: WalletRequestHandler.notifyChainChanged +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.2.4 + - @0xsequence/core@1.2.4 + - @0xsequence/network@1.2.4 + - @0xsequence/relayer@1.2.4 + - @0xsequence/signhub@1.2.4 + - @0xsequence/utils@1.2.4 + +## 1.2.3 + +### Patch Changes + +- auth, provider: connect to accept optional authorizeNonce +- Updated dependencies + - @0xsequence/abi@1.2.3 + - @0xsequence/core@1.2.3 + - @0xsequence/network@1.2.3 + - @0xsequence/relayer@1.2.3 + - @0xsequence/signhub@1.2.3 + - @0xsequence/utils@1.2.3 + +## 1.2.2 + +### Patch Changes + +- provider: allow createContract calls +- core: check for explicit zero address in contract deployments +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.2.2 + - @0xsequence/core@1.2.2 + - @0xsequence/network@1.2.2 + - @0xsequence/relayer@1.2.2 + - @0xsequence/signhub@1.2.2 + - @0xsequence/utils@1.2.2 + +## 1.2.1 + +### Patch Changes + +- auth: use sequence api chain id as reference chain id if available +- Updated dependencies + - @0xsequence/abi@1.2.1 + - @0xsequence/core@1.2.1 + - @0xsequence/network@1.2.1 + - @0xsequence/relayer@1.2.1 + - @0xsequence/signhub@1.2.1 + - @0xsequence/utils@1.2.1 + +## 1.2.0 + +### Minor Changes + +- split services from session, better local support + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.2.0 + - @0xsequence/core@1.2.0 + - @0xsequence/network@1.2.0 + - @0xsequence/relayer@1.2.0 + - @0xsequence/signhub@1.2.0 + - @0xsequence/utils@1.2.0 + +## 1.1.15 + +### Patch Changes + +- guard: remove error filtering +- Updated dependencies + - @0xsequence/abi@1.1.15 + - @0xsequence/core@1.1.15 + - @0xsequence/network@1.1.15 + - @0xsequence/relayer@1.1.15 + - @0xsequence/signhub@1.1.15 + - @0xsequence/utils@1.1.15 + +## 1.1.14 + +### Patch Changes + +- guard: add GuardSigner.onError +- Updated dependencies + - @0xsequence/abi@1.1.14 + - @0xsequence/core@1.1.14 + - @0xsequence/network@1.1.14 + - @0xsequence/relayer@1.1.14 + - @0xsequence/signhub@1.1.14 + - @0xsequence/utils@1.1.14 + +## 1.1.13 + +### Patch Changes + +- provider: pass client version with connect options +- provider: removing large from BannerSize +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.1.13 + - @0xsequence/core@1.1.13 + - @0xsequence/network@1.1.13 + - @0xsequence/relayer@1.1.13 + - @0xsequence/signhub@1.1.13 + - @0xsequence/utils@1.1.13 + +## 1.1.12 + +### Patch Changes + +- provider: adding bannerSize to ConnectOptions +- Updated dependencies + - @0xsequence/abi@1.1.12 + - @0xsequence/core@1.1.12 + - @0xsequence/network@1.1.12 + - @0xsequence/relayer@1.1.12 + - @0xsequence/signhub@1.1.12 + - @0xsequence/utils@1.1.12 + +## 1.1.11 + +### Patch Changes + +- add homeverse configs +- Updated dependencies + - @0xsequence/abi@1.1.11 + - @0xsequence/core@1.1.11 + - @0xsequence/network@1.1.11 + - @0xsequence/relayer@1.1.11 + - @0xsequence/signhub@1.1.11 + - @0xsequence/utils@1.1.11 + +## 1.1.10 + +### Patch Changes + +- handle default EIP6492 on send +- Updated dependencies + - @0xsequence/abi@1.1.10 + - @0xsequence/core@1.1.10 + - @0xsequence/network@1.1.10 + - @0xsequence/relayer@1.1.10 + - @0xsequence/signhub@1.1.10 + - @0xsequence/utils@1.1.10 + +## 1.1.9 + +### Patch Changes + +- Custom default EIP6492 on client +- Updated dependencies + - @0xsequence/abi@1.1.9 + - @0xsequence/core@1.1.9 + - @0xsequence/network@1.1.9 + - @0xsequence/relayer@1.1.9 + - @0xsequence/signhub@1.1.9 + - @0xsequence/utils@1.1.9 + +## 1.1.8 + +### Patch Changes + +- metadata: searchMetadata: add types filter +- Updated dependencies + - @0xsequence/abi@1.1.8 + - @0xsequence/core@1.1.8 + - @0xsequence/network@1.1.8 + - @0xsequence/relayer@1.1.8 + - @0xsequence/signhub@1.1.8 + - @0xsequence/utils@1.1.8 + +## 1.1.7 + +### Patch Changes + +- adding signInWith connect settings option to allow dapps to automatically login their users with a certain provider optimizing the normal authentication flow +- Updated dependencies + - @0xsequence/abi@1.1.7 + - @0xsequence/core@1.1.7 + - @0xsequence/network@1.1.7 + - @0xsequence/relayer@1.1.7 + - @0xsequence/signhub@1.1.7 + - @0xsequence/utils@1.1.7 + +## 1.1.6 + +### Patch Changes + +- metadata: searchMetadata: add chainID and excludeTokenMetadata filters +- Updated dependencies + - @0xsequence/abi@1.1.6 + - @0xsequence/core@1.1.6 + - @0xsequence/network@1.1.6 + - @0xsequence/relayer@1.1.6 + - @0xsequence/signhub@1.1.6 + - @0xsequence/utils@1.1.6 + +## 1.1.5 + +### Patch Changes + +- account: re-compute meta-transaction id for wallet deployment transactions +- Updated dependencies + - @0xsequence/abi@1.1.5 + - @0xsequence/core@1.1.5 + - @0xsequence/network@1.1.5 + - @0xsequence/relayer@1.1.5 + - @0xsequence/signhub@1.1.5 + - @0xsequence/utils@1.1.5 + +## 1.1.4 + +### Patch Changes + +- network: rename base-mainnet to base +- provider: override isDefaultChain with ConnectOptions.networkId if provided +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.1.4 + - @0xsequence/core@1.1.4 + - @0xsequence/network@1.1.4 + - @0xsequence/relayer@1.1.4 + - @0xsequence/signhub@1.1.4 + - @0xsequence/utils@1.1.4 + +## 1.1.3 + +### Patch Changes + +- provider: use network id from transport session +- provider: sign authorization using ConnectOptions.networkId if provided +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.1.3 + - @0xsequence/core@1.1.3 + - @0xsequence/network@1.1.3 + - @0xsequence/relayer@1.1.3 + - @0xsequence/signhub@1.1.3 + - @0xsequence/utils@1.1.3 + +## 1.1.2 + +### Patch Changes + +- provider: jsonrpc chain id fixes +- Updated dependencies + - @0xsequence/abi@1.1.2 + - @0xsequence/core@1.1.2 + - @0xsequence/network@1.1.2 + - @0xsequence/relayer@1.1.2 + - @0xsequence/signhub@1.1.2 + - @0xsequence/utils@1.1.2 + +## 1.1.1 + +### Patch Changes + +- network: add base mainnet and sepolia +- provider: reject toxic transaction requests +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.1.1 + - @0xsequence/core@1.1.1 + - @0xsequence/network@1.1.1 + - @0xsequence/relayer@1.1.1 + - @0xsequence/signhub@1.1.1 + - @0xsequence/utils@1.1.1 + +## 1.1.0 + +### Minor Changes + +- Refactor dapp facing provider + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.1.0 + - @0xsequence/core@1.1.0 + - @0xsequence/network@1.1.0 + - @0xsequence/relayer@1.1.0 + - @0xsequence/signhub@1.1.0 + - @0xsequence/utils@1.1.0 + +## 1.0.5 + +### Patch Changes + +- network: export network constants +- guard: use the correct global for fetch +- network: nova-explorer.arbitrum.io -> nova.arbiscan.io +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@1.0.5 + - @0xsequence/core@1.0.5 + - @0xsequence/network@1.0.5 + - @0xsequence/relayer@1.0.5 + - @0xsequence/signhub@1.0.5 + - @0xsequence/utils@1.0.5 + +## 1.0.4 + +### Patch Changes + +- provider: accept name or number for networkId +- Updated dependencies + - @0xsequence/abi@1.0.4 + - @0xsequence/core@1.0.4 + - @0xsequence/guard@1.0.4 + - @0xsequence/network@1.0.4 + - @0xsequence/relayer@1.0.4 + - @0xsequence/signhub@1.0.4 + - @0xsequence/utils@1.0.4 + +## 1.0.3 + +### Patch Changes + +- Simpler isValidSignature helpers +- Updated dependencies + - @0xsequence/abi@1.0.3 + - @0xsequence/core@1.0.3 + - @0xsequence/guard@1.0.3 + - @0xsequence/network@1.0.3 + - @0xsequence/relayer@1.0.3 + - @0xsequence/signhub@1.0.3 + - @0xsequence/utils@1.0.3 + +## 1.0.2 + +### Patch Changes + +- add extra signature validation utils methods +- Updated dependencies + - @0xsequence/abi@1.0.2 + - @0xsequence/core@1.0.2 + - @0xsequence/guard@1.0.2 + - @0xsequence/network@1.0.2 + - @0xsequence/relayer@1.0.2 + - @0xsequence/signhub@1.0.2 + - @0xsequence/utils@1.0.2 + +## 1.0.1 + +### Patch Changes + +- add homeverse testnet +- Updated dependencies + - @0xsequence/abi@1.0.1 + - @0xsequence/core@1.0.1 + - @0xsequence/guard@1.0.1 + - @0xsequence/network@1.0.1 + - @0xsequence/relayer@1.0.1 + - @0xsequence/signhub@1.0.1 + - @0xsequence/utils@1.0.1 + +## 1.0.0 + +### Major Changes + +- https://sequence.xyz/blog/sequence-wallet-light-state-sync-full-merkle-wallets + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@1.0.0 + - @0xsequence/core@1.0.0 + - @0xsequence/guard@1.0.0 + - @0xsequence/network@1.0.0 + - @0xsequence/relayer@1.0.0 + - @0xsequence/signhub@1.0.0 + - @0xsequence/utils@1.0.0 + +## 0.43.34 + +### Patch Changes + +- auth: no jwt for indexer +- Updated dependencies + - @0xsequence/abi@0.43.34 + - @0xsequence/config@0.43.34 + - @0xsequence/guard@0.43.34 + - @0xsequence/network@0.43.34 + - @0xsequence/relayer@0.43.34 + - @0xsequence/transactions@0.43.34 + - @0xsequence/utils@0.43.34 + +## 0.43.33 + +### Patch Changes + +- Adding onConnectOptionsChange handler to WalletRequestHandler +- Updated dependencies + - @0xsequence/abi@0.43.33 + - @0xsequence/config@0.43.33 + - @0xsequence/guard@0.43.33 + - @0xsequence/network@0.43.33 + - @0xsequence/relayer@0.43.33 + - @0xsequence/transactions@0.43.33 + - @0xsequence/utils@0.43.33 + +## 0.43.32 + +### Patch Changes + +- add Base Goerli network +- Updated dependencies + - @0xsequence/abi@0.43.32 + - @0xsequence/config@0.43.32 + - @0xsequence/guard@0.43.32 + - @0xsequence/network@0.43.32 + - @0xsequence/relayer@0.43.32 + - @0xsequence/transactions@0.43.32 + - @0xsequence/utils@0.43.32 + +## 0.43.31 + +### Patch Changes + +- remove AuxDataProvider, add promptSignInConnect +- Updated dependencies + - @0xsequence/abi@0.43.31 + - @0xsequence/config@0.43.31 + - @0xsequence/guard@0.43.31 + - @0xsequence/network@0.43.31 + - @0xsequence/relayer@0.43.31 + - @0xsequence/transactions@0.43.31 + - @0xsequence/utils@0.43.31 + +## 0.43.30 + +### Patch Changes + +- add arbitrum goerli testnet +- Updated dependencies + - @0xsequence/abi@0.43.30 + - @0xsequence/config@0.43.30 + - @0xsequence/guard@0.43.30 + - @0xsequence/network@0.43.30 + - @0xsequence/relayer@0.43.30 + - @0xsequence/transactions@0.43.30 + - @0xsequence/utils@0.43.30 + +## 0.43.29 + +### Patch Changes + +- provider: check availability of window object +- Updated dependencies + - @0xsequence/abi@0.43.29 + - @0xsequence/config@0.43.29 + - @0xsequence/guard@0.43.29 + - @0xsequence/network@0.43.29 + - @0xsequence/relayer@0.43.29 + - @0xsequence/transactions@0.43.29 + - @0xsequence/utils@0.43.29 + +## 0.43.28 + +### Patch Changes + +- update api bindings +- Updated dependencies + - @0xsequence/abi@0.43.28 + - @0xsequence/config@0.43.28 + - @0xsequence/guard@0.43.28 + - @0xsequence/network@0.43.28 + - @0xsequence/relayer@0.43.28 + - @0xsequence/transactions@0.43.28 + - @0xsequence/utils@0.43.28 + +## 0.43.27 + +### Patch Changes + +- Add rpc is sequence method +- Updated dependencies + - @0xsequence/abi@0.43.27 + - @0xsequence/config@0.43.27 + - @0xsequence/guard@0.43.27 + - @0xsequence/network@0.43.27 + - @0xsequence/relayer@0.43.27 + - @0xsequence/transactions@0.43.27 + - @0xsequence/utils@0.43.27 + +## 0.43.26 + +### Patch Changes + +- add zkevm url to enum +- Updated dependencies + - @0xsequence/abi@0.43.26 + - @0xsequence/config@0.43.26 + - @0xsequence/guard@0.43.26 + - @0xsequence/network@0.43.26 + - @0xsequence/relayer@0.43.26 + - @0xsequence/transactions@0.43.26 + - @0xsequence/utils@0.43.26 + +## 0.43.25 + +### Patch Changes + +- added polygon zkevm to mainnet networks +- Updated dependencies + - @0xsequence/abi@0.43.25 + - @0xsequence/config@0.43.25 + - @0xsequence/guard@0.43.25 + - @0xsequence/network@0.43.25 + - @0xsequence/relayer@0.43.25 + - @0xsequence/transactions@0.43.25 + - @0xsequence/utils@0.43.25 + +## 0.43.24 + +### Patch Changes + +- name change from zkevm to polygon-zkevm +- Updated dependencies + - @0xsequence/abi@0.43.24 + - @0xsequence/config@0.43.24 + - @0xsequence/guard@0.43.24 + - @0xsequence/network@0.43.24 + - @0xsequence/relayer@0.43.24 + - @0xsequence/transactions@0.43.24 + - @0xsequence/utils@0.43.24 + +## 0.43.23 + +### Patch Changes + +- update zkEVM name to Polygon zkEVM +- Updated dependencies + - @0xsequence/abi@0.43.23 + - @0xsequence/config@0.43.23 + - @0xsequence/guard@0.43.23 + - @0xsequence/network@0.43.23 + - @0xsequence/relayer@0.43.23 + - @0xsequence/transactions@0.43.23 + - @0xsequence/utils@0.43.23 + +## 0.43.22 + +### Patch Changes + +- add zkevm chain +- Updated dependencies + - @0xsequence/abi@0.43.22 + - @0xsequence/config@0.43.22 + - @0xsequence/guard@0.43.22 + - @0xsequence/network@0.43.22 + - @0xsequence/relayer@0.43.22 + - @0xsequence/transactions@0.43.22 + - @0xsequence/utils@0.43.22 + +## 0.43.21 + +### Patch Changes + +- api: update client bindings +- Updated dependencies + - @0xsequence/abi@0.43.21 + - @0xsequence/config@0.43.21 + - @0xsequence/guard@0.43.21 + - @0xsequence/network@0.43.21 + - @0xsequence/relayer@0.43.21 + - @0xsequence/transactions@0.43.21 + - @0xsequence/utils@0.43.21 + +## 0.43.20 + +### Patch Changes + +- indexer: update bindings +- Updated dependencies + - @0xsequence/abi@0.43.20 + - @0xsequence/config@0.43.20 + - @0xsequence/guard@0.43.20 + - @0xsequence/network@0.43.20 + - @0xsequence/relayer@0.43.20 + - @0xsequence/transactions@0.43.20 + - @0xsequence/utils@0.43.20 + +## 0.43.19 + +### Patch Changes + +- session proof update +- Updated dependencies + - @0xsequence/abi@0.43.19 + - @0xsequence/config@0.43.19 + - @0xsequence/guard@0.43.19 + - @0xsequence/network@0.43.19 + - @0xsequence/relayer@0.43.19 + - @0xsequence/transactions@0.43.19 + - @0xsequence/utils@0.43.19 + +## 0.43.18 + +### Patch Changes + +- rpc client global check, hardening +- Updated dependencies + - @0xsequence/abi@0.43.18 + - @0xsequence/config@0.43.18 + - @0xsequence/guard@0.43.18 + - @0xsequence/network@0.43.18 + - @0xsequence/relayer@0.43.18 + - @0xsequence/transactions@0.43.18 + - @0xsequence/utils@0.43.18 + +## 0.43.17 + +### Patch Changes + +- rpc clients, check of 'global' is defined +- Updated dependencies + - @0xsequence/abi@0.43.17 + - @0xsequence/config@0.43.17 + - @0xsequence/guard@0.43.17 + - @0xsequence/network@0.43.17 + - @0xsequence/relayer@0.43.17 + - @0xsequence/transactions@0.43.17 + - @0xsequence/utils@0.43.17 + +## 0.43.16 + +### Patch Changes + +- ethers peerDep to v5, update rpc client global use +- Updated dependencies + - @0xsequence/abi@0.43.16 + - @0xsequence/config@0.43.16 + - @0xsequence/guard@0.43.16 + - @0xsequence/network@0.43.16 + - @0xsequence/relayer@0.43.16 + - @0xsequence/transactions@0.43.16 + - @0xsequence/utils@0.43.16 + +## 0.43.15 + +### Patch Changes + +- - provider: expand receiver type on some util methods +- Updated dependencies + - @0xsequence/abi@0.43.15 + - @0xsequence/config@0.43.15 + - @0xsequence/guard@0.43.15 + - @0xsequence/network@0.43.15 + - @0xsequence/relayer@0.43.15 + - @0xsequence/transactions@0.43.15 + - @0xsequence/utils@0.43.15 + +## 0.43.14 + +### Patch Changes + +- bump +- Updated dependencies + - @0xsequence/abi@0.43.14 + - @0xsequence/config@0.43.14 + - @0xsequence/guard@0.43.14 + - @0xsequence/network@0.43.14 + - @0xsequence/relayer@0.43.14 + - @0xsequence/transactions@0.43.14 + - @0xsequence/utils@0.43.14 + +## 0.43.13 + +### Patch Changes + +- update rpc bindings +- Updated dependencies + - @0xsequence/abi@0.43.13 + - @0xsequence/config@0.43.13 + - @0xsequence/guard@0.43.13 + - @0xsequence/network@0.43.13 + - @0xsequence/relayer@0.43.13 + - @0xsequence/transactions@0.43.13 + - @0xsequence/utils@0.43.13 + +## 0.43.12 + +### Patch Changes + +- provider: single wallet init, and add new unregisterWallet() method +- Updated dependencies + - @0xsequence/abi@0.43.12 + - @0xsequence/config@0.43.12 + - @0xsequence/guard@0.43.12 + - @0xsequence/network@0.43.12 + - @0xsequence/relayer@0.43.12 + - @0xsequence/transactions@0.43.12 + - @0xsequence/utils@0.43.12 + +## 0.43.11 + +### Patch Changes + +- fix lockfiles +- re-add mocha type deleter +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.43.11 + - @0xsequence/config@0.43.11 + - @0xsequence/guard@0.43.11 + - @0xsequence/network@0.43.11 + - @0xsequence/relayer@0.43.11 + - @0xsequence/transactions@0.43.11 + - @0xsequence/utils@0.43.11 + +## 0.43.10 + +### Patch Changes + +- various improvements +- Updated dependencies + - @0xsequence/abi@0.43.10 + - @0xsequence/config@0.43.10 + - @0xsequence/guard@0.43.10 + - @0xsequence/network@0.43.10 + - @0xsequence/relayer@0.43.10 + - @0xsequence/transactions@0.43.10 + - @0xsequence/utils@0.43.10 + +## 0.43.9 + +### Patch Changes + +- update deps +- Updated dependencies + - @0xsequence/abi@0.43.9 + - @0xsequence/config@0.43.9 + - @0xsequence/guard@0.43.9 + - @0xsequence/network@0.43.9 + - @0xsequence/relayer@0.43.9 + - @0xsequence/transactions@0.43.9 + - @0xsequence/utils@0.43.9 + +## 0.43.8 + +### Patch Changes + +- network: JsonRpcProvider with caching +- Updated dependencies + - @0xsequence/abi@0.43.8 + - @0xsequence/config@0.43.8 + - @0xsequence/guard@0.43.8 + - @0xsequence/network@0.43.8 + - @0xsequence/relayer@0.43.8 + - @0xsequence/transactions@0.43.8 + - @0xsequence/utils@0.43.8 + +## 0.43.7 + +### Patch Changes + +- provider: fix wallet network init +- Updated dependencies + - @0xsequence/abi@0.43.7 + - @0xsequence/config@0.43.7 + - @0xsequence/guard@0.43.7 + - @0xsequence/network@0.43.7 + - @0xsequence/relayer@0.43.7 + - @0xsequence/transactions@0.43.7 + - @0xsequence/utils@0.43.7 + +## 0.43.6 + +### Patch Changes + +- metadatata: update rpc bindings +- Updated dependencies + - @0xsequence/abi@0.43.6 + - @0xsequence/config@0.43.6 + - @0xsequence/guard@0.43.6 + - @0xsequence/network@0.43.6 + - @0xsequence/relayer@0.43.6 + - @0xsequence/transactions@0.43.6 + - @0xsequence/utils@0.43.6 + +## 0.43.5 + +### Patch Changes + +- provider: do not set default network for connect messages +- provider: forward missing error message +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.43.5 + - @0xsequence/config@0.43.5 + - @0xsequence/guard@0.43.5 + - @0xsequence/network@0.43.5 + - @0xsequence/relayer@0.43.5 + - @0xsequence/transactions@0.43.5 + - @0xsequence/utils@0.43.5 + +## 0.43.4 + +### Patch Changes + +- no-change version bump to fix incorrectly tagged snapshot build +- Updated dependencies + - @0xsequence/abi@0.43.4 + - @0xsequence/config@0.43.4 + - @0xsequence/guard@0.43.4 + - @0xsequence/network@0.43.4 + - @0xsequence/relayer@0.43.4 + - @0xsequence/transactions@0.43.4 + - @0xsequence/utils@0.43.4 + +## 0.43.3 + +### Patch Changes + +- metadata: update bindings +- Updated dependencies + - @0xsequence/abi@0.43.3 + - @0xsequence/config@0.43.3 + - @0xsequence/guard@0.43.3 + - @0xsequence/network@0.43.3 + - @0xsequence/relayer@0.43.3 + - @0xsequence/transactions@0.43.3 + - @0xsequence/utils@0.43.3 + +## 0.43.2 + +### Patch Changes + +- provider: implement connectUnchecked +- Updated dependencies + - @0xsequence/abi@0.43.2 + - @0xsequence/config@0.43.2 + - @0xsequence/guard@0.43.2 + - @0xsequence/network@0.43.2 + - @0xsequence/relayer@0.43.2 + - @0xsequence/transactions@0.43.2 + - @0xsequence/utils@0.43.2 + +## 0.43.1 + +### Patch Changes + +- update to latest ethauth dep +- Updated dependencies + - @0xsequence/abi@0.43.1 + - @0xsequence/config@0.43.1 + - @0xsequence/guard@0.43.1 + - @0xsequence/network@0.43.1 + - @0xsequence/relayer@0.43.1 + - @0xsequence/transactions@0.43.1 + - @0xsequence/utils@0.43.1 + +## 0.43.0 + +### Minor Changes + +- move ethers to a peer dependency + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.43.0 + - @0xsequence/config@0.43.0 + - @0xsequence/guard@0.43.0 + - @0xsequence/network@0.43.0 + - @0xsequence/relayer@0.43.0 + - @0xsequence/transactions@0.43.0 + - @0xsequence/utils@0.43.0 + +## 0.42.10 + +### Patch Changes + +- add auxDataProvider +- Updated dependencies + - @0xsequence/abi@0.42.10 + - @0xsequence/config@0.42.10 + - @0xsequence/guard@0.42.10 + - @0xsequence/network@0.42.10 + - @0xsequence/relayer@0.42.10 + - @0xsequence/transactions@0.42.10 + - @0xsequence/utils@0.42.10 + +## 0.42.9 + +### Patch Changes + +- provider: add eip-191 exceptions +- Updated dependencies + - @0xsequence/abi@0.42.9 + - @0xsequence/config@0.42.9 + - @0xsequence/guard@0.42.9 + - @0xsequence/network@0.42.9 + - @0xsequence/relayer@0.42.9 + - @0xsequence/transactions@0.42.9 + - @0xsequence/utils@0.42.9 + +## 0.42.8 + +### Patch Changes + +- provider: skip setting intent origin if we're unity plugin +- Updated dependencies + - @0xsequence/abi@0.42.8 + - @0xsequence/config@0.42.8 + - @0xsequence/guard@0.42.8 + - @0xsequence/network@0.42.8 + - @0xsequence/relayer@0.42.8 + - @0xsequence/transactions@0.42.8 + - @0xsequence/utils@0.42.8 + +## 0.42.7 + +### Patch Changes + +- Add sign in options to connection settings +- Updated dependencies + - @0xsequence/abi@0.42.7 + - @0xsequence/config@0.42.7 + - @0xsequence/guard@0.42.7 + - @0xsequence/network@0.42.7 + - @0xsequence/relayer@0.42.7 + - @0xsequence/transactions@0.42.7 + - @0xsequence/utils@0.42.7 + +## 0.42.6 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/abi@0.42.6 + - @0xsequence/config@0.42.6 + - @0xsequence/guard@0.42.6 + - @0xsequence/network@0.42.6 + - @0xsequence/relayer@0.42.6 + - @0xsequence/transactions@0.42.6 + - @0xsequence/utils@0.42.6 + +## 0.42.5 + +### Patch Changes + +- relayer: don't treat missing receipt as hard failure +- Updated dependencies + - @0xsequence/abi@0.42.5 + - @0xsequence/config@0.42.5 + - @0xsequence/guard@0.42.5 + - @0xsequence/network@0.42.5 + - @0xsequence/relayer@0.42.5 + - @0xsequence/transactions@0.42.5 + - @0xsequence/utils@0.42.5 + +## 0.42.4 + +### Patch Changes + +- provider: add custom app protocol to connect options +- Updated dependencies + - @0xsequence/abi@0.42.4 + - @0xsequence/config@0.42.4 + - @0xsequence/guard@0.42.4 + - @0xsequence/network@0.42.4 + - @0xsequence/relayer@0.42.4 + - @0xsequence/transactions@0.42.4 + - @0xsequence/utils@0.42.4 + +## 0.42.3 + +### Patch Changes + +- update api bindings +- Updated dependencies + - @0xsequence/abi@0.42.3 + - @0xsequence/config@0.42.3 + - @0xsequence/guard@0.42.3 + - @0xsequence/network@0.42.3 + - @0xsequence/relayer@0.42.3 + - @0xsequence/transactions@0.42.3 + - @0xsequence/utils@0.42.3 + +## 0.42.2 + +### Patch Changes + +- disable rinkeby network +- Updated dependencies + - @0xsequence/abi@0.42.2 + - @0xsequence/config@0.42.2 + - @0xsequence/guard@0.42.2 + - @0xsequence/network@0.42.2 + - @0xsequence/relayer@0.42.2 + - @0xsequence/transactions@0.42.2 + - @0xsequence/utils@0.42.2 + +## 0.42.1 + +### Patch Changes + +- wallet: optional waitForReceipt parameter +- Updated dependencies + - @0xsequence/abi@0.42.1 + - @0xsequence/config@0.42.1 + - @0xsequence/guard@0.42.1 + - @0xsequence/network@0.42.1 + - @0xsequence/relayer@0.42.1 + - @0xsequence/transactions@0.42.1 + - @0xsequence/utils@0.42.1 + +## 0.42.0 + +### Minor Changes + +- relayer: estimateGasLimits -> simulate +- add simulator package + +### Patch Changes + +- transactions: fix flattenAuxTransactions +- provider: only filter nullish values +- provider: re-map transaction 'gas' back to 'gasLimit' +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.42.0 + - @0xsequence/config@0.42.0 + - @0xsequence/guard@0.42.0 + - @0xsequence/network@0.42.0 + - @0xsequence/relayer@0.42.0 + - @0xsequence/transactions@0.42.0 + - @0xsequence/utils@0.42.0 + +## 0.41.3 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/abi@0.41.3 + - @0xsequence/config@0.41.3 + - @0xsequence/guard@0.41.3 + - @0xsequence/network@0.41.3 + - @0xsequence/relayer@0.41.3 + - @0xsequence/transactions@0.41.3 + - @0xsequence/utils@0.41.3 + +## 0.41.2 + +### Patch Changes + +- api bindings update +- Updated dependencies + - @0xsequence/abi@0.41.2 + - @0xsequence/config@0.41.2 + - @0xsequence/guard@0.41.2 + - @0xsequence/network@0.41.2 + - @0xsequence/relayer@0.41.2 + - @0xsequence/transactions@0.41.2 + - @0xsequence/utils@0.41.2 + +## 0.41.1 + +### Patch Changes + +- update default networks +- Updated dependencies + - @0xsequence/abi@0.41.1 + - @0xsequence/config@0.41.1 + - @0xsequence/guard@0.41.1 + - @0xsequence/network@0.41.1 + - @0xsequence/relayer@0.41.1 + - @0xsequence/transactions@0.41.1 + - @0xsequence/utils@0.41.1 + +## 0.41.0 + +### Minor Changes + +- relayer: fix Relayer.wait() interface + + The interface for calling Relayer.wait() has changed. Instead of a single optional ill-defined timeout/delay parameter, there are three optional parameters, in order: + + - timeout: the maximum time to wait for the transaction receipt + - delay: the polling interval, i.e. the time to wait between requests + - maxFails: the maximum number of hard failures to tolerate before giving up + + Please update your codebase accordingly. + +- relayer: add optional waitForReceipt parameter to Relayer.relay + + The behaviour of Relayer.relay() was not well-defined with respect to whether or not it waited for a receipt. + This change allows the caller to specify whether to wait or not, with the default behaviour being to wait. + +### Patch Changes + +- relayer: wait receipt retry logic +- fix wrapped object error +- provider: forward delegateCall and revertOnError transaction fields +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.41.0 + - @0xsequence/config@0.41.0 + - @0xsequence/guard@0.41.0 + - @0xsequence/network@0.41.0 + - @0xsequence/relayer@0.41.0 + - @0xsequence/transactions@0.41.0 + - @0xsequence/utils@0.41.0 + +## 0.40.6 + +### Patch Changes + +- add arbitrum-nova chain +- Updated dependencies + - @0xsequence/abi@0.40.6 + - @0xsequence/config@0.40.6 + - @0xsequence/guard@0.40.6 + - @0xsequence/network@0.40.6 + - @0xsequence/relayer@0.40.6 + - @0xsequence/transactions@0.40.6 + - @0xsequence/utils@0.40.6 + +## 0.40.5 + +### Patch Changes + +- api: update bindings +- Updated dependencies + - @0xsequence/abi@0.40.5 + - @0xsequence/config@0.40.5 + - @0xsequence/guard@0.40.5 + - @0xsequence/network@0.40.5 + - @0xsequence/relayer@0.40.5 + - @0xsequence/transactions@0.40.5 + - @0xsequence/utils@0.40.5 + +## 0.40.4 + +### Patch Changes + +- add unreal transport +- Updated dependencies + - @0xsequence/abi@0.40.4 + - @0xsequence/config@0.40.4 + - @0xsequence/guard@0.40.4 + - @0xsequence/network@0.40.4 + - @0xsequence/relayer@0.40.4 + - @0xsequence/transactions@0.40.4 + - @0xsequence/utils@0.40.4 + +## 0.40.3 + +### Patch Changes + +- provider: fix MessageToSign message type +- Updated dependencies + - @0xsequence/abi@0.40.3 + - @0xsequence/config@0.40.3 + - @0xsequence/guard@0.40.3 + - @0xsequence/network@0.40.3 + - @0xsequence/relayer@0.40.3 + - @0xsequence/transactions@0.40.3 + - @0xsequence/utils@0.40.3 + +## 0.40.2 + +### Patch Changes + +- Wallet provider, loadSession method +- Updated dependencies + - @0xsequence/abi@0.40.2 + - @0xsequence/config@0.40.2 + - @0xsequence/guard@0.40.2 + - @0xsequence/network@0.40.2 + - @0xsequence/relayer@0.40.2 + - @0xsequence/transactions@0.40.2 + - @0xsequence/utils@0.40.2 + +## 0.40.1 + +### Patch Changes + +- export sequence.initWallet and sequence.getWallet +- Updated dependencies + - @0xsequence/abi@0.40.1 + - @0xsequence/config@0.40.1 + - @0xsequence/guard@0.40.1 + - @0xsequence/network@0.40.1 + - @0xsequence/relayer@0.40.1 + - @0xsequence/transactions@0.40.1 + - @0xsequence/utils@0.40.1 + +## 0.40.0 + +### Minor Changes + +- add sequence.initWallet(network, config) and sequence.getWallet() helper methods + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.40.0 + - @0xsequence/config@0.40.0 + - @0xsequence/guard@0.40.0 + - @0xsequence/network@0.40.0 + - @0xsequence/relayer@0.40.0 + - @0xsequence/transactions@0.40.0 + - @0xsequence/utils@0.40.0 + +## 0.39.6 + +### Patch Changes + +- indexer: update client bindings +- Updated dependencies + - @0xsequence/abi@0.39.6 + - @0xsequence/config@0.39.6 + - @0xsequence/guard@0.39.6 + - @0xsequence/network@0.39.6 + - @0xsequence/relayer@0.39.6 + - @0xsequence/transactions@0.39.6 + - @0xsequence/utils@0.39.6 + +## 0.39.5 + +### Patch Changes + +- provider: fix networkRpcUrl config option +- Updated dependencies + - @0xsequence/abi@0.39.5 + - @0xsequence/config@0.39.5 + - @0xsequence/guard@0.39.5 + - @0xsequence/network@0.39.5 + - @0xsequence/relayer@0.39.5 + - @0xsequence/transactions@0.39.5 + - @0xsequence/utils@0.39.5 + +## 0.39.4 + +### Patch Changes + +- api: update client bindings +- Updated dependencies + - @0xsequence/abi@0.39.4 + - @0xsequence/config@0.39.4 + - @0xsequence/guard@0.39.4 + - @0xsequence/network@0.39.4 + - @0xsequence/relayer@0.39.4 + - @0xsequence/transactions@0.39.4 + - @0xsequence/utils@0.39.4 + +## 0.39.3 + +### Patch Changes + +- add request method on Web3Provider +- Updated dependencies + - @0xsequence/abi@0.39.3 + - @0xsequence/config@0.39.3 + - @0xsequence/guard@0.39.3 + - @0xsequence/network@0.39.3 + - @0xsequence/relayer@0.39.3 + - @0xsequence/transactions@0.39.3 + - @0xsequence/utils@0.39.3 + +## 0.39.2 + +### Patch Changes + +- update umd name +- Updated dependencies + - @0xsequence/abi@0.39.2 + - @0xsequence/config@0.39.2 + - @0xsequence/guard@0.39.2 + - @0xsequence/network@0.39.2 + - @0xsequence/relayer@0.39.2 + - @0xsequence/transactions@0.39.2 + - @0xsequence/utils@0.39.2 + +## 0.39.1 + +### Patch Changes + +- add Aurora network +- add origin info for accountsChanged event to handle it per dapp +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.39.1 + - @0xsequence/config@0.39.1 + - @0xsequence/guard@0.39.1 + - @0xsequence/network@0.39.1 + - @0xsequence/relayer@0.39.1 + - @0xsequence/transactions@0.39.1 + - @0xsequence/utils@0.39.1 + +## 0.39.0 + +### Minor Changes + +- abstract window.localStorage to interface type + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.39.0 + - @0xsequence/config@0.39.0 + - @0xsequence/guard@0.39.0 + - @0xsequence/network@0.39.0 + - @0xsequence/relayer@0.39.0 + - @0xsequence/transactions@0.39.0 + - @0xsequence/utils@0.39.0 + +## 0.38.2 + +### Patch Changes + +- provider: add Settings.defaultPurchaseAmount +- Updated dependencies + - @0xsequence/abi@0.38.2 + - @0xsequence/config@0.38.2 + - @0xsequence/guard@0.38.2 + - @0xsequence/network@0.38.2 + - @0xsequence/relayer@0.38.2 + - @0xsequence/transactions@0.38.2 + - @0xsequence/utils@0.38.2 + +## 0.38.1 + +### Patch Changes + +- update api and metadata rpc bindings +- Updated dependencies + - @0xsequence/abi@0.38.1 + - @0xsequence/config@0.38.1 + - @0xsequence/guard@0.38.1 + - @0xsequence/network@0.38.1 + - @0xsequence/relayer@0.38.1 + - @0xsequence/transactions@0.38.1 + - @0xsequence/utils@0.38.1 + +## 0.38.0 + +### Minor Changes + +- api: update bindings, change TokenPrice interface +- bridge: remove @0xsequence/bridge package +- api: update bindings, rename ContractCallArg to TupleComponent + +### Patch Changes + +- Updated dependencies +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.38.0 + - @0xsequence/config@0.38.0 + - @0xsequence/guard@0.38.0 + - @0xsequence/network@0.38.0 + - @0xsequence/relayer@0.38.0 + - @0xsequence/transactions@0.38.0 + - @0xsequence/utils@0.38.0 + +## 0.37.1 + +### Patch Changes + +- Add back sortNetworks - Removing sorting was a breaking change for dapps on older versions which directly integrate sequence. +- Updated dependencies + - @0xsequence/abi@0.37.1 + - @0xsequence/config@0.37.1 + - @0xsequence/guard@0.37.1 + - @0xsequence/network@0.37.1 + - @0xsequence/relayer@0.37.1 + - @0xsequence/transactions@0.37.1 + - @0xsequence/utils@0.37.1 + +## 0.37.0 + +### Minor Changes + +- network related fixes and improvements +- api: bindings: exchange rate lookups + +### Patch Changes + +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.37.0 + - @0xsequence/config@0.37.0 + - @0xsequence/guard@0.37.0 + - @0xsequence/network@0.37.0 + - @0xsequence/relayer@0.37.0 + - @0xsequence/transactions@0.37.0 + - @0xsequence/utils@0.37.0 + +## 0.36.13 + +### Patch Changes + +- api: update bindings with new price endpoints +- Updated dependencies + - @0xsequence/abi@0.36.13 + - @0xsequence/config@0.36.13 + - @0xsequence/guard@0.36.13 + - @0xsequence/network@0.36.13 + - @0xsequence/relayer@0.36.13 + - @0xsequence/transactions@0.36.13 + - @0xsequence/utils@0.36.13 + +## 0.36.12 + +### Patch Changes + +- wallet: skip remote signers if not needed +- auth: check that signature meets threshold before requesting auth token +- Updated dependencies +- Updated dependencies + - @0xsequence/abi@0.36.12 + - @0xsequence/config@0.36.12 + - @0xsequence/guard@0.36.12 + - @0xsequence/network@0.36.12 + - @0xsequence/relayer@0.36.12 + - @0xsequence/transactions@0.36.12 + - @0xsequence/utils@0.36.12 + +## 0.36.11 + +### Patch Changes + +- Prefix EIP191 message on wallet-request-handler +- Updated dependencies + - @0xsequence/abi@0.36.11 + - @0xsequence/config@0.36.11 + - @0xsequence/guard@0.36.11 + - @0xsequence/network@0.36.11 + - @0xsequence/relayer@0.36.11 + - @0xsequence/transactions@0.36.11 + - @0xsequence/utils@0.36.11 + +## 0.36.10 + +### Patch Changes + +- support bannerUrl on connect +- Updated dependencies + - @0xsequence/abi@0.36.10 + - @0xsequence/config@0.36.10 + - @0xsequence/guard@0.36.10 + - @0xsequence/network@0.36.10 + - @0xsequence/relayer@0.36.10 + - @0xsequence/transactions@0.36.10 + - @0xsequence/utils@0.36.10 + +## 0.36.9 + +### Patch Changes + +- minor dev xp improvements +- Updated dependencies + - @0xsequence/abi@0.36.9 + - @0xsequence/config@0.36.9 + - @0xsequence/guard@0.36.9 + - @0xsequence/network@0.36.9 + - @0xsequence/relayer@0.36.9 + - @0xsequence/transactions@0.36.9 + - @0xsequence/utils@0.36.9 + +## 0.36.8 + +### Patch Changes + +- more connect options (theme, payment providers, funding currencies) +- Updated dependencies + - @0xsequence/abi@0.36.8 + - @0xsequence/config@0.36.8 + - @0xsequence/guard@0.36.8 + - @0xsequence/network@0.36.8 + - @0xsequence/relayer@0.36.8 + - @0xsequence/transactions@0.36.8 + - @0xsequence/utils@0.36.8 + +## 0.36.7 + +### Patch Changes + +- fix missing break +- Updated dependencies + - @0xsequence/abi@0.36.7 + - @0xsequence/config@0.36.7 + - @0xsequence/guard@0.36.7 + - @0xsequence/network@0.36.7 + - @0xsequence/relayer@0.36.7 + - @0xsequence/transactions@0.36.7 + - @0xsequence/utils@0.36.7 + +## 0.36.6 + +### Patch Changes + +- wallet_switchEthereumChain support +- Updated dependencies + - @0xsequence/abi@0.36.6 + - @0xsequence/config@0.36.6 + - @0xsequence/guard@0.36.6 + - @0xsequence/network@0.36.6 + - @0xsequence/relayer@0.36.6 + - @0xsequence/transactions@0.36.6 + - @0xsequence/utils@0.36.6 + +## 0.36.5 + +### Patch Changes + +- auth: bump ethauth to 0.7.0 + network, wallet: don't assume position of auth network in list + api/indexer/metadata: trim trailing slash on hostname, and add endpoint urls + relayer: Allow to specify local relayer transaction parameters like gas price or gas limit +- Updated dependencies + - @0xsequence/abi@0.36.5 + - @0xsequence/config@0.36.5 + - @0xsequence/guard@0.36.5 + - @0xsequence/network@0.36.5 + - @0xsequence/relayer@0.36.5 + - @0xsequence/transactions@0.36.5 + - @0xsequence/utils@0.36.5 + +## 0.36.4 + +### Patch Changes + +- Updating list of chain ids to include other ethereum compatible chains +- Updated dependencies + - @0xsequence/abi@0.36.4 + - @0xsequence/config@0.36.4 + - @0xsequence/guard@0.36.4 + - @0xsequence/network@0.36.4 + - @0xsequence/relayer@0.36.4 + - @0xsequence/transactions@0.36.4 + - @0xsequence/utils@0.36.4 + +## 0.36.3 + +### Patch Changes + +- provider: pass connect options to prompter methods +- Updated dependencies + - @0xsequence/abi@0.36.3 + - @0xsequence/config@0.36.3 + - @0xsequence/guard@0.36.3 + - @0xsequence/network@0.36.3 + - @0xsequence/relayer@0.36.3 + - @0xsequence/transactions@0.36.3 + - @0xsequence/utils@0.36.3 + +## 0.36.2 + +### Patch Changes + +- transactions: Setting target to 0x0 when empty to during SequenceTxAbiEncode +- Updated dependencies + - @0xsequence/abi@0.36.2 + - @0xsequence/config@0.36.2 + - @0xsequence/guard@0.36.2 + - @0xsequence/network@0.36.2 + - @0xsequence/relayer@0.36.2 + - @0xsequence/transactions@0.36.2 + - @0xsequence/utils@0.36.2 + +## 0.36.1 + +### Patch Changes + +- metadata: update client with more fields +- Updated dependencies + - @0xsequence/abi@0.36.1 + - @0xsequence/config@0.36.1 + - @0xsequence/guard@0.36.1 + - @0xsequence/network@0.36.1 + - @0xsequence/relayer@0.36.1 + - @0xsequence/transactions@0.36.1 + - @0xsequence/utils@0.36.1 + +## 0.36.0 + +### Minor Changes + +- relayer, wallet: fee quote support + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.36.0 + - @0xsequence/config@0.36.0 + - @0xsequence/guard@0.36.0 + - @0xsequence/network@0.36.0 + - @0xsequence/relayer@0.36.0 + - @0xsequence/transactions@0.36.0 + - @0xsequence/utils@0.36.0 + +## 0.35.12 + +### Patch Changes + +- provider: rename wallet.commands to wallet.utils +- Updated dependencies + - @0xsequence/abi@0.35.12 + - @0xsequence/config@0.35.12 + - @0xsequence/guard@0.35.12 + - @0xsequence/network@0.35.12 + - @0xsequence/relayer@0.35.12 + - @0xsequence/transactions@0.35.12 + - @0xsequence/utils@0.35.12 + +## 0.35.11 + +### Patch Changes + +- provider/utils: smoother message validation +- Updated dependencies + - @0xsequence/abi@0.35.11 + - @0xsequence/config@0.35.11 + - @0xsequence/guard@0.35.11 + - @0xsequence/network@0.35.11 + - @0xsequence/relayer@0.35.11 + - @0xsequence/transactions@0.35.11 + - @0xsequence/utils@0.35.11 + +## 0.35.10 + +### Patch Changes + +- upgrade deps +- Updated dependencies + - @0xsequence/abi@0.35.10 + - @0xsequence/config@0.35.10 + - @0xsequence/guard@0.35.10 + - @0xsequence/network@0.35.10 + - @0xsequence/relayer@0.35.10 + - @0xsequence/transactions@0.35.10 + - @0xsequence/utils@0.35.10 + +## 0.35.9 + +### Patch Changes + +- provider: window-transport override event handlers with new wallet instance +- Updated dependencies + - @0xsequence/abi@0.35.9 + - @0xsequence/config@0.35.9 + - @0xsequence/guard@0.35.9 + - @0xsequence/network@0.35.9 + - @0xsequence/relayer@0.35.9 + - @0xsequence/transactions@0.35.9 + - @0xsequence/utils@0.35.9 + +## 0.35.8 + +### Patch Changes + +- provider: async wallet sign in improvements +- Updated dependencies + - @0xsequence/abi@0.35.8 + - @0xsequence/config@0.35.8 + - @0xsequence/guard@0.35.8 + - @0xsequence/network@0.35.8 + - @0xsequence/relayer@0.35.8 + - @0xsequence/transactions@0.35.8 + - @0xsequence/utils@0.35.8 + +## 0.35.7 + +### Patch Changes + +- config: cache wallet configs +- Updated dependencies + - @0xsequence/abi@0.35.7 + - @0xsequence/config@0.35.7 + - @0xsequence/guard@0.35.7 + - @0xsequence/network@0.35.7 + - @0xsequence/relayer@0.35.7 + - @0xsequence/transactions@0.35.7 + - @0xsequence/utils@0.35.7 + +## 0.35.6 + +### Patch Changes + +- provider: support async signin of wallet request handler +- Updated dependencies + - @0xsequence/abi@0.35.6 + - @0xsequence/config@0.35.6 + - @0xsequence/guard@0.35.6 + - @0xsequence/network@0.35.6 + - @0xsequence/relayer@0.35.6 + - @0xsequence/transactions@0.35.6 + - @0xsequence/utils@0.35.6 + +## 0.35.5 + +### Patch Changes + +- wallet: skip threshold check during fee estimation +- Updated dependencies + - @0xsequence/abi@0.35.5 + - @0xsequence/config@0.35.5 + - @0xsequence/guard@0.35.5 + - @0xsequence/network@0.35.5 + - @0xsequence/relayer@0.35.5 + - @0xsequence/transactions@0.35.5 + - @0xsequence/utils@0.35.5 + +## 0.35.4 + +### Patch Changes + +- - browser extension mode, center window +- Updated dependencies + - @0xsequence/abi@0.35.4 + - @0xsequence/config@0.35.4 + - @0xsequence/guard@0.35.4 + - @0xsequence/network@0.35.4 + - @0xsequence/relayer@0.35.4 + - @0xsequence/transactions@0.35.4 + - @0xsequence/utils@0.35.4 + +## 0.35.3 + +### Patch Changes + +- - update window position when in browser extension mode +- Updated dependencies + - @0xsequence/abi@0.35.3 + - @0xsequence/config@0.35.3 + - @0xsequence/guard@0.35.3 + - @0xsequence/network@0.35.3 + - @0xsequence/relayer@0.35.3 + - @0xsequence/transactions@0.35.3 + - @0xsequence/utils@0.35.3 + +## 0.35.2 + +### Patch Changes + +- - provider: WindowMessageHandler accept optional windowHref +- Updated dependencies + - @0xsequence/abi@0.35.2 + - @0xsequence/config@0.35.2 + - @0xsequence/guard@0.35.2 + - @0xsequence/network@0.35.2 + - @0xsequence/relayer@0.35.2 + - @0xsequence/transactions@0.35.2 + - @0xsequence/utils@0.35.2 + +## 0.35.1 + +### Patch Changes + +- wallet: update config on undeployed too +- Updated dependencies + - @0xsequence/abi@0.35.1 + - @0xsequence/config@0.35.1 + - @0xsequence/guard@0.35.1 + - @0xsequence/network@0.35.1 + - @0xsequence/relayer@0.35.1 + - @0xsequence/transactions@0.35.1 + - @0xsequence/utils@0.35.1 + +## 0.35.0 + +### Minor Changes + +- - config: add buildStubSignature + - provider: add checks to signing cases for wallet deployment and config statuses + - provider: add prompt for wallet deployment + - relayer: add BaseRelayer.prependWalletDeploy + - relayer: add Relayer.feeOptions + - relayer: account for wallet deployment in fee estimation + - transactions: add fromTransactionish + - wallet: add Account.prependConfigUpdate + - wallet: add Account.getFeeOptions + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.35.0 + - @0xsequence/config@0.35.0 + - @0xsequence/guard@0.35.0 + - @0xsequence/network@0.35.0 + - @0xsequence/relayer@0.35.0 + - @0xsequence/transactions@0.35.0 + - @0xsequence/utils@0.35.0 + +## 0.34.0 + +### Minor Changes + +- - upgrade deps + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.34.0 + - @0xsequence/config@0.34.0 + - @0xsequence/guard@0.34.0 + - @0xsequence/network@0.34.0 + - @0xsequence/relayer@0.34.0 + - @0xsequence/transactions@0.34.0 + - @0xsequence/utils@0.34.0 + +## 0.33.3 + +### Patch Changes + +- wallet: fix Account.signTransactions + +## 0.33.2 + +### Patch Changes + +- Updated dependencies + - @0xsequence/transactions@0.33.2 + - @0xsequence/relayer@0.33.2 + +## 0.31.1 + +### Patch Changes + +- Updated dependencies + - @0xsequence/relayer@0.31.1 + +## 0.31.0 + +### Minor Changes + +- - upgrading to ethers v5.5 + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.31.0 + - @0xsequence/config@0.31.0 + - @0xsequence/guard@0.31.0 + - @0xsequence/network@0.31.0 + - @0xsequence/relayer@0.31.0 + - @0xsequence/transactions@0.31.0 + - @0xsequence/utils@0.31.0 + +## 0.30.0 + +### Minor Changes + +- - upgrade most deps + +### Patch Changes + +- Updated dependencies + - @0xsequence/abi@0.30.0 + - @0xsequence/config@0.30.0 + - @0xsequence/guard@0.30.0 + - @0xsequence/network@0.30.0 + - @0xsequence/relayer@0.30.0 + - @0xsequence/transactions@0.30.0 + - @0xsequence/utils@0.30.0 + +## 0.29.8 + +### Patch Changes + +- update api +- Updated dependencies [undefined] + - @0xsequence/abi@0.29.8 + - @0xsequence/config@0.29.8 + - @0xsequence/guard@0.29.8 + - @0xsequence/network@0.29.8 + - @0xsequence/relayer@0.29.8 + - @0xsequence/transactions@0.29.8 + - @0xsequence/utils@0.29.8 + +## 0.29.7 + +### Patch Changes + +- override ethers getChainId method + +## 0.29.6 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/network@0.29.6 + - @0xsequence/config@0.29.6 + - @0xsequence/transactions@0.29.6 + - @0xsequence/relayer@0.29.6 + +## 0.29.5 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/config@0.29.5 + - @0xsequence/relayer@0.29.5 + +## 0.29.2 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/relayer@0.29.2 + +## 0.29.0 + +### Minor Changes + +- major architectural changes in Sequence design + + - only one API instance, API is no longer a per-chain service + - separate per-chain indexer service, API no longer handles indexing + - single contract metadata service, API no longer serves metadata + + chaind package has been removed, indexer and metadata packages have been added + + stronger typing with new explicit ChainId type + + multicall fixes and improvements + + forbid "wait" transactions in sendTransactionBatch calls + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/config@0.29.0 + - @0xsequence/network@0.29.0 + - @0xsequence/relayer@0.29.0 + - @0xsequence/transactions@0.29.0 + - @0xsequence/abi@0.29.0 + - @0xsequence/utils@0.29.0 + +## 0.28.0 + +### Minor Changes + +- extension provider + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.28.0 + - @0xsequence/config@0.28.0 + - @0xsequence/guard@0.28.0 + - @0xsequence/network@0.28.0 + - @0xsequence/relayer@0.28.0 + - @0xsequence/transactions@0.28.0 + - @0xsequence/utils@0.28.0 + +## 0.27.2 + +### Patch Changes + +- add SignedTransactionsCallback + +## 0.27.1 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/relayer@0.27.1 + +## 0.27.0 + +### Minor Changes + +- Add requireFreshSigner lib to sessions + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.27.0 + - @0xsequence/config@0.27.0 + - @0xsequence/guard@0.27.0 + - @0xsequence/network@0.27.0 + - @0xsequence/relayer@0.27.0 + - @0xsequence/transactions@0.27.0 + - @0xsequence/utils@0.27.0 + +## 0.26.0 + +### Minor Changes + +- update relayer client bindings + provide the wallet's address for calls to SendMetaTxn + modify the semantics of Relayer.getNonce() to allow relayers to select nonce spaces for clients + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/relayer@0.26.0 + +## 0.25.1 + +### Patch Changes + +- Fix build typescrypt issue +- Updated dependencies [undefined] + - @0xsequence/abi@0.25.1 + - @0xsequence/config@0.25.1 + - @0xsequence/guard@0.25.1 + - @0xsequence/network@0.25.1 + - @0xsequence/relayer@0.25.1 + - @0xsequence/transactions@0.25.1 + - @0xsequence/utils@0.25.1 + +## 0.25.0 + +### Minor Changes + +- 10c8af8: Add estimator package + Fix multicall few calls bug + +### Patch Changes + +- Updated dependencies [10c8af8] + - @0xsequence/abi@0.25.0 + - @0xsequence/config@0.25.0 + - @0xsequence/guard@0.25.0 + - @0xsequence/network@0.25.0 + - @0xsequence/relayer@0.25.0 + - @0xsequence/transactions@0.25.0 + - @0xsequence/utils@0.25.0 + +## 0.24.1 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/relayer@0.24.1 + +## 0.24.0 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/relayer@0.24.0 + +## 0.23.0 + +### Minor Changes + +- - relayer: offer variety of gas fee options from the relayer service" + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.23.0 + - @0xsequence/config@0.23.0 + - @0xsequence/guard@0.23.0 + - @0xsequence/network@0.23.0 + - @0xsequence/relayer@0.23.0 + - @0xsequence/transactions@0.23.0 + - @0xsequence/utils@0.23.0 + +## 0.22.2 + +### Patch Changes + +- e1c109e: Fix authProof on expired sessions +- Updated dependencies [e1c109e] + - @0xsequence/abi@0.22.2 + - @0xsequence/config@0.22.2 + - @0xsequence/guard@0.22.2 + - @0xsequence/network@0.22.2 + - @0xsequence/relayer@0.22.2 + - @0xsequence/transactions@0.22.2 + - @0xsequence/utils@0.22.2 + +## 0.22.1 + +### Patch Changes + +- transport session cache +- Updated dependencies [undefined] + - @0xsequence/abi@0.22.1 + - @0xsequence/config@0.22.1 + - @0xsequence/guard@0.22.1 + - @0xsequence/network@0.22.1 + - @0xsequence/relayer@0.22.1 + - @0xsequence/transactions@0.22.1 + - @0xsequence/utils@0.22.1 + +## 0.22.0 + +### Minor Changes + +- e667b65: Expose all relayer options on networks + +### Patch Changes + +- Updated dependencies [e667b65] + - @0xsequence/abi@0.22.0 + - @0xsequence/network@0.22.0 + - @0xsequence/relayer@0.22.0 + - @0xsequence/utils@0.22.0 + - @0xsequence/config@0.22.0 + - @0xsequence/guard@0.22.0 + - @0xsequence/transactions@0.22.0 + +## 0.21.5 + +### Patch Changes + +- Give priority to metaTxnId returned by relayer +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.5 + - @0xsequence/config@0.21.5 + - @0xsequence/guard@0.21.5 + - @0xsequence/network@0.21.5 + - @0xsequence/relayer@0.21.5 + - @0xsequence/transactions@0.21.5 + - @0xsequence/utils@0.21.5 + +## 0.21.4 + +### Patch Changes + +- Add has enough signers method +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.4 + - @0xsequence/config@0.21.4 + - @0xsequence/guard@0.21.4 + - @0xsequence/network@0.21.4 + - @0xsequence/relayer@0.21.4 + - @0xsequence/transactions@0.21.4 + - @0xsequence/utils@0.21.4 + +## 0.21.3 + +### Patch Changes + +- add window session cache +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.3 + - @0xsequence/config@0.21.3 + - @0xsequence/guard@0.21.3 + - @0xsequence/network@0.21.3 + - @0xsequence/relayer@0.21.3 + - @0xsequence/transactions@0.21.3 + - @0xsequence/utils@0.21.3 + +## 0.21.2 + +### Patch Changes + +- exception handlind in relayer +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.2 + - @0xsequence/config@0.21.2 + - @0xsequence/guard@0.21.2 + - @0xsequence/network@0.21.2 + - @0xsequence/relayer@0.21.2 + - @0xsequence/transactions@0.21.2 + - @0xsequence/utils@0.21.2 + +## 0.21.1 + +### Patch Changes + +- config updates must not be revertOnError + +## 0.21.0 + +### Minor Changes + +- - fix gas estimation on wallets with large number of signers + - update to session handling and wallet config construction upon auth + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.21.0 + - @0xsequence/config@0.21.0 + - @0xsequence/guard@0.21.0 + - @0xsequence/network@0.21.0 + - @0xsequence/relayer@0.21.0 + - @0xsequence/transactions@0.21.0 + - @0xsequence/utils@0.21.0 + +## 0.19.3 + +### Patch Changes + +- jwtAuth visibility, package version sync +- Updated dependencies [undefined] + - @0xsequence/abi@0.19.3 + - @0xsequence/config@0.19.3 + - @0xsequence/guard@0.19.3 + - @0xsequence/network@0.19.3 + - @0xsequence/relayer@0.19.3 + - @0xsequence/transactions@0.19.3 + - @0xsequence/utils@0.19.3 + +## 0.19.2 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.19.2 + - @0xsequence/config@0.19.2 + - @0xsequence/relayer@0.19.2 + - @0xsequence/transactions@0.19.2 + +## 0.19.0 + +### Minor Changes + +- - provider, improve dapp / wallet transport io + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.19.0 + - @0xsequence/config@0.19.0 + - @0xsequence/guard@0.19.0 + - @0xsequence/network@0.19.0 + - @0xsequence/relayer@0.19.0 + - @0xsequence/transactions@0.19.0 + - @0xsequence/utils@0.19.0 + +## 0.18.0 + +### Minor Changes + +- relayer improvements and pending transaction handling + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.18.0 + - @0xsequence/config@0.18.0 + - @0xsequence/guard@0.18.0 + - @0xsequence/network@0.18.0 + - @0xsequence/relayer@0.18.0 + - @0xsequence/transactions@0.18.0 + - @0xsequence/utils@0.18.0 + +## 0.16.0 + +### Minor Changes + +- relayer as its own service separate from chaind + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.16.0 + - @0xsequence/config@0.16.0 + - @0xsequence/guard@0.16.0 + - @0xsequence/network@0.16.0 + - @0xsequence/relayer@0.16.0 + - @0xsequence/transactions@0.16.0 + - @0xsequence/utils@0.16.0 + +## 0.15.1 + +### Patch Changes + +- update api clients +- Updated dependencies [undefined] + - @0xsequence/abi@0.15.1 + - @0xsequence/config@0.15.1 + - @0xsequence/guard@0.15.1 + - @0xsequence/network@0.15.1 + - @0xsequence/relayer@0.15.1 + - @0xsequence/transactions@0.15.1 + - @0xsequence/utils@0.15.1 + +## 0.15.0 + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/relayer@0.15.0 + - @0xsequence/transactions@0.15.0 + +## 0.14.3 + +### Patch Changes + +- Fix 0xSequence relayer dependencies +- Updated dependencies [undefined] + - @0xsequence/abi@0.14.3 + - @0xsequence/config@0.14.3 + - @0xsequence/guard@0.14.3 + - @0xsequence/network@0.14.3 + - @0xsequence/relayer@0.14.3 + - @0xsequence/transactions@0.14.3 + - @0xsequence/utils@0.14.3 + +## 0.14.2 + +### Patch Changes + +- Add debug logs to rpc-relayer +- Updated dependencies [undefined] + - @0xsequence/abi@0.14.2 + - @0xsequence/config@0.14.2 + - @0xsequence/guard@0.14.2 + - @0xsequence/network@0.14.2 + - @0xsequence/relayer@0.14.2 + - @0xsequence/transactions@0.14.2 + - @0xsequence/utils@0.14.2 + +## 0.14.0 + +### Minor Changes + +- update sequence utils finder which includes optimization + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.14.0 + - @0xsequence/config@0.14.0 + - @0xsequence/guard@0.14.0 + - @0xsequence/network@0.14.0 + - @0xsequence/relayer@0.14.0 + - @0xsequence/transactions@0.14.0 + - @0xsequence/utils@0.14.0 + +## 0.13.0 + +### Minor Changes + +- Update SequenceUtils deployed contract + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.13.0 + - @0xsequence/config@0.13.0 + - @0xsequence/guard@0.13.0 + - @0xsequence/network@0.13.0 + - @0xsequence/relayer@0.13.0 + - @0xsequence/transactions@0.13.0 + - @0xsequence/utils@0.13.0 + +## 0.12.1 + +### Patch Changes + +- npm bump +- Updated dependencies [undefined] + - @0xsequence/abi@0.12.1 + - @0xsequence/config@0.12.1 + - @0xsequence/guard@0.12.1 + - @0xsequence/network@0.12.1 + - @0xsequence/relayer@0.12.1 + - @0xsequence/transactions@0.12.1 + - @0xsequence/utils@0.12.1 + +## 0.12.0 + +### Minor Changes + +- provider: improvements to window transport + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.12.0 + - @0xsequence/config@0.12.0 + - @0xsequence/guard@0.12.0 + - @0xsequence/network@0.12.0 + - @0xsequence/relayer@0.12.0 + - @0xsequence/transactions@0.12.0 + - @0xsequence/utils@0.12.0 + +## 0.11.4 + +### Patch Changes + +- update api client +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.4 + - @0xsequence/config@0.11.4 + - @0xsequence/guard@0.11.4 + - @0xsequence/network@0.11.4 + - @0xsequence/relayer@0.11.4 + - @0xsequence/transactions@0.11.4 + - @0xsequence/utils@0.11.4 + +## 0.11.3 + +### Patch Changes + +- improve openWindow state options handling +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.3 + - @0xsequence/config@0.11.3 + - @0xsequence/guard@0.11.3 + - @0xsequence/network@0.11.3 + - @0xsequence/relayer@0.11.3 + - @0xsequence/transactions@0.11.3 + - @0xsequence/utils@0.11.3 + +## 0.11.2 + +### Patch Changes + +- Fix multicall proxy scopes +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.2 + - @0xsequence/config@0.11.2 + - @0xsequence/guard@0.11.2 + - @0xsequence/network@0.11.2 + - @0xsequence/relayer@0.11.2 + - @0xsequence/transactions@0.11.2 + - @0xsequence/utils@0.11.2 + +## 0.11.1 + +### Patch Changes + +- Add support for dynamic and nested signatures +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.1 + - @0xsequence/config@0.11.1 + - @0xsequence/guard@0.11.1 + - @0xsequence/network@0.11.1 + - @0xsequence/relayer@0.11.1 + - @0xsequence/transactions@0.11.1 + - @0xsequence/utils@0.11.1 + +## 0.11.0 + +### Minor Changes + +- Update wallet context to 1.7 contracts + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.11.0 + - @0xsequence/config@0.11.0 + - @0xsequence/guard@0.11.0 + - @0xsequence/network@0.11.0 + - @0xsequence/relayer@0.11.0 + - @0xsequence/transactions@0.11.0 + - @0xsequence/utils@0.11.0 + +## 0.10.9 + +### Patch Changes + +- add support for public addresses as signers in session.open +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.9 + - @0xsequence/config@0.10.9 + - @0xsequence/guard@0.10.9 + - @0xsequence/network@0.10.9 + - @0xsequence/relayer@0.10.9 + - @0xsequence/transactions@0.10.9 + - @0xsequence/utils@0.10.9 + +## 0.10.8 + +### Patch Changes + +- Multicall production configuration +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.8 + - @0xsequence/config@0.10.8 + - @0xsequence/guard@0.10.8 + - @0xsequence/network@0.10.8 + - @0xsequence/relayer@0.10.8 + - @0xsequence/transactions@0.10.8 + - @0xsequence/utils@0.10.8 + +## 0.10.7 + +### Patch Changes + +- allow provider transport to force disconnect +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.7 + - @0xsequence/config@0.10.7 + - @0xsequence/guard@0.10.7 + - @0xsequence/network@0.10.7 + - @0xsequence/relayer@0.10.7 + - @0xsequence/transactions@0.10.7 + - @0xsequence/utils@0.10.7 + +## 0.10.6 + +### Patch Changes + +- - fix getWalletState method +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.6 + - @0xsequence/config@0.10.6 + - @0xsequence/guard@0.10.6 + - @0xsequence/network@0.10.6 + - @0xsequence/relayer@0.10.6 + - @0xsequence/transactions@0.10.6 + - @0xsequence/utils@0.10.6 + +## 0.10.5 + +### Patch Changes + +- update relayer gas refund options +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.5 + - @0xsequence/config@0.10.5 + - @0xsequence/guard@0.10.5 + - @0xsequence/network@0.10.5 + - @0xsequence/relayer@0.10.5 + - @0xsequence/transactions@0.10.5 + - @0xsequence/utils@0.10.5 + +## 0.10.4 + +### Patch Changes + +- Update api proto +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.4 + - @0xsequence/config@0.10.4 + - @0xsequence/guard@0.10.4 + - @0xsequence/network@0.10.4 + - @0xsequence/relayer@0.10.4 + - @0xsequence/transactions@0.10.4 + - @0xsequence/utils@0.10.4 + +## 0.10.3 + +### Patch Changes + +- Fix loading config cross-chain +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.3 + - @0xsequence/config@0.10.3 + - @0xsequence/guard@0.10.3 + - @0xsequence/network@0.10.3 + - @0xsequence/relayer@0.10.3 + - @0xsequence/transactions@0.10.3 + - @0xsequence/utils@0.10.3 + +## 0.10.2 + +### Patch Changes + +- - message digest fix +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.2 + - @0xsequence/config@0.10.2 + - @0xsequence/guard@0.10.2 + - @0xsequence/network@0.10.2 + - @0xsequence/relayer@0.10.2 + - @0xsequence/transactions@0.10.2 + - @0xsequence/utils@0.10.2 + +## 0.10.1 + +### Patch Changes + +- upgrade deps +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.1 + - @0xsequence/config@0.10.1 + - @0xsequence/guard@0.10.1 + - @0xsequence/network@0.10.1 + - @0xsequence/relayer@0.10.1 + - @0xsequence/transactions@0.10.1 + - @0xsequence/utils@0.10.1 + +## 0.10.0 + +### Minor Changes + +- Deployed new contracts with ERC1271 signer support + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.10.0 + - @0xsequence/config@0.10.0 + - @0xsequence/guard@0.10.0 + - @0xsequence/network@0.10.0 + - @0xsequence/relayer@0.10.0 + - @0xsequence/transactions@0.10.0 + - @0xsequence/utils@0.10.0 + +## 0.9.6 + +### Patch Changes + +- Update ABIs for latest sequence contracts +- Updated dependencies [undefined] + - @0xsequence/config@0.9.6 + - @0xsequence/network@0.9.6 + - @0xsequence/relayer@0.9.6 + - @0xsequence/transactions@0.9.6 + - @0xsequence/utils@0.9.6 + - @0xsequence/abi@0.9.6 + - @0xsequence/guard@0.9.6 + +## 0.9.5 + +### Patch Changes + +- Implemented session class +- Updated dependencies [undefined] + - @0xsequence/config@0.9.5 + - @0xsequence/network@0.9.5 + - @0xsequence/relayer@0.9.5 + - @0xsequence/transactions@0.9.5 + - @0xsequence/utils@0.9.5 + +## 0.9.3 + +### Patch Changes + +- - minor improvements +- Updated dependencies [undefined] + - @0xsequence/abi@0.9.3 + - @0xsequence/config@0.9.3 + - @0xsequence/guard@0.9.3 + - @0xsequence/network@0.9.3 + - @0xsequence/relayer@0.9.3 + - @0xsequence/transactions@0.9.3 + - @0xsequence/utils@0.9.3 + +## 0.9.1 + +### Patch Changes + +- - patch bump +- Updated dependencies [undefined] + - @0xsequence/abi@0.9.1 + - @0xsequence/api@0.9.1 + - @0xsequence/config@0.9.1 + - @0xsequence/guard@0.9.1 + - @0xsequence/network@0.9.1 + - @0xsequence/relayer@0.9.1 + - @0xsequence/transactions@0.9.1 + - @0xsequence/utils@0.9.1 + +## 0.9.0 + +### Minor Changes + +- - provider transport hardening + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/api@0.9.0 + - @0xsequence/abi@0.9.0 + - @0xsequence/config@0.9.0 + - @0xsequence/guard@0.9.0 + - @0xsequence/network@0.9.0 + - @0xsequence/relayer@0.9.0 + - @0xsequence/transactions@0.9.0 + - @0xsequence/utils@0.9.0 + +## 0.8.5 + +### Patch Changes + +- - use latest wallet-contracts +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.5 + - @0xsequence/api@0.8.5 + - @0xsequence/config@0.8.5 + - @0xsequence/guard@0.8.5 + - @0xsequence/network@0.8.5 + - @0xsequence/relayer@0.8.5 + - @0xsequence/transactions@0.8.5 + - @0xsequence/utils@0.8.5 + +## 0.8.4 + +### Patch Changes + +- - minor improvements, name updates and comments +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.4 + - @0xsequence/api@0.8.4 + - @0xsequence/config@0.8.4 + - @0xsequence/guard@0.8.4 + - @0xsequence/network@0.8.4 + - @0xsequence/relayer@0.8.4 + - @0xsequence/transactions@0.8.4 + - @0xsequence/utils@0.8.4 + +## 0.8.3 + +### Patch Changes + +- - refinements + + - normalize signer address in config + + - provider: getWalletState() method to WalletProvider + +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.3 + - @0xsequence/api@0.8.3 + - @0xsequence/config@0.8.3 + - @0xsequence/guard@0.8.3 + - @0xsequence/network@0.8.3 + - @0xsequence/relayer@0.8.3 + - @0xsequence/transactions@0.8.3 + - @0xsequence/utils@0.8.3 + +## 0.8.2 + +### Patch Changes + +- - field rename and ethauth dependency bump +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.2 + - @0xsequence/api@0.8.2 + - @0xsequence/config@0.8.2 + - @0xsequence/guard@0.8.2 + - @0xsequence/network@0.8.2 + - @0xsequence/relayer@0.8.2 + - @0xsequence/transactions@0.8.2 + - @0xsequence/utils@0.8.2 + +## 0.8.1 + +### Patch Changes + +- - variety of optimizations +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.1 + - @0xsequence/api@0.8.1 + - @0xsequence/config@0.8.1 + - @0xsequence/guard@0.8.1 + - @0xsequence/network@0.8.1 + - @0xsequence/relayer@0.8.1 + - @0xsequence/transactions@0.8.1 + - @0xsequence/utils@0.8.1 + +## 0.8.0 + +### Minor Changes + +- - changeset fix + +### Patch Changes + +- Updated dependencies [undefined] + - @0xsequence/abi@0.8.0 + - @0xsequence/api@0.8.0 + - @0xsequence/config@0.8.0 + - @0xsequence/guard@0.8.0 + - @0xsequence/network@0.8.0 + - @0xsequence/relayer@0.8.0 + - @0xsequence/transactions@0.8.0 + - @0xsequence/utils@0.8.0 + +## 0.7.1 + +### Patch Changes + +- 02377ab: Minor improvements +- Updated dependencies [02377ab] +- Updated dependencies [1fe4379] + - @0xsequence/network@0.7.1 + - @0xsequence/relayer@0.7.1 + - @0xsequence/utils@0.7.1 + +## 0.7.0 + +### Patch Changes + +- 6f11ed7: sequence.js, init release +- Updated dependencies [6f11ed7] + - @0xsequence/abi@0.7.0 + - @0xsequence/api@0.7.0 + - @0xsequence/config@0.7.0 + - @0xsequence/guard@0.7.0 + - @0xsequence/network@0.7.0 + - @0xsequence/relayer@0.7.0 + - @0xsequence/transactions@0.7.0 + - @0xsequence/utils@0.7.0 diff --git a/packages/wallet/README.md b/packages/wallet/README.md new file mode 100644 index 000000000..19321e9f2 --- /dev/null +++ b/packages/wallet/README.md @@ -0,0 +1,4 @@ +@0xsequence/wallet +================== + +See [0xsequence project page](https://github.com/0xsequence/sequence.js). diff --git a/packages/wallet/hardhat.config.js b/packages/wallet/hardhat.config.js new file mode 100644 index 000000000..65a997e19 --- /dev/null +++ b/packages/wallet/hardhat.config.js @@ -0,0 +1,11 @@ + +module.exports = { + networks: { + hardhat: { + chainId: 31337, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + } + }, + } +} diff --git a/packages/wallet/hardhat2.config.js b/packages/wallet/hardhat2.config.js new file mode 100644 index 000000000..e984fc2e7 --- /dev/null +++ b/packages/wallet/hardhat2.config.js @@ -0,0 +1,11 @@ + +module.exports = { + networks: { + hardhat: { + chainId: 31338, + accounts: { + mnemonic: 'ripple axis someone ridge uniform wrist prosper there frog rate olympic knee' + } + } + } +} diff --git a/packages/wallet/src/index.ts b/packages/wallet/src/index.ts new file mode 100644 index 000000000..e40a936c0 --- /dev/null +++ b/packages/wallet/src/index.ts @@ -0,0 +1,5 @@ +export * from './signer' +export * from './utils' +export * from './wallet' + +export * from './orchestrator/wrapper' diff --git a/packages/wallet/src/orchestrator/wrapper.ts b/packages/wallet/src/orchestrator/wrapper.ts new file mode 100644 index 000000000..04b306122 --- /dev/null +++ b/packages/wallet/src/orchestrator/wrapper.ts @@ -0,0 +1,46 @@ +import { commons } from '@0xsequence/core' +import { signers, Status } from '@0xsequence/signhub' +import { ethers } from 'ethers' +import { Wallet } from '../wallet' + +// Implements a wrapper for using Sequence wallets as nested signers +// in the signhub orchestrator. It only works for nested signatures. +export class SequenceOrchestratorWrapper implements signers.SapientSigner { + constructor(public wallet: Wallet) {} + + async getAddress(): Promise { + return this.wallet.address + } + + async buildDeployTransaction(metadata: object): Promise { + return this.wallet.buildDeployTransaction(metadata as commons.WalletDeployMetadata | undefined) + } + + async predecorateSignedTransactions(_metadata: object): Promise { + // Wallets do not predecorate as they have no off chain knowledge + return [] + } + + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle, + _metadata: object + ): Promise { + return this.wallet.decorateTransactions(bundle) + } + + sign(message: ethers.utils.BytesLike, metadata: object): Promise { + if (!commons.isWalletSignRequestMetadata(metadata)) { + throw new Error('SequenceOrchestratorWrapper only supports nested Sequence signatures') + } + + // For Sequence nested signatures we must use `signDigest` and not `signMessage` + // otherwise the wallet will hash the digest and the signature will be invalid. + return this.wallet.signDigest(message, { nested: metadata }) + } + + notifyStatusChange(_i: string, _s: Status, _m: object): void {} + + suffix(): ethers.utils.BytesLike { + return [3] + } +} diff --git a/packages/wallet/src/signer.ts b/packages/wallet/src/signer.ts new file mode 100644 index 000000000..5d8ef9b0b --- /dev/null +++ b/packages/wallet/src/signer.ts @@ -0,0 +1,96 @@ +import { BytesLike, Signer as AbstractSigner, providers, TypedDataDomain, TypedDataField, ethers } from 'ethers' +import { NetworkConfig, ChainIdLike } from '@0xsequence/network' +import { FeeQuote, Relayer } from '@0xsequence/relayer' +import { Deferrable } from '@0xsequence/utils' +import { commons } from '@0xsequence/core' + +// TODO: Move to account ? +export abstract class Signer extends AbstractSigner { + static isSequenceSigner(cand: any): cand is Signer { + return isSequenceSigner(cand) + } + + abstract getProvider(chainId?: number): Promise + abstract getRelayer(chainId?: number): Promise + + // abstract getWalletContext(): Promise + abstract getWalletConfig(chainId?: ChainIdLike): Promise + // abstract getWalletState(chainId?: ChainIdLike): Promise + + abstract getNetworks(): Promise + + // getSigners returns a list of available / attached signers to the interface. Note: you need + // enough signers in order to meet the signing threshold that satisfies a wallet config. + abstract getSigners(): Promise + + // signMessage ..... + abstract signMessage(message: BytesLike, chainId?: ChainIdLike, allSigners?: boolean, isDigest?: boolean): Promise + + // signTypedData .. + abstract signTypedData( + domain: TypedDataDomain, + types: Record>, + message: Record, + chainId: ChainIdLike, + allSigners?: boolean + ): Promise + + // sendTransaction takes an unsigned transaction, or list of unsigned transactions, and then has it signed by + // the signer, and finally sends it to the relayer for submission to an Ethereum network. + abstract sendTransaction( + transaction: Deferrable, + chainId?: ChainIdLike, + allSigners?: boolean, + quote?: FeeQuote + ): Promise + + // sendTransactionBatch provides the ability to send an array/batch of transactions as a single native on-chain transaction. + // This method works identically to sendTransaction but offers a different syntax for convience, readability and type clarity. + abstract sendTransactionBatch( + transactions: Deferrable, + chainId?: ChainIdLike, + allSigners?: boolean, + quote?: FeeQuote + ): Promise + + // Low-level methods to sign and send/relayer signed transactions separately. The combination of these methods + // is like calling just sendTransaction(..) above. Also note that sendSignedTransactions is identical + // to calling getRelayer().relay(signedTxs), but included in this interface for convenience. + abstract signTransactions( + txs: Deferrable, + chainId?: ChainIdLike, + allSigners?: boolean + ): Promise + abstract sendSignedTransactions( + signedTxs: commons.transaction.SignedTransactionBundle, + chainId?: ChainIdLike, + quote?: FeeQuote + ): Promise + + // updateConfig will update the wallet image hash on-chain, aka deploying a smart wallet config to chain. If + // newConfig argument is undefined, then it will use the existing config. Config contents will also be + // automatically published to the authChain when updating the config image hash. + abstract updateConfig( + newConfig?: commons.config.Config + ): Promise<[commons.config.Config, commons.transaction.TransactionResponse | undefined]> + + // publishConfig will store the raw WalletConfig object on-chain, note: this may be expensive, + // and is only necessary for config data-availability, in case of Account the contents are published + // to the authChain. + abstract publishConfig(): Promise + + // isDeployed .. + abstract isDeployed(chainId?: ChainIdLike): Promise +} + +export type SignedTransactionsCallback = (signedTxs: commons.transaction.SignedTransactionBundle, metaTxnHash: string) => void + +export function isSequenceSigner(signer: AbstractSigner): signer is Signer { + const cand = signer as Signer + return cand && cand.updateConfig !== undefined && cand.publishConfig !== undefined && cand.getWalletConfig !== undefined +} + +// TODO: move to error.ts, along with others.. +export class InvalidSigner extends Error {} + +export class NotEnoughSigners extends Error {} diff --git a/packages/wallet/src/utils.ts b/packages/wallet/src/utils.ts new file mode 100644 index 000000000..52a855ed1 --- /dev/null +++ b/packages/wallet/src/utils.ts @@ -0,0 +1,31 @@ +import { ethers, utils } from 'ethers' + +export async function resolveArrayProperties( + object: Readonly> | Readonly>[] +): Promise { + if (Array.isArray(object)) { + // T must include array type + return Promise.all(object.map(o => utils.resolveProperties(o))) as any + } + + return utils.resolveProperties(object) +} + +export async function findLatestLog( + provider: ethers.providers.Provider, + filter: ethers.providers.Filter +): Promise { + const toBlock = filter.toBlock === 'latest' ? await provider.getBlockNumber() : (filter.toBlock as number) + const fromBlock = filter.fromBlock as number + + try { + const logs = await provider.getLogs({ ...filter, toBlock: toBlock }) + return logs.length === 0 ? undefined : logs[logs.length - 1] + } catch (e) { + // TODO Don't assume all errors are bad + const pivot = Math.floor((toBlock - fromBlock) / 2 + fromBlock) + const nhalf = await findLatestLog(provider, { ...filter, fromBlock: pivot, toBlock: toBlock }) + if (nhalf !== undefined) return nhalf + return findLatestLog(provider, { ...filter, fromBlock: fromBlock, toBlock: pivot }) + } +} diff --git a/packages/wallet/src/wallet.ts b/packages/wallet/src/wallet.ts new file mode 100644 index 000000000..57c7c33bd --- /dev/null +++ b/packages/wallet/src/wallet.ts @@ -0,0 +1,438 @@ +import { ethers } from 'ethers' +import { commons, v1, v2 } from '@0xsequence/core' +import { SignatureOrchestrator, SignerState, Status } from '@0xsequence/signhub' +import { Deferrable, subDigestOf } from '@0xsequence/utils' +import { FeeQuote, Relayer } from '@0xsequence/relayer' +import { walletContracts } from '@0xsequence/abi' + +import { resolveArrayProperties } from './utils' + +export type WalletOptions< + T extends commons.signature.Signature, + Y extends commons.config.Config, + Z extends commons.signature.UnrecoveredSignature +> = { + // Sequence version configurator + coders: { + config: commons.config.ConfigCoder + signature: commons.signature.SignatureCoder + } + + context: commons.context.WalletContext + config: Y + + chainId: ethers.BigNumberish + address: string + + orchestrator: SignatureOrchestrator + reader?: commons.reader.Reader + + provider?: ethers.providers.Provider + relayer?: Relayer +} + +const statusToSignatureParts = (status: Status) => { + const parts = new Map() + + for (const signer of Object.keys(status.signers)) { + const value = status.signers[signer] + if (value.state === SignerState.SIGNED) { + const suffix = ethers.utils.arrayify(value.suffix) + const suffixed = ethers.utils.solidityPack(['bytes', 'bytes'], [value.signature, suffix]) + + parts.set(signer, { signature: suffixed, isDynamic: suffix.length !== 1 || suffix[0] !== 2 }) + } + } + + return parts +} + +export type WalletV2 = Wallet +export type WalletV1 = Wallet + +/** + * The wallet is the minimum interface to interact with a single Sequence wallet/contract. + * it doesn't have any knowledge of any on-chain state, instead it relies solely on the information + * provided by the user. This building block is used to create higher level abstractions. + * + * Wallet can also be used to create Sequence wallets, but it's not recommended to use it directly. + */ +export class Wallet< + Y extends commons.config.Config = commons.config.Config, + T extends commons.signature.Signature = commons.signature.Signature, + Z extends commons.signature.UnrecoveredSignature = commons.signature.UnrecoveredSignature +> extends ethers.Signer { + public context: commons.context.WalletContext + public config: Y + public address: string + public chainId: ethers.BigNumberish + + public provider?: ethers.providers.Provider + public relayer?: Relayer + + public coders: { + signature: commons.signature.SignatureCoder + config: commons.config.ConfigCoder + } + + private orchestrator: SignatureOrchestrator + private _reader?: commons.reader.Reader + + constructor(options: WalletOptions) { + if (ethers.constants.Zero.eq(options.chainId) && !options.coders.signature.supportsNoChainId) { + throw new Error(`Sequence version ${options.config.version} doesn't support chainId 0`) + } + + super() + + this.context = options.context + this.config = options.config + this.orchestrator = options.orchestrator + this.coders = options.coders + this.address = options.address + this.chainId = options.chainId + this.provider = options.provider + this.relayer = options.relayer + + this._reader = options.reader + } + + static newWallet< + Y extends commons.config.Config = commons.config.Config, + T extends commons.signature.Signature = commons.signature.Signature, + Z extends commons.signature.UnrecoveredSignature = commons.signature.UnrecoveredSignature + >(options: Omit, 'address'>): Wallet { + const address = commons.context.addressOf(options.context, options.coders.config.imageHashOf(options.config)) + return new Wallet({ ...options, address }) + } + + reader(): commons.reader.Reader { + if (this._reader) return this._reader + if (!this.provider) throw new Error('Wallet status provider requires a provider') + return new commons.reader.OnChainReader(this.provider) + } + + setConfig(config: Y) { + this.config = config + } + + setOrchestrator(orchestrator: SignatureOrchestrator) { + this.orchestrator = orchestrator + } + + setAddress(address: string) { + this.address = address + } + + getSigners(): Promise { + return this.orchestrator.getSigners() + } + + async getAddress(): Promise { + return this.address + } + + async decorateTransactions( + bundle: commons.transaction.IntendedTransactionBundle + ): Promise { + // Allow children to decorate + const decorated = await this.orchestrator.decorateTransactions(bundle) + + if (await this.reader().isDeployed(this.address)) { + // Deployed - No decorating at this level + return decorated + } + + const transactions: commons.transaction.Transaction[] = [ + { + to: decorated.entrypoint, + data: commons.transaction.encodeBundleExecData(decorated), + revertOnError: true + } + ] + + // Add deployment tx + const deployTx = await this.buildDeployTransaction() + if (deployTx) { + transactions.unshift(...deployTx.transactions) + } + + // TODO: If entrypoint is guestModule we can flatten the bundle + // and avoid calling guestModule twice + + return { + entrypoint: this.context.guestModule, + chainId: this.chainId, + intent: decorated.intent, + transactions + } + } + + async buildDeployTransaction( + metadata?: commons.WalletDeployMetadata + ): Promise { + if (metadata?.ignoreDeployed && (await this.reader().isDeployed(this.address))) { + return + } + + const imageHash = this.coders.config.imageHashOf(this.config) + + if (commons.context.addressOf(this.context, imageHash) !== this.address) { + throw new Error(`First address of config ${imageHash} doesn't match wallet address ${this.address}`) + } + + const bundle = Wallet.buildDeployTransaction(this.context, imageHash) + if (metadata?.includeChildren) { + const childBundle = await this.orchestrator.buildDeployTransaction(metadata) + if (childBundle) { + // Deploy children first + bundle.transactions = childBundle.transactions.concat(bundle.transactions) + } + } + return bundle + } + + async deploy(metadata?: commons.WalletDeployMetadata): Promise { + const deployTx = await this.buildDeployTransaction(metadata) + if (deployTx === undefined) { + // Already deployed + return + } + if (!this.relayer) throw new Error('Wallet deploy requires a relayer') + return this.relayer.relay({ + ...deployTx, + chainId: this.chainId, + intent: { + id: ethers.utils.hexlify(ethers.utils.randomBytes(32)), + wallet: this.address + } + }) + } + + static buildDeployTransaction( + context: commons.context.WalletContext, + imageHash: string + ): commons.transaction.TransactionBundle { + const factoryInterface = new ethers.utils.Interface(walletContracts.factory.abi) + + return { + entrypoint: context.guestModule, + transactions: [ + { + to: context.factory, + data: factoryInterface.encodeFunctionData(factoryInterface.getFunction('deploy'), [context.mainModule, imageHash]), + gasLimit: 100000, + delegateCall: false, + revertOnError: true, + value: 0 + } + ] + } + } + + async buildUpdateConfigurationTransaction(config: Y): Promise { + if (this.coders.config.update.isKindUsed) { + const implementation = await this.reader().implementation(this.address) + const isLaterUpdate = implementation && implementation === this.context.mainModuleUpgradable + return this.coders.config.update.buildTransaction(this.address, config, this.context, isLaterUpdate ? 'later' : 'first') + } + + return this.coders.config.update.buildTransaction(this.address, config, this.context) + } + + async getNonce(space: ethers.BigNumberish = 0): Promise { + const nonce = await this.reader().nonce(this.address, space) + if (nonce === undefined) throw new Error('Unable to determine nonce') + return nonce + } + + async signDigest(digest: ethers.utils.BytesLike, metadata?: object): Promise { + // The subdigest may be statically defined on the configuration + // in that case we just encode the proof, no need to sign anything + const subdigest = subDigestOf(this.address, this.chainId, digest) + if (this.coders.config.hasSubdigest(this.config, subdigest)) { + return this.coders.signature.encodeSigners(this.config, new Map(), [subdigest], this.chainId).encoded + } + + // We build the metadata object, this contains additional information + // that may be needed to sign the digest (by the other signers, or by the guard) + const childMetadata: commons.WalletSignRequestMetadata = { + ...metadata, // Keep other metadata fields + digest, + chainId: this.chainId, + address: this.address, + config: this.config + } + + // We ask the orchestrator to sign the digest, as soon as we have enough signature parts + // to reach the threshold we returns true, that means the orchestrator will stop asking + // and we can encode the final signature + const subdigestBytes = ethers.utils.arrayify(subdigest) + const signature = await this.orchestrator.signMessage({ + candidates: this.coders.config.signersOf(this.config).map(s => s.address), + message: subdigestBytes, + metadata: childMetadata, + callback: (status: Status, onNewMetadata: (_metadata: object) => void): boolean => { + const parts = statusToSignatureParts(status) + + const newMetadata = { ...childMetadata, parts } + onNewMetadata(newMetadata) + + return this.coders.signature.hasEnoughSigningPower(this.config, parts) + } + }) + + const parts = statusToSignatureParts(signature) + return this.coders.signature.encodeSigners(this.config, parts, [], this.chainId).encoded + } + + signMessage(message: ethers.BytesLike): Promise { + return this.signDigest(ethers.utils.keccak256(message), { message }) + } + + signTransactionBundle(bundle: commons.transaction.TransactionBundle): Promise { + if (bundle.entrypoint !== this.address) { + throw new Error(`Invalid entrypoint: ${bundle.entrypoint} !== ${this.address}`) + } + + return this.signTransactions(bundle.transactions, bundle.nonce) + } + + async fetchNonceOrSpace( + nonce?: ethers.BigNumberish | { space: ethers.BigNumberish } | { serial: boolean } + ): Promise { + let spaceValue + + if (nonce && (nonce as any).space !== undefined) { + // specified nonce "space" + spaceValue = ethers.BigNumber.from((nonce as any).space) + } else if (nonce === undefined) { + // default is random, aka parallel + return this.randomNonce() + } else if (nonce && (nonce as any).serial === true) { + // next nonce determined from the chain + spaceValue = 0 + } else { + // specific nonce is used + return nonce as ethers.BigNumberish + } + + const resultNonce = await this.reader().nonce(this.address, spaceValue) + if (resultNonce === undefined) throw new Error('Unable to determine nonce') + return commons.transaction.encodeNonce(spaceValue, resultNonce) + } + + // Generate nonce with random space + randomNonce(): ethers.BigNumberish { + const randomNonceSpace = ethers.BigNumber.from(ethers.utils.hexlify(ethers.utils.randomBytes(12))) + const randomNonce = commons.transaction.encodeNonce(randomNonceSpace, 0) + return randomNonce + } + + async signTransactions( + txs: Deferrable, + nonce?: ethers.BigNumberish | { space: ethers.BigNumberish } | { serial: boolean }, + metadata?: object + ): Promise { + const transaction = await resolveArrayProperties(txs) + const transactions = commons.transaction.fromTransactionish(this.address, transaction) + + // NOTICE: If the `transactions` list is empty, then we add a dummy transaction + // otherwise the `TxExecuted` event will not be emitted, and we won't be able to + // find the transaction hash + if (transactions.length === 0) { + transactions.push({ + to: this.address, + data: '0x', + value: 0, + gasLimit: 0, + delegateCall: false, + revertOnError: true + }) + } + + const defaultedNonce = await this.fetchNonceOrSpace(nonce) + const digest = commons.transaction.digestOfTransactions(defaultedNonce, transactions) + const meta = { + digest, + transactions, + ...metadata + } + const signature = await this.signDigest(digest, meta) + + return { + intent: { + // Maybe is better if signDigest returns the subdigest directly + id: subDigestOf(this.address, this.chainId, digest), + wallet: this.address + }, + chainId: this.chainId, + transactions, + entrypoint: this.address, + nonce: defaultedNonce, + signature + } + } + + async sendSignedTransaction( + signedBundle: commons.transaction.IntendedTransactionBundle, + quote?: FeeQuote + ): Promise { + if (!this.relayer) throw new Error('Wallet sendTransaction requires a relayer') + return this.relayer.relay(signedBundle, quote) + } + + // sendTransaction will dispatch the transaction to the relayer for submission to the network. + // This method is able to send transactions in serial or parallel (default). You can specify + // a specific nonce, or let the wallet determine the next nonce on-chain (serial:true). + // + // By default, nonces are generated randomly and assigned so transactioned can be executed + // in parallel. However, if you'd like to execute serially, pass { serial: true } as an option. + async sendTransaction( + txs: Deferrable, + options?: { + quote?: FeeQuote + nonce?: ethers.BigNumberish + serial?: boolean + } + ): Promise { + let nonce: ethers.BigNumberish | { serial: boolean } + if (options?.nonce !== undefined) { + // specific nonce is used + nonce = options.nonce + } else if (options?.serial) { + // next nonce on wallet is used and detected on-chain + nonce = { serial: true } + } else { + // default is random, aka parallel + nonce = this.randomNonce() + } + + const signed = await this.signTransactions(txs, nonce) + const decorated = await this.decorateTransactions(signed) + return this.sendSignedTransaction(decorated, options?.quote) + } + + async fillGasLimits(txs: Deferrable): Promise { + const transaction = await resolveArrayProperties(txs) + const transactions = commons.transaction.fromTransactionish(this.address, transaction) + const relayer = this.relayer + if (!relayer) throw new Error('Wallet fillGasLimits requires a relayer') + + const simulations = await relayer.simulate(this.address, ...transactions) + return transactions.map((tx, i) => { + const gasLimit = tx.gasLimit ? ethers.BigNumber.from(tx.gasLimit).toNumber() : simulations[i].gasLimit + return { ...tx, ...simulations[i], gasLimit } + }) + } + + connect(provider: ethers.providers.Provider, relayer?: Relayer): Wallet { + this.provider = provider + this.relayer = relayer + return this + } + + signTransaction(transaction: ethers.utils.Deferrable): Promise { + throw new Error('Method not implemented.') + } +} diff --git a/packages/wallet/tests/utils/deploy-wallet-context.ts b/packages/wallet/tests/utils/deploy-wallet-context.ts new file mode 100644 index 000000000..97c5374fc --- /dev/null +++ b/packages/wallet/tests/utils/deploy-wallet-context.ts @@ -0,0 +1,57 @@ +import { ethers } from 'ethers' + +import { + Factory, + GuestModule, + MainModule, + MainModuleUpgradable, + SequenceUtils, + RequireFreshSigner +} from '@0xsequence/wallet-contracts' + +const FactoryArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/Factory.sol/Factory.json') +const GuestModuleArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/modules/GuestModule.sol/GuestModule.json') +const MainModuleArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/modules/MainModule.sol/MainModule.json') +const MainModuleUpgradableArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/modules/MainModuleUpgradable.sol/MainModuleUpgradable.json') +const SequenceUtilsArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/modules/utils/SequenceUtils.sol/SequenceUtils.json') +const RequireFreshSignerArtifact = require('@0xsequence/wallet-contracts/artifacts/contracts/modules/utils/libs/RequireFreshSigner.sol/RequireFreshSigner.json') + +export async function deployWalletContext( + signer: ethers.Signer +): Promise<[Factory, MainModule, MainModuleUpgradable, GuestModule, SequenceUtils, RequireFreshSigner]> { + const factory = (await new ethers.ContractFactory( + FactoryArtifact.abi, + FactoryArtifact.bytecode, + signer + ).deploy()) as unknown as Factory + + const mainModule = (await new ethers.ContractFactory(MainModuleArtifact.abi, MainModuleArtifact.bytecode, signer).deploy( + factory.address + )) as unknown as MainModule + + const mainModuleUpgradable = (await new ethers.ContractFactory( + MainModuleUpgradableArtifact.abi, + MainModuleUpgradableArtifact.bytecode, + signer + ).deploy()) as unknown as MainModuleUpgradable + + const guestModule = (await new ethers.ContractFactory( + GuestModuleArtifact.abi, + GuestModuleArtifact.bytecode, + signer + ).deploy()) as unknown as GuestModule + + const sequenceUtils = (await new ethers.ContractFactory( + SequenceUtilsArtifact.abi, + SequenceUtilsArtifact.bytecode, + signer + ).deploy(factory.address, mainModule.address)) as unknown as SequenceUtils + + const requireFreshSigner = (await new ethers.ContractFactory( + RequireFreshSignerArtifact.abi, + RequireFreshSignerArtifact.bytecode, + signer + ).deploy(sequenceUtils.address)) as unknown as RequireFreshSigner + + return [factory, mainModule, mainModuleUpgradable, guestModule, sequenceUtils, requireFreshSigner] +} diff --git a/packages/wallet/tests/utils/get-contract.ts b/packages/wallet/tests/utils/get-contract.ts new file mode 100644 index 000000000..e69de29bb diff --git a/packages/wallet/tests/utils/index.ts b/packages/wallet/tests/utils/index.ts new file mode 100644 index 000000000..6e42022cf --- /dev/null +++ b/packages/wallet/tests/utils/index.ts @@ -0,0 +1,5 @@ +import { ethers } from 'ethers' + +export async function encodeData(contract: ethers.Contract, method: string, ...args: any): Promise { + return (await contract.populateTransaction[method](...args)).data! +} diff --git a/packages/wallet/tests/wallet.spec.ts b/packages/wallet/tests/wallet.spec.ts new file mode 100644 index 000000000..3c77c3a53 --- /dev/null +++ b/packages/wallet/tests/wallet.spec.ts @@ -0,0 +1,594 @@ +import hardhat from 'hardhat' +import * as chai from 'chai' + +import { walletContracts } from '@0xsequence/abi' +import { commons, v1, v2 } from '@0xsequence/core' +import { context } from '@0xsequence/tests' +import { ethers } from 'ethers' +import { SequenceOrchestratorWrapper, Wallet } from '../src/index' +import { Orchestrator, SignatureOrchestrator, signers as hubsigners } from '@0xsequence/signhub' +import { LocalRelayer } from '@0xsequence/relayer' + +const { expect } = chai + +type Coders = { + signature: commons.signature.SignatureCoder + config: commons.config.ConfigCoder +} + +describe('Wallet (primitive)', () => { + let provider: ethers.providers.JsonRpcProvider + let signers: ethers.Signer[] + + let contexts: Awaited> + let relayer: LocalRelayer + + before(async () => { + provider = new ethers.providers.Web3Provider(hardhat.network.provider as any) + signers = new Array(8).fill(0).map((_, i) => provider.getSigner(i)) + contexts = await context.deploySequenceContexts(signers[0]) + relayer = new LocalRelayer(signers[0]) + }) + ;( + [ + { + version: 1, + coders: { signature: v1.signature.SignatureCoder, config: v1.config.ConfigCoder } + }, + { + version: 2, + coders: { signature: v2.signature.SignatureCoder, config: v2.config.ConfigCoder } + } + ] as { version: number; coders: Coders }[] + ).map(({ version, coders }) => { + describe(`Using v${version} version`, () => { + it('Should deploy a new wallet', async () => { + const signer = ethers.Wallet.createRandom() + + const config = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ address: signer.address, weight: 1 }] + }) + + const wallet = Wallet.newWallet({ + coders: coders, + context: contexts[version], + config, + orchestrator: new Orchestrator([new hubsigners.SignerWrapper(signer)]), + chainId: provider.network.chainId, + provider, + relayer + }) + + await wallet.deploy() + + expect(await wallet.reader().isDeployed(wallet.address)).to.be.true + }) + + it('Should deploy children', async () => { + const nestedSigner = ethers.Wallet.createRandom() + const nestedConfig = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ address: nestedSigner.address, weight: 1 }] + }) + const nestedOrchestrator = new Orchestrator([nestedSigner]) + const nestedWallet = Wallet.newWallet({ + coders: coders, + context: contexts[version], + config: nestedConfig, + orchestrator: nestedOrchestrator, + chainId: provider.network.chainId, + provider, + relayer + }) + const config = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ address: nestedWallet.address, weight: 1 }] + }) + const orchestrator = new Orchestrator([new SequenceOrchestratorWrapper(nestedWallet)]) + const wallet = Wallet.newWallet({ + coders: coders, + context: contexts[version], + config, + orchestrator, + chainId: provider.network.chainId, + provider, + relayer + }) + + expect(await wallet.reader().isDeployed(wallet.address)).to.be.false + expect(await nestedWallet.reader().isDeployed(nestedWallet.address)).to.be.false + await wallet.deploy({ includeChildren: true, ignoreDeployed: true }) + expect(await wallet.reader().isDeployed(wallet.address)).to.be.true + expect(await nestedWallet.reader().isDeployed(wallet.address)).to.be.true + }) + + describe('Nonce selection', async () => { + let signer: ethers.Wallet + let wallet: Wallet + + let getNonce: (response: ethers.providers.TransactionResponse) => { space: ethers.BigNumber; nonce: ethers.BigNumber } + + before(async () => { + const mainModule = new ethers.utils.Interface(walletContracts.mainModule.abi) + + getNonce = ({ data }) => { + const [_, encoded] = mainModule.decodeFunctionData('execute', data) + const [space, nonce] = commons.transaction.decodeNonce(encoded) + return { space, nonce } + } + + signer = ethers.Wallet.createRandom() + + wallet = Wallet.newWallet({ + coders, + context: contexts[version], + config: coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ weight: 1, address: signer.address }] + }), + chainId: provider.network.chainId, + orchestrator: new Orchestrator([signer]), + provider, + relayer + }) + + await wallet.deploy({ includeChildren: true, ignoreDeployed: true }) + + await (await signers[0].sendTransaction({ to: wallet.address, value: ethers.utils.parseEther('1') })).wait() + }) + + it('Should use explicitly set nonces', async () => { + let response = await wallet.sendTransaction( + { to: signers[0].getAddress(), value: 1 }, + { nonce: commons.transaction.encodeNonce(6492, 0) } + ) + + let { space, nonce } = getNonce(response) + + expect(space.eq(6492)).to.be.true + expect(nonce.eq(0)).to.be.true + + await response.wait() + + response = await wallet.sendTransaction( + { to: signers[0].getAddress(), value: 1 }, + { nonce: commons.transaction.encodeNonce(6492, 1) } + ) + + const encoded = getNonce(response) + space = encoded.space + nonce = encoded.nonce + + expect(space.eq(6492)).to.be.true + expect(nonce.eq(1)).to.be.true + }) + + it('Should select random nonces by default', async () => { + let response = await wallet.sendTransaction({ to: signers[0].getAddress(), value: 1 }) + + const { space: firstSpace, nonce: firstNonce } = getNonce(response) + + expect(firstSpace.eq(0)).to.be.false + expect(firstNonce.eq(0)).to.be.true + + // not necessary, parallel execution is ok: + // await response.wait() + + response = await wallet.sendTransaction({ to: signers[0].getAddress(), value: 1 }) + + const { space: secondSpace, nonce: secondNonce } = getNonce(response) + + expect(secondSpace.eq(0)).to.be.false + expect(secondNonce.eq(0)).to.be.true + + expect(secondSpace.eq(firstSpace)).to.be.false + }) + + it('Should respect the serial option', async () => { + let response = await wallet.sendTransaction({ to: signers[0].getAddress(), value: 1 }, { serial: true }) + + let { space, nonce } = getNonce(response) + + expect(space.eq(0)).to.be.true + expect(nonce.eq(0)).to.be.true + + await response.wait() + + response = await wallet.sendTransaction({ to: signers[0].getAddress(), value: 1 }, { serial: true }) + + const encoded = getNonce(response) + space = encoded.space + nonce = encoded.nonce + + expect(space.eq(0)).to.be.true + expect(nonce.eq(1)).to.be.true + }) + }) + + // + // Run tests using different combinations of signers + // + ;[ + { + name: '1/1 signer', + signers: () => { + const signer = ethers.Wallet.createRandom() + + const config = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ address: signer.address, weight: 1 }] + }) + + const orchestrator = new Orchestrator([new hubsigners.SignerWrapper(signer)]) + + return { config, orchestrator } + } + }, + { + name: '1/2 signers', + signers: () => { + const signer = ethers.Wallet.createRandom() + const signers = [ + { + address: signer.address, + weight: 1 + }, + { + address: ethers.Wallet.createRandom().address, + weight: 1 + } + ].sort(() => (Math.random() > 0.5 ? 1 : -1)) + + const config = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers + }) + + const orchestrator = new Orchestrator([new hubsigners.SignerWrapper(signer)]) + return { config, orchestrator } + } + }, + { + name: '2/4 signers', + signers: () => { + const members = new Array(4).fill(0).map(() => ethers.Wallet.createRandom()) + + const signers = members + .map(m => ({ + address: m.address, + weight: 2 + })) + .sort(() => (Math.random() > 0.5 ? 1 : -1)) + + const config = coders.config.fromSimple({ + threshold: 2, + checkpoint: 0, + signers + }) + + const orchestrator = new Orchestrator(members.slice(0, 2).map(m => new hubsigners.SignerWrapper(m))) + return { config, orchestrator } + } + }, + { + name: '11/90 signers', + signers: () => { + const members = new Array(90).fill(0).map(() => ethers.Wallet.createRandom()) + + const signers = members + .map(m => ({ + address: m.address, + weight: 1 + })) + .sort(() => (Math.random() > 0.5 ? 1 : -1)) + + const config = coders.config.fromSimple({ + threshold: 11, + checkpoint: 0, + signers + }) + + const orchestrator = new Orchestrator(members.slice(0, 11).map(m => new hubsigners.SignerWrapper(m))) + return { config, orchestrator } + } + }, + { + name: '1/1 signer (nested)', + signers: async () => { + const nestedSigner = ethers.Wallet.createRandom() + + const nestedConfig = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ address: nestedSigner.address, weight: 1 }] + }) + + const nestedOrchestrator = new Orchestrator([nestedSigner]) + const nestedWallet = Wallet.newWallet({ + coders: coders, + context: contexts[version], + config: nestedConfig, + orchestrator: nestedOrchestrator, + chainId: provider.network.chainId, + provider, + relayer + }) + + await nestedWallet.deploy() + expect(await nestedWallet.reader().isDeployed(nestedWallet.address)).to.be.true + + const config = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ address: nestedWallet.address, weight: 1 }] + }) + + const orchestrator = new Orchestrator([new SequenceOrchestratorWrapper(nestedWallet)]) + + return { config, orchestrator } + } + }, + { + name: '1/1 signer (undeployed nested)', + signers: async () => { + const nestedSigner = ethers.Wallet.createRandom() + + const nestedConfig = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ address: nestedSigner.address, weight: 1 }] + }) + + const nestedOrchestrator = new Orchestrator([nestedSigner]) + const nestedWallet = Wallet.newWallet({ + coders: coders, + context: contexts[version], + config: nestedConfig, + orchestrator: nestedOrchestrator, + chainId: provider.network.chainId, + provider, + relayer + }) + + expect(await nestedWallet.reader().isDeployed(nestedWallet.address)).to.be.false + + const config = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [{ address: nestedWallet.address, weight: 1 }] + }) + + const orchestrator = new Orchestrator([new SequenceOrchestratorWrapper(nestedWallet)]) + + return { config, orchestrator } + } + } + ].map(({ name, signers }) => { + describe(`Using ${name}`, () => { + let orchestrator: SignatureOrchestrator + let config: commons.config.Config + + beforeEach(async () => { + const { config: _config, orchestrator: _orchestrator } = await signers() + config = _config + orchestrator = _orchestrator + }) + + // Skip this as we cannot validate a message with an undeployed nested wallet + if (name !== '1/1 signer (undeployed nested)') { + it('Should sign and validate a message', async () => { + const wallet = Wallet.newWallet({ + coders: coders, + context: contexts[version], + config, + orchestrator, + chainId: provider.network.chainId, + provider, + relayer + }) + + await wallet.deploy() + expect(await wallet.reader().isDeployed(wallet.address)).to.be.true + + const message = ethers.utils.toUtf8Bytes( + `This is a random message: ${ethers.utils.hexlify(ethers.utils.randomBytes(96))}` + ) + + const signature = await wallet.signMessage(message) + const digest = ethers.utils.keccak256(message) + + expect(await wallet.reader().isValidSignature(wallet.address, digest, signature)).to.be.true + }) + } + + // + // Run tests for deployed and undeployed wallets + // transactions should be decorated automatically + // + ;[ + { + name: 'After deployment', + setup: async (wallet: Wallet) => { + await wallet.deploy() + }, + deployed: true + }, + { + name: 'Before deployment', + setup: async (_: Wallet) => {}, + deployed: false + } + ].map(({ name, setup, deployed }) => { + describe(name, () => { + let wallet: Wallet + + beforeEach(async () => { + wallet = Wallet.newWallet({ + coders: coders, + context: contexts[version], + config, + orchestrator, + chainId: provider.network.chainId, + provider, + relayer + }) + + await setup(wallet) + }) + + it('Should send an empty list of transactions', async () => { + await wallet.sendTransaction([]) + }) + + it('Should send a transaction with an empty call', async () => { + await wallet.sendTransaction([ + { + to: ethers.Wallet.createRandom().address + } + ]) + }) + + it('Should build and execute a wallet update transaction', async () => { + const newConfig = coders.config.fromSimple({ + threshold: 1, + checkpoint: 0, + signers: [ + { + address: ethers.Wallet.createRandom().address, + weight: 1 + } + ] + }) + + const updateTx = await wallet.buildUpdateConfigurationTransaction(newConfig) + + expect(updateTx.entrypoint).to.equal(wallet.address) + expect(updateTx.transactions[0].to).to.equal(wallet.address) + expect(updateTx.transactions[0].delegateCall).to.equal(false) + expect(updateTx.transactions[0].revertOnError).to.equal(true) + expect(updateTx.transactions[0].gasLimit).to.equal(0) + expect(updateTx.transactions[0].value).to.equal(0) + + if (version === 1) { + expect(updateTx.transactions.length).to.be.equal(2) + expect(updateTx.transactions[1].to).to.equal(wallet.address) + expect(updateTx.transactions[1].delegateCall).to.equal(false) + expect(updateTx.transactions[1].revertOnError).to.equal(true) + expect(updateTx.transactions[1].gasLimit).to.equal(0) + expect(updateTx.transactions[1].value).to.equal(0) + } else if (version === 2) { + expect(updateTx.transactions.length).to.be.equal(1) + } else { + throw new Error('Version not supported in test') + } + + const prevImplentation = await wallet.reader().implementation(wallet.address) + + await wallet.sendTransaction(updateTx.transactions) + + expect(await wallet.reader().imageHash(wallet.address)).to.equal(coders.config.imageHashOf(newConfig)) + expect(await wallet.reader().implementation(wallet.address)).to.not.equal(prevImplentation) + }) + + describe('parallel transactions', async () => { + let testAccount: ethers.providers.JsonRpcSigner + let testAccountAddress: string + let toBalanceBefore: ethers.BigNumber + + beforeEach(async () => { + testAccount = provider.getSigner(5) + testAccountAddress = await testAccount.getAddress() + + const ethAmount = ethers.utils.parseEther('100') + const txResp = await testAccount.sendTransaction({ + to: await wallet.getAddress(), + value: ethAmount + }) + await provider.getTransactionReceipt(txResp.hash) + toBalanceBefore = await provider.getBalance(testAccountAddress) + }) + + it('Should send an async transaction', async () => { + const ethAmount = ethers.utils.parseEther('1.0') + + const tx: ethers.providers.TransactionRequest = { + to: testAccountAddress, + value: ethAmount + } + + await wallet.sendTransaction(tx) + const toBalanceAfter = await provider.getBalance(testAccountAddress) + const sent = toBalanceAfter.sub(toBalanceBefore) + expect(sent.toString()).to.be.eq(ethAmount.toString()) + }) + + it('Should send two async transactions at once', async () => { + const ethAmount1 = ethers.utils.parseEther('1.0') + const ethAmount2 = ethers.utils.parseEther('2.0') + const ethAmount3 = ethers.utils.parseEther('5.0') + + const tx1: ethers.providers.TransactionRequest = { + to: testAccountAddress, + value: ethAmount1 + } + + const tx2: ethers.providers.TransactionRequest = { + to: testAccountAddress, + value: ethAmount2 + } + + const tx3: ethers.providers.TransactionRequest = { + to: testAccountAddress, + value: ethAmount3 + } + + // Send txns in parallel, but independently + await Promise.all([wallet.sendTransaction(tx1), wallet.sendTransaction(tx2), wallet.sendTransaction(tx3)]) + + const toBalanceAfter = await provider.getBalance(testAccountAddress) + const sent = toBalanceAfter.sub(toBalanceBefore) + expect(sent.toString()).to.be.eq(ethAmount1.add(ethAmount2).add(ethAmount3).toString()) + }) + + it('Should send multiple async transactions in one batch, async', async () => { + const ethAmount1 = ethers.utils.parseEther('1.0') + const ethAmount2 = ethers.utils.parseEther('2.0') + const ethAmount3 = ethers.utils.parseEther('5.0') + + const tx1: ethers.providers.TransactionRequest = { + to: testAccountAddress, + value: ethAmount1 + } + + const tx2: ethers.providers.TransactionRequest = { + to: testAccountAddress, + value: ethAmount2 + } + + const tx3: ethers.providers.TransactionRequest = { + to: testAccountAddress, + value: ethAmount3 + } + + // Send txns in parallel, but independently + await wallet.sendTransaction([tx1, tx2, tx3]) + + const toBalanceAfter = await provider.getBalance(testAccountAddress) + const sent = toBalanceAfter.sub(toBalanceBefore) + expect(sent.toString()).to.be.eq(ethAmount1.add(ethAmount2).add(ethAmount3).toString()) + }) + }) + }) + }) + }) + }) + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/.eslintignore b/packages/wallet/wallet-contracts/.eslintignore new file mode 100644 index 000000000..f0a62d697 --- /dev/null +++ b/packages/wallet/wallet-contracts/.eslintignore @@ -0,0 +1,3 @@ +.eslintrc.js +node_modules +src/gen diff --git a/packages/wallet/wallet-contracts/.eslintrc.js b/packages/wallet/wallet-contracts/.eslintrc.js new file mode 100644 index 000000000..284d5a529 --- /dev/null +++ b/packages/wallet/wallet-contracts/.eslintrc.js @@ -0,0 +1,38 @@ +const { off } = require("process") + +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2018, + sourceType: 'module' + }, + + extends: [ + 'plugin:@typescript-eslint/recommended', + 'plugin:import/errors', + 'plugin:import/warnings', + 'plugin:import/typescript', + 'prettier' + ], + + rules: { + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/no-empty-function': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-non-null-asserted-optional-chain': 'off', + + 'prefer-spread': 'off', + 'prefer-const': 'off', + + 'import/no-unresolved': 'off', + // 'import/no-default-export': 2, + 'import/no-named-as-default-member': 'off', + + } +} diff --git a/packages/wallet/wallet-contracts/.gitattributes b/packages/wallet/wallet-contracts/.gitattributes new file mode 100644 index 000000000..52031de51 --- /dev/null +++ b/packages/wallet/wallet-contracts/.gitattributes @@ -0,0 +1 @@ +*.sol linguist-language=Solidity diff --git a/packages/wallet/wallet-contracts/.github/actions/install-dependencies/action.yml b/packages/wallet/wallet-contracts/.github/actions/install-dependencies/action.yml new file mode 100644 index 000000000..2d96c7d58 --- /dev/null +++ b/packages/wallet/wallet-contracts/.github/actions/install-dependencies/action.yml @@ -0,0 +1,36 @@ +name: Setup Node and PNPM dependencies + +runs: + using: 'composite' + + steps: + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Setup PNPM + uses: pnpm/action-setup@v3 + with: + version: 9 + run_install: false + + - name: Get pnpm store directory + id: pnpm-cache + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: | + ${{ steps.pnpm-cache.outputs.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + shell: bash + run: pnpm install --frozen-lockfile + if: ${{ steps.pnpm-cache.outputs.cache-hit != 'true' }} diff --git a/packages/wallet/wallet-contracts/.github/workflows/ci.yml b/packages/wallet/wallet-contracts/.github/workflows/ci.yml new file mode 100644 index 000000000..820aa13c4 --- /dev/null +++ b/packages/wallet/wallet-contracts/.github/workflows/ci.yml @@ -0,0 +1,108 @@ +on: [push] + +name: ci + +jobs: + benchmark: + name: Benchmark + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-dependencies + - run: pnpm build + - run: pnpm benchmark + + lint-ts: + name: Typescript lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-dependencies + - run: pnpm lint:ts + + lint-sol: + name: Solidity lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-dependencies + - run: pnpm lint:sol + + test: + name: Test contracts + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-dependencies + - run: pnpm build + - run: pnpm test + + coverage: + name: Coverage + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/install-dependencies + - run: pnpm coverage || true + - name: Coveralls + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + + huff-tests: + name: Huff tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Huff + uses: huff-language/huff-toolchain@v3 + with: + version: nightly + + - name: Run tests + run: bash ./run_huff_tests.sh + + foundry-tests: + name: Foundry tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Install Huff + uses: huff-language/huff-toolchain@v3 + with: + version: nightly + + - name: Run tests + run: FOUNDRY_FUZZ_RUNS=2048 MAX_ARRAY_LEN=32 forge test -vvv + + foundry-tests-long-arrays: + name: Foundry tests (long arrays) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Install Huff + uses: huff-language/huff-toolchain@v3 + with: + version: nightly + + - name: Run tests + run: FOUNDRY_FUZZ_RUNS=1024 forge test -vvv diff --git a/packages/wallet/wallet-contracts/.gitmodules b/packages/wallet/wallet-contracts/.gitmodules new file mode 100644 index 000000000..b6622fb24 --- /dev/null +++ b/packages/wallet/wallet-contracts/.gitmodules @@ -0,0 +1,6 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "lib/foundry-huff"] + path = lib/foundry-huff + url = https://github.com/huff-language/foundry-huff \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/.prettierrc b/packages/wallet/wallet-contracts/.prettierrc new file mode 100644 index 000000000..421afa979 --- /dev/null +++ b/packages/wallet/wallet-contracts/.prettierrc @@ -0,0 +1,9 @@ +{ + "tabWidth": 2, + "useTabs": false, + "semi": false, + "singleQuote": true, + "trailingComma": "none", + "arrowParens": "avoid", + "printWidth": 130 +} diff --git a/packages/wallet/wallet-contracts/.solcover.js b/packages/wallet/wallet-contracts/.solcover.js new file mode 100644 index 000000000..fab8bc0e8 --- /dev/null +++ b/packages/wallet/wallet-contracts/.solcover.js @@ -0,0 +1,3 @@ +module.exports = { + skipFiles: ['mocks', 'migrations'] +} diff --git a/packages/wallet/wallet-contracts/.solhint.json b/packages/wallet/wallet-contracts/.solhint.json new file mode 100644 index 000000000..951b9ecc0 --- /dev/null +++ b/packages/wallet/wallet-contracts/.solhint.json @@ -0,0 +1,26 @@ +{ + "extends": "solhint:recommended", + "rules": { + "quotes": "off", + "const-name-snakecase": "off", + "contract-name-camelcase": "off", + "event-name-camelcase": "off", + "func-name-mixedcase": "off", + "func-param-name-mixedcase": "off", + "modifier-name-mixedcase": "off", + "private-vars-leading-underscore": "off", + "use-forbidden-name": "off", + "var-name-mixedcase": "off", + "func-order": "off", + "imports-on-top": "off", + "ordering": "off", + "no-global-import": "off", + "no-unused-vars": "error", + "not-rely-on-time": "off", + "no-inline-assembly": "off", + "visibility-modifier-order": "off", + "compiler-version": ["error", "0.8.18"], + "func-visibility": ["warn", {"ignoreConstructors":true}], + "reason-string": ["warn", {"maxLength": 96}] + } +} diff --git a/packages/wallet/wallet-contracts/0xsequence-wallet-contracts-3.0.1.tgz b/packages/wallet/wallet-contracts/0xsequence-wallet-contracts-3.0.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..543d81b695a5df074346bf2ffc5cf915ed805291 GIT binary patch literal 34322 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 literal 0 HcmV?d00001 diff --git a/packages/wallet/wallet-contracts/Counter/.github/workflows/test.yml b/packages/wallet/wallet-contracts/Counter/.github/workflows/test.yml new file mode 100644 index 000000000..b79c8d4ff --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/.github/workflows/test.yml @@ -0,0 +1,38 @@ +name: CI + +permissions: {} + +on: + push: + pull_request: + workflow_dispatch: + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + name: Foundry project + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v5 + with: + persist-credentials: false + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Show Forge version + run: forge --version + + - name: Run Forge fmt + run: forge fmt --check + + - name: Run Forge build + run: forge build --sizes + + - name: Run Forge tests + run: forge test -vvv diff --git a/packages/wallet/wallet-contracts/Counter/.gitmodules b/packages/wallet/wallet-contracts/Counter/.gitmodules new file mode 100644 index 000000000..888d42dcd --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/packages/wallet/wallet-contracts/Counter/README.md b/packages/wallet/wallet-contracts/Counter/README.md new file mode 100644 index 000000000..8817d6ab7 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-1763223074249.json b/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-1763223074249.json new file mode 100644 index 000000000..e992522c6 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-1763223074249.json @@ -0,0 +1,47 @@ +{ + "transactions": [ + { + "hash": "0xe967cfba140cfd311ae7b1b1b7e3722aa342485416fa71a65724a7c61ba242ac", + "transactionType": "CREATE", + "contractName": "Counter", + "contractAddress": "0x2bc0484b5b0fafff0a14b858d85e8830621fe0ca", + "function": null, + "arguments": null, + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x31c50", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506101e18061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80633fb5c1cb146100435780638381f58a1461005f578063d09de08a1461007d575b5f5ffd5b61005d600480360381019061005891906100e4565b610087565b005b610067610090565b604051610074919061011e565b60405180910390f35b610085610095565b005b805f8190555050565b5f5481565b5f5f8154809291906100a690610164565b9190505550565b5f5ffd5b5f819050919050565b6100c3816100b1565b81146100cd575f5ffd5b50565b5f813590506100de816100ba565b92915050565b5f602082840312156100f9576100f86100ad565b5b5f610106848285016100d0565b91505092915050565b610118816100b1565b82525050565b5f6020820190506101315f83018461010f565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61016e826100b1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036101a05761019f610137565b5b60018201905091905056fea2646970667358221220df4a76c68e7f061f542d26155d08ef6ac6937da6830d06a5a5c3e20d2c78b21164736f6c634300081e0033", + "nonce": "0xe6f", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x2648d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xe967cfba140cfd311ae7b1b1b7e3722aa342485416fa71a65724a7c61ba242ac", + "transactionIndex": "0x0", + "blockHash": "0x567bf85581af8ab194b098169c966fc2fa35547be5092b02ca8199f6a2fde371", + "blockNumber": "0x16b3eff", + "gasUsed": "0x2648d", + "effectiveGasPrice": "0x60f59cc", + "blobGasPrice": "0x13", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0x2bc0484b5b0fafff0a14b858d85e8830621fe0ca" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1763223074249, + "chain": 1, + "commit": null +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-1763223530987.json b/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-1763223530987.json new file mode 100644 index 000000000..79ce8649c --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-1763223530987.json @@ -0,0 +1,47 @@ +{ + "transactions": [ + { + "hash": "0x9fb638893fefbe8746ec8865245fbac0b6078c309be487fdf0e84e28ff1aaf3b", + "transactionType": "CREATE", + "contractName": "Counter", + "contractAddress": "0x1687d4bde380019748605231c956335a473fd3dc", + "function": null, + "arguments": null, + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x31c50", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506101e18061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80633fb5c1cb146100435780638381f58a1461005f578063d09de08a1461007d575b5f5ffd5b61005d600480360381019061005891906100e4565b610087565b005b610067610090565b604051610074919061011e565b60405180910390f35b610085610095565b005b805f8190555050565b5f5481565b5f5f8154809291906100a690610164565b9190505550565b5f5ffd5b5f819050919050565b6100c3816100b1565b81146100cd575f5ffd5b50565b5f813590506100de816100ba565b92915050565b5f602082840312156100f9576100f86100ad565b5b5f610106848285016100d0565b91505092915050565b610118816100b1565b82525050565b5f6020820190506101315f83018461010f565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61016e826100b1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036101a05761019f610137565b5b60018201905091905056fea2646970667358221220df4a76c68e7f061f542d26155d08ef6ac6937da6830d06a5a5c3e20d2c78b21164736f6c634300081e0033", + "nonce": "0xe71", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x2648d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9fb638893fefbe8746ec8865245fbac0b6078c309be487fdf0e84e28ff1aaf3b", + "transactionIndex": "0x0", + "blockHash": "0xedb6015df8ae2fa303919e4d754fe4ad683fa779a93b568a73205ac74c903755", + "blockNumber": "0x16b3f01", + "gasUsed": "0x2648d", + "effectiveGasPrice": "0x4a528c4", + "blobGasPrice": "0xb", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0x1687d4bde380019748605231c956335a473fd3dc" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1763223530987, + "chain": 1, + "commit": null +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-latest.json b/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-latest.json new file mode 100644 index 000000000..79ce8649c --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/broadcast/Counter.s.sol/1/run-latest.json @@ -0,0 +1,47 @@ +{ + "transactions": [ + { + "hash": "0x9fb638893fefbe8746ec8865245fbac0b6078c309be487fdf0e84e28ff1aaf3b", + "transactionType": "CREATE", + "contractName": "Counter", + "contractAddress": "0x1687d4bde380019748605231c956335a473fd3dc", + "function": null, + "arguments": null, + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x31c50", + "value": "0x0", + "input": "0x6080604052348015600e575f5ffd5b506101e18061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061003f575f3560e01c80633fb5c1cb146100435780638381f58a1461005f578063d09de08a1461007d575b5f5ffd5b61005d600480360381019061005891906100e4565b610087565b005b610067610090565b604051610074919061011e565b60405180910390f35b610085610095565b005b805f8190555050565b5f5481565b5f5f8154809291906100a690610164565b9190505550565b5f5ffd5b5f819050919050565b6100c3816100b1565b81146100cd575f5ffd5b50565b5f813590506100de816100ba565b92915050565b5f602082840312156100f9576100f86100ad565b5b5f610106848285016100d0565b91505092915050565b610118816100b1565b82525050565b5f6020820190506101315f83018461010f565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61016e826100b1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036101a05761019f610137565b5b60018201905091905056fea2646970667358221220df4a76c68e7f061f542d26155d08ef6ac6937da6830d06a5a5c3e20d2c78b21164736f6c634300081e0033", + "nonce": "0xe71", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x2648d", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x9fb638893fefbe8746ec8865245fbac0b6078c309be487fdf0e84e28ff1aaf3b", + "transactionIndex": "0x0", + "blockHash": "0xedb6015df8ae2fa303919e4d754fe4ad683fa779a93b568a73205ac74c903755", + "blockNumber": "0x16b3f01", + "gasUsed": "0x2648d", + "effectiveGasPrice": "0x4a528c4", + "blobGasPrice": "0xb", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0x1687d4bde380019748605231c956335a473fd3dc" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1763223530987, + "chain": 1, + "commit": null +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/Counter/foundry.lock b/packages/wallet/wallet-contracts/Counter/foundry.lock new file mode 100644 index 000000000..fee8a9575 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/foundry.lock @@ -0,0 +1,8 @@ +{ + "lib/forge-std": { + "tag": { + "name": "v1.11.0", + "rev": "8e40513d678f392f398620b3ef2b418648b33e89" + } + } +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/Counter/foundry.toml b/packages/wallet/wallet-contracts/Counter/foundry.toml new file mode 100644 index 000000000..25b918f9c --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/foundry.toml @@ -0,0 +1,6 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/.gitattributes b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.gitattributes new file mode 100644 index 000000000..27042d458 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.gitattributes @@ -0,0 +1 @@ +src/Vm.sol linguist-generated diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/CODEOWNERS b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/CODEOWNERS new file mode 100644 index 000000000..beae7aa87 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/CODEOWNERS @@ -0,0 +1 @@ +* @danipopes @klkvr @mattsse @grandizzy @yash-atreya @zerosnacks @onbjerg @0xrusowsky \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/dependabot.yml b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/dependabot.yml new file mode 100644 index 000000000..5ace4600a --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/workflows/ci.yml b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/workflows/ci.yml new file mode 100644 index 000000000..cede018c7 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/workflows/ci.yml @@ -0,0 +1,142 @@ +name: CI + +permissions: {} + +on: + workflow_dispatch: + pull_request: + push: + branches: + - master + +jobs: + build: + name: build +${{ matrix.toolchain }} ${{ matrix.flags }} + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + strategy: + fail-fast: false + matrix: + toolchain: [stable, nightly] + flags: + - "" + - --via-ir + - --use solc:0.8.17 --via-ir + - --use solc:0.8.17 + - --use solc:0.8.0 + - --use solc:0.7.6 + - --use solc:0.7.0 + - --use solc:0.6.2 + - --use solc:0.6.12 + steps: + - uses: actions/checkout@v5 + with: + persist-credentials: false + - uses: foundry-rs/foundry-toolchain@v1 + - run: forge --version + - run: | + case "${{ matrix.flags }}" in + *"solc:0.8.0"* | *"solc:0.7"* | *"solc:0.6"*) + forge build --skip test --skip Config --skip StdConfig --skip LibVariable --deny-warnings ${{ matrix.flags }} + ;; + *) + forge build --skip test --deny-warnings ${{ matrix.flags }} + ;; + esac + # via-ir compilation time checks. + - if: contains(matrix.flags, '--via-ir') + run: forge build --skip test --deny-warnings ${{ matrix.flags }} --contracts 'test/compilation/*' + + test: + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + strategy: + fail-fast: false + matrix: + toolchain: [stable, nightly] + steps: + - uses: actions/checkout@v5 + with: + persist-credentials: false + - uses: foundry-rs/foundry-toolchain@v1 + with: + version: ${{ matrix.toolchain }} + - run: forge --version + - run: | + if [ "${{ matrix.toolchain }}" = "stable" ]; then + forge test -vvv --no-match-path "test/Config.t.sol" + else + forge test -vvv + fi + + fmt: + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + steps: + - uses: actions/checkout@v5 + with: + persist-credentials: false + - uses: foundry-rs/foundry-toolchain@v1 + - run: forge --version + - run: forge fmt --check + + typos: + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + steps: + - uses: actions/checkout@v5 + with: + persist-credentials: false + - uses: crate-ci/typos@7436548694def3314aacd93ed06c721b1f91ea04 # v1 + + codeql: + name: Analyze (${{ matrix.language }}) + runs-on: ubuntu-latest + permissions: + security-events: write + actions: read + contents: read + strategy: + fail-fast: false + matrix: + include: + - language: actions + build-mode: none + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + persist-credentials: false + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" + + ci-success: + runs-on: ubuntu-latest + if: always() + needs: + - build + - test + - fmt + - typos + - codeql + timeout-minutes: 10 + steps: + - name: Decide whether the needed jobs succeeded or failed + uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # release/v1 + with: + jobs: ${{ toJSON(needs) }} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/workflows/sync.yml b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/workflows/sync.yml new file mode 100644 index 000000000..15731cbbf --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/.github/workflows/sync.yml @@ -0,0 +1,36 @@ +name: Sync Release Branch + +permissions: {} + +on: + release: + types: + - created + +jobs: + sync-release-branch: + runs-on: ubuntu-latest + permissions: + contents: write + if: startsWith(github.event.release.tag_name, 'v1') + steps: + - name: Check out the repo + uses: actions/checkout@v5 + with: + persist-credentials: true + fetch-depth: 0 + ref: v1 + + # The email is derived from the bots user id, + # found here: https://api.github.com/users/github-actions%5Bbot%5D + - name: Configure Git + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + + - name: Sync Release Branch + run: | + git fetch --tags + git checkout v1 + git reset --hard ${GITHUB_REF} + git push --force diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/CONTRIBUTING.md b/packages/wallet/wallet-contracts/Counter/lib/forge-std/CONTRIBUTING.md new file mode 100644 index 000000000..89b75f3f7 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/CONTRIBUTING.md @@ -0,0 +1,193 @@ +## Contributing to Foundry + +Thanks for your interest in improving Foundry! + +There are multiple opportunities to contribute at any level. It doesn't matter if you are just getting started with Rust or are the most weathered expert, we can use your help. + +This document will help you get started. **Do not let the document intimidate you**. +It should be considered as a guide to help you navigate the process. + +The [dev Telegram][dev-tg] is available for any concerns you may have that are not covered in this guide. + +### Code of Conduct + +The Foundry project adheres to the [Rust Code of Conduct][rust-coc]. This code of conduct describes the _minimum_ behavior expected from all contributors. + +Instances of violations of the Code of Conduct can be reported by contacting the team at [me@gakonst.com](mailto:me@gakonst.com). + +### Ways to contribute + +There are fundamentally four ways an individual can contribute: + +1. **By opening an issue:** For example, if you believe that you have uncovered a bug + in Foundry, creating a new issue in the issue tracker is the way to report it. +2. **By adding context:** Providing additional context to existing issues, + such as screenshots and code snippets, which help resolve issues. +3. **By resolving issues:** Typically this is done in the form of either + demonstrating that the issue reported is not a problem after all, or more often, + by opening a pull request that fixes the underlying problem, in a concrete and + reviewable manner. + +**Anybody can participate in any stage of contribution**. We urge you to participate in the discussion +around bugs and participate in reviewing PRs. + +### Contributions Related to Spelling and Grammar + +At this time, we will not be accepting contributions that only fix spelling or grammatical errors in documentation, code or +elsewhere. + +### Asking for help + +If you have reviewed existing documentation and still have questions, or you are having problems, you can get help in the following ways: + +- **Asking in the support Telegram:** The [Foundry Support Telegram][support-tg] is a fast and easy way to ask questions. +- **Opening a discussion:** This repository comes with a discussions board where you can also ask for help. Click the "Discussions" tab at the top. + +As Foundry is still in heavy development, the documentation can be a bit scattered. +The [Foundry Book][foundry-book] is our current best-effort attempt at keeping up-to-date information. + +### Submitting a bug report + +When filing a new bug report in the issue tracker, you will be presented with a basic form to fill out. + +If you believe that you have uncovered a bug, please fill out the form to the best of your ability. Do not worry if you cannot answer every detail; just fill in what you can. Contributors will ask follow-up questions if something is unclear. + +The most important pieces of information we need in a bug report are: + +- The Foundry version you are on (and that it is up to date) +- The platform you are on (Windows, macOS, an M1 Mac or Linux) +- Code snippets if this is happening in relation to testing or building code +- Concrete steps to reproduce the bug + +In order to rule out the possibility of the bug being in your project, the code snippets should be as minimal +as possible. It is better if you can reproduce the bug with a small snippet as opposed to an entire project! + +See [this guide][mcve] on how to create a minimal, complete, and verifiable example. + +### Submitting a feature request + +When adding a feature request in the issue tracker, you will be presented with a basic form to fill out. + +Please include as detailed of an explanation as possible of the feature you would like, adding additional context if necessary. + +If you have examples of other tools that have the feature you are requesting, please include them as well. + +### Resolving an issue + +Pull requests are the way concrete changes are made to the code, documentation, and dependencies of Foundry. + +Even minor pull requests, such as those fixing wording, are greatly appreciated. Before making a large change, it is usually +a good idea to first open an issue describing the change to solicit feedback and guidance. This will increase +the likelihood of the PR getting merged. + +Please make sure that the following commands pass if you have changed the code: + +```sh +forge fmt --check +forge test -vvv +``` + +To make sure your changes are compatible with all compiler version targets, run the following commands: + +```sh +forge build --skip test --use solc:0.6.2 +forge build --skip test --use solc:0.6.12 +forge build --skip test --use solc:0.7.0 +forge build --skip test --use solc:0.7.6 +forge build --skip test --use solc:0.8.0 +``` + +The CI will also ensure that the code is formatted correctly and that the tests are passing across all compiler version targets. + +#### Adding cheatcodes + +Please follow the guide outlined in the [cheatcodes](https://github.com/foundry-rs/foundry/blob/master/docs/dev/cheatcodes.md#adding-a-new-cheatcode) documentation of Foundry. + +When making modifications to the native cheatcodes or adding new ones, please make sure to run [`./scripts/vm.py`](./scripts/vm.py) to update the cheatcodes in the [`src/Vm.sol`](./src/Vm.sol) file. + +By default the script will automatically generate the cheatcodes from the [`cheatcodes.json`](https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json) file but alternatively you can provide a path to a JSON file containing the Vm interface, as generated by Foundry, with the `--from` flag. + +```sh +./scripts/vm.py --from path/to/cheatcodes.json +``` + +It is possible that the resulting [`src/Vm.sol`](./src/Vm.sol) file will have some changes that are not directly related to your changes, this is not a problem. + +#### Commits + +It is a recommended best practice to keep your changes as logically grouped as possible within individual commits. There is no limit to the number of commits any single pull request may have, and many contributors find it easier to review changes that are split across multiple commits. + +That said, if you have a number of commits that are "checkpoints" and don't represent a single logical change, please squash those together. + +#### Opening the pull request + +From within GitHub, opening a new pull request will present you with a template that should be filled out. Please try your best at filling out the details, but feel free to skip parts if you're not sure what to put. + +#### Discuss and update + +You will probably get feedback or requests for changes to your pull request. +This is a big part of the submission process, so don't be discouraged! Some contributors may sign off on the pull request right away, others may have more detailed comments or feedback. +This is a necessary part of the process in order to evaluate whether the changes are correct and necessary. + +**Any community member can review a PR, so you might get conflicting feedback**. +Keep an eye out for comments from code owners to provide guidance on conflicting feedback. + +#### Reviewing pull requests + +**Any Foundry community member is welcome to review any pull request**. + +All contributors who choose to review and provide feedback on pull requests have a responsibility to both the project and individual making the contribution. Reviews and feedback must be helpful, insightful, and geared towards improving the contribution as opposed to simply blocking it. If there are reasons why you feel the PR should not be merged, explain what those are. Do not expect to be able to block a PR from advancing simply because you say "no" without giving an explanation. Be open to having your mind changed. Be open to working _with_ the contributor to make the pull request better. + +Reviews that are dismissive or disrespectful of the contributor or any other reviewers are strictly counter to the Code of Conduct. + +When reviewing a pull request, the primary goals are for the codebase to improve and for the person submitting the request to succeed. **Even if a pull request is not merged, the submitter should come away from the experience feeling like their effort was not unappreciated**. Every PR from a new contributor is an opportunity to grow the community. + +##### Review a bit at a time + +Do not overwhelm new contributors. + +It is tempting to micro-optimize and make everything about relative performance, perfect grammar, or exact style matches. Do not succumb to that temptation.. + +Focus first on the most significant aspects of the change: + +1. Does this change make sense for Foundry? +2. Does this change make Foundry better, even if only incrementally? +3. Are there clear bugs or larger scale issues that need attending? +4. Are the commit messages readable and correct? If it contains a breaking change, is it clear enough? + +Note that only **incremental** improvement is needed to land a PR. This means that the PR does not need to be perfect, only better than the status quo. Follow-up PRs may be opened to continue iterating. + +When changes are necessary, _request_ them, do not _demand_ them, and **do not assume that the submitter already knows how to add a test or run a benchmark**. + +Specific performance optimization techniques, coding styles and conventions change over time. The first impression you give to a new contributor never does. + +Nits (requests for small changes that are not essential) are fine, but try to avoid stalling the pull request. Most nits can typically be fixed by the Foundry maintainers merging the pull request, but they can also be an opportunity for the contributor to learn a bit more about the project. + +It is always good to clearly indicate nits when you comment, e.g.: `Nit: change foo() to bar(). But this is not blocking`. + +If your comments were addressed but were not folded after new commits, or if they proved to be mistaken, please, [hide them][hiding-a-comment] with the appropriate reason to keep the conversation flow concise and relevant. + +##### Be aware of the person behind the code + +Be aware that _how_ you communicate requests and reviews in your feedback can have a significant impact on the success of the pull request. Yes, we may merge a particular change that makes Foundry better, but the individual might just not want to have anything to do with Foundry ever again. The goal is not just having good code. + +##### Abandoned or stale pull requests + +If a pull request appears to be abandoned or stalled, it is polite to first check with the contributor to see if they intend to continue the work before checking if they would mind if you took it over (especially if it just has nits left). When doing so, it is courteous to give the original contributor credit for the work they started, either by preserving their name and e-mail address in the commit log, or by using the `Author: ` or `Co-authored-by: ` metadata tag in the commits. + +_Adapted from the [ethers-rs contributing guide](https://github.com/gakonst/ethers-rs/blob/master/CONTRIBUTING.md)_. + +### Releasing + +Releases are automatically done by the release workflow when a tag is pushed, however, these steps still need to be taken: + +1. Ensure that the versions in the relevant `Cargo.toml` files are up-to-date. +2. Update documentation links +3. Perform a final audit for breaking changes. + +[rust-coc]: https://github.com/rust-lang/rust/blob/master/CODE_OF_CONDUCT.md +[dev-tg]: https://t.me/foundry_rs +[foundry-book]: https://github.com/foundry-rs/foundry-book +[support-tg]: https://t.me/foundry_support +[mcve]: https://stackoverflow.com/help/mcve +[hiding-a-comment]: https://help.github.com/articles/managing-disruptive-comments/#hiding-a-comment \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/LICENSE-APACHE b/packages/wallet/wallet-contracts/Counter/lib/forge-std/LICENSE-APACHE new file mode 100644 index 000000000..cf01a499f --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/LICENSE-APACHE @@ -0,0 +1,203 @@ +Copyright Contributors to Forge Standard Library + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/LICENSE-MIT b/packages/wallet/wallet-contracts/Counter/lib/forge-std/LICENSE-MIT new file mode 100644 index 000000000..28f98304a --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright Contributors to Forge Standard Library + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER +DEALINGS IN THE SOFTWARE.R diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/README.md b/packages/wallet/wallet-contracts/Counter/lib/forge-std/README.md new file mode 100644 index 000000000..51673e5ee --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/README.md @@ -0,0 +1,266 @@ +# Forge Standard Library • [![CI status](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml/badge.svg)](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml) + +Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes. + +**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://getfoundry.sh/reference/forge-std/overview/).** + +## Install + +```bash +forge install foundry-rs/forge-std +``` + +## Contracts +### stdError + +This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler built-in errors. + +See the contract itself for all error codes. + +#### Example usage + +```solidity + +import "forge-std/Test.sol"; + +contract TestContract is Test { + ErrorsTest test; + + function setUp() public { + test = new ErrorsTest(); + } + + function testExpectArithmetic() public { + vm.expectRevert(stdError.arithmeticError); + test.arithmeticError(10); + } +} + +contract ErrorsTest { + function arithmeticError(uint256 a) public { + a = a - 100; + } +} +``` + +### stdStorage + +This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can *always* find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`). + +This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth. + +I.e.: +```solidity +struct T { + // depth 0 + uint256 a; + // depth 1 + uint256 b; +} +``` + +#### Example usage + +```solidity +import "forge-std/Test.sol"; + +contract TestContract is Test { + using stdStorage for StdStorage; + + Storage test; + + function setUp() public { + test = new Storage(); + } + + function testFindExists() public { + // Lets say we want to find the slot for the public + // variable `exists`. We just pass in the function selector + // to the `find` command + uint256 slot = stdstore.target(address(test)).sig("exists()").find(); + assertEq(slot, 0); + } + + function testWriteExists() public { + // Lets say we want to write to the slot for the public + // variable `exists`. We just pass in the function selector + // to the `checked_write` command + stdstore.target(address(test)).sig("exists()").checked_write(100); + assertEq(test.exists(), 100); + } + + // It supports arbitrary storage layouts, like assembly based storage locations + function testFindHidden() public { + // `hidden` is a random hash of a bytes, iteration through slots would + // not find it. Our mechanism does + // Also, you can use the selector instead of a string + uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find(); + assertEq(slot, uint256(keccak256("my.random.var"))); + } + + // If targeting a mapping, you have to pass in the keys necessary to perform the find + // i.e.: + function testFindMapping() public { + uint256 slot = stdstore + .target(address(test)) + .sig(test.map_addr.selector) + .with_key(address(this)) + .find(); + // in the `Storage` constructor, we wrote that this address' value was 1 in the map + // so when we load the slot, we expect it to be 1 + assertEq(uint(vm.load(address(test), bytes32(slot))), 1); + } + + // If the target is a struct, you can specify the field depth: + function testFindStruct() public { + // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc. + uint256 slot_for_a_field = stdstore + .target(address(test)) + .sig(test.basicStruct.selector) + .depth(0) + .find(); + + uint256 slot_for_b_field = stdstore + .target(address(test)) + .sig(test.basicStruct.selector) + .depth(1) + .find(); + + assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1); + assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2); + } +} + +// A complex storage contract +contract Storage { + struct UnpackedStruct { + uint256 a; + uint256 b; + } + + constructor() { + map_addr[msg.sender] = 1; + } + + uint256 public exists = 1; + mapping(address => uint256) public map_addr; + // mapping(address => Packed) public map_packed; + mapping(address => UnpackedStruct) public map_struct; + mapping(address => mapping(address => uint256)) public deep_map; + mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; + UnpackedStruct public basicStruct = UnpackedStruct({ + a: 1, + b: 2 + }); + + function hidden() public view returns (bytes32 t) { + // an extremely hidden storage slot + bytes32 slot = keccak256("my.random.var"); + assembly { + t := sload(slot) + } + } +} +``` + +### stdCheats + +This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for addresses that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you. + + +#### Example usage: +```solidity + +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; + +// Inherit the stdCheats +contract StdCheatsTest is Test { + Bar test; + function setUp() public { + test = new Bar(); + } + + function testHoax() public { + // we call `hoax`, which gives the target address + // eth and then calls `prank` + hoax(address(1337)); + test.bar{value: 100}(address(1337)); + + // overloaded to allow you to specify how much eth to + // initialize the address with + hoax(address(1337), 1); + test.bar{value: 1}(address(1337)); + } + + function testStartHoax() public { + // we call `startHoax`, which gives the target address + // eth and then calls `startPrank` + // + // it is also overloaded so that you can specify an eth amount + startHoax(address(1337)); + test.bar{value: 100}(address(1337)); + test.bar{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } +} + +contract Bar { + function bar(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + } +} +``` + +### Std Assertions + +Contains various assertions. + +### `console.log` + +Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log). +It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces. + +```solidity +// import it indirectly via Test.sol +import "forge-std/Test.sol"; +// or directly import it +import "forge-std/console2.sol"; +... +console2.log(someValue); +``` + +If you need compatibility with Hardhat, you must use the standard `console.sol` instead. +Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces. + +```solidity +// import it indirectly via Test.sol +import "forge-std/Test.sol"; +// or directly import it +import "forge-std/console.sol"; +... +console.log(someValue); +``` + +## Contributing + +See our [contributing guidelines](./CONTRIBUTING.md). + +## Getting Help + +First, see if the answer to your question can be found in [book](https://book.getfoundry.sh). + +If the answer is not there: + +- Join the [support Telegram](https://t.me/foundry_support) to get help, or +- Open a [discussion](https://github.com/foundry-rs/foundry/discussions/new/choose) with your question, or +- Open an issue with [the bug](https://github.com/foundry-rs/foundry/issues/new/choose) + +If you want to contribute, or follow along with contributor discussion, you can use our [main telegram](https://t.me/foundry_rs) to chat with us about the development of Foundry! + +## License + +Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license. diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/RELEASE_CHECKLIST.md b/packages/wallet/wallet-contracts/Counter/lib/forge-std/RELEASE_CHECKLIST.md new file mode 100644 index 000000000..4611de4dc --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/RELEASE_CHECKLIST.md @@ -0,0 +1,12 @@ +# Release checklist + +This checklist is meant to be used as a guide for the `forge-std` release process. + +## Steps + +- [ ] Update the version number in `package.json` +- [ ] Open and merge a PR with the version bump +- [ ] Tag the merged commit with the version number: `git tag v` +- [ ] Push the tag to the repository: `git push --tags` +- [ ] Create a new GitHub release with the automatically generated changelog and with the name set to `v` +- [ ] Add `## Featured Changes` section to the top of the release notes diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/foundry.toml b/packages/wallet/wallet-contracts/Counter/lib/forge-std/foundry.toml new file mode 100644 index 000000000..b68bd546c --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/foundry.toml @@ -0,0 +1,27 @@ +[profile.default] +fs_permissions = [{ access = "read-write", path = "./" }] +optimizer = true +optimizer_runs = 200 + +# A list of solidity error codes to ignore. +# 3860 = init-code-size +ignored_error_codes = [3860] + +[rpc_endpoints] +# The RPC URLs are modified versions of the default for testing initialization. +mainnet = "https://eth.merkle.io" # Different API key. +optimism_sepolia = "https://sepolia.optimism.io/" # Adds a trailing slash. +arbitrum_one_sepolia = "https://sepolia-rollup.arbitrum.io/rpc/" # Adds a trailing slash. +needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}" + +[fmt] +# These are all the `forge fmt` defaults. +line_length = 120 +tab_width = 4 +bracket_spacing = false +int_types = 'long' +multiline_func_header = 'attributes_first' +quote_style = 'double' +number_underscore = 'preserve' +single_line_statement_blocks = 'preserve' +ignore = ["src/console.sol", "src/console2.sol"] diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/package.json b/packages/wallet/wallet-contracts/Counter/lib/forge-std/package.json new file mode 100644 index 000000000..09f571732 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/package.json @@ -0,0 +1,16 @@ +{ + "name": "forge-std", + "version": "1.11.0", + "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", + "homepage": "https://book.getfoundry.sh/forge/forge-std", + "bugs": "https://github.com/foundry-rs/forge-std/issues", + "license": "(Apache-2.0 OR MIT)", + "author": "Contributors to Forge Standard Library", + "files": [ + "src/**/*" + ], + "repository": { + "type": "git", + "url": "https://github.com/foundry-rs/forge-std.git" + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/scripts/vm.py b/packages/wallet/wallet-contracts/Counter/lib/forge-std/scripts/vm.py new file mode 100644 index 000000000..3cd047d36 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/scripts/vm.py @@ -0,0 +1,646 @@ +#!/usr/bin/env python3 + +import argparse +import copy +import json +import re +import subprocess +from enum import Enum as PyEnum +from pathlib import Path +from typing import Callable +from urllib import request + +VoidFn = Callable[[], None] + +CHEATCODES_JSON_URL = "https://raw.githubusercontent.com/foundry-rs/foundry/master/crates/cheatcodes/assets/cheatcodes.json" +OUT_PATH = "src/Vm.sol" + +VM_SAFE_DOC = """\ +/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may +/// result in Script simulations differing from on-chain execution. It is recommended to only use +/// these cheats in scripts. +""" + +VM_DOC = """\ +/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used +/// in tests, but it is not recommended to use these cheats in scripts. +""" + + +def main(): + parser = argparse.ArgumentParser( + description="Generate Vm.sol based on the cheatcodes json created by Foundry") + parser.add_argument( + "--from", + metavar="PATH", + dest="path", + required=False, + help="path to a json file containing the Vm interface, as generated by Foundry") + args = parser.parse_args() + json_str = request.urlopen(CHEATCODES_JSON_URL).read().decode("utf-8") if args.path is None else Path(args.path).read_text() + contract = Cheatcodes.from_json(json_str) + + ccs = contract.cheatcodes + ccs = list(filter(lambda cc: cc.status not in ["experimental", "internal"], ccs)) + ccs.sort(key=lambda cc: cc.func.id) + + safe = list(filter(lambda cc: cc.safety == "safe", ccs)) + safe.sort(key=CmpCheatcode) + unsafe = list(filter(lambda cc: cc.safety == "unsafe", ccs)) + unsafe.sort(key=CmpCheatcode) + assert len(safe) + len(unsafe) == len(ccs) + + prefix_with_group_headers(safe) + prefix_with_group_headers(unsafe) + + out = "" + + out += "// Automatically @generated by scripts/vm.py. Do not modify manually.\n\n" + + pp = CheatcodesPrinter( + spdx_identifier="MIT OR Apache-2.0", + solidity_requirement=">=0.6.2 <0.9.0", + abicoder_pragma=True, + ) + pp.p_prelude() + pp.prelude = False + out += pp.finish() + + out += "\n\n" + out += VM_SAFE_DOC + vm_safe = Cheatcodes( + # TODO: Custom errors were introduced in 0.8.4 + errors=[], # contract.errors + events=contract.events, + enums=contract.enums, + structs=contract.structs, + cheatcodes=safe, + ) + pp.p_contract(vm_safe, "VmSafe") + out += pp.finish() + + out += "\n\n" + out += VM_DOC + vm_unsafe = Cheatcodes( + errors=[], + events=[], + enums=[], + structs=[], + cheatcodes=unsafe, + ) + pp.p_contract(vm_unsafe, "Vm", "VmSafe") + out += pp.finish() + + # Compatibility with <0.8.0 + def memory_to_calldata(m: re.Match) -> str: + return " calldata " + m.group(1) + + out = re.sub(r" memory (.*returns)", memory_to_calldata, out) + + with open(OUT_PATH, "w") as f: + f.write(out) + + forge_fmt = ["forge", "fmt", OUT_PATH] + res = subprocess.run(forge_fmt) + assert res.returncode == 0, f"command failed: {forge_fmt}" + + print(f"Wrote to {OUT_PATH}") + + +class CmpCheatcode: + cheatcode: "Cheatcode" + + def __init__(self, cheatcode: "Cheatcode"): + self.cheatcode = cheatcode + + def __lt__(self, other: "CmpCheatcode") -> bool: + return cmp_cheatcode(self.cheatcode, other.cheatcode) < 0 + + def __eq__(self, other: "CmpCheatcode") -> bool: + return cmp_cheatcode(self.cheatcode, other.cheatcode) == 0 + + def __gt__(self, other: "CmpCheatcode") -> bool: + return cmp_cheatcode(self.cheatcode, other.cheatcode) > 0 + + +def cmp_cheatcode(a: "Cheatcode", b: "Cheatcode") -> int: + if a.group != b.group: + return -1 if a.group < b.group else 1 + if a.status != b.status: + return -1 if a.status < b.status else 1 + if a.safety != b.safety: + return -1 if a.safety < b.safety else 1 + if a.func.id != b.func.id: + return -1 if a.func.id < b.func.id else 1 + return 0 + + +# HACK: A way to add group header comments without having to modify printer code +def prefix_with_group_headers(cheats: list["Cheatcode"]): + s = set() + for i, cheat in enumerate(cheats): + if cheat.group in s: + continue + + s.add(cheat.group) + + c = copy.deepcopy(cheat) + c.func.description = "" + c.func.declaration = f"// ======== {group(c.group)} ========" + cheats.insert(i, c) + return cheats + + +def group(s: str) -> str: + if s == "evm": + return "EVM" + if s == "json": + return "JSON" + return s[0].upper() + s[1:] + + +class Visibility(PyEnum): + EXTERNAL: str = "external" + PUBLIC: str = "public" + INTERNAL: str = "internal" + PRIVATE: str = "private" + + def __str__(self): + return self.value + + +class Mutability(PyEnum): + PURE: str = "pure" + VIEW: str = "view" + NONE: str = "" + + def __str__(self): + return self.value + + +class Function: + id: str + description: str + declaration: str + visibility: Visibility + mutability: Mutability + signature: str + selector: str + selector_bytes: bytes + + def __init__( + self, + id: str, + description: str, + declaration: str, + visibility: Visibility, + mutability: Mutability, + signature: str, + selector: str, + selector_bytes: bytes, + ): + self.id = id + self.description = description + self.declaration = declaration + self.visibility = visibility + self.mutability = mutability + self.signature = signature + self.selector = selector + self.selector_bytes = selector_bytes + + @staticmethod + def from_dict(d: dict) -> "Function": + return Function( + d["id"], + d["description"], + d["declaration"], + Visibility(d["visibility"]), + Mutability(d["mutability"]), + d["signature"], + d["selector"], + bytes(d["selectorBytes"]), + ) + + +class Cheatcode: + func: Function + group: str + status: str + safety: str + + def __init__(self, func: Function, group: str, status: str, safety: str): + self.func = func + self.group = group + self.status = status + self.safety = safety + + @staticmethod + def from_dict(d: dict) -> "Cheatcode": + return Cheatcode( + Function.from_dict(d["func"]), + str(d["group"]), + str(d["status"]), + str(d["safety"]), + ) + + +class Error: + name: str + description: str + declaration: str + + def __init__(self, name: str, description: str, declaration: str): + self.name = name + self.description = description + self.declaration = declaration + + @staticmethod + def from_dict(d: dict) -> "Error": + return Error(**d) + + +class Event: + name: str + description: str + declaration: str + + def __init__(self, name: str, description: str, declaration: str): + self.name = name + self.description = description + self.declaration = declaration + + @staticmethod + def from_dict(d: dict) -> "Event": + return Event(**d) + + +class EnumVariant: + name: str + description: str + + def __init__(self, name: str, description: str): + self.name = name + self.description = description + + +class Enum: + name: str + description: str + variants: list[EnumVariant] + + def __init__(self, name: str, description: str, variants: list[EnumVariant]): + self.name = name + self.description = description + self.variants = variants + + @staticmethod + def from_dict(d: dict) -> "Enum": + return Enum( + d["name"], + d["description"], + list(map(lambda v: EnumVariant(**v), d["variants"])), + ) + + +class StructField: + name: str + ty: str + description: str + + def __init__(self, name: str, ty: str, description: str): + self.name = name + self.ty = ty + self.description = description + + +class Struct: + name: str + description: str + fields: list[StructField] + + def __init__(self, name: str, description: str, fields: list[StructField]): + self.name = name + self.description = description + self.fields = fields + + @staticmethod + def from_dict(d: dict) -> "Struct": + return Struct( + d["name"], + d["description"], + list(map(lambda f: StructField(**f), d["fields"])), + ) + + +class Cheatcodes: + errors: list[Error] + events: list[Event] + enums: list[Enum] + structs: list[Struct] + cheatcodes: list[Cheatcode] + + def __init__( + self, + errors: list[Error], + events: list[Event], + enums: list[Enum], + structs: list[Struct], + cheatcodes: list[Cheatcode], + ): + self.errors = errors + self.events = events + self.enums = enums + self.structs = structs + self.cheatcodes = cheatcodes + + @staticmethod + def from_dict(d: dict) -> "Cheatcodes": + return Cheatcodes( + errors=[Error.from_dict(e) for e in d["errors"]], + events=[Event.from_dict(e) for e in d["events"]], + enums=[Enum.from_dict(e) for e in d["enums"]], + structs=[Struct.from_dict(e) for e in d["structs"]], + cheatcodes=[Cheatcode.from_dict(e) for e in d["cheatcodes"]], + ) + + @staticmethod + def from_json(s) -> "Cheatcodes": + return Cheatcodes.from_dict(json.loads(s)) + + @staticmethod + def from_json_file(file_path: str) -> "Cheatcodes": + with open(file_path, "r") as f: + return Cheatcodes.from_dict(json.load(f)) + + +class Item(PyEnum): + ERROR: str = "error" + EVENT: str = "event" + ENUM: str = "enum" + STRUCT: str = "struct" + FUNCTION: str = "function" + + +class ItemOrder: + _list: list[Item] + + def __init__(self, list: list[Item]) -> None: + assert len(list) <= len(Item), "list must not contain more items than Item" + assert len(list) == len(set(list)), "list must not contain duplicates" + self._list = list + pass + + def get_list(self) -> list[Item]: + return self._list + + @staticmethod + def default() -> "ItemOrder": + return ItemOrder( + [ + Item.ERROR, + Item.EVENT, + Item.ENUM, + Item.STRUCT, + Item.FUNCTION, + ] + ) + + +class CheatcodesPrinter: + buffer: str + + prelude: bool + spdx_identifier: str + solidity_requirement: str + abicoder_v2: bool + + block_doc_style: bool + + indent_level: int + _indent_str: str + + nl_str: str + + items_order: ItemOrder + + def __init__( + self, + buffer: str = "", + prelude: bool = True, + spdx_identifier: str = "UNLICENSED", + solidity_requirement: str = "", + abicoder_pragma: bool = False, + block_doc_style: bool = False, + indent_level: int = 0, + indent_with: int | str = 4, + nl_str: str = "\n", + items_order: ItemOrder = ItemOrder.default(), + ): + self.prelude = prelude + self.spdx_identifier = spdx_identifier + self.solidity_requirement = solidity_requirement + self.abicoder_v2 = abicoder_pragma + self.block_doc_style = block_doc_style + self.buffer = buffer + self.indent_level = indent_level + self.nl_str = nl_str + + if isinstance(indent_with, int): + assert indent_with >= 0 + self._indent_str = " " * indent_with + elif isinstance(indent_with, str): + self._indent_str = indent_with + else: + assert False, "indent_with must be int or str" + + self.items_order = items_order + + def finish(self) -> str: + ret = self.buffer.rstrip() + self.buffer = "" + return ret + + def p_contract(self, contract: Cheatcodes, name: str, inherits: str = ""): + if self.prelude: + self.p_prelude(contract) + + self._p_str("interface ") + name = name.strip() + if name != "": + self._p_str(name) + self._p_str(" ") + if inherits != "": + self._p_str("is ") + self._p_str(inherits) + self._p_str(" ") + self._p_str("{") + self._p_nl() + self._with_indent(lambda: self._p_items(contract)) + self._p_str("}") + self._p_nl() + + def _p_items(self, contract: Cheatcodes): + for item in self.items_order.get_list(): + if item == Item.ERROR: + self.p_errors(contract.errors) + elif item == Item.EVENT: + self.p_events(contract.events) + elif item == Item.ENUM: + self.p_enums(contract.enums) + elif item == Item.STRUCT: + self.p_structs(contract.structs) + elif item == Item.FUNCTION: + self.p_functions(contract.cheatcodes) + else: + assert False, f"unknown item {item}" + + def p_prelude(self, contract: Cheatcodes | None = None): + self._p_str(f"// SPDX-License-Identifier: {self.spdx_identifier}") + self._p_nl() + + if self.solidity_requirement != "": + req = self.solidity_requirement + elif contract and len(contract.errors) > 0: + req = ">=0.8.4 <0.9.0" + else: + req = ">=0.6.0 <0.9.0" + self._p_str(f"pragma solidity {req};") + self._p_nl() + + if self.abicoder_v2: + self._p_str("pragma experimental ABIEncoderV2;") + self._p_nl() + + self._p_nl() + + def p_errors(self, errors: list[Error]): + for error in errors: + self._p_line(lambda: self.p_error(error)) + + def p_error(self, error: Error): + self._p_comment(error.description, doc=True) + self._p_line(lambda: self._p_str(error.declaration)) + + def p_events(self, events: list[Event]): + for event in events: + self._p_line(lambda: self.p_event(event)) + + def p_event(self, event: Event): + self._p_comment(event.description, doc=True) + self._p_line(lambda: self._p_str(event.declaration)) + + def p_enums(self, enums: list[Enum]): + for enum in enums: + self._p_line(lambda: self.p_enum(enum)) + + def p_enum(self, enum: Enum): + self._p_comment(enum.description, doc=True) + self._p_line(lambda: self._p_str(f"enum {enum.name} {{")) + self._with_indent(lambda: self.p_enum_variants(enum.variants)) + self._p_line(lambda: self._p_str("}")) + + def p_enum_variants(self, variants: list[EnumVariant]): + for i, variant in enumerate(variants): + self._p_indent() + self._p_comment(variant.description) + + self._p_indent() + self._p_str(variant.name) + if i < len(variants) - 1: + self._p_str(",") + self._p_nl() + + def p_structs(self, structs: list[Struct]): + for struct in structs: + self._p_line(lambda: self.p_struct(struct)) + + def p_struct(self, struct: Struct): + self._p_comment(struct.description, doc=True) + self._p_line(lambda: self._p_str(f"struct {struct.name} {{")) + self._with_indent(lambda: self.p_struct_fields(struct.fields)) + self._p_line(lambda: self._p_str("}")) + + def p_struct_fields(self, fields: list[StructField]): + for field in fields: + self._p_line(lambda: self.p_struct_field(field)) + + def p_struct_field(self, field: StructField): + self._p_comment(field.description) + self._p_indented(lambda: self._p_str(f"{field.ty} {field.name};")) + + def p_functions(self, cheatcodes: list[Cheatcode]): + for cheatcode in cheatcodes: + self._p_line(lambda: self.p_function(cheatcode.func)) + + def p_function(self, func: Function): + self._p_comment(func.description, doc=True) + self._p_line(lambda: self._p_str(func.declaration)) + + def _p_comment(self, s: str, doc: bool = False): + s = s.strip() + if s == "": + return + + s = map(lambda line: line.lstrip(), s.split("\n")) + if self.block_doc_style: + self._p_str("/*") + if doc: + self._p_str("*") + self._p_nl() + for line in s: + self._p_indent() + self._p_str(" ") + if doc: + self._p_str("* ") + self._p_str(line) + self._p_nl() + self._p_indent() + self._p_str(" */") + self._p_nl() + else: + first_line = True + for line in s: + if not first_line: + self._p_indent() + first_line = False + + if doc: + self._p_str("/// ") + else: + self._p_str("// ") + self._p_str(line) + self._p_nl() + + def _with_indent(self, f: VoidFn): + self._inc_indent() + f() + self._dec_indent() + + def _p_line(self, f: VoidFn): + self._p_indent() + f() + self._p_nl() + + def _p_indented(self, f: VoidFn): + self._p_indent() + f() + + def _p_indent(self): + for _ in range(self.indent_level): + self._p_str(self._indent_str) + + def _p_nl(self): + self._p_str(self.nl_str) + + def _p_str(self, txt: str): + self.buffer += txt + + def _inc_indent(self): + self.indent_level += 1 + + def _dec_indent(self): + self.indent_level -= 1 + + +if __name__ == "__main__": + main() diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Base.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Base.sol new file mode 100644 index 000000000..52a508210 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Base.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {StdStorage} from "./StdStorage.sol"; +import {Vm, VmSafe} from "./Vm.sol"; + +abstract contract CommonBase { + /// @dev Cheat code address. + /// Calculated as `address(uint160(uint256(keccak256("hevm cheat code"))))`. + address internal constant VM_ADDRESS = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D; + + /// @dev console.sol and console2.sol work by executing a staticcall to this address. + /// Calculated as `address(uint160(uint88(bytes11("console.log"))))`. + address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; + + /// @dev Used when deploying with create2. + /// Taken from https://github.com/Arachnid/deterministic-deployment-proxy. + address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + + /// @dev The default address for tx.origin and msg.sender. + /// Calculated as `address(uint160(uint256(keccak256("foundry default caller"))))`. + address internal constant DEFAULT_SENDER = 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38; + + /// @dev The address of the first contract `CREATE`d by a running test contract. + /// When running tests, each test contract is `CREATE`d by `DEFAULT_SENDER` with nonce 1. + /// Calculated as `VM.computeCreateAddress(VM.computeCreateAddress(DEFAULT_SENDER, 1), 1)`. + address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; + + /// @dev Deterministic deployment address of the Multicall3 contract. + /// Taken from https://www.multicall3.com. + address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11; + + /// @dev The order of the secp256k1 curve. + uint256 internal constant SECP256K1_ORDER = + 115792089237316195423570985008687907852837564279074904382605163141518161494337; + + uint256 internal constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + Vm internal constant vm = Vm(VM_ADDRESS); + StdStorage internal stdstore; +} + +abstract contract TestBase is CommonBase {} + +abstract contract ScriptBase is CommonBase { + VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Config.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Config.sol new file mode 100644 index 000000000..1c63c8721 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Config.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {console} from "./console.sol"; +import {StdConfig} from "./StdConfig.sol"; +import {CommonBase} from "./Base.sol"; + +/// @notice Boilerplate to streamline the setup of multi-chain environments. +abstract contract Config is CommonBase { + // -- STORAGE (CONFIG + CHAINS + FORKS) ------------------------------------ + + /// @dev Contract instance holding the data from the TOML config file. + StdConfig internal config; + + /// @dev Array of chain IDs for which forks have been created. + uint256[] internal chainIds; + + /// @dev A mapping from a chain ID to its initialized fork ID. + mapping(uint256 => uint256) internal forkOf; + + // -- HELPER FUNCTIONS ----------------------------------------------------- + + /// @notice Loads configuration from a file. + /// + /// @dev This function instantiates a `Config` contract, caching all its config variables. + /// + /// @param filePath: the path to the TOML configuration file. + /// @param writeToFile: whether updates are written back to the TOML file. + function _loadConfig(string memory filePath, bool writeToFile) internal { + console.log("----------"); + console.log(string.concat("Loading config from '", filePath, "'")); + config = new StdConfig(filePath, writeToFile); + vm.makePersistent(address(config)); + console.log("Config successfully loaded"); + console.log("----------"); + } + + /// @notice Loads configuration from a file and creates forks for each specified chain. + /// + /// @dev This function instantiates a `Config` contract, caching all its config variables, + /// reads the configured chain ids, and iterates through them to create a fork for each one. + /// It also creates a map `forkOf[chainId] -> forkId` to easily switch between forks. + /// + /// @param filePath: the path to the TOML configuration file. + /// @param writeToFile: whether updates are written back to the TOML file. + function _loadConfigAndForks(string memory filePath, bool writeToFile) internal { + _loadConfig(filePath, writeToFile); + + console.log("Setting up forks for the configured chains..."); + uint256[] memory chains = config.getChainIds(); + for (uint256 i = 0; i < chains.length; i++) { + uint256 chainId = chains[i]; + uint256 forkId = vm.createFork(config.getRpcUrl(chainId)); + forkOf[chainId] = forkId; + chainIds.push(chainId); + } + console.log("Forks successfully created"); + console.log("----------"); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/LibVariable.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/LibVariable.sol new file mode 100644 index 000000000..c46b15328 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/LibVariable.sol @@ -0,0 +1,477 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +// Enable globally. +using LibVariable for Variable global; + +struct Variable { + Type ty; + bytes data; +} + +struct Type { + TypeKind kind; + bool isArray; +} + +enum TypeKind { + None, + Bool, + Address, + Bytes32, + Uint256, + Int256, + String, + Bytes +} + +/// @notice Library for type-safe coercion of the `Variable` struct to concrete types. +/// +/// @dev Ensures that when a `Variable` is cast to a concrete Solidity type, the operation is safe and the +/// underlying type matches what is expected. +/// Provides functions to check types, convert them to strings, and coerce `Variable` instances into +/// both single values and arrays of various types. +/// +/// Usage example: +/// ```solidity +/// import {LibVariable} from "./LibVariable.sol"; +/// +/// contract MyContract { +/// using LibVariable for Variable; +/// StdConfig config; // Assume 'config' is an instance of `StdConfig` and has already been loaded. +/// +/// function readValues() public { +/// // Retrieve a 'uint256' value from the config. +/// uint256 myNumber = config.get("important_number").toUint256(); +/// +/// // Would revert with `TypeMismatch` as 'important_number' isn't a `uint256` in the config file. +/// // string memory notANumber = config.get("important_number").toString(); +/// +/// // Retrieve a address array from the config. +/// string[] memory admins = config.get("whitelisted_admins").toAddressArray(); +/// } +/// } +/// ``` +library LibVariable { + error NotInitialized(); + error TypeMismatch(string expected, string actual); + error UnsafeCast(string message); + + // -- TYPE HELPERS ---------------------------------------------------- + + /// @notice Compares two Type instances for equality. + function isEqual(Type memory self, Type memory other) internal pure returns (bool) { + return self.kind == other.kind && self.isArray == other.isArray; + } + + /// @notice Compares two Type instances for equality. Reverts if they are not equal. + function assertEq(Type memory self, Type memory other) internal pure { + if (!isEqual(self, other)) { + revert TypeMismatch(toString(other), toString(self)); + } + } + + /// @notice Converts a Type struct to its full string representation (i.e. "uint256[]"). + function toString(Type memory self) internal pure returns (string memory) { + string memory tyStr = toString(self.kind); + if (!self.isArray || self.kind == TypeKind.None) { + return tyStr; + } else { + return string.concat(tyStr, "[]"); + } + } + + /// @dev Converts a `TypeKind` enum to its base string representation. + function toString(TypeKind self) internal pure returns (string memory) { + if (self == TypeKind.Bool) return "bool"; + if (self == TypeKind.Address) return "address"; + if (self == TypeKind.Bytes32) return "bytes32"; + if (self == TypeKind.Uint256) return "uint256"; + if (self == TypeKind.Int256) return "int256"; + if (self == TypeKind.String) return "string"; + if (self == TypeKind.Bytes) return "bytes"; + return "none"; + } + + /// @dev Converts a `TypeKind` enum to its base string representation. + function toTomlKey(TypeKind self) internal pure returns (string memory) { + if (self == TypeKind.Bool) return "bool"; + if (self == TypeKind.Address) return "address"; + if (self == TypeKind.Bytes32) return "bytes32"; + if (self == TypeKind.Uint256) return "uint"; + if (self == TypeKind.Int256) return "int"; + if (self == TypeKind.String) return "string"; + if (self == TypeKind.Bytes) return "bytes"; + return "none"; + } + + // -- VARIABLE HELPERS ---------------------------------------------------- + + /// @dev Checks if a `Variable` has been initialized and matches the expected type reverting if not. + modifier check(Variable memory self, Type memory expected) { + assertExists(self); + assertEq(self.ty, expected); + _; + } + + /// @dev Checks if a `Variable` has been initialized, reverting if not. + function assertExists(Variable memory self) public pure { + if (self.ty.kind == TypeKind.None) { + revert NotInitialized(); + } + } + + // -- VARIABLE COERCION FUNCTIONS (SINGLE VALUES) -------------------------- + + /// @notice Coerces a `Variable` to a `bool` value. + function toBool(Variable memory self) internal pure check(self, Type(TypeKind.Bool, false)) returns (bool) { + return abi.decode(self.data, (bool)); + } + + /// @notice Coerces a `Variable` to an `address` value. + function toAddress(Variable memory self) + internal + pure + check(self, Type(TypeKind.Address, false)) + returns (address) + { + return abi.decode(self.data, (address)); + } + + /// @notice Coerces a `Variable` to a `bytes32` value. + function toBytes32(Variable memory self) + internal + pure + check(self, Type(TypeKind.Bytes32, false)) + returns (bytes32) + { + return abi.decode(self.data, (bytes32)); + } + + /// @notice Coerces a `Variable` to a `uint256` value. + function toUint256(Variable memory self) + internal + pure + check(self, Type(TypeKind.Uint256, false)) + returns (uint256) + { + return abi.decode(self.data, (uint256)); + } + + /// @notice Coerces a `Variable` to a `uint128` value, checking for overflow. + function toUint128(Variable memory self) internal pure returns (uint128) { + uint256 value = self.toUint256(); + if (value > type(uint128).max) { + revert UnsafeCast("value does not fit in 'uint128'"); + } + return uint128(value); + } + + /// @notice Coerces a `Variable` to a `uint64` value, checking for overflow. + function toUint64(Variable memory self) internal pure returns (uint64) { + uint256 value = self.toUint256(); + if (value > type(uint64).max) { + revert UnsafeCast("value does not fit in 'uint64'"); + } + return uint64(value); + } + + /// @notice Coerces a `Variable` to a `uint32` value, checking for overflow. + function toUint32(Variable memory self) internal pure returns (uint32) { + uint256 value = self.toUint256(); + if (value > type(uint32).max) { + revert UnsafeCast("value does not fit in 'uint32'"); + } + return uint32(value); + } + + /// @notice Coerces a `Variable` to a `uint16` value, checking for overflow. + function toUint16(Variable memory self) internal pure returns (uint16) { + uint256 value = self.toUint256(); + if (value > type(uint16).max) { + revert UnsafeCast("value does not fit in 'uint16'"); + } + return uint16(value); + } + + /// @notice Coerces a `Variable` to a `uint8` value, checking for overflow. + function toUint8(Variable memory self) internal pure returns (uint8) { + uint256 value = self.toUint256(); + if (value > type(uint8).max) { + revert UnsafeCast("value does not fit in 'uint8'"); + } + return uint8(value); + } + + /// @notice Coerces a `Variable` to an `int256` value. + function toInt256(Variable memory self) internal pure check(self, Type(TypeKind.Int256, false)) returns (int256) { + return abi.decode(self.data, (int256)); + } + + /// @notice Coerces a `Variable` to an `int128` value, checking for overflow/underflow. + function toInt128(Variable memory self) internal pure returns (int128) { + int256 value = self.toInt256(); + if (value > type(int128).max || value < type(int128).min) { + revert UnsafeCast("value does not fit in 'int128'"); + } + return int128(value); + } + + /// @notice Coerces a `Variable` to an `int64` value, checking for overflow/underflow. + function toInt64(Variable memory self) internal pure returns (int64) { + int256 value = self.toInt256(); + if (value > type(int64).max || value < type(int64).min) { + revert UnsafeCast("value does not fit in 'int64'"); + } + return int64(value); + } + + /// @notice Coerces a `Variable` to an `int32` value, checking for overflow/underflow. + function toInt32(Variable memory self) internal pure returns (int32) { + int256 value = self.toInt256(); + if (value > type(int32).max || value < type(int32).min) { + revert UnsafeCast("value does not fit in 'int32'"); + } + return int32(value); + } + + /// @notice Coerces a `Variable` to an `int16` value, checking for overflow/underflow. + function toInt16(Variable memory self) internal pure returns (int16) { + int256 value = self.toInt256(); + if (value > type(int16).max || value < type(int16).min) { + revert UnsafeCast("value does not fit in 'int16'"); + } + return int16(value); + } + + /// @notice Coerces a `Variable` to an `int8` value, checking for overflow/underflow. + function toInt8(Variable memory self) internal pure returns (int8) { + int256 value = self.toInt256(); + if (value > type(int8).max || value < type(int8).min) { + revert UnsafeCast("value does not fit in 'int8'"); + } + return int8(value); + } + + /// @notice Coerces a `Variable` to a `string` value. + function toString(Variable memory self) + internal + pure + check(self, Type(TypeKind.String, false)) + returns (string memory) + { + return abi.decode(self.data, (string)); + } + + /// @notice Coerces a `Variable` to a `bytes` value. + function toBytes(Variable memory self) + internal + pure + check(self, Type(TypeKind.Bytes, false)) + returns (bytes memory) + { + return abi.decode(self.data, (bytes)); + } + + // -- VARIABLE COERCION FUNCTIONS (ARRAYS) --------------------------------- + + /// @notice Coerces a `Variable` to a `bool` array. + function toBoolArray(Variable memory self) + internal + pure + check(self, Type(TypeKind.Bool, true)) + returns (bool[] memory) + { + return abi.decode(self.data, (bool[])); + } + + /// @notice Coerces a `Variable` to an `address` array. + function toAddressArray(Variable memory self) + internal + pure + check(self, Type(TypeKind.Address, true)) + returns (address[] memory) + { + return abi.decode(self.data, (address[])); + } + + /// @notice Coerces a `Variable` to a `bytes32` array. + function toBytes32Array(Variable memory self) + internal + pure + check(self, Type(TypeKind.Bytes32, true)) + returns (bytes32[] memory) + { + return abi.decode(self.data, (bytes32[])); + } + + /// @notice Coerces a `Variable` to a `uint256` array. + function toUint256Array(Variable memory self) + internal + pure + check(self, Type(TypeKind.Uint256, true)) + returns (uint256[] memory) + { + return abi.decode(self.data, (uint256[])); + } + + /// @notice Coerces a `Variable` to a `uint128` array, checking for overflow. + function toUint128Array(Variable memory self) internal pure returns (uint128[] memory) { + uint256[] memory values = self.toUint256Array(); + uint128[] memory result = new uint128[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(uint128).max) { + revert UnsafeCast("value in array does not fit in 'uint128'"); + } + result[i] = uint128(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `uint64` array, checking for overflow. + function toUint64Array(Variable memory self) internal pure returns (uint64[] memory) { + uint256[] memory values = self.toUint256Array(); + uint64[] memory result = new uint64[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(uint64).max) { + revert UnsafeCast("value in array does not fit in 'uint64'"); + } + result[i] = uint64(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `uint32` array, checking for overflow. + function toUint32Array(Variable memory self) internal pure returns (uint32[] memory) { + uint256[] memory values = self.toUint256Array(); + uint32[] memory result = new uint32[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(uint32).max) { + revert UnsafeCast("value in array does not fit in 'uint32'"); + } + result[i] = uint32(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `uint16` array, checking for overflow. + function toUint16Array(Variable memory self) internal pure returns (uint16[] memory) { + uint256[] memory values = self.toUint256Array(); + uint16[] memory result = new uint16[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(uint16).max) { + revert UnsafeCast("value in array does not fit in 'uint16'"); + } + result[i] = uint16(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `uint8` array, checking for overflow. + function toUint8Array(Variable memory self) internal pure returns (uint8[] memory) { + uint256[] memory values = self.toUint256Array(); + uint8[] memory result = new uint8[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(uint8).max) { + revert UnsafeCast("value in array does not fit in 'uint8'"); + } + result[i] = uint8(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to an `int256` array. + function toInt256Array(Variable memory self) + internal + pure + check(self, Type(TypeKind.Int256, true)) + returns (int256[] memory) + { + return abi.decode(self.data, (int256[])); + } + + /// @notice Coerces a `Variable` to a `int128` array, checking for overflow/underflow. + function toInt128Array(Variable memory self) internal pure returns (int128[] memory) { + int256[] memory values = self.toInt256Array(); + int128[] memory result = new int128[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(int128).max || values[i] < type(int128).min) { + revert UnsafeCast("value in array does not fit in 'int128'"); + } + result[i] = int128(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `int64` array, checking for overflow/underflow. + function toInt64Array(Variable memory self) internal pure returns (int64[] memory) { + int256[] memory values = self.toInt256Array(); + int64[] memory result = new int64[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(int64).max || values[i] < type(int64).min) { + revert UnsafeCast("value in array does not fit in 'int64'"); + } + result[i] = int64(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `int32` array, checking for overflow/underflow. + function toInt32Array(Variable memory self) internal pure returns (int32[] memory) { + int256[] memory values = self.toInt256Array(); + int32[] memory result = new int32[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(int32).max || values[i] < type(int32).min) { + revert UnsafeCast("value in array does not fit in 'int32'"); + } + result[i] = int32(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `int16` array, checking for overflow/underflow. + function toInt16Array(Variable memory self) internal pure returns (int16[] memory) { + int256[] memory values = self.toInt256Array(); + int16[] memory result = new int16[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(int16).max || values[i] < type(int16).min) { + revert UnsafeCast("value in array does not fit in 'int16'"); + } + result[i] = int16(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `int8` array, checking for overflow/underflow. + function toInt8Array(Variable memory self) internal pure returns (int8[] memory) { + int256[] memory values = self.toInt256Array(); + int8[] memory result = new int8[](values.length); + for (uint256 i = 0; i < values.length; i++) { + if (values[i] > type(int8).max || values[i] < type(int8).min) { + revert UnsafeCast("value in array does not fit in 'int8'"); + } + result[i] = int8(values[i]); + } + return result; + } + + /// @notice Coerces a `Variable` to a `string` array. + function toStringArray(Variable memory self) + internal + pure + check(self, Type(TypeKind.String, true)) + returns (string[] memory) + { + return abi.decode(self.data, (string[])); + } + + /// @notice Coerces a `Variable` to a `bytes` array. + function toBytesArray(Variable memory self) + internal + pure + check(self, Type(TypeKind.Bytes, true)) + returns (bytes[] memory) + { + return abi.decode(self.data, (bytes[])); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Script.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Script.sol new file mode 100644 index 000000000..a2e2aa1cd --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Script.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +// 💬 ABOUT +// Forge Std's default Script. + +// 🧩 MODULES +import {console} from "./console.sol"; +import {console2} from "./console2.sol"; +import {safeconsole} from "./safeconsole.sol"; +import {StdChains} from "./StdChains.sol"; +import {StdCheatsSafe} from "./StdCheats.sol"; +import {StdConstants} from "./StdConstants.sol"; +import {stdJson} from "./StdJson.sol"; +import {stdMath} from "./StdMath.sol"; +import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; +import {StdStyle} from "./StdStyle.sol"; +import {StdUtils} from "./StdUtils.sol"; +import {VmSafe} from "./Vm.sol"; + +// 📦 BOILERPLATE +import {ScriptBase} from "./Base.sol"; + +// ⭐️ SCRIPT +abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils { + // Note: IS_SCRIPT() must return true. + bool public IS_SCRIPT = true; +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdAssertions.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdAssertions.sol new file mode 100644 index 000000000..4248170da --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdAssertions.sol @@ -0,0 +1,764 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; +pragma experimental ABIEncoderV2; + +import {Vm} from "./Vm.sol"; + +abstract contract StdAssertions { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + event log(string); + event logs(bytes); + + event log_address(address); + event log_bytes32(bytes32); + event log_int(int256); + event log_uint(uint256); + event log_bytes(bytes); + event log_string(string); + + event log_named_address(string key, address val); + event log_named_bytes32(string key, bytes32 val); + event log_named_decimal_int(string key, int256 val, uint256 decimals); + event log_named_decimal_uint(string key, uint256 val, uint256 decimals); + event log_named_int(string key, int256 val); + event log_named_uint(string key, uint256 val); + event log_named_bytes(string key, bytes val); + event log_named_string(string key, string val); + + event log_array(uint256[] val); + event log_array(int256[] val); + event log_array(address[] val); + event log_named_array(string key, uint256[] val); + event log_named_array(string key, int256[] val); + event log_named_array(string key, address[] val); + + bytes32 private constant FAILED_SLOT = bytes32("failed"); + + bool private _failed; + + function failed() public view returns (bool) { + if (_failed) { + return true; + } else { + return vm.load(address(vm), FAILED_SLOT) != bytes32(0); + } + } + + function fail() internal virtual { + vm.store(address(vm), FAILED_SLOT, bytes32(uint256(1))); + _failed = true; + } + + function fail(string memory message) internal virtual { + fail(); + vm.assertTrue(false, message); + } + + function assertTrue(bool data) internal pure virtual { + if (!data) { + vm.assertTrue(data); + } + } + + function assertTrue(bool data, string memory err) internal pure virtual { + if (!data) { + vm.assertTrue(data, err); + } + } + + function assertFalse(bool data) internal pure virtual { + if (data) { + vm.assertFalse(data); + } + } + + function assertFalse(bool data, string memory err) internal pure virtual { + if (data) { + vm.assertFalse(data, err); + } + } + + function assertEq(bool left, bool right) internal pure virtual { + if (left != right) { + vm.assertEq(left, right); + } + } + + function assertEq(bool left, bool right, string memory err) internal pure virtual { + if (left != right) { + vm.assertEq(left, right, err); + } + } + + function assertEq(uint256 left, uint256 right) internal pure virtual { + if (left != right) { + vm.assertEq(left, right); + } + } + + function assertEq(uint256 left, uint256 right, string memory err) internal pure virtual { + if (left != right) { + vm.assertEq(left, right, err); + } + } + + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertEqDecimal(left, right, decimals); + } + + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertEqDecimal(left, right, decimals, err); + } + + function assertEq(int256 left, int256 right) internal pure virtual { + if (left != right) { + vm.assertEq(left, right); + } + } + + function assertEq(int256 left, int256 right, string memory err) internal pure virtual { + if (left != right) { + vm.assertEq(left, right, err); + } + } + + function assertEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertEqDecimal(left, right, decimals); + } + + function assertEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertEqDecimal(left, right, decimals, err); + } + + function assertEq(address left, address right) internal pure virtual { + if (left != right) { + vm.assertEq(left, right); + } + } + + function assertEq(address left, address right, string memory err) internal pure virtual { + if (left != right) { + vm.assertEq(left, right, err); + } + } + + function assertEq(bytes32 left, bytes32 right) internal pure virtual { + if (left != right) { + vm.assertEq(left, right); + } + } + + function assertEq(bytes32 left, bytes32 right, string memory err) internal pure virtual { + if (left != right) { + vm.assertEq(left, right, err); + } + } + + function assertEq32(bytes32 left, bytes32 right) internal pure virtual { + if (left != right) { + vm.assertEq(left, right); + } + } + + function assertEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual { + if (left != right) { + vm.assertEq(left, right, err); + } + } + + function assertEq(string memory left, string memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(string memory left, string memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bytes memory left, bytes memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bytes memory left, bytes memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bool[] memory left, bool[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(uint256[] memory left, uint256[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(int256[] memory left, int256[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(address[] memory left, address[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(address[] memory left, address[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(string[] memory left, string[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(string[] memory left, string[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + function assertEq(bytes[] memory left, bytes[] memory right) internal pure virtual { + vm.assertEq(left, right); + } + + function assertEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual { + vm.assertEq(left, right, err); + } + + // Legacy helper + function assertEqUint(uint256 left, uint256 right) internal pure virtual { + assertEq(left, right); + } + + function assertNotEq(bool left, bool right) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right); + } + } + + function assertNotEq(bool left, bool right, string memory err) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right, err); + } + } + + function assertNotEq(uint256 left, uint256 right) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right); + } + } + + function assertNotEq(uint256 left, uint256 right, string memory err) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right, err); + } + } + + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertNotEqDecimal(left, right, decimals); + } + + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) + internal + pure + virtual + { + vm.assertNotEqDecimal(left, right, decimals, err); + } + + function assertNotEq(int256 left, int256 right) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right); + } + } + + function assertNotEq(int256 left, int256 right, string memory err) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right, err); + } + } + + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertNotEqDecimal(left, right, decimals); + } + + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertNotEqDecimal(left, right, decimals, err); + } + + function assertNotEq(address left, address right) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right); + } + } + + function assertNotEq(address left, address right, string memory err) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right, err); + } + } + + function assertNotEq(bytes32 left, bytes32 right) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right); + } + } + + function assertNotEq(bytes32 left, bytes32 right, string memory err) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right, err); + } + } + + function assertNotEq32(bytes32 left, bytes32 right) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right); + } + } + + function assertNotEq32(bytes32 left, bytes32 right, string memory err) internal pure virtual { + if (left == right) { + vm.assertNotEq(left, right, err); + } + } + + function assertNotEq(string memory left, string memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(string memory left, string memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bytes memory left, bytes memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bytes memory left, bytes memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bool[] memory left, bool[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bool[] memory left, bool[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(uint256[] memory left, uint256[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(uint256[] memory left, uint256[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(int256[] memory left, int256[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(int256[] memory left, int256[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(address[] memory left, address[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(address[] memory left, address[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bytes32[] memory left, bytes32[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bytes32[] memory left, bytes32[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(string[] memory left, string[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(string[] memory left, string[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertNotEq(bytes[] memory left, bytes[] memory right) internal pure virtual { + vm.assertNotEq(left, right); + } + + function assertNotEq(bytes[] memory left, bytes[] memory right, string memory err) internal pure virtual { + vm.assertNotEq(left, right, err); + } + + function assertLt(uint256 left, uint256 right) internal pure virtual { + if (left >= right) { + vm.assertLt(left, right); + } + } + + function assertLt(uint256 left, uint256 right, string memory err) internal pure virtual { + if (left >= right) { + vm.assertLt(left, right, err); + } + } + + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertLtDecimal(left, right, decimals); + } + + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertLtDecimal(left, right, decimals, err); + } + + function assertLt(int256 left, int256 right) internal pure virtual { + if (left >= right) { + vm.assertLt(left, right); + } + } + + function assertLt(int256 left, int256 right, string memory err) internal pure virtual { + if (left >= right) { + vm.assertLt(left, right, err); + } + } + + function assertLtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertLtDecimal(left, right, decimals); + } + + function assertLtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertLtDecimal(left, right, decimals, err); + } + + function assertGt(uint256 left, uint256 right) internal pure virtual { + if (left <= right) { + vm.assertGt(left, right); + } + } + + function assertGt(uint256 left, uint256 right, string memory err) internal pure virtual { + if (left <= right) { + vm.assertGt(left, right, err); + } + } + + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertGtDecimal(left, right, decimals); + } + + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertGtDecimal(left, right, decimals, err); + } + + function assertGt(int256 left, int256 right) internal pure virtual { + if (left <= right) { + vm.assertGt(left, right); + } + } + + function assertGt(int256 left, int256 right, string memory err) internal pure virtual { + if (left <= right) { + vm.assertGt(left, right, err); + } + } + + function assertGtDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertGtDecimal(left, right, decimals); + } + + function assertGtDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertGtDecimal(left, right, decimals, err); + } + + function assertLe(uint256 left, uint256 right) internal pure virtual { + if (left > right) { + vm.assertLe(left, right); + } + } + + function assertLe(uint256 left, uint256 right, string memory err) internal pure virtual { + if (left > right) { + vm.assertLe(left, right, err); + } + } + + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertLeDecimal(left, right, decimals); + } + + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertLeDecimal(left, right, decimals, err); + } + + function assertLe(int256 left, int256 right) internal pure virtual { + if (left > right) { + vm.assertLe(left, right); + } + } + + function assertLe(int256 left, int256 right, string memory err) internal pure virtual { + if (left > right) { + vm.assertLe(left, right, err); + } + } + + function assertLeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertLeDecimal(left, right, decimals); + } + + function assertLeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertLeDecimal(left, right, decimals, err); + } + + function assertGe(uint256 left, uint256 right) internal pure virtual { + if (left < right) { + vm.assertGe(left, right); + } + } + + function assertGe(uint256 left, uint256 right, string memory err) internal pure virtual { + if (left < right) { + vm.assertGe(left, right, err); + } + } + + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) internal pure virtual { + vm.assertGeDecimal(left, right, decimals); + } + + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertGeDecimal(left, right, decimals, err); + } + + function assertGe(int256 left, int256 right) internal pure virtual { + if (left < right) { + vm.assertGe(left, right); + } + } + + function assertGe(int256 left, int256 right, string memory err) internal pure virtual { + if (left < right) { + vm.assertGe(left, right, err); + } + } + + function assertGeDecimal(int256 left, int256 right, uint256 decimals) internal pure virtual { + vm.assertGeDecimal(left, right, decimals); + } + + function assertGeDecimal(int256 left, int256 right, uint256 decimals, string memory err) internal pure virtual { + vm.assertGeDecimal(left, right, decimals, err); + } + + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) internal pure virtual { + vm.assertApproxEqAbs(left, right, maxDelta); + } + + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string memory err) + internal + pure + virtual + { + vm.assertApproxEqAbs(left, right, maxDelta, err); + } + + function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) + internal + pure + virtual + { + vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals); + } + + function assertApproxEqAbsDecimal( + uint256 left, + uint256 right, + uint256 maxDelta, + uint256 decimals, + string memory err + ) internal pure virtual { + vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err); + } + + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) internal pure virtual { + vm.assertApproxEqAbs(left, right, maxDelta); + } + + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string memory err) internal pure virtual { + vm.assertApproxEqAbs(left, right, maxDelta, err); + } + + function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) + internal + pure + virtual + { + vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals); + } + + function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals, string memory err) + internal + pure + virtual + { + vm.assertApproxEqAbsDecimal(left, right, maxDelta, decimals, err); + } + + function assertApproxEqRel( + uint256 left, + uint256 right, + uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100% + ) internal pure virtual { + vm.assertApproxEqRel(left, right, maxPercentDelta); + } + + function assertApproxEqRel( + uint256 left, + uint256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + string memory err + ) internal pure virtual { + vm.assertApproxEqRel(left, right, maxPercentDelta, err); + } + + function assertApproxEqRelDecimal( + uint256 left, + uint256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals + ) internal pure virtual { + vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals); + } + + function assertApproxEqRelDecimal( + uint256 left, + uint256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals, + string memory err + ) internal pure virtual { + vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err); + } + + function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) internal pure virtual { + vm.assertApproxEqRel(left, right, maxPercentDelta); + } + + function assertApproxEqRel( + int256 left, + int256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + string memory err + ) internal pure virtual { + vm.assertApproxEqRel(left, right, maxPercentDelta, err); + } + + function assertApproxEqRelDecimal( + int256 left, + int256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals + ) internal pure virtual { + vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals); + } + + function assertApproxEqRelDecimal( + int256 left, + int256 right, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals, + string memory err + ) internal pure virtual { + vm.assertApproxEqRelDecimal(left, right, maxPercentDelta, decimals, err); + } + + // Inherited from DSTest, not used but kept for backwards-compatibility + function checkEq0(bytes memory left, bytes memory right) internal pure returns (bool) { + return keccak256(left) == keccak256(right); + } + + function assertEq0(bytes memory left, bytes memory right) internal pure virtual { + assertEq(left, right); + } + + function assertEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual { + assertEq(left, right, err); + } + + function assertNotEq0(bytes memory left, bytes memory right) internal pure virtual { + assertNotEq(left, right); + } + + function assertNotEq0(bytes memory left, bytes memory right, string memory err) internal pure virtual { + assertNotEq(left, right, err); + } + + function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual { + assertEqCall(target, callDataA, target, callDataB, true); + } + + function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB) + internal + virtual + { + assertEqCall(targetA, callDataA, targetB, callDataB, true); + } + + function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData) + internal + virtual + { + assertEqCall(target, callDataA, target, callDataB, strictRevertData); + } + + function assertEqCall( + address targetA, + bytes memory callDataA, + address targetB, + bytes memory callDataB, + bool strictRevertData + ) internal virtual { + (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA); + (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB); + + if (successA && successB) { + assertEq(returnDataA, returnDataB, "Call return data does not match"); + } + + if (!successA && !successB && strictRevertData) { + assertEq(returnDataA, returnDataB, "Call revert data does not match"); + } + + if (!successA && successB) { + emit log("Error: Calls were not equal"); + emit log_named_bytes(" Left call revert data", returnDataA); + emit log_named_bytes(" Right call return data", returnDataB); + revert("assertion failed"); + } + + if (successA && !successB) { + emit log("Error: Calls were not equal"); + emit log_named_bytes(" Left call return data", returnDataA); + emit log_named_bytes(" Right call revert data", returnDataB); + revert("assertion failed"); + } + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdChains.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdChains.sol new file mode 100644 index 000000000..3bc5f43af --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdChains.sol @@ -0,0 +1,287 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; +pragma experimental ABIEncoderV2; + +import {VmSafe} from "./Vm.sol"; + +/** + * StdChains provides information about EVM compatible chains that can be used in scripts/tests. + * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are + * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of + * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the + * alias used in this contract, which can be found as the first argument to the + * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. + * + * There are two main ways to use this contract: + * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or + * `setChain(string memory chainAlias, Chain memory chain)` + * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. + * + * The first time either of those are used, chains are initialized with the default set of RPC URLs. + * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in + * `defaultRpcUrls`. + * + * The `setChain` function is straightforward, and it simply saves off the given chain data. + * + * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say + * we want to retrieve the RPC URL for `mainnet`: + * - If you have specified data with `setChain`, it will return that. + * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it + * is valid (e.g. a URL is specified, or an environment variable is given and exists). + * - If neither of the above conditions is met, the default data is returned. + * + * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults. + */ +abstract contract StdChains { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + bool private stdChainsInitialized; + + struct ChainData { + string name; + uint256 chainId; + string rpcUrl; + } + + struct Chain { + // The chain name. + string name; + // The chain's Chain ID. + uint256 chainId; + // The chain's alias. (i.e. what gets specified in `foundry.toml`). + string chainAlias; + // A default RPC endpoint for this chain. + // NOTE: This default RPC URL is included for convenience to facilitate quick tests and + // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy + // usage as you will be throttled and this is a disservice to others who need this endpoint. + string rpcUrl; + } + + // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data. + mapping(string => Chain) private chains; + // Maps from the chain's alias to it's default RPC URL. + mapping(string => string) private defaultRpcUrls; + // Maps from a chain ID to it's alias. + mapping(uint256 => string) private idToAlias; + + bool private fallbackToDefaultRpcUrls = true; + + // The RPC URL will be fetched from config or defaultRpcUrls if possible. + function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) { + require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string."); + + initializeStdChains(); + chain = chains[chainAlias]; + require( + chain.chainId != 0, + string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found.")) + ); + + chain = getChainWithUpdatedRpcUrl(chainAlias, chain); + } + + function getChain(uint256 chainId) internal virtual returns (Chain memory chain) { + require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0."); + initializeStdChains(); + string memory chainAlias = idToAlias[chainId]; + + chain = chains[chainAlias]; + + require( + chain.chainId != 0, + string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found.")) + ); + + chain = getChainWithUpdatedRpcUrl(chainAlias, chain); + } + + // set chain info, with priority to argument's rpcUrl field. + function setChain(string memory chainAlias, ChainData memory chain) internal virtual { + require( + bytes(chainAlias).length != 0, + "StdChains setChain(string,ChainData): Chain alias cannot be the empty string." + ); + + require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0."); + + initializeStdChains(); + string memory foundAlias = idToAlias[chain.chainId]; + + require( + bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)), + string( + abi.encodePacked( + "StdChains setChain(string,ChainData): Chain ID ", + vm.toString(chain.chainId), + " already used by \"", + foundAlias, + "\"." + ) + ) + ); + + uint256 oldChainId = chains[chainAlias].chainId; + delete idToAlias[oldChainId]; + + chains[chainAlias] = + Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl}); + idToAlias[chain.chainId] = chainAlias; + } + + // set chain info, with priority to argument's rpcUrl field. + function setChain(string memory chainAlias, Chain memory chain) internal virtual { + setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl})); + } + + function _toUpper(string memory str) private pure returns (string memory) { + bytes memory strb = bytes(str); + bytes memory copy = new bytes(strb.length); + for (uint256 i = 0; i < strb.length; i++) { + bytes1 b = strb[i]; + if (b >= 0x61 && b <= 0x7A) { + copy[i] = bytes1(uint8(b) - 32); + } else { + copy[i] = b; + } + } + return string(copy); + } + + // lookup rpcUrl, in descending order of priority: + // current -> config (foundry.toml) -> environment variable -> default + function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) + private + view + returns (Chain memory) + { + if (bytes(chain.rpcUrl).length == 0) { + try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) { + chain.rpcUrl = configRpcUrl; + } catch (bytes memory err) { + string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL")); + if (fallbackToDefaultRpcUrls) { + chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]); + } else { + chain.rpcUrl = vm.envString(envName); + } + // Distinguish 'not found' from 'cannot read' + // The upstream error thrown by forge for failing cheats changed so we check both the old and new versions + bytes memory oldNotFoundError = + abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias))); + bytes memory newNotFoundError = abi.encodeWithSignature( + "CheatcodeError(string)", string(abi.encodePacked("invalid rpc url: ", chainAlias)) + ); + bytes32 errHash = keccak256(err); + if ( + (errHash != keccak256(oldNotFoundError) && errHash != keccak256(newNotFoundError)) + || bytes(chain.rpcUrl).length == 0 + ) { + /// @solidity memory-safe-assembly + assembly { + revert(add(32, err), mload(err)) + } + } + } + } + return chain; + } + + function setFallbackToDefaultRpcUrls(bool useDefault) internal { + fallbackToDefaultRpcUrls = useDefault; + } + + function initializeStdChains() private { + if (stdChainsInitialized) return; + + stdChainsInitialized = true; + + // If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol` + setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545")); + setChainWithDefaultRpcUrl("mainnet", ChainData("Mainnet", 1, "https://eth.llamarpc.com")); + setChainWithDefaultRpcUrl( + "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") + ); + setChainWithDefaultRpcUrl("holesky", ChainData("Holesky", 17000, "https://rpc.holesky.ethpandaops.io")); + setChainWithDefaultRpcUrl("hoodi", ChainData("Hoodi", 560048, "https://rpc.hoodi.ethpandaops.io")); + setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io")); + setChainWithDefaultRpcUrl( + "optimism_sepolia", ChainData("Optimism Sepolia", 11155420, "https://sepolia.optimism.io") + ); + setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc")); + setChainWithDefaultRpcUrl( + "arbitrum_one_sepolia", ChainData("Arbitrum One Sepolia", 421614, "https://sepolia-rollup.arbitrum.io/rpc") + ); + setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc")); + setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com")); + setChainWithDefaultRpcUrl( + "polygon_amoy", ChainData("Polygon Amoy", 80002, "https://rpc-amoy.polygon.technology") + ); + setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc")); + setChainWithDefaultRpcUrl( + "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc") + ); + setChainWithDefaultRpcUrl( + "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org") + ); + setChainWithDefaultRpcUrl( + "bnb_smart_chain_testnet", + ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel") + ); + setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com")); + setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network")); + setChainWithDefaultRpcUrl( + "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network") + ); + setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network")); + setChainWithDefaultRpcUrl("base_sepolia", ChainData("Base Sepolia", 84532, "https://sepolia.base.org")); + setChainWithDefaultRpcUrl("base", ChainData("Base", 8453, "https://mainnet.base.org")); + setChainWithDefaultRpcUrl("blast_sepolia", ChainData("Blast Sepolia", 168587773, "https://sepolia.blast.io")); + setChainWithDefaultRpcUrl("blast", ChainData("Blast", 81457, "https://rpc.blast.io")); + setChainWithDefaultRpcUrl("fantom_opera", ChainData("Fantom Opera", 250, "https://rpc.ankr.com/fantom/")); + setChainWithDefaultRpcUrl( + "fantom_opera_testnet", ChainData("Fantom Opera Testnet", 4002, "https://rpc.ankr.com/fantom_testnet/") + ); + setChainWithDefaultRpcUrl("fraxtal", ChainData("Fraxtal", 252, "https://rpc.frax.com")); + setChainWithDefaultRpcUrl("fraxtal_testnet", ChainData("Fraxtal Testnet", 2522, "https://rpc.testnet.frax.com")); + setChainWithDefaultRpcUrl( + "berachain_bartio_testnet", ChainData("Berachain bArtio Testnet", 80084, "https://bartio.rpc.berachain.com") + ); + setChainWithDefaultRpcUrl("flare", ChainData("Flare", 14, "https://flare-api.flare.network/ext/C/rpc")); + setChainWithDefaultRpcUrl( + "flare_coston2", ChainData("Flare Coston2", 114, "https://coston2-api.flare.network/ext/C/rpc") + ); + + setChainWithDefaultRpcUrl("mode", ChainData("Mode", 34443, "https://mode.drpc.org")); + setChainWithDefaultRpcUrl("mode_sepolia", ChainData("Mode Sepolia", 919, "https://sepolia.mode.network")); + + setChainWithDefaultRpcUrl("zora", ChainData("Zora", 7777777, "https://zora.drpc.org")); + setChainWithDefaultRpcUrl( + "zora_sepolia", ChainData("Zora Sepolia", 999999999, "https://sepolia.rpc.zora.energy") + ); + + setChainWithDefaultRpcUrl("race", ChainData("Race", 6805, "https://racemainnet.io")); + setChainWithDefaultRpcUrl("race_sepolia", ChainData("Race Sepolia", 6806, "https://racemainnet.io")); + + setChainWithDefaultRpcUrl("metal", ChainData("Metal", 1750, "https://metall2.drpc.org")); + setChainWithDefaultRpcUrl("metal_sepolia", ChainData("Metal Sepolia", 1740, "https://testnet.rpc.metall2.com")); + + setChainWithDefaultRpcUrl("binary", ChainData("Binary", 624, "https://rpc.zero.thebinaryholdings.com")); + setChainWithDefaultRpcUrl( + "binary_sepolia", ChainData("Binary Sepolia", 625, "https://rpc.zero.thebinaryholdings.com") + ); + + setChainWithDefaultRpcUrl("orderly", ChainData("Orderly", 291, "https://rpc.orderly.network")); + setChainWithDefaultRpcUrl( + "orderly_sepolia", ChainData("Orderly Sepolia", 4460, "https://testnet-rpc.orderly.org") + ); + } + + // set chain info, with priority to chainAlias' rpc url in foundry.toml + function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private { + string memory rpcUrl = chain.rpcUrl; + defaultRpcUrls[chainAlias] = rpcUrl; + chain.rpcUrl = ""; + setChain(chainAlias, chain); + chain.rpcUrl = rpcUrl; // restore argument + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdCheats.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdCheats.sol new file mode 100644 index 000000000..9f360dec2 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdCheats.sol @@ -0,0 +1,829 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {StdStorage, stdStorage} from "./StdStorage.sol"; +import {console2} from "./console2.sol"; +import {Vm} from "./Vm.sol"; + +abstract contract StdCheatsSafe { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + uint256 private constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + bool private gasMeteringOff; + + // Data structures to parse Transaction objects from the broadcast artifact + // that conform to EIP1559. The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct RawTx1559 { + string[] arguments; + address contractAddress; + string contractName; + // json value name = function + string functionSig; + bytes32 hash; + // json value name = tx + RawTx1559Detail txDetail; + // json value name = type + string opcode; + } + + struct RawTx1559Detail { + AccessList[] accessList; + bytes data; + address from; + bytes gas; + bytes nonce; + address to; + bytes txType; + bytes value; + } + + struct Tx1559 { + string[] arguments; + address contractAddress; + string contractName; + string functionSig; + bytes32 hash; + Tx1559Detail txDetail; + string opcode; + } + + struct Tx1559Detail { + AccessList[] accessList; + bytes data; + address from; + uint256 gas; + uint256 nonce; + address to; + uint256 txType; + uint256 value; + } + + // Data structures to parse Transaction objects from the broadcast artifact + // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct TxLegacy { + string[] arguments; + address contractAddress; + string contractName; + string functionSig; + string hash; + string opcode; + TxDetailLegacy transaction; + } + + struct TxDetailLegacy { + AccessList[] accessList; + uint256 chainId; + bytes data; + address from; + uint256 gas; + uint256 gasPrice; + bytes32 hash; + uint256 nonce; + bytes1 opcode; + bytes32 r; + bytes32 s; + uint256 txType; + address to; + uint8 v; + uint256 value; + } + + struct AccessList { + address accessAddress; + bytes32[] storageKeys; + } + + // Data structures to parse Receipt objects from the broadcast artifact. + // The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct RawReceipt { + bytes32 blockHash; + bytes blockNumber; + address contractAddress; + bytes cumulativeGasUsed; + bytes effectiveGasPrice; + address from; + bytes gasUsed; + RawReceiptLog[] logs; + bytes logsBloom; + bytes status; + address to; + bytes32 transactionHash; + bytes transactionIndex; + } + + struct Receipt { + bytes32 blockHash; + uint256 blockNumber; + address contractAddress; + uint256 cumulativeGasUsed; + uint256 effectiveGasPrice; + address from; + uint256 gasUsed; + ReceiptLog[] logs; + bytes logsBloom; + uint256 status; + address to; + bytes32 transactionHash; + uint256 transactionIndex; + } + + // Data structures to parse the entire broadcast artifact, assuming the + // transactions conform to EIP1559. + + struct EIP1559ScriptArtifact { + string[] libraries; + string path; + string[] pending; + Receipt[] receipts; + uint256 timestamp; + Tx1559[] transactions; + TxReturn[] txReturns; + } + + struct RawEIP1559ScriptArtifact { + string[] libraries; + string path; + string[] pending; + RawReceipt[] receipts; + TxReturn[] txReturns; + uint256 timestamp; + RawTx1559[] transactions; + } + + struct RawReceiptLog { + // json value = address + address logAddress; + bytes32 blockHash; + bytes blockNumber; + bytes data; + bytes logIndex; + bool removed; + bytes32[] topics; + bytes32 transactionHash; + bytes transactionIndex; + bytes transactionLogIndex; + } + + struct ReceiptLog { + // json value = address + address logAddress; + bytes32 blockHash; + uint256 blockNumber; + bytes data; + uint256 logIndex; + bytes32[] topics; + uint256 transactionIndex; + uint256 transactionLogIndex; + bool removed; + } + + struct TxReturn { + string internalType; + string value; + } + + struct Account { + address addr; + uint256 key; + } + + enum AddressType { + Payable, + NonPayable, + ZeroAddress, + Precompile, + ForgeAddress + } + + // Checks that `addr` is not blacklisted by token contracts that have a blacklist. + function assumeNotBlacklisted(address token, address addr) internal view virtual { + // Nothing to check if `token` is not a contract. + uint256 tokenCodeSize; + assembly { + tokenCodeSize := extcodesize(token) + } + require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); + + bool success; + bytes memory returnData; + + // 4-byte selector for `isBlacklisted(address)`, used by USDC. + (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr)); + vm.assume(!success || abi.decode(returnData, (bool)) == false); + + // 4-byte selector for `isBlackListed(address)`, used by USDT. + (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr)); + vm.assume(!success || abi.decode(returnData, (bool)) == false); + } + + // Checks that `addr` is not blacklisted by token contracts that have a blacklist. + // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for + // backwards compatibility, since this name was used in the original PR which already has + // a release. This function can be removed in a future release once we want a breaking change. + function assumeNoBlacklisted(address token, address addr) internal view virtual { + assumeNotBlacklisted(token, addr); + } + + function assumeAddressIsNot(address addr, AddressType addressType) internal virtual { + if (addressType == AddressType.Payable) { + assumeNotPayable(addr); + } else if (addressType == AddressType.NonPayable) { + assumePayable(addr); + } else if (addressType == AddressType.ZeroAddress) { + assumeNotZeroAddress(addr); + } else if (addressType == AddressType.Precompile) { + assumeNotPrecompile(addr); + } else if (addressType == AddressType.ForgeAddress) { + assumeNotForgeAddress(addr); + } + } + + function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + } + + function assumeAddressIsNot( + address addr, + AddressType addressType1, + AddressType addressType2, + AddressType addressType3 + ) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + assumeAddressIsNot(addr, addressType3); + } + + function assumeAddressIsNot( + address addr, + AddressType addressType1, + AddressType addressType2, + AddressType addressType3, + AddressType addressType4 + ) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + assumeAddressIsNot(addr, addressType3); + assumeAddressIsNot(addr, addressType4); + } + + // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to + // `addr` and checking the `success` return value. + // NOTE: This function may result in state changes depending on the fallback/receive logic + // implemented by `addr`, which should be taken into account when this function is used. + function _isPayable(address addr) private returns (bool) { + require( + addr.balance < UINT256_MAX, + "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds" + ); + uint256 origBalanceTest = address(this).balance; + uint256 origBalanceAddr = address(addr).balance; + + vm.deal(address(this), 1); + (bool success,) = payable(addr).call{value: 1}(""); + + // reset balances + vm.deal(address(this), origBalanceTest); + vm.deal(addr, origBalanceAddr); + + return success; + } + + // NOTE: This function may result in state changes depending on the fallback/receive logic + // implemented by `addr`, which should be taken into account when this function is used. See the + // `_isPayable` method for more information. + function assumePayable(address addr) internal virtual { + vm.assume(_isPayable(addr)); + } + + function assumeNotPayable(address addr) internal virtual { + vm.assume(!_isPayable(addr)); + } + + function assumeNotZeroAddress(address addr) internal pure virtual { + vm.assume(addr != address(0)); + } + + function assumeNotPrecompile(address addr) internal pure virtual { + assumeNotPrecompile(addr, _pureChainId()); + } + + function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual { + // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific + // address), but the same rationale for excluding them applies so we include those too. + + // These are reserved by Ethereum and may be on all EVM-compatible chains. + vm.assume(addr < address(0x1) || addr > address(0xff)); + + // forgefmt: disable-start + if (chainId == 10 || chainId == 420) { + // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21 + vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800)); + } else if (chainId == 42161 || chainId == 421613) { + // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains + vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068)); + } else if (chainId == 43114 || chainId == 43113) { + // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59 + vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff)); + vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF)); + vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff)); + } + // forgefmt: disable-end + } + + function assumeNotForgeAddress(address addr) internal pure virtual { + // vm, console, and Create2Deployer addresses + vm.assume( + addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 + && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C + ); + } + + function assumeUnusedAddress(address addr) internal view virtual { + uint256 size; + assembly { + size := extcodesize(addr) + } + vm.assume(size == 0); + + assumeNotPrecompile(addr); + assumeNotZeroAddress(addr); + assumeNotForgeAddress(addr); + } + + function readEIP1559ScriptArtifact(string memory path) + internal + view + virtual + returns (EIP1559ScriptArtifact memory) + { + string memory data = vm.readFile(path); + bytes memory parsedData = vm.parseJson(data); + RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact)); + EIP1559ScriptArtifact memory artifact; + artifact.libraries = rawArtifact.libraries; + artifact.path = rawArtifact.path; + artifact.timestamp = rawArtifact.timestamp; + artifact.pending = rawArtifact.pending; + artifact.txReturns = rawArtifact.txReturns; + artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts); + artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions); + return artifact; + } + + function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) { + Tx1559[] memory txs = new Tx1559[](rawTxs.length); + for (uint256 i; i < rawTxs.length; i++) { + txs[i] = rawToConvertedEIPTx1559(rawTxs[i]); + } + return txs; + } + + function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) { + Tx1559 memory transaction; + transaction.arguments = rawTx.arguments; + transaction.contractName = rawTx.contractName; + transaction.functionSig = rawTx.functionSig; + transaction.hash = rawTx.hash; + transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail); + transaction.opcode = rawTx.opcode; + return transaction; + } + + function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail) + internal + pure + virtual + returns (Tx1559Detail memory) + { + Tx1559Detail memory txDetail; + txDetail.data = rawDetail.data; + txDetail.from = rawDetail.from; + txDetail.to = rawDetail.to; + txDetail.nonce = _bytesToUint(rawDetail.nonce); + txDetail.txType = _bytesToUint(rawDetail.txType); + txDetail.value = _bytesToUint(rawDetail.value); + txDetail.gas = _bytesToUint(rawDetail.gas); + txDetail.accessList = rawDetail.accessList; + return txDetail; + } + + function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) { + string memory deployData = vm.readFile(path); + bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions"); + RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[])); + return rawToConvertedEIPTx1559s(rawTxs); + } + + function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) { + string memory deployData = vm.readFile(path); + string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]")); + bytes memory parsedDeployData = vm.parseJson(deployData, key); + RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559)); + return rawToConvertedEIPTx1559(rawTx); + } + + // Analogous to readTransactions, but for receipts. + function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) { + string memory deployData = vm.readFile(path); + bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts"); + RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[])); + return rawToConvertedReceipts(rawReceipts); + } + + function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) { + string memory deployData = vm.readFile(path); + string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]")); + bytes memory parsedDeployData = vm.parseJson(deployData, key); + RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt)); + return rawToConvertedReceipt(rawReceipt); + } + + function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) { + Receipt[] memory receipts = new Receipt[](rawReceipts.length); + for (uint256 i; i < rawReceipts.length; i++) { + receipts[i] = rawToConvertedReceipt(rawReceipts[i]); + } + return receipts; + } + + function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) { + Receipt memory receipt; + receipt.blockHash = rawReceipt.blockHash; + receipt.to = rawReceipt.to; + receipt.from = rawReceipt.from; + receipt.contractAddress = rawReceipt.contractAddress; + receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice); + receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed); + receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed); + receipt.status = _bytesToUint(rawReceipt.status); + receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex); + receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber); + receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs); + receipt.logsBloom = rawReceipt.logsBloom; + receipt.transactionHash = rawReceipt.transactionHash; + return receipt; + } + + function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs) + internal + pure + virtual + returns (ReceiptLog[] memory) + { + ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length); + for (uint256 i; i < rawLogs.length; i++) { + logs[i].logAddress = rawLogs[i].logAddress; + logs[i].blockHash = rawLogs[i].blockHash; + logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber); + logs[i].data = rawLogs[i].data; + logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex); + logs[i].topics = rawLogs[i].topics; + logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex); + logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex); + logs[i].removed = rawLogs[i].removed; + } + return logs; + } + + // Deploy a contract by fetching the contract bytecode from + // the artifacts directory + // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))` + function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) { + bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); + /// @solidity memory-safe-assembly + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed."); + } + + function deployCode(string memory what) internal virtual returns (address addr) { + bytes memory bytecode = vm.getCode(what); + /// @solidity memory-safe-assembly + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string): Deployment failed."); + } + + /// @dev deploy contract with value on construction + function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) { + bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); + /// @solidity memory-safe-assembly + assembly { + addr := create(val, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed."); + } + + function deployCode(string memory what, uint256 val) internal virtual returns (address addr) { + bytes memory bytecode = vm.getCode(what); + /// @solidity memory-safe-assembly + assembly { + addr := create(val, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed."); + } + + // creates a labeled address and the corresponding private key + function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) { + privateKey = uint256(keccak256(abi.encodePacked(name))); + addr = vm.addr(privateKey); + vm.label(addr, name); + } + + // creates a labeled address + function makeAddr(string memory name) internal virtual returns (address addr) { + (addr,) = makeAddrAndKey(name); + } + + // Destroys an account immediately, sending the balance to beneficiary. + // Destroying means: balance will be zero, code will be empty, and nonce will be 0 + // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce + // only after tx ends, this will run immediately. + function destroyAccount(address who, address beneficiary) internal virtual { + uint256 currBalance = who.balance; + vm.etch(who, abi.encode()); + vm.deal(who, 0); + vm.resetNonce(who); + + uint256 beneficiaryBalance = beneficiary.balance; + vm.deal(beneficiary, currBalance + beneficiaryBalance); + } + + // creates a struct containing both a labeled address and the corresponding private key + function makeAccount(string memory name) internal virtual returns (Account memory account) { + (account.addr, account.key) = makeAddrAndKey(name); + } + + function deriveRememberKey(string memory mnemonic, uint32 index) + internal + virtual + returns (address who, uint256 privateKey) + { + privateKey = vm.deriveKey(mnemonic, index); + who = vm.rememberKey(privateKey); + } + + function _bytesToUint(bytes memory b) private pure returns (uint256) { + require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32."); + return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); + } + + function isFork() internal view virtual returns (bool status) { + try vm.activeFork() { + status = true; + } catch (bytes memory) {} + } + + modifier skipWhenForking() { + if (!isFork()) { + _; + } + } + + modifier skipWhenNotForking() { + if (isFork()) { + _; + } + } + + modifier noGasMetering() { + vm.pauseGasMetering(); + // To prevent turning gas monitoring back on with nested functions that use this modifier, + // we check if gasMetering started in the off position. If it did, we don't want to turn + // it back on until we exit the top level function that used the modifier + // + // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well. + // funcA will have `gasStartedOff` as false, funcB will have it as true, + // so we only turn metering back on at the end of the funcA + bool gasStartedOff = gasMeteringOff; + gasMeteringOff = true; + + _; + + // if gas metering was on when this modifier was called, turn it back on at the end + if (!gasStartedOff) { + gasMeteringOff = false; + vm.resumeGasMetering(); + } + } + + // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no + // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We + // can't simply access the chain ID in a normal view or pure function because the solc View Pure + // Checker changed `chainid` from pure to view in 0.8.0. + function _viewChainId() private view returns (uint256 chainId) { + // Assembly required since `block.chainid` was introduced in 0.8.0. + assembly { + chainId := chainid() + } + + address(this); // Silence warnings in older Solc versions. + } + + function _pureChainId() private pure returns (uint256 chainId) { + function() internal view returns (uint256) fnIn = _viewChainId; + function() internal pure returns (uint256) pureChainId; + assembly { + pureChainId := fnIn + } + chainId = pureChainId(); + } +} + +// Wrappers around cheatcodes to avoid footguns +abstract contract StdCheats is StdCheatsSafe { + using stdStorage for StdStorage; + + StdStorage private stdstore; + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; + + // Skip forward or rewind time by the specified number of seconds + function skip(uint256 time) internal virtual { + vm.warp(vm.getBlockTimestamp() + time); + } + + function rewind(uint256 time) internal virtual { + vm.warp(vm.getBlockTimestamp() - time); + } + + // Setup a prank from an address that has some ether + function hoax(address msgSender) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.prank(msgSender); + } + + function hoax(address msgSender, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.prank(msgSender); + } + + function hoax(address msgSender, address origin) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.prank(msgSender, origin); + } + + function hoax(address msgSender, address origin, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.prank(msgSender, origin); + } + + // Start perpetual prank from an address that has some ether + function startHoax(address msgSender) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.startPrank(msgSender); + } + + function startHoax(address msgSender, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.startPrank(msgSender); + } + + // Start perpetual prank from an address that has some ether + // tx.origin is set to the origin parameter + function startHoax(address msgSender, address origin) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.startPrank(msgSender, origin); + } + + function startHoax(address msgSender, address origin, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.startPrank(msgSender, origin); + } + + function changePrank(address msgSender) internal virtual { + console2_log_StdCheats("changePrank is deprecated. Please use vm.startPrank instead."); + vm.stopPrank(); + vm.startPrank(msgSender); + } + + function changePrank(address msgSender, address txOrigin) internal virtual { + vm.stopPrank(); + vm.startPrank(msgSender, txOrigin); + } + + // The same as Vm's `deal` + // Use the alternative signature for ERC20 tokens + function deal(address to, uint256 give) internal virtual { + vm.deal(to, give); + } + + // Set the balance of an account for any ERC20 token + // Use the alternative signature to update `totalSupply` + function deal(address token, address to, uint256 give) internal virtual { + deal(token, to, give, false); + } + + // Set the balance of an account for any ERC1155 token + // Use the alternative signature to update `totalSupply` + function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual { + dealERC1155(token, to, id, give, false); + } + + function deal(address token, address to, uint256 give, bool adjust) internal virtual { + // get current balance + (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); + uint256 prevBal = abi.decode(balData, (uint256)); + + // update balance + stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give); + + // update total supply + if (adjust) { + (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd)); + uint256 totSup = abi.decode(totSupData, (uint256)); + if (give < prevBal) { + totSup -= (prevBal - give); + } else { + totSup += (give - prevBal); + } + stdstore.target(token).sig(0x18160ddd).checked_write(totSup); + } + } + + function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual { + // get current balance + (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id)); + uint256 prevBal = abi.decode(balData, (uint256)); + + // update balance + stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give); + + // update total supply + if (adjust) { + (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id)); + require( + totSupData.length != 0, + "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply." + ); + uint256 totSup = abi.decode(totSupData, (uint256)); + if (give < prevBal) { + totSup -= (prevBal - give); + } else { + totSup += (give - prevBal); + } + stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup); + } + } + + function dealERC721(address token, address to, uint256 id) internal virtual { + // check if token id is already minted and the actual owner. + (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id)); + require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted."); + + // get owner current balance + (, bytes memory fromBalData) = + token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address)))); + uint256 fromPrevBal = abi.decode(fromBalData, (uint256)); + + // get new user current balance + (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); + uint256 toPrevBal = abi.decode(toBalData, (uint256)); + + // update balances + stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal); + stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal); + + // update owner + stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to); + } + + function deployCodeTo(string memory what, address where) internal virtual { + deployCodeTo(what, "", 0, where); + } + + function deployCodeTo(string memory what, bytes memory args, address where) internal virtual { + deployCodeTo(what, args, 0, where); + } + + function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual { + bytes memory creationCode = vm.getCode(what); + vm.etch(where, abi.encodePacked(creationCode, args)); + (bool success, bytes memory runtimeBytecode) = where.call{value: value}(""); + require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); + vm.etch(where, runtimeBytecode); + } + + // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. + function console2_log_StdCheats(string memory p0) private view { + (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0)); + status; + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdConfig.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdConfig.sol new file mode 100644 index 000000000..506ac34a5 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdConfig.sol @@ -0,0 +1,612 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {VmSafe} from "./Vm.sol"; +import {Variable, Type, TypeKind, LibVariable} from "./LibVariable.sol"; + +/// @notice A contract that parses a toml configuration file and load its +/// variables into storage, automatically casting them, on deployment. +/// +/// @dev This contract assumes a toml structure where top-level keys +/// represent chain ids or aliases. Under each chain key, variables are +/// organized by type in separate sub-tables like `[.]`, where +/// type must be: `bool`, `address`, `bytes32`, `uint`, `ìnt`, `string`, or `bytes`. +/// +/// Supported format: +/// ``` +/// [mainnet] +/// endpoint_url = "${MAINNET_RPC}" +/// +/// [mainnet.bool] +/// is_live = true +/// +/// [mainnet.address] +/// weth = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2" +/// whitelisted_admins = [ +/// "${MAINNET_ADMIN}", +/// "0x00000000000000000000000000000000deadbeef", +/// "0x000000000000000000000000000000c0ffeebabe" +/// ] +/// +/// [mainnet.uint] +/// important_number = 123 +/// ``` +contract StdConfig { + using LibVariable for Type; + using LibVariable for TypeKind; + + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + /// @dev Types: `bool`, `address`, `bytes32`, `uint`, `ìnt`, `string`, `bytes`. + uint8 private constant NUM_TYPES = 7; + + // -- ERRORS --------------------------------------------------------------- + + error AlreadyInitialized(string key); + error InvalidChainKey(string aliasOrId); + error ChainNotInitialized(uint256 chainId); + error UnableToParseVariable(string key); + error WriteToFileInForbiddenCtxt(); + + // -- STORAGE (CACHE FROM CONFIG FILE) ------------------------------------ + + /// @dev Path to the loaded TOML configuration file. + string private _filePath; + + /// @dev List of top-level keys found in the TOML file, assumed to be chain names/aliases. + string[] private _chainKeys; + + /// @dev Storage for the configured RPC URL for each chain. + mapping(uint256 => string) private _rpcOf; + + /// @dev Storage for values, organized by chain ID and variable key. + mapping(uint256 => mapping(string => bytes)) private _dataOf; + + /// @dev Type cache for runtime checking when casting. + mapping(uint256 => mapping(string => Type)) private _typeOf; + + /// @dev When enabled, `set` will always write updates back to the configuration file. + /// Can only be enabled in a scripting context to prevent file corruption from + /// concurrent I/O access, as tests run in parallel. + bool private _writeToFile; + + // -- CONSTRUCTOR ---------------------------------------------------------- + + /// @notice Reads the TOML file and iterates through each top-level key, which is + /// assumed to be a chain name or ID. For each chain, it caches its RPC + /// endpoint and all variables defined in typed sub-tables like `[.]`, + /// where type must be: `bool`, `address`, `uint`, `bytes32`, `string`, or `bytes`. + /// + /// The constructor attempts to parse each variable first as a single value, + /// and if that fails, as an array of that type. If a variable cannot be + /// parsed as either, the constructor will revert with an error. + /// + /// @param configFilePath: The local path to the TOML configuration file. + /// @param writeToFile: Whether to write updates back to the TOML file. Only for scripts. + constructor(string memory configFilePath, bool writeToFile) { + if (writeToFile && !vm.isContext(VmSafe.ForgeContext.ScriptGroup)) { + revert WriteToFileInForbiddenCtxt(); + } + + _filePath = configFilePath; + _writeToFile = writeToFile; + string memory content = vm.resolveEnv(vm.readFile(configFilePath)); + string[] memory chain_keys = vm.parseTomlKeys(content, "$"); + + // Cache the entire configuration to storage + for (uint256 i = 0; i < chain_keys.length; i++) { + string memory chain_key = chain_keys[i]; + // Ignore top-level keys that are not tables + if (vm.parseTomlKeys(content, string.concat("$.", chain_key)).length == 0) { + continue; + } + uint256 chainId = resolveChainId(chain_key); + _chainKeys.push(chain_key); + + // Cache the configure rpc endpoint for that chain. + // Falls back to `[rpc_endpoints]`. Panics if no rpc endpoint is configured. + try vm.parseTomlString(content, string.concat("$.", chain_key, ".endpoint_url")) returns (string memory url) + { + _rpcOf[chainId] = vm.resolveEnv(url); + } catch { + _rpcOf[chainId] = vm.resolveEnv(vm.rpcUrl(chain_key)); + } + + // Iterate through all the available `TypeKind`s (except `None`) to create the sub-section paths + for (uint8 t = 1; t <= NUM_TYPES; t++) { + TypeKind ty = TypeKind(t); + string memory typePath = string.concat("$.", chain_key, ".", ty.toTomlKey()); + + try vm.parseTomlKeys(content, typePath) returns (string[] memory keys) { + for (uint256 j = 0; j < keys.length; j++) { + string memory key = keys[j]; + if (_typeOf[chainId][key].kind == TypeKind.None) { + _loadAndCacheValue(content, string.concat(typePath, ".", key), chainId, key, ty); + } else { + revert AlreadyInitialized(key); + } + } + } catch {} // Section does not exist, ignore. + } + } + } + + function _loadAndCacheValue( + string memory content, + string memory path, + uint256 chainId, + string memory key, + TypeKind ty + ) private { + bool success = false; + if (ty == TypeKind.Bool) { + try vm.parseTomlBool(content, path) returns (bool val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Bool, false); + success = true; + } catch { + try vm.parseTomlBoolArray(content, path) returns (bool[] memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Bool, true); + success = true; + } catch {} + } + } else if (ty == TypeKind.Address) { + try vm.parseTomlAddress(content, path) returns (address val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Address, false); + success = true; + } catch { + try vm.parseTomlAddressArray(content, path) returns (address[] memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Address, true); + success = true; + } catch {} + } + } else if (ty == TypeKind.Bytes32) { + try vm.parseTomlBytes32(content, path) returns (bytes32 val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Bytes32, false); + success = true; + } catch { + try vm.parseTomlBytes32Array(content, path) returns (bytes32[] memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Bytes32, true); + success = true; + } catch {} + } + } else if (ty == TypeKind.Uint256) { + try vm.parseTomlUint(content, path) returns (uint256 val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Uint256, false); + success = true; + } catch { + try vm.parseTomlUintArray(content, path) returns (uint256[] memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Uint256, true); + success = true; + } catch {} + } + } else if (ty == TypeKind.Int256) { + try vm.parseTomlInt(content, path) returns (int256 val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Int256, false); + success = true; + } catch { + try vm.parseTomlIntArray(content, path) returns (int256[] memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Int256, true); + success = true; + } catch {} + } + } else if (ty == TypeKind.Bytes) { + try vm.parseTomlBytes(content, path) returns (bytes memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Bytes, false); + success = true; + } catch { + try vm.parseTomlBytesArray(content, path) returns (bytes[] memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.Bytes, true); + success = true; + } catch {} + } + } else if (ty == TypeKind.String) { + try vm.parseTomlString(content, path) returns (string memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.String, false); + success = true; + } catch { + try vm.parseTomlStringArray(content, path) returns (string[] memory val) { + _dataOf[chainId][key] = abi.encode(val); + _typeOf[chainId][key] = Type(TypeKind.String, true); + success = true; + } catch {} + } + } + + if (!success) { + revert UnableToParseVariable(key); + } + } + + // -- HELPER FUNCTIONS ----------------------------------------------------- + + /// @notice Enable or disable automatic writing to the TOML file on `set`. + /// Can only be enabled when scripting. + function writeUpdatesBackToFile(bool enabled) public { + if (enabled && !vm.isContext(VmSafe.ForgeContext.ScriptGroup)) { + revert WriteToFileInForbiddenCtxt(); + } + + _writeToFile = enabled; + } + + /// @notice Resolves a chain alias or a chain id string to its numerical chain id. + /// @param aliasOrId The string representing the chain alias (i.e. "mainnet") or a numerical ID (i.e. "1"). + /// @return The numerical chain ID. + /// @dev It first attempts to parse the input as a number. If that fails, it uses `vm.getChain` to resolve a named alias. + /// Reverts if the alias is not valid or not a number. + function resolveChainId(string memory aliasOrId) public view returns (uint256) { + try vm.parseUint(aliasOrId) returns (uint256 chainId) { + return chainId; + } catch { + try vm.getChain(aliasOrId) returns (VmSafe.Chain memory chainInfo) { + return chainInfo.chainId; + } catch { + revert InvalidChainKey(aliasOrId); + } + } + } + + /// @dev Retrieves the chain key/alias from the configuration based on the chain ID. + function _getChainKeyFromId(uint256 chainId) private view returns (string memory) { + for (uint256 i = 0; i < _chainKeys.length; i++) { + if (resolveChainId(_chainKeys[i]) == chainId) { + return _chainKeys[i]; + } + } + revert ChainNotInitialized(chainId); + } + + /// @dev Ensures type consistency when setting a value - prevents changing types unless uninitialized. + /// Updates type only when the previous type was `None`. + function _ensureTypeConsistency(uint256 chainId, string memory key, Type memory ty) private { + Type memory current = _typeOf[chainId][key]; + + if (current.kind == TypeKind.None) { + _typeOf[chainId][key] = ty; + } else { + current.assertEq(ty); + } + } + + /// @dev Wraps a string in double quotes for JSON compatibility. + function _quote(string memory s) private pure returns (string memory) { + return string.concat('"', s, '"'); + } + + /// @dev Writes a JSON-formatted value to a specific key in the TOML file. + /// @param chainId The chain id to write under. + /// @param ty The type category ('bool', 'address', 'uint', 'bytes32', 'string', or 'bytes'). + /// @param key The variable key name. + /// @param jsonValue The JSON-formatted value to write. + function _writeToToml(uint256 chainId, string memory ty, string memory key, string memory jsonValue) private { + string memory chainKey = _getChainKeyFromId(chainId); + string memory valueKey = string.concat("$.", chainKey, ".", ty, ".", key); + vm.writeToml(jsonValue, _filePath, valueKey); + } + + // -- GETTER FUNCTIONS ----------------------------------------------------- + + /// @dev Reads a variable for a given chain id and key, and returns it in a generic container. + /// The caller should use `LibVariable` to safely coerce the type. + /// Example: `uint256 myVar = config.get("my_key").toUint256();` + /// + /// @param chain_id The chain ID to read from. + /// @param key The key of the variable to retrieve. + /// @return `Variable` struct containing the type and the ABI-encoded value. + function get(uint256 chain_id, string memory key) public view returns (Variable memory) { + return Variable(_typeOf[chain_id][key], _dataOf[chain_id][key]); + } + + /// @dev Reads a variable for the current chain and a given key, and returns it in a generic container. + /// The caller should use `LibVariable` to safely coerce the type. + /// Example: `uint256 myVar = config.get("my_key").toUint256();` + /// + /// @param key The key of the variable to retrieve. + /// @return `Variable` struct containing the type and the ABI-encoded value. + function get(string memory key) public view returns (Variable memory) { + return get(vm.getChainId(), key); + } + + /// @notice Returns the numerical chain ids for all configured chains. + function getChainIds() public view returns (uint256[] memory) { + string[] memory keys = _chainKeys; + + uint256[] memory ids = new uint256[](keys.length); + for (uint256 i = 0; i < keys.length; i++) { + ids[i] = resolveChainId(keys[i]); + } + + return ids; + } + + /// @notice Reads the RPC URL for a specific chain id. + function getRpcUrl(uint256 chainId) public view returns (string memory) { + return _rpcOf[chainId]; + } + + /// @notice Reads the RPC URL for the current chain. + function getRpcUrl() public view returns (string memory) { + return _rpcOf[vm.getChainId()]; + } + + // -- SETTER FUNCTIONS (SINGLE VALUES) ------------------------------------- + + /// @notice Sets a boolean value for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, bool value) public { + Type memory ty = Type(TypeKind.Bool, false); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value)); + } + + /// @notice Sets a boolean value for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, bool value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets an address value for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, address value) public { + Type memory ty = Type(TypeKind.Address, false); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value))); + } + + /// @notice Sets an address value for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, address value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a bytes32 value for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, bytes32 value) public { + Type memory ty = Type(TypeKind.Bytes32, false); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value))); + } + + /// @notice Sets a bytes32 value for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, bytes32 value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a uint256 value for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, uint256 value) public { + Type memory ty = Type(TypeKind.Uint256, false); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value)); + } + + /// @notice Sets a uint256 value for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, uint256 value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets an int256 value for a given key and chain ID. + function set(uint256 chainId, string memory key, int256 value) public { + Type memory ty = Type(TypeKind.Int256, false); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, vm.toString(value)); + } + + /// @notice Sets an int256 value for a given key on the current chain. + function set(string memory key, int256 value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a string value for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, string memory value) public { + Type memory ty = Type(TypeKind.String, false); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(value)); + } + + /// @notice Sets a string value for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, string memory value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a bytes value for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, bytes memory value) public { + Type memory ty = Type(TypeKind.Bytes, false); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) _writeToToml(chainId, ty.kind.toTomlKey(), key, _quote(vm.toString(value))); + } + + /// @notice Sets a bytes value for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, bytes memory value) public { + set(vm.getChainId(), key, value); + } + + // -- SETTER FUNCTIONS (ARRAYS) -------------------------------------------- + + /// @notice Sets a boolean array for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, bool[] memory value) public { + Type memory ty = Type(TypeKind.Bool, true); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) { + string memory json = "["; + for (uint256 i = 0; i < value.length; i++) { + json = string.concat(json, vm.toString(value[i])); + if (i < value.length - 1) json = string.concat(json, ","); + } + json = string.concat(json, "]"); + _writeToToml(chainId, ty.kind.toTomlKey(), key, json); + } + } + + /// @notice Sets a boolean array for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, bool[] memory value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets an address array for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, address[] memory value) public { + Type memory ty = Type(TypeKind.Address, true); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) { + string memory json = "["; + for (uint256 i = 0; i < value.length; i++) { + json = string.concat(json, _quote(vm.toString(value[i]))); + if (i < value.length - 1) json = string.concat(json, ","); + } + json = string.concat(json, "]"); + _writeToToml(chainId, ty.kind.toTomlKey(), key, json); + } + } + + /// @notice Sets an address array for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, address[] memory value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a bytes32 array for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, bytes32[] memory value) public { + Type memory ty = Type(TypeKind.Bytes32, true); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) { + string memory json = "["; + for (uint256 i = 0; i < value.length; i++) { + json = string.concat(json, _quote(vm.toString(value[i]))); + if (i < value.length - 1) json = string.concat(json, ","); + } + json = string.concat(json, "]"); + _writeToToml(chainId, ty.kind.toTomlKey(), key, json); + } + } + + /// @notice Sets a bytes32 array for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, bytes32[] memory value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a uint256 array for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, uint256[] memory value) public { + Type memory ty = Type(TypeKind.Uint256, true); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) { + string memory json = "["; + for (uint256 i = 0; i < value.length; i++) { + json = string.concat(json, vm.toString(value[i])); + if (i < value.length - 1) json = string.concat(json, ","); + } + json = string.concat(json, "]"); + _writeToToml(chainId, ty.kind.toTomlKey(), key, json); + } + } + + /// @notice Sets a uint256 array for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, uint256[] memory value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a int256 array for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, int256[] memory value) public { + Type memory ty = Type(TypeKind.Int256, true); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) { + string memory json = "["; + for (uint256 i = 0; i < value.length; i++) { + json = string.concat(json, vm.toString(value[i])); + if (i < value.length - 1) json = string.concat(json, ","); + } + json = string.concat(json, "]"); + _writeToToml(chainId, ty.kind.toTomlKey(), key, json); + } + } + + /// @notice Sets a int256 array for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, int256[] memory value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a string array for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, string[] memory value) public { + Type memory ty = Type(TypeKind.String, true); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) { + string memory json = "["; + for (uint256 i = 0; i < value.length; i++) { + json = string.concat(json, _quote(value[i])); + if (i < value.length - 1) json = string.concat(json, ","); + } + json = string.concat(json, "]"); + _writeToToml(chainId, ty.kind.toTomlKey(), key, json); + } + } + + /// @notice Sets a string array for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, string[] memory value) public { + set(vm.getChainId(), key, value); + } + + /// @notice Sets a bytes array for a given key and chain ID. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(uint256 chainId, string memory key, bytes[] memory value) public { + Type memory ty = Type(TypeKind.Bytes, true); + _ensureTypeConsistency(chainId, key, ty); + _dataOf[chainId][key] = abi.encode(value); + if (_writeToFile) { + string memory json = "["; + for (uint256 i = 0; i < value.length; i++) { + json = string.concat(json, _quote(vm.toString(value[i]))); + if (i < value.length - 1) json = string.concat(json, ","); + } + json = string.concat(json, "]"); + _writeToToml(chainId, ty.kind.toTomlKey(), key, json); + } + } + + /// @notice Sets a bytes array for a given key on the current chain. + /// @dev Sets the cached value in storage and writes the change back to the TOML file if `autoWrite` is enabled. + function set(string memory key, bytes[] memory value) public { + set(vm.getChainId(), key, value); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdConstants.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdConstants.sol new file mode 100644 index 000000000..2047d2b33 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdConstants.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {IMulticall3} from "./interfaces/IMulticall3.sol"; +import {Vm} from "./Vm.sol"; + +library StdConstants { + /// @dev Cheat code address. + /// Calculated as `address(uint160(uint256(keccak256("hevm cheat code"))))`. + Vm internal constant VM = Vm(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + /// @dev console.sol and console2.sol work by executing a staticcall to this address. + /// Calculated as `address(uint160(uint88(bytes11("console.log"))))`. + address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; + /// @dev Used when deploying with create2. + /// Taken from https://github.com/Arachnid/deterministic-deployment-proxy. + address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + /// @dev The default address for tx.origin and msg.sender. + /// Calculated as `address(uint160(uint256(keccak256("foundry default caller"))))`. + address internal constant DEFAULT_SENDER = 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38; + /// @dev The address of the first contract `CREATE`d by a running test contract. + /// When running tests, each test contract is `CREATE`d by `DEFAULT_SENDER` with nonce 1. + /// Calculated as `VM.computeCreateAddress(VM.computeCreateAddress(DEFAULT_SENDER, 1), 1)`. + address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; + /// @dev Deterministic deployment address of the Multicall3 contract. + /// Taken from https://www.multicall3.com. + IMulticall3 internal constant MULTICALL3_ADDRESS = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); + /// @dev The order of the secp256k1 curve. + uint256 internal constant SECP256K1_ORDER = + 115792089237316195423570985008687907852837564279074904382605163141518161494337; +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdError.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdError.sol new file mode 100644 index 000000000..a302191fa --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdError.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test +pragma solidity >=0.6.2 <0.9.0; + +library stdError { + bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01); + bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11); + bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12); + bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21); + bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22); + bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31); + bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32); + bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41); + bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdInvariant.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdInvariant.sol new file mode 100644 index 000000000..056db98fc --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdInvariant.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +abstract contract StdInvariant { + struct FuzzSelector { + address addr; + bytes4[] selectors; + } + + struct FuzzArtifactSelector { + string artifact; + bytes4[] selectors; + } + + struct FuzzInterface { + address addr; + string[] artifacts; + } + + address[] private _excludedContracts; + address[] private _excludedSenders; + address[] private _targetedContracts; + address[] private _targetedSenders; + + string[] private _excludedArtifacts; + string[] private _targetedArtifacts; + + FuzzArtifactSelector[] private _targetedArtifactSelectors; + + FuzzSelector[] private _excludedSelectors; + FuzzSelector[] private _targetedSelectors; + + FuzzInterface[] private _targetedInterfaces; + + // Functions for users: + // These are intended to be called in tests. + + function excludeContract(address newExcludedContract_) internal { + _excludedContracts.push(newExcludedContract_); + } + + function excludeSelector(FuzzSelector memory newExcludedSelector_) internal { + _excludedSelectors.push(newExcludedSelector_); + } + + function excludeSender(address newExcludedSender_) internal { + _excludedSenders.push(newExcludedSender_); + } + + function excludeArtifact(string memory newExcludedArtifact_) internal { + _excludedArtifacts.push(newExcludedArtifact_); + } + + function targetArtifact(string memory newTargetedArtifact_) internal { + _targetedArtifacts.push(newTargetedArtifact_); + } + + function targetArtifactSelector(FuzzArtifactSelector memory newTargetedArtifactSelector_) internal { + _targetedArtifactSelectors.push(newTargetedArtifactSelector_); + } + + function targetContract(address newTargetedContract_) internal { + _targetedContracts.push(newTargetedContract_); + } + + function targetSelector(FuzzSelector memory newTargetedSelector_) internal { + _targetedSelectors.push(newTargetedSelector_); + } + + function targetSender(address newTargetedSender_) internal { + _targetedSenders.push(newTargetedSender_); + } + + function targetInterface(FuzzInterface memory newTargetedInterface_) internal { + _targetedInterfaces.push(newTargetedInterface_); + } + + // Functions for forge: + // These are called by forge to run invariant tests and don't need to be called in tests. + + function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) { + excludedArtifacts_ = _excludedArtifacts; + } + + function excludeContracts() public view returns (address[] memory excludedContracts_) { + excludedContracts_ = _excludedContracts; + } + + function excludeSelectors() public view returns (FuzzSelector[] memory excludedSelectors_) { + excludedSelectors_ = _excludedSelectors; + } + + function excludeSenders() public view returns (address[] memory excludedSenders_) { + excludedSenders_ = _excludedSenders; + } + + function targetArtifacts() public view returns (string[] memory targetedArtifacts_) { + targetedArtifacts_ = _targetedArtifacts; + } + + function targetArtifactSelectors() public view returns (FuzzArtifactSelector[] memory targetedArtifactSelectors_) { + targetedArtifactSelectors_ = _targetedArtifactSelectors; + } + + function targetContracts() public view returns (address[] memory targetedContracts_) { + targetedContracts_ = _targetedContracts; + } + + function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) { + targetedSelectors_ = _targetedSelectors; + } + + function targetSenders() public view returns (address[] memory targetedSenders_) { + targetedSenders_ = _targetedSenders; + } + + function targetInterfaces() public view returns (FuzzInterface[] memory targetedInterfaces_) { + targetedInterfaces_ = _targetedInterfaces; + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdJson.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdJson.sol new file mode 100644 index 000000000..2a033c03a --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdJson.sol @@ -0,0 +1,283 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {VmSafe} from "./Vm.sol"; + +// Helpers for parsing and writing JSON files +// To parse: +// ``` +// using stdJson for string; +// string memory json = vm.readFile(""); +// json.readUint(""); +// ``` +// To write: +// ``` +// using stdJson for string; +// string memory json = "json"; +// json.serialize("a", uint256(123)); +// string memory semiFinal = json.serialize("b", string("test")); +// string memory finalJson = json.serialize("c", semiFinal); +// finalJson.write(""); +// ``` + +library stdJson { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function keyExists(string memory json, string memory key) internal view returns (bool) { + return vm.keyExistsJson(json, key); + } + + function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) { + return vm.parseJson(json, key); + } + + function readUint(string memory json, string memory key) internal pure returns (uint256) { + return vm.parseJsonUint(json, key); + } + + function readUintArray(string memory json, string memory key) internal pure returns (uint256[] memory) { + return vm.parseJsonUintArray(json, key); + } + + function readInt(string memory json, string memory key) internal pure returns (int256) { + return vm.parseJsonInt(json, key); + } + + function readIntArray(string memory json, string memory key) internal pure returns (int256[] memory) { + return vm.parseJsonIntArray(json, key); + } + + function readBytes32(string memory json, string memory key) internal pure returns (bytes32) { + return vm.parseJsonBytes32(json, key); + } + + function readBytes32Array(string memory json, string memory key) internal pure returns (bytes32[] memory) { + return vm.parseJsonBytes32Array(json, key); + } + + function readString(string memory json, string memory key) internal pure returns (string memory) { + return vm.parseJsonString(json, key); + } + + function readStringArray(string memory json, string memory key) internal pure returns (string[] memory) { + return vm.parseJsonStringArray(json, key); + } + + function readAddress(string memory json, string memory key) internal pure returns (address) { + return vm.parseJsonAddress(json, key); + } + + function readAddressArray(string memory json, string memory key) internal pure returns (address[] memory) { + return vm.parseJsonAddressArray(json, key); + } + + function readBool(string memory json, string memory key) internal pure returns (bool) { + return vm.parseJsonBool(json, key); + } + + function readBoolArray(string memory json, string memory key) internal pure returns (bool[] memory) { + return vm.parseJsonBoolArray(json, key); + } + + function readBytes(string memory json, string memory key) internal pure returns (bytes memory) { + return vm.parseJsonBytes(json, key); + } + + function readBytesArray(string memory json, string memory key) internal pure returns (bytes[] memory) { + return vm.parseJsonBytesArray(json, key); + } + + function readUintOr(string memory json, string memory key, uint256 defaultValue) internal view returns (uint256) { + return keyExists(json, key) ? readUint(json, key) : defaultValue; + } + + function readUintArrayOr(string memory json, string memory key, uint256[] memory defaultValue) + internal + view + returns (uint256[] memory) + { + return keyExists(json, key) ? readUintArray(json, key) : defaultValue; + } + + function readIntOr(string memory json, string memory key, int256 defaultValue) internal view returns (int256) { + return keyExists(json, key) ? readInt(json, key) : defaultValue; + } + + function readIntArrayOr(string memory json, string memory key, int256[] memory defaultValue) + internal + view + returns (int256[] memory) + { + return keyExists(json, key) ? readIntArray(json, key) : defaultValue; + } + + function readBytes32Or(string memory json, string memory key, bytes32 defaultValue) + internal + view + returns (bytes32) + { + return keyExists(json, key) ? readBytes32(json, key) : defaultValue; + } + + function readBytes32ArrayOr(string memory json, string memory key, bytes32[] memory defaultValue) + internal + view + returns (bytes32[] memory) + { + return keyExists(json, key) ? readBytes32Array(json, key) : defaultValue; + } + + function readStringOr(string memory json, string memory key, string memory defaultValue) + internal + view + returns (string memory) + { + return keyExists(json, key) ? readString(json, key) : defaultValue; + } + + function readStringArrayOr(string memory json, string memory key, string[] memory defaultValue) + internal + view + returns (string[] memory) + { + return keyExists(json, key) ? readStringArray(json, key) : defaultValue; + } + + function readAddressOr(string memory json, string memory key, address defaultValue) + internal + view + returns (address) + { + return keyExists(json, key) ? readAddress(json, key) : defaultValue; + } + + function readAddressArrayOr(string memory json, string memory key, address[] memory defaultValue) + internal + view + returns (address[] memory) + { + return keyExists(json, key) ? readAddressArray(json, key) : defaultValue; + } + + function readBoolOr(string memory json, string memory key, bool defaultValue) internal view returns (bool) { + return keyExists(json, key) ? readBool(json, key) : defaultValue; + } + + function readBoolArrayOr(string memory json, string memory key, bool[] memory defaultValue) + internal + view + returns (bool[] memory) + { + return keyExists(json, key) ? readBoolArray(json, key) : defaultValue; + } + + function readBytesOr(string memory json, string memory key, bytes memory defaultValue) + internal + view + returns (bytes memory) + { + return keyExists(json, key) ? readBytes(json, key) : defaultValue; + } + + function readBytesArrayOr(string memory json, string memory key, bytes[] memory defaultValue) + internal + view + returns (bytes[] memory) + { + return keyExists(json, key) ? readBytesArray(json, key) : defaultValue; + } + + function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) { + return vm.serializeJson(jsonKey, rootObject); + } + + function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bool[] memory value) + internal + returns (string memory) + { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256[] memory value) + internal + returns (string memory) + { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256[] memory value) + internal + returns (string memory) + { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address[] memory value) + internal + returns (string memory) + { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string[] memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function write(string memory jsonKey, string memory path) internal { + vm.writeJson(jsonKey, path); + } + + function write(string memory jsonKey, string memory path, string memory valueKey) internal { + vm.writeJson(jsonKey, path, valueKey); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdMath.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdMath.sol new file mode 100644 index 000000000..459523bda --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdMath.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +library stdMath { + int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968; + + function abs(int256 a) internal pure returns (uint256) { + // Required or it will fail when `a = type(int256).min` + if (a == INT256_MIN) { + return 57896044618658097711785492504343953926634992332820282019728792003956564819968; + } + + return uint256(a > 0 ? a : -a); + } + + function delta(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a - b : b - a; + } + + function delta(int256 a, int256 b) internal pure returns (uint256) { + // a and b are of the same sign + // this works thanks to two's complement, the left-most bit is the sign bit + if ((a ^ b) > -1) { + return delta(abs(a), abs(b)); + } + + // a and b are of opposite signs + return abs(a) + abs(b); + } + + function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 absDelta = delta(a, b); + + return absDelta * 1e18 / b; + } + + function percentDelta(int256 a, int256 b) internal pure returns (uint256) { + uint256 absDelta = delta(a, b); + uint256 absB = abs(b); + + return absDelta * 1e18 / absB; + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdStorage.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdStorage.sol new file mode 100644 index 000000000..1627af753 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdStorage.sol @@ -0,0 +1,473 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {Vm} from "./Vm.sol"; + +struct FindData { + uint256 slot; + uint256 offsetLeft; + uint256 offsetRight; + bool found; +} + +struct StdStorage { + mapping(address => mapping(bytes4 => mapping(bytes32 => FindData))) finds; + bytes32[] _keys; + bytes4 _sig; + uint256 _depth; + address _target; + bytes32 _set; + bool _enable_packed_slots; + bytes _calldata; +} + +library stdStorageSafe { + event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot); + event WARNING_UninitedSlot(address who, uint256 slot); + + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + uint256 constant UINT256_MAX = 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + function sigs(string memory sigStr) internal pure returns (bytes4) { + return bytes4(keccak256(bytes(sigStr))); + } + + function getCallParams(StdStorage storage self) internal view returns (bytes memory) { + if (self._calldata.length == 0) { + return flatten(self._keys); + } else { + return self._calldata; + } + } + + // Calls target contract with configured parameters + function callTarget(StdStorage storage self) internal view returns (bool, bytes32) { + bytes memory cd = abi.encodePacked(self._sig, getCallParams(self)); + (bool success, bytes memory rdat) = self._target.staticcall(cd); + bytes32 result = bytesToBytes32(rdat, 32 * self._depth); + + return (success, result); + } + + // Tries mutating slot value to determine if the targeted value is stored in it. + // If current value is 0, then we are setting slot value to type(uint256).max + // Otherwise, we set it to 0. That way, return value should always be affected. + function checkSlotMutatesCall(StdStorage storage self, bytes32 slot) internal returns (bool) { + bytes32 prevSlotValue = vm.load(self._target, slot); + (bool success, bytes32 prevReturnValue) = callTarget(self); + + bytes32 testVal = prevReturnValue == bytes32(0) ? bytes32(UINT256_MAX) : bytes32(0); + vm.store(self._target, slot, testVal); + + (, bytes32 newReturnValue) = callTarget(self); + + vm.store(self._target, slot, prevSlotValue); + + return (success && (prevReturnValue != newReturnValue)); + } + + // Tries setting one of the bits in slot to 1 until return value changes. + // Index of resulted bit is an offset packed slot has from left/right side + function findOffset(StdStorage storage self, bytes32 slot, bool left) internal returns (bool, uint256) { + for (uint256 offset = 0; offset < 256; offset++) { + uint256 valueToPut = left ? (1 << (255 - offset)) : (1 << offset); + vm.store(self._target, slot, bytes32(valueToPut)); + + (bool success, bytes32 data) = callTarget(self); + + if (success && (uint256(data) > 0)) { + return (true, offset); + } + } + return (false, 0); + } + + function findOffsets(StdStorage storage self, bytes32 slot) internal returns (bool, uint256, uint256) { + bytes32 prevSlotValue = vm.load(self._target, slot); + + (bool foundLeft, uint256 offsetLeft) = findOffset(self, slot, true); + (bool foundRight, uint256 offsetRight) = findOffset(self, slot, false); + + // `findOffset` may mutate slot value, so we are setting it to initial value + vm.store(self._target, slot, prevSlotValue); + return (foundLeft && foundRight, offsetLeft, offsetRight); + } + + function find(StdStorage storage self) internal returns (FindData storage) { + return find(self, true); + } + + /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against + // slot complexity: + // if flat, will be bytes32(uint256(uint)); + // if map, will be keccak256(abi.encode(key, uint(slot))); + // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))); + // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); + function find(StdStorage storage self, bool _clear) internal returns (FindData storage) { + address who = self._target; + bytes4 fsig = self._sig; + uint256 field_depth = self._depth; + bytes memory params = getCallParams(self); + + // calldata to test against + if (self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { + if (_clear) { + clear(self); + } + return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; + } + vm.record(); + (, bytes32 callResult) = callTarget(self); + (bytes32[] memory reads,) = vm.accesses(address(who)); + + if (reads.length == 0) { + revert("stdStorage find(StdStorage): No storage use detected for target."); + } else { + for (uint256 i = reads.length; --i >= 0;) { + bytes32 prev = vm.load(who, reads[i]); + if (prev == bytes32(0)) { + emit WARNING_UninitedSlot(who, uint256(reads[i])); + } + + if (!checkSlotMutatesCall(self, reads[i])) { + continue; + } + + (uint256 offsetLeft, uint256 offsetRight) = (0, 0); + + if (self._enable_packed_slots) { + bool found; + (found, offsetLeft, offsetRight) = findOffsets(self, reads[i]); + if (!found) { + continue; + } + } + + // Check that value between found offsets is equal to the current call result + uint256 curVal = (uint256(prev) & getMaskByOffsets(offsetLeft, offsetRight)) >> offsetRight; + + if (uint256(callResult) != curVal) { + continue; + } + + emit SlotFound(who, fsig, keccak256(abi.encodePacked(params, field_depth)), uint256(reads[i])); + self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))] = + FindData(uint256(reads[i]), offsetLeft, offsetRight, true); + break; + } + } + + require( + self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found, + "stdStorage find(StdStorage): Slot(s) not found." + ); + + if (_clear) { + clear(self); + } + return self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; + } + + function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { + self._target = _target; + return self; + } + + function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { + self._sig = _sig; + return self; + } + + function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { + self._sig = sigs(_sig); + return self; + } + + function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { + self._calldata = _calldata; + return self; + } + + function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { + self._keys.push(bytes32(uint256(uint160(who)))); + return self; + } + + function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { + self._keys.push(bytes32(amt)); + return self; + } + + function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { + self._keys.push(key); + return self; + } + + function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { + self._enable_packed_slots = true; + return self; + } + + function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { + self._depth = _depth; + return self; + } + + function read(StdStorage storage self) private returns (bytes memory) { + FindData storage data = find(self, false); + uint256 mask = getMaskByOffsets(data.offsetLeft, data.offsetRight); + uint256 value = (uint256(vm.load(self._target, bytes32(data.slot))) & mask) >> data.offsetRight; + clear(self); + return abi.encode(value); + } + + function read_bytes32(StdStorage storage self) internal returns (bytes32) { + return abi.decode(read(self), (bytes32)); + } + + function read_bool(StdStorage storage self) internal returns (bool) { + int256 v = read_int(self); + if (v == 0) return false; + if (v == 1) return true; + revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); + } + + function read_address(StdStorage storage self) internal returns (address) { + return abi.decode(read(self), (address)); + } + + function read_uint(StdStorage storage self) internal returns (uint256) { + return abi.decode(read(self), (uint256)); + } + + function read_int(StdStorage storage self) internal returns (int256) { + return abi.decode(read(self), (int256)); + } + + function parent(StdStorage storage self) internal returns (uint256, bytes32) { + address who = self._target; + uint256 field_depth = self._depth; + vm.startMappingRecording(); + uint256 child = find(self, true).slot - field_depth; + (bool found, bytes32 key, bytes32 parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); + if (!found) { + revert( + "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." + ); + } + return (uint256(parent_slot), key); + } + + function root(StdStorage storage self) internal returns (uint256) { + address who = self._target; + uint256 field_depth = self._depth; + vm.startMappingRecording(); + uint256 child = find(self, true).slot - field_depth; + bool found; + bytes32 root_slot; + bytes32 parent_slot; + (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(child)); + if (!found) { + revert( + "stdStorage read_bool(StdStorage): Cannot find parent. Make sure you give a slot and startMappingRecording() has been called." + ); + } + while (found) { + root_slot = parent_slot; + (found,, parent_slot) = vm.getMappingKeyAndParentOf(who, bytes32(root_slot)); + } + return uint256(root_slot); + } + + function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { + bytes32 out; + + uint256 max = b.length > 32 ? 32 : b.length; + for (uint256 i = 0; i < max; i++) { + out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); + } + return out; + } + + function flatten(bytes32[] memory b) private pure returns (bytes memory) { + bytes memory result = new bytes(b.length * 32); + for (uint256 i = 0; i < b.length; i++) { + bytes32 k = b[i]; + /// @solidity memory-safe-assembly + assembly { + mstore(add(result, add(32, mul(32, i))), k) + } + } + + return result; + } + + function clear(StdStorage storage self) internal { + delete self._target; + delete self._sig; + delete self._keys; + delete self._depth; + delete self._enable_packed_slots; + delete self._calldata; + } + + // Returns mask which contains non-zero bits for values between `offsetLeft` and `offsetRight` + // (slotValue & mask) >> offsetRight will be the value of the given packed variable + function getMaskByOffsets(uint256 offsetLeft, uint256 offsetRight) internal pure returns (uint256 mask) { + // mask = ((1 << (256 - (offsetRight + offsetLeft))) - 1) << offsetRight; + // using assembly because (1 << 256) causes overflow + assembly { + mask := shl(offsetRight, sub(shl(sub(256, add(offsetRight, offsetLeft)), 1), 1)) + } + } + + // Returns slot value with updated packed variable. + function getUpdatedSlotValue(bytes32 curValue, uint256 varValue, uint256 offsetLeft, uint256 offsetRight) + internal + pure + returns (bytes32 newValue) + { + return bytes32((uint256(curValue) & ~getMaskByOffsets(offsetLeft, offsetRight)) | (varValue << offsetRight)); + } +} + +library stdStorage { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function sigs(string memory sigStr) internal pure returns (bytes4) { + return stdStorageSafe.sigs(sigStr); + } + + function find(StdStorage storage self) internal returns (uint256) { + return find(self, true); + } + + function find(StdStorage storage self, bool _clear) internal returns (uint256) { + return stdStorageSafe.find(self, _clear).slot; + } + + function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { + return stdStorageSafe.target(self, _target); + } + + function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { + return stdStorageSafe.sig(self, _sig); + } + + function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { + return stdStorageSafe.sig(self, _sig); + } + + function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, who); + } + + function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, amt); + } + + function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, key); + } + + function with_calldata(StdStorage storage self, bytes memory _calldata) internal returns (StdStorage storage) { + return stdStorageSafe.with_calldata(self, _calldata); + } + + function enable_packed_slots(StdStorage storage self) internal returns (StdStorage storage) { + return stdStorageSafe.enable_packed_slots(self); + } + + function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { + return stdStorageSafe.depth(self, _depth); + } + + function clear(StdStorage storage self) internal { + stdStorageSafe.clear(self); + } + + function checked_write(StdStorage storage self, address who) internal { + checked_write(self, bytes32(uint256(uint160(who)))); + } + + function checked_write(StdStorage storage self, uint256 amt) internal { + checked_write(self, bytes32(amt)); + } + + function checked_write_int(StdStorage storage self, int256 val) internal { + checked_write(self, bytes32(uint256(val))); + } + + function checked_write(StdStorage storage self, bool write) internal { + bytes32 t; + /// @solidity memory-safe-assembly + assembly { + t := write + } + checked_write(self, t); + } + + function checked_write(StdStorage storage self, bytes32 set) internal { + address who = self._target; + bytes4 fsig = self._sig; + uint256 field_depth = self._depth; + bytes memory params = stdStorageSafe.getCallParams(self); + + if (!self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))].found) { + find(self, false); + } + FindData storage data = self.finds[who][fsig][keccak256(abi.encodePacked(params, field_depth))]; + if ((data.offsetLeft + data.offsetRight) > 0) { + uint256 maxVal = 2 ** (256 - (data.offsetLeft + data.offsetRight)); + require( + uint256(set) < maxVal, + string( + abi.encodePacked( + "stdStorage find(StdStorage): Packed slot. We can't fit value greater than ", + vm.toString(maxVal) + ) + ) + ); + } + bytes32 curVal = vm.load(who, bytes32(data.slot)); + bytes32 valToSet = stdStorageSafe.getUpdatedSlotValue(curVal, uint256(set), data.offsetLeft, data.offsetRight); + + vm.store(who, bytes32(data.slot), valToSet); + + (bool success, bytes32 callResult) = stdStorageSafe.callTarget(self); + + if (!success || callResult != set) { + vm.store(who, bytes32(data.slot), curVal); + revert("stdStorage find(StdStorage): Failed to write value."); + } + clear(self); + } + + function read_bytes32(StdStorage storage self) internal returns (bytes32) { + return stdStorageSafe.read_bytes32(self); + } + + function read_bool(StdStorage storage self) internal returns (bool) { + return stdStorageSafe.read_bool(self); + } + + function read_address(StdStorage storage self) internal returns (address) { + return stdStorageSafe.read_address(self); + } + + function read_uint(StdStorage storage self) internal returns (uint256) { + return stdStorageSafe.read_uint(self); + } + + function read_int(StdStorage storage self) internal returns (int256) { + return stdStorageSafe.read_int(self); + } + + function parent(StdStorage storage self) internal returns (uint256, bytes32) { + return stdStorageSafe.parent(self); + } + + function root(StdStorage storage self) internal returns (uint256) { + return stdStorageSafe.root(self); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdStyle.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdStyle.sol new file mode 100644 index 000000000..d371e0c60 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdStyle.sol @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +import {VmSafe} from "./Vm.sol"; + +library StdStyle { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + string constant RED = "\u001b[91m"; + string constant GREEN = "\u001b[92m"; + string constant YELLOW = "\u001b[93m"; + string constant BLUE = "\u001b[94m"; + string constant MAGENTA = "\u001b[95m"; + string constant CYAN = "\u001b[96m"; + string constant BOLD = "\u001b[1m"; + string constant DIM = "\u001b[2m"; + string constant ITALIC = "\u001b[3m"; + string constant UNDERLINE = "\u001b[4m"; + string constant INVERSE = "\u001b[7m"; + string constant RESET = "\u001b[0m"; + + function styleConcat(string memory style, string memory self) private pure returns (string memory) { + return string(abi.encodePacked(style, self, RESET)); + } + + function red(string memory self) internal pure returns (string memory) { + return styleConcat(RED, self); + } + + function red(uint256 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(int256 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(address self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(bool self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function redBytes(bytes memory self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function redBytes32(bytes32 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function green(string memory self) internal pure returns (string memory) { + return styleConcat(GREEN, self); + } + + function green(uint256 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(int256 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(address self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(bool self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function greenBytes(bytes memory self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function greenBytes32(bytes32 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function yellow(string memory self) internal pure returns (string memory) { + return styleConcat(YELLOW, self); + } + + function yellow(uint256 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(int256 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(address self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(bool self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellowBytes(bytes memory self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellowBytes32(bytes32 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function blue(string memory self) internal pure returns (string memory) { + return styleConcat(BLUE, self); + } + + function blue(uint256 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(int256 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(address self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(bool self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blueBytes(bytes memory self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blueBytes32(bytes32 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function magenta(string memory self) internal pure returns (string memory) { + return styleConcat(MAGENTA, self); + } + + function magenta(uint256 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(int256 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(address self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(bool self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magentaBytes(bytes memory self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magentaBytes32(bytes32 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function cyan(string memory self) internal pure returns (string memory) { + return styleConcat(CYAN, self); + } + + function cyan(uint256 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(int256 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(address self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(bool self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyanBytes(bytes memory self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyanBytes32(bytes32 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function bold(string memory self) internal pure returns (string memory) { + return styleConcat(BOLD, self); + } + + function bold(uint256 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(int256 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(address self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(bool self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function boldBytes(bytes memory self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function boldBytes32(bytes32 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function dim(string memory self) internal pure returns (string memory) { + return styleConcat(DIM, self); + } + + function dim(uint256 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(int256 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(address self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(bool self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dimBytes(bytes memory self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dimBytes32(bytes32 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function italic(string memory self) internal pure returns (string memory) { + return styleConcat(ITALIC, self); + } + + function italic(uint256 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(int256 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(address self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(bool self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italicBytes(bytes memory self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italicBytes32(bytes32 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function underline(string memory self) internal pure returns (string memory) { + return styleConcat(UNDERLINE, self); + } + + function underline(uint256 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(int256 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(address self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(bool self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underlineBytes(bytes memory self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underlineBytes32(bytes32 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function inverse(string memory self) internal pure returns (string memory) { + return styleConcat(INVERSE, self); + } + + function inverse(uint256 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(int256 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(address self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(bool self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverseBytes(bytes memory self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverseBytes32(bytes32 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdToml.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdToml.sol new file mode 100644 index 000000000..7ad3be2f9 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdToml.sol @@ -0,0 +1,283 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {VmSafe} from "./Vm.sol"; + +// Helpers for parsing and writing TOML files +// To parse: +// ``` +// using stdToml for string; +// string memory toml = vm.readFile(""); +// toml.readUint(""); +// ``` +// To write: +// ``` +// using stdToml for string; +// string memory json = "json"; +// json.serialize("a", uint256(123)); +// string memory semiFinal = json.serialize("b", string("test")); +// string memory finalJson = json.serialize("c", semiFinal); +// finalJson.write(""); +// ``` + +library stdToml { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function keyExists(string memory toml, string memory key) internal view returns (bool) { + return vm.keyExistsToml(toml, key); + } + + function parseRaw(string memory toml, string memory key) internal pure returns (bytes memory) { + return vm.parseToml(toml, key); + } + + function readUint(string memory toml, string memory key) internal pure returns (uint256) { + return vm.parseTomlUint(toml, key); + } + + function readUintArray(string memory toml, string memory key) internal pure returns (uint256[] memory) { + return vm.parseTomlUintArray(toml, key); + } + + function readInt(string memory toml, string memory key) internal pure returns (int256) { + return vm.parseTomlInt(toml, key); + } + + function readIntArray(string memory toml, string memory key) internal pure returns (int256[] memory) { + return vm.parseTomlIntArray(toml, key); + } + + function readBytes32(string memory toml, string memory key) internal pure returns (bytes32) { + return vm.parseTomlBytes32(toml, key); + } + + function readBytes32Array(string memory toml, string memory key) internal pure returns (bytes32[] memory) { + return vm.parseTomlBytes32Array(toml, key); + } + + function readString(string memory toml, string memory key) internal pure returns (string memory) { + return vm.parseTomlString(toml, key); + } + + function readStringArray(string memory toml, string memory key) internal pure returns (string[] memory) { + return vm.parseTomlStringArray(toml, key); + } + + function readAddress(string memory toml, string memory key) internal pure returns (address) { + return vm.parseTomlAddress(toml, key); + } + + function readAddressArray(string memory toml, string memory key) internal pure returns (address[] memory) { + return vm.parseTomlAddressArray(toml, key); + } + + function readBool(string memory toml, string memory key) internal pure returns (bool) { + return vm.parseTomlBool(toml, key); + } + + function readBoolArray(string memory toml, string memory key) internal pure returns (bool[] memory) { + return vm.parseTomlBoolArray(toml, key); + } + + function readBytes(string memory toml, string memory key) internal pure returns (bytes memory) { + return vm.parseTomlBytes(toml, key); + } + + function readBytesArray(string memory toml, string memory key) internal pure returns (bytes[] memory) { + return vm.parseTomlBytesArray(toml, key); + } + + function readUintOr(string memory toml, string memory key, uint256 defaultValue) internal view returns (uint256) { + return keyExists(toml, key) ? readUint(toml, key) : defaultValue; + } + + function readUintArrayOr(string memory toml, string memory key, uint256[] memory defaultValue) + internal + view + returns (uint256[] memory) + { + return keyExists(toml, key) ? readUintArray(toml, key) : defaultValue; + } + + function readIntOr(string memory toml, string memory key, int256 defaultValue) internal view returns (int256) { + return keyExists(toml, key) ? readInt(toml, key) : defaultValue; + } + + function readIntArrayOr(string memory toml, string memory key, int256[] memory defaultValue) + internal + view + returns (int256[] memory) + { + return keyExists(toml, key) ? readIntArray(toml, key) : defaultValue; + } + + function readBytes32Or(string memory toml, string memory key, bytes32 defaultValue) + internal + view + returns (bytes32) + { + return keyExists(toml, key) ? readBytes32(toml, key) : defaultValue; + } + + function readBytes32ArrayOr(string memory toml, string memory key, bytes32[] memory defaultValue) + internal + view + returns (bytes32[] memory) + { + return keyExists(toml, key) ? readBytes32Array(toml, key) : defaultValue; + } + + function readStringOr(string memory toml, string memory key, string memory defaultValue) + internal + view + returns (string memory) + { + return keyExists(toml, key) ? readString(toml, key) : defaultValue; + } + + function readStringArrayOr(string memory toml, string memory key, string[] memory defaultValue) + internal + view + returns (string[] memory) + { + return keyExists(toml, key) ? readStringArray(toml, key) : defaultValue; + } + + function readAddressOr(string memory toml, string memory key, address defaultValue) + internal + view + returns (address) + { + return keyExists(toml, key) ? readAddress(toml, key) : defaultValue; + } + + function readAddressArrayOr(string memory toml, string memory key, address[] memory defaultValue) + internal + view + returns (address[] memory) + { + return keyExists(toml, key) ? readAddressArray(toml, key) : defaultValue; + } + + function readBoolOr(string memory toml, string memory key, bool defaultValue) internal view returns (bool) { + return keyExists(toml, key) ? readBool(toml, key) : defaultValue; + } + + function readBoolArrayOr(string memory toml, string memory key, bool[] memory defaultValue) + internal + view + returns (bool[] memory) + { + return keyExists(toml, key) ? readBoolArray(toml, key) : defaultValue; + } + + function readBytesOr(string memory toml, string memory key, bytes memory defaultValue) + internal + view + returns (bytes memory) + { + return keyExists(toml, key) ? readBytes(toml, key) : defaultValue; + } + + function readBytesArrayOr(string memory toml, string memory key, bytes[] memory defaultValue) + internal + view + returns (bytes[] memory) + { + return keyExists(toml, key) ? readBytesArray(toml, key) : defaultValue; + } + + function serialize(string memory jsonKey, string memory rootObject) internal returns (string memory) { + return vm.serializeJson(jsonKey, rootObject); + } + + function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bool[] memory value) + internal + returns (string memory) + { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256[] memory value) + internal + returns (string memory) + { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256[] memory value) + internal + returns (string memory) + { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address[] memory value) + internal + returns (string memory) + { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string[] memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function write(string memory jsonKey, string memory path) internal { + vm.writeToml(jsonKey, path); + } + + function write(string memory jsonKey, string memory path, string memory valueKey) internal { + vm.writeToml(jsonKey, path, valueKey); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdUtils.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdUtils.sol new file mode 100644 index 000000000..9321df143 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/StdUtils.sol @@ -0,0 +1,208 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {IMulticall3} from "./interfaces/IMulticall3.sol"; +import {VmSafe} from "./Vm.sol"; + +abstract contract StdUtils { + /*////////////////////////////////////////////////////////////////////////// + CONSTANTS + //////////////////////////////////////////////////////////////////////////*/ + + IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; + uint256 private constant INT256_MIN_ABS = + 57896044618658097711785492504343953926634992332820282019728792003956564819968; + uint256 private constant SECP256K1_ORDER = + 115792089237316195423570985008687907852837564279074904382605163141518161494337; + uint256 private constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. + address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + + /*////////////////////////////////////////////////////////////////////////// + INTERNAL FUNCTIONS + //////////////////////////////////////////////////////////////////////////*/ + + function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { + require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min."); + // If x is between min and max, return x directly. This is to ensure that dictionary values + // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188 + if (x >= min && x <= max) return x; + + uint256 size = max - min + 1; + + // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side. + // This helps ensure coverage of the min/max values. + if (x <= 3 && size > x) return min + x; + if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x); + + // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive. + if (x > max) { + uint256 diff = x - max; + uint256 rem = diff % size; + if (rem == 0) return max; + result = min + rem - 1; + } else if (x < min) { + uint256 diff = min - x; + uint256 rem = diff % size; + if (rem == 0) return min; + result = max - rem + 1; + } + } + + function bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { + result = _bound(x, min, max); + console2_log_StdUtils("Bound result", result); + } + + function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { + require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min."); + + // Shifting all int256 values to uint256 to use _bound function. The range of two types are: + // int256 : -(2**255) ~ (2**255 - 1) + // uint256: 0 ~ (2**256 - 1) + // So, add 2**255, INT256_MIN_ABS to the integer values. + // + // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow. + // So, use `~uint256(x) + 1` instead. + uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS); + uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS); + uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS); + + uint256 y = _bound(_x, _min, _max); + + // To move it back to int256 value, subtract INT256_MIN_ABS at here. + result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS); + } + + function bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { + result = _bound(x, min, max); + console2_log_StdUtils("Bound result", vm.toString(result)); + } + + function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) { + result = _bound(privateKey, 1, SECP256K1_ORDER - 1); + } + + function bytesToUint(bytes memory b) internal pure virtual returns (uint256) { + require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32."); + return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); + } + + /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce + function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) { + console2_log_StdUtils("computeCreateAddress is deprecated. Please use vm.computeCreateAddress instead."); + return vm.computeCreateAddress(deployer, nonce); + } + + function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer) + internal + pure + virtual + returns (address) + { + console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); + return vm.computeCreate2Address(salt, initcodeHash, deployer); + } + + /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer + function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) { + console2_log_StdUtils("computeCreate2Address is deprecated. Please use vm.computeCreate2Address instead."); + return vm.computeCreate2Address(salt, initCodeHash); + } + + /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments + /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode + function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) { + return hashInitCode(creationCode, ""); + } + + /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2 + /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode + /// @param args the ABI-encoded arguments to the constructor of C + function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(creationCode, args)); + } + + // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses. + function getTokenBalances(address token, address[] memory addresses) + internal + virtual + returns (uint256[] memory balances) + { + uint256 tokenCodeSize; + assembly { + tokenCodeSize := extcodesize(token) + } + require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract."); + + // ABI encode the aggregate call to Multicall3. + uint256 length = addresses.length; + IMulticall3.Call[] memory calls = new IMulticall3.Call[](length); + for (uint256 i = 0; i < length; ++i) { + // 0x70a08231 = bytes4("balanceOf(address)")) + calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))}); + } + + // Make the aggregate call. + (, bytes[] memory returnData) = multicall.aggregate(calls); + + // ABI decode the return data and return the balances. + balances = new uint256[](length); + for (uint256 i = 0; i < length; ++i) { + balances[i] = abi.decode(returnData[i], (uint256)); + } + } + + /*////////////////////////////////////////////////////////////////////////// + PRIVATE FUNCTIONS + //////////////////////////////////////////////////////////////////////////*/ + + function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) { + return address(uint160(uint256(bytesValue))); + } + + // This section is used to prevent the compilation of console, which shortens the compilation time when console is + // not used elsewhere. We also trick the compiler into letting us make the console log methods as `pure` to avoid + // any breaking changes to function signatures. + function _castLogPayloadViewToPure(function(bytes memory) internal view fnIn) + internal + pure + returns (function(bytes memory) internal pure fnOut) + { + assembly { + fnOut := fnIn + } + } + + function _sendLogPayload(bytes memory payload) internal pure { + _castLogPayloadViewToPure(_sendLogPayloadView)(payload); + } + + function _sendLogPayloadView(bytes memory payload) private view { + uint256 payloadLength = payload.length; + address consoleAddress = CONSOLE2_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + let payloadStart := add(payload, 32) + let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) + } + } + + function console2_log_StdUtils(string memory p0) private pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function console2_log_StdUtils(string memory p0, uint256 p1) private pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); + } + + function console2_log_StdUtils(string memory p0, string memory p1) private pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Test.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Test.sol new file mode 100644 index 000000000..11b18f29f --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Test.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +// 💬 ABOUT +// Forge Std's default Test. + +// 🧩 MODULES +import {console} from "./console.sol"; +import {console2} from "./console2.sol"; +import {safeconsole} from "./safeconsole.sol"; +import {StdAssertions} from "./StdAssertions.sol"; +import {StdChains} from "./StdChains.sol"; +import {StdCheats} from "./StdCheats.sol"; +import {StdConstants} from "./StdConstants.sol"; +import {stdError} from "./StdError.sol"; +import {StdInvariant} from "./StdInvariant.sol"; +import {stdJson} from "./StdJson.sol"; +import {stdMath} from "./StdMath.sol"; +import {StdStorage, stdStorage} from "./StdStorage.sol"; +import {StdStyle} from "./StdStyle.sol"; +import {stdToml} from "./StdToml.sol"; +import {StdUtils} from "./StdUtils.sol"; +import {Vm} from "./Vm.sol"; + +// 📦 BOILERPLATE +import {TestBase} from "./Base.sol"; + +// ⭐️ TEST +abstract contract Test is TestBase, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils { + // Note: IS_TEST() must return true. + bool public IS_TEST = true; +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Vm.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Vm.sol new file mode 100644 index 000000000..cd883706a --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/Vm.sol @@ -0,0 +1,2494 @@ +// Automatically @generated by scripts/vm.py. Do not modify manually. + +// SPDX-License-Identifier: MIT OR Apache-2.0 +pragma solidity >=0.6.2 <0.9.0; +pragma experimental ABIEncoderV2; + +/// The `VmSafe` interface does not allow manipulation of the EVM state or other actions that may +/// result in Script simulations differing from on-chain execution. It is recommended to only use +/// these cheats in scripts. +interface VmSafe { + /// A modification applied to either `msg.sender` or `tx.origin`. Returned by `readCallers`. + enum CallerMode { + // No caller modification is currently active. + None, + // A one time broadcast triggered by a `vm.broadcast()` call is currently active. + Broadcast, + // A recurrent broadcast triggered by a `vm.startBroadcast()` call is currently active. + RecurrentBroadcast, + // A one time prank triggered by a `vm.prank()` call is currently active. + Prank, + // A recurrent prank triggered by a `vm.startPrank()` call is currently active. + RecurrentPrank + } + + /// The kind of account access that occurred. + enum AccountAccessKind { + // The account was called. + Call, + // The account was called via delegatecall. + DelegateCall, + // The account was called via callcode. + CallCode, + // The account was called via staticcall. + StaticCall, + // The account was created. + Create, + // The account was selfdestructed. + SelfDestruct, + // Synthetic access indicating the current context has resumed after a previous sub-context (AccountAccess). + Resume, + // The account's balance was read. + Balance, + // The account's codesize was read. + Extcodesize, + // The account's codehash was read. + Extcodehash, + // The account's code was copied. + Extcodecopy + } + + /// Forge execution contexts. + enum ForgeContext { + // Test group execution context (test, coverage or snapshot). + TestGroup, + // `forge test` execution context. + Test, + // `forge coverage` execution context. + Coverage, + // `forge snapshot` execution context. + Snapshot, + // Script group execution context (dry run, broadcast or resume). + ScriptGroup, + // `forge script` execution context. + ScriptDryRun, + // `forge script --broadcast` execution context. + ScriptBroadcast, + // `forge script --resume` execution context. + ScriptResume, + // Unknown `forge` execution context. + Unknown + } + + /// The transaction type (`txType`) of the broadcast. + enum BroadcastTxType { + // Represents a CALL broadcast tx. + Call, + // Represents a CREATE broadcast tx. + Create, + // Represents a CREATE2 broadcast tx. + Create2 + } + + /// An Ethereum log. Returned by `getRecordedLogs`. + struct Log { + // The topics of the log, including the signature, if any. + bytes32[] topics; + // The raw data of the log. + bytes data; + // The address of the log's emitter. + address emitter; + } + + /// An RPC URL and its alias. Returned by `rpcUrlStructs`. + struct Rpc { + // The alias of the RPC URL. + string key; + // The RPC URL. + string url; + } + + /// An RPC log object. Returned by `eth_getLogs`. + struct EthGetLogs { + // The address of the log's emitter. + address emitter; + // The topics of the log, including the signature, if any. + bytes32[] topics; + // The raw data of the log. + bytes data; + // The block hash. + bytes32 blockHash; + // The block number. + uint64 blockNumber; + // The transaction hash. + bytes32 transactionHash; + // The transaction index in the block. + uint64 transactionIndex; + // The log index. + uint256 logIndex; + // Whether the log was removed. + bool removed; + } + + /// A single entry in a directory listing. Returned by `readDir`. + struct DirEntry { + // The error message, if any. + string errorMessage; + // The path of the entry. + string path; + // The depth of the entry. + uint64 depth; + // Whether the entry is a directory. + bool isDir; + // Whether the entry is a symlink. + bool isSymlink; + } + + /// Metadata information about a file. + /// This structure is returned from the `fsMetadata` function and represents known + /// metadata about a file such as its permissions, size, modification + /// times, etc. + struct FsMetadata { + // True if this metadata is for a directory. + bool isDir; + // True if this metadata is for a symlink. + bool isSymlink; + // The size of the file, in bytes, this metadata is for. + uint256 length; + // True if this metadata is for a readonly (unwritable) file. + bool readOnly; + // The last modification time listed in this metadata. + uint256 modified; + // The last access time of this metadata. + uint256 accessed; + // The creation time listed in this metadata. + uint256 created; + } + + /// A wallet with a public and private key. + struct Wallet { + // The wallet's address. + address addr; + // The wallet's public key `X`. + uint256 publicKeyX; + // The wallet's public key `Y`. + uint256 publicKeyY; + // The wallet's private key. + uint256 privateKey; + } + + /// The result of a `tryFfi` call. + struct FfiResult { + // The exit code of the call. + int32 exitCode; + // The optionally hex-decoded `stdout` data. + bytes stdout; + // The `stderr` data. + bytes stderr; + } + + /// Information on the chain and fork. + struct ChainInfo { + // The fork identifier. Set to zero if no fork is active. + uint256 forkId; + // The chain ID of the current fork. + uint256 chainId; + } + + /// Information about a blockchain. + struct Chain { + // The chain name. + string name; + // The chain's Chain ID. + uint256 chainId; + // The chain's alias. (i.e. what gets specified in `foundry.toml`). + string chainAlias; + // A default RPC endpoint for this chain. + string rpcUrl; + } + + /// The result of a `stopAndReturnStateDiff` call. + struct AccountAccess { + // The chain and fork the access occurred. + ChainInfo chainInfo; + // The kind of account access that determines what the account is. + // If kind is Call, DelegateCall, StaticCall or CallCode, then the account is the callee. + // If kind is Create, then the account is the newly created account. + // If kind is SelfDestruct, then the account is the selfdestruct recipient. + // If kind is a Resume, then account represents a account context that has resumed. + AccountAccessKind kind; + // The account that was accessed. + // It's either the account created, callee or a selfdestruct recipient for CREATE, CALL or SELFDESTRUCT. + address account; + // What accessed the account. + address accessor; + // If the account was initialized or empty prior to the access. + // An account is considered initialized if it has code, a + // non-zero nonce, or a non-zero balance. + bool initialized; + // The previous balance of the accessed account. + uint256 oldBalance; + // The potential new balance of the accessed account. + // That is, all balance changes are recorded here, even if reverts occurred. + uint256 newBalance; + // Code of the account deployed by CREATE. + bytes deployedCode; + // Value passed along with the account access + uint256 value; + // Input data provided to the CREATE or CALL + bytes data; + // If this access reverted in either the current or parent context. + bool reverted; + // An ordered list of storage accesses made during an account access operation. + StorageAccess[] storageAccesses; + // Call depth traversed during the recording of state differences + uint64 depth; + // The previous nonce of the accessed account. + uint64 oldNonce; + // The new nonce of the accessed account. + uint64 newNonce; + } + + /// The storage accessed during an `AccountAccess`. + struct StorageAccess { + // The account whose storage was accessed. + address account; + // The slot that was accessed. + bytes32 slot; + // If the access was a write. + bool isWrite; + // The previous value of the slot. + bytes32 previousValue; + // The new value of the slot. + bytes32 newValue; + // If the access was reverted. + bool reverted; + } + + /// Gas used. Returned by `lastCallGas`. + struct Gas { + // The gas limit of the call. + uint64 gasLimit; + // The total gas used. + uint64 gasTotalUsed; + // DEPRECATED: The amount of gas used for memory expansion. Ref: + uint64 gasMemoryUsed; + // The amount of gas refunded. + int64 gasRefunded; + // The amount of gas remaining. + uint64 gasRemaining; + } + + /// The result of the `stopDebugTraceRecording` call + struct DebugStep { + // The stack before executing the step of the run. + // stack\[0\] represents the top of the stack. + // and only stack data relevant to the opcode execution is contained. + uint256[] stack; + // The memory input data before executing the step of the run. + // only input data relevant to the opcode execution is contained. + // e.g. for MLOAD, it will have memory\[offset:offset+32\] copied here. + // the offset value can be get by the stack data. + bytes memoryInput; + // The opcode that was accessed. + uint8 opcode; + // The call depth of the step. + uint64 depth; + // Whether the call end up with out of gas error. + bool isOutOfGas; + // The contract address where the opcode is running + address contractAddr; + } + + /// Represents a transaction's broadcast details. + struct BroadcastTxSummary { + // The hash of the transaction that was broadcasted + bytes32 txHash; + // Represent the type of transaction among CALL, CREATE, CREATE2 + BroadcastTxType txType; + // The address of the contract that was called or created. + // This is address of the contract that is created if the txType is CREATE or CREATE2. + address contractAddress; + // The block number the transaction landed in. + uint64 blockNumber; + // Status of the transaction, retrieved from the transaction receipt. + bool success; + } + + /// Holds a signed EIP-7702 authorization for an authority account to delegate to an implementation. + struct SignedDelegation { + // The y-parity of the recovered secp256k1 signature (0 or 1). + uint8 v; + // First 32 bytes of the signature. + bytes32 r; + // Second 32 bytes of the signature. + bytes32 s; + // The current nonce of the authority account at signing time. + // Used to ensure signature can't be replayed after account nonce changes. + uint64 nonce; + // Address of the contract implementation that will be delegated to. + // Gets encoded into delegation code: 0xef0100 || implementation. + address implementation; + } + + /// Represents a "potential" revert reason from a single subsequent call when using `vm.assumeNoReverts`. + /// Reverts that match will result in a FOUNDRY::ASSUME rejection, whereas unmatched reverts will be surfaced + /// as normal. + struct PotentialRevert { + // The allowed origin of the revert opcode; address(0) allows reverts from any address + address reverter; + // When true, only matches on the beginning of the revert data, otherwise, matches on entire revert data + bool partialMatch; + // The data to use to match encountered reverts + bytes revertData; + } + + /// An EIP-2930 access list item. + struct AccessListItem { + // The address to be added in access list. + address target; + // The storage keys to be added in access list. + bytes32[] storageKeys; + } + + // ======== Crypto ======== + + /// Derives a private key from the name, labels the account with that name, and returns the wallet. + function createWallet(string calldata walletLabel) external returns (Wallet memory wallet); + + /// Generates a wallet from the private key and returns the wallet. + function createWallet(uint256 privateKey) external returns (Wallet memory wallet); + + /// Generates a wallet from the private key, labels the account with that name, and returns the wallet. + function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet); + + /// Derive a private key from a provided mnemonic string (or mnemonic file path) + /// at the derivation path `m/44'/60'/0'/0/{index}`. + function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey); + + /// Derive a private key from a provided mnemonic string (or mnemonic file path) + /// at `{derivationPath}{index}`. + function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index) + external + pure + returns (uint256 privateKey); + + /// Derive a private key from a provided mnemonic string (or mnemonic file path) in the specified language + /// at the derivation path `m/44'/60'/0'/0/{index}`. + function deriveKey(string calldata mnemonic, uint32 index, string calldata language) + external + pure + returns (uint256 privateKey); + + /// Derive a private key from a provided mnemonic string (or mnemonic file path) in the specified language + /// at `{derivationPath}{index}`. + function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index, string calldata language) + external + pure + returns (uint256 privateKey); + + /// Derives secp256r1 public key from the provided `privateKey`. + function publicKeyP256(uint256 privateKey) external pure returns (uint256 publicKeyX, uint256 publicKeyY); + + /// Adds a private key to the local forge wallet and returns the address. + function rememberKey(uint256 privateKey) external returns (address keyAddr); + + /// Derive a set number of wallets from a mnemonic at the derivation path `m/44'/60'/0'/0/{0..count}`. + /// The respective private keys are saved to the local forge wallet for later use and their addresses are returned. + function rememberKeys(string calldata mnemonic, string calldata derivationPath, uint32 count) + external + returns (address[] memory keyAddrs); + + /// Derive a set number of wallets from a mnemonic in the specified language at the derivation path `m/44'/60'/0'/0/{0..count}`. + /// The respective private keys are saved to the local forge wallet for later use and their addresses are returned. + function rememberKeys( + string calldata mnemonic, + string calldata derivationPath, + string calldata language, + uint32 count + ) external returns (address[] memory keyAddrs); + + /// Signs data with a `Wallet`. + /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the + /// signature's `s` value, and the recovery id `v` in a single bytes32. + /// This format reduces the signature size from 65 to 64 bytes. + function signCompact(Wallet calldata wallet, bytes32 digest) external returns (bytes32 r, bytes32 vs); + + /// Signs `digest` with `privateKey` using the secp256k1 curve. + /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the + /// signature's `s` value, and the recovery id `v` in a single bytes32. + /// This format reduces the signature size from 65 to 64 bytes. + function signCompact(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 vs); + + /// Signs `digest` with signer provided to script using the secp256k1 curve. + /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the + /// signature's `s` value, and the recovery id `v` in a single bytes32. + /// This format reduces the signature size from 65 to 64 bytes. + /// If `--sender` is provided, the signer with provided address is used, otherwise, + /// if exactly one signer is provided to the script, that signer is used. + /// Raises error if signer passed through `--sender` does not match any unlocked signers or + /// if `--sender` is not provided and not exactly one signer is passed to the script. + function signCompact(bytes32 digest) external pure returns (bytes32 r, bytes32 vs); + + /// Signs `digest` with signer provided to script using the secp256k1 curve. + /// Returns a compact signature (`r`, `vs`) as per EIP-2098, where `vs` encodes both the + /// signature's `s` value, and the recovery id `v` in a single bytes32. + /// This format reduces the signature size from 65 to 64 bytes. + /// Raises error if none of the signers passed into the script have provided address. + function signCompact(address signer, bytes32 digest) external pure returns (bytes32 r, bytes32 vs); + + /// Signs `digest` with `privateKey` using the secp256r1 curve. + function signP256(uint256 privateKey, bytes32 digest) external pure returns (bytes32 r, bytes32 s); + + /// Signs data with a `Wallet`. + function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s); + + /// Signs `digest` with `privateKey` using the secp256k1 curve. + function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); + + /// Signs `digest` with signer provided to script using the secp256k1 curve. + /// If `--sender` is provided, the signer with provided address is used, otherwise, + /// if exactly one signer is provided to the script, that signer is used. + /// Raises error if signer passed through `--sender` does not match any unlocked signers or + /// if `--sender` is not provided and not exactly one signer is passed to the script. + function sign(bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); + + /// Signs `digest` with signer provided to script using the secp256k1 curve. + /// Raises error if none of the signers passed into the script have provided address. + function sign(address signer, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); + + // ======== Environment ======== + + /// Gets the environment variable `name` and parses it as `address`. + /// Reverts if the variable was not found or could not be parsed. + function envAddress(string calldata name) external view returns (address value); + + /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value); + + /// Gets the environment variable `name` and parses it as `bool`. + /// Reverts if the variable was not found or could not be parsed. + function envBool(string calldata name) external view returns (bool value); + + /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value); + + /// Gets the environment variable `name` and parses it as `bytes32`. + /// Reverts if the variable was not found or could not be parsed. + function envBytes32(string calldata name) external view returns (bytes32 value); + + /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value); + + /// Gets the environment variable `name` and parses it as `bytes`. + /// Reverts if the variable was not found or could not be parsed. + function envBytes(string calldata name) external view returns (bytes memory value); + + /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value); + + /// Gets the environment variable `name` and returns true if it exists, else returns false. + function envExists(string calldata name) external view returns (bool result); + + /// Gets the environment variable `name` and parses it as `int256`. + /// Reverts if the variable was not found or could not be parsed. + function envInt(string calldata name) external view returns (int256 value); + + /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value); + + /// Gets the environment variable `name` and parses it as `bool`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, bool defaultValue) external view returns (bool value); + + /// Gets the environment variable `name` and parses it as `uint256`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, uint256 defaultValue) external view returns (uint256 value); + + /// Gets the environment variable `name` and parses it as an array of `address`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, address[] calldata defaultValue) + external + view + returns (address[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `bytes32`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue) + external + view + returns (bytes32[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, string[] calldata defaultValue) + external + view + returns (string[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `bytes`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue) + external + view + returns (bytes[] memory value); + + /// Gets the environment variable `name` and parses it as `int256`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, int256 defaultValue) external view returns (int256 value); + + /// Gets the environment variable `name` and parses it as `address`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, address defaultValue) external view returns (address value); + + /// Gets the environment variable `name` and parses it as `bytes32`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, bytes32 defaultValue) external view returns (bytes32 value); + + /// Gets the environment variable `name` and parses it as `string`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata defaultValue) external view returns (string memory value); + + /// Gets the environment variable `name` and parses it as `bytes`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, bytes calldata defaultValue) external view returns (bytes memory value); + + /// Gets the environment variable `name` and parses it as an array of `bool`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue) + external + view + returns (bool[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue) + external + view + returns (uint256[] memory value); + + /// Gets the environment variable `name` and parses it as an array of `int256`, delimited by `delim`. + /// Reverts if the variable could not be parsed. + /// Returns `defaultValue` if the variable was not found. + function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue) + external + view + returns (int256[] memory value); + + /// Gets the environment variable `name` and parses it as `string`. + /// Reverts if the variable was not found or could not be parsed. + function envString(string calldata name) external view returns (string memory value); + + /// Gets the environment variable `name` and parses it as an array of `string`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envString(string calldata name, string calldata delim) external view returns (string[] memory value); + + /// Gets the environment variable `name` and parses it as `uint256`. + /// Reverts if the variable was not found or could not be parsed. + function envUint(string calldata name) external view returns (uint256 value); + + /// Gets the environment variable `name` and parses it as an array of `uint256`, delimited by `delim`. + /// Reverts if the variable was not found or could not be parsed. + function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value); + + /// Returns true if `forge` command was executed in given context. + function isContext(ForgeContext context) external view returns (bool result); + + /// Resolves the env variable placeholders of a given input string. + function resolveEnv(string calldata input) external returns (string memory); + + /// Sets environment variables. + function setEnv(string calldata name, string calldata value) external; + + // ======== EVM ======== + + /// Gets all accessed reads and write slot from a `vm.record` session, for a given address. + function accesses(address target) external view returns (bytes32[] memory readSlots, bytes32[] memory writeSlots); + + /// Gets the address for a given private key. + function addr(uint256 privateKey) external pure returns (address keyAddr); + + /// Gets all the logs according to specified filter. + function eth_getLogs(uint256 fromBlock, uint256 toBlock, address target, bytes32[] calldata topics) + external + view + returns (EthGetLogs[] memory logs); + + /// Gets the current `block.blobbasefee`. + /// You should use this instead of `block.blobbasefee` if you use `vm.blobBaseFee`, as `block.blobbasefee` is assumed to be constant across a transaction, + /// and as a result will get optimized out by the compiler. + /// See https://github.com/foundry-rs/foundry/issues/6180 + function getBlobBaseFee() external view returns (uint256 blobBaseFee); + + /// Gets the current `block.number`. + /// You should use this instead of `block.number` if you use `vm.roll`, as `block.number` is assumed to be constant across a transaction, + /// and as a result will get optimized out by the compiler. + /// See https://github.com/foundry-rs/foundry/issues/6180 + function getBlockNumber() external view returns (uint256 height); + + /// Gets the current `block.timestamp`. + /// You should use this instead of `block.timestamp` if you use `vm.warp`, as `block.timestamp` is assumed to be constant across a transaction, + /// and as a result will get optimized out by the compiler. + /// See https://github.com/foundry-rs/foundry/issues/6180 + function getBlockTimestamp() external view returns (uint256 timestamp); + + /// Gets the current `block.chainid` of the currently selected environment. + /// You should use this instead of `block.chainid` if you use `vm.selectFork` or `vm.createSelectFork`, as `block.chainid` could be assumed + /// to be constant across a transaction, and as a result will get optimized out by the compiler. + /// See https://github.com/foundry-rs/foundry/issues/6180 + function getChainId() external view returns (uint256 blockChainId); + + /// Gets the map key and parent of a mapping at a given slot, for a given address. + function getMappingKeyAndParentOf(address target, bytes32 elementSlot) + external + view + returns (bool found, bytes32 key, bytes32 parent); + + /// Gets the number of elements in the mapping at the given slot, for a given address. + function getMappingLength(address target, bytes32 mappingSlot) external view returns (uint256 length); + + /// Gets the elements at index idx of the mapping at the given slot, for a given address. The + /// index must be less than the length of the mapping (i.e. the number of keys in the mapping). + function getMappingSlotAt(address target, bytes32 mappingSlot, uint256 idx) external view returns (bytes32 value); + + /// Gets the nonce of an account. + function getNonce(address account) external view returns (uint64 nonce); + + /// Get the nonce of a `Wallet`. + function getNonce(Wallet calldata wallet) external view returns (uint64 nonce); + + /// Gets the RLP encoded block header for a given block number. + /// Returns the block header in the same format as `cast block --raw`. + function getRawBlockHeader(uint256 blockNumber) external view returns (bytes memory rlpHeader); + + /// Gets all the recorded logs. + function getRecordedLogs() external view returns (Log[] memory logs); + + /// Returns state diffs from current `vm.startStateDiffRecording` session. + function getStateDiff() external view returns (string memory diff); + + /// Returns state diffs from current `vm.startStateDiffRecording` session, in json format. + function getStateDiffJson() external view returns (string memory diff); + + /// Returns an array of `StorageAccess` from current `vm.stateStateDiffRecording` session + function getStorageAccesses() external view returns (StorageAccess[] memory storageAccesses); + + /// Gets the gas used in the last call from the callee perspective. + function lastCallGas() external view returns (Gas memory gas); + + /// Loads a storage slot from an address. + function load(address target, bytes32 slot) external view returns (bytes32 data); + + /// Pauses gas metering (i.e. gas usage is not counted). Noop if already paused. + function pauseGasMetering() external; + + /// Records all storage reads and writes. Use `accesses` to get the recorded data. + /// Subsequent calls to `record` will clear the previous data. + function record() external; + + /// Record all the transaction logs. + function recordLogs() external; + + /// Reset gas metering (i.e. gas usage is set to gas limit). + function resetGasMetering() external; + + /// Resumes gas metering (i.e. gas usage is counted again). Noop if already on. + function resumeGasMetering() external; + + /// Performs an Ethereum JSON-RPC request to the current fork URL. + function rpc(string calldata method, string calldata params) external returns (bytes memory data); + + /// Performs an Ethereum JSON-RPC request to the given endpoint. + function rpc(string calldata urlOrAlias, string calldata method, string calldata params) + external + returns (bytes memory data); + + /// Records the debug trace during the run. + function startDebugTraceRecording() external; + + /// Starts recording all map SSTOREs for later retrieval. + function startMappingRecording() external; + + /// Record all account accesses as part of CREATE, CALL or SELFDESTRUCT opcodes in order, + /// along with the context of the calls + function startStateDiffRecording() external; + + /// Stop debug trace recording and returns the recorded debug trace. + function stopAndReturnDebugTraceRecording() external returns (DebugStep[] memory step); + + /// Returns an ordered array of all account accesses from a `vm.startStateDiffRecording` session. + function stopAndReturnStateDiff() external returns (AccountAccess[] memory accountAccesses); + + /// Stops recording all map SSTOREs for later retrieval and clears the recorded data. + function stopMappingRecording() external; + + /// Stops recording storage reads and writes. + function stopRecord() external; + + // ======== Filesystem ======== + + /// Closes file for reading, resetting the offset and allowing to read it from beginning with readLine. + /// `path` is relative to the project root. + function closeFile(string calldata path) external; + + /// Copies the contents of one file to another. This function will **overwrite** the contents of `to`. + /// On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`. + /// Both `from` and `to` are relative to the project root. + function copyFile(string calldata from, string calldata to) external returns (uint64 copied); + + /// Creates a new, empty directory at the provided path. + /// This cheatcode will revert in the following situations, but is not limited to just these cases: + /// - User lacks permissions to modify `path`. + /// - A parent of the given path doesn't exist and `recursive` is false. + /// - `path` already exists and `recursive` is false. + /// `path` is relative to the project root. + function createDir(string calldata path, bool recursive) external; + + /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + function deployCode(string calldata artifactPath) external returns (address deployedAddress); + + /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + /// Additionally accepts abi-encoded constructor arguments. + function deployCode(string calldata artifactPath, bytes calldata constructorArgs) + external + returns (address deployedAddress); + + /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + /// Additionally accepts `msg.value`. + function deployCode(string calldata artifactPath, uint256 value) external returns (address deployedAddress); + + /// Deploys a contract from an artifact file. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + /// Additionally accepts abi-encoded constructor arguments and `msg.value`. + function deployCode(string calldata artifactPath, bytes calldata constructorArgs, uint256 value) + external + returns (address deployedAddress); + + /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + function deployCode(string calldata artifactPath, bytes32 salt) external returns (address deployedAddress); + + /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + /// Additionally accepts abi-encoded constructor arguments. + function deployCode(string calldata artifactPath, bytes calldata constructorArgs, bytes32 salt) + external + returns (address deployedAddress); + + /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + /// Additionally accepts `msg.value`. + function deployCode(string calldata artifactPath, uint256 value, bytes32 salt) + external + returns (address deployedAddress); + + /// Deploys a contract from an artifact file, using the CREATE2 salt. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + /// Additionally accepts abi-encoded constructor arguments and `msg.value`. + function deployCode(string calldata artifactPath, bytes calldata constructorArgs, uint256 value, bytes32 salt) + external + returns (address deployedAddress); + + /// Returns true if the given path points to an existing entity, else returns false. + function exists(string calldata path) external view returns (bool result); + + /// Performs a foreign function call via the terminal. + function ffi(string[] calldata commandInput) external returns (bytes memory result); + + /// Given a path, query the file system to get information about a file, directory, etc. + function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata); + + /// Gets the artifact path from code (aka. creation code). + function getArtifactPathByCode(bytes calldata code) external view returns (string memory path); + + /// Gets the artifact path from deployed code (aka. runtime code). + function getArtifactPathByDeployedCode(bytes calldata deployedCode) external view returns (string memory path); + + /// Returns the most recent broadcast for the given contract on `chainId` matching `txType`. + /// For example: + /// The most recent deployment can be fetched by passing `txType` as `CREATE` or `CREATE2`. + /// The most recent call can be fetched by passing `txType` as `CALL`. + function getBroadcast(string calldata contractName, uint64 chainId, BroadcastTxType txType) + external + view + returns (BroadcastTxSummary memory); + + /// Returns all broadcasts for the given contract on `chainId` with the specified `txType`. + /// Sorted such that the most recent broadcast is the first element, and the oldest is the last. i.e descending order of BroadcastTxSummary.blockNumber. + function getBroadcasts(string calldata contractName, uint64 chainId, BroadcastTxType txType) + external + view + returns (BroadcastTxSummary[] memory); + + /// Returns all broadcasts for the given contract on `chainId`. + /// Sorted such that the most recent broadcast is the first element, and the oldest is the last. i.e descending order of BroadcastTxSummary.blockNumber. + function getBroadcasts(string calldata contractName, uint64 chainId) + external + view + returns (BroadcastTxSummary[] memory); + + /// Gets the creation bytecode from an artifact file. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode); + + /// Gets the deployed bytecode from an artifact file. Takes in the relative path to the json file or the path to the + /// artifact in the form of :: where and parts are optional. + function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode); + + /// Returns the most recent deployment for the current `chainId`. + function getDeployment(string calldata contractName) external view returns (address deployedAddress); + + /// Returns the most recent deployment for the given contract on `chainId` + function getDeployment(string calldata contractName, uint64 chainId) + external + view + returns (address deployedAddress); + + /// Returns all deployments for the given contract on `chainId` + /// Sorted in descending order of deployment time i.e descending order of BroadcastTxSummary.blockNumber. + /// The most recent deployment is the first element, and the oldest is the last. + function getDeployments(string calldata contractName, uint64 chainId) + external + view + returns (address[] memory deployedAddresses); + + /// Returns true if the path exists on disk and is pointing at a directory, else returns false. + function isDir(string calldata path) external view returns (bool result); + + /// Returns true if the path exists on disk and is pointing at a regular file, else returns false. + function isFile(string calldata path) external view returns (bool result); + + /// Get the path of the current project root. + function projectRoot() external view returns (string memory path); + + /// Prompts the user for a string value in the terminal. + function prompt(string calldata promptText) external returns (string memory input); + + /// Prompts the user for an address in the terminal. + function promptAddress(string calldata promptText) external returns (address); + + /// Prompts the user for a hidden string value in the terminal. + function promptSecret(string calldata promptText) external returns (string memory input); + + /// Prompts the user for hidden uint256 in the terminal (usually pk). + function promptSecretUint(string calldata promptText) external returns (uint256); + + /// Prompts the user for uint256 in the terminal. + function promptUint(string calldata promptText) external returns (uint256); + + /// Reads the directory at the given path recursively, up to `maxDepth`. + /// `maxDepth` defaults to 1, meaning only the direct children of the given directory will be returned. + /// Follows symbolic links if `followLinks` is true. + function readDir(string calldata path) external view returns (DirEntry[] memory entries); + + /// See `readDir(string)`. + function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries); + + /// See `readDir(string)`. + function readDir(string calldata path, uint64 maxDepth, bool followLinks) + external + view + returns (DirEntry[] memory entries); + + /// Reads the entire content of file to string. `path` is relative to the project root. + function readFile(string calldata path) external view returns (string memory data); + + /// Reads the entire content of file as binary. `path` is relative to the project root. + function readFileBinary(string calldata path) external view returns (bytes memory data); + + /// Reads next line of file to string. + function readLine(string calldata path) external view returns (string memory line); + + /// Reads a symbolic link, returning the path that the link points to. + /// This cheatcode will revert in the following situations, but is not limited to just these cases: + /// - `path` is not a symbolic link. + /// - `path` does not exist. + function readLink(string calldata linkPath) external view returns (string memory targetPath); + + /// Removes a directory at the provided path. + /// This cheatcode will revert in the following situations, but is not limited to just these cases: + /// - `path` doesn't exist. + /// - `path` isn't a directory. + /// - User lacks permissions to modify `path`. + /// - The directory is not empty and `recursive` is false. + /// `path` is relative to the project root. + function removeDir(string calldata path, bool recursive) external; + + /// Removes a file from the filesystem. + /// This cheatcode will revert in the following situations, but is not limited to just these cases: + /// - `path` points to a directory. + /// - The file doesn't exist. + /// - The user lacks permissions to remove the file. + /// `path` is relative to the project root. + function removeFile(string calldata path) external; + + /// Performs a foreign function call via terminal and returns the exit code, stdout, and stderr. + function tryFfi(string[] calldata commandInput) external returns (FfiResult memory result); + + /// Returns the time since unix epoch in milliseconds. + function unixTime() external view returns (uint256 milliseconds); + + /// Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does. + /// `path` is relative to the project root. + function writeFile(string calldata path, string calldata data) external; + + /// Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does. + /// `path` is relative to the project root. + function writeFileBinary(string calldata path, bytes calldata data) external; + + /// Writes line to file, creating a file if it does not exist. + /// `path` is relative to the project root. + function writeLine(string calldata path, string calldata data) external; + + // ======== JSON ======== + + /// Checks if `key` exists in a JSON object. + function keyExistsJson(string calldata json, string calldata key) external view returns (bool); + + /// Parses a string of JSON data at `key` and coerces it to `address`. + function parseJsonAddress(string calldata json, string calldata key) external pure returns (address); + + /// Parses a string of JSON data at `key` and coerces it to `address[]`. + function parseJsonAddressArray(string calldata json, string calldata key) + external + pure + returns (address[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `bool`. + function parseJsonBool(string calldata json, string calldata key) external pure returns (bool); + + /// Parses a string of JSON data at `key` and coerces it to `bool[]`. + function parseJsonBoolArray(string calldata json, string calldata key) external pure returns (bool[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `bytes`. + function parseJsonBytes(string calldata json, string calldata key) external pure returns (bytes memory); + + /// Parses a string of JSON data at `key` and coerces it to `bytes32`. + function parseJsonBytes32(string calldata json, string calldata key) external pure returns (bytes32); + + /// Parses a string of JSON data at `key` and coerces it to `bytes32[]`. + function parseJsonBytes32Array(string calldata json, string calldata key) + external + pure + returns (bytes32[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `bytes[]`. + function parseJsonBytesArray(string calldata json, string calldata key) external pure returns (bytes[] memory); + + /// Parses a string of JSON data at `key` and coerces it to `int256`. + function parseJsonInt(string calldata json, string calldata key) external pure returns (int256); + + /// Parses a string of JSON data at `key` and coerces it to `int256[]`. + function parseJsonIntArray(string calldata json, string calldata key) external pure returns (int256[] memory); + + /// Returns an array of all the keys in a JSON object. + function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys); + + /// Parses a string of JSON data at `key` and coerces it to `string`. + function parseJsonString(string calldata json, string calldata key) external pure returns (string memory); + + /// Parses a string of JSON data at `key` and coerces it to `string[]`. + function parseJsonStringArray(string calldata json, string calldata key) external pure returns (string[] memory); + + /// Parses a string of JSON data at `key` and coerces it to type array corresponding to `typeDescription`. + function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription) + external + pure + returns (bytes memory); + + /// Parses a string of JSON data and coerces it to type corresponding to `typeDescription`. + function parseJsonType(string calldata json, string calldata typeDescription) + external + pure + returns (bytes memory); + + /// Parses a string of JSON data at `key` and coerces it to type corresponding to `typeDescription`. + function parseJsonType(string calldata json, string calldata key, string calldata typeDescription) + external + pure + returns (bytes memory); + + /// Parses a string of JSON data at `key` and coerces it to `uint256`. + function parseJsonUint(string calldata json, string calldata key) external pure returns (uint256); + + /// Parses a string of JSON data at `key` and coerces it to `uint256[]`. + function parseJsonUintArray(string calldata json, string calldata key) external pure returns (uint256[] memory); + + /// ABI-encodes a JSON object. + function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData); + + /// ABI-encodes a JSON object at `key`. + function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData); + + /// See `serializeJson`. + function serializeAddress(string calldata objectKey, string calldata valueKey, address value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBool(string calldata objectKey, string calldata valueKey, bool value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeInt(string calldata objectKey, string calldata valueKey, int256 value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values) + external + returns (string memory json); + + /// Serializes a key and value to a JSON object stored in-memory that can be later written to a file. + /// Returns the stringified version of the specific JSON file up to that moment. + function serializeJson(string calldata objectKey, string calldata value) external returns (string memory json); + + /// See `serializeJson`. + function serializeJsonType(string calldata typeDescription, bytes calldata value) + external + pure + returns (string memory json); + + /// See `serializeJson`. + function serializeJsonType( + string calldata objectKey, + string calldata valueKey, + string calldata typeDescription, + bytes calldata value + ) external returns (string memory json); + + /// See `serializeJson`. + function serializeString(string calldata objectKey, string calldata valueKey, string calldata value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeUintToHex(string calldata objectKey, string calldata valueKey, uint256 value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value) + external + returns (string memory json); + + /// See `serializeJson`. + function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values) + external + returns (string memory json); + + /// Write a serialized JSON object to a file. If the file exists, it will be overwritten. + function writeJson(string calldata json, string calldata path) external; + + /// Write a serialized JSON object to an **existing** JSON file, replacing a value with key = + /// This is useful to replace a specific value of a JSON file, without having to parse the entire thing. + /// This cheatcode will create new keys if they didn't previously exist. + function writeJson(string calldata json, string calldata path, string calldata valueKey) external; + + /// Checks if `key` exists in a JSON object + /// `keyExists` is being deprecated in favor of `keyExistsJson`. It will be removed in future versions. + function keyExists(string calldata json, string calldata key) external view returns (bool); + + // ======== Scripting ======== + + /// Attach an EIP-4844 blob to the next call + function attachBlob(bytes calldata blob) external; + + /// Designate the next call as an EIP-7702 transaction + function attachDelegation(SignedDelegation calldata signedDelegation) external; + + /// Designate the next call as an EIP-7702 transaction, with optional cross-chain validity. + function attachDelegation(SignedDelegation calldata signedDelegation, bool crossChain) external; + + /// Takes a signed transaction and broadcasts it to the network. + function broadcastRawTransaction(bytes calldata data) external; + + /// Has the next call (at this call depth only) create transactions that can later be signed and sent onchain. + /// Broadcasting address is determined by checking the following in order: + /// 1. If `--sender` argument was provided, that address is used. + /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. + /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. + function broadcast() external; + + /// Has the next call (at this call depth only) create a transaction with the address provided + /// as the sender that can later be signed and sent onchain. + function broadcast(address signer) external; + + /// Has the next call (at this call depth only) create a transaction with the private key + /// provided as the sender that can later be signed and sent onchain. + function broadcast(uint256 privateKey) external; + + /// Returns addresses of available unlocked wallets in the script environment. + function getWallets() external view returns (address[] memory wallets); + + /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction + function signAndAttachDelegation(address implementation, uint256 privateKey) + external + returns (SignedDelegation memory signedDelegation); + + /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction for specific nonce + function signAndAttachDelegation(address implementation, uint256 privateKey, uint64 nonce) + external + returns (SignedDelegation memory signedDelegation); + + /// Sign an EIP-7702 authorization and designate the next call as an EIP-7702 transaction, with optional cross-chain validity. + function signAndAttachDelegation(address implementation, uint256 privateKey, bool crossChain) + external + returns (SignedDelegation memory signedDelegation); + + /// Sign an EIP-7702 authorization for delegation + function signDelegation(address implementation, uint256 privateKey) + external + returns (SignedDelegation memory signedDelegation); + + /// Sign an EIP-7702 authorization for delegation for specific nonce + function signDelegation(address implementation, uint256 privateKey, uint64 nonce) + external + returns (SignedDelegation memory signedDelegation); + + /// Sign an EIP-7702 authorization for delegation, with optional cross-chain validity. + function signDelegation(address implementation, uint256 privateKey, bool crossChain) + external + returns (SignedDelegation memory signedDelegation); + + /// Has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain. + /// Broadcasting address is determined by checking the following in order: + /// 1. If `--sender` argument was provided, that address is used. + /// 2. If exactly one signer (e.g. private key, hw wallet, keystore) is set when `forge broadcast` is invoked, that signer is used. + /// 3. Otherwise, default foundry sender (1804c8AB1F12E6bbf3894d4083f33e07309d1f38) is used. + function startBroadcast() external; + + /// Has all subsequent calls (at this call depth only) create transactions with the address + /// provided that can later be signed and sent onchain. + function startBroadcast(address signer) external; + + /// Has all subsequent calls (at this call depth only) create transactions with the private key + /// provided that can later be signed and sent onchain. + function startBroadcast(uint256 privateKey) external; + + /// Stops collecting onchain transactions. + function stopBroadcast() external; + + // ======== String ======== + + /// Returns true if `search` is found in `subject`, false otherwise. + function contains(string calldata subject, string calldata search) external pure returns (bool result); + + /// Returns the index of the first occurrence of a `key` in an `input` string. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `key` is not found. + /// Returns 0 in case of an empty `key`. + function indexOf(string calldata input, string calldata key) external pure returns (uint256); + + /// Parses the given `string` into an `address`. + function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue); + + /// Parses the given `string` into a `bool`. + function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue); + + /// Parses the given `string` into `bytes`. + function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue); + + /// Parses the given `string` into a `bytes32`. + function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue); + + /// Parses the given `string` into a `int256`. + function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue); + + /// Parses the given `string` into a `uint256`. + function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue); + + /// Replaces occurrences of `from` in the given `string` with `to`. + function replace(string calldata input, string calldata from, string calldata to) + external + pure + returns (string memory output); + + /// Splits the given `string` into an array of strings divided by the `delimiter`. + function split(string calldata input, string calldata delimiter) external pure returns (string[] memory outputs); + + /// Converts the given `string` value to Lowercase. + function toLowercase(string calldata input) external pure returns (string memory output); + + /// Converts the given value to a `string`. + function toString(address value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(bytes calldata value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(bytes32 value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(bool value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(uint256 value) external pure returns (string memory stringifiedValue); + + /// Converts the given value to a `string`. + function toString(int256 value) external pure returns (string memory stringifiedValue); + + /// Converts the given `string` value to Uppercase. + function toUppercase(string calldata input) external pure returns (string memory output); + + /// Trims leading and trailing whitespace from the given `string` value. + function trim(string calldata input) external pure returns (string memory output); + + // ======== Testing ======== + + /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. + /// Formats values with decimals in failure message. + function assertApproxEqAbsDecimal(uint256 left, uint256 right, uint256 maxDelta, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertApproxEqAbsDecimal( + uint256 left, + uint256 right, + uint256 maxDelta, + uint256 decimals, + string calldata error + ) external pure; + + /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. + /// Formats values with decimals in failure message. + function assertApproxEqAbsDecimal(int256 left, int256 right, uint256 maxDelta, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertApproxEqAbsDecimal( + int256 left, + int256 right, + uint256 maxDelta, + uint256 decimals, + string calldata error + ) external pure; + + /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta) external pure; + + /// Compares two `uint256` values. Expects difference to be less than or equal to `maxDelta`. + /// Includes error message into revert string on failure. + function assertApproxEqAbs(uint256 left, uint256 right, uint256 maxDelta, string calldata error) external pure; + + /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta) external pure; + + /// Compares two `int256` values. Expects difference to be less than or equal to `maxDelta`. + /// Includes error message into revert string on failure. + function assertApproxEqAbs(int256 left, int256 right, uint256 maxDelta, string calldata error) external pure; + + /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Formats values with decimals in failure message. + function assertApproxEqRelDecimal(uint256 left, uint256 right, uint256 maxPercentDelta, uint256 decimals) + external + pure; + + /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertApproxEqRelDecimal( + uint256 left, + uint256 right, + uint256 maxPercentDelta, + uint256 decimals, + string calldata error + ) external pure; + + /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Formats values with decimals in failure message. + function assertApproxEqRelDecimal(int256 left, int256 right, uint256 maxPercentDelta, uint256 decimals) + external + pure; + + /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertApproxEqRelDecimal( + int256 left, + int256 right, + uint256 maxPercentDelta, + uint256 decimals, + string calldata error + ) external pure; + + /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta) external pure; + + /// Compares two `uint256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Includes error message into revert string on failure. + function assertApproxEqRel(uint256 left, uint256 right, uint256 maxPercentDelta, string calldata error) + external + pure; + + /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta) external pure; + + /// Compares two `int256` values. Expects relative difference in percents to be less than or equal to `maxPercentDelta`. + /// `maxPercentDelta` is an 18 decimal fixed point number, where 1e18 == 100% + /// Includes error message into revert string on failure. + function assertApproxEqRel(int256 left, int256 right, uint256 maxPercentDelta, string calldata error) + external + pure; + + /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Asserts that two `uint256` values are equal, formatting them with decimals in failure message. + /// Includes error message into revert string on failure. + function assertEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. + function assertEqDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Asserts that two `int256` values are equal, formatting them with decimals in failure message. + /// Includes error message into revert string on failure. + function assertEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Asserts that two `bool` values are equal. + function assertEq(bool left, bool right) external pure; + + /// Asserts that two `bool` values are equal and includes error message into revert string on failure. + function assertEq(bool left, bool right, string calldata error) external pure; + + /// Asserts that two `string` values are equal. + function assertEq(string calldata left, string calldata right) external pure; + + /// Asserts that two `string` values are equal and includes error message into revert string on failure. + function assertEq(string calldata left, string calldata right, string calldata error) external pure; + + /// Asserts that two `bytes` values are equal. + function assertEq(bytes calldata left, bytes calldata right) external pure; + + /// Asserts that two `bytes` values are equal and includes error message into revert string on failure. + function assertEq(bytes calldata left, bytes calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bool` values are equal. + function assertEq(bool[] calldata left, bool[] calldata right) external pure; + + /// Asserts that two arrays of `bool` values are equal and includes error message into revert string on failure. + function assertEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `uint256 values are equal. + function assertEq(uint256[] calldata left, uint256[] calldata right) external pure; + + /// Asserts that two arrays of `uint256` values are equal and includes error message into revert string on failure. + function assertEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `int256` values are equal. + function assertEq(int256[] calldata left, int256[] calldata right) external pure; + + /// Asserts that two arrays of `int256` values are equal and includes error message into revert string on failure. + function assertEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; + + /// Asserts that two `uint256` values are equal. + function assertEq(uint256 left, uint256 right) external pure; + + /// Asserts that two arrays of `address` values are equal. + function assertEq(address[] calldata left, address[] calldata right) external pure; + + /// Asserts that two arrays of `address` values are equal and includes error message into revert string on failure. + function assertEq(address[] calldata left, address[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bytes32` values are equal. + function assertEq(bytes32[] calldata left, bytes32[] calldata right) external pure; + + /// Asserts that two arrays of `bytes32` values are equal and includes error message into revert string on failure. + function assertEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `string` values are equal. + function assertEq(string[] calldata left, string[] calldata right) external pure; + + /// Asserts that two arrays of `string` values are equal and includes error message into revert string on failure. + function assertEq(string[] calldata left, string[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bytes` values are equal. + function assertEq(bytes[] calldata left, bytes[] calldata right) external pure; + + /// Asserts that two arrays of `bytes` values are equal and includes error message into revert string on failure. + function assertEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; + + /// Asserts that two `uint256` values are equal and includes error message into revert string on failure. + function assertEq(uint256 left, uint256 right, string calldata error) external pure; + + /// Asserts that two `int256` values are equal. + function assertEq(int256 left, int256 right) external pure; + + /// Asserts that two `int256` values are equal and includes error message into revert string on failure. + function assertEq(int256 left, int256 right, string calldata error) external pure; + + /// Asserts that two `address` values are equal. + function assertEq(address left, address right) external pure; + + /// Asserts that two `address` values are equal and includes error message into revert string on failure. + function assertEq(address left, address right, string calldata error) external pure; + + /// Asserts that two `bytes32` values are equal. + function assertEq(bytes32 left, bytes32 right) external pure; + + /// Asserts that two `bytes32` values are equal and includes error message into revert string on failure. + function assertEq(bytes32 left, bytes32 right, string calldata error) external pure; + + /// Asserts that the given condition is false. + function assertFalse(bool condition) external pure; + + /// Asserts that the given condition is false and includes error message into revert string on failure. + function assertFalse(bool condition, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than or equal to second. + /// Formats values with decimals in failure message. + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than or equal to second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertGeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be greater than or equal to second. + /// Formats values with decimals in failure message. + function assertGeDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects first value to be greater than or equal to second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertGeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than or equal to second. + function assertGe(uint256 left, uint256 right) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than or equal to second. + /// Includes error message into revert string on failure. + function assertGe(uint256 left, uint256 right, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be greater than or equal to second. + function assertGe(int256 left, int256 right) external pure; + + /// Compares two `int256` values. Expects first value to be greater than or equal to second. + /// Includes error message into revert string on failure. + function assertGe(int256 left, int256 right, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than second. + /// Formats values with decimals in failure message. + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertGtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be greater than second. + /// Formats values with decimals in failure message. + function assertGtDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects first value to be greater than second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertGtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than second. + function assertGt(uint256 left, uint256 right) external pure; + + /// Compares two `uint256` values. Expects first value to be greater than second. + /// Includes error message into revert string on failure. + function assertGt(uint256 left, uint256 right, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be greater than second. + function assertGt(int256 left, int256 right) external pure; + + /// Compares two `int256` values. Expects first value to be greater than second. + /// Includes error message into revert string on failure. + function assertGt(int256 left, int256 right, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be less than or equal to second. + /// Formats values with decimals in failure message. + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects first value to be less than or equal to second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertLeDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be less than or equal to second. + /// Formats values with decimals in failure message. + function assertLeDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects first value to be less than or equal to second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertLeDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be less than or equal to second. + function assertLe(uint256 left, uint256 right) external pure; + + /// Compares two `uint256` values. Expects first value to be less than or equal to second. + /// Includes error message into revert string on failure. + function assertLe(uint256 left, uint256 right, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be less than or equal to second. + function assertLe(int256 left, int256 right) external pure; + + /// Compares two `int256` values. Expects first value to be less than or equal to second. + /// Includes error message into revert string on failure. + function assertLe(int256 left, int256 right, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be less than second. + /// Formats values with decimals in failure message. + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Compares two `uint256` values. Expects first value to be less than second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertLtDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be less than second. + /// Formats values with decimals in failure message. + function assertLtDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Compares two `int256` values. Expects first value to be less than second. + /// Formats values with decimals in failure message. Includes error message into revert string on failure. + function assertLtDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Compares two `uint256` values. Expects first value to be less than second. + function assertLt(uint256 left, uint256 right) external pure; + + /// Compares two `uint256` values. Expects first value to be less than second. + /// Includes error message into revert string on failure. + function assertLt(uint256 left, uint256 right, string calldata error) external pure; + + /// Compares two `int256` values. Expects first value to be less than second. + function assertLt(int256 left, int256 right) external pure; + + /// Compares two `int256` values. Expects first value to be less than second. + /// Includes error message into revert string on failure. + function assertLt(int256 left, int256 right, string calldata error) external pure; + + /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals) external pure; + + /// Asserts that two `uint256` values are not equal, formatting them with decimals in failure message. + /// Includes error message into revert string on failure. + function assertNotEqDecimal(uint256 left, uint256 right, uint256 decimals, string calldata error) external pure; + + /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals) external pure; + + /// Asserts that two `int256` values are not equal, formatting them with decimals in failure message. + /// Includes error message into revert string on failure. + function assertNotEqDecimal(int256 left, int256 right, uint256 decimals, string calldata error) external pure; + + /// Asserts that two `bool` values are not equal. + function assertNotEq(bool left, bool right) external pure; + + /// Asserts that two `bool` values are not equal and includes error message into revert string on failure. + function assertNotEq(bool left, bool right, string calldata error) external pure; + + /// Asserts that two `string` values are not equal. + function assertNotEq(string calldata left, string calldata right) external pure; + + /// Asserts that two `string` values are not equal and includes error message into revert string on failure. + function assertNotEq(string calldata left, string calldata right, string calldata error) external pure; + + /// Asserts that two `bytes` values are not equal. + function assertNotEq(bytes calldata left, bytes calldata right) external pure; + + /// Asserts that two `bytes` values are not equal and includes error message into revert string on failure. + function assertNotEq(bytes calldata left, bytes calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bool` values are not equal. + function assertNotEq(bool[] calldata left, bool[] calldata right) external pure; + + /// Asserts that two arrays of `bool` values are not equal and includes error message into revert string on failure. + function assertNotEq(bool[] calldata left, bool[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `uint256` values are not equal. + function assertNotEq(uint256[] calldata left, uint256[] calldata right) external pure; + + /// Asserts that two arrays of `uint256` values are not equal and includes error message into revert string on failure. + function assertNotEq(uint256[] calldata left, uint256[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `int256` values are not equal. + function assertNotEq(int256[] calldata left, int256[] calldata right) external pure; + + /// Asserts that two arrays of `int256` values are not equal and includes error message into revert string on failure. + function assertNotEq(int256[] calldata left, int256[] calldata right, string calldata error) external pure; + + /// Asserts that two `uint256` values are not equal. + function assertNotEq(uint256 left, uint256 right) external pure; + + /// Asserts that two arrays of `address` values are not equal. + function assertNotEq(address[] calldata left, address[] calldata right) external pure; + + /// Asserts that two arrays of `address` values are not equal and includes error message into revert string on failure. + function assertNotEq(address[] calldata left, address[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bytes32` values are not equal. + function assertNotEq(bytes32[] calldata left, bytes32[] calldata right) external pure; + + /// Asserts that two arrays of `bytes32` values are not equal and includes error message into revert string on failure. + function assertNotEq(bytes32[] calldata left, bytes32[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `string` values are not equal. + function assertNotEq(string[] calldata left, string[] calldata right) external pure; + + /// Asserts that two arrays of `string` values are not equal and includes error message into revert string on failure. + function assertNotEq(string[] calldata left, string[] calldata right, string calldata error) external pure; + + /// Asserts that two arrays of `bytes` values are not equal. + function assertNotEq(bytes[] calldata left, bytes[] calldata right) external pure; + + /// Asserts that two arrays of `bytes` values are not equal and includes error message into revert string on failure. + function assertNotEq(bytes[] calldata left, bytes[] calldata right, string calldata error) external pure; + + /// Asserts that two `uint256` values are not equal and includes error message into revert string on failure. + function assertNotEq(uint256 left, uint256 right, string calldata error) external pure; + + /// Asserts that two `int256` values are not equal. + function assertNotEq(int256 left, int256 right) external pure; + + /// Asserts that two `int256` values are not equal and includes error message into revert string on failure. + function assertNotEq(int256 left, int256 right, string calldata error) external pure; + + /// Asserts that two `address` values are not equal. + function assertNotEq(address left, address right) external pure; + + /// Asserts that two `address` values are not equal and includes error message into revert string on failure. + function assertNotEq(address left, address right, string calldata error) external pure; + + /// Asserts that two `bytes32` values are not equal. + function assertNotEq(bytes32 left, bytes32 right) external pure; + + /// Asserts that two `bytes32` values are not equal and includes error message into revert string on failure. + function assertNotEq(bytes32 left, bytes32 right, string calldata error) external pure; + + /// Asserts that the given condition is true. + function assertTrue(bool condition) external pure; + + /// Asserts that the given condition is true and includes error message into revert string on failure. + function assertTrue(bool condition, string calldata error) external pure; + + /// If the condition is false, discard this run's fuzz inputs and generate new ones. + function assume(bool condition) external pure; + + /// Discard this run's fuzz inputs and generate new ones if next call reverted. + function assumeNoRevert() external pure; + + /// Discard this run's fuzz inputs and generate new ones if next call reverts with the potential revert parameters. + function assumeNoRevert(PotentialRevert calldata potentialRevert) external pure; + + /// Discard this run's fuzz inputs and generate new ones if next call reverts with the any of the potential revert parameters. + function assumeNoRevert(PotentialRevert[] calldata potentialReverts) external pure; + + /// Writes a breakpoint to jump to in the debugger. + function breakpoint(string calldata char) external pure; + + /// Writes a conditional breakpoint to jump to in the debugger. + function breakpoint(string calldata char, bool value) external pure; + + /// Returns true if the current Foundry version is greater than or equal to the given version. + /// The given version string must be in the format `major.minor.patch`. + /// This is equivalent to `foundryVersionCmp(version) >= 0`. + function foundryVersionAtLeast(string calldata version) external view returns (bool); + + /// Compares the current Foundry version with the given version string. + /// The given version string must be in the format `major.minor.patch`. + /// Returns: + /// -1 if current Foundry version is less than the given version + /// 0 if current Foundry version equals the given version + /// 1 if current Foundry version is greater than the given version + /// This result can then be used with a comparison operator against `0`. + /// For example, to check if the current Foundry version is greater than or equal to `1.0.0`: + /// `if (foundryVersionCmp("1.0.0") >= 0) { ... }` + function foundryVersionCmp(string calldata version) external view returns (int256); + + /// Returns a Chain struct for specific alias + function getChain(string calldata chainAlias) external view returns (Chain memory chain); + + /// Returns a Chain struct for specific chainId + function getChain(uint256 chainId) external view returns (Chain memory chain); + + /// Returns the Foundry version. + /// Format: -+.. + /// Sample output: 0.3.0-nightly+3cb96bde9b.1737036656.debug + /// Note: Build timestamps may vary slightly across platforms due to separate CI jobs. + /// For reliable version comparisons, use UNIX format (e.g., >= 1700000000) + /// to compare timestamps while ignoring minor time differences. + function getFoundryVersion() external view returns (string memory version); + + /// Returns the RPC url for the given alias. + function rpcUrl(string calldata rpcAlias) external view returns (string memory json); + + /// Returns all rpc urls and their aliases as structs. + function rpcUrlStructs() external view returns (Rpc[] memory urls); + + /// Returns all rpc urls and their aliases `[alias, url][]`. + function rpcUrls() external view returns (string[2][] memory urls); + + /// Suspends execution of the main thread for `duration` milliseconds. + function sleep(uint256 duration) external; + + // ======== Toml ======== + + /// Checks if `key` exists in a TOML table. + function keyExistsToml(string calldata toml, string calldata key) external view returns (bool); + + /// Parses a string of TOML data at `key` and coerces it to `address`. + function parseTomlAddress(string calldata toml, string calldata key) external pure returns (address); + + /// Parses a string of TOML data at `key` and coerces it to `address[]`. + function parseTomlAddressArray(string calldata toml, string calldata key) + external + pure + returns (address[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `bool`. + function parseTomlBool(string calldata toml, string calldata key) external pure returns (bool); + + /// Parses a string of TOML data at `key` and coerces it to `bool[]`. + function parseTomlBoolArray(string calldata toml, string calldata key) external pure returns (bool[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `bytes`. + function parseTomlBytes(string calldata toml, string calldata key) external pure returns (bytes memory); + + /// Parses a string of TOML data at `key` and coerces it to `bytes32`. + function parseTomlBytes32(string calldata toml, string calldata key) external pure returns (bytes32); + + /// Parses a string of TOML data at `key` and coerces it to `bytes32[]`. + function parseTomlBytes32Array(string calldata toml, string calldata key) + external + pure + returns (bytes32[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `bytes[]`. + function parseTomlBytesArray(string calldata toml, string calldata key) external pure returns (bytes[] memory); + + /// Parses a string of TOML data at `key` and coerces it to `int256`. + function parseTomlInt(string calldata toml, string calldata key) external pure returns (int256); + + /// Parses a string of TOML data at `key` and coerces it to `int256[]`. + function parseTomlIntArray(string calldata toml, string calldata key) external pure returns (int256[] memory); + + /// Returns an array of all the keys in a TOML table. + function parseTomlKeys(string calldata toml, string calldata key) external pure returns (string[] memory keys); + + /// Parses a string of TOML data at `key` and coerces it to `string`. + function parseTomlString(string calldata toml, string calldata key) external pure returns (string memory); + + /// Parses a string of TOML data at `key` and coerces it to `string[]`. + function parseTomlStringArray(string calldata toml, string calldata key) external pure returns (string[] memory); + + /// Parses a string of TOML data at `key` and coerces it to type array corresponding to `typeDescription`. + function parseTomlTypeArray(string calldata toml, string calldata key, string calldata typeDescription) + external + pure + returns (bytes memory); + + /// Parses a string of TOML data and coerces it to type corresponding to `typeDescription`. + function parseTomlType(string calldata toml, string calldata typeDescription) + external + pure + returns (bytes memory); + + /// Parses a string of TOML data at `key` and coerces it to type corresponding to `typeDescription`. + function parseTomlType(string calldata toml, string calldata key, string calldata typeDescription) + external + pure + returns (bytes memory); + + /// Parses a string of TOML data at `key` and coerces it to `uint256`. + function parseTomlUint(string calldata toml, string calldata key) external pure returns (uint256); + + /// Parses a string of TOML data at `key` and coerces it to `uint256[]`. + function parseTomlUintArray(string calldata toml, string calldata key) external pure returns (uint256[] memory); + + /// ABI-encodes a TOML table. + function parseToml(string calldata toml) external pure returns (bytes memory abiEncodedData); + + /// ABI-encodes a TOML table at `key`. + function parseToml(string calldata toml, string calldata key) external pure returns (bytes memory abiEncodedData); + + /// Takes serialized JSON, converts to TOML and write a serialized TOML to a file. + function writeToml(string calldata json, string calldata path) external; + + /// Takes serialized JSON, converts to TOML and write a serialized TOML table to an **existing** TOML file, replacing a value with key = + /// This is useful to replace a specific value of a TOML file, without having to parse the entire thing. + /// This cheatcode will create new keys if they didn't previously exist. + function writeToml(string calldata json, string calldata path, string calldata valueKey) external; + + // ======== Utilities ======== + + /// Returns an uint256 value bounded in given range and different from the current one. + function bound(uint256 current, uint256 min, uint256 max) external view returns (uint256); + + /// Returns an int256 value bounded in given range and different from the current one. + function bound(int256 current, int256 min, int256 max) external view returns (int256); + + /// Compute the address of a contract created with CREATE2 using the given CREATE2 deployer. + function computeCreate2Address(bytes32 salt, bytes32 initCodeHash, address deployer) + external + pure + returns (address); + + /// Compute the address of a contract created with CREATE2 using the default CREATE2 deployer. + function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) external pure returns (address); + + /// Compute the address a contract will be deployed at for a given deployer address and nonce. + function computeCreateAddress(address deployer, uint256 nonce) external pure returns (address); + + /// Utility cheatcode to copy storage of `from` contract to another `to` contract. + function copyStorage(address from, address to) external; + + /// Generates the struct hash of the canonical EIP-712 type representation and its abi-encoded data. + /// Supports 2 different inputs: + /// 1. Name of the type (i.e. "PermitSingle"): + /// * requires previous binding generation with `forge bind-json`. + /// * bindings will be retrieved from the path configured in `foundry.toml`. + /// 2. String representation of the type (i.e. "Foo(Bar bar) Bar(uint256 baz)"). + /// * Note: the cheatcode will use the canonical type even if the input is malformated + /// with the wrong order of elements or with extra whitespaces. + function eip712HashStruct(string calldata typeNameOrDefinition, bytes calldata abiEncodedData) + external + pure + returns (bytes32 typeHash); + + /// Generates the struct hash of the canonical EIP-712 type representation and its abi-encoded data. + /// Requires previous binding generation with `forge bind-json`. + /// Params: + /// * `bindingsPath`: path where the output of `forge bind-json` is stored. + /// * `typeName`: Name of the type (i.e. "PermitSingle"). + /// * `abiEncodedData`: ABI-encoded data for the struct that is being hashed. + function eip712HashStruct(string calldata bindingsPath, string calldata typeName, bytes calldata abiEncodedData) + external + pure + returns (bytes32 typeHash); + + /// Generates the hash of the canonical EIP-712 type representation. + /// Supports 2 different inputs: + /// 1. Name of the type (i.e. "Transaction"): + /// * requires previous binding generation with `forge bind-json`. + /// * bindings will be retrieved from the path configured in `foundry.toml`. + /// 2. String representation of the type (i.e. "Foo(Bar bar) Bar(uint256 baz)"). + /// * Note: the cheatcode will output the canonical type even if the input is malformated + /// with the wrong order of elements or with extra whitespaces. + function eip712HashType(string calldata typeNameOrDefinition) external pure returns (bytes32 typeHash); + + /// Generates the hash of the canonical EIP-712 type representation. + /// Requires previous binding generation with `forge bind-json`. + /// Params: + /// * `bindingsPath`: path where the output of `forge bind-json` is stored. + /// * `typeName`: Name of the type (i.e. "Transaction"). + function eip712HashType(string calldata bindingsPath, string calldata typeName) + external + pure + returns (bytes32 typeHash); + + /// Generates a ready-to-sign digest of human-readable typed data following the EIP-712 standard. + function eip712HashTypedData(string calldata jsonData) external pure returns (bytes32 digest); + + /// Returns ENS namehash for provided string. + function ensNamehash(string calldata name) external pure returns (bytes32); + + /// Gets the label for the specified address. + function getLabel(address account) external view returns (string memory currentLabel); + + /// Labels an address in call traces. + function label(address account, string calldata newLabel) external; + + /// Pauses collection of call traces. Useful in cases when you want to skip tracing of + /// complex calls which are not useful for debugging. + function pauseTracing() external view; + + /// Returns a random `address`. + function randomAddress() external view returns (address); + + /// Returns a random `bool`. + function randomBool() external view returns (bool); + + /// Returns a random byte array value of the given length. + function randomBytes(uint256 len) external view returns (bytes memory); + + /// Returns a random fixed-size byte array of length 4. + function randomBytes4() external view returns (bytes4); + + /// Returns a random fixed-size byte array of length 8. + function randomBytes8() external view returns (bytes8); + + /// Returns a random `int256` value. + function randomInt() external view returns (int256); + + /// Returns a random `int256` value of given bits. + function randomInt(uint256 bits) external view returns (int256); + + /// Returns a random uint256 value. + function randomUint() external view returns (uint256); + + /// Returns random uint256 value between the provided range (=min..=max). + function randomUint(uint256 min, uint256 max) external view returns (uint256); + + /// Returns a random `uint256` value of given bits. + function randomUint(uint256 bits) external view returns (uint256); + + /// Unpauses collection of call traces. + function resumeTracing() external view; + + /// Utility cheatcode to set arbitrary storage for given target address. + function setArbitraryStorage(address target) external; + + /// Utility cheatcode to set arbitrary storage for given target address and overwrite + /// any storage slots that have been previously set. + function setArbitraryStorage(address target, bool overwrite) external; + + /// Set RNG seed. + function setSeed(uint256 seed) external; + + /// Randomly shuffles an array. + function shuffle(uint256[] calldata array) external returns (uint256[] memory); + + /// Sorts an array in ascending order. + function sort(uint256[] calldata array) external returns (uint256[] memory); + + /// Encodes a `bytes` value to a base64url string. + function toBase64URL(bytes calldata data) external pure returns (string memory); + + /// Encodes a `string` value to a base64url string. + function toBase64URL(string calldata data) external pure returns (string memory); + + /// Encodes a `bytes` value to a base64 string. + function toBase64(bytes calldata data) external pure returns (string memory); + + /// Encodes a `string` value to a base64 string. + function toBase64(string calldata data) external pure returns (string memory); +} + +/// The `Vm` interface does allow manipulation of the EVM state. These are all intended to be used +/// in tests, but it is not recommended to use these cheats in scripts. +interface Vm is VmSafe { + // ======== EVM ======== + + /// Utility cheatcode to set an EIP-2930 access list for all subsequent transactions. + function accessList(AccessListItem[] calldata access) external; + + /// Returns the identifier of the currently active fork. Reverts if no fork is currently active. + function activeFork() external view returns (uint256 forkId); + + /// In forking mode, explicitly grant the given address cheatcode access. + function allowCheatcodes(address account) external; + + /// Sets `block.blobbasefee` + function blobBaseFee(uint256 newBlobBaseFee) external; + + /// Sets the blobhashes in the transaction. + /// Not available on EVM versions before Cancun. + /// If used on unsupported EVM versions it will revert. + function blobhashes(bytes32[] calldata hashes) external; + + /// Sets `block.chainid`. + function chainId(uint256 newChainId) external; + + /// Clears all mocked calls. + function clearMockedCalls() external; + + /// Clones a source account code, state, balance and nonce to a target account and updates in-memory EVM state. + function cloneAccount(address source, address target) external; + + /// Sets `block.coinbase`. + function coinbase(address newCoinbase) external; + + /// Marks the slots of an account and the account address as cold. + function cool(address target) external; + + /// Utility cheatcode to mark specific storage slot as cold, simulating no prior read. + function coolSlot(address target, bytes32 slot) external; + + /// Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork. + function createFork(string calldata urlOrAlias) external returns (uint256 forkId); + + /// Creates a new fork with the given endpoint and block and returns the identifier of the fork. + function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); + + /// Creates a new fork with the given endpoint and at the block the given transaction was mined in, + /// replays all transaction mined in the block before the transaction, and returns the identifier of the fork. + function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); + + /// Creates and also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork. + function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId); + + /// Creates and also selects a new fork with the given endpoint and block and returns the identifier of the fork. + function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); + + /// Creates and also selects new fork with the given endpoint and at the block the given transaction was mined in, + /// replays all transaction mined in the block before the transaction, returns the identifier of the fork. + function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); + + /// Sets an address' balance. + function deal(address account, uint256 newBalance) external; + + /// Removes the snapshot with the given ID created by `snapshot`. + /// Takes the snapshot ID to delete. + /// Returns `true` if the snapshot was successfully deleted. + /// Returns `false` if the snapshot does not exist. + function deleteStateSnapshot(uint256 snapshotId) external returns (bool success); + + /// Removes _all_ snapshots previously created by `snapshot`. + function deleteStateSnapshots() external; + + /// Sets `block.difficulty`. + /// Not available on EVM versions from Paris onwards. Use `prevrandao` instead. + /// Reverts if used on unsupported EVM versions. + function difficulty(uint256 newDifficulty) external; + + /// Dump a genesis JSON file's `allocs` to disk. + function dumpState(string calldata pathToStateJson) external; + + /// Sets an address' code. + function etch(address target, bytes calldata newRuntimeBytecode) external; + + /// Sets `block.basefee`. + function fee(uint256 newBasefee) external; + + /// Gets the blockhashes from the current transaction. + /// Not available on EVM versions before Cancun. + /// If used on unsupported EVM versions it will revert. + function getBlobhashes() external view returns (bytes32[] memory hashes); + + /// Returns true if the account is marked as persistent. + function isPersistent(address account) external view returns (bool persistent); + + /// Load a genesis JSON file's `allocs` into the in-memory EVM state. + function loadAllocs(string calldata pathToAllocsJson) external; + + /// Marks that the account(s) should use persistent storage across fork swaps in a multifork setup + /// Meaning, changes made to the state of this account will be kept when switching forks. + function makePersistent(address account) external; + + /// See `makePersistent(address)`. + function makePersistent(address account0, address account1) external; + + /// See `makePersistent(address)`. + function makePersistent(address account0, address account1, address account2) external; + + /// See `makePersistent(address)`. + function makePersistent(address[] calldata accounts) external; + + /// Reverts a call to an address with specified revert data. + function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external; + + /// Reverts a call to an address with a specific `msg.value`, with specified revert data. + function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData) + external; + + /// Reverts a call to an address with specified revert data. + /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`. + function mockCallRevert(address callee, bytes4 data, bytes calldata revertData) external; + + /// Reverts a call to an address with a specific `msg.value`, with specified revert data. + /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`. + function mockCallRevert(address callee, uint256 msgValue, bytes4 data, bytes calldata revertData) external; + + /// Mocks a call to an address, returning specified data. + /// Calldata can either be strict or a partial match, e.g. if you only + /// pass a Solidity selector to the expected calldata, then the entire Solidity + /// function will be mocked. + function mockCall(address callee, bytes calldata data, bytes calldata returnData) external; + + /// Mocks a call to an address with a specific `msg.value`, returning specified data. + /// Calldata match takes precedence over `msg.value` in case of ambiguity. + function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external; + + /// Mocks a call to an address, returning specified data. + /// Calldata can either be strict or a partial match, e.g. if you only + /// pass a Solidity selector to the expected calldata, then the entire Solidity + /// function will be mocked. + /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`. + function mockCall(address callee, bytes4 data, bytes calldata returnData) external; + + /// Mocks a call to an address with a specific `msg.value`, returning specified data. + /// Calldata match takes precedence over `msg.value` in case of ambiguity. + /// Overload to pass the function selector directly `token.approve.selector` instead of `abi.encodeWithSelector(token.approve.selector)`. + function mockCall(address callee, uint256 msgValue, bytes4 data, bytes calldata returnData) external; + + /// Mocks multiple calls to an address, returning specified data for each call. + function mockCalls(address callee, bytes calldata data, bytes[] calldata returnData) external; + + /// Mocks multiple calls to an address with a specific `msg.value`, returning specified data for each call. + function mockCalls(address callee, uint256 msgValue, bytes calldata data, bytes[] calldata returnData) external; + + /// Whenever a call is made to `callee` with calldata `data`, this cheatcode instead calls + /// `target` with the same calldata. This functionality is similar to a delegate call made to + /// `target` contract from `callee`. + /// Can be used to substitute a call to a function with another implementation that captures + /// the primary logic of the original function but is easier to reason about. + /// If calldata is not a strict match then partial match by selector is attempted. + function mockFunction(address callee, address target, bytes calldata data) external; + + /// Utility cheatcode to remove any EIP-2930 access list set by `accessList` cheatcode. + function noAccessList() external; + + /// Sets the *next* call's `msg.sender` to be the input address. + function prank(address msgSender) external; + + /// Sets the *next* call's `msg.sender` to be the input address, and the `tx.origin` to be the second input. + function prank(address msgSender, address txOrigin) external; + + /// Sets the *next* delegate call's `msg.sender` to be the input address. + function prank(address msgSender, bool delegateCall) external; + + /// Sets the *next* delegate call's `msg.sender` to be the input address, and the `tx.origin` to be the second input. + function prank(address msgSender, address txOrigin, bool delegateCall) external; + + /// Sets `block.prevrandao`. + /// Not available on EVM versions before Paris. Use `difficulty` instead. + /// If used on unsupported EVM versions it will revert. + function prevrandao(bytes32 newPrevrandao) external; + + /// Sets `block.prevrandao`. + /// Not available on EVM versions before Paris. Use `difficulty` instead. + /// If used on unsupported EVM versions it will revert. + function prevrandao(uint256 newPrevrandao) external; + + /// Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification. + function readCallers() external view returns (CallerMode callerMode, address msgSender, address txOrigin); + + /// Resets the nonce of an account to 0 for EOAs and 1 for contract accounts. + function resetNonce(address account) external; + + /// Revert the state of the EVM to a previous snapshot + /// Takes the snapshot ID to revert to. + /// Returns `true` if the snapshot was successfully reverted. + /// Returns `false` if the snapshot does not exist. + /// **Note:** This does not automatically delete the snapshot. To delete the snapshot use `deleteStateSnapshot`. + function revertToState(uint256 snapshotId) external returns (bool success); + + /// Revert the state of the EVM to a previous snapshot and automatically deletes the snapshots + /// Takes the snapshot ID to revert to. + /// Returns `true` if the snapshot was successfully reverted and deleted. + /// Returns `false` if the snapshot does not exist. + function revertToStateAndDelete(uint256 snapshotId) external returns (bool success); + + /// Revokes persistent status from the address, previously added via `makePersistent`. + function revokePersistent(address account) external; + + /// See `revokePersistent(address)`. + function revokePersistent(address[] calldata accounts) external; + + /// Sets `block.height`. + function roll(uint256 newHeight) external; + + /// Updates the currently active fork to given block number + /// This is similar to `roll` but for the currently active fork. + function rollFork(uint256 blockNumber) external; + + /// Updates the currently active fork to given transaction. This will `rollFork` with the number + /// of the block the transaction was mined in and replays all transaction mined before it in the block. + function rollFork(bytes32 txHash) external; + + /// Updates the given fork to given block number. + function rollFork(uint256 forkId, uint256 blockNumber) external; + + /// Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block. + function rollFork(uint256 forkId, bytes32 txHash) external; + + /// Takes a fork identifier created by `createFork` and sets the corresponding forked state as active. + function selectFork(uint256 forkId) external; + + /// Set blockhash for the current block. + /// It only sets the blockhash for blocks where `block.number - 256 <= number < block.number`. + function setBlockhash(uint256 blockNumber, bytes32 blockHash) external; + + /// Sets the nonce of an account. Must be higher than the current nonce of the account. + function setNonce(address account, uint64 newNonce) external; + + /// Sets the nonce of an account to an arbitrary value. + function setNonceUnsafe(address account, uint64 newNonce) external; + + /// Snapshot capture the gas usage of the last call by name from the callee perspective. + function snapshotGasLastCall(string calldata name) external returns (uint256 gasUsed); + + /// Snapshot capture the gas usage of the last call by name in a group from the callee perspective. + function snapshotGasLastCall(string calldata group, string calldata name) external returns (uint256 gasUsed); + + /// Snapshot the current state of the evm. + /// Returns the ID of the snapshot that was created. + /// To revert a snapshot use `revertToState`. + function snapshotState() external returns (uint256 snapshotId); + + /// Snapshot capture an arbitrary numerical value by name. + /// The group name is derived from the contract name. + function snapshotValue(string calldata name, uint256 value) external; + + /// Snapshot capture an arbitrary numerical value by name in a group. + function snapshotValue(string calldata group, string calldata name, uint256 value) external; + + /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called. + function startPrank(address msgSender) external; + + /// Sets all subsequent calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input. + function startPrank(address msgSender, address txOrigin) external; + + /// Sets all subsequent delegate calls' `msg.sender` to be the input address until `stopPrank` is called. + function startPrank(address msgSender, bool delegateCall) external; + + /// Sets all subsequent delegate calls' `msg.sender` to be the input address until `stopPrank` is called, and the `tx.origin` to be the second input. + function startPrank(address msgSender, address txOrigin, bool delegateCall) external; + + /// Start a snapshot capture of the current gas usage by name. + /// The group name is derived from the contract name. + function startSnapshotGas(string calldata name) external; + + /// Start a snapshot capture of the current gas usage by name in a group. + function startSnapshotGas(string calldata group, string calldata name) external; + + /// Resets subsequent calls' `msg.sender` to be `address(this)`. + function stopPrank() external; + + /// Stop the snapshot capture of the current gas by latest snapshot name, capturing the gas used since the start. + function stopSnapshotGas() external returns (uint256 gasUsed); + + /// Stop the snapshot capture of the current gas usage by name, capturing the gas used since the start. + /// The group name is derived from the contract name. + function stopSnapshotGas(string calldata name) external returns (uint256 gasUsed); + + /// Stop the snapshot capture of the current gas usage by name in a group, capturing the gas used since the start. + function stopSnapshotGas(string calldata group, string calldata name) external returns (uint256 gasUsed); + + /// Stores a value to an address' storage slot. + function store(address target, bytes32 slot, bytes32 value) external; + + /// Fetches the given transaction from the active fork and executes it on the current state. + function transact(bytes32 txHash) external; + + /// Fetches the given transaction from the given fork and executes it on the current state. + function transact(uint256 forkId, bytes32 txHash) external; + + /// Sets `tx.gasprice`. + function txGasPrice(uint256 newGasPrice) external; + + /// Utility cheatcode to mark specific storage slot as warm, simulating a prior read. + function warmSlot(address target, bytes32 slot) external; + + /// Sets `block.timestamp`. + function warp(uint256 newTimestamp) external; + + /// `deleteSnapshot` is being deprecated in favor of `deleteStateSnapshot`. It will be removed in future versions. + function deleteSnapshot(uint256 snapshotId) external returns (bool success); + + /// `deleteSnapshots` is being deprecated in favor of `deleteStateSnapshots`. It will be removed in future versions. + function deleteSnapshots() external; + + /// `revertToAndDelete` is being deprecated in favor of `revertToStateAndDelete`. It will be removed in future versions. + function revertToAndDelete(uint256 snapshotId) external returns (bool success); + + /// `revertTo` is being deprecated in favor of `revertToState`. It will be removed in future versions. + function revertTo(uint256 snapshotId) external returns (bool success); + + /// `snapshot` is being deprecated in favor of `snapshotState`. It will be removed in future versions. + function snapshot() external returns (uint256 snapshotId); + + // ======== Testing ======== + + /// Expect a call to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. + function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external; + + /// Expect given number of calls to an address with the specified `msg.value` and calldata, and a *minimum* amount of gas. + function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count) + external; + + /// Expects a call to an address with the specified calldata. + /// Calldata can either be a strict or a partial match. + function expectCall(address callee, bytes calldata data) external; + + /// Expects given number of calls to an address with the specified calldata. + function expectCall(address callee, bytes calldata data, uint64 count) external; + + /// Expects a call to an address with the specified `msg.value` and calldata. + function expectCall(address callee, uint256 msgValue, bytes calldata data) external; + + /// Expects given number of calls to an address with the specified `msg.value` and calldata. + function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external; + + /// Expect a call to an address with the specified `msg.value`, gas, and calldata. + function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external; + + /// Expects given number of calls to an address with the specified `msg.value`, gas, and calldata. + function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external; + + /// Expects the deployment of the specified bytecode by the specified address using the CREATE opcode + function expectCreate(bytes calldata bytecode, address deployer) external; + + /// Expects the deployment of the specified bytecode by the specified address using the CREATE2 opcode + function expectCreate2(bytes calldata bytecode, address deployer) external; + + /// Prepare an expected anonymous log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.). + /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if + /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans). + function expectEmitAnonymous(bool checkTopic0, bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) + external; + + /// Same as the previous method, but also checks supplied address against emitting contract. + function expectEmitAnonymous( + bool checkTopic0, + bool checkTopic1, + bool checkTopic2, + bool checkTopic3, + bool checkData, + address emitter + ) external; + + /// Prepare an expected anonymous log with all topic and data checks enabled. + /// Call this function, then emit an anonymous event, then call a function. Internally after the call, we check if + /// logs were emitted in the expected order with the expected topics and data. + function expectEmitAnonymous() external; + + /// Same as the previous method, but also checks supplied address against emitting contract. + function expectEmitAnonymous(address emitter) external; + + /// Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData.). + /// Call this function, then emit an event, then call a function. Internally after the call, we check if + /// logs were emitted in the expected order with the expected topics and data (as specified by the booleans). + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; + + /// Same as the previous method, but also checks supplied address against emitting contract. + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) + external; + + /// Prepare an expected log with all topic and data checks enabled. + /// Call this function, then emit an event, then call a function. Internally after the call, we check if + /// logs were emitted in the expected order with the expected topics and data. + function expectEmit() external; + + /// Same as the previous method, but also checks supplied address against emitting contract. + function expectEmit(address emitter) external; + + /// Expect a given number of logs with the provided topics. + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, uint64 count) external; + + /// Expect a given number of logs from a specific emitter with the provided topics. + function expectEmit( + bool checkTopic1, + bool checkTopic2, + bool checkTopic3, + bool checkData, + address emitter, + uint64 count + ) external; + + /// Expect a given number of logs with all topic and data checks enabled. + function expectEmit(uint64 count) external; + + /// Expect a given number of logs from a specific emitter with all topic and data checks enabled. + function expectEmit(address emitter, uint64 count) external; + + /// Expects an error on next call that starts with the revert data. + function expectPartialRevert(bytes4 revertData) external; + + /// Expects an error on next call to reverter address, that starts with the revert data. + function expectPartialRevert(bytes4 revertData, address reverter) external; + + /// Expects an error on next call with any revert data. + function expectRevert() external; + + /// Expects an error on next call that exactly matches the revert data. + function expectRevert(bytes4 revertData) external; + + /// Expects a `count` number of reverts from the upcoming calls from the reverter address that match the revert data. + function expectRevert(bytes4 revertData, address reverter, uint64 count) external; + + /// Expects a `count` number of reverts from the upcoming calls from the reverter address that exactly match the revert data. + function expectRevert(bytes calldata revertData, address reverter, uint64 count) external; + + /// Expects an error on next call that exactly matches the revert data. + function expectRevert(bytes calldata revertData) external; + + /// Expects an error with any revert data on next call to reverter address. + function expectRevert(address reverter) external; + + /// Expects an error from reverter address on next call, with any revert data. + function expectRevert(bytes4 revertData, address reverter) external; + + /// Expects an error from reverter address on next call, that exactly matches the revert data. + function expectRevert(bytes calldata revertData, address reverter) external; + + /// Expects a `count` number of reverts from the upcoming calls with any revert data or reverter. + function expectRevert(uint64 count) external; + + /// Expects a `count` number of reverts from the upcoming calls that match the revert data. + function expectRevert(bytes4 revertData, uint64 count) external; + + /// Expects a `count` number of reverts from the upcoming calls that exactly match the revert data. + function expectRevert(bytes calldata revertData, uint64 count) external; + + /// Expects a `count` number of reverts from the upcoming calls from the reverter address. + function expectRevert(address reverter, uint64 count) external; + + /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other + /// memory is written to, the test will fail. Can be called multiple times to add more ranges to the set. + function expectSafeMemory(uint64 min, uint64 max) external; + + /// Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext. + /// If any other memory is written to, the test will fail. Can be called multiple times to add more ranges + /// to the set. + function expectSafeMemoryCall(uint64 min, uint64 max) external; + + /// Marks a test as skipped. Must be called at the top level of a test. + function skip(bool skipTest) external; + + /// Marks a test as skipped with a reason. Must be called at the top level of a test. + function skip(bool skipTest, string calldata reason) external; + + /// Stops all safe memory expectation in the current subcontext. + function stopExpectSafeMemory() external; + + // ======== Utilities ======== + + /// Causes the next contract creation (via new) to fail and return its initcode in the returndata buffer. + /// This allows type-safe access to the initcode payload that would be used for contract creation. + /// Example usage: + /// vm.interceptInitcode(); + /// bytes memory initcode; + /// try new MyContract(param1, param2) { assert(false); } + /// catch (bytes memory interceptedInitcode) { initcode = interceptedInitcode; } + function interceptInitcode() external; +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/console.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/console.sol new file mode 100644 index 000000000..4fdb6679e --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/console.sol @@ -0,0 +1,1560 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +library console { + address constant CONSOLE_ADDRESS = + 0x000000000000000000636F6e736F6c652e6c6f67; + + function _sendLogPayloadImplementation(bytes memory payload) internal view { + address consoleAddress = CONSOLE_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + pop( + staticcall( + gas(), + consoleAddress, + add(payload, 32), + mload(payload), + 0, + 0 + ) + ) + } + } + + function _castToPure( + function(bytes memory) internal view fnIn + ) internal pure returns (function(bytes memory) pure fnOut) { + assembly { + fnOut := fnIn + } + } + + function _sendLogPayload(bytes memory payload) internal pure { + _castToPure(_sendLogPayloadImplementation)(payload); + } + + function log() internal pure { + _sendLogPayload(abi.encodeWithSignature("log()")); + } + + function logInt(int256 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); + } + + function logUint(uint256 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); + } + + function logString(string memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function logBool(bool p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function logAddress(address p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function logBytes(bytes memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); + } + + function logBytes1(bytes1 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); + } + + function logBytes2(bytes2 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); + } + + function logBytes3(bytes3 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); + } + + function logBytes4(bytes4 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); + } + + function logBytes5(bytes5 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); + } + + function logBytes6(bytes6 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); + } + + function logBytes7(bytes7 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); + } + + function logBytes8(bytes8 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); + } + + function logBytes9(bytes9 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); + } + + function logBytes10(bytes10 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); + } + + function logBytes11(bytes11 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); + } + + function logBytes12(bytes12 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); + } + + function logBytes13(bytes13 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); + } + + function logBytes14(bytes14 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); + } + + function logBytes15(bytes15 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); + } + + function logBytes16(bytes16 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); + } + + function logBytes17(bytes17 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); + } + + function logBytes18(bytes18 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); + } + + function logBytes19(bytes19 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); + } + + function logBytes20(bytes20 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); + } + + function logBytes21(bytes21 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); + } + + function logBytes22(bytes22 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); + } + + function logBytes23(bytes23 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); + } + + function logBytes24(bytes24 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); + } + + function logBytes25(bytes25 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); + } + + function logBytes26(bytes26 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); + } + + function logBytes27(bytes27 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); + } + + function logBytes28(bytes28 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); + } + + function logBytes29(bytes29 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); + } + + function logBytes30(bytes30 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); + } + + function logBytes31(bytes31 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); + } + + function logBytes32(bytes32 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); + } + + function log(uint256 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); + } + + function log(int256 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); + } + + function log(string memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function log(bool p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function log(address p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function log(uint256 p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); + } + + function log(uint256 p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); + } + + function log(uint256 p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); + } + + function log(uint256 p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); + } + + function log(string memory p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); + } + + function log(string memory p0, int256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1)); + } + + function log(string memory p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); + } + + function log(string memory p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); + } + + function log(string memory p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); + } + + function log(bool p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); + } + + function log(bool p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); + } + + function log(bool p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); + } + + function log(bool p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); + } + + function log(address p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); + } + + function log(address p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); + } + + function log(address p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); + } + + function log(address p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); + } + + function log(uint256 p0, uint256 p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); + } + + function log(string memory p0, address p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); + } + + function log(string memory p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); + } + + function log(string memory p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); + } + + function log(string memory p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); + } + + function log(bool p0, bool p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); + } + + function log(bool p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); + } + + function log(bool p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); + } + + function log(bool p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); + } + + function log(bool p0, address p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); + } + + function log(bool p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); + } + + function log(bool p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); + } + + function log(bool p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); + } + + function log(address p0, string memory p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); + } + + function log(address p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); + } + + function log(address p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); + } + + function log(address p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); + } + + function log(address p0, bool p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); + } + + function log(address p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); + } + + function log(address p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); + } + + function log(address p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); + } + + function log(address p0, address p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); + } + + function log(address p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); + } + + function log(address p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); + } + + function log(address p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/console2.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/console2.sol new file mode 100644 index 000000000..03531d91d --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/console2.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +import {console as console2} from "./console.sol"; diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC1155.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC1155.sol new file mode 100644 index 000000000..ffc82984a --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC1155.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import {IERC165} from "./IERC165.sol"; + +/// @title ERC-1155 Multi Token Standard +/// @dev See https://eips.ethereum.org/EIPS/eip-1155 +/// Note: The ERC-165 identifier for this interface is 0xd9b67a26. +interface IERC1155 is IERC165 { + /// @dev + /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). + /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). + /// - The `_from` argument MUST be the address of the holder whose balance is decreased. + /// - The `_to` argument MUST be the address of the recipient whose balance is increased. + /// - The `_id` argument MUST be the token type being transferred. + /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. + /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). + /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). + event TransferSingle( + address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value + ); + + /// @dev + /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). + /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). + /// - The `_from` argument MUST be the address of the holder whose balance is decreased. + /// - The `_to` argument MUST be the address of the recipient whose balance is increased. + /// - The `_ids` argument MUST be the list of tokens being transferred. + /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. + /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). + /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). + event TransferBatch( + address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values + ); + + /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled). + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. + /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". + event URI(string _value, uint256 indexed _id); + + /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). + /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). + /// - MUST revert if `_to` is the zero address. + /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent. + /// - MUST revert on any other error. + /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). + /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). + /// @param _from Source address + /// @param _to Target address + /// @param _id ID of the token type + /// @param _value Transfer amount + /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` + function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; + + /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). + /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). + /// - MUST revert if `_to` is the zero address. + /// - MUST revert if length of `_ids` is not the same as length of `_values`. + /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. + /// - MUST revert on any other error. + /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). + /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). + /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). + /// @param _from Source address + /// @param _to Target address + /// @param _ids IDs of each token type (order and length must match _values array) + /// @param _values Transfer amounts per token type (order and length must match _ids array) + /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` + function safeBatchTransferFrom( + address _from, + address _to, + uint256[] calldata _ids, + uint256[] calldata _values, + bytes calldata _data + ) external; + + /// @notice Get the balance of an account's tokens. + /// @param _owner The address of the token holder + /// @param _id ID of the token + /// @return The _owner's balance of the token type requested + function balanceOf(address _owner, uint256 _id) external view returns (uint256); + + /// @notice Get the balance of multiple account/token pairs + /// @param _owners The addresses of the token holders + /// @param _ids ID of the tokens + /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair) + function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) + external + view + returns (uint256[] memory); + + /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. + /// @dev MUST emit the ApprovalForAll event on success. + /// @param _operator Address to add to the set of authorized operators + /// @param _approved True if the operator is approved, false to revoke approval + function setApprovalForAll(address _operator, bool _approved) external; + + /// @notice Queries the approval status of an operator for a given owner. + /// @param _owner The owner of the tokens + /// @param _operator Address of authorized operator + /// @return True if the operator is approved, false if not + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC165.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC165.sol new file mode 100644 index 000000000..9af4bf800 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC165.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +interface IERC165 { + /// @notice Query if a contract implements an interface + /// @param interfaceID The interface identifier, as specified in ERC-165 + /// @dev Interface identification is specified in ERC-165. This function + /// uses less than 30,000 gas. + /// @return `true` if the contract implements `interfaceID` and + /// `interfaceID` is not 0xffffffff, `false` otherwise + function supportsInterface(bytes4 interfaceID) external view returns (bool); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC20.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC20.sol new file mode 100644 index 000000000..ba40806c3 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC20.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +/// @dev Interface of the ERC20 standard as defined in the EIP. +/// @dev This includes the optional name, symbol, and decimals metadata. +interface IERC20 { + /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). + event Transfer(address indexed from, address indexed to, uint256 value); + + /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` + /// is the new allowance. + event Approval(address indexed owner, address indexed spender, uint256 value); + + /// @notice Returns the amount of tokens in existence. + function totalSupply() external view returns (uint256); + + /// @notice Returns the amount of tokens owned by `account`. + function balanceOf(address account) external view returns (uint256); + + /// @notice Moves `amount` tokens from the caller's account to `to`. + function transfer(address to, uint256 amount) external returns (bool); + + /// @notice Returns the remaining number of tokens that `spender` is allowed + /// to spend on behalf of `owner` + function allowance(address owner, address spender) external view returns (uint256); + + /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. + /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + function approve(address spender, uint256 amount) external returns (bool); + + /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. + /// `amount` is then deducted from the caller's allowance. + function transferFrom(address from, address to, uint256 amount) external returns (bool); + + /// @notice Returns the name of the token. + function name() external view returns (string memory); + + /// @notice Returns the symbol of the token. + function symbol() external view returns (string memory); + + /// @notice Returns the decimals places of the token. + function decimals() external view returns (uint8); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC4626.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC4626.sol new file mode 100644 index 000000000..c645a0fec --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC4626.sol @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import {IERC20} from "./IERC20.sol"; + +/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in +/// https://eips.ethereum.org/EIPS/eip-4626 +interface IERC4626 is IERC20 { + event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); + + event Withdraw( + address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares + ); + + /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. + /// @dev + /// - MUST be an ERC-20 token contract. + /// - MUST NOT revert. + function asset() external view returns (address assetTokenAddress); + + /// @notice Returns the total amount of the underlying asset that is “managed” by Vault. + /// @dev + /// - SHOULD include any compounding that occurs from yield. + /// - MUST be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT revert. + function totalAssets() external view returns (uint256 totalManagedAssets); + + /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal + /// scenario where all the conditions are met. + /// @dev + /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT show any variations depending on the caller. + /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + /// - MUST NOT revert. + /// + /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the + /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and + /// from. + function convertToShares(uint256 assets) external view returns (uint256 shares); + + /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal + /// scenario where all the conditions are met. + /// @dev + /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT show any variations depending on the caller. + /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + /// - MUST NOT revert. + /// + /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the + /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and + /// from. + function convertToAssets(uint256 shares) external view returns (uint256 assets); + + /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, + /// through a deposit call. + /// @dev + /// - MUST return a limited value if receiver is subject to some deposit limit. + /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. + /// - MUST NOT revert. + function maxDeposit(address receiver) external view returns (uint256 maxAssets); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given + /// current on-chain conditions. + /// @dev + /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit + /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called + /// in the same transaction. + /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the + /// deposit would be accepted, regardless if the user has enough tokens approved, etc. + /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by depositing. + function previewDeposit(uint256 assets) external view returns (uint256 shares); + + /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. + /// @dev + /// - MUST emit the Deposit event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// deposit execution, and are accounted for during deposit. + /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not + /// approving enough underlying tokens to the Vault contract, etc). + /// + /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + function deposit(uint256 assets, address receiver) external returns (uint256 shares); + + /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. + /// @dev + /// - MUST return a limited value if receiver is subject to some mint limit. + /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. + /// - MUST NOT revert. + function maxMint(address receiver) external view returns (uint256 maxShares); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given + /// current on-chain conditions. + /// @dev + /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call + /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the + /// same transaction. + /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint + /// would be accepted, regardless if the user has enough tokens approved, etc. + /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by minting. + function previewMint(uint256 shares) external view returns (uint256 assets); + + /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. + /// @dev + /// - MUST emit the Deposit event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint + /// execution, and are accounted for during mint. + /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not + /// approving enough underlying tokens to the Vault contract, etc). + /// + /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + function mint(uint256 shares, address receiver) external returns (uint256 assets); + + /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the + /// Vault, through a withdrawal call. + /// @dev + /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + /// - MUST NOT revert. + function maxWithdraw(address owner) external view returns (uint256 maxAssets); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, + /// given current on-chain conditions. + /// @dev + /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw + /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if + /// called + /// in the same transaction. + /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though + /// the withdrawal would be accepted, regardless if the user has enough shares, etc. + /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by depositing. + function previewWithdraw(uint256 assets) external view returns (uint256 shares); + + /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver. + /// @dev + /// - MUST emit the Withdraw event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// withdraw execution, and are accounted for during withdrawal. + /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner + /// not having enough shares, etc). + /// + /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + /// Those methods should be performed separately. + function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); + + /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, + /// through a redeem call. + /// @dev + /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. + /// - MUST NOT revert. + function maxRedeem(address owner) external view returns (uint256 maxShares); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, + /// given current on-chain conditions. + /// @dev + /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call + /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the + /// same transaction. + /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the + /// redemption would be accepted, regardless if the user has enough shares, etc. + /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by redeeming. + function previewRedeem(uint256 shares) external view returns (uint256 assets); + + /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver. + /// @dev + /// - MUST emit the Withdraw event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// redeem execution, and are accounted for during redeem. + /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner + /// not having enough shares, etc). + /// + /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + /// Those methods should be performed separately. + function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC6909.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC6909.sol new file mode 100644 index 000000000..6e11cb460 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC6909.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import {IERC165} from "./IERC165.sol"; + +/// @dev Required interface of an ERC-6909 compliant contract, as defined in +/// https://eips.ethereum.org/EIPS/eip-6909 +interface IERC6909 is IERC165 { + /// @dev Emitted when the allowance of a `spender` for an `owner` is set for a token of type `id`. + event Approval(address indexed owner, address indexed spender, uint256 indexed id, uint256 amount); + + /// @dev Emitted when `owner` grants or revokes operator status for a `spender`. + event OperatorSet(address indexed owner, address indexed spender, bool approved); + + /// @dev Emitted when `amount` tokens of type `id` are moved from `sender` to `receiver` initiated by `caller`. + event Transfer( + address caller, address indexed sender, address indexed receiver, uint256 indexed id, uint256 amount + ); + + ///@dev Returns the amount of tokens of type `id` owned by `owner`. + function balanceOf(address owner, uint256 id) external view returns (uint256); + + /// @dev Returns the amount of tokens of type `id` that `spender` is allowed to spend on behalf of `owner`. + /// NOTE: Does not include operator allowances. + function allowance(address owner, address spender, uint256 id) external view returns (uint256); + + /// @dev Returns true if `spender` is set as an operator for `owner`. + function isOperator(address owner, address spender) external view returns (bool); + + /// @dev Sets an approval to `spender` for `amount` tokens of type `id` from the caller's tokens. + /// Must return true. + function approve(address spender, uint256 id, uint256 amount) external returns (bool); + + /// @dev Grants or revokes unlimited transfer permission of any token id to `spender` for the caller's tokens. + /// Must return true. + function setOperator(address spender, bool approved) external returns (bool); + + /// @dev Transfers `amount` of token type `id` from the caller's account to `receiver`. + /// Must return true. + function transfer(address receiver, uint256 id, uint256 amount) external returns (bool); + + /// @dev Transfers `amount` of token type `id` from `sender` to `receiver`. + /// Must return true. + function transferFrom(address sender, address receiver, uint256 id, uint256 amount) external returns (bool); +} + +/// @dev Optional extension of {IERC6909} that adds metadata functions. +interface IERC6909Metadata is IERC6909 { + /// @dev Returns the name of the token of type `id`. + function name(uint256 id) external view returns (string memory); + + /// @dev Returns the ticker symbol of the token of type `id`. + function symbol(uint256 id) external view returns (string memory); + + /// @dev Returns the number of decimals for the token of type `id`. + function decimals(uint256 id) external view returns (uint8); +} + +/// @dev Optional extension of {IERC6909} that adds content URI functions. +interface IERC6909ContentURI is IERC6909 { + /// @dev Returns URI for the contract. + function contractURI() external view returns (string memory); + + /// @dev Returns the URI for the token of type `id`. + function tokenURI(uint256 id) external view returns (string memory); +} + +/// @dev Optional extension of {IERC6909} that adds a token supply function. +interface IERC6909TokenSupply is IERC6909 { + /// @dev Returns the total supply of the token of type `id`. + function totalSupply(uint256 id) external view returns (uint256); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC721.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC721.sol new file mode 100644 index 000000000..21a4a94de --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC721.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import {IERC165} from "./IERC165.sol"; + +/// @title ERC-721 Non-Fungible Token Standard +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x80ac58cd. +interface IERC721 is IERC165 { + /// @dev This emits when ownership of any NFT changes by any mechanism. + /// This event emits when NFTs are created (`from` == 0) and destroyed + /// (`to` == 0). Exception: during contract creation, any number of NFTs + /// may be created and assigned without emitting Transfer. At the time of + /// any transfer, the approved address for that NFT (if any) is reset to none. + event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); + + /// @dev This emits when the approved address for an NFT is changed or + /// reaffirmed. The zero address indicates there is no approved address. + /// When a Transfer event emits, this also indicates that the approved + /// address for that NFT (if any) is reset to none. + event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); + + /// @dev This emits when an operator is enabled or disabled for an owner. + /// The operator can manage all NFTs of the owner. + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + /// @notice Count all NFTs assigned to an owner + /// @dev NFTs assigned to the zero address are considered invalid, and this + /// function throws for queries about the zero address. + /// @param _owner An address for whom to query the balance + /// @return The number of NFTs owned by `_owner`, possibly zero + function balanceOf(address _owner) external view returns (uint256); + + /// @notice Find the owner of an NFT + /// @dev NFTs assigned to zero address are considered invalid, and queries + /// about them do throw. + /// @param _tokenId The identifier for an NFT + /// @return The address of the owner of the NFT + function ownerOf(uint256 _tokenId) external view returns (address); + + /// @notice Transfers the ownership of an NFT from one address to another address + /// @dev Throws unless `msg.sender` is the current owner, an authorized + /// operator, or the approved address for this NFT. Throws if `_from` is + /// not the current owner. Throws if `_to` is the zero address. Throws if + /// `_tokenId` is not a valid NFT. When transfer is complete, this function + /// checks if `_to` is a smart contract (code size > 0). If so, it calls + /// `onERC721Received` on `_to` and throws if the return value is not + /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + /// @param data Additional data with no specified format, sent in call to `_to` + function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; + + /// @notice Transfers the ownership of an NFT from one address to another address + /// @dev This works identically to the other function with an extra data parameter, + /// except this function just sets data to "". + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; + + /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE + /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE + /// THEY MAY BE PERMANENTLY LOST + /// @dev Throws unless `msg.sender` is the current owner, an authorized + /// operator, or the approved address for this NFT. Throws if `_from` is + /// not the current owner. Throws if `_to` is the zero address. Throws if + /// `_tokenId` is not a valid NFT. + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + function transferFrom(address _from, address _to, uint256 _tokenId) external payable; + + /// @notice Change or reaffirm the approved address for an NFT + /// @dev The zero address indicates there is no approved address. + /// Throws unless `msg.sender` is the current NFT owner, or an authorized + /// operator of the current owner. + /// @param _approved The new approved NFT controller + /// @param _tokenId The NFT to approve + function approve(address _approved, uint256 _tokenId) external payable; + + /// @notice Enable or disable approval for a third party ("operator") to manage + /// all of `msg.sender`'s assets + /// @dev Emits the ApprovalForAll event. The contract MUST allow + /// multiple operators per owner. + /// @param _operator Address to add to the set of authorized operators + /// @param _approved True if the operator is approved, false to revoke approval + function setApprovalForAll(address _operator, bool _approved) external; + + /// @notice Get the approved address for a single NFT + /// @dev Throws if `_tokenId` is not a valid NFT. + /// @param _tokenId The NFT to find the approved address for + /// @return The approved address for this NFT, or the zero address if there is none + function getApproved(uint256 _tokenId) external view returns (address); + + /// @notice Query if an address is an authorized operator for another address + /// @param _owner The address that owns the NFTs + /// @param _operator The address that acts on behalf of the owner + /// @return True if `_operator` is an approved operator for `_owner`, false otherwise + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} + +/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. +interface IERC721TokenReceiver { + /// @notice Handle the receipt of an NFT + /// @dev The ERC721 smart contract calls this function on the recipient + /// after a `transfer`. This function MAY throw to revert and reject the + /// transfer. Return of other than the magic value MUST result in the + /// transaction being reverted. + /// Note: the contract address is always the message sender. + /// @param _operator The address which called `safeTransferFrom` function + /// @param _from The address which previously owned the token + /// @param _tokenId The NFT identifier which is being transferred + /// @param _data Additional data with no specified format + /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` + /// unless throwing + function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) + external + returns (bytes4); +} + +/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x5b5e139f. +interface IERC721Metadata is IERC721 { + /// @notice A descriptive name for a collection of NFTs in this contract + function name() external view returns (string memory _name); + + /// @notice An abbreviated name for NFTs in this contract + function symbol() external view returns (string memory _symbol); + + /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. + /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC + /// 3986. The URI may point to a JSON file that conforms to the "ERC721 + /// Metadata JSON Schema". + function tokenURI(uint256 _tokenId) external view returns (string memory); +} + +/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x780e9d63. +interface IERC721Enumerable is IERC721 { + /// @notice Count NFTs tracked by this contract + /// @return A count of valid NFTs tracked by this contract, where each one of + /// them has an assigned and queryable owner not equal to the zero address + function totalSupply() external view returns (uint256); + + /// @notice Enumerate valid NFTs + /// @dev Throws if `_index` >= `totalSupply()`. + /// @param _index A counter less than `totalSupply()` + /// @return The token identifier for the `_index`th NFT, + /// (sort order not specified) + function tokenByIndex(uint256 _index) external view returns (uint256); + + /// @notice Enumerate NFTs assigned to an owner + /// @dev Throws if `_index` >= `balanceOf(_owner)` or if + /// `_owner` is the zero address, representing invalid NFTs. + /// @param _owner An address where we are interested in NFTs owned by them + /// @param _index A counter less than `balanceOf(_owner)` + /// @return The token identifier for the `_index`th NFT assigned to `_owner`, + /// (sort order not specified) + function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC7540.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC7540.sol new file mode 100644 index 000000000..91a38ca35 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC7540.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import {IERC7575} from "./IERC7575.sol"; + +/// @dev Interface of the base operator logic of ERC7540, as defined in +/// https://eips.ethereum.org/EIPS/eip-7540 +interface IERC7540Operator { + /** + * @dev The event emitted when an operator is set. + * + * @param controller The address of the controller. + * @param operator The address of the operator. + * @param approved The approval status. + */ + event OperatorSet(address indexed controller, address indexed operator, bool approved); + + /** + * @dev Sets or removes an operator for the caller. + * + * @param operator The address of the operator. + * @param approved The approval status. + * @return Whether the call was executed successfully or not + */ + function setOperator(address operator, bool approved) external returns (bool); + + /** + * @dev Returns `true` if the `operator` is approved as an operator for an `controller`. + * + * @param controller The address of the controller. + * @param operator The address of the operator. + * @return status The approval status + */ + function isOperator(address controller, address operator) external view returns (bool status); +} + +/// @dev Interface of the asynchronous deposit Vault interface of ERC7540, as defined in +/// https://eips.ethereum.org/EIPS/eip-7540 +interface IERC7540Deposit is IERC7540Operator { + event DepositRequest( + address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets + ); + /** + * @dev Transfers assets from sender into the Vault and submits a Request for asynchronous deposit. + * + * - MUST support ERC-20 approve / transferFrom on asset as a deposit Request flow. + * - MUST revert if all of assets cannot be requested for deposit. + * - owner MUST be msg.sender unless some unspecified explicit approval is given by the caller, + * approval of ERC-20 tokens from owner to sender is NOT enough. + * + * @param assets the amount of deposit assets to transfer from owner + * @param controller the controller of the request who will be able to operate the request + * @param owner the source of the deposit assets + * + * NOTE: most implementations will require pre-approval of the Vault with the Vault's underlying asset token. + */ + + function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId); + + /** + * @dev Returns the amount of requested assets in Pending state. + * + * - MUST NOT include any assets in Claimable state for deposit or mint. + * - MUST NOT show any variations depending on the caller. + * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input. + */ + function pendingDepositRequest(uint256 requestId, address controller) + external + view + returns (uint256 pendingAssets); + + /** + * @dev Returns the amount of requested assets in Claimable state for the controller to deposit or mint. + * + * - MUST NOT include any assets in Pending state. + * - MUST NOT show any variations depending on the caller. + * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input. + */ + function claimableDepositRequest(uint256 requestId, address controller) + external + view + returns (uint256 claimableAssets); + + /** + * @dev Mints shares Vault shares to receiver by claiming the Request of the controller. + * + * - MUST emit the Deposit event. + * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator. + */ + function deposit(uint256 assets, address receiver, address controller) external returns (uint256 shares); + + /** + * @dev Mints exactly shares Vault shares to receiver by claiming the Request of the controller. + * + * - MUST emit the Deposit event. + * - controller MUST equal msg.sender unless the controller has approved the msg.sender as an operator. + */ + function mint(uint256 shares, address receiver, address controller) external returns (uint256 assets); +} + +/// @dev Interface of the asynchronous deposit Vault interface of ERC7540, as defined in +/// https://eips.ethereum.org/EIPS/eip-7540 +interface IERC7540Redeem is IERC7540Operator { + event RedeemRequest( + address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 assets + ); + + /** + * @dev Assumes control of shares from sender into the Vault and submits a Request for asynchronous redeem. + * + * - MUST support a redeem Request flow where the control of shares is taken from sender directly + * where msg.sender has ERC-20 approval over the shares of owner. + * - MUST revert if all of shares cannot be requested for redeem. + * + * @param shares the amount of shares to be redeemed to transfer from owner + * @param controller the controller of the request who will be able to operate the request + * @param owner the source of the shares to be redeemed + * + * NOTE: most implementations will require pre-approval of the Vault with the Vault's share token. + */ + function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId); + + /** + * @dev Returns the amount of requested shares in Pending state. + * + * - MUST NOT include any shares in Claimable state for redeem or withdraw. + * - MUST NOT show any variations depending on the caller. + * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input. + */ + function pendingRedeemRequest(uint256 requestId, address controller) + external + view + returns (uint256 pendingShares); + + /** + * @dev Returns the amount of requested shares in Claimable state for the controller to redeem or withdraw. + * + * - MUST NOT include any shares in Pending state for redeem or withdraw. + * - MUST NOT show any variations depending on the caller. + * - MUST NOT revert unless due to integer overflow caused by an unreasonably large input. + */ + function claimableRedeemRequest(uint256 requestId, address controller) + external + view + returns (uint256 claimableShares); +} + +/// @dev Interface of the fully asynchronous Vault interface of ERC7540, as defined in +/// https://eips.ethereum.org/EIPS/eip-7540 +interface IERC7540 is IERC7540Deposit, IERC7540Redeem, IERC7575 {} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC7575.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC7575.sol new file mode 100644 index 000000000..207e3e7fe --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IERC7575.sol @@ -0,0 +1,241 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import {IERC165} from "./IERC165.sol"; + +/// @dev Interface of the ERC7575 "Multi-Asset ERC-4626 Vaults", as defined in +/// https://eips.ethereum.org/EIPS/eip-7575 +interface IERC7575 is IERC165 { + event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); + event Withdraw( + address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares + ); + + /** + * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. + * + * - MUST be an ERC-20 token contract. + * - MUST NOT revert. + */ + function asset() external view returns (address assetTokenAddress); + + /** + * @dev Returns the address of the share token + * + * - MUST be an ERC-20 token contract. + * - MUST NOT revert. + */ + function share() external view returns (address shareTokenAddress); + + /** + * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal + * scenario where all the conditions are met. + * + * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + * - MUST NOT show any variations depending on the caller. + * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + * - MUST NOT revert. + * + * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the + * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and + * from. + */ + function convertToShares(uint256 assets) external view returns (uint256 shares); + + /** + * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal + * scenario where all the conditions are met. + * + * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + * - MUST NOT show any variations depending on the caller. + * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + * - MUST NOT revert. + * + * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the + * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and + * from. + */ + function convertToAssets(uint256 shares) external view returns (uint256 assets); + + /** + * @dev Returns the total amount of the underlying asset that is “managed” by Vault. + * + * - SHOULD include any compounding that occurs from yield. + * - MUST be inclusive of any fees that are charged against assets in the Vault. + * - MUST NOT revert. + */ + function totalAssets() external view returns (uint256 totalManagedAssets); + + /** + * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, + * through a deposit call. + * + * - MUST return a limited value if receiver is subject to some deposit limit. + * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. + * - MUST NOT revert. + */ + function maxDeposit(address receiver) external view returns (uint256 maxAssets); + + /** + * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given + * current on-chain conditions. + * + * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit + * call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called + * in the same transaction. + * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the + * deposit would be accepted, regardless if the user has enough tokens approved, etc. + * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + * - MUST NOT revert. + * + * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in + * share price or some other type of condition, meaning the depositor will lose assets by depositing. + */ + function previewDeposit(uint256 assets) external view returns (uint256 shares); + + /** + * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. + * + * - MUST emit the Deposit event. + * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + * deposit execution, and are accounted for during deposit. + * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not + * approving enough underlying tokens to the Vault contract, etc). + * + * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + */ + function deposit(uint256 assets, address receiver) external returns (uint256 shares); + + /** + * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. + * - MUST return a limited value if receiver is subject to some mint limit. + * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. + * - MUST NOT revert. + */ + function maxMint(address receiver) external view returns (uint256 maxShares); + + /** + * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given + * current on-chain conditions. + * + * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call + * in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the + * same transaction. + * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint + * would be accepted, regardless if the user has enough tokens approved, etc. + * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + * - MUST NOT revert. + * + * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in + * share price or some other type of condition, meaning the depositor will lose assets by minting. + */ + function previewMint(uint256 shares) external view returns (uint256 assets); + + /** + * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. + * + * - MUST emit the Deposit event. + * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint + * execution, and are accounted for during mint. + * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not + * approving enough underlying tokens to the Vault contract, etc). + * + * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + */ + function mint(uint256 shares, address receiver) external returns (uint256 assets); + + /** + * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the + * Vault, through a withdraw call. + * + * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + * - MUST NOT revert. + */ + function maxWithdraw(address owner) external view returns (uint256 maxAssets); + + /** + * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, + * given current on-chain conditions. + * + * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw + * call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if + * called + * in the same transaction. + * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though + * the withdrawal would be accepted, regardless if the user has enough shares, etc. + * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + * - MUST NOT revert. + * + * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in + * share price or some other type of condition, meaning the depositor will lose assets by depositing. + */ + function previewWithdraw(uint256 assets) external view returns (uint256 shares); + + /** + * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver. + * + * - MUST emit the Withdraw event. + * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + * withdraw execution, and are accounted for during withdraw. + * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner + * not having enough shares, etc). + * + * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + * Those methods should be performed separately. + */ + function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); + + /** + * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, + * through a redeem call. + * + * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. + * - MUST NOT revert. + */ + function maxRedeem(address owner) external view returns (uint256 maxShares); + + /** + * @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, + * given current on-chain conditions. + * + * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call + * in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the + * same transaction. + * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the + * redemption would be accepted, regardless if the user has enough shares, etc. + * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + * - MUST NOT revert. + * + * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in + * share price or some other type of condition, meaning the depositor will lose assets by redeeming. + */ + function previewRedeem(uint256 shares) external view returns (uint256 assets); + + /** + * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver. + * + * - MUST emit the Withdraw event. + * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + * redeem execution, and are accounted for during redeem. + * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner + * not having enough shares, etc). + * + * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + * Those methods should be performed separately. + */ + function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); +} + +/// @dev Interface of the ERC20 share token, as defined in +/// https://eips.ethereum.org/EIPS/eip-7575 +interface IERC7575Share is IERC165 { + event VaultUpdate(address indexed asset, address vault); + + /** + * @dev Returns the address of the Vault for the given asset. + * + * @param asset the ERC-20 token to deposit with into the Vault + */ + function vault(address asset) external view returns (address); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IMulticall3.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IMulticall3.sol new file mode 100644 index 000000000..0d031b71d --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/interfaces/IMulticall3.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +interface IMulticall3 { + struct Call { + address target; + bytes callData; + } + + struct Call3 { + address target; + bool allowFailure; + bytes callData; + } + + struct Call3Value { + address target; + bool allowFailure; + uint256 value; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + function aggregate(Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes[] memory returnData); + + function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); + + function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData); + + function blockAndAggregate(Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); + + function getBasefee() external view returns (uint256 basefee); + + function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash); + + function getBlockNumber() external view returns (uint256 blockNumber); + + function getChainId() external view returns (uint256 chainid); + + function getCurrentBlockCoinbase() external view returns (address coinbase); + + function getCurrentBlockDifficulty() external view returns (uint256 difficulty); + + function getCurrentBlockGasLimit() external view returns (uint256 gaslimit); + + function getCurrentBlockTimestamp() external view returns (uint256 timestamp); + + function getEthBalance(address addr) external view returns (uint256 balance); + + function getLastBlockHash() external view returns (bytes32 blockHash); + + function tryAggregate(bool requireSuccess, Call[] calldata calls) + external + payable + returns (Result[] memory returnData); + + function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/safeconsole.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/safeconsole.sol new file mode 100644 index 000000000..87c475a5b --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/src/safeconsole.sol @@ -0,0 +1,13937 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +/// @author philogy +/// @dev Code generated automatically by script. +library safeconsole { + uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67; + + // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374) + // for the view-to-pure log trick. + function _sendLogPayload(uint256 offset, uint256 size) private pure { + function(uint256, uint256) internal view fnIn = _sendLogPayloadView; + function(uint256, uint256) internal pure pureSendLogPayload; + /// @solidity memory-safe-assembly + assembly { + pureSendLogPayload := fnIn + } + pureSendLogPayload(offset, size); + } + + function _sendLogPayloadView(uint256 offset, uint256 size) private view { + /// @solidity memory-safe-assembly + assembly { + pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0)) + } + } + + function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure { + function(uint256, uint256, uint256) internal view fnIn = _memcopyView; + function(uint256, uint256, uint256) internal pure pureMemcopy; + /// @solidity memory-safe-assembly + assembly { + pureMemcopy := fnIn + } + pureMemcopy(fromOffset, toOffset, length); + } + + function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view { + /// @solidity memory-safe-assembly + assembly { + pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length)) + } + } + + function logMemory(uint256 offset, uint256 length) internal pure { + if (offset >= 0x60) { + // Sufficient memory before slice to prepare call header. + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(sub(offset, 0x60)) + m1 := mload(sub(offset, 0x40)) + m2 := mload(sub(offset, 0x20)) + // Selector of `log(bytes)`. + mstore(sub(offset, 0x60), 0x0be77f56) + mstore(sub(offset, 0x40), 0x20) + mstore(sub(offset, 0x20), length) + } + _sendLogPayload(offset - 0x44, length + 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(sub(offset, 0x60), m0) + mstore(sub(offset, 0x40), m1) + mstore(sub(offset, 0x20), m2) + } + } else { + // Insufficient space, so copy slice forward, add header and reverse. + bytes32 m0; + bytes32 m1; + bytes32 m2; + uint256 endOffset = offset + length; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(add(endOffset, 0x00)) + m1 := mload(add(endOffset, 0x20)) + m2 := mload(add(endOffset, 0x40)) + } + _memcopy(offset, offset + 0x60, length); + /// @solidity memory-safe-assembly + assembly { + // Selector of `log(bytes)`. + mstore(add(offset, 0x00), 0x0be77f56) + mstore(add(offset, 0x20), 0x20) + mstore(add(offset, 0x40), length) + } + _sendLogPayload(offset + 0x1c, length + 0x44); + _memcopy(offset + 0x60, offset, length); + /// @solidity memory-safe-assembly + assembly { + mstore(add(endOffset, 0x00), m0) + mstore(add(endOffset, 0x20), m1) + mstore(add(endOffset, 0x40), m2) + } + } + } + + function log(address p0) internal pure { + bytes32 m0; + bytes32 m1; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(address)`. + mstore(0x00, 0x2c2ecbc2) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(bool p0) internal pure { + bytes32 m0; + bytes32 m1; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(bool)`. + mstore(0x00, 0x32458eed) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(uint256 p0) internal pure { + bytes32 m0; + bytes32 m1; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(uint256)`. + mstore(0x00, 0xf82c50f1) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(bytes32 p0) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(string)`. + mstore(0x00, 0x41304fac) + mstore(0x20, 0x20) + writeString(0x40, p0) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,address)`. + mstore(0x00, 0xdaf0d4aa) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,bool)`. + mstore(0x00, 0x75b605d3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,uint256)`. + mstore(0x00, 0x8309e8a8) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,string)`. + mstore(0x00, 0x759f86bb) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,address)`. + mstore(0x00, 0x853c4849) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,bool)`. + mstore(0x00, 0x2a110e83) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,uint256)`. + mstore(0x00, 0x399174d3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,string)`. + mstore(0x00, 0x8feac525) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,address)`. + mstore(0x00, 0x69276c86) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,bool)`. + mstore(0x00, 0x1c9d7eb3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,uint256)`. + mstore(0x00, 0xf666715a) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,string)`. + mstore(0x00, 0x643fd0df) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,address)`. + mstore(0x00, 0x319af333) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,bool)`. + mstore(0x00, 0xc3b55635) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,uint256)`. + mstore(0x00, 0xb60e72cc) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,string)`. + mstore(0x00, 0x4b5c4277) + mstore(0x20, 0x40) + mstore(0x40, 0x80) + writeString(0x60, p0) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,address)`. + mstore(0x00, 0x018c84c2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,bool)`. + mstore(0x00, 0xf2a66286) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,uint256)`. + mstore(0x00, 0x17fe6185) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,address,string)`. + mstore(0x00, 0x007150be) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,address)`. + mstore(0x00, 0xf11699ed) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,bool)`. + mstore(0x00, 0xeb830c92) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,uint256)`. + mstore(0x00, 0x9c4f99fb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,bool,string)`. + mstore(0x00, 0x212255cc) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,address)`. + mstore(0x00, 0x7bc0d848) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,bool)`. + mstore(0x00, 0x678209a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,uint256)`. + mstore(0x00, 0xb69bcaf6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,uint256,string)`. + mstore(0x00, 0xa1f2e8aa) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,address)`. + mstore(0x00, 0xf08744e8) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,bool)`. + mstore(0x00, 0xcf020fb1) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,uint256)`. + mstore(0x00, 0x67dd6ff1) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(address,string,string)`. + mstore(0x00, 0xfb772265) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bool p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,address)`. + mstore(0x00, 0xd2763667) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,bool)`. + mstore(0x00, 0x18c9c746) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,uint256)`. + mstore(0x00, 0x5f7b9afb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,address,string)`. + mstore(0x00, 0xde9a9270) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,address)`. + mstore(0x00, 0x1078f68d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,bool)`. + mstore(0x00, 0x50709698) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,uint256)`. + mstore(0x00, 0x12f21602) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,bool,string)`. + mstore(0x00, 0x2555fa46) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,address)`. + mstore(0x00, 0x088ef9d2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,bool)`. + mstore(0x00, 0xe8defba9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,uint256)`. + mstore(0x00, 0x37103367) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,uint256,string)`. + mstore(0x00, 0xc3fc3970) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,address)`. + mstore(0x00, 0x9591b953) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,bool)`. + mstore(0x00, 0xdbb4c247) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,uint256)`. + mstore(0x00, 0x1093ee11) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(bool,string,string)`. + mstore(0x00, 0xb076847f) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(uint256 p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,address)`. + mstore(0x00, 0xbcfd9be0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,bool)`. + mstore(0x00, 0x9b6ec042) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,uint256)`. + mstore(0x00, 0x5a9b5ed5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,address,string)`. + mstore(0x00, 0x63cb41f9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,address)`. + mstore(0x00, 0x35085f7b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,bool)`. + mstore(0x00, 0x20718650) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,uint256)`. + mstore(0x00, 0x20098014) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,bool,string)`. + mstore(0x00, 0x85775021) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,address)`. + mstore(0x00, 0x5c96b331) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,bool)`. + mstore(0x00, 0x4766da72) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,uint256)`. + mstore(0x00, 0xd1ed7a3c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,uint256,string)`. + mstore(0x00, 0x71d04af2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,address)`. + mstore(0x00, 0x7afac959) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,bool)`. + mstore(0x00, 0x4ceda75a) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,uint256)`. + mstore(0x00, 0x37aa7d4c) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(uint256,string,string)`. + mstore(0x00, 0xb115611f) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,address)`. + mstore(0x00, 0xfcec75e0) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,bool)`. + mstore(0x00, 0xc91d5ed4) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,uint256)`. + mstore(0x00, 0x0d26b925) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,address,string)`. + mstore(0x00, 0xe0e9ad4f) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,address)`. + mstore(0x00, 0x932bbb38) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,bool)`. + mstore(0x00, 0x850b7ad6) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,uint256)`. + mstore(0x00, 0xc95958d6) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,bool,string)`. + mstore(0x00, 0xe298f47d) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,address)`. + mstore(0x00, 0x1c7ec448) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,bool)`. + mstore(0x00, 0xca7733b1) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,uint256)`. + mstore(0x00, 0xca47c4eb) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,uint256,string)`. + mstore(0x00, 0x5970e089) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,address)`. + mstore(0x00, 0x95ed0195) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,bool)`. + mstore(0x00, 0xb0e0f9b5) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,uint256)`. + mstore(0x00, 0x5821efa1) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + // Selector of `log(string,string,string)`. + mstore(0x00, 0x2ced7cef) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, 0xe0) + writeString(0x80, p0) + writeString(0xc0, p1) + writeString(0x100, p2) + } + _sendLogPayload(0x1c, 0x124); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + } + } + + function log(address p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,address)`. + mstore(0x00, 0x665bf134) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,bool)`. + mstore(0x00, 0x0e378994) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,uint256)`. + mstore(0x00, 0x94250d77) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,address,string)`. + mstore(0x00, 0xf808da20) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,address)`. + mstore(0x00, 0x9f1bc36e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,bool)`. + mstore(0x00, 0x2cd4134a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,uint256)`. + mstore(0x00, 0x3971e78c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,bool,string)`. + mstore(0x00, 0xaa6540c8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,address)`. + mstore(0x00, 0x8da6def5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,bool)`. + mstore(0x00, 0x9b4254e2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,uint256)`. + mstore(0x00, 0xbe553481) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,uint256,string)`. + mstore(0x00, 0xfdb4f990) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,address)`. + mstore(0x00, 0x8f736d16) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,bool)`. + mstore(0x00, 0x6f1a594e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,uint256)`. + mstore(0x00, 0xef1cefe7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,address,string,string)`. + mstore(0x00, 0x21bdaf25) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,address)`. + mstore(0x00, 0x660375dd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,bool)`. + mstore(0x00, 0xa6f50b0f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,uint256)`. + mstore(0x00, 0xa75c59de) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,address,string)`. + mstore(0x00, 0x2dd778e6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,address)`. + mstore(0x00, 0xcf394485) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,bool)`. + mstore(0x00, 0xcac43479) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,uint256)`. + mstore(0x00, 0x8c4e5de6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,bool,string)`. + mstore(0x00, 0xdfc4a2e8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,address)`. + mstore(0x00, 0xccf790a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,bool)`. + mstore(0x00, 0xc4643e20) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,uint256)`. + mstore(0x00, 0x386ff5f4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,uint256,string)`. + mstore(0x00, 0x0aa6cfad) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,address)`. + mstore(0x00, 0x19fd4956) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,bool)`. + mstore(0x00, 0x50ad461d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,uint256)`. + mstore(0x00, 0x80e6a20b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,bool,string,string)`. + mstore(0x00, 0x475c5c33) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,address)`. + mstore(0x00, 0x478d1c62) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,bool)`. + mstore(0x00, 0xa1bcc9b3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,uint256)`. + mstore(0x00, 0x100f650e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,address,string)`. + mstore(0x00, 0x1da986ea) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,address)`. + mstore(0x00, 0xa31bfdcc) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,bool)`. + mstore(0x00, 0x3bf5e537) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,uint256)`. + mstore(0x00, 0x22f6b999) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,bool,string)`. + mstore(0x00, 0xc5ad85f9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,address)`. + mstore(0x00, 0x20e3984d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,bool)`. + mstore(0x00, 0x66f1bc67) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,uint256)`. + mstore(0x00, 0x34f0e636) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,uint256,string)`. + mstore(0x00, 0x4a28c017) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,address)`. + mstore(0x00, 0x5c430d47) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,bool)`. + mstore(0x00, 0xcf18105c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,uint256)`. + mstore(0x00, 0xbf01f891) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,uint256,string,string)`. + mstore(0x00, 0x88a8c406) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,address)`. + mstore(0x00, 0x0d36fa20) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,bool)`. + mstore(0x00, 0x0df12b76) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,uint256)`. + mstore(0x00, 0x457fe3cf) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,address,string)`. + mstore(0x00, 0xf7e36245) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,address)`. + mstore(0x00, 0x205871c2) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,bool)`. + mstore(0x00, 0x5f1d5c9f) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,uint256)`. + mstore(0x00, 0x515e38b6) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,bool,string)`. + mstore(0x00, 0xbc0b61fe) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,address)`. + mstore(0x00, 0x63183678) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,bool)`. + mstore(0x00, 0x0ef7e050) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,uint256)`. + mstore(0x00, 0x1dc8e1b8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,uint256,string)`. + mstore(0x00, 0x448830a8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,address)`. + mstore(0x00, 0xa04e2f87) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,bool)`. + mstore(0x00, 0x35a5071f) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,uint256)`. + mstore(0x00, 0x159f8927) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(address,string,string,string)`. + mstore(0x00, 0x5d02c50b) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bool p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,address)`. + mstore(0x00, 0x1d14d001) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,bool)`. + mstore(0x00, 0x46600be0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,uint256)`. + mstore(0x00, 0x0c66d1be) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,address,string)`. + mstore(0x00, 0xd812a167) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,address)`. + mstore(0x00, 0x1c41a336) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,bool)`. + mstore(0x00, 0x6a9c478b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,uint256)`. + mstore(0x00, 0x07831502) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,bool,string)`. + mstore(0x00, 0x4a66cb34) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,address)`. + mstore(0x00, 0x136b05dd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,bool)`. + mstore(0x00, 0xd6019f1c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,uint256)`. + mstore(0x00, 0x7bf181a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,uint256,string)`. + mstore(0x00, 0x51f09ff8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,address)`. + mstore(0x00, 0x6f7c603e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,bool)`. + mstore(0x00, 0xe2bfd60b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,uint256)`. + mstore(0x00, 0xc21f64c7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,address,string,string)`. + mstore(0x00, 0xa73c1db6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,address)`. + mstore(0x00, 0xf4880ea4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,bool)`. + mstore(0x00, 0xc0a302d8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,uint256)`. + mstore(0x00, 0x4c123d57) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,address,string)`. + mstore(0x00, 0xa0a47963) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,address)`. + mstore(0x00, 0x8c329b1a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,bool)`. + mstore(0x00, 0x3b2a5ce0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,uint256)`. + mstore(0x00, 0x6d7045c1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,bool,string)`. + mstore(0x00, 0x2ae408d4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,address)`. + mstore(0x00, 0x54a7a9a0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,bool)`. + mstore(0x00, 0x619e4d0e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,uint256)`. + mstore(0x00, 0x0bb00eab) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,uint256,string)`. + mstore(0x00, 0x7dd4d0e0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,address)`. + mstore(0x00, 0xf9ad2b89) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,bool)`. + mstore(0x00, 0xb857163a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,uint256)`. + mstore(0x00, 0xe3a9ca2f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,bool,string,string)`. + mstore(0x00, 0x6d1e8751) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,address)`. + mstore(0x00, 0x26f560a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,bool)`. + mstore(0x00, 0xb4c314ff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,uint256)`. + mstore(0x00, 0x1537dc87) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,address,string)`. + mstore(0x00, 0x1bb3b09a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,address)`. + mstore(0x00, 0x9acd3616) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,bool)`. + mstore(0x00, 0xceb5f4d7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,uint256)`. + mstore(0x00, 0x7f9bbca2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,bool,string)`. + mstore(0x00, 0x9143dbb1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,address)`. + mstore(0x00, 0x00dd87b9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,bool)`. + mstore(0x00, 0xbe984353) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,uint256)`. + mstore(0x00, 0x374bb4b2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,uint256,string)`. + mstore(0x00, 0x8e69fb5d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,address)`. + mstore(0x00, 0xfedd1fff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,bool)`. + mstore(0x00, 0xe5e70b2b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,uint256)`. + mstore(0x00, 0x6a1199e2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,uint256,string,string)`. + mstore(0x00, 0xf5bc2249) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,address)`. + mstore(0x00, 0x2b2b18dc) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,bool)`. + mstore(0x00, 0x6dd434ca) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,uint256)`. + mstore(0x00, 0xa5cada94) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,address,string)`. + mstore(0x00, 0x12d6c788) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,address)`. + mstore(0x00, 0x538e06ab) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,bool)`. + mstore(0x00, 0xdc5e935b) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,uint256)`. + mstore(0x00, 0x1606a393) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,bool,string)`. + mstore(0x00, 0x483d0416) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,address)`. + mstore(0x00, 0x1596a1ce) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,bool)`. + mstore(0x00, 0x6b0e5d53) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,uint256)`. + mstore(0x00, 0x28863fcb) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,uint256,string)`. + mstore(0x00, 0x1ad96de6) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,address)`. + mstore(0x00, 0x97d394d8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,bool)`. + mstore(0x00, 0x1e4b87e5) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,uint256)`. + mstore(0x00, 0x7be0c3eb) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(bool,string,string,string)`. + mstore(0x00, 0x1762e32a) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(uint256 p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,address)`. + mstore(0x00, 0x2488b414) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,bool)`. + mstore(0x00, 0x091ffaf5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,uint256)`. + mstore(0x00, 0x736efbb6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,address,string)`. + mstore(0x00, 0x031c6f73) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,address)`. + mstore(0x00, 0xef72c513) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,bool)`. + mstore(0x00, 0xe351140f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,uint256)`. + mstore(0x00, 0x5abd992a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,bool,string)`. + mstore(0x00, 0x90fb06aa) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,address)`. + mstore(0x00, 0x15c127b5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,bool)`. + mstore(0x00, 0x5f743a7c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,uint256)`. + mstore(0x00, 0x0c9cd9c1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,uint256,string)`. + mstore(0x00, 0xddb06521) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,address)`. + mstore(0x00, 0x9cba8fff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,bool)`. + mstore(0x00, 0xcc32ab07) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,uint256)`. + mstore(0x00, 0x46826b5d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,address,string,string)`. + mstore(0x00, 0x3e128ca3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,address)`. + mstore(0x00, 0xa1ef4cbb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,bool)`. + mstore(0x00, 0x454d54a5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,uint256)`. + mstore(0x00, 0x078287f5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,address,string)`. + mstore(0x00, 0xade052c7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,address)`. + mstore(0x00, 0x69640b59) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,bool)`. + mstore(0x00, 0xb6f577a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,uint256)`. + mstore(0x00, 0x7464ce23) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,bool,string)`. + mstore(0x00, 0xdddb9561) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,address)`. + mstore(0x00, 0x88cb6041) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,bool)`. + mstore(0x00, 0x91a02e2a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,uint256)`. + mstore(0x00, 0xc6acc7a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,uint256,string)`. + mstore(0x00, 0xde03e774) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,address)`. + mstore(0x00, 0xef529018) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,bool)`. + mstore(0x00, 0xeb928d7f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,uint256)`. + mstore(0x00, 0x2c1d0746) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,bool,string,string)`. + mstore(0x00, 0x68c8b8bd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,address)`. + mstore(0x00, 0x56a5d1b1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,bool)`. + mstore(0x00, 0x15cac476) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,uint256)`. + mstore(0x00, 0x88f6e4b2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,address,string)`. + mstore(0x00, 0x6cde40b8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,address)`. + mstore(0x00, 0x9a816a83) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,bool)`. + mstore(0x00, 0xab085ae6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,uint256)`. + mstore(0x00, 0xeb7f6fd2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,bool,string)`. + mstore(0x00, 0xa5b4fc99) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,address)`. + mstore(0x00, 0xfa8185af) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,bool)`. + mstore(0x00, 0xc598d185) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + /// @solidity memory-safe-assembly + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,uint256)`. + mstore(0x00, 0x193fb800) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,uint256,string)`. + mstore(0x00, 0x59cfcbe3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,address)`. + mstore(0x00, 0x42d21db7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,bool)`. + mstore(0x00, 0x7af6ab25) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,uint256)`. + mstore(0x00, 0x5da297eb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,uint256,string,string)`. + mstore(0x00, 0x27d8afd2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,address)`. + mstore(0x00, 0x6168ed61) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,bool)`. + mstore(0x00, 0x90c30a56) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,uint256)`. + mstore(0x00, 0xe8d3018d) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,address,string)`. + mstore(0x00, 0x9c3adfa1) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,address)`. + mstore(0x00, 0xae2ec581) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,bool)`. + mstore(0x00, 0xba535d9c) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,uint256)`. + mstore(0x00, 0xcf009880) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,bool,string)`. + mstore(0x00, 0xd2d423cd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,address)`. + mstore(0x00, 0x3b2279b4) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,bool)`. + mstore(0x00, 0x691a8f74) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,uint256)`. + mstore(0x00, 0x82c25b74) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,uint256,string)`. + mstore(0x00, 0xb7b914ca) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,address)`. + mstore(0x00, 0xd583c602) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,bool)`. + mstore(0x00, 0xb3a6b6bd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,uint256)`. + mstore(0x00, 0xb028c9bd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(uint256,string,string,string)`. + mstore(0x00, 0x21ad0683) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,address)`. + mstore(0x00, 0xed8f28f6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,bool)`. + mstore(0x00, 0xb59dbd60) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,uint256)`. + mstore(0x00, 0x8ef3f399) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,address,string)`. + mstore(0x00, 0x800a1c67) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,address)`. + mstore(0x00, 0x223603bd) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,bool)`. + mstore(0x00, 0x79884c2b) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,uint256)`. + mstore(0x00, 0x3e9f866a) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,bool,string)`. + mstore(0x00, 0x0454c079) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,address)`. + mstore(0x00, 0x63fb8bc5) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,bool)`. + mstore(0x00, 0xfc4845f0) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,uint256)`. + mstore(0x00, 0xf8f51b1e) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,uint256,string)`. + mstore(0x00, 0x5a477632) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,address)`. + mstore(0x00, 0xaabc9a31) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,bool)`. + mstore(0x00, 0x5f15d28c) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,uint256)`. + mstore(0x00, 0x91d1112e) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,address,string,string)`. + mstore(0x00, 0x245986f2) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,address)`. + mstore(0x00, 0x33e9dd1d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,bool)`. + mstore(0x00, 0x958c28c6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,uint256)`. + mstore(0x00, 0x5d08bb05) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,address,string)`. + mstore(0x00, 0x2d8e33a4) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,address)`. + mstore(0x00, 0x7190a529) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,bool)`. + mstore(0x00, 0x895af8c5) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,uint256)`. + mstore(0x00, 0x8e3f78a9) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,bool,string)`. + mstore(0x00, 0x9d22d5dd) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,address)`. + mstore(0x00, 0x935e09bf) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,bool)`. + mstore(0x00, 0x8af7cf8a) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,uint256)`. + mstore(0x00, 0x64b5bb67) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,uint256,string)`. + mstore(0x00, 0x742d6ee7) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,address)`. + mstore(0x00, 0xe0625b29) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,bool)`. + mstore(0x00, 0x3f8a701d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,uint256)`. + mstore(0x00, 0x24f91465) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,bool,string,string)`. + mstore(0x00, 0xa826caeb) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,address)`. + mstore(0x00, 0x5ea2b7ae) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,bool)`. + mstore(0x00, 0x82112a42) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,uint256)`. + mstore(0x00, 0x4f04fdc6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,address,string)`. + mstore(0x00, 0x9ffb2f93) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,address)`. + mstore(0x00, 0xe0e95b98) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,bool)`. + mstore(0x00, 0x354c36d6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,uint256)`. + mstore(0x00, 0xe41b6f6f) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,bool,string)`. + mstore(0x00, 0xabf73a98) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,address)`. + mstore(0x00, 0xe21de278) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,bool)`. + mstore(0x00, 0x7626db92) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,uint256)`. + mstore(0x00, 0xa7a87853) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,uint256,string)`. + mstore(0x00, 0x854b3496) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,address)`. + mstore(0x00, 0x7c4632a4) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,bool)`. + mstore(0x00, 0x7d24491d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,uint256)`. + mstore(0x00, 0xc67ea9d1) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,uint256,string,string)`. + mstore(0x00, 0x5ab84e1f) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,address)`. + mstore(0x00, 0x439c7bef) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,bool)`. + mstore(0x00, 0x5ccd4e37) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,uint256)`. + mstore(0x00, 0x7cc3c607) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,address,string)`. + mstore(0x00, 0xeb1bff80) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,address)`. + mstore(0x00, 0xc371c7db) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,bool)`. + mstore(0x00, 0x40785869) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,uint256)`. + mstore(0x00, 0xd6aefad2) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,bool,string)`. + mstore(0x00, 0x5e84b0ea) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,address)`. + mstore(0x00, 0x1023f7b2) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,bool)`. + mstore(0x00, 0xc3a8a654) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,uint256)`. + mstore(0x00, 0xf45d7d2c) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,uint256,string)`. + mstore(0x00, 0x5d1a971a) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,address)`. + mstore(0x00, 0x6d572f44) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,bool)`. + mstore(0x00, 0x2c1754ed) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,uint256)`. + mstore(0x00, 0x8eafb02b) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + bytes32 m11; + bytes32 m12; + /// @solidity memory-safe-assembly + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + m11 := mload(0x160) + m12 := mload(0x180) + // Selector of `log(string,string,string,string)`. + mstore(0x00, 0xde68f20a) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, 0x140) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + writeString(0x160, p3) + } + _sendLogPayload(0x1c, 0x184); + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + mstore(0x160, m11) + mstore(0x180, m12) + } + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/CommonBase.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/CommonBase.t.sol new file mode 100644 index 000000000..4a6eb34fd --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/CommonBase.t.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {CommonBase} from "../src/Base.sol"; +import {StdConstants} from "../src/StdConstants.sol"; +import {Test} from "../src/Test.sol"; + +contract CommonBaseTest is Test { + function testVmAddressValue() public pure { + assertEq(VM_ADDRESS, address(StdConstants.VM)); + } + + function testConsoleValue() public pure { + assertEq(CONSOLE, StdConstants.CONSOLE); + } + + function testCreate2FactoryValue() public pure { + assertEq(CREATE2_FACTORY, StdConstants.CREATE2_FACTORY); + } + + function testDefaultSenderValue() public pure { + assertEq(DEFAULT_SENDER, StdConstants.DEFAULT_SENDER); + } + + function testDefaultTestContractValue() public pure { + assertEq(DEFAULT_TEST_CONTRACT, StdConstants.DEFAULT_TEST_CONTRACT); + } + + function testMulticall3AddressValue() public pure { + assertEq(MULTICALL3_ADDRESS, address(StdConstants.MULTICALL3_ADDRESS)); + } + + function testSecp256k1OrderValue() public pure { + assertEq(SECP256K1_ORDER, StdConstants.SECP256K1_ORDER); + } + + function testUint256MaxValue() public pure { + assertEq(UINT256_MAX, type(uint256).max); + } + + function testVmValue() public pure { + assertEq(address(vm), address(StdConstants.VM)); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/Config.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/Config.t.sol new file mode 100644 index 000000000..8e2342cad --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/Config.t.sol @@ -0,0 +1,352 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {Test} from "../src/Test.sol"; +import {Config} from "../src/Config.sol"; +import {StdConfig} from "../src/StdConfig.sol"; + +contract ConfigTest is Test, Config { + function setUp() public { + vm.setEnv("MAINNET_RPC", "https://eth.llamarpc.com"); + vm.setEnv("WETH_MAINNET", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"); + vm.setEnv("OPTIMISM_RPC", "https://mainnet.optimism.io"); + vm.setEnv("WETH_OPTIMISM", "0x4200000000000000000000000000000000000006"); + } + + function test_loadConfig() public { + // Deploy the config contract with the test fixture. + _loadConfig("./test/fixtures/config.toml", false); + + // -- MAINNET -------------------------------------------------------------- + + // Read and assert RPC URL for Mainnet (chain ID 1) + assertEq(config.getRpcUrl(1), "https://eth.llamarpc.com"); + + // Read and assert boolean values + assertTrue(config.get(1, "is_live").toBool()); + bool[] memory bool_array = config.get(1, "bool_array").toBoolArray(); + assertTrue(bool_array[0]); + assertFalse(bool_array[1]); + + // Read and assert address values + assertEq(config.get(1, "weth").toAddress(), 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); + address[] memory address_array = config.get(1, "deps").toAddressArray(); + assertEq(address_array[0], 0x0000000000000000000000000000000000000000); + assertEq(address_array[1], 0x1111111111111111111111111111111111111111); + + // Read and assert bytes32 values + assertEq(config.get(1, "word").toBytes32(), bytes32(uint256(1234))); + bytes32[] memory bytes32_array = config.get(1, "word_array").toBytes32Array(); + assertEq(bytes32_array[0], bytes32(uint256(5678))); + assertEq(bytes32_array[1], bytes32(uint256(9999))); + + // Read and assert uint values + assertEq(config.get(1, "number").toUint256(), 1234); + uint256[] memory uint_array = config.get(1, "number_array").toUint256Array(); + assertEq(uint_array[0], 5678); + assertEq(uint_array[1], 9999); + + // Read and assert int values + assertEq(config.get(1, "signed_number").toInt256(), -1234); + int256[] memory int_array = config.get(1, "signed_number_array").toInt256Array(); + assertEq(int_array[0], -5678); + assertEq(int_array[1], 9999); + + // Read and assert bytes values + assertEq(config.get(1, "b").toBytes(), hex"abcd"); + bytes[] memory bytes_array = config.get(1, "b_array").toBytesArray(); + assertEq(bytes_array[0], hex"dead"); + assertEq(bytes_array[1], hex"beef"); + + // Read and assert string values + assertEq(config.get(1, "str").toString(), "foo"); + string[] memory string_array = config.get(1, "str_array").toStringArray(); + assertEq(string_array[0], "bar"); + assertEq(string_array[1], "baz"); + + // -- OPTIMISM ------------------------------------------------------------ + + // Read and assert RPC URL for Optimism (chain ID 10) + assertEq(config.getRpcUrl(10), "https://mainnet.optimism.io"); + + // Read and assert boolean values + assertFalse(config.get(10, "is_live").toBool()); + bool_array = config.get(10, "bool_array").toBoolArray(); + assertFalse(bool_array[0]); + assertTrue(bool_array[1]); + + // Read and assert address values + assertEq(config.get(10, "weth").toAddress(), 0x4200000000000000000000000000000000000006); + address_array = config.get(10, "deps").toAddressArray(); + assertEq(address_array[0], 0x2222222222222222222222222222222222222222); + assertEq(address_array[1], 0x3333333333333333333333333333333333333333); + + // Read and assert bytes32 values + assertEq(config.get(10, "word").toBytes32(), bytes32(uint256(9999))); + bytes32_array = config.get(10, "word_array").toBytes32Array(); + assertEq(bytes32_array[0], bytes32(uint256(1234))); + assertEq(bytes32_array[1], bytes32(uint256(5678))); + + // Read and assert uint values + assertEq(config.get(10, "number").toUint256(), 9999); + uint_array = config.get(10, "number_array").toUint256Array(); + assertEq(uint_array[0], 1234); + assertEq(uint_array[1], 5678); + + // Read and assert int values + assertEq(config.get(10, "signed_number").toInt256(), 9999); + int_array = config.get(10, "signed_number_array").toInt256Array(); + assertEq(int_array[0], -1234); + assertEq(int_array[1], -5678); + + // Read and assert bytes values + assertEq(config.get(10, "b").toBytes(), hex"dcba"); + bytes_array = config.get(10, "b_array").toBytesArray(); + assertEq(bytes_array[0], hex"c0ffee"); + assertEq(bytes_array[1], hex"babe"); + + // Read and assert string values + assertEq(config.get(10, "str").toString(), "alice"); + string_array = config.get(10, "str_array").toStringArray(); + assertEq(string_array[0], "bob"); + assertEq(string_array[1], "charlie"); + } + + function test_loadConfigAndForks() public { + _loadConfigAndForks("./test/fixtures/config.toml", false); + + // assert that the map of chain id and fork ids is created and that the chain ids actually match + assertEq(forkOf[1], 0); + vm.selectFork(forkOf[1]); + assertEq(vm.getChainId(), 1); + + assertEq(forkOf[10], 1); + vm.selectFork(forkOf[10]); + assertEq(vm.getChainId(), 10); + } + + function test_writeConfig() public { + // Create a temporary copy of the config file to avoid modifying the original. + string memory originalConfig = "./test/fixtures/config.toml"; + string memory testConfig = "./test/fixtures/config.t.toml"; + vm.copyFile(originalConfig, testConfig); + + // Deploy the config contract with the temporary fixture. + _loadConfig(testConfig, false); + + // Enable writing to file bypassing the context check. + vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1))); + + { + // Update a single boolean value and verify the change. + config.set(1, "is_live", false); + + assertFalse(config.get(1, "is_live").toBool()); + + string memory content = vm.readFile(testConfig); + assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live")); + + // Update a single address value and verify the change. + address new_addr = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF; + config.set(1, "weth", new_addr); + + assertEq(config.get(1, "weth").toAddress(), new_addr); + + content = vm.readFile(testConfig); + assertEq(vm.parseTomlAddress(content, "$.mainnet.address.weth"), new_addr); + + // Update a uint array and verify the change. + uint256[] memory new_numbers = new uint256[](3); + new_numbers[0] = 1; + new_numbers[1] = 2; + new_numbers[2] = 3; + config.set(10, "number_array", new_numbers); + + uint256[] memory updated_numbers_mem = config.get(10, "number_array").toUint256Array(); + assertEq(updated_numbers_mem.length, 3); + assertEq(updated_numbers_mem[0], 1); + assertEq(updated_numbers_mem[1], 2); + assertEq(updated_numbers_mem[2], 3); + + content = vm.readFile(testConfig); + uint256[] memory updated_numbers_disk = vm.parseTomlUintArray(content, "$.optimism.uint.number_array"); + assertEq(updated_numbers_disk.length, 3); + assertEq(updated_numbers_disk[0], 1); + assertEq(updated_numbers_disk[1], 2); + assertEq(updated_numbers_disk[2], 3); + + // Update a string array and verify the change. + string[] memory new_strings = new string[](2); + new_strings[0] = "hello"; + new_strings[1] = "world"; + config.set(1, "str_array", new_strings); + + string[] memory updated_strings_mem = config.get(1, "str_array").toStringArray(); + assertEq(updated_strings_mem.length, 2); + assertEq(updated_strings_mem[0], "hello"); + assertEq(updated_strings_mem[1], "world"); + + content = vm.readFile(testConfig); + string[] memory updated_strings_disk = vm.parseTomlStringArray(content, "$.mainnet.string.str_array"); + assertEq(updated_strings_disk.length, 2); + assertEq(updated_strings_disk[0], "hello"); + assertEq(updated_strings_disk[1], "world"); + + // Create a new uint variable and verify the change. + config.set(1, "new_uint", uint256(42)); + + assertEq(config.get(1, "new_uint").toUint256(), 42); + + content = vm.readFile(testConfig); + assertEq(vm.parseTomlUint(content, "$.mainnet.uint.new_uint"), 42); + + // Create a new int variable and verify the change. + config.set(1, "new_int", int256(-42)); + + assertEq(config.get(1, "new_int").toInt256(), -42); + + content = vm.readFile(testConfig); + assertEq(vm.parseTomlInt(content, "$.mainnet.int.new_int"), -42); + + // Create a new int array and verify the change. + int256[] memory new_ints = new int256[](2); + new_ints[0] = -100; + new_ints[1] = 200; + config.set(10, "new_ints", new_ints); + + int256[] memory updated_ints_mem = config.get(10, "new_ints").toInt256Array(); + assertEq(updated_ints_mem.length, 2); + assertEq(updated_ints_mem[0], -100); + assertEq(updated_ints_mem[1], 200); + + content = vm.readFile(testConfig); + int256[] memory updated_ints_disk = vm.parseTomlIntArray(content, "$.optimism.int.new_ints"); + assertEq(updated_ints_disk.length, 2); + assertEq(updated_ints_disk[0], -100); + assertEq(updated_ints_disk[1], 200); + + // Create a new bytes32 array and verify the change. + bytes32[] memory new_words = new bytes32[](2); + new_words[0] = bytes32(uint256(0xDEAD)); + new_words[1] = bytes32(uint256(0xBEEF)); + config.set(10, "new_words", new_words); + + bytes32[] memory updated_words_mem = config.get(10, "new_words").toBytes32Array(); + assertEq(updated_words_mem.length, 2); + assertEq(updated_words_mem[0], new_words[0]); + assertEq(updated_words_mem[1], new_words[1]); + + content = vm.readFile(testConfig); + bytes32[] memory updated_words_disk = vm.parseTomlBytes32Array(content, "$.optimism.bytes32.new_words"); + assertEq(updated_words_disk.length, 2); + assertEq(vm.toString(updated_words_disk[0]), vm.toString(new_words[0])); + assertEq(vm.toString(updated_words_disk[1]), vm.toString(new_words[1])); + } + + // Clean up the temporary file. + vm.removeFile(testConfig); + } + + function test_writeUpdatesBackToFile() public { + // Create a temporary copy of the config file to avoid modifying the original. + string memory originalConfig = "./test/fixtures/config.toml"; + string memory testConfig = "./test/fixtures/write_config.t.toml"; + vm.copyFile(originalConfig, testConfig); + + // Deploy the config contract with `writeToFile = false` (disabled). + _loadConfig(testConfig, false); + + // Update a single boolean value and verify the file is NOT changed. + config.set(1, "is_live", false); + string memory content = vm.readFile(testConfig); + assertTrue(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should not be updated yet"); + + // Enable writing to file bypassing the context check. + vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1))); + + // Update the value again and verify the file IS changed. + config.set(1, "is_live", false); + content = vm.readFile(testConfig); + assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should be updated now"); + + // Disable writing to file. + config.writeUpdatesBackToFile(false); + + // Update the value again and verify the file is NOT changed. + config.set(1, "is_live", true); + content = vm.readFile(testConfig); + assertFalse(vm.parseTomlBool(content, "$.mainnet.bool.is_live"), "File should not be updated again"); + + // Clean up the temporary file. + vm.removeFile(testConfig); + } + + function testRevert_WriteToFileInForbiddenCtxt() public { + // Cannot initialize enabling writing to file unless we are in SCRIPT mode. + vm.expectRevert(StdConfig.WriteToFileInForbiddenCtxt.selector); + _loadConfig("./test/fixtures/config.toml", true); + + // Initialize with `writeToFile = false`. + _loadConfig("./test/fixtures/config.toml", false); + + // Cannot enable writing to file unless we are in SCRIPT mode. + vm.expectRevert(StdConfig.WriteToFileInForbiddenCtxt.selector); + config.writeUpdatesBackToFile(true); + } + + function testRevert_InvalidChainKey() public { + // Create a fixture with an invalid chain key + string memory invalidChainConfig = "./test/fixtures/config_invalid_chain.toml"; + vm.writeFile( + invalidChainConfig, + string.concat( + "[mainnet]\n", + "endpoint_url = \"https://eth.llamarpc.com\"\n", + "\n", + "[mainnet.uint]\n", + "valid_number = 123\n", + "\n", + "# Invalid chain key (not a number and not a valid alias)\n", + "[invalid_chain]\n", + "endpoint_url = \"https://invalid.com\"\n", + "\n", + "[invalid_chain_9999.uint]\n", + "some_value = 456\n" + ) + ); + + vm.expectRevert(abi.encodeWithSelector(StdConfig.InvalidChainKey.selector, "invalid_chain")); + new StdConfig(invalidChainConfig, false); + vm.removeFile(invalidChainConfig); + } + + function testRevert_ChainNotInitialized() public { + _loadConfig("./test/fixtures/config.toml", false); + + // Enable writing to file bypassing the context check. + vm.store(address(config), bytes32(uint256(5)), bytes32(uint256(1))); + + // Try to write a value for a non-existent chain ID + vm.expectRevert(abi.encodeWithSelector(StdConfig.ChainNotInitialized.selector, uint256(999999))); + config.set(999999, "some_key", uint256(123)); + } + + function testRevert_UnableToParseVariable() public { + // Create a temporary fixture with an unparsable variable + string memory badParseConfig = "./test/fixtures/config_bad_parse.toml"; + vm.writeFile( + badParseConfig, + string.concat( + "[mainnet]\n", + "endpoint_url = \"https://eth.llamarpc.com\"\n", + "\n", + "[mainnet.uint]\n", + "bad_value = \"not_a_number\"\n" + ) + ); + + vm.expectRevert(abi.encodeWithSelector(StdConfig.UnableToParseVariable.selector, "bad_value")); + new StdConfig(badParseConfig, false); + vm.removeFile(badParseConfig); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/LibVariable.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/LibVariable.t.sol new file mode 100644 index 000000000..2fc00a91a --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/LibVariable.t.sol @@ -0,0 +1,434 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {Test} from "../src/Test.sol"; +import {Variable, Type, TypeKind, LibVariable} from "../src/LibVariable.sol"; + +contract LibVariableTest is Test { + using LibVariable for Type; + using LibVariable for TypeKind; + + LibVariableHelper internal helper; + + bytes internal expectedErr; + Variable internal uninitVar; + Variable internal boolVar; + Variable internal addressVar; + Variable internal bytes32Var; + Variable internal uintVar; + Variable internal intVar; + Variable internal stringVar; + Variable internal bytesVar; + Variable internal boolArrayVar; + Variable internal addressArrayVar; + Variable internal bytes32ArrayVar; + Variable internal uintArrayVar; + Variable internal intArrayVar; + Variable internal stringArrayVar; + Variable internal bytesArrayVar; + + function setUp() public { + helper = new LibVariableHelper(); + + // UNINITIALIZED + uninitVar = Variable(Type(TypeKind.None, false), ""); + + // SINGLE VALUES + boolVar = Variable(Type(TypeKind.Bool, false), abi.encode(true)); + addressVar = Variable(Type(TypeKind.Address, false), abi.encode(address(0xdeadbeef))); + bytes32Var = Variable(Type(TypeKind.Bytes32, false), abi.encode(bytes32(uint256(42)))); + uintVar = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(123))); + intVar = Variable(Type(TypeKind.Int256, false), abi.encode(int256(-123))); + stringVar = Variable(Type(TypeKind.String, false), abi.encode("hello world")); + bytesVar = Variable(Type(TypeKind.Bytes, false), abi.encode(hex"c0ffee")); + + // ARRAY VALUES + bool[] memory bools = new bool[](2); + bools[0] = true; + bools[1] = false; + boolArrayVar = Variable(Type(TypeKind.Bool, true), abi.encode(bools)); + + address[] memory addrs = new address[](2); + addrs[0] = address(0x1); + addrs[1] = address(0x2); + addressArrayVar = Variable(Type(TypeKind.Address, true), abi.encode(addrs)); + + bytes32[] memory b32s = new bytes32[](2); + b32s[0] = bytes32(uint256(1)); + b32s[1] = bytes32(uint256(2)); + bytes32ArrayVar = Variable(Type(TypeKind.Bytes32, true), abi.encode(b32s)); + + uint256[] memory uints = new uint256[](2); + uints[0] = 1; + uints[1] = 2; + uintArrayVar = Variable(Type(TypeKind.Uint256, true), abi.encode(uints)); + + int256[] memory ints = new int256[](2); + ints[0] = -1; + ints[1] = 2; + intArrayVar = Variable(Type(TypeKind.Int256, true), abi.encode(ints)); + + string[] memory strings = new string[](2); + strings[0] = "one"; + strings[1] = "two"; + stringArrayVar = Variable(Type(TypeKind.String, true), abi.encode(strings)); + + bytes[] memory b = new bytes[](2); + b[0] = hex"01"; + b[1] = hex"02"; + bytesArrayVar = Variable(Type(TypeKind.Bytes, true), abi.encode(b)); + } + + // -- SUCCESS CASES -------------------------------------------------------- + + function test_TypeHelpers() public view { + // TypeKind.toString() + assertEq(TypeKind.None.toString(), "none"); + assertEq(TypeKind.Bool.toString(), "bool"); + assertEq(TypeKind.Address.toString(), "address"); + assertEq(TypeKind.Bytes32.toString(), "bytes32"); + assertEq(TypeKind.Uint256.toString(), "uint256"); + assertEq(TypeKind.Int256.toString(), "int256"); + assertEq(TypeKind.String.toString(), "string"); + assertEq(TypeKind.Bytes.toString(), "bytes"); + + // TypeKind.toTomlKey() + assertEq(TypeKind.Uint256.toTomlKey(), "uint"); + assertEq(TypeKind.Int256.toTomlKey(), "int"); + assertEq(TypeKind.Bytes32.toTomlKey(), "bytes32"); + + // Type.toString() + assertEq(boolVar.ty.toString(), "bool"); + assertEq(boolArrayVar.ty.toString(), "bool[]"); + assertEq(uintVar.ty.toString(), "uint256"); + assertEq(uintArrayVar.ty.toString(), "uint256[]"); + assertEq(uninitVar.ty.toString(), "none"); + + // Type.isEqual() + assertTrue(boolVar.ty.isEqual(Type(TypeKind.Bool, false))); + assertFalse(boolVar.ty.isEqual(Type(TypeKind.Bool, true))); + assertFalse(boolVar.ty.isEqual(Type(TypeKind.Address, false))); + + // Type.assertEq() + boolVar.ty.assertEq(Type(TypeKind.Bool, false)); + uintArrayVar.ty.assertEq(Type(TypeKind.Uint256, true)); + } + + function test_Coercion() public view { + // Single values + assertTrue(helper.toBool(boolVar)); + assertEq(helper.toAddress(addressVar), address(0xdeadbeef)); + assertEq(helper.toBytes32(bytes32Var), bytes32(uint256(42))); + assertEq(helper.toUint256(uintVar), 123); + assertEq(helper.toInt256(intVar), -123); + assertEq(helper.toString(stringVar), "hello world"); + assertEq(helper.toBytes(bytesVar), hex"c0ffee"); + + // Bool array + bool[] memory bools = helper.toBoolArray(boolArrayVar); + assertEq(bools.length, 2); + assertTrue(bools[0]); + assertFalse(bools[1]); + + // Address array + address[] memory addrs = helper.toAddressArray(addressArrayVar); + assertEq(addrs.length, 2); + assertEq(addrs[0], address(0x1)); + assertEq(addrs[1], address(0x2)); + + // String array + string[] memory strings = helper.toStringArray(stringArrayVar); + assertEq(strings.length, 2); + assertEq(strings[0], "one"); + assertEq(strings[1], "two"); + } + + function test_Downcasting() public view { + // Uint downcasting + Variable memory v_uint_small = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(100))); + assertEq(helper.toUint128(v_uint_small), 100); + assertEq(helper.toUint64(v_uint_small), 100); + assertEq(helper.toUint32(v_uint_small), 100); + assertEq(helper.toUint16(v_uint_small), 100); + assertEq(helper.toUint8(v_uint_small), 100); + + // Uint array downcasting + uint256[] memory small_uints = new uint256[](2); + small_uints[0] = 10; + small_uints[1] = 20; + Variable memory v_uint_array_small = Variable(Type(TypeKind.Uint256, true), abi.encode(small_uints)); + uint8[] memory u8_array = helper.toUint8Array(v_uint_array_small); + assertEq(u8_array[0], 10); + assertEq(u8_array[1], 20); + + // Int downcasting + Variable memory v_int_small_pos = Variable(Type(TypeKind.Int256, false), abi.encode(int256(100))); + Variable memory v_int_small_neg = Variable(Type(TypeKind.Int256, false), abi.encode(int256(-100))); + assertEq(helper.toInt128(v_int_small_pos), 100); + assertEq(helper.toInt64(v_int_small_neg), -100); + assertEq(helper.toInt32(v_int_small_pos), 100); + assertEq(helper.toInt16(v_int_small_neg), -100); + assertEq(helper.toInt8(v_int_small_pos), 100); + + // Int array downcasting + int256[] memory small_ints = new int256[](2); + small_ints[0] = -10; + small_ints[1] = 20; + Variable memory intArraySmall = Variable(Type(TypeKind.Int256, true), abi.encode(small_ints)); + int8[] memory i8_array = helper.toInt8Array(intArraySmall); + assertEq(i8_array[0], -10); + assertEq(i8_array[1], 20); + } + + // -- REVERT CASES --------------------------------------------------------- + + function testRevert_NotInitialized() public { + vm.expectRevert(LibVariable.NotInitialized.selector); + helper.toBool(uninitVar); + + vm.expectRevert(LibVariable.NotInitialized.selector); + helper.toAddressArray(uninitVar); + } + + function testRevert_assertExists() public { + vm.expectRevert(LibVariable.NotInitialized.selector); + helper.assertExists(uninitVar); + } + + function testRevert_TypeMismatch() public { + // Single values + vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256", "bool")); + helper.toUint256(boolVar); + + vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "address", "string")); + helper.toAddress(stringVar); + + // Arrays + vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256[]", "bool[]")); + helper.toUint256Array(boolArrayVar); + + vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "address[]", "string[]")); + helper.toAddressArray(stringArrayVar); + + // Single value to array + vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "bool[]", "bool")); + helper.toBoolArray(boolVar); + + // Array to single value + vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "bool", "bool[]")); + helper.toBool(boolArrayVar); + + // assertEq reverts + vm.expectRevert(abi.encodeWithSelector(LibVariable.TypeMismatch.selector, "uint256", "bool")); + helper.assertEq(boolVar.ty, Type(TypeKind.Uint256, false)); + } + + function testRevert_UnsafeCast() public { + // uint overflow + Variable memory uintLarge = Variable(Type(TypeKind.Uint256, false), abi.encode(uint256(type(uint128).max) + 1)); + expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'uint128'"); + vm.expectRevert(expectedErr); + helper.toUint128(uintLarge); + + // int overflow + Variable memory intLarge = Variable(Type(TypeKind.Int256, false), abi.encode(int256(type(int128).max) + 1)); + expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'int128'"); + + vm.expectRevert(expectedErr); + helper.toInt128(intLarge); + + // int underflow + Variable memory intSmall = Variable(Type(TypeKind.Int256, false), abi.encode(int256(type(int128).min) - 1)); + expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value does not fit in 'int128'"); + + vm.expectRevert(expectedErr); + helper.toInt128(intSmall); + + // uint array overflow + uint256[] memory uintArray = new uint256[](2); + uintArray[0] = 10; + uintArray[1] = uint256(type(uint64).max) + 1; + Variable memory uintArrayLarge = Variable(Type(TypeKind.Uint256, true), abi.encode(uintArray)); + expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'uint64'"); + + vm.expectRevert(expectedErr); + helper.toUint64Array(uintArrayLarge); + + // int array overflow + int256[] memory intArray = new int256[](2); + intArray[0] = 10; + intArray[1] = int256(type(int64).max) + 1; + Variable memory intArrayLarge = Variable(Type(TypeKind.Int256, true), abi.encode(intArray)); + expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'int64'"); + + vm.expectRevert(expectedErr); + helper.toInt64Array(intArrayLarge); + + // int array underflow + intArray[0] = 10; + intArray[1] = int256(type(int64).min) - 1; + Variable memory intArraySmall = Variable(Type(TypeKind.Int256, true), abi.encode(intArray)); + expectedErr = abi.encodeWithSelector(LibVariable.UnsafeCast.selector, "value in array does not fit in 'int64'"); + + vm.expectRevert(expectedErr); + helper.toInt64Array(intArraySmall); + } +} + +/// @dev We must use an external helper contract to ensure proper call depth for `vm.expectRevert`, +/// as direct library calls are inlined by the compiler, causing call depth issues. +contract LibVariableHelper { + using LibVariable for Type; + using LibVariable for TypeKind; + + // Assertions + function assertExists(Variable memory v) external pure { + v.assertExists(); + } + + function assertEq(Type memory t1, Type memory t2) external pure { + t1.assertEq(t2); + } + + // Single Value Coercion + function toBool(Variable memory v) external pure returns (bool) { + return v.toBool(); + } + + function toAddress(Variable memory v) external pure returns (address) { + return v.toAddress(); + } + + function toBytes32(Variable memory v) external pure returns (bytes32) { + return v.toBytes32(); + } + + function toUint256(Variable memory v) external pure returns (uint256) { + return v.toUint256(); + } + + function toInt256(Variable memory v) external pure returns (int256) { + return v.toInt256(); + } + + function toString(Variable memory v) external pure returns (string memory) { + return v.toString(); + } + + function toBytes(Variable memory v) external pure returns (bytes memory) { + return v.toBytes(); + } + + // Array Coercion + function toBoolArray(Variable memory v) external pure returns (bool[] memory) { + return v.toBoolArray(); + } + + function toAddressArray(Variable memory v) external pure returns (address[] memory) { + return v.toAddressArray(); + } + + function toBytes32Array(Variable memory v) external pure returns (bytes32[] memory) { + return v.toBytes32Array(); + } + + function toUint256Array(Variable memory v) external pure returns (uint256[] memory) { + return v.toUint256Array(); + } + + function toInt256Array(Variable memory v) external pure returns (int256[] memory) { + return v.toInt256Array(); + } + + function toStringArray(Variable memory v) external pure returns (string[] memory) { + return v.toStringArray(); + } + + function toBytesArray(Variable memory v) external pure returns (bytes[] memory) { + return v.toBytesArray(); + } + + // Uint Downcasting + function toUint128(Variable memory v) external pure returns (uint128) { + return v.toUint128(); + } + + function toUint64(Variable memory v) external pure returns (uint64) { + return v.toUint64(); + } + + function toUint32(Variable memory v) external pure returns (uint32) { + return v.toUint32(); + } + + function toUint16(Variable memory v) external pure returns (uint16) { + return v.toUint16(); + } + + function toUint8(Variable memory v) external pure returns (uint8) { + return v.toUint8(); + } + + // Int Downcasting + function toInt128(Variable memory v) external pure returns (int128) { + return v.toInt128(); + } + + function toInt64(Variable memory v) external pure returns (int64) { + return v.toInt64(); + } + + function toInt32(Variable memory v) external pure returns (int32) { + return v.toInt32(); + } + + function toInt16(Variable memory v) external pure returns (int16) { + return v.toInt16(); + } + + function toInt8(Variable memory v) external pure returns (int8) { + return v.toInt8(); + } + + // Uint Array Downcasting + function toUint128Array(Variable memory v) external pure returns (uint128[] memory) { + return v.toUint128Array(); + } + + function toUint64Array(Variable memory v) external pure returns (uint64[] memory) { + return v.toUint64Array(); + } + + function toUint32Array(Variable memory v) external pure returns (uint32[] memory) { + return v.toUint32Array(); + } + + function toUint16Array(Variable memory v) external pure returns (uint16[] memory) { + return v.toUint16Array(); + } + + function toUint8Array(Variable memory v) external pure returns (uint8[] memory) { + return v.toUint8Array(); + } + + // Int Array Downcasting + function toInt128Array(Variable memory v) external pure returns (int128[] memory) { + return v.toInt128Array(); + } + + function toInt64Array(Variable memory v) external pure returns (int64[] memory) { + return v.toInt64Array(); + } + + function toInt32Array(Variable memory v) external pure returns (int32[] memory) { + return v.toInt32Array(); + } + + function toInt16Array(Variable memory v) external pure returns (int16[] memory) { + return v.toInt16Array(); + } + + function toInt8Array(Variable memory v) external pure returns (int8[] memory) { + return v.toInt8Array(); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdAssertions.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdAssertions.t.sol new file mode 100644 index 000000000..acc0c1e81 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdAssertions.t.sol @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {StdAssertions} from "../src/StdAssertions.sol"; +import {Vm} from "../src/Vm.sol"; + +interface VmInternal is Vm { + function _expectCheatcodeRevert(bytes memory message) external; +} + +contract StdAssertionsTest is StdAssertions { + string constant errorMessage = "User provided message"; + uint256 constant maxDecimals = 77; + + bool constant SHOULD_REVERT = true; + bool constant SHOULD_RETURN = false; + + bool constant STRICT_REVERT_DATA = true; + bool constant NON_STRICT_REVERT_DATA = false; + + VmInternal constant vm = VmInternal(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function testFuzz_AssertEqCall_Return_Pass( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnData, + bool strictRevertData + ) external { + address targetA = address(new TestMockCall(returnData, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnData, SHOULD_RETURN)); + + assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); + } + + function testFuzz_RevertWhenCalled_AssertEqCall_Return_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnDataA, + bytes memory returnDataB, + bool strictRevertData + ) external { + vm.assume(keccak256(returnDataA) != keccak256(returnDataB)); + + address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN)); + + vm._expectCheatcodeRevert( + bytes( + string.concat( + "Call return data does not match: ", vm.toString(returnDataA), " != ", vm.toString(returnDataB) + ) + ) + ); + assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); + } + + function testFuzz_AssertEqCall_Revert_Pass( + bytes memory callDataA, + bytes memory callDataB, + bytes memory revertDataA, + bytes memory revertDataB + ) external { + address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); + address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); + + assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA); + } + + function testFuzz_RevertWhenCalled_AssertEqCall_Revert_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory revertDataA, + bytes memory revertDataB + ) external { + vm.assume(keccak256(revertDataA) != keccak256(revertDataB)); + + address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); + address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); + + vm._expectCheatcodeRevert( + bytes( + string.concat( + "Call revert data does not match: ", vm.toString(revertDataA), " != ", vm.toString(revertDataB) + ) + ) + ); + assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA); + } + + function testFuzz_RevertWhenCalled_AssertEqCall_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnDataA, + bytes memory returnDataB, + bool strictRevertData + ) external { + address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT)); + + vm.expectRevert(bytes("assertion failed")); + this.assertEqCallExternal(targetA, callDataA, targetB, callDataB, strictRevertData); + + vm.expectRevert(bytes("assertion failed")); + this.assertEqCallExternal(targetB, callDataB, targetA, callDataA, strictRevertData); + } + + // Helper function to test outcome of assertEqCall via `expect` cheatcodes + function assertEqCallExternal( + address targetA, + bytes memory callDataA, + address targetB, + bytes memory callDataB, + bool strictRevertData + ) public { + assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); + } +} + +contract TestMockCall { + bytes returnData; + bool shouldRevert; + + constructor(bytes memory returnData_, bool shouldRevert_) { + returnData = returnData_; + shouldRevert = shouldRevert_; + } + + fallback() external payable { + bytes memory returnData_ = returnData; + + if (shouldRevert) { + assembly { + revert(add(returnData_, 0x20), mload(returnData_)) + } + } else { + assembly { + return(add(returnData_, 0x20), mload(returnData_)) + } + } + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdChains.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdChains.t.sol new file mode 100644 index 000000000..9522b37d0 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdChains.t.sol @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {Test} from "../src/Test.sol"; + +contract StdChainsMock is Test { + function exposed_getChain(string memory chainAlias) public returns (Chain memory) { + return getChain(chainAlias); + } + + function exposed_getChain(uint256 chainId) public returns (Chain memory) { + return getChain(chainId); + } + + function exposed_setChain(string memory chainAlias, ChainData memory chainData) public { + setChain(chainAlias, chainData); + } + + function exposed_setFallbackToDefaultRpcUrls(bool useDefault) public { + setFallbackToDefaultRpcUrls(useDefault); + } +} + +contract StdChainsTest is Test { + function test_ChainRpcInitialization() public { + // RPCs specified in `foundry.toml` should be updated. + assertEq(getChain(1).rpcUrl, "https://eth.merkle.io"); + assertEq(getChain("optimism_sepolia").rpcUrl, "https://sepolia.optimism.io/"); + assertEq(getChain("arbitrum_one_sepolia").rpcUrl, "https://sepolia-rollup.arbitrum.io/rpc/"); + + // Environment variables should be the next fallback + assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc"); + vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride"); + assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride"); + vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc"); + + // Cannot override RPCs defined in `foundry.toml` + vm.setEnv("MAINNET_RPC_URL", "myoverride2"); + assertEq(getChain("mainnet").rpcUrl, "https://eth.merkle.io"); + + // Other RPCs should remain unchanged. + assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545"); + assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001"); + } + + // Named with a leading underscore to clarify this is not intended to be run as a normal test, + // and is intended to be used in the below `test_Rpcs` test. + function _testRpc(string memory rpcAlias) internal { + string memory rpcUrl = getChain(rpcAlias).rpcUrl; + vm.createSelectFork(rpcUrl); + } + + // Ensure we can connect to the default RPC URL for each chain. + // Currently commented out since this is slow and public RPCs are flaky, often resulting in failing CI. + // function test_Rpcs() public { + // _testRpc("mainnet"); + // _testRpc("sepolia"); + // _testRpc("holesky"); + // _testRpc("optimism"); + // _testRpc("optimism_sepolia"); + // _testRpc("arbitrum_one"); + // _testRpc("arbitrum_one_sepolia"); + // _testRpc("arbitrum_nova"); + // _testRpc("polygon"); + // _testRpc("polygon_amoy"); + // _testRpc("avalanche"); + // _testRpc("avalanche_fuji"); + // _testRpc("bnb_smart_chain"); + // _testRpc("bnb_smart_chain_testnet"); + // _testRpc("gnosis_chain"); + // _testRpc("moonbeam"); + // _testRpc("moonriver"); + // _testRpc("moonbase"); + // _testRpc("base_sepolia"); + // _testRpc("base"); + // _testRpc("blast_sepolia"); + // _testRpc("blast"); + // _testRpc("fantom_opera"); + // _testRpc("fantom_opera_testnet"); + // _testRpc("fraxtal"); + // _testRpc("fraxtal_testnet"); + // _testRpc("berachain_bartio_testnet"); + // _testRpc("flare"); + // _testRpc("flare_coston2"); + // } + + function test_RevertIf_ChainNotFound() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found."); + stdChainsMock.exposed_getChain("does_not_exist"); + } + + function test_RevertIf_SetChain_ChainIdExist_FirstTest() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\"."); + stdChainsMock.exposed_setChain("anvil2", ChainData("Anvil", 31337, "URL")); + } + + function test_RevertIf_ChainBubbleUp() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + stdChainsMock.exposed_setChain("needs_undefined_env_var", ChainData("", 123456789, "")); + // Forge environment variable error. + vm.expectRevert(); + stdChainsMock.exposed_getChain("needs_undefined_env_var"); + } + + function test_RevertIf_SetChain_ChainIdExists_SecondTest() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + stdChainsMock.exposed_setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + + vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".'); + + stdChainsMock.exposed_setChain("another_custom_chain", ChainData("", 123456789, "")); + } + + function test_SetChain() public { + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + Chain memory customChain = getChain("custom_chain"); + assertEq(customChain.name, "Custom Chain"); + assertEq(customChain.chainId, 123456789); + assertEq(customChain.chainAlias, "custom_chain"); + assertEq(customChain.rpcUrl, "https://custom.chain/"); + Chain memory chainById = getChain(123456789); + assertEq(chainById.name, customChain.name); + assertEq(chainById.chainId, customChain.chainId); + assertEq(chainById.chainAlias, customChain.chainAlias); + assertEq(chainById.rpcUrl, customChain.rpcUrl); + customChain.name = "Another Custom Chain"; + customChain.chainId = 987654321; + setChain("another_custom_chain", customChain); + Chain memory anotherCustomChain = getChain("another_custom_chain"); + assertEq(anotherCustomChain.name, "Another Custom Chain"); + assertEq(anotherCustomChain.chainId, 987654321); + assertEq(anotherCustomChain.chainAlias, "another_custom_chain"); + assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/"); + // Verify the first chain data was not overwritten + chainById = getChain(123456789); + assertEq(chainById.name, "Custom Chain"); + assertEq(chainById.chainId, 123456789); + } + + function test_RevertIf_SetEmptyAlias() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string."); + stdChainsMock.exposed_setChain("", ChainData("", 123456789, "")); + } + + function test_RevertIf_SetNoChainId0() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0."); + stdChainsMock.exposed_setChain("alias", ChainData("", 0, "")); + } + + function test_RevertIf_GetNoChainId0() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0."); + stdChainsMock.exposed_getChain(0); + } + + function test_RevertIf_GetNoEmptyAlias() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string."); + stdChainsMock.exposed_getChain(""); + } + + function test_RevertIf_ChainNotInitialized() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found."); + stdChainsMock.exposed_getChain("no_such_alias"); + } + + function test_RevertIf_ChainAliasNotFound() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found."); + + stdChainsMock.exposed_getChain(321); + } + + function test_SetChain_ExistingOne() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + assertEq(getChain(123456789).chainId, 123456789); + + setChain("custom_chain", ChainData("Modified Chain", 9999999999999999999, "https://modified.chain/")); + vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found."); + stdChainsMock.exposed_getChain(123456789); + + Chain memory modifiedChain = getChain(9999999999999999999); + assertEq(modifiedChain.name, "Modified Chain"); + assertEq(modifiedChain.chainId, 9999999999999999999); + assertEq(modifiedChain.rpcUrl, "https://modified.chain/"); + } + + function test_RevertIf_DontUseDefaultRpcUrl() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + // Should error if default RPCs flag is set to false. + stdChainsMock.exposed_setFallbackToDefaultRpcUrls(false); + vm.expectRevert(); + stdChainsMock.exposed_getChain(31337); + vm.expectRevert(); + stdChainsMock.exposed_getChain("sepolia"); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdCheats.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdCheats.t.sol new file mode 100644 index 000000000..57dbcc291 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdCheats.t.sol @@ -0,0 +1,639 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {StdCheats} from "../src/StdCheats.sol"; +import {Test} from "../src/Test.sol"; +import {stdJson} from "../src/StdJson.sol"; +import {stdToml} from "../src/StdToml.sol"; +import {IERC20} from "../src/interfaces/IERC20.sol"; + +contract StdCheatsTest is Test { + Bar test; + + using stdJson for string; + + function setUp() public { + test = new Bar(); + } + + function test_Skip() public { + vm.warp(100); + skip(25); + assertEq(block.timestamp, 125); + } + + function test_Rewind() public { + vm.warp(100); + rewind(25); + assertEq(block.timestamp, 75); + } + + function test_Hoax() public { + hoax(address(1337)); + test.bar{value: 100}(address(1337)); + } + + function test_HoaxOrigin() public { + hoax(address(1337), address(1337)); + test.origin{value: 100}(address(1337)); + } + + function test_HoaxDifferentAddresses() public { + hoax(address(1337), address(7331)); + test.origin{value: 100}(address(1337), address(7331)); + } + + function test_StartHoax() public { + startHoax(address(1337)); + test.bar{value: 100}(address(1337)); + test.bar{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } + + function test_StartHoaxOrigin() public { + startHoax(address(1337), address(1337)); + test.origin{value: 100}(address(1337)); + test.origin{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } + + function test_ChangePrankMsgSender() public { + vm.startPrank(address(1337)); + test.bar(address(1337)); + changePrank(address(0xdead)); + test.bar(address(0xdead)); + changePrank(address(1337)); + test.bar(address(1337)); + vm.stopPrank(); + } + + function test_ChangePrankMsgSenderAndTxOrigin() public { + vm.startPrank(address(1337), address(1338)); + test.origin(address(1337), address(1338)); + changePrank(address(0xdead), address(0xbeef)); + test.origin(address(0xdead), address(0xbeef)); + changePrank(address(1337), address(1338)); + test.origin(address(1337), address(1338)); + vm.stopPrank(); + } + + function test_MakeAccountEquivalence() public { + Account memory account = makeAccount("1337"); + (address addr, uint256 key) = makeAddrAndKey("1337"); + assertEq(account.addr, addr); + assertEq(account.key, key); + } + + function test_MakeAddrEquivalence() public { + (address addr,) = makeAddrAndKey("1337"); + assertEq(makeAddr("1337"), addr); + } + + function test_MakeAddrSigning() public { + (address addr, uint256 key) = makeAddrAndKey("1337"); + bytes32 hash = keccak256("some_message"); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash); + assertEq(ecrecover(hash, v, r, s), addr); + } + + function test_Deal() public { + deal(address(this), 1 ether); + assertEq(address(this).balance, 1 ether); + } + + function test_DealToken() public { + Bar barToken = new Bar(); + address bar = address(barToken); + deal(bar, address(this), 10000e18); + assertEq(barToken.balanceOf(address(this)), 10000e18); + } + + function test_DealTokenAdjustTotalSupply() public { + Bar barToken = new Bar(); + address bar = address(barToken); + deal(bar, address(this), 10000e18, true); + assertEq(barToken.balanceOf(address(this)), 10000e18); + assertEq(barToken.totalSupply(), 20000e18); + deal(bar, address(this), 0, true); + assertEq(barToken.balanceOf(address(this)), 0); + assertEq(barToken.totalSupply(), 10000e18); + } + + function test_DealERC1155Token() public { + BarERC1155 barToken = new BarERC1155(); + address bar = address(barToken); + dealERC1155(bar, address(this), 0, 10000e18, false); + assertEq(barToken.balanceOf(address(this), 0), 10000e18); + } + + function test_DealERC1155TokenAdjustTotalSupply() public { + BarERC1155 barToken = new BarERC1155(); + address bar = address(barToken); + dealERC1155(bar, address(this), 0, 10000e18, true); + assertEq(barToken.balanceOf(address(this), 0), 10000e18); + assertEq(barToken.totalSupply(0), 20000e18); + dealERC1155(bar, address(this), 0, 0, true); + assertEq(barToken.balanceOf(address(this), 0), 0); + assertEq(barToken.totalSupply(0), 10000e18); + } + + function test_DealERC721Token() public { + BarERC721 barToken = new BarERC721(); + address bar = address(barToken); + dealERC721(bar, address(2), 1); + assertEq(barToken.balanceOf(address(2)), 1); + assertEq(barToken.balanceOf(address(1)), 0); + dealERC721(bar, address(1), 2); + assertEq(barToken.balanceOf(address(1)), 1); + assertEq(barToken.balanceOf(bar), 1); + } + + function test_DeployCode() public { + address deployed = deployCode("StdCheats.t.sol:Bar", bytes("")); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + } + + function test_DestroyAccount() public { + // deploy something to destroy it + BarERC721 barToken = new BarERC721(); + address bar = address(barToken); + vm.setNonce(bar, 10); + deal(bar, 100); + + uint256 prevThisBalance = address(this).balance; + uint256 size; + assembly { + size := extcodesize(bar) + } + + assertGt(size, 0); + assertEq(bar.balance, 100); + assertEq(vm.getNonce(bar), 10); + + destroyAccount(bar, address(this)); + assembly { + size := extcodesize(bar) + } + assertEq(address(this).balance, prevThisBalance + 100); + assertEq(vm.getNonce(bar), 0); + assertEq(size, 0); + assertEq(bar.balance, 0); + } + + function test_DeployCodeNoArgs() public { + address deployed = deployCode("StdCheats.t.sol:Bar"); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + } + + function test_DeployCodeVal() public { + address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + assertEq(deployed.balance, 1 ether); + } + + function test_DeployCodeValNoArgs() public { + address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + assertEq(deployed.balance, 1 ether); + } + + // We need this so we can call "this.deployCode" rather than "deployCode" directly + function deployCodeHelper(string memory what) external { + deployCode(what); + } + + function test_RevertIf_DeployCodeFail() public { + vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed.")); + this.deployCodeHelper("StdCheats.t.sol:RevertingContract"); + } + + function getCode(address who) internal view returns (bytes memory o_code) { + /// @solidity memory-safe-assembly + assembly { + // retrieve the size of the code, this needs assembly + let size := extcodesize(who) + // allocate output byte array - this could also be done without assembly + // by using o_code = new bytes(size) + o_code := mload(0x40) + // new "memory end" including padding + mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) + // store length in memory + mstore(o_code, size) + // actually retrieve the code, this needs assembly + extcodecopy(who, add(o_code, 0x20), 0, size) + } + } + + function test_DeriveRememberKey() public { + string memory mnemonic = "test test test test test test test test test test test junk"; + + (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0); + assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); + } + + function test_BytesToUint() public pure { + assertEq(3, bytesToUint_test(hex"03")); + assertEq(2, bytesToUint_test(hex"02")); + assertEq(255, bytesToUint_test(hex"ff")); + assertEq(29625, bytesToUint_test(hex"73b9")); + } + + function test_ParseJsonTxDetail() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + string memory json = vm.readFile(path); + bytes memory transactionDetails = json.parseRaw(".transactions[0].tx"); + RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail)); + Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail); + assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512); + assertEq( + txDetail.data, + hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004" + ); + assertEq(txDetail.nonce, 3); + assertEq(txDetail.txType, 2); + assertEq(txDetail.gas, 29625); + assertEq(txDetail.value, 0); + } + + function test_ReadEIP1559Transaction() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + uint256 index = 0; + Tx1559 memory transaction = readTx1559(path, index); + transaction; + } + + function test_ReadEIP1559Transactions() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + Tx1559[] memory transactions = readTx1559s(path); + transactions; + } + + function test_ReadReceipt() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + uint256 index = 5; + Receipt memory receipt = readReceipt(path, index); + assertEq( + receipt.logsBloom, + hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100" + ); + } + + function test_ReadReceipts() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + Receipt[] memory receipts = readReceipts(path); + receipts; + } + + function test_GasMeteringModifier() public { + uint256 gas_start_normal = gasleft(); + addInLoop(); + uint256 gas_used_normal = gas_start_normal - gasleft(); + + uint256 gas_start_single = gasleft(); + addInLoopNoGas(); + uint256 gas_used_single = gas_start_single - gasleft(); + + uint256 gas_start_double = gasleft(); + addInLoopNoGasNoGas(); + uint256 gas_used_double = gas_start_double - gasleft(); + + assertTrue(gas_used_double + gas_used_single < gas_used_normal); + } + + function addInLoop() internal pure returns (uint256) { + uint256 b; + for (uint256 i; i < 10000; i++) { + b += i; + } + return b; + } + + function addInLoopNoGas() internal noGasMetering returns (uint256) { + return addInLoop(); + } + + function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) { + return addInLoopNoGas(); + } + + function bytesToUint_test(bytes memory b) private pure returns (uint256) { + uint256 number; + for (uint256 i = 0; i < b.length; i++) { + number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1)))); + } + return number; + } + + function testFuzz_AssumeAddressIsNot(address addr) external { + // skip over Payable and NonPayable enums + for (uint8 i = 2; i < uint8(type(AddressType).max); i++) { + assumeAddressIsNot(addr, AddressType(i)); + } + assertTrue(addr != address(0)); + assertTrue(addr < address(1) || addr > address(9)); + assertTrue(addr != address(vm) || addr != 0x000000000000000000636F6e736F6c652e6c6f67); + } + + function test_AssumePayable() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + + // all should revert since these addresses are not payable + + // VM address + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + + // Console address + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x000000000000000000636F6e736F6c652e6c6f67); + + // Create2Deployer + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); + + // all should pass since these addresses are payable + + // vitalik.eth + stdCheatsMock.exposed_assumePayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045); + + // mock payable contract + MockContractPayable cp = new MockContractPayable(); + stdCheatsMock.exposed_assumePayable(address(cp)); + } + + function test_AssumeNotPayable() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + + // all should pass since these addresses are not payable + + // VM address + stdCheatsMock.exposed_assumeNotPayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + + // Console address + stdCheatsMock.exposed_assumeNotPayable(0x000000000000000000636F6e736F6c652e6c6f67); + + // Create2Deployer + stdCheatsMock.exposed_assumeNotPayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); + + // all should revert since these addresses are payable + + // vitalik.eth + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotPayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045); + + // mock payable contract + MockContractPayable cp = new MockContractPayable(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotPayable(address(cp)); + } + + function testFuzz_AssumeNotPrecompile(address addr) external { + assumeNotPrecompile(addr, getChain("optimism_sepolia").chainId); + assertTrue( + addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000)) + || addr > address(0x4200000000000000000000000000000000000800) + ); + } + + function testFuzz_AssumeNotForgeAddress(address addr) external pure { + assumeNotForgeAddress(addr); + assertTrue( + addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 + && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C + ); + } + + function test_RevertIf_CannotDeployCodeTo() external { + vm.expectRevert("StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); + this._revertDeployCodeTo(); + } + + function _revertDeployCodeTo() external { + deployCodeTo("StdCheats.t.sol:RevertingContract", address(0)); + } + + function test_DeployCodeTo() external { + address arbitraryAddress = makeAddr("arbitraryAddress"); + + deployCodeTo( + "StdCheats.t.sol:MockContractWithConstructorArgs", + abi.encode(uint256(6), true, bytes20(arbitraryAddress)), + 1 ether, + arbitraryAddress + ); + + MockContractWithConstructorArgs ct = MockContractWithConstructorArgs(arbitraryAddress); + + assertEq(arbitraryAddress.balance, 1 ether); + assertEq(ct.x(), 6); + assertTrue(ct.y()); + assertEq(ct.z(), bytes20(arbitraryAddress)); + } +} + +contract StdCheatsMock is StdCheats { + function exposed_assumePayable(address addr) external { + assumePayable(addr); + } + + function exposed_assumeNotPayable(address addr) external { + assumeNotPayable(addr); + } + + // We deploy a mock version so we can properly test expected reverts. + function exposed_assumeNotBlacklisted(address token, address addr) external view { + return assumeNotBlacklisted(token, addr); + } +} + +contract StdCheatsForkTest is Test { + address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD; + address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A; + + MockUSDT public USDT; + MockUSDC public USDC; + + function setUp() public { + USDT = new MockUSDT(); + USDC = new MockUSDC(); + + USDC.setBlacklisted(USDC_BLACKLISTED_USER, true); + USDT.setBlacklisted(USDT_BLACKLISTED_USER, true); + } + + function test_RevertIf_CannotAssumeNoBlacklisted_EOA() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + address eoa = vm.addr({privateKey: 1}); + vm.expectRevert("StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); + stdCheatsMock.exposed_assumeNotBlacklisted(eoa, address(0)); + } + + function testFuzz_AssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external view { + assumeNotBlacklisted(address(USDC), addr); + assumeNotBlacklisted(address(USDT), addr); + assertTrue(true); + } + + function test_RevertIf_AssumeNoBlacklisted_USDC() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotBlacklisted(address(USDC), USDC_BLACKLISTED_USER); + } + + function testFuzz_AssumeNotBlacklisted_USDC(address addr) external view { + assumeNotBlacklisted(address(USDC), addr); + assertFalse(USDCLike(USDC).isBlacklisted(addr)); + } + + function test_RevertIf_AssumeNoBlacklisted_USDT() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotBlacklisted(address(USDT), USDT_BLACKLISTED_USER); + } + + function testFuzz_AssumeNotBlacklisted_USDT(address addr) external view { + assumeNotBlacklisted(address(USDT), addr); + assertFalse(USDTLike(USDT).isBlackListed(addr)); + } +} + +/// @dev https://etherscan.io/token/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#readProxyContract +interface USDCLike { + function isBlacklisted(address) external view returns (bool); +} + +/// @dev https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#readContract +interface USDTLike { + function isBlackListed(address) external view returns (bool); +} + +contract MockUSDT is USDTLike { + mapping(address => bool) private blacklist; + + function isBlackListed(address addr) external view returns (bool) { + return blacklist[addr]; + } + + function setBlacklisted(address addr, bool value) external { + blacklist[addr] = value; + } +} + +contract MockUSDC is USDCLike { + mapping(address => bool) private blacklist; + + function isBlacklisted(address addr) external view returns (bool) { + return blacklist[addr]; + } + + function setBlacklisted(address addr, bool value) external { + blacklist[addr] = value; + } +} + +contract Bar { + constructor() payable { + /// `DEAL` STDCHEAT + totalSupply = 10000e18; + balanceOf[address(this)] = totalSupply; + } + + /// `HOAX` and `CHANGEPRANK` STDCHEATS + function bar(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + } + + function origin(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + require(tx.origin == expectedSender, "!prank"); + } + + function origin(address expectedSender, address expectedOrigin) public payable { + require(msg.sender == expectedSender, "!prank"); + require(tx.origin == expectedOrigin, "!prank"); + } + + /// `DEAL` STDCHEAT + mapping(address => uint256) public balanceOf; + uint256 public totalSupply; +} + +contract BarERC1155 { + constructor() payable { + /// `DEALERC1155` STDCHEAT + _totalSupply[0] = 10000e18; + _balances[0][address(this)] = _totalSupply[0]; + } + + function balanceOf(address account, uint256 id) public view virtual returns (uint256) { + return _balances[id][account]; + } + + function totalSupply(uint256 id) public view virtual returns (uint256) { + return _totalSupply[id]; + } + + /// `DEALERC1155` STDCHEAT + mapping(uint256 => mapping(address => uint256)) private _balances; + mapping(uint256 => uint256) private _totalSupply; +} + +contract BarERC721 { + constructor() payable { + /// `DEALERC721` STDCHEAT + _owners[1] = address(1); + _balances[address(1)] = 1; + _owners[2] = address(this); + _owners[3] = address(this); + _balances[address(this)] = 2; + } + + function balanceOf(address owner) public view virtual returns (uint256) { + return _balances[owner]; + } + + function ownerOf(uint256 tokenId) public view virtual returns (address) { + address owner = _owners[tokenId]; + return owner; + } + + mapping(uint256 => address) private _owners; + mapping(address => uint256) private _balances; +} + +contract RevertingContract { + constructor() { + revert(); + } +} + +contract MockContractWithConstructorArgs { + uint256 public immutable x; + bool public y; + bytes20 public z; + + constructor(uint256 _x, bool _y, bytes20 _z) payable { + x = _x; + y = _y; + z = _z; + } +} + +contract MockContractPayable { + receive() external payable {} +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdConstants.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdConstants.t.sol new file mode 100644 index 000000000..7a00530f4 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdConstants.t.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {StdConstants} from "../src/StdConstants.sol"; +import {Test} from "../src/Test.sol"; + +contract StdConstantsTest is Test { + function testVm() public view { + assertEq(StdConstants.VM.getBlockNumber(), 1); + } + + function testVmDerivation() public pure { + assertEq(address(StdConstants.VM), address(uint160(uint256(keccak256("hevm cheat code"))))); + } + + function testConsoleDerivation() public pure { + assertEq(StdConstants.CONSOLE, address(uint160(uint88(bytes11("console.log"))))); + } + + function testDefaultSender() public view { + assertEq(StdConstants.DEFAULT_SENDER, msg.sender); + } + + function testDefaultSenderDerivation() public pure { + assertEq(StdConstants.DEFAULT_SENDER, address(uint160(uint256(keccak256("foundry default caller"))))); + } + + function testDefaultTestContract() public { + assertEq(StdConstants.DEFAULT_TEST_CONTRACT, address(new Dummy())); + } + + function testDefaultTestContractDerivation() public view { + assertEq(address(this), StdConstants.VM.computeCreateAddress(StdConstants.DEFAULT_SENDER, 1)); + assertEq(StdConstants.DEFAULT_TEST_CONTRACT, StdConstants.VM.computeCreateAddress(address(this), 1)); + } +} + +contract Dummy {} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdError.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdError.t.sol new file mode 100644 index 000000000..29803d5d5 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdError.t.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import {stdError} from "../src/StdError.sol"; +import {Test} from "../src/Test.sol"; + +contract StdErrorsTest is Test { + ErrorsTest test; + + function setUp() public { + test = new ErrorsTest(); + } + + function test_RevertIf_AssertionError() public { + vm.expectRevert(stdError.assertionError); + test.assertionError(); + } + + function test_RevertIf_ArithmeticError() public { + vm.expectRevert(stdError.arithmeticError); + test.arithmeticError(10); + } + + function test_RevertIf_DivisionError() public { + vm.expectRevert(stdError.divisionError); + test.divError(0); + } + + function test_RevertIf_ModError() public { + vm.expectRevert(stdError.divisionError); + test.modError(0); + } + + function test_RevertIf_EnumConversionError() public { + vm.expectRevert(stdError.enumConversionError); + test.enumConversion(1); + } + + function test_RevertIf_EncodeStgError() public { + vm.expectRevert(stdError.encodeStorageError); + test.encodeStgError(); + } + + function test_RevertIf_PopError() public { + vm.expectRevert(stdError.popError); + test.pop(); + } + + function test_RevertIf_IndexOOBError() public { + vm.expectRevert(stdError.indexOOBError); + test.indexOOBError(1); + } + + function test_RevertIf_MemOverflowError() public { + vm.expectRevert(stdError.memOverflowError); + test.mem(); + } + + function test_RevertIf_InternError() public { + vm.expectRevert(stdError.zeroVarError); + test.intern(); + } +} + +contract ErrorsTest { + enum T { + T1 + } + + uint256[] public someArr; + bytes someBytes; + + function assertionError() public pure { + assert(false); + } + + function arithmeticError(uint256 a) public pure { + a -= 100; + } + + function divError(uint256 a) public pure { + 100 / a; + } + + function modError(uint256 a) public pure { + 100 % a; + } + + function enumConversion(uint256 a) public pure { + T(a); + } + + function encodeStgError() public { + /// @solidity memory-safe-assembly + assembly { + sstore(someBytes.slot, 1) + } + keccak256(someBytes); + } + + function pop() public { + someArr.pop(); + } + + function indexOOBError(uint256 a) public pure { + uint256[] memory t = new uint256[](0); + t[a]; + } + + function mem() public pure { + uint256 l = 2 ** 256 / 32; + new uint256[](l); + } + + function intern() public returns (uint256) { + function(uint256) internal returns (uint256) x; + x(2); + return 7; + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdJson.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdJson.t.sol new file mode 100644 index 000000000..6bedfcc9a --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdJson.t.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {Test, stdJson} from "../src/Test.sol"; + +contract StdJsonTest is Test { + using stdJson for string; + + string root; + string path; + + function setUp() public { + root = vm.projectRoot(); + path = string.concat(root, "/test/fixtures/test.json"); + } + + struct SimpleJson { + uint256 a; + string b; + } + + struct NestedJson { + uint256 a; + string b; + SimpleJson c; + } + + function test_readJson() public view { + string memory json = vm.readFile(path); + assertEq(json.readUint(".a"), 123); + } + + function test_writeJson() public { + string memory json = "json"; + json.serialize("a", uint256(123)); + string memory semiFinal = json.serialize("b", string("test")); + string memory finalJson = json.serialize("c", semiFinal); + finalJson.write(path); + + string memory json_ = vm.readFile(path); + bytes memory data = json_.parseRaw("$"); + NestedJson memory decodedData = abi.decode(data, (NestedJson)); + + assertEq(decodedData.a, 123); + assertEq(decodedData.b, "test"); + assertEq(decodedData.c.a, 123); + assertEq(decodedData.c.b, "test"); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdMath.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdMath.t.sol new file mode 100644 index 000000000..d1269a02a --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdMath.t.sol @@ -0,0 +1,202 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import {stdMath} from "../src/StdMath.sol"; +import {Test, stdError} from "../src/Test.sol"; + +contract StdMathMock is Test { + function exposed_percentDelta(uint256 a, uint256 b) public pure returns (uint256) { + return stdMath.percentDelta(a, b); + } + + function exposed_percentDelta(int256 a, int256 b) public pure returns (uint256) { + return stdMath.percentDelta(a, b); + } +} + +contract StdMathTest is Test { + function test_GetAbs() external pure { + assertEq(stdMath.abs(-50), 50); + assertEq(stdMath.abs(50), 50); + assertEq(stdMath.abs(-1337), 1337); + assertEq(stdMath.abs(0), 0); + + assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1); + assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1)); + } + + function testFuzz_GetAbs(int256 a) external pure { + uint256 manualAbs = getAbs(a); + + uint256 abs = stdMath.abs(a); + + assertEq(abs, manualAbs); + } + + function test_GetDelta_Uint() external pure { + assertEq(stdMath.delta(uint256(0), uint256(0)), 0); + assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337); + assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max); + assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max); + assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max); + + assertEq(stdMath.delta(0, uint256(0)), 0); + assertEq(stdMath.delta(1337, uint256(0)), 1337); + assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max); + assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max); + assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max); + + assertEq(stdMath.delta(1337, uint256(1337)), 0); + assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0); + assertEq(stdMath.delta(5000, uint256(1250)), 3750); + } + + function testFuzz_GetDelta_Uint(uint256 a, uint256 b) external pure { + uint256 manualDelta = a > b ? a - b : b - a; + + uint256 delta = stdMath.delta(a, b); + + assertEq(delta, manualDelta); + } + + function test_GetDelta_Int() external pure { + assertEq(stdMath.delta(int256(0), int256(0)), 0); + assertEq(stdMath.delta(int256(0), int256(1337)), 1337); + assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1); + assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1); + assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1); + + assertEq(stdMath.delta(0, int256(0)), 0); + assertEq(stdMath.delta(1337, int256(0)), 1337); + assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1); + assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1); + assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1); + + assertEq(stdMath.delta(-0, int256(0)), 0); + assertEq(stdMath.delta(-1337, int256(0)), 1337); + assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1); + assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1); + assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1); + + assertEq(stdMath.delta(int256(0), -0), 0); + assertEq(stdMath.delta(int256(0), -1337), 1337); + assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1); + assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1); + assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1); + + assertEq(stdMath.delta(1337, int256(1337)), 0); + assertEq(stdMath.delta(type(int256).max, type(int256).max), 0); + assertEq(stdMath.delta(type(int256).min, type(int256).min), 0); + assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max); + assertEq(stdMath.delta(5000, int256(1250)), 3750); + } + + function testFuzz_GetDelta_Int(int256 a, int256 b) external pure { + uint256 absA = getAbs(a); + uint256 absB = getAbs(b); + uint256 absDelta = absA > absB ? absA - absB : absB - absA; + + uint256 manualDelta; + if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { + manualDelta = absDelta; + } + // (a < 0 && b >= 0) || (a >= 0 && b < 0) + else { + manualDelta = absA + absB; + } + + uint256 delta = stdMath.delta(a, b); + + assertEq(delta, manualDelta); + } + + function test_GetPercentDelta_Uint() external { + StdMathMock stdMathMock = new StdMathMock(); + + assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18); + + assertEq(stdMath.percentDelta(1337, uint256(1337)), 0); + assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0); + assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18); + assertEq(stdMath.percentDelta(2500, uint256(2500)), 0); + assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18); + assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18); + + vm.expectRevert(stdError.divisionError); + stdMathMock.exposed_percentDelta(uint256(1), 0); + } + + function testFuzz_GetPercentDelta_Uint(uint192 a, uint192 b) external pure { + vm.assume(b != 0); + uint256 manualDelta = a > b ? a - b : b - a; + + uint256 manualPercentDelta = manualDelta * 1e18 / b; + uint256 percentDelta = stdMath.percentDelta(a, b); + + assertEq(percentDelta, manualPercentDelta); + } + + function test_GetPercentDelta_Int() external { + // We deploy a mock version so we can properly test the revert. + StdMathMock stdMathMock = new StdMathMock(); + + assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18); + assertEq(stdMath.percentDelta(int256(0), -1337), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18); + + assertEq(stdMath.percentDelta(1337, int256(1337)), 0); + assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0); + assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0); + + assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down + assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down + assertEq(stdMath.percentDelta(0, int256(2500)), 1e18); + assertEq(stdMath.percentDelta(2500, int256(2500)), 0); + assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18); + assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18); + + vm.expectRevert(stdError.divisionError); + stdMathMock.exposed_percentDelta(int256(1), 0); + } + + function testFuzz_GetPercentDelta_Int(int192 a, int192 b) external pure { + vm.assume(b != 0); + uint256 absA = getAbs(a); + uint256 absB = getAbs(b); + uint256 absDelta = absA > absB ? absA - absB : absB - absA; + + uint256 manualDelta; + if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { + manualDelta = absDelta; + } + // (a < 0 && b >= 0) || (a >= 0 && b < 0) + else { + manualDelta = absA + absB; + } + + uint256 manualPercentDelta = manualDelta * 1e18 / absB; + uint256 percentDelta = stdMath.percentDelta(a, b); + + assertEq(percentDelta, manualPercentDelta); + } + + /*////////////////////////////////////////////////////////////////////////// + HELPERS + //////////////////////////////////////////////////////////////////////////*/ + + function getAbs(int256 a) private pure returns (uint256) { + if (a < 0) { + return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a); + } + + return uint256(a); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdStorage.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdStorage.t.sol new file mode 100644 index 000000000..46604f866 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdStorage.t.sol @@ -0,0 +1,488 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {stdStorage, StdStorage} from "../src/StdStorage.sol"; +import {Test} from "../src/Test.sol"; + +contract StdStorageTest is Test { + using stdStorage for StdStorage; + + StorageTest internal test; + + function setUp() public { + test = new StorageTest(); + } + + function test_StorageHidden() public { + assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find()); + } + + function test_StorageObvious() public { + assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find()); + } + + function test_StorageExtraSload() public { + assertEq(16, stdstore.target(address(test)).sig(test.extra_sload.selector).find()); + } + + function test_StorageCheckedWriteHidden() public { + stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100); + assertEq(uint256(test.hidden()), 100); + } + + function test_StorageCheckedWriteObvious() public { + stdstore.target(address(test)).sig(test.exists.selector).checked_write(100); + assertEq(test.exists(), 100); + } + + function test_StorageCheckedWriteSignedIntegerHidden() public { + stdstore.target(address(test)).sig(test.hidden.selector).checked_write_int(-100); + assertEq(int256(uint256(test.hidden())), -100); + } + + function test_StorageCheckedWriteSignedIntegerObvious() public { + stdstore.target(address(test)).sig(test.tG.selector).checked_write_int(-100); + assertEq(test.tG(), -100); + } + + function test_StorageMapStructA() public { + uint256 slot = + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find(); + assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot); + } + + function test_StorageMapStructB() public { + uint256 slot = + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find(); + assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot); + } + + function test_StorageDeepMap() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key( + address(this) + ).find(); + assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot); + } + + function test_StorageCheckedWriteDeepMap() public { + stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this)) + .checked_write(100); + assertEq(100, test.deep_map(address(this), address(this))); + } + + function test_StorageDeepMapStructA() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) + .with_key(address(this)).depth(0).find(); + assertEq( + bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0), + bytes32(slot) + ); + } + + function test_StorageDeepMapStructB() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) + .with_key(address(this)).depth(1).find(); + assertEq( + bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1), + bytes32(slot) + ); + } + + function test_StorageCheckedWriteDeepMapStructA() public { + stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( + address(this) + ).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); + assertEq(100, a); + assertEq(0, b); + } + + function test_StorageCheckedWriteDeepMapStructB() public { + stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( + address(this) + ).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); + assertEq(0, a); + assertEq(100, b); + } + + function test_StorageCheckedWriteMapStructA() public { + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.map_struct(address(this)); + assertEq(a, 100); + assertEq(b, 0); + } + + function test_StorageCheckedWriteMapStructB() public { + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.map_struct(address(this)); + assertEq(a, 0); + assertEq(b, 100); + } + + function test_StorageStructA() public { + uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find(); + assertEq(uint256(7), slot); + } + + function test_StorageStructB() public { + uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find(); + assertEq(uint256(7) + 1, slot); + } + + function test_StorageCheckedWriteStructA() public { + stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.basic(); + assertEq(a, 100); + assertEq(b, 1337); + } + + function test_StorageCheckedWriteStructB() public { + stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.basic(); + assertEq(a, 1337); + assertEq(b, 100); + } + + function test_StorageMapAddrFound() public { + uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find(); + assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot); + } + + function test_StorageMapAddrRoot() public { + (uint256 slot, bytes32 key) = + stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).parent(); + assertEq(address(uint160(uint256(key))), address(this)); + assertEq(uint256(1), slot); + slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).root(); + assertEq(uint256(1), slot); + } + + function test_StorageMapUintFound() public { + uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find(); + assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot); + } + + function test_StorageCheckedWriteMapUint() public { + stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100); + assertEq(100, test.map_uint(100)); + } + + function test_StorageCheckedWriteMapAddr() public { + stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100); + assertEq(100, test.map_addr(address(this))); + } + + function test_StorageCheckedWriteMapBool() public { + stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true); + assertTrue(test.map_bool(address(this))); + } + + function testFuzz_StorageCheckedWriteMapPacked(address addr, uint128 value) public { + stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_lower.selector).with_key(addr) + .checked_write(value); + assertEq(test.read_struct_lower(addr), value); + + stdstore.enable_packed_slots().target(address(test)).sig(test.read_struct_upper.selector).with_key(addr) + .checked_write(value); + assertEq(test.read_struct_upper(addr), value); + } + + function test_StorageCheckedWriteMapPackedFullSuccess() public { + uint256 full = test.map_packed(address(1337)); + // keep upper 128, set lower 128 to 1337 + full = (full & (uint256((1 << 128) - 1) << 128)) | 1337; + stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write( + full + ); + assertEq(1337, test.read_struct_lower(address(1337))); + } + + function test_RevertStorageConst() public { + StorageTestTarget target = new StorageTestTarget(test); + + vm.expectRevert("stdStorage find(StdStorage): No storage use detected for target."); + target.expectRevertStorageConst(); + } + + function testFuzz_StorageNativePack(uint248 val1, uint248 val2, bool boolVal1, bool boolVal2) public { + stdstore.enable_packed_slots().target(address(test)).sig(test.tA.selector).checked_write(val1); + stdstore.enable_packed_slots().target(address(test)).sig(test.tB.selector).checked_write(boolVal1); + stdstore.enable_packed_slots().target(address(test)).sig(test.tC.selector).checked_write(boolVal2); + stdstore.enable_packed_slots().target(address(test)).sig(test.tD.selector).checked_write(val2); + + assertEq(test.tA(), val1); + assertEq(test.tB(), boolVal1); + assertEq(test.tC(), boolVal2); + assertEq(test.tD(), val2); + } + + function test_StorageReadBytes32() public { + bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32(); + assertEq(val, hex"1337"); + } + + function test_StorageReadBool_False() public { + bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool(); + assertEq(val, false); + } + + function test_StorageReadBool_True() public { + bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool(); + assertEq(val, true); + } + + function test_RevertIf_ReadingNonBoolValue() public { + vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); + this.readNonBoolValue(); + } + + function readNonBoolValue() public { + stdstore.target(address(test)).sig(test.tE.selector).read_bool(); + } + + function test_StorageReadAddress() public { + address val = stdstore.target(address(test)).sig(test.tF.selector).read_address(); + assertEq(val, address(1337)); + } + + function test_StorageReadUint() public { + uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint(); + assertEq(val, 1); + } + + function test_StorageReadInt() public { + int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int(); + assertEq(val, type(int256).min); + } + + function testFuzz_Packed(uint256 val, uint8 elemToGet) public { + // This function tries an assortment of packed slots, shifts meaning number of elements + // that are packed. Shiftsizes are the size of each element, i.e. 8 means a data type that is 8 bits, 16 == 16 bits, etc. + // Combined, these determine how a slot is packed. Making it random is too hard to avoid global rejection limit + // and make it performant. + + // change the number of shifts + for (uint256 i = 1; i < 5; i++) { + uint256 shifts = i; + + elemToGet = uint8(bound(elemToGet, 0, shifts - 1)); + + uint256[] memory shiftSizes = new uint256[](shifts); + for (uint256 j; j < shifts; j++) { + shiftSizes[j] = 8 * (j + 1); + } + + test.setRandomPacking(val); + + uint256 leftBits; + uint256 rightBits; + for (uint256 j; j < shiftSizes.length; j++) { + if (j < elemToGet) { + leftBits += shiftSizes[j]; + } else if (elemToGet != j) { + rightBits += shiftSizes[j]; + } + } + + // we may have some right bits unaccounted for + leftBits += 256 - (leftBits + shiftSizes[elemToGet] + rightBits); + // clear left bits, then clear right bits and realign + uint256 expectedValToRead = (val << leftBits) >> (leftBits + rightBits); + + uint256 readVal = stdstore.target(address(test)).enable_packed_slots().sig( + "getRandomPacked(uint8,uint8[],uint8)" + ).with_calldata(abi.encode(shifts, shiftSizes, elemToGet)).read_uint(); + + assertEq(readVal, expectedValToRead); + } + } + + function testFuzz_Packed2(uint256 nvars, uint256 seed) public { + // Number of random variables to generate. + nvars = bound(nvars, 1, 20); + + // This will decrease as we generate values in the below loop. + uint256 bitsRemaining = 256; + + // Generate a random value and size for each variable. + uint256[] memory vals = new uint256[](nvars); + uint256[] memory sizes = new uint256[](nvars); + uint256[] memory offsets = new uint256[](nvars); + + for (uint256 i = 0; i < nvars; i++) { + // Generate a random value and size. + offsets[i] = i == 0 ? 0 : offsets[i - 1] + sizes[i - 1]; + + uint256 nvarsRemaining = nvars - i; + uint256 maxVarSize = bitsRemaining - nvarsRemaining + 1; + sizes[i] = bound(uint256(keccak256(abi.encodePacked(seed, i + 256))), 1, maxVarSize); + bitsRemaining -= sizes[i]; + + uint256 maxVal; + uint256 varSize = sizes[i]; + assembly { + // mask = (1 << varSize) - 1 + maxVal := sub(shl(varSize, 1), 1) + } + vals[i] = bound(uint256(keccak256(abi.encodePacked(seed, i))), 0, maxVal); + } + + // Pack all values into the slot. + for (uint256 i = 0; i < nvars; i++) { + stdstore.enable_packed_slots().target(address(test)).sig("getRandomPacked(uint256,uint256)").with_key( + sizes[i] + ).with_key(offsets[i]).checked_write(vals[i]); + } + + // Verify the read data matches. + for (uint256 i = 0; i < nvars; i++) { + uint256 readVal = stdstore.enable_packed_slots().target(address(test)).sig( + "getRandomPacked(uint256,uint256)" + ).with_key(sizes[i]).with_key(offsets[i]).read_uint(); + + uint256 retVal = test.getRandomPacked(sizes[i], offsets[i]); + + assertEq(readVal, vals[i]); + assertEq(retVal, vals[i]); + } + } + + function testEdgeCaseArray() public { + stdstore.target(address(test)).sig("edgeCaseArray(uint256)").with_key(uint256(0)).checked_write(1); + assertEq(test.edgeCaseArray(0), 1); + } +} + +contract StorageTestTarget { + using stdStorage for StdStorage; + + StdStorage internal stdstore; + StorageTest internal test; + + constructor(StorageTest test_) { + test = test_; + } + + function expectRevertStorageConst() public { + stdstore.target(address(test)).sig("const()").find(); + } +} + +contract StorageTest { + uint256 public exists = 1; + mapping(address => uint256) public map_addr; + mapping(uint256 => uint256) public map_uint; + mapping(address => uint256) public map_packed; + mapping(address => UnpackedStruct) public map_struct; + mapping(address => mapping(address => uint256)) public deep_map; + mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; + UnpackedStruct public basic; + + uint248 public tA; + bool public tB; + + bool public tC = false; + uint248 public tD = 1; + + struct UnpackedStruct { + uint256 a; + uint256 b; + } + + mapping(address => bool) public map_bool; + + bytes32 public tE = hex"1337"; + address public tF = address(1337); + int256 public tG = type(int256).min; + bool public tH = true; + bytes32 private tI = ~bytes32(hex"1337"); + + uint256 randomPacking; + + // Array with length matching values of elements. + uint256[] public edgeCaseArray = [3, 3, 3]; + + constructor() { + basic = UnpackedStruct({a: 1337, b: 1337}); + + uint256 two = (1 << 128) | 1; + map_packed[msg.sender] = two; + map_packed[address(uint160(1337))] = 1 << 128; + } + + function read_struct_upper(address who) public view returns (uint256) { + return map_packed[who] >> 128; + } + + function read_struct_lower(address who) public view returns (uint256) { + return map_packed[who] & ((1 << 128) - 1); + } + + function hidden() public view returns (bytes32 t) { + bytes32 slot = keccak256("my.random.var"); + /// @solidity memory-safe-assembly + assembly { + t := sload(slot) + } + } + + function const() public pure returns (bytes32 t) { + t = bytes32(hex"1337"); + } + + function extra_sload() public view returns (bytes32 t) { + // trigger read on slot `tE`, and make a staticcall to make sure compiler doesn't optimize this SLOAD away + assembly { + pop(staticcall(gas(), sload(tE.slot), 0, 0, 0, 0)) + } + t = tI; + } + + function setRandomPacking(uint256 val) public { + randomPacking = val; + } + + function _getMask(uint256 size) internal pure returns (uint256 mask) { + assembly { + // mask = (1 << size) - 1 + mask := sub(shl(size, 1), 1) + } + } + + function setRandomPacking(uint256 val, uint256 size, uint256 offset) public { + // Generate mask based on the size of the value + uint256 mask = _getMask(size); + // Zero out all bits for the word we're about to set + uint256 cleanedWord = randomPacking & ~(mask << offset); + // Place val in the correct spot of the cleaned word + randomPacking = cleanedWord | val << offset; + } + + function getRandomPacked(uint256 size, uint256 offset) public view returns (uint256) { + // Generate mask based on the size of the value + uint256 mask = _getMask(size); + // Shift to place the bits in the correct position, and use mask to zero out remaining bits + return (randomPacking >> offset) & mask; + } + + function getRandomPacked(uint8 shifts, uint8[] memory shiftSizes, uint8 elem) public view returns (uint256) { + require(elem < shifts, "!elem"); + uint256 leftBits; + uint256 rightBits; + + for (uint256 i; i < shiftSizes.length; i++) { + if (i < elem) { + leftBits += shiftSizes[i]; + } else if (elem != i) { + rightBits += shiftSizes[i]; + } + } + + // we may have some right bits unaccounted for + leftBits += 256 - (leftBits + shiftSizes[elem] + rightBits); + + // clear left bits, then clear right bits and realign + return (randomPacking << leftBits) >> (leftBits + rightBits); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdStyle.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdStyle.t.sol new file mode 100644 index 000000000..974e756fe --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdStyle.t.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {Test, console2, StdStyle} from "../src/Test.sol"; + +contract StdStyleTest is Test { + function test_StyleColor() public pure { + console2.log(StdStyle.red("StdStyle.red String Test")); + console2.log(StdStyle.red(uint256(10e18))); + console2.log(StdStyle.red(int256(-10e18))); + console2.log(StdStyle.red(true)); + console2.log(StdStyle.red(address(0))); + console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.redBytes32("StdStyle.redBytes32")); + console2.log(StdStyle.green("StdStyle.green String Test")); + console2.log(StdStyle.green(uint256(10e18))); + console2.log(StdStyle.green(int256(-10e18))); + console2.log(StdStyle.green(true)); + console2.log(StdStyle.green(address(0))); + console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32")); + console2.log(StdStyle.yellow("StdStyle.yellow String Test")); + console2.log(StdStyle.yellow(uint256(10e18))); + console2.log(StdStyle.yellow(int256(-10e18))); + console2.log(StdStyle.yellow(true)); + console2.log(StdStyle.yellow(address(0))); + console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32")); + console2.log(StdStyle.blue("StdStyle.blue String Test")); + console2.log(StdStyle.blue(uint256(10e18))); + console2.log(StdStyle.blue(int256(-10e18))); + console2.log(StdStyle.blue(true)); + console2.log(StdStyle.blue(address(0))); + console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32")); + console2.log(StdStyle.magenta("StdStyle.magenta String Test")); + console2.log(StdStyle.magenta(uint256(10e18))); + console2.log(StdStyle.magenta(int256(-10e18))); + console2.log(StdStyle.magenta(true)); + console2.log(StdStyle.magenta(address(0))); + console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32")); + console2.log(StdStyle.cyan("StdStyle.cyan String Test")); + console2.log(StdStyle.cyan(uint256(10e18))); + console2.log(StdStyle.cyan(int256(-10e18))); + console2.log(StdStyle.cyan(true)); + console2.log(StdStyle.cyan(address(0))); + console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32")); + } + + function test_StyleFontWeight() public pure { + console2.log(StdStyle.bold("StdStyle.bold String Test")); + console2.log(StdStyle.bold(uint256(10e18))); + console2.log(StdStyle.bold(int256(-10e18))); + console2.log(StdStyle.bold(address(0))); + console2.log(StdStyle.bold(true)); + console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32")); + console2.log(StdStyle.dim("StdStyle.dim String Test")); + console2.log(StdStyle.dim(uint256(10e18))); + console2.log(StdStyle.dim(int256(-10e18))); + console2.log(StdStyle.dim(address(0))); + console2.log(StdStyle.dim(true)); + console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32")); + console2.log(StdStyle.italic("StdStyle.italic String Test")); + console2.log(StdStyle.italic(uint256(10e18))); + console2.log(StdStyle.italic(int256(-10e18))); + console2.log(StdStyle.italic(address(0))); + console2.log(StdStyle.italic(true)); + console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32")); + console2.log(StdStyle.underline("StdStyle.underline String Test")); + console2.log(StdStyle.underline(uint256(10e18))); + console2.log(StdStyle.underline(int256(-10e18))); + console2.log(StdStyle.underline(address(0))); + console2.log(StdStyle.underline(true)); + console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32")); + console2.log(StdStyle.inverse("StdStyle.inverse String Test")); + console2.log(StdStyle.inverse(uint256(10e18))); + console2.log(StdStyle.inverse(int256(-10e18))); + console2.log(StdStyle.inverse(address(0))); + console2.log(StdStyle.inverse(true)); + console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32")); + } + + function test_StyleCombined() public pure { + console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test"))); + console2.log(StdStyle.green(StdStyle.dim(uint256(10e18)))); + console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18)))); + console2.log(StdStyle.blue(StdStyle.underline(address(0)))); + console2.log(StdStyle.magenta(StdStyle.inverse(true))); + } + + function test_StyleCustom() public pure { + console2.log(h1("Custom Style 1")); + console2.log(h2("Custom Style 2")); + } + + function h1(string memory a) private pure returns (string memory) { + return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a))); + } + + function h2(string memory a) private pure returns (string memory) { + return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a))); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdToml.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdToml.t.sol new file mode 100644 index 000000000..5a45f4f5c --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdToml.t.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {Test, stdToml} from "../src/Test.sol"; + +contract StdTomlTest is Test { + using stdToml for string; + + string root; + string path; + + function setUp() public { + root = vm.projectRoot(); + path = string.concat(root, "/test/fixtures/test.toml"); + } + + struct SimpleToml { + uint256 a; + string b; + } + + struct NestedToml { + uint256 a; + string b; + SimpleToml c; + } + + function test_readToml() public view { + string memory json = vm.readFile(path); + assertEq(json.readUint(".a"), 123); + } + + function test_writeToml() public { + string memory json = "json"; + json.serialize("a", uint256(123)); + string memory semiFinal = json.serialize("b", string("test")); + string memory finalJson = json.serialize("c", semiFinal); + finalJson.write(path); + + string memory toml = vm.readFile(path); + bytes memory data = toml.parseRaw("$"); + NestedToml memory decodedData = abi.decode(data, (NestedToml)); + + assertEq(decodedData.a, 123); + assertEq(decodedData.b, "test"); + assertEq(decodedData.c.a, 123); + assertEq(decodedData.c.b, "test"); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdUtils.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdUtils.t.sol new file mode 100644 index 000000000..aee801b2c --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/StdUtils.t.sol @@ -0,0 +1,342 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import {Test, StdUtils} from "../src/Test.sol"; + +contract StdUtilsMock is StdUtils { + // We deploy a mock version so we can properly test expected reverts. + function exposed_getTokenBalances(address token, address[] memory addresses) + external + returns (uint256[] memory balances) + { + return getTokenBalances(token, addresses); + } + + function exposed_bound(int256 num, int256 min, int256 max) external pure returns (int256) { + return bound(num, min, max); + } + + function exposed_bound(uint256 num, uint256 min, uint256 max) external pure returns (uint256) { + return bound(num, min, max); + } + + function exposed_bytesToUint(bytes memory b) external pure returns (uint256) { + return bytesToUint(b); + } +} + +contract StdUtilsTest is Test { + /*////////////////////////////////////////////////////////////////////////// + BOUND UINT + //////////////////////////////////////////////////////////////////////////*/ + + function test_Bound() public pure { + assertEq(bound(uint256(5), 0, 4), 0); + assertEq(bound(uint256(0), 69, 69), 69); + assertEq(bound(uint256(0), 68, 69), 68); + assertEq(bound(uint256(10), 150, 190), 174); + assertEq(bound(uint256(300), 2800, 3200), 3107); + assertEq(bound(uint256(9999), 1337, 6666), 4669); + } + + function test_Bound_WithinRange() public pure { + assertEq(bound(uint256(51), 50, 150), 51); + assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150)); + assertEq(bound(uint256(149), 50, 150), 149); + assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150)); + } + + function test_Bound_EdgeCoverage() public pure { + assertEq(bound(uint256(0), 50, 150), 50); + assertEq(bound(uint256(1), 50, 150), 51); + assertEq(bound(uint256(2), 50, 150), 52); + assertEq(bound(uint256(3), 50, 150), 53); + assertEq(bound(type(uint256).max, 50, 150), 150); + assertEq(bound(type(uint256).max - 1, 50, 150), 149); + assertEq(bound(type(uint256).max - 2, 50, 150), 148); + assertEq(bound(type(uint256).max - 3, 50, 150), 147); + } + + function testFuzz_Bound_DistributionIsEven(uint256 min, uint256 size) public pure { + size = size % 100 + 1; + min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size); + uint256 max = min + size - 1; + uint256 result; + + for (uint256 i = 1; i <= size * 4; ++i) { + // x > max + result = bound(max + i, min, max); + assertEq(result, min + (i - 1) % size); + // x < min + result = bound(min - i, min, max); + assertEq(result, max - (i - 1) % size); + } + } + + function testFuzz_Bound(uint256 num, uint256 min, uint256 max) public pure { + if (min > max) (min, max) = (max, min); + + uint256 result = bound(num, min, max); + + assertGe(result, min); + assertLe(result, max); + assertEq(result, bound(result, min, max)); + if (num >= min && num <= max) assertEq(result, num); + } + + function test_BoundUint256Max() public pure { + assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1); + assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max); + } + + function test_RevertIf_BoundMaxLessThanMin() public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); + stdUtils.exposed_bound(uint256(5), 100, 10); + } + + function testFuzz_RevertIf_BoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.assume(min > max); + vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); + stdUtils.exposed_bound(num, min, max); + } + + /*////////////////////////////////////////////////////////////////////////// + BOUND INT + //////////////////////////////////////////////////////////////////////////*/ + + function test_BoundInt() public pure { + assertEq(bound(-3, 0, 4), 2); + assertEq(bound(0, -69, -69), -69); + assertEq(bound(0, -69, -68), -68); + assertEq(bound(-10, 150, 190), 154); + assertEq(bound(-300, 2800, 3200), 2908); + assertEq(bound(9999, -1337, 6666), 1995); + } + + function test_BoundInt_WithinRange() public pure { + assertEq(bound(51, -50, 150), 51); + assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150)); + assertEq(bound(149, -50, 150), 149); + assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150)); + } + + function test_BoundInt_EdgeCoverage() public pure { + assertEq(bound(type(int256).min, -50, 150), -50); + assertEq(bound(type(int256).min + 1, -50, 150), -49); + assertEq(bound(type(int256).min + 2, -50, 150), -48); + assertEq(bound(type(int256).min + 3, -50, 150), -47); + assertEq(bound(type(int256).min, 10, 150), 10); + assertEq(bound(type(int256).min + 1, 10, 150), 11); + assertEq(bound(type(int256).min + 2, 10, 150), 12); + assertEq(bound(type(int256).min + 3, 10, 150), 13); + + assertEq(bound(type(int256).max, -50, 150), 150); + assertEq(bound(type(int256).max - 1, -50, 150), 149); + assertEq(bound(type(int256).max - 2, -50, 150), 148); + assertEq(bound(type(int256).max - 3, -50, 150), 147); + assertEq(bound(type(int256).max, -50, -10), -10); + assertEq(bound(type(int256).max - 1, -50, -10), -11); + assertEq(bound(type(int256).max - 2, -50, -10), -12); + assertEq(bound(type(int256).max - 3, -50, -10), -13); + } + + function testFuzz_BoundInt_DistributionIsEven(int256 min, uint256 size) public pure { + size = size % 100 + 1; + min = bound(min, -int256(size / 2), int256(size - size / 2)); + int256 max = min + int256(size) - 1; + int256 result; + + for (uint256 i = 1; i <= size * 4; ++i) { + // x > max + result = bound(max + int256(i), min, max); + assertEq(result, min + int256((i - 1) % size)); + // x < min + result = bound(min - int256(i), min, max); + assertEq(result, max - int256((i - 1) % size)); + } + } + + function testFuzz_BoundInt(int256 num, int256 min, int256 max) public pure { + if (min > max) (min, max) = (max, min); + + int256 result = bound(num, min, max); + + assertGe(result, min); + assertLe(result, max); + assertEq(result, bound(result, min, max)); + if (num >= min && num <= max) assertEq(result, num); + } + + function test_BoundIntInt256Max() public pure { + assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1); + assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max); + } + + function test_BoundIntInt256Min() public pure { + assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min); + assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1); + } + + function test_RevertIf_BoundIntMaxLessThanMin() public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); + stdUtils.exposed_bound(-5, 100, 10); + } + + function testFuzz_RevertIf_BoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.assume(min > max); + vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); + stdUtils.exposed_bound(num, min, max); + } + + /*////////////////////////////////////////////////////////////////////////// + BOUND PRIVATE KEY + //////////////////////////////////////////////////////////////////////////*/ + + function test_BoundPrivateKey() public pure { + assertEq(boundPrivateKey(0), 1); + assertEq(boundPrivateKey(1), 1); + assertEq(boundPrivateKey(300), 300); + assertEq(boundPrivateKey(9999), 9999); + assertEq(boundPrivateKey(SECP256K1_ORDER - 1), SECP256K1_ORDER - 1); + assertEq(boundPrivateKey(SECP256K1_ORDER), 1); + assertEq(boundPrivateKey(SECP256K1_ORDER + 1), 2); + assertEq(boundPrivateKey(UINT256_MAX), UINT256_MAX & SECP256K1_ORDER - 1); // x&y is equivalent to x-x%y + } + + /*////////////////////////////////////////////////////////////////////////// + BYTES TO UINT + //////////////////////////////////////////////////////////////////////////*/ + + function test_BytesToUint() external pure { + bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bytes memory two = hex"02"; + bytes memory millionEther = hex"d3c21bcecceda1000000"; + + assertEq(bytesToUint(maxUint), type(uint256).max); + assertEq(bytesToUint(two), 2); + assertEq(bytesToUint(millionEther), 1_000_000 ether); + } + + function test_RevertIf_BytesLengthExceeds32() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32."); + stdUtils.exposed_bytesToUint(thirty3Bytes); + } + + /*////////////////////////////////////////////////////////////////////////// + COMPUTE CREATE ADDRESS + //////////////////////////////////////////////////////////////////////////*/ + + function test_ComputeCreateAddress() external pure { + address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; + uint256 nonce = 14; + address createAddress = computeCreateAddress(deployer, nonce); + assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45); + } + + /*////////////////////////////////////////////////////////////////////////// + COMPUTE CREATE2 ADDRESS + //////////////////////////////////////////////////////////////////////////*/ + + function test_ComputeCreate2Address() external pure { + bytes32 salt = bytes32(uint256(31415)); + bytes32 initcodeHash = keccak256(abi.encode(0x6080)); + address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; + address create2Address = computeCreate2Address(salt, initcodeHash, deployer); + assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3); + } + + function test_ComputeCreate2AddressWithDefaultDeployer() external pure { + bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0; + bytes32 initcodeHash = hashInitCode(hex"6080", ""); + assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0); + address create2Address = computeCreate2Address(salt, initcodeHash); + assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6); + } +} + +contract StdUtilsForkTest is Test { + /*////////////////////////////////////////////////////////////////////////// + GET TOKEN BALANCES + //////////////////////////////////////////////////////////////////////////*/ + + address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; + address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170; + address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA; + address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385; + + address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17; + address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52; + + function setUp() public { + // All tests of the `getTokenBalances` method are fork tests using live contracts. + vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); + } + + function test_RevertIf_CannotGetTokenBalances_NonTokenContract() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function, + // so the `balanceOf` call should revert. + address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f); + address[] memory addresses = new address[](1); + addresses[0] = USDC_HOLDER_0; + + vm.expectRevert("Multicall3: call failed"); + stdUtils.exposed_getTokenBalances(token, addresses); + } + + function test_RevertIf_CannotGetTokenBalances_EOA() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + address eoa = vm.addr({privateKey: 1}); + address[] memory addresses = new address[](1); + addresses[0] = USDC_HOLDER_0; + vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract."); + stdUtils.exposed_getTokenBalances(eoa, addresses); + } + + function test_GetTokenBalances_Empty() external { + address[] memory addresses = new address[](0); + uint256[] memory balances = getTokenBalances(USDC, addresses); + assertEq(balances.length, 0); + } + + function test_GetTokenBalances_USDC() external { + address[] memory addresses = new address[](2); + addresses[0] = USDC_HOLDER_0; + addresses[1] = USDC_HOLDER_1; + uint256[] memory balances = getTokenBalances(USDC, addresses); + assertEq(balances[0], 159_000_000_000_000); + assertEq(balances[1], 131_350_000_000_000); + } + + function test_GetTokenBalances_SHIB() external { + address[] memory addresses = new address[](3); + addresses[0] = SHIB_HOLDER_0; + addresses[1] = SHIB_HOLDER_1; + addresses[2] = SHIB_HOLDER_2; + uint256[] memory balances = getTokenBalances(SHIB, addresses); + assertEq(balances[0], 3_323_256_285_484.42e18); + assertEq(balances[1], 1_271_702_771_149.99999928e18); + assertEq(balances[2], 606_357_106_247e18); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/Vm.t.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/Vm.t.sol new file mode 100644 index 000000000..1b99e3db1 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/Vm.t.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import {Test} from "../src/Test.sol"; +import {Vm, VmSafe} from "../src/Vm.sol"; + +// These tests ensure that functions are never accidentally removed from a Vm interface, or +// inadvertently moved between Vm and VmSafe. These tests must be updated each time a function is +// added to or removed from Vm or VmSafe. +contract VmTest is Test { + function test_VmInterfaceId() public pure { + assertEq(type(Vm).interfaceId, bytes4(0xe835828d), "Vm"); + } + + function test_VmSafeInterfaceId() public pure { + assertEq(type(VmSafe).interfaceId, bytes4(0xe02727c3), "VmSafe"); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationScript.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationScript.sol new file mode 100644 index 000000000..d3d88a0b5 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationScript.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {Script} from "../../src/Script.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationScript is Script {} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationScriptBase.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationScriptBase.sol new file mode 100644 index 000000000..65b5bedbe --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationScriptBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {ScriptBase} from "../../src/Script.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationScriptBase is ScriptBase {} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationTest.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationTest.sol new file mode 100644 index 000000000..2a9dec57f --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationTest.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {Test} from "../../src/Test.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationTest is Test {} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationTestBase.sol b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationTestBase.sol new file mode 100644 index 000000000..32b3fc5be --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/compilation/CompilationTestBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {TestBase} from "../../src/Test.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationTestBase is TestBase {} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/broadcast.log.json b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/broadcast.log.json new file mode 100644 index 000000000..0a0200bca --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/broadcast.log.json @@ -0,0 +1,187 @@ +{ + "transactions": [ + { + "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "function": "multiple_arguments(uint256,address,uint256[]):(uint256)", + "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "gas": "0x73b9", + "value": "0x0", + "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004", + "nonce": "0x3", + "accessList": [] + } + }, + { + "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "function": "inc():(uint256)", + "arguments": [], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "gas": "0xdcb2", + "value": "0x0", + "data": "0x371303c0", + "nonce": "0x4", + "accessList": [] + } + }, + { + "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "function": "t(uint256):(uint256)", + "arguments": ["1"], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "gas": "0x8599", + "value": "0x0", + "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x5", + "accessList": [] + } + } + ], + "receipts": [ + { + "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181", + "transactionIndex": "0x0", + "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af", + "blockNumber": "0x1", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "cumulativeGasUsed": "0x13f3a", + "gasUsed": "0x13f3a", + "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782", + "transactionIndex": "0x0", + "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148", + "blockNumber": "0x2", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "cumulativeGasUsed": "0x45d80", + "gasUsed": "0x45d80", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d", + "transactionIndex": "0x0", + "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58", + "blockNumber": "0x3", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "cumulativeGasUsed": "0x45feb", + "gasUsed": "0x45feb", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", + "transactionIndex": "0x0", + "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629", + "blockNumber": "0x4", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "cumulativeGasUsed": "0x5905", + "gasUsed": "0x5905", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", + "transactionIndex": "0x0", + "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11", + "blockNumber": "0x5", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "cumulativeGasUsed": "0xa9c4", + "gasUsed": "0xa9c4", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "transactionIndex": "0x0", + "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", + "blockNumber": "0x6", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "cumulativeGasUsed": "0x66c5", + "gasUsed": "0x66c5", + "contractAddress": null, + "logs": [ + { + "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "topics": [ + "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000", + "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", + "blockNumber": "0x6", + "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "transactionIndex": "0x1", + "logIndex": "0x0", + "transactionLogIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16", + "transactionIndex": "0x0", + "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c", + "blockNumber": "0x7", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x0000000000000000000000000000000000001337", + "cumulativeGasUsed": "0x5208", + "gasUsed": "0x5208", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + } + ], + "libraries": [ + "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3" + ], + "pending": [], + "path": "broadcast/Broadcast.t.sol/31337/run-latest.json", + "returns": {}, + "timestamp": 1655140035 +} diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/config.toml b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/config.toml new file mode 100644 index 000000000..e6dcccca5 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/config.toml @@ -0,0 +1,81 @@ +# ------------------------------------------------ +# EXAMPLE DEPLOYMENT CONFIG +# ------------------------------------------------ + +# -- MAINNET ------------------------------------- + +[mainnet] +endpoint_url = "${MAINNET_RPC}" + +[mainnet.bool] +is_live = true +bool_array = [true, false] + +[mainnet.address] +weth = "${WETH_MAINNET}" +deps = [ + "0x0000000000000000000000000000000000000000", + "0x1111111111111111111111111111111111111111", +] + +[mainnet.uint] +number = 1234 +number_array = [5678, 9999] + +[mainnet.int] +signed_number = -1234 +signed_number_array = [-5678, 9999] + +[mainnet.bytes32] +word = "0x00000000000000000000000000000000000000000000000000000000000004d2" # 1234 +word_array = [ + "0x000000000000000000000000000000000000000000000000000000000000162e", # 5678 + "0x000000000000000000000000000000000000000000000000000000000000270f", # 9999 +] + +[mainnet.bytes] +b = "0xabcd" +b_array = ["0xdead", "0xbeef"] + +[mainnet.string] +str = "foo" +str_array = ["bar", "baz"] + +# -- OPTIMISM ------------------------------------ + +[optimism] +endpoint_url = "${OPTIMISM_RPC}" + +[optimism.bool] +is_live = false +bool_array = [false, true] + +[optimism.address] +weth = "${WETH_OPTIMISM}" +deps = [ + "0x2222222222222222222222222222222222222222", + "0x3333333333333333333333333333333333333333", +] + +[optimism.uint] +number = 9999 +number_array = [1234, 5678] + +[optimism.int] +signed_number = 9999 +signed_number_array = [-1234, -5678] + +[optimism.bytes32] +word = "0x000000000000000000000000000000000000000000000000000000000000270f" # 9999 +word_array = [ + "0x00000000000000000000000000000000000000000000000000000000000004d2", # 1234 + "0x000000000000000000000000000000000000000000000000000000000000162e", # 5678 +] + +[optimism.bytes] +b = "0xdcba" +b_array = ["0xc0ffee", "0xbabe"] + +[optimism.string] +str = "alice" +str_array = ["bob", "charlie"] diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/test.json b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/test.json new file mode 100644 index 000000000..caebf6d96 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/test.json @@ -0,0 +1,8 @@ +{ + "a": 123, + "b": "test", + "c": { + "a": 123, + "b": "test" + } +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/test.toml b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/test.toml new file mode 100644 index 000000000..60692bc75 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/lib/forge-std/test/fixtures/test.toml @@ -0,0 +1,6 @@ +a = 123 +b = "test" + +[c] +a = 123 +b = "test" diff --git a/packages/wallet/wallet-contracts/Counter/script/Counter.s.sol b/packages/wallet/wallet-contracts/Counter/script/Counter.s.sol new file mode 100644 index 000000000..f01d69c39 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/script/Counter.s.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script} from "forge-std/Script.sol"; +import {Counter} from "../src/Counter.sol"; + +contract CounterScript is Script { + Counter public counter; + + function setUp() public {} + + function run() public { + vm.startBroadcast(); + + counter = new Counter(); + + vm.stopBroadcast(); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/src/Counter.sol b/packages/wallet/wallet-contracts/Counter/src/Counter.sol new file mode 100644 index 000000000..aded7997b --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/src/Counter.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +contract Counter { + uint256 public number; + + function setNumber(uint256 newNumber) public { + number = newNumber; + } + + function increment() public { + number++; + } +} diff --git a/packages/wallet/wallet-contracts/Counter/test/Counter.t.sol b/packages/wallet/wallet-contracts/Counter/test/Counter.t.sol new file mode 100644 index 000000000..483191083 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/test/Counter.t.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Test} from "forge-std/Test.sol"; +import {Counter} from "../src/Counter.sol"; + +contract CounterTest is Test { + Counter public counter; + + function setUp() public { + counter = new Counter(); + counter.setNumber(0); + } + + function test_Increment() public { + counter.increment(); + assertEq(counter.number(), 1); + } + + function testFuzz_SetNumber(uint256 x) public { + counter.setNumber(x); + assertEq(counter.number(), x); + } +} diff --git a/packages/wallet/wallet-contracts/Counter/utils/JsonBindings.sol b/packages/wallet/wallet-contracts/Counter/utils/JsonBindings.sol new file mode 100644 index 000000000..740d47522 --- /dev/null +++ b/packages/wallet/wallet-contracts/Counter/utils/JsonBindings.sol @@ -0,0 +1,18 @@ +// Automatically generated by forge bind-json. + +pragma solidity >=0.6.2 <0.9.0; +pragma experimental ABIEncoderV2; + + +interface Vm { + function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory); + function parseJsonType(string calldata json, string calldata typeDescription) external pure returns (bytes memory); + function parseJsonType(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory); + function serializeJsonType(string calldata typeDescription, bytes memory value) external pure returns (string memory json); + function serializeJsonType(string calldata objectKey, string calldata valueKey, string calldata typeDescription, bytes memory value) external returns (string memory json); +} + +library JsonBindings { + Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + +} diff --git a/packages/wallet/wallet-contracts/LICENSE b/packages/wallet/wallet-contracts/LICENSE new file mode 100644 index 000000000..bf69ef4b9 --- /dev/null +++ b/packages/wallet/wallet-contracts/LICENSE @@ -0,0 +1,219 @@ + Copyright (c) 2017-present Horizon Blockchain Games Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + ------------------------------------------------------------------------ + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/wallet/wallet-contracts/README.md b/packages/wallet/wallet-contracts/README.md new file mode 100644 index 000000000..03031621f --- /dev/null +++ b/packages/wallet/wallet-contracts/README.md @@ -0,0 +1,56 @@ +# Sequence Smart Wallet Contracts + +Ethereum contracts for the Sequence Smart Wallet at [https://sequence.app](https://sequence.app). + +For more information, visit [https://sequence.build](https://sequence.build) + +## Usage + +Please visit [https://sequence.app](https://sequence.app) to access the Sequence Wallet via your Web Browser, or +download "Sequence Wallet" from the respective Apple/Google stores. + +You may also access, interface, or develop your own Sequence Wallet via [sequence.js](https://github.com/0xsequence/sequence.js). The +sequence.js library offers a full open source library to interact, create, deploy and manage a Sequence Smart Wallet Account, +as defined by the contracts in this repository. Also see [go-sequence](https://github.com/0xsequence/go-sequence) for an implementation +in Go. + +## Connecting your Dapp with Sequence Wallet + +If you wish to use Sequence Wallet in your Dapp, simply use [sequence.js](https://github.com/0xsequence/sequence.js). Sequence.js +is an Ethereum client library built on [ethers.js](https://github.com/ethers-io/ethers.js), that provides an additional +Sequence Smart Wallet Signer. + +Please refer to the [sequence.js](https://github.com/0xsequence/sequence.js) repository for usage instructions. + +# Developing a Custom Wallet UI for Sequence (Advanced!) + +If you wish to use the Sequence Wallet Contracts `@0xsequence/wallet-contracts` directly: + +1. Install the contracts: `pnpm add @0xsequence/wallet-contracts` or `npm install @0xsequence/wallet-contracts` +2. Install the Sequence Wallet libraries: `pnpm add @0xsequence/wallet` or `npm install @0xsequence/wallet`. You can view the source, + of the [wallet libraries](https://github.com/0xsequence/sequence.js/tree/master/packages/wallet), and review the + [Sequence tests](https://github.com/0xsequence/sequence.js/tree/master/packages/0xsequence) for sample usage. + +**NOTE:** this integration is only needed if you want low-level access to the Sequence Wallet contracts, such as if you'd building +your own custom wallet, or perhaps a CLI tool for managing your wallet. + +## Security Review + +`@0xsequence/wallet-contracts` has been audited by independent parties. + +### V2 Audits + +- [Consensys Diligence](https://github.com/0xsequence/wallet-contracts/blob/master/audits/v2/consensys-horizon-sequence-wallet-audit-2023-02.pdf) - February 2023 +- [Zellic](https://github.com/0xsequence/wallet-contracts/raw/master/audits/Quantstamp_Arcadeum_Report_Final.pdf) - March 2023 + +### V1 Audits + +- [Consensys Diligence](https://github.com/0xsequence/wallet-contracts/blob/master/audits/v1/Consensys_Diligence.md) - May 2020 +- [Quantstamp - initial audit](https://github.com/0xsequence/wallet-contracts/raw/master/audits/v1/Quantstamp_Arcadeum_Report_Final.pdf) - July 2020 +- [Quantstamp - audit of new capability, nested Sequence signers](https://github.com/0xsequence/wallet-contracts/raw/master/audits/v1/sequence_quantstamp_audit_feb_2021.pdf) - February 2021 + +## License + +Copyright (c) 2017-present [Horizon Blockchain Games Inc](https://horizon.io). + +Licensed under [Apache-2.0](https://github.com/0xsequence/erc-1155/blob/master/LICENSE) diff --git a/packages/wallet/wallet-contracts/audits/v1/Consensys_Diligence.md b/packages/wallet/wallet-contracts/audits/v1/Consensys_Diligence.md new file mode 100644 index 000000000..aabcfc359 --- /dev/null +++ b/packages/wallet/wallet-contracts/audits/v1/Consensys_Diligence.md @@ -0,0 +1,7 @@ +# Consensys Diligence report May 2020 + +[View full report](https://diligence.consensys.net/audits/private/cnhjwtpa-horizon-wallet/) + +Please note, Sequence Wallet was formerly known as "Arcadeum Wallet". Any references of "Arcadeum" +are synonymous with "Sequence", and this repository. + diff --git a/packages/wallet/wallet-contracts/audits/v1/Quantstamp_Arcadeum_Report_Final.pdf b/packages/wallet/wallet-contracts/audits/v1/Quantstamp_Arcadeum_Report_Final.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f78c80a74eda6e7761e9c9b9b10371fbab99cbb4 GIT binary patch literal 399997 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

Whd?dg_4j4^}fxjK$w z=G-Cb#}@th#IWHT%kY@BEYeU@!YoR=*VZGE>~W4_;(fr2zcu+4;wAmdMzo5%c3Y9; z6hpDx2%_-yNTC_NvJOt?GvyQK9=^NmRty!Fz=^|r?77kQB_%a&mC$J1F_a2tD=8 zTK8?(-y{o>MbqY(cdrfgr`4`5`ri&A)^?R2i78fc3(0#5HDpoLPq;zGMJ~2x$U2xM z34|pHyX;7}DiNu>8KBqcWS?eu?_}BdN1iJF9wxbR&)8N!~?aw5ssT4tX1TqQ#eiIFS0ZAK}5L^LWOyasF zr@>z2{w9{$&=uUON=GmFjzBbES*+EcyK-bDg%~k0kq_A+WY#g|L~+aW`{{NK;cMrJ z+_s{Gf8Hr${XzU7wjv#C=$-B865%9~<32EKPaS@mz%|acUsTuZ!8a3iv6%YP-RpY3 z!&j{`4~6VZZQ^d83GZr@+MSA`2{cBR>oJJ$x_z!KGk7z~c2?Ooh_XR*ix8{fg75Tt zhbV3% zN|C97A-Dq{Ad{^ChJ?@J5Uo4qO&;tn>)x)mc!^(%O4iM4Ns7xz<@6k;+&1av5rNWt zm_H0`iMMc{d*Kq6Xo=5RD}9`bQ_X6v^UlloMhFSUlwVq4Sk9wQs!q9>t&$_o^gLA- zXlGw2Ob>e!@IY#t?m%8svp(p3HDDu^#=-1q7#*DW?1SflBTSQq^fU!ujN(% zV&|$0x(R#m4Qcn5enVY2?n*~>5Qe?tp-GW<`L5I*5kz(`&Ok=uG0sT(!DNI6;S^D! zFu%}eP0?rhdt7QbxT6{W5ny9NdOF^3Cc;jQv zQ6pNsgV(SljaL1{x%cWOD=u!05arc~m>VTDDMI0lemjs(Hx z*nsM&ewB66GlIBSBd~uhTtw$}XmhQJe|+i`9SqR521PfOHq$kODcj=xyBK z&5HAV_JQQKUS=OYQ>Y8qEslduZTAve-w0~6wSJY%+_j+X#sC-Z=V0MBQWQcM_(m7W zPH;rI!T-h%b|vyv}yLLSW?1`HPl zXCXuRs$}^F?Vxez`J?S7->|okul}NMPX1=;QpALj){FN; z3p)u6RJxp~KH|vtIuVV+QCCG1l}H!zNePITyQc#pR%p7{R{8X3GRm9D7LJhDh&Hqi z7NXu5nrtXLuLuN`+OO@S9wHqaT}SPcLjrJ$Bmt@!y#6?o9_yf5)(#q}0HO;lVk2)D z4A$|5lYr09vVp(S{o$0+(-VRKNDbaPpxNuK^jTY;1z|(dT4upyIk?9fTv&PR#GdUg zyM!&Pfa;>#!ELtN*Gf>7&HAy|cKckuc!Vt6C9;9}ueez`V*I<>Hy@y+o90~jJqF8M z1ygk~__%<(0cp0pQ`m1B)vEHG@v8fz=dus=Dr&|G?oAseIONxaV#ZS0UVS&2NTW6NKKd>D>@LYnK-k}GVCWfV(6AdrD? zc3?dC5{>jPMOHO!_;{ANHt1anxYW%6B+or1JvgkW54Q*+y~vXJBC$*3KzpOwtNaCv z(gZN)>L?o)i%MeikiaZbBq|w3_m=taY%=jfe}xRC19TdE$Km}OI);osGgv?w^i3Qk zqu37_a#7;hp_~pv_j^F;wQ{vAZvZKfHraa)Gm9jY&%lUCDV5dMV0Ie!Rg?^ZB+>%-zzr z`45q7XR3424R;%P^5E0B5SsX0!g?H1dl>wPjCd1D(d#2pHpT^zaNp>fI{2FgIKB;8 zqS^E2;r$Dcxfs)+YdCr-Q{Y0H_OuH(v8D?ram$UAd{)by5xtx1c)Q(K>u&nNwwBrh zKZA9VYfrj2{;)@{rA4{_>*&<6ghno%q1&bj`iu2xp+sQ>gByv5RRdm|@D>iaS~z-B zATEue8Z-Xyf^Jj2{vy%s8qGS6uy*R}o)b9&r_J;7dKLuZwz6C(vX`>q4Vy7Grn~)< z^qG@_(8__^VN}y(nc;@B><7j9J5N}!NCwps?a5EOCx+Ih_aiMva^!Bg|I4@V7-)e7 zFpw4rN_X&=n~4%ITp=-Fn=QXCuX8D{V#VZjMcK>#CIRfj>_d?xw`OFF!Q`MIdq`xc zj(vUAM77&~imV<5hFnxTICc_jebva{l4vn4nqeri=)0f}m>|Iw5Do4sT~Gl4i@=mF z$|afY!3Bx=P%o;2CV9H?Ig4#Rt)&b?Ga2^}JfgisEZMlbW94ZI+F5$eyMt4qfqf)!JhO=KMVVPsrsX*`Vx zf!zI0ZsFJRR~PSL*SZ!C+idqANs@gZqiC{;?W^R$F6e3eCWz47BM2iWxZyB19Xg1v zEyY?GuW?HWG~D7qEu|L3B@y%?QLE~WG>m{e{a)iI_T2)wfC5kG^vsCI$SIGxpfiS{ z7q}IMVw<`U!C6ulm-K%E3MCZ&_!HinbwAW2*KNgnH8ehCLD5#}NT(s_&PY*ZmSzx2 z+Uukp&@s7TWcIq7h?CF{M|MnN3!t{erF2 z)$!Q~e?^ih8UPP+?+7ggs3~~XlJEw6BfUNI>OfvrAxbvL!T;pC7&UeBnZ5#UE@~Ec zdy+a)x`OjH6~UUxpg58Zy!FH&;1K+BgWphxMR@m4>Ue^P2Xjs5LDmF}O9fLdW0SC5 z2{IJ!Xi#gl7w}k+u+a;GmZh5fS7PKZKaMsfe$+}J!pLW_*=R>aVW#BN(jszvx1g(6 z_!SPhYDq5QUfFw)R?&j)IMhCIz?<>6buX$Z{3gwuLL;p+q}}AYq#P!yYo$*!QaPg0 zc$go=8398(nS~zuA#KUx^5nuy`hYA3qPZ)E(9WBJX)ZuvdJ?>|4bmbf_X3jzf4ZA_{5H{GOaczxQcyXm_ zJ(H!4<7f#fmmbYo_`I@JyO9PvQ6;f={K86!>T=)wKpe^>c&8)tnWMz%y{wO>3WhHs zVRi9Xi2v|2zf-$`LPc>&DnMJq1m)y+SeW-ZDLpY(F)-uVc#0kee=cCHZNQyLu;RT_r4*DCUmHIviusnbtMFnDi=XVd=ZDcQ{q7e`Ha5#4j+hY=<=^l zYzB<6 zr4+3gA@b~(TETRSx_E$`5V-0Z7P1L^#w7Sc;wJhf-`xNyEF$Yqj0UdUK=EDfDbGtw zLnMN+6-H@)HkyGrHz=z7-Nzc)7_ECOItRPL26w?~ZcDT2o91eh91*(gGy>STSaG$( zFT+UE9S@v@oOdfB1{EdXwLZM%@(i8`Sk>XI2)yqyjgs1ge>R)@BmG(rG=@6e_Cz|L zE0LsksJAa*9eoM(chT@?idncN=o~gy@nx*xmU}1ce+pX0#@2m84t|MA!wVX2FwfoTdKawQn2v=% za?~@$S?R>lxH&wpd)ZIdrwpu+?P~r#W(ezd?Io+J$J)M-wgSSXx+z||0^B?h>x?== z&rSN+Tf`oJ<3?ssM+;IEeH^1@--XU$sbvQm(4YhFnJ0<QguR z&oF;V(z4pA+Py#gabaVrelmU>GmQYeYe@5?-VB1w2lFWMyE*cV^MFBzAod>YKJz9V zDPRcW5?`lkHoUTNy~wdwKmtej1f>W&gL`ecOp}` zE46}-=0xe5H;+6NA9aL(&uP(Krx-Mv@!XJw#YXZIfOO>?`vim{2K_1ExG|B*@zz{4 z%yv;cBT0TD59Roa1}WSdSsJusnVF;Y8GWU1(2PG(AVrdgrlA0t`j&+mKyDYP@A;{n z6l>z%!MFKImvZqcHJ+82?k2t+Oj<}SCja(+q#8~&DMG9eaa(c!&LhPAZI}@zLSZZv zyZ-{~;Mq(=1E5_BGY0%mD-u5`DH?X#><8+^#(=3vsK7{T1}9RgojONcrX*t|re!D% zk>9=I-r*iC81LNkU6uxXm4o1k&rN$f#msL-ML!F|#;^uBP)~L~&71yQ_TBvoD)GtE zm<#|=c)NpMC@DiH6aQc73!yF4i0)d-4{YHg&Q%ppSN!`k#!>MWD!pMDfmNowy)yf`Od~vB{ zJL-Hbb__T1tIQn)oByMil`TFI4C!TT+Fgj_1rA;MHotqLvk6~HTuVK+tz~npF>|{w z2W2XRZN(oNuktQUacP$!;c5PVW|YMu(s0I})$ghH7+PMbQWG44*gW&Gg(-`UL<&)_ zwG)FVrOwjEIb>osgA^uuhQ9a;>`q<_@p%wZb?lCQ=W`I9&SPY?Epy$?glmJSm%~sQ zQQnoKP<uE(Pet~u{68985NSo)pma(kx*SiPtIRzZqhO8^{{$OzUzq`-Y_(l z_Ge7nYC|9M2p=Dq?VTo73Coc&%#%@>WmtS7gKYoV+kCw)L!Fy0bUue~rq{&1D4YaT zvmC-lhyaZ`dZR?;3cM`A7*Pj&Q4e1GLby1Ex%Y&v@Ym0hP>(%Y5$ZzKcMtLuG3FjT zk3OvvQ$@pf(9hqRv%1o3hQl8lfVWI)$-r_ra8%wu3cFR^^gani{Rw{kNOWTTBt0EG zm|EtRVoOAh?K>v;LAO+56`Rq@30h7+y2hxBCBQgUExE?B_0+Faql>EY<*ki9Mx5C| zU*W$_xs0x2dsViqg_g&==H9IQ4cI-Be47TnVXv+tVMAKCL1nALlJzQu@ldtRj2bK7|A*=t?bf?e5E4110_U)M@&2Tan?>VaM*v$ zE{W#j+dXscNCrDuW(-w8{QJ#C^M+(Q0g(lXC&xiM66F@6xBV4_UfFEcd zRK~;CE6R2@H626QB)En|E2UXwkJTRi|CNcA>q_SBa(&h_-izhXbZONrFV3&ekWR@_ zJp%IYBRnF7QW7`x2_72=V$uG?W1p-2M2Fd!l=8c&QeBBUpOqi6rQcwN{=E;_=&seC zt*|8o)tan_CTV%(F_ySupy>&d$URuRzh?uYzzOBLByosJU2=iiOCc56-<2D)sacHE z>l{J1WgWK9eCMURfRggVE}PVaI(FXkoDA)QfwwC9d0PpgPsnSt~X=3}a^PafGo_?#2-6~*-;!>^fC$B3fpx^yI zyLI6O<9&0Zdg$1qI1zJEEkU_}+P$NYabb+yeP<=y&c0qrSDl`%6BGkqS{sh;Uxbi? z)@(-3@wVXF0h;!>t>_@Op1bAlcdb3JEzsbUNG{2oyZbGz?*>8F;Z@C=NO6yH2bu76 zSfcCRAmNvzV7Qqh&x^CQ?IL=z^KE1=ep{R32l-2?CKpr*2Ox1knouti@vqGc_hL~V zi2sOchZdl{ygG`3Yf1}o&G`*`yfg}Hdyhd!r+Kf3P?U^~b7U*6K1qN^B(LgV5?ZK+ zQ(cn;5rSLbRU^BbHEF))`2MjvF9T}-X%*#HFnIzr?KmwUuO9JBro%nv^ z`Fk%Cfd#;TW+XrdpbWyz^E9v+`cKN3z!<~j z5`i)dm{92V%(wAs7vEd|qU?O!3et7q(9WyR?fCdUa5+YK90%zyp3j0v*KNI8+eUpS zspQ&3-!Yw5cYBEiy_Fb22`Ck-C`XM>8)AWoi=X0}}{Z#Fs;n!nO0V4@hvA9N7>*|U9 zrg)cEP!%RPF=T@C>oxB!b$M+$t2eIY0o^7DSrTnHwJh6#>RhD<;!WwbbrM1Ji&Q=Z z2Jjb^VQE97;j7zLF|_v~h0vFN#giW&DzHgBY-OGDOUzF6r~a}{uos9mk2Cb~G)5R!+PyxnHQF+jxBu}zE|Qh6E9n|^>yx|rlelJ}ug2bwd173{ zJ=;Y&quv=lx>tQwGlaYnvIRr4oHrdDbj8e^TD=y8mOwB|szD=JY6tZp-*{7PgLuAF zN`GvzfFUYh!R?`f4=mR+)T{v>MTyS$Xe)+qd;Yr-)ach z5#CtLd8xLFKZSCF`t%E}=MUytvue16Y7)1<;Eoa?!9JI(GFkEO$+-^PQWo7Nu~ORi ztdQL3OT1^M2?NEI6b1ls1GD-bs&wVu`3p6_%QN%CEw|n`W}rZ(lQ+V1Yf=}M4&(8P z%T(^7R5n(g=ex;aj~px|)~L^~+?zy4m17I}xDx7~nEH_ITkxukkWN^Y{6jYWGDy`g zDO2?x6TcWtCRxo=B>1)v&8m5UwMA@adZ?{H{&l^-zK0<}3f){GlMc-{1*Muw(Ab0P zQ1{J8oDGId>GBJO`Y#2jLAexJl3KwT_GiAN$+D=Kc1rFcJpDvwk zI@>cMmBDW=RDh!kl}WxS;kFUI0bIbvlxoG_67d~xjg3?v3*mWKWDbwgdZ+^CyOdQp z+z5=wbEczArns+)!DYL7jIvFqH2>dfb?z!hSP-Q>pS*WF+C0feiYRLLayCEZn(5+O z7`@zye50_#TBRq4x*y3&&H2lG=X(T07YQclUZP=3I0yW|)4Bma^z{NA?ZC_RB(lOL zMHdRKobr`+htJ1~)R2e86eL@d^C|NqNcJAh3VI3uh2U& zz39^vU(1i}@@x{I^%_6x*%F0okBb$%muk+6%bf8G3l<82R|@{{Qntt!;l35s^@atx zm3?xHY`FWYbcxp+sCf`}(NRg2&2T|V@}xCoKXdau!L=FEC_lH5VI)@aF;tRlT-U_PID>bmDUOo#b1)9X9 z<2UND^7z9}2@j)|1U}7mAQ$#JzfGUCHz72NbvzRtRoqFc=+%^m5+FZZfJVV%1snX?4| z!fq{jql~Z~Z;xU}E6vr`AiOjGIq578;f7Mnv$6B3df5L$%mlV~1)c5C<3qjuv~{TiW9Eid zVa-pqYPo5Etb;3H-|%apNm|N*d|Z;6AX4cXt2XmS-VBAu2#1Lzt?lD&xwj^PPfa|k zy|uEpEmLoT`d(8HZ?jP0@FjAhEUVVty~;g|_YE>|nxf>TK}RjH*bi0islL3EH_7wi zx@{lp2VpZDU3cZi0fo4pUNL{|E#-h<{Rg1BCNH8X{qgAnjCw6c#09@*sNj0`^Ot=F zZfL|&wfE|H-A&`Z;6d7eo|o0*mn^M6kklhX@c{uCqLm!mc1ksHnlS#o?yz6$HJj#H zhfQZ(Xl2{o(nZSgx!6c6RaF_8&6fD0-BQ^VHl z5!>#UdxN9Oa`Y9{twgUx87Rd3iIY7Kfa53(CNffXDUv)ZS1j`WX1=iU2`1^Nosxxi z;!70Lr)~C8Ie7lGaIgLCcnmz?l@&>fLE?7I>{ZW)SY71vLzbRMH{K_Dyy{{vJoazl zn?)9jA~}e0bWZk7e&X-^%fqEL(FyOeN=K3fLdz$Zxl&3kQI(Xv)N+Ifl5*H8w+)xT z{^C@6#E}-__ZzKcRRfVutkBoLFv-BgNTyp;Pa#C;6F0W3d)GsX`tbpc~!%JQl(TA83{IG zb+KW`GG&_;5Vjrc!GfPnUOqQT_@AVa2+cXW_B`A_exr(&==DP0Q=|8^UOUwF0@RS-AP4E`FmG)8au9|G-RJTf2Ereop z7nG70WvVce#TeCnQ-DH(cX&=zPk$Ax=eE z=$OSa+*FHvlA&x@-HunmPjSGppduS8ly*Lq*VYDY;8sSC{*6A%!d-J2iekrS`y&d; z+meRD`_5&|%RI!;HhkdWqeOcnH2&AQs-O&wW^?U$gq+F*4-Ne(@A6i;FdjCteNa>f zG1}fSb^(kP;u;$-nn-nqx(H1yC6wuy3=7qYPgP0u=4PYWTDIJz7O@oI-Lpyv7NLCN z%Gt-B<+}T4aI^D_4(858!VQ5EcKjR{vH&C+X`eXOootE=lxi`|p!}R{w7G(*Z1l9L zk!GChH1`;@TbECJlI)`AG_n935lMgyyuLNDUs43CdokK+m(m&+%$b4-l)JT3m#zIK zDIBdXS>r>8;ZAe8BE@bv+ymd)k3JvB(xB!t^7K_kk=2TyoxTvuw83SFiY|&9JbCe46Y_!M}Zo26eYu(LySYo-eJ={oRf0J zc&v*jX-hbTg_>3J!SBebS5K#r%E71Iy*4}RN1*Lsb8Sp`wJTVE{Hx%u;^&spwx2Wa zJ~b+ak*+0lB`kU_cz&BfM8WV3>k^_HscnTgXb4+0(!3x14);fM$u3gZ!iC27oq`f$ z7@WUYx2syiZ7uapVZUpn!WJdFi=`437MpO(bh+!r zOZlxM&cSiG^h6l+YaheOq1n3V2N;;iUTYswcwem>i_@{cScE3eAV;c&!^-T;@gE&> zX)T;hE)!|Cp9I;9wj{Rj2%-0pKJbBtTD&K}=!~E`bCq}~9FjfyJ_l_@o(P$;%X)9y z71mOy-Kdtg38tSSZ=f)E;IE}u6XrSk>_$+ArwIA9yjqdeWp^{QC@E2<;-~AII3b0f zM`mxJ$sHB$Tf&d-bH{_}>pbrMist9dms-NC{I}A5#pbX@f5vEU0tbKc6;zCiSb4 zPKNRA$g{kcMYs!Z7Lx}HIJ#~rmm@JcXhjccq5C*`_DV?eYqvN9Vf0<78TH%`>zqa` zLlVsrTJo;PvKr@`UaW~GRZA*+vt%vl{&QkY>aeh!gb2Bv!3Y!|R-z}qXr=53qILo( zuw8Fqr*RF=JvkR(xMl}LLCubiH^`N zn>W^Ntpx<>GQy@k6QeZb=3}x`yk4-p4mPR}sV2ymJBLR)x*bno+h~G}V+2Lx=7Gjm zJ1{|+c=H@) z5@UAI5W2nPdy7M3BqY44H~kq!0zicTnAZU z-S~JU+#*U8ow}V1NSZlVN_%+MM-`u1bYHw!wB&K&%$3=C>S<{n=xR#?XAhh&*2&}I zrV)8xAiqa8sL#^*RV!wQy-GUf{O{S(_zaAb@ zhsmgO+9o6yV4JiDURW&MXL71T5WO`XCkG*WL0po6x5ZSr+;{v`gxzbZ!=4S+s*)E=HjamlSz&e^ zpSxu>?j8R9ZM{WQU%pFT%e-3Ae)WmVwX8vZ-q?nk@i0U|@mUGZQrJ)^=9DEZ20Y}k z4Po~T!4|)bMi^aJ#rk`gGb;svdQ&KSi#MTYHjWeTI|)=2DV-(wWF43+U#EN69CWiy znv$HQRVU}VRigJ{8UNPQJi`p{5P0ei-Aixy@Myjo_48D^4&;VbB%1l(A9uA_F1Ju> zVNE~7+*P?QYGWsYVJZkp{_a?Qt^4>m%l%4fGqE%eK&zg`^s5v@YYuHm4gxSi&+V%uVR7#r);`mYw z;TDVeK+x)mr+{EzI`xL`+%s2ZSW3lp2YfdHLLXQEd6bVZ^W82UlTngsQ|-e$J3j_0 zUX4S8!c~lY-EeNivpwXV+C;FmY7gD{4;2FRh>iK_XJa-B_nDx;ll+_g_nF}a{U%I( z5XNg0Nr{U!Lu4Ne3;X;dnD{^w(>b+?o*zn1+ClgCTg+`7NpkLj-+vu*WPb0+f>N{n zfu{u1KE8f}3-q-1>A6~bTWNf?kHv9X$H3qAbRTgk>jeP{_-h0*vx!@h| zDQx2`THF(gtz66hGC~lrq8DTm!^8xLQ^j8#+XEK%Co=fxaY>* z``k5Awsoi5W!&e@eEZ8ET|{UwOvGy?x_!i($>Oib%;Ru3NXES4sGxFQS{bt9BlQ&+ z?3vxu;%nmm+(>Q&;O#UX>*k>8?&d17X`e!xu{9_kR){1vTrIV_={e(f2JGMbykar? z>8R9_Xw2<$W_rA`mBFDv^b71rAjPNiqa8E>dl1B!3(#iF*zZ4D9$fE5(SLE3#I zYJCU|1*uZ3F}^vyPM^&n2T68RT#4>~g8C3bsqCcR z2(lfMSMvhNPZl4HBAu*>Rta2uz(V&+BU|B)I1?Ar_+mvQo}>huPvqN9e{;CAGc>@j zN81QVEE-pQ0Nc(dibIx93tzVnBL&@$4hQu^LvVLk9(vxwVN4@WDpO&E0LKr&TDUw_ zE|LZdqTOY(NSv|G@2ShIA>8q7JxGVco2lN?3_(^)ZkdCi@$iO55vGA4$6dx0P)8G% zy4d{`H-p9-uOJ!jA_jJR~Utt}5>l39L8okO?|yM8;*xU=N$Ps=J80K>1F1 zn&_{bD@z`X%?Ms6TlHKq?RiM~TjQT)BE1=-jQaXXT+dwMoHc`pRjQH=kd9dOIk15o zcy@<7a*CrY29ZLvAA~bKM*7$Hv!tGX=co5&)pzdj3U8NL?pWGG5xNUYQjz0T$(J|N zM8`=aJ%$N~4hsrVK(V$P)+&OnDs~n_rQt?yFn+%2DGQ(+?pEFaL%M0h(+K>~vAtD} zB-*xK0;zBqpMmy$e>W&MUk@zc7;nhw$+wB(FpilGGGWW_&wj4BkZpmUGXuN(Rpb$s z2lXQuplA)IYCD1&)n%aYUgW~R57qzx5`M&^L(?Q0*|^sEKz_pIllT?PKzO-6!9K}9HC=d+Z0gsKz!m1%9`3)|B=|`ZYu~MmjYq{2B*x$y z`wFoRE#RvKDt^>Xn#Y_zPBd?a0uq&OUSgh))5B}g3L~VTjtgL5W-APC`SZS zc1+qE{$A4R4$$o6bFcFI{RuELy=;lj?%!t+->5|BA?+`{9rsAAi(5 z+h7p&jo|BhW_WJDrwoXyNWIDyFS75UQ_oXqP49%eHdWpIjMojE&>Yu5f_+(Ch?QbC znFspbq1_70CZWSeY^ZX04Iw{Qvkf%MZ@3Wiy+Y|qcF7@kpG{FUi=SydO5pg(72!}? ziaR#FNPF1LA(jQ>DN%xMs>x|sQQZ)fB2$^dw2MP$6OeNO-y$KfV1NPA?hs9T1@TY% zPkJ%ywyM~7=DnB=$AtTQbWeI*NO!b$&=D@pY>HzeZ~6GWv5|$kyEGBfZ2k3EuMxA{ zav$0^`cTvC+_qUe6xB)E(JeriyTU9h?NstApltNJ-nICGV#D>c?!Bl)`|2nh-7~iM z6w!*NWV;(0cU`Mv6dVHvRRvYd?X>G~YZcyLzH_?Xu;iLxkr7&#E*vH7F!cnnr_?+! z1$j%g4x)2l8ee3eM1+o$H=g>&=I7$NjPb#D5A9K1Nbd>ltWv4^y>BT}@BOI$|>~b&^*# zb^lzWwY4Fmikx`R*vf5qBE8CJwoI%kU%y&AXp-Lf7H@u|rZRDhQehKp3CQ03)6J}4 zt@3woy>tJ^HFTJaa#<#G=sSJg9-qUscdcv2be}6`l-wb?gPIsc^_%+mPdQ(N3vhRS zl8sXzz5(i_H&?jQ+AoVxu5)8JxpaqMMHWW8LnSnhPf~LON0CaTNKRoqs$a z1IX_dJa^^iVfr_+Q}yl@t~7*S-aQihKF4SqD#w4?>i4drj# zOrPY@Rc=EuT%*biZLiSOAx({54^qOs35J#*Wr9pe`{t6fE<6@y4u$HvQ%-Iue`VE~ zoi(b}xo)%3;4#>u=V^19j>z<;=N2*)ya|xR6n+GrVw+(^E{-Yp`cNmQoen&%A$pfj z-fQjHP(C$~_nmsuEKr!6L703O?t)+MMc67>@Upp_o@Sj*SwL-ji2Gwi1x)6%E#9{F zoEY)0F=-sRyAuygo8JEN~pr6>Ao<7hu9b&1faJE|j9`-Le*R+7U>wQ6cJ zB{l1QoA+ZCtQ_rOZ_o2G`SOBN%BF122ix)4fP`oYTR`W@4nXkUe0j1q$5E`9He;75UcX!iiW$m5Ex*XIzw;OW$9P1UJ>R@r*p-uR_F87U(Net% zt$N#AehQ+eNGcl-S;>OC7)2X~$C%~qc#MqTzZa4>s1Eie-Ru3r@Dr$)gjG4uyL^d> z-!LYC6P=}&0M$*XKT#Oh4fBdeJVxWuc?EhK8Wcg-pEd_dNBEpqheJ5~v5y`59C4OO zkLYT6YCd!^>>uv)cT4(7<(k9ZhsCr3L$NyeS%`@EWh4tm( zHSsK8mUk2GTY52Emed!A-&zhO=s$xI;+Dx1UsCHx^FP4sN`A z%r6y^KQ!m#>n1T{gV|b!yut|29GRJue_iC0v+-xFNEFjS0P&dHc(H6`BQ?SXW!*G> zn~8aycV>g`yP74-+bHb(wxYb>+CR~`I_VWLcgtuwR($r3!#?jP=`d#X8g@RSi`UGN z>5Pf6$0o>@ibEA^zVrl`>Fuog55vas8dQJpNjy&_bQXkUzmS(N+)_Flg?O!o!}mHC z%4TB&Je~X3zsuQtO7rib2>+=()n*iW*ZnpJKXW1|IG&(643Q1FB8CErU}%7P4C?Gi zgU7At()9-MD?OgK^=AWrZlizoLZ91bYlU)?>X%*JtH+y&5;3{VCUb9}bGQ1}3H4s8 zEDl(Kx)%p27rIC!I?xPN?SP3@v2}lU#qfej(vHq*134N#^$>%^+~UPm;g^q=8087% zMF+r^sMWWruC7G@)~$5OqQuxVee_J(zur}etc5h`XLyqH|35eAl=YsZc=b6y-n4oD z^V~R~v+X7DxJ}=D6ACG69pLl+xV`O+q5yMgLoB=LlBUbSU#4ocduUe6q1a}o0uPtsX85$o2cF@Z$o#TG)<7b9b^?4HAj2}t0Ji-bW0qOyECu%g zd)cBl!>S4p?~0*|t#j(DFAB`GTwYrfsC&CG$wz)y4a72Kl5rk=dh>ewko(?dw>*4UsCM;1()<&dOq;?a4>dcnAD{b=Bkv3 z=~SWb6pWvlH~7+!Lfx~Jzaj?u34Td$r#)Q8A3v%bL(+xO^eFpSFF4bpGO~+s{U`cK zu*;pE0ldF|c$3?HomX!r`?1BH;%wFlX*!LH$j0jVr6l6>f%$VvnQG)+!%(5A_?}zq zmo}W2>RuORiHCS7(WYjM=P}I4WgVD{~U0M#2Yz{@Uol#3GoM4P7w@n4?VU7mo z=#Pf*I1TOQsn%Ztu4m~XKpGOu-aSv=q40y4o_&6Q?<)zNIWo($%?z7Z|2*OXw)>`h%< zoz0Bw2!SaFV`~@~CKg~^B4CP;mluYRkU`bU(TtEmQ^DBU%*6G-0u?u7*Z-AC*%?`w z{a2!4W$J24$jZt1Uq;f*%EHo>kd=euznrj@tBazUvxtM8ql3Mfy(=N-f2AT0whqoJ zjz%WHFN>PFTbYKt;~T#fFfH8Q25m|MKEiwytK*ggU^Kt&yvlsF{g_sTrZ( ze~)C%>@9$;vavF=vcT~36aN1wU_5g!dVHEmwbUqbY+|t!y{hav78f3G<@|g}WPC_T zn9to?Fw5=MB~ByP_Ds0eV(vP`vF2|33rMIZrdIf|6b-4&4|>|7&LUW2fezwiaKJB* zHt(8snvt;z3JXs$3D(=D^*4UD&%!NEaK)=LU(o+8tUxS9jo6Dj(hw{VhVm%{C{>Lvj9x+gAa6Tjg_ z$|nbonG-XQ-y1?cgTBwD*OS*vtuN{766yWNsbwSL3ZQRnm(S!_cSoK399WTkl=$k+ z8f)_FpwIG;ey!y|<62Jqi|OE~wQ`)In`oVf&>TsI#}|8vFvhm%`$vlMun3ByV{p$FAMRam_+vo^Qs%ZAr@_mu?zM+{!83lJ)*= z&vOR6z5zC0;UaH%tL}UGy*Tr<>*A*4#lI7?!U^4-FZX&ASfgdM$aSfF4{j>a-9P=k(`O)Ft$KCvnwZ>I>kM(Npqx569X%=qGKgIBmK` z037Tx!Nxv#ucrM)!7fs~j`-8@8(o3U~&AdP4MjrCfo}_A0lPLK3d-%ztmM{_7j~K9gxO*oBZY3sGu5Zf3q| z<2F>$T8vjJ?1nTtPp8YQf(6{4+&QdO+S_Bh^k+bYUwEAlsTvQE#;~K|Cb+)`GWVn9 zaiFJ&9NXMS1T$#$bUEGe>;L>mM_h;S9(S+y=Xd8+R|FLkC_iJci@oG`#lM_=x3)VP zMaH*1e(bdWQKB@Mb%Sg7 zWg7eEo7^yi8|Z%jRy&D#a=6YT8(5ZdKV9UYJ>L6oG%!mX|D+{I>c*=?SYOQXIXTR7 zKB|@9SNumwEFF^IZ&g2lF9Fnz(}K-r#(m&?SpdZH<#zX@D`j7voo#$sc4QV%iIwOD&5+bL3#u(MpC{^S^@f=1eYB5(^nJxQ{M7C`3yY zbcGnMf4zo&iXCA1(;Nwm66_@Gdu2nMKpy>N!^8LJYyxOok#n^W56wko`pms}uPn!7 zlgi&elnyA^OfnhZfOHB;dnZh-&1wvjKQCwfkGG6imTqI!2iI^)EQnwdo$*?uhHFL> z9kozy{&wV9d)NEw70c9i4|k?Q@4Wm+;7L}Mrt;ojllDSg4`;Z9{0T?@_+>I&UE)X` zw8oYQTT$pD&W*{dJYM?&+&W1>ZrzcSBAgVsp-(B()X_&DMTcYEnD6ma?Ht7fA?!l* zgjQmX9`)gW?S*j<-dpacxsgF&M&!l07P{b@4$s9?vB(Y6xeA*=bxh&=dXVGa#*Y~W zUS7CDa6bdLI3gYO&F%{>Xoyt3&yEt;o+6$6T*-m$Z-etS+7qq-W!I<&Uid{X)#`Eh zq0M*XG2y^9-TIlpK2XxD^pv5Zzh4QIis${1OM;GibC6F!KAr8SMz7z78zLLdA_j?d z;R>AV_w9DY$=?8?<(`YI_10R$+M}<)*Myu7qA?=SEg7hG73AtgGI}3bWkUc z+&u}4+}G?+ab^Jo8|<7}0kYb&sc|urM>CN7F zqWe9btm~e0d6%0_7qLT9e2Mv>PkyNIh2}bnx;+5kqF^yf^E;WNv9G?57_kV<>4vU{ zenwm|^GVnBl8Iezjf325B!4f0nI92*?mq)R!_J)^4xZwzEz{8(yajOIv#7*oC}{B1 z-Cti|3hh|iZ>iQdyg3_%Cghn3wE@%K=wEVBRz59MYqs&59oU}nsUecO%~4)Qu%J|n36oV3 z4nV1{juUdiUw^?|cs%9U(g-!2P?!&>{2TmYMd^Ez^zMd3Y9z5xNn|6>uWMKuZf2}H zJCJPEgA63S4nr4^rZ7o%BZEn+zs;Nu-irN_)$6C#07hOF|LR~D4ABWLHAtC+R|4t^ zWr^7#7K09&UZ=@;);)cuDzYR0n#|LR8aN-)B^1HHdEQlUtY5^f+p$xEPDH;82jcM0 z^e)l{J%B^Y3WIlrbX$(iuBRX=10j30&QD zG_|x?+GfiQ4&QhsI_)KJ?FJ_iL(MBFq(@V`LAOYAYq@#z+|_o0lVhayLa7^KZwa4j*%Ti1 zJ)En10AT`LKDU-L>GI>}NFrJb-E7_L;eP8au1i{zv0j8qwWPeT=tZj&9*zDxyjkwZ zN3ctK2Qd^2AsXj1!Ndd-9tabEwR6}@>w!4w+}O_nh4#;eN9+MN&;SaSnufp7s(<4= zC6Rj_%fwzpAoq|BU&?*%<&E4Q!c@QuZnZ_@5HMAON_!^Df%S)kVUNs#e+#-HBA10A z-H*sZFFFl?!zMXunUN`b?xrg?GD;DJ#n#I0+R6l3czTy~s_Ac1wL^zQ}r zKQ@)DOWw~BdN^dOUncNa^s19)y6R+*GpcBsuKyu@leq`99sZOp?C38EIRTt;s3_QB zEy6xS-YHKW!(VgDbpWV!E(T`~YJ4yczK1BDr{lae=7A9b%@r2a_~{~feZX0<0tJp# z)0wWTA@{A@uI#kC1zqsoU(b7Tfntv9rX%Xx*VGxXV4+`cH}RHrqDUAA6BU32I-RWI zNUN#XCj|-bJz_6JN03r`H_PpNWjl_cwTBxt>-6@3&yOJc9b7jVXBw1f$_)n>Yu)cF zqopX|ki&;+hWY4jW>+I5ZFZr4Z}UnWyzMaoJ&-ss%9u00sW7?UA zLkr@b zM^i5mA`O+@RuD+sRDUB`REv>MF%(VNucnw8sqiMlbbUXOfD(gops;`FfH0bE!(7T@ zyXWd4%yXmZFZONuzJioU;J$C$pH)$t(4|yM)uwkmHnyw|SqE~dJmsU8RB%j;&yTQM;#}(;TQWZ;0#SDAk1-~Zlx!m8VDsQG8Bpv2{3y^%{dThY|S z#@1`YvZoNHY>edW%8A8BlgMra3_fFOr~`+}Yt6o*lsDcA6Aq|}T5?b-ThH85ss@ir z&49zETEsGY8p>~F@!nADeZ*NCV3k}(cZ@sKb(-9`#mCKZ(;MKSu`{G!LU4=q_F}6t zd2YiX8(i;Xsc2{VYS+%X0D%=vO^gaE|7?K!_qaD-<&eOq$$Uh0Z2Aibrpv#p#Rx7G z3;L@CwDfddfLL=?AON__SeM;3$tI5=!Ovjb5I9 zwP=JZ4Aea}G|j6st^rSUuPMf;4DRuX|44)la=5ojwYmT<_rgJfqybN|Pwdj5*{+3; zx!P~#_$Ty2 zveAlvj78V$1goBAE|LBCGfwbQ?#c`8v=EZPRk`~LRKCT_Z#=aPtFN{*7l@;k5E%B6 zpu|ncdWH0wMuM7w9%1bd4sN_REJP`@H=p4@r%R1y_5w?i#ykkUG!8^`e)^S@;nLuT1D0d+^X-T12Em`*1_T-bsSXr<>})j^JVpQQ zT)cmC@X|D*pGRoY`LgmL_9`m>@ zQLme+48j4Bn(VYXP|+7c5)Ho6O$Ug1h(J3z)Hk_$1-SYpaUz}e9-&Qyo@C3(~LsLZ7#R6>at1fvozKJl5;C za#!`X#|1u}zg~--(?C$d8A>y1LNc^4CXjqIc5xbFwPUC;8LxY5T~h>g%`ZrDfJ+nqXn8(YxcQ{9zF~b3z|k?-F0`?bochXDaRQ zH$I{+HM!VGvHkm>ULYik4J(C)pqFGR<5f1XL(^K!TROC zg0RU(GVeY)0=-5Yl2J5M330q7uXk0nLY`fX?ZDx3Ub+YZ;dRftFL zhfSdfG=20x{*Y2>y1FYMkqw^aXwG|7p@YX1=hq+(!Xw|IZ z=l+B|YvNCO&Ri%-HxL8cUrJdRtn8PB^!yzT5yq25`4V4UODa;6C`spGZv`nbi(^F7 zdrd?!A)7KPgk<7FM6U+efTqo4e≫)vZT~5o7wV=N(Hpf1FecZwncg=%{uDm6G{D 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⩔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 Tzl6YH(0~To#f!?iDxm)WgO`$U literal 0 HcmV?d00001 diff --git a/packages/wallet/wallet-contracts/audits/v1/sequence_quantstamp_audit_feb_2021.pdf b/packages/wallet/wallet-contracts/audits/v1/sequence_quantstamp_audit_feb_2021.pdf new file mode 100644 index 0000000000000000000000000000000000000000..27c38975fff9dbdda8b6f371fb657b68c98ed977 GIT binary patch literal 376935 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

pgkCaTruWPO3BIFMbX*nY?E44_3eEMwB0qdQRyl zZ$_3C$!8U0IIqEZTG9GtuE}LEoh~~I)VD!N3Lhyy%z2yz+${H|2! z8Gqu^Iuc8)Q2*%lzK`KpOO?DBERqu-(v@wU1~dhN0p26y+Pu+wY|vArU`%_!0F&aM zFgOL0lWw2^B$QGOqkfo0*0`E4P=1{%^pD{%I`1KhIN21w93cV3yCXdbapzhaAlu*1 z5dhG>$70~xAWwd-KyjZ6S|$OY5DxcSlP4iHJ;*if0%9S9zQxY2N>N$u(Z~S=1XrUi;NzVXw2%$47 z<9YxTsL+`zmO?nd7jmj&6~r7al*lIXx3^J5zr0;ZSRU|JJ*Xs6rY6VvN=l3d;6oYq zjN~Ixt9oF1__X}Y@SFY=FGfI-f6(mo5+cHONaQZ@MxlaiauP~2{4524fzg(vqhQ7D zNv+}l00=QY(|k-IMYoa%@IY%b$}-23EN8aM%n<{?vtz-ZhmBEZZ|~Woe>0$}f1=Oa z(q9b7JLr=Fc;G1Z#omu%xb-X`q67S>I>R86vvxUdFo0W*+k7vSxjIb! zExeorcwUUoahye@Vb59~xwWHT6)6+j)->+L-2u;UE?MZ%kOe#UcI``8;(I?16`7bx z*puAfztHJ!5uIn%}7sYRJq)AW|7R1pa8pX4y$BB?HI~Y9O&b2{L=9L=k(lTpR%d zAVrBD3aQKrc-|?A%CQ4{?h2~{?vG|kD<`9!5sJk63EY~ew}QdQtu|%@(6S+9$b4xP zAOKmR!k081J1`~uQg-h;umzqzqpQp2v9)zV+qr{3NEt95Z};i>SAyG)^(+IJ;A5WM zV%r-KpR}7K0ciPd4co+aQ|sSD4cC6WP_2*weyIp(UdC{BohFZPKa?zU2w5Sq5cEP& zf|R+B)0}c61J=LWjX`b#g1;1aZbQ~gM}7j>A#KJ~_P&q2h<=vb;{xCy5pWeM6OaCQ zdKU|6EHvb`suPaVuO|!P_Zli(=|V0omRLzuLUsm_CVMShjH-nK7kTBf!zJVcaMP92 zy~gq(fRlbW^S&x^ngT$|Tv!YUXKHqvA|pKLc9}_>0Ob7%X_wZkpu_IW^T1(eJRRrL!6HM(qf-H2KXb>?KECe=08IQ@|TBqb$@`> znaRQxjtb5O=3#FW_62zmiQhK35#@@#2J>2YB_XR)mojhiB77&eIBR8_#R_nObv$A2 zKA+E(eBC`T1{{#Sez@4DjJbcA8oDor&l3wZloFpur`)$sAIxl6_y@?Qm5(4&lIP8T|)1EvzWIto^@f8#?8~nj&miR6~#A54K`Js1HG+7*MQRW&%jBA zcew=(uv@>MrAxRbJLLM4Y;uDpq==qE+F^cqp@FM;j7Cg^%c)F26U78$X)St`1SDA489-)ko&M_*&<~62Yd)% zrx8H-a*ycs6*c^eqIx8&We_zCazDD2g?GW>^6fY@r>OX|i{wTpynTs>nfy_JX(-=w z8>dInI@RgxXEVt84GJ#9Jm89Gsaqf@-c}YSc=OYH(V487Em%9YFaf9?f73L>JY94N zT3f&UuMZA*-l{zK4@+(|p2j0paXZ4Ib-^s z=G{9U*4OJX!Duc9rXYXaCDQi`4M zhv*%fu1~#0WG0;URZ*=J#}4NzZs!rtg1(AvvR9SV6$$PvDN(`P-`K86IV;Vh<;sTR~D!E>! ziF~y&Mr?AFMJ-I`dmc>MgcKKhyxfsMY~bV*GI_;H@4kfM5{mdxKqZgA)f7mBU-qr+ud<+iK134S zX|zs(Cu-eB%X+-t*fgRNsz4tFTT0)t+b*)!SgK28E%4c|vr>mfH(9kXTEwl4i4X1h z-g7=)i!T=@L@h5^Qez=3el@7RJuJi3V3C1k&7sD>@UuDsE=WPk#`BbjMm2>J@FtBP zOl~oxQ_(x}ahJq=Km6>IZU*QK2!F$I$^1vZi6RStC-mMi+*leHa2>*`$>3z#>+Gkd zaO?YLYbodnlAY6EZka8NR zKW#vPt?>?r*Ax`b#?{b@;sXW){<+=`rO1$;NTQqbY3 zj6F%aMuY>HXTJ^J{$*O*%2I+sLL1r_vl3bekr$zQ&+K-YTa|q2kb4No6_wmFwA)3m zwVZ`Ob@oG5V?3f}mYyfM#bhP~Ak=-q6L{D!ZTgtU1};Jkxt&|ZmW~9l!$@0`%Q}ZO z7s4rF?mwI4h6Yf4LBmRS7p2E1e(TpM%tll_lN^R^1o*+o`VZt23})7yz`haKb%E#^ z!lGkg^#BosbLTk-k5_pzK7d4wY@_>IzfoMWCP>zxY+lL%9*{T6g{7hp<~{KmHGNIz zwKL=d0C;kx>A&74XY`kNwr`%gZk;hVPuk|;BLPTs5-)w3F>gwWs-nP_v6o_Oa%^3( zGIijYz1}*o2ycQ1?tQrllqvtJ6^{4swZifK$E2=*O!MOXkI`QL8^gR<{%m}!P0_br zQpf1;hKGsmIQ{}H6d1P-Mid+;5`b+Licu<_3HW5d}^^8YqwVOOKUY&fXlp^)uCAs>KO-y#m!K` z!UOlSvPITR$`4)b`L&k~x6i)f)zC!Fhah<^_oq@H>xS937sRu4&MR(=mvtY{SL8D6 zf}(OF?{W_iHuP}R73cG<&CLATf`NMaZmRJ0Hw_SVd&#O$33|n{g{|+3E@t?Yp0D?_ zh#3f)KV#l}=0!~VNr8Wq=Z>4>^7Kc%Uj`h$ulV37njer${1IOK0Y}pn}_1!434($`rv3=Ttj(&o0f>^;9#(hFm|p za89Ef!1`qs735r5qrv4bT@aO(m~<{T3<@fY|6Nfw#1*1R*tf&@Z)xvlpQ*Lc(KfON zZ6sug#jzK_Ro&tjrB=p!8=BvRObQhzDl+(Ve?9j(WRpg1xZlM55qMx`ypj&IE!opg z2WC=|Fv2pmm6t_v!^B@GTo!or#E&z&vG-%Ai`o%kiot#`lKB?mM&Q&_VJ;e#odYu@ zG4K=zCuZA18#xJ&g9dUDC6^7kSP7hm*-OIfoJ3% z=_lE>2+C~(+|I1_gLz;$ppT_ZAUg}oMjRs&%>dcqi?H>_8nSdLj-tl2&oiI;hK<9PeVJiAmi6xHSnUUun2sg71;-?U}GB`0BDTz zihM#BuAaBmN+;3aJrTL$VdySyo&j}8RaP78tC~4oSLUh{0#KEBF(A{B*l@%5aXj8C zwvDJ^qT}e^LK2gl+Jfr@jff!_ykK$3g8+d(o~Y>*Rt^m;#v7 zSytqO3JM9OxVx}9&UMlyI~r_uxhVscLxR>=5~8+^!2?pdLO+Pr09>wYFY%D8=EGkj zaM$N3dN|lne~m<-z1M^x%WA#M^l6mlfj<}wENqY_`uxioZq$@f9v{u5L_Y&FRb3UX zfFr>`2RHk3D;UVHo*?@!)=<+#`6gfwY&bqP!A1gMU_ui`GEk>E!bYiGy3Rz!>Eb=~ zDp5ySI6g7aSiP4AE)Av}@=JbwmlB)K$G$#+_wl zXD#8{R?f;Yl4C&n8p37P)z}KZoFW+dJc7uFJwwKLm!ubtekt5)4x~=%mVd1pV82hAzX3~9#tJVu;{_`P zH$i4L(0VTL4HSB`9_XqKqHP?p*=ytX%n>Z9+>yI^{i0UCQHUGiD28@e$v%t_JIkpL zr%;;qY(Td`Ykyu{@3WHB>=gHaSYO(6EOn2;5#-p(h4MXP*KD(Zbt>U}uQB2z73p$_ znR|;JKV#3aIm(N?lfQ+}%={_=oeV(Y!$<>6dy;%T3xWEzZCTV+k-TN;SwgQG{7#O? zZdxf4+34bJ__Q`XraE#CradbB_Lx`3}I({mhZC;Tkd zE|%l!qN_U;rW1NDNjx zs^MnaHSVNtR_+KNyr5B-1^J6*s=H6xYgGf z+ZD(KOalg?Lm+)N<6=gu1LhZ^-K zf1fM7^@Jj}a~bN|u~S*bM$Y=_laM=392Ri7x&%?~`R;ybzEbG;=01v4qoI0!9Ui6* zGi0<(^DF3LA+~@@s(fBm$MM?a?gDi%ilSj zZY)-H&_BIo2`#@69OpgJ9&w(a(8(I#_Z28w{;ri^%3OXv9+9&1BIFC2l(@uw@K>NW zxs{PKLsv=ui#5(he)OX8OFl1um)cXc&W)nw6J$Vb@dA7L7$rp&^3yt|be<`(Vb8yOz zNe{0En&!)`z@5wBixPClib%l;l%h26Kqwy>AXwcl=C}*1fz+Bvn2_Jcz0AWGL`z^M z$%P2j9EP$rYzf#zH}Kwlc5R@A98G~gDe)TWGzf0N3K1f~KKh}`L#@bU-62~vLD)F^ zx;48^&fM0%f5zxg-<*fRL+lHlsMln+W^Q-iup;G zEH_6m^RX%H9Y0uCHFyI6k^nX$iTHFX@Pni*of5N=u~)oRF1hnq^WhSNt| zPGlmaok(~{5c{i$0Xb$!{2+e|p3A)5rtY^L)e1CE`j7Ns3P8WPnwl5rTq1dY@y|wn z4>Xus>F+vWlGdBbvSEX^h)ZU%U(egvxCEF4D6JqChJjU&c}+d6PvpH2$~uXUp(3!fuzrgK zZ`42)8=#;y{gjaWTfj14`I47TrBbT;L)q9u91yeGiCQ+K<;$|?Fi)ILOo3&C!?K9? z6>8mc18IKMZU}s(_5(8?uMne9fU=a5l1?sz>m7qsENXu%<{))nh^ZX|ZwIci_m!C= z6Zddf8b0(%h&G0J-q3H3jYFNt zD+A0nH|I>^x!EnXLslE3CQ5efM)|B^s`fjdA;I28bfMj&-Nh|dvOf2K8hfe(UB+RK zQ4slfZ+mJhV}g?k&e2~bzJC$Epj_OY*L}Llnpf5c%H$szNerjW^wZv$|5jrQy#AYD|^+(Z)j6%0ru7|8#4R!Sp-4D^>T^X zR19D)WD?nGi5#U!Veiz}2}53|E5nIn;-%L0uBl-`l$`t4BKXiIxqR=&-#O`jPt+dw zHy!i666_ih?+&0OGv~E0)fxw*5wiVs*-wA>tqp5M=#aVzx<@`cusM=&-M;JGKXEN z-5DpWJl|2VU5$tJ!=euo%cN=VN((zOC9~(#VN59Ax)V(iwBkxI5)h%NYeV1Q6e($f zDJ(lt`3gSkCzCSXaW~fFJ{Rw$38g|dM@AD~re2Jc?L|eUCTt@x+t<#E&>A>MP**6D zqtBijAjarCot);ue{WY3N(jkcnKBp~*yQ^4Si-dS=kh9?wqXavXPS@#aw5FqF;bF) zL?OgmQr*qFWegpttd}LnjS8Q1V_-%pvk?z+49r{q5{^zUf(($_udC*6!j{dJN?+0u za!Po_-K(@{5b%tb6VJ7bO%~qcGQR8k9TD|gTYZ=$AQ_Wy~WL2%cyt=6Sth{^{-{Uuki9%K+^{jS8fdn-uXHMB9b?2teV{_(;x<63a@I!lbTfZfh> zj#8=s!gEAMyWYE+pBTRJVViPQG!HfpsY|7WOO__0LN1F~O_0EGydm2)2pQ}9utNy- z0JItUaf*-VmFG$Vm-#wg*P7Fm5=|_W1DZIPcQL$yqr(nsVG8QL1BCaJ-0HcP=t6YV-34s)uA#67AL#{Yz)IFN+W)ge>dmDnK>=^_14Kt%|1uwWnduI87xV+j!42n%nvOnUJBc8|A6r^ z_)t_+C8}57Ck_%#zrZOR@BUxW`u)Ui zRO8(R)=9tz;$SG&MD@PN)OQRIjA%`rLTu38Vg#PD`aewd?w>7ohnU6f; zPhAq`c0YMNo{>r9nKAg92gdq(e-Sl~is;jqbcim;@1mc|U`Z)^?V{Nd5FT2UjYtSA zmAY=<-R~U~-ym3 zTjndj$&iM*J+q$+HC7FJ7MrM^5aYFa4Nk3VdGEK6*FVv7B|BV5i^}U3sJoI(LYN7_ zLH5smxge|d+)bK413sBEbwul7nFaWgxvnGpqEU7wCL>gKrJbIq;FD#!uH~6CbB|j( z+Bn7+FF8gGp#8-t zuAm1V{9iG`Z}e$$SZ&6>orcJFnfK1caq`pt=yi!*g;XR?e7N*{f*b-knMmxJ^>oCy z)<6M1>~;2G+R^T21l;|3++T|#QR-r(I5B~GI<`#6A(+4J<0Jf)-a*k+!RK78{uGEE zF7^M4I(l&gL3e@}R&~61$H{kqt^c$g2$Pr9^?C#+E2}S~IpQ03JOe(rMTNx2BCpRW z6|@A|F1OSxsP|RhZF03^f9E*pwzHzgr^W=iDLHm!UItW)o+vvZe>rQC-U8!g_n_q| z+S}^iSf89OrqZg`O9CuZ9<#nbWu?n+;w?>>iC9=$uUwFj`!C&>PGd_;l;!vGSI3S z-FMz*;az;5MxkW1(OdB9ToiNqgsv+?#wuR{!(_W&hm|rN))VXLXs=|!@Y zPyIm@P2w}OlxU3U6`~Fp%^`)6bi;L^Yh%(waUotVz9kIC7+C3*l+ado*?3GEAwR(G ztJ_x;Wl~t@U3!?-w`S%DiXcSx{F7zZhW!9>2-K>y_BP9DZc*wa)gb$>8HLaq4w24Y zzA$?(^AGCA`z!n%XF&@^9Alx(jNhay<%I5CKok&$Z(oD^!wH)+f_lSY>{B~ zSs1BMS}M4KVX~hlZPFpN%Ln9mip%|BLM?%ecD*v6TsF*@=TOEgG7uufY=N(#AzDy~ z%6iwlk)v8FAezy@QWS-8r9&|Mr)I06E~X02L!xGLQ{Pwdc3!e!!;f$Q?;6xTOrk)AnR&HKxaP)^_D|aR;qveg zh-9sf_R(V_N$^;5N1raPw}zIPFAr`s&pV~1gIhSvrJY+Tm1N7WDq?@`d5e_Wi2;}h z49t+;MNEAl4C~@Cd^k{VPk=GZWDO=8st%*Qi_KdN zr)!Xv42v%I7$7q3al07V%PS`LmBy*&MAK2q`bYQfcqj%DS)EflzH259ahp@Ofyex~ z@UAk5b_vA+RhLPh^+u27+&(oK7CtYZiX|s1N8_5zq=@8xo~yq;%3^5O;iZFmCdfl4 z{owd3RIb?Ws<}Ll2{!oLSo`um1~IMfPn@)gaaR+H_qkjlNhN%YLrc0qR1?cjUug2tY@G(~m zWj?X;3>LHWgs*oN@Iw+|s2ObY#qV)s9Bk1mQ!hpF+ol>!uHW((tpEpn^en^R>!A*l4ITwu<2V z$nOo2B%RvJdp|#Nqa#TE-InsMflPe88?%|-a%>{vcpvleA-`;Q%hVqFlw<>h2*U>XtV#RouA z;{KJ;Z2xwl|2WfS`>phU_Dq-e4;`2qiTE8^k_2LkbnH52%6b_tEtKyy-bu{}7vTkQEHT z0@Ks+-rJl6R(f3MV-qO=*Lr~v`j?lVQa8g%DIPW|+Vo!u$?@+N@=sI$*6}}U>OW=v zZED`=pQarZfC2={f)1 z(n~uSyZ>|5ivMQf=GYFvJJ>zyXJ~fxS8Nsr04w?{Gr-}CJPbrnAe)~&3j{#d5$)Sw z3CZ>E7V=LM|JLz8X<`nZKivAMJ!1pp@=hLr@!TG;0pemYb3<9k0Aom2Hwbj5 zbNFblw&0ORle=K&h_7NnFS9B1bPGn!-AM0Ii5ik%Hu{I z9p|8S2nZCMXAlV>5AW3%5Y9^R49f2CgCw}c_B((8fdUQ!LGXSQ04RGrHRNT` z{8(VN6oUA2sUefipRo6H#$xMkji{jGV*!4SY@}g#6oL|7rYx0YUO|{23P_MUmd( z0_20c2FpuC6$<*9PuGWWAt~#d_2BNxUkrf2&(fM7kEXylIjn5j>4w&k2WMq}H7-UEjP^e&4otr3*EE=0^=u<9$ zSOu)wzmorNB1jINx4`uOql5o^@jnj_*g3h_|ICfY8Lj~sX0yG*63FCa{xqVIIA9QT z;WSMpp9Y zG4AaIhH%Wxcnj?S1D~oVPTWgkj*pi$4P*t}lWAV_l21N3hDgjn0r${jPoKJ|EVp#T zgO?zLh1J#+gI5;^$`+5k3TdpaA*D|FD?IlG-rP~P`nACH1?h3&#K-dEiDe(bj@0QS}sQO;c+e!jHtN>Rw- z3ra4k4>)!!z0>k|DEURdF(a+Cq5tBXEMzxY_S7aP*)ZbNUrVblW`fX{9^XM;FOKP<3|@-N!;*(Owf&4j@Mw-` z3!aUUX`uUhq+L*E&g0)SKu@SM3$ggyZ?y&cLmnd&=`m`s1NQH9=8ZFXJbelzN9tUAD7;sYEJ7kXx!y zd7K(-dFGWwd&k6)R#bUsDX73LwQJKld%dSP8!QnL z&${0{Xg=5htxtJwT~n-Fq|L{wZH5~uI@y~C5_H?3=Fejjr{pM8c4ah?tnhCL1|t*Y zdTt!j4!&ca=WkAV{no9Y42-KzX!Vu#eGVC3HJe|NV9ts$cC{cf_6`}8EGr-zc3HKl zxG`*LXJ7ilI@@m1hd*vn=dgu0C`wrFIt z$00zlS$9eI+*8Tmi_3F?H-y*vCV9IupS}5>GpM%>`LlSbH(W;V`Dj>@MSorBDDI1! z!q|lKNz4m&a&(jw@*^|wxaED;oUmaIp`+qV?}A-1xi4J--&sVF#(CIVOdzcCCXd*- z(v;8kzL=8Ri`>ZS+fT1@!+177iYP>EbO$vvd>PZ_yPfj-X?ii>bBTTQ-M6FUB^{>t zi*D{kH}(^=FTXvd*XmBf+6Gk0n7+SN0SmPcpFfQoaF0c@^KPkR<7zXN{gtIc+KKON z6~Pb++h!}C{Jebr|GH+te#7g% znlK@5(SOL56rqFcAaw1pX8`Ke&Gk;C5=67fM}C$LnM`oMDhEzY)Ys-*!L>dUNY2lk zw5oG>$DU2wOuXaRo}6gi7AuFZ1TOG=0+cMBO+gFIi@y1jkU!yA$&Yg{U+NVExoD!O zx^dTsKp{KRJu{AvZg=-=_YxCvt(IuVY3=nZVAw6&`vwkMb0v8X{PL;TM0^rZlWoA; z)`9a=7ihZLi`ro1mZnw+#DhJ8#2=ub_z2CTDK3cvtr&&ln-F!0hUT^x;+n0^ZsQJBWIofCh5~0D;YyDk8@>S#ASBqwr?P@NK`6pqHe0^{3 zEkVl{h>NK6C+01o?GXa1r~QyP_8MUSw6itw3jKGb#r`YQTXtdVHOPwZa-ckKa)C;0 zJG$n;eny>(+)D>PZ(@;`jr>umpJ%4B>?Ti4X5y#c=|oFzK1%ey&hk$%u3C*r`7ZEo z+_kLsuO7D$v&!FIU?~zZ@VwuP^!d6@toKyWing-V+Ja~x#{}cvtf@DbpA(vs!9(Q$ zg+ZdJ=+g>Chj^_+%wJhQ9*>^G>|)Vi=2q_;dfe{vGM&7d<=|RSTN@?p25KNwwuwmd z@ToniE;@>NEI6bz^|W|(62C@Us&cr*_i%T7g7tV9qJ6s^bm-SnzgIs=daw5cymd(E zoU25vPG2>LPm51;>*=~NGp;V6;--qvBl+Z>op&Z?ELyGAb+m}DK_??%ysgY=E!ZNh zGG_J5i4~;=_$67r6ezEK73~4}hHyf7HT3k{V0Cd->`dfsX@ulbAMA`3$&EK*JkREv zdUE;4G$p@axgzOc&TyqBeX#3@@qd|{ty{Z#b>eK9?Uy@d*yJM@QaIxGEofg|y)`#j zwORAHUza>Bfk)l~>@ZF&S%^b38^`+P{S?r$UCCD= z`6l0Di)f7%;Y`%rWn_BKI;5~pU+7DM26Fw2r7ozJnFMaq%6>)H{qAm^`m8x!A3YIS zUtlw<_KC=MW?O4DE1bszv4FaaN3@6aJCLfvPYaviGV5E;8FhK;{i>rlHnGrqSGs%` zS|Tf9kKo%@{FTAm2_>dutKK#Q$I3Z7xJppB;ak#sTd>#5-cd3|`;4`lFVOO;;Kxgo zKF{!WognEM95X{Xs*$vY*ys9zv3wAop!me=*Gl%@blg*GD%4*0Hps-9CXqeH1I{GycpHw>kI=G&w|e z;?d<>y7`fii?mLhEnUJY^)ZT+OFwl9TgyMl8z4KYrq@%yA1Mw>RkS zRZ$ab`xP&*<^u3_180F@7*gurb-YF`ezEt`69Us8g-?z)rbnw0UhwflBurZ(WD4wT z>mS=a^)mc#!8HovWfKRyA&PAnOG|sJjg;<_I2ElPrIDK+S?}+uW*LnA$Zko;XZF;7 zhMKW*T~+s(hv)mWL^sRezvN_^7o}lT?9!eI?Wqe6^J-u(8(Q101wl(;<#-EEGOSpZ zqx87Jj^dX26`Sa_1QqY)E4SG6HsU*3qa%PgTyR?$_`z2zU(+UR#9!rYKTL;S@DfOF zAyGUU7ykY&XP&q@`xBvkqLI=M95;pn23<_r%Zb6XB#H@=)1jnOKJyWw)Vz9Y*xdP~ zy~z6$c_<^;2GxN&N?wD_BgDR|2s1@r!|_;ccg+ugsPdYl(`T4`Dqs(O6EPrREdAuaZ5AdzQ(!vr_jEBuWVlhCS# z-P@IUVeRkUQS=#}UJI6~)M7=uH9DoMmtDsom<$lj5uoWg?Z?g`Sl9^~rod3*mT56<&;1sOy|Htl8K$}AQ<(9c z@Jr=W`cpD7Kc_XJCku@NrYeji|Q59hGi8C8BS_M};j5HIY7SxaZg0Iu0Qe z<{L{iZabB8AD0zaqVU+(!Xodm&u!kMaum2+6I3!@Z6Oz(nn&cWV|3b+=iHnU##=fI z-Qmn+c<$|$V?z`Pm@GhKYd571G@1N36UVu=wtKDTM7I&qRoT*g<6d)H9XO&**4-iM zWnTY}^b=3|sn)6TcqjPqr!0_k27> z1Fa^EB2Z^#-BvP2-iNEbB1O%gZX_i@ngkm7kQTtF4Rb!}d#77PyHeR{(nx)PUIU3; z6iuET!UxAIG?lXMsi)yRn7bDHz!{ov*VYKVzonE%RFX!H^Co({oj}bUeD7Si-_Rlz z(>oI0-x4jUT%6>$pyAb?Wc2Fex<>xl`jJ;C3tp0vPIUgcOv^?W?`-#JXGvlCe3#~% zNM#93`+eyi_SQ|Pd-F1Z@JDW8@hwZ;NCkt%ER2E{|DgGikWF7JL+Ja>mW3w z%CTj4lx5k(sV-QF+Nk<(ws&pgb^EsSCTL57B_GQ^lp^;%prq`%ZYKETttG0bxnp8~ zq%Yg+RlwzYy(KTbVy8+2zCJF=E_y|zg?-3>AGQ5xto9V#cC=yN~osQnW`!*Ll#3aFQQ5w!1NushM&Q|AY?m{?X4jd{v*<`+PASfXU3zq zWXfx>``Xh!fKC)f22SFDLUv_`v(KJhMdLf#fF=IvtNVfxTK;nloQD`|ThbJBu^N7C zE3<88>yt{c-|#9vk#rl}uT|pl1_ZBQeQJ9FkRKer%`$Z zlfdbYS+l!{x|gQkM-(eHIs!yjZZNu8qE_Px;l|qf-xy2t(pC;#Z5S`H0fc_tAAa0X zaZW9Ub3>o=VQ~c>jiPV}>@6fSHNiazz&xpj{)E=b#%?&>`|)vb-cwxyiKz($+vNdk z%gta@TbM*hA=`5q-Xqtwdgy8NF+}%C6yL+(U zy12taaCi6M?(RVrcXzkI;uief`}xlIb9!pd^i0>OuBy4Jrf*e*1)(Qr4vblH5w!({&x4-ENDHqN;csNH;DhRV{nn8B4 zs7keinn|&Z=G@+@5XlwI_kJSO*0ofe6hZPNm7@@xTGSRw+`!iNmTFAlom|v6f#3+% z7ylc-SkH&9`&QS3aUaScsZ@5~hyiQGb9q$Xej(JV()fU|`A{$XZOks+ZLezRNMf>y z1-?PY%m#;v7M4jxW+w)bGcPWql{7J=(zmS9FZz91u0l)v>Xm($5BqZ{v!ym|q3o~o zv;PS9g;FO=ljOg0eROjrH<_MJy&8?Z&H8xRkb-naw>H&AFXOw1P1Uwufitm6kuF&7 zP$L=Y*}5zD=n`UV2ZRg_-|i)q2tL7VnAn}ck%xUX>A!RndcLfiF4V1_Vrs-(my~a) zF#DyLc=W(DN-daUI(@GY$E;(-4yVT6xA~Mfx!L|t=KJAo`MEMyrJN+Hd}2voiF`Ed z_f(*lkK)R)$V!^%)v?Tl(iv+!2}91&Z=naR_(MQ=d`pw=2ZvsrN5}JL#0M&g=5tA; zOZ#Rff^p|UtU28Z^dlt1HuSd8r#C{WK)Z1efaNRW3a-@;fc&n;`i)%lykUH<5z|t$ z*b<{DFBF!S;*?X1$$Y4(E((4v0b2Ux2i1MalmQc}KJWLG-HGheS>b$j?Bm}er8dGR z{&uC`q%x1z(x|#?fZK{DObKtApZ2S zo~o5j7r}OQ^F(I`xcNVeg;%VzykO`}7}P3QJh-`{E9iqrscbEbdQNWb&DMwSPHZd3 zmMW6x6t1ZAZk#ME&6&_Sl97yytZRU)3LSOR0lnd7V(?p>mN z;fZZ2F{a**g?9ti2*(XH*J4-2DY##`c})c{BFNjYRX9qbi>Ek=Z2pvWe;`?=cV8ZY z4F<;o8ay-v?9#hUS?a#~9M>V*rn0@(Wo;Z9t{_vqC^%9ZeQpEWsnmZI1pEw&>YDd3kQAQ@z(_ag6TugQK?AY0i z5UFhr*o>ltG)&u2989gQQo@^?DL7GYPwDlfteMf7?tZ-6aW*Vl=I%g>QIp z=vs7ri`=T9)=B_~WYqxJZbiX^Y&rs+O0csClCH9({-DTO`YxeU99-5iYS{Ak#n~9U zvm1^3Itxl>(j?rCsuM8_lVsJH{y&lQEMP%QCY^iNR_0p*M-C$npsm&L=Tv#ef2k{p zyv76|s9}I-$-s$(Bs2ubHx-Q5-X?qANe*VsF8tdg{l#ay@E=9ixDI&DnW{ph(MAuZ zbS?EGq5E^M-52pCcg`?&w;-gZibi{x_o$(KZT3+$}Q^?314T304D_wn#%|f zwd!EKkm*S+eBaLNz1YUKgKAaN-WUkixt7{0ncex^jHWqF`2PIUp7`QqwfLWM1Eh5S z$4I0=Y7k;}M5K<=Z@b!FWDXJxwBa9~h2nJ5951=!W@5oW?xtwjNDlO_Q4h|X-9P>} z!7wgySZF|Ie;^vTlVYFT?Hn+Gg=Xh{uoGPywC-0dEkZwRpA%1DY82}19uFTx%$UXsz~?gxwA2_OWc?bA_Wahzj0l6 zaq2wMPmk(TnNCM+n*Z`eO|aGvx)VuqNtQ}~h%%rxH%+XHS5LI^zmdaQ8_Z4{HL=)N z&iYy;$yi`MJ2ku*v_tf7%?@w*D=8aTxVLkpt>>REFJp;mwnpjEvY~y@4r3~2iVHkc z364AJ7&M-3F=7KatKRv)%@b-P1MABqu;UlG$vEw><|3nKFZ!=ToA?Qj0&KCjsO=GG ze5O(5E^~QSJK5&Aem?lQ_t)%}1$P{Vd3rOjd9Ij)|4@;O9{sH8#oxqoNizE+HH0-` z@649xKbBY^8gEb!V<_E1PK z8kuP08uK9on6Divsa@$%jEB!K!i0e|wfW>r)5=A5HF5p9hDe(>@yH=2`HL6_glG@_ z`c$bZJ21fbbwHSmDDZPl3*97E;hMXbEP{pmy@6UC5;I+T7-^q32j@3w^2Tn*L#z^s zlqyp;i5T-no!^{2S}oqQ4eN-CdqnxGndT@-NWTePxyMN-VRC>-H7fc;oj2)}{L3aT zBY!@!)en7F{^a$QOIa?KcdV;So_Dr(rP}2|w@m-p2_6ZprY5`55^A)SoI^^y3oqfG zNZzutN{96)YovnScG?K1eW6qHxsR7D*@Iw1q7$$0Z2US0$|8OpCWi zbCKsjNCi_;r)VeHV3XNx4^$PUAjkATG1!b3bTJT5V9dS$nEKtDTJ-ayxqvjK?<|Kt zZW6&7(M24jI+3T z-+ooH1PB0kz7(S)Mh`DA0wbwsh0pqHMz%nI#mz4}r;@;Lzcae$8_96c(bF8A$y5;YiL277?DygQ{j)-0=l)H zR&(x*c zR*wZ_=KY_2kA$MguBK({U`xEnFi{tE>cFF==z27laZtQtGUs%P-hB0+cCNxTi&R%6 z_~CW0tsF^Q1;+g@g^FYBv`u|0Zi{k5p64VOdUFK~q$=`Duy_y^TD zt!(n>Filo?!lPva1E3ugGSI}Yq$XwrwY#Tr_QkQpaJ%sbgp$0~RxE$3K@{kBAdki6 zB%VWiq&&CB)kbnaT{Y%D9j88o=%q#&>cJ~QRQ|*$Dd^NAio&Wflqz-bDZDo<0eQjl za**Vj!2A-Gdt|G4$R+f5do#6h+LHIQ@rovzt~XImWHYadMMmItU1kDXNVBY3fs!Ri z?vI=SY@a7>}%!m;)Wc#?pl{m~iWMJQL6NoFtk z+h>$U9wXv@P+)yLVhd>npvqH6s_*=$>z}1L*5JA#BWWhw`XlW!W3_bQib+R00aoj> zo#HUu9s@%qKx_1%+E?bMC+bwE(dM6Wq4DCl@3Hjq)J5R=a6tXHrP;4g72&#K(1$$@ z|3slJe?hB0mo-jT{Q2)qkEa*K2lDWO)e*LIFuWue*`hiA^he6pC$WIXNepdgo57JN z+1QXef4eYMlxHBD1EO^DjP5 zq}$AOsjPAu3BVnA^ zO-T-BP#G9We?#X`roEV|ng%?+MFMn0eV&|)$*m)yVIA!nr8q!1cyu;$qH+w}!D96@ z3Zs<(r5I)sDf=?pXtce=&PskhmLCVdynM(MtU*IR5kL>U^lONFM%Q>@F{C+TktQ&cq&%?t!AzqA>WMPI7&SwL3AYzFt8>KH_(Ho z2+8Mbh=<#is)4wxW+uAQ(hLE<0hrWjHyC2|m&PBJT_u!eEvInK7+>Knuoqi+szW`5 zlJp*HD@a==Q}&Ft)PFck{=~{j$@JHR&Uh%?Gd2V?ek?BXm1B?Fajm4pgXM9`b)RCN zRwuSF+No>lBJ%$V-dEQyjlnZcg^%99zBkEJhx{y6X+5y)8ww0!bOfy-fS$9unY5~o zW$}~N)L(zoo3OY~=;f=RL%x|h>MP1g&7{$S8_mV!Uanwp1u9WsFuUsYSV1l2qz|v! z#mFXRLdn<5W~xT}T`-5xs;xZ#g;JKV><& z{~!Xu>JX%o!BPQevD4}4V|mwPGLnrJZS-&%>LG3Z?%&{1LTeS@jf&@9eb`41Zs<7V zL+bptSCTwAM#@Yz*egVh(zT%T@+WCNO_s0rYT7_L zdCeb@jU4;g?^&4fo43!zTA*yn6yQa7S~=;;!5`>TJbd+$-R6q+{rt=G3o9IFW})aC z39iT@{NOV6`>$ynOsQ`7l5cVv1%%<40}SYbPF~HE893t}R;MMP3Q~RT|0g5ddmU>8o0690qV`6XW!OaHw|4U&-WAX*xGhTlhOD#H{7I7TprodAzJ$kM1^|#Z%!@b z`|ed)IF*5AEt<-Xd^{=_=6QXqg!yTEdzBqPRLs?$u=SQH;;pq7H|&=ECs(pktp8n? zsyc$0QT^QFhE#vqr=Gg{HSNX9>=AI@q=RkN97BB4wRWTsC5SJG^%0kjqc_~;k0OCo zMttU`b?HLF{~HpJ1ZWIqCltMgb%fkkX4%b;;Hd!e#@lk&OU)E!gkYiIx7w!d-D@LP zywsZ^Iw9DlWuDh~l37lQL<=z%NVTKpZ%roWRa=(gdbo~YeYI)KxkL_!MNIvvCLQKa zT0BfzA$1+PI667j_2wC$bT%RLf|=NQ~#XCPvaln%F9ys5e0YO-M%5nQHK&KeVj#7!dMSd1xt2 zBmH-k4JJ4LvJ+cq_oi|cV~Dza~u$1$|vRRR2JeH(}M!NsKo-l=u;a89zIjT8l$Hb!G>A2K_KSr91#$bNv| zZQA(rjHJr0ooI)}--h7gRi*Ta%qUT;NQ2w}Mg}B=U&JuZ6*+vRKUN-(Ju0f#`P=SD zWfs+5x+Jw*Sb|QTI^j$M74q~PX1ThbJ(krjvH7jg~YYPHKfPv%n0iem%5Zo9zM(xi9Jt^14LHQd`A9R!YPGxsA{{v~Z3 z$4GS=fjwvHfP^7|?FiS4@_X31x-2y~eZo`UmYJdK)Q`4nm zRsE0zLs_2l82Be?XxwMxu?>P9ih(r>GRE6KAp&2mb&Gc#*7LCoK8oI=TIu2Cj znGEfTUaO+!3Tk#cUYT-z1U!9{?$s@h5zi#|0%UC8WExUsWYq*ret9Hz73We_A!HA0 zuzPr|-IagRQCS`tSRLKkC)}G(=nf0nB$=wL(}SifD#|;B)jv+~&I!QBSI5ets3=#SG zL6u2|d}m%k>UHxsK&b-o-Yn;r_`A=N1ma4D{6l^Z%c8nlp>pFw5Hssk2R%Ct z+AobM%4`1dpRSuQ@58WbYL->Cw9Cx-eK;xm(NU={n#s0dw_PSw={_%?UO!L-_}&Wz zdfp__Eca^3I@JYyH^c4^_e*k}OoNw2Q4AVSr$oz+(=2xE-OF8&B#=SVB8yI9ub)n4 zD{o>Eg~Ctz8hBeTcXh<>Ak8@%`qk(OIFa(Vk6=?qm8)Y{Io#|)Qz4vFq-`f=n^A%K z6jlqe0Z4fy#us_g;VwYW!v`xV*io< z@hFbw#efYM72ZGh+jB|4iYUAE&sYfnykVlF>DrXE*(Tw|3$MM(Ev%Y|#afE`g+2^% z9za&#>CwkF@zY3N%_z1O&<21PN(rIyOy~yt|CF|lQvO@?|B_X(+6N46{Ki{?LM%>M zjp*Z2fuwE`Z3NEUc`2Yxv|5amwZ0VEUu7-UlgWqs#7~kN$nfM{U(?ASV1oB{duBm( zhZrP!AgfmjK$XN3+G2~e8`2F;;vOt#^wpg7eP(ggzu3Dz2A z5aWn(aM~}?>VcY(Hdso!ygmcwHTH0v(|Oik-;AG7Z3 zZEL>^af)iLT~gGLK21LBT(d^kY)P;5Nc&1Z4~IRy#4-}U{)-nA*!No|71aj>c|AHL z((>}&iXr(mY+#=wT}N`;{TSwxS)t}7)saM63%i!3R-nKqZSrFP-zpbm0E5QTi{Nm( zyw=y}l>%$NUD%2kB#W?yXsp26^S0Dx;+GNc2J+OMeB*Cl_Tt|k4~_Xj=MsW1As~iC zznxWyi> zZzIRGnm967OOGiBWfb_&o+ zjjwrGLk*XgdNd@yD~^4BHgE@P``E~=Q~f%fnv^4t@Un0PI@5M*v0f?MIxeDK>5eyVi@;2W%3+r0RQ`N zEIOVAd`bP|u-bZg^Ue9pI~aqUCCGMBxQ@lt`HVWUh^{|*EiaC{FZQ{MWH=3#@n5dE z)_VHQK0f^#aHGetYw~LkqY$d2`KjU{mP$P|QduxGl7SlbjqL1P~X& zMS%r$+cXte&(-WhtxZcC^q|Smzeu5RWdYCF@sOjRL$1#hT-HTP){VUhqtAedLfAuj z0{CRoEzS)7FwdH{6S#Z(cPQ#0&P%ZR5|tBktoShHFfZVP8kq+9z-Hikkk;||0_*YV zwZ$hI`bE0*H%*6~Z{9@&cgXgV((kpk{Uo#_W5t@5H0sJxMm;5m91W#D|9AjG6L03g2cZbUgpb@E3iSgwv$mf_DpD2?^%>jrKpv z%&FpBH~|to*4ACtOwn)-Jeu7#=kD5utB4)2jIh~R`}bKAC>fw@z7P{Lf9I6bwgKFk zkNm?E(_Y_M^b%Hx9T^|MfzsIp{RFZ!15xpVCvgOmPGEOgzW6W2wPz4$2)T$36(*fnmmRhOY3b* zS23IiE=Z1=4BBDv=t4Rfws+x)SUU>z^EtE+Lnq?h=N9CyfN-c)CSJlOY=)BEEg3z=o{PT3CIE%=grpvCh|am0 zv3$1+A1^+TAYB7jwvIx5m-(f#j9Z)51-3R`+C2w0uiRV6<|+Q&I5jv}UQ)V!X366n zqJQY7a3e7?`G`>EKCtw>U*D2FePklYJ97E=w|>uPuM`h5$1uO3%g&^`&BX=z3SzIga&{%j}@>2am zb*E17{3++D>3tohzJGU9{#X3!w6)uaPPM0bv&6atQQEun#{a4Nnq!)8@c{Wa+XiW% z-0w}@YkiO9_TJvlGX&VJKDf#4|51CQNdi`y&#EI6p4w9%P^xi&yLL9Hd!)qWQHHoO z&dI_(gMas5b`~!?05_j7ORuo*W@T}F^Kt?n(N2^|LbXBSx4>3K@x5jqwT?u> zc*I|7hn37>1=+UmE&k59Zeq=aPOi_tBy15t#+7{i_KwRuB2y#NVob5@fLjc?0hebr z(jT1S@WURP;Z;HlF=dqx%TttN>4c2?InY9ruC$-v#NFNNUsjYQ%8GcqYG2LWmqIh< zhaU=o=^5u2it|>WdqAJ=%nP(|64d22)LrSO=^b{@`6L?8kBh#r)2M_(b^``aFnIX*%mJ=B3 zTm>1(6UFfwhv&Xf;1k`y+4?&3Is+=*4@&B?WA|xzO)ECVTzwh+Co!I^?&V z*(c(;71fyubAX==d)U8g;<0N9(W(2!-6=`jB}iZ4Tuhn#*;*|Y>OVYJ_Z00AY}n`B zu7o`Enk0R|qtg7!L_xj%6ZP;oN#Sx%Xlt&(64kBLUr?cXXwL%lv*=>!Q?r@58$&x$jR{>h0R`n&Q2=Z??_3T}5%X zH@n4%?1FTD+8+%#+nc?>>XA)jUYNxc4b9#WJF%9N#3kf25Gp+^jm{hLG1Jg`cWrVSI3v#uRF#CIeLoOCwR=l*_P>y*=`sM~hkuI~PY|44G zeQ4$IEn-i~(t7b<%iq;KhHoCb^+wn4ClRbcy;=*Kup}!TZWf7q7fVT=q6JC+B51^r ztn;Ko`xa?tmhGRKIS)KDd=;jq=DHo#+R!E@hLopOq?)>7T1TpfuQ6$qj4Re~gn|tP zzHbo}ianVpacHy}0;@R98j!kxup&bCd%W-QrxxdP1N8e47Mfg|5uyGsD&ino8NJa!-~a83bC#Qlco>o0{h4zWJtTx5Yj)M$ zo94|BHpY?1pl7>%e9M7Px#5xFtno4FQ1_uKc+&}?bJ_8R7|)&0024L(noUfmoQx7Y3+oWXp_MO%iblAM&wGBb3yoiEqzEVS9w_7OuAGupD@f;GH zRCSULeer9hM?BjoGQY$$KfTcK^UnIwICO-k7zd}D_`R+00usUDYhq9+f>~(q5^#U- z(jXm`f4#SHgaofnlkz{zJjTEu{77Syyc{~g{g(Akn%OUmyB(U*f`*7fnl^L#fa;pn zJ%=y-RLyGc7ECTnOvB=AduJMs_IfU`ALm&g)S25^N{)Bb?QLTuq1GY>*Tcr*Ctt3I za+!1b2k*UET{sM`4-*jDZ?S~6GE4oVrg)!1Kpz4Z8vN%Y8u#bH)t_{fUuu#KdzZVo z26N%6o;h-PefkU;C0mn!T58NuooF4jS2GPXMDtZfe_?WD(JMqRl7v^&vh-z>H04N( zCCXn1Z&{Jp$rKTSubf@HklPF2xx5q1_rsp1GjPnGJjG{cwED{=S$fy;!veZ^5!9}= z&V3X(4?qsqi3ccvL?Z$AB~f>5(idy0E}59LDhG?_>K?=ZqM2R6BqGXFpQzCvI)ZW6 zd=61>0$1{%M?t7Byg?geTEFn zPE$+{d2xnA)s19Y8a3YW5cYhrira6N3@6$A1x~GMpUTLEj1TAHPdx3y3`mNX3|;ea z)<0a<^nBFnmPVg*weNPzj>MSFQdC>{-1GN74^l9&T4Yx_&;qdfDQdk{(m^;(letf5 zQzwUfYA%@bt>cY_y84s#ARa>ob2e#(XXjAuul1^rp1t%JF^Til-OU(tCVRWv z8cSCa&xH3ELwpUu3sQMKJj1~YhVY1``m$3qfaB`$;hKv0FI*raz~%1i;h>RH&7Nm> z?5N`QP-ool(K#88;*TC5Hp7qdZ2I|;+)JfqmmdB_)?MZP84pa(!MW)PhflTi5FD92 zNN2%V%xusfn(K6g%khzs;A3|Rc}6>+O;1=I;EwSq=lj6V4QniZ-^*!Owk@h z2`uXOj^4Y_oBgijB(c&JI!^SJ4)X>JUb|;aw->SYr?95jQHE+$-0$+bG92vnFdqdm z9gbfkTI$9LcsnI0Af9%s0x$v13*3(zbE1U;jF-AE=#;Orcv~D&Y|n|aK-*t_wu=kL zjQVsX+BIgfT3^zn!~DT{jF&8vrFz>Djb_JnrreeyE0`7y|k|4Pqc{fe%=fGf;9A=6Yi|ezQa?gJ=^Xr z;8Qk9sP+sk&KEemijyag1AlsVA6U%(`)Dof1DbYxHd-GO#+#DMt?N;RUTU z&40LN9kWJ(L}<#l8Mv_dP#;hnh4J!=B4Rg}HdF2>U-0b0+(>VO96qRk!MINGPaf#IYl2!Ff(<3Lu?b$DRLiE`Y+lvqt zs`l}!xQ5#JhKT?YTFKDIier6QkCzR{T5N&UZHzOGLcKmulv{xOO`fbq0u*QZ3r$m9 z))g`aEm6D1O<2lVum)lBK?zd>nFwz34g~D6=JbX}93ep;ipwd3Nm*tTS?l&)@AN&D ze1_9}nyCMU(?-d_TsuCKKC*=od2r_fKP=TZLlgg>6j5_g=Om~m6*TzzS2WCtl8Olq z5k<4YuIz?={4C`X$d~TeKA3$TngB#qt;hP}$+e#P-m410s5!Zs<9xB7K$);I}$lu>1`SIG^Zt!N_C{;Mt z_3RG#jWA^MK^L(zoyYsC|KbP^q+oQ(`JG8C(Us9fd@8l53qFaEjrhQ=B8@)=rj4QU zDXk6r;SS4@$WE-u2dG40&-CfZr6vOQ>2rqSe5#A} zonH9*X()$S%ZGMg@q`dcM3mHndaRq~z_or2miZ=HYi;rc76?f2kH(e9>VDx9@M3# z<&f-xa-O|IH0K$-YRh7$gmI{s9w&pO!l|cS0gf^N3qjF^DXMgZ)(8dGT4eV5Tzdo6 z@-VKS{pZRJAA5H-M#+%&G+vgKSEQGxgGf{4&s}K55MEBQ$;!p+1&@twgVhBuDXT?V zL0L>T&OKCV&~+GKF>p`m-=pdaKPCEqHF`}~H^{FlojSh3<}Hcn3M_2zmd+W$;LZaC ztGfXWzQZR75G@x%1p%S246|A*@dc}0$DFWS=ijrEP6yQN8-z*N-@&_pBEAWm5#~-g zwFos1;sUK(>#UVV0S!aNN3)#V6P%mq;pZvayU&62VnOhgrt4e`0v>~@Vxb`+0x6$PL6D&O7d>8tHL&FAGa>e3A#6VLZ- zv&*Dj;6v=%ovhNX<>jbJ;mFoBBbePyd~NI5V8Fg>721Ef?t}pk-(PNfzP#@E@`>2v zll$&aGaMB276?8yA1s)I;6pql5n`|!25X8NnZVXOjZZMrx?>KzgVe?^nLcU%iz{K0 zCO(8smD4MF`;6(}vy*BLOq=hQ5Fj1~$q`{Cz6TAUuQjskoV`>nt6j1$#*2C#CQyL2 zQex6WK#!Z75x>4|IRGGyo2`8Cw^|)AUh+fBF<5ut6^p!u*E3UhxZ!Q=m|UKjS)My& z0JA$50^{?QEunb+scAV3$UGA_i5DmQOQ>;6#%u7_l{WE|g7=C`IE*qlWiwRgmUTXU zb6bBBI|&I4j{D2)pTzkWo5y;nQ+%D=b(3P9JC1+%_vC$zKmtl|h?zOLxA(lMz6!q; z%{x!7793G!J468EEV5Y_&wXh)dKe5~aFXaCPTS-GdBysZQZrMh0>sdAnq1i44ajge z9_+Ra9I;QK;*p;V|E5W?QLQH0xgtBz(8+!<8f2U|d0h>_EB0c3qby}h9oAbhu^F|| zLC|}U9y-NGRB|S=a#X=?-ZeD;W=nSFwYh~hKLvJuTH9`(s`Qp^+~iSr z-Z4euA^?C`KOF)|7H-W8=KE!@hXIQ?FuKr#wpY7P6MvX>=XIth8?J>dPX|C`z%H`9 zd5RqCm0x8~GT^rKLBK=)xn{03KcTa?a9wO_S@h0Kl&{)GEl~RizXY>m*TN&ODH8C| z?AZ~Gs@ouBIy;P9U%11GHd;@_wGn|W#p{fKt{Xkri@iHq zdU?>Z+KO&9e$?i)1EM`WWnOfa<>P!fJO%8_(b0eXSH81{00}XsgFDqJ>nm>v{?z=~ zN(#YA7`Uq?SsUK(<>sU?waM$2ZJ=inaFM|xIE!iHKN}(jLp`LZ>!OELR*e4w)l;qF z00f3yK6@43+cQkymT&h4V-&1#Tg@zCK1moZHC6&7*OMv%1qjS0QOKj;Q-uhXe8^Bu z?DNT>>UpVA@tRlc7->(yN2UAGjK0MAA) za)OoEmu%?D00Y4Ixc4evN0eqtafA&Veo|+{dEh;0idSEF8Wdt>0zEwESu6 zL$d3(TV^tz3vYCpof@(pd*dO%4e9TgeFS~7DjSs#K&@;_*~2PqBVl8sAT}I2)5Nvb zReAv4gE0x6O#E;_I@LJlref-qW&Q2+gs(}Hw?XioGIub|1cR!3pmtq7EtQ1p>|TCL zep_5)w}0oF7OM&Z)u6D;L++&RdLw`jI~8JvNWqcYcdu}rc?~o3)Ay1_37l#2#7oq& zy0185$|S7SL{G@{VtWvVI`XYT`+Ej%Ztr$-7mIu3Ab0hN zzq6D@eoMMTj48Hshq=HqYnxa-|IgHXLSw(>uI(r{rQLPOo(DMF4V{0bI^83eQ7;om zrtJ#TD9W^0+p{A1|M=`)Q|M|J4QXAZkAiT68WopP1{sae$E!k>+BpV~qd8P)ahljb zaE;it@}arItJZIH*%jZAAgB{JjB5o$5V%ogytr#X0cgm4J}^8`XgeZYl#8azSiPm^ z7!EY)I5NRA5h@Kg+1@8|&A^dx`duZV%h4`5DzCLZ7_A}*y;dqi=rL+V3{Aq7H#{fo zY%Zm6wJ`xyN6g~G!hQ@{#AO~opQtHFhNn6GYkhg3qQOY|!`grK-)@t?OpNd{qD0lP zw+h?1B{sLbpQ0+@#p>r2DSBjNHB;r97BP{ewRYJHS4Q%}e=4GD+9)4oB+GehWS%(; z0q7a8QXJ-aDZCD;wifz=cE!hfp6daKci!^rj*{RT3zzSqHY0CVY#~7aZdP=VC zw+*%gj2GXVH6vRF`+jCcCB4GjkL*YPp`Zsciz}PR9ss|kZu9tj*!>2-A@yHS2uR!? zdZD|g%wTSZQd3fx?%q$Li16JsiMW0$%C^rTBk&3tKJoK6)>s+8=%PJf<_(^k4%8o& zz@{)oa7h|$K;6IivymgFw0h##YgLAYx9K&@RyB@DIe7QWIImr{p(pzb4w#|>dH zeBZFQmZpb9{oQ(&u)hUbW`wbfc5OCeJQV4gYo7IBbmM5B*SST@;h zk9bZZfV_TCtLEjVUq63DY6|`@Fbso`lY0&cb+z`Ngmf~`TKF0`42mye!NLS+ z^q2YQa~H*Y*zaHVmrYqQ_6dI$E*gyD1v7h(oF%r^Xvawy7V2&QHs#l52`YR>7D9VGg-N10xjvoLUDSWlGTma@q0vv z%0I?fGIw=Um|(3-@T^!hZCvkT%)M0soxEj9roT|5EOsaHEV-3k^#KGr`RSv!6Kp(% z-9ObNUoz>~PN#XlTr!+b?cIDMUh3-F%VsMRa{{u>Uzr~rz7b{HWDI|xC@s4Ga8bHP z%0318qF^jf|N6bhe$GKH_8%sWNxnTfS^;^uQw)oXkrb8PRtZ3jM3A{>kO2rh{8e-P z!c^=x2C|Z-RP!X3_pXf|uv|ifaex3dj4dAEZQWPHPP=dURz8L|!rk2@^MXC8XkacL zzl`_d3bXpl%S)Ss!H8|nc=t=%_(~A3CVoQ*&?uFL@F+o?7n*J9#eGx9p*UI=!L(|* zsyG74P6eB-eh;uz5gj%g?Zk5nwgoaN{#GNP4`AcARWpFMWUJembk~$;NHjIgU#%); zGOkC{l^-~>6j5=?cu1)S)yF-{$frx>8(vu;9%WbiqP_xBU6s(ioHjFk2?l!ZfPpi0_@ZFw0fDbu0ulTSJ!r)xx#h=IRr2VEu#tjZ0#XGdu@&%^STTQ$Q9 zYQ}XZN77B?XFu1S@1y+MyQos->rLWmu6E0W<>!O6jZmkgyetMT5+U@BSgmT?C$2n1 zxMf0sTy1vg&SoVSgO?<5ZxuH($(jMqFjDg{C$UJw%2)X>jJC7+nUR~K=PjS-=X5A0 z%(ea9)<--fYqWXH7)Y&?W5V{g+f%dM3T`>o)gZt&X#4F`D$R>P?(nr~+dHv-!FIUglXu!|5 zu+0xw7A%%5@&Vv^vwDJtZ&F!O$Y1*$M1O&SS*zZAWL_XdZZm68JYfqC+IW+H=W5(; zlabl*Mm!yv#CVmQMg~xa#6Xe${C6ye%-ti?&9-yESVW)(APdsiMY6AWq+cC!cZHUHxCX8kAt2t^=aH8QBIQ}>Zz@+MY6+YJHwB1RDI9~}u#<}L zZvP-bmVsWin6eVvLok0AOU$Z`nFmvz?P$wCqft+u4dTN!JU)o5zKkEsKJ={Wiy)0{ zL12Ag!CPmDK}OyJoM6PbtxG!&eDq`v3rc2z&x;yt=Q!WDSz27qKkioO4McN2W6YLB z6sCa%P>@Fi$>G+xG zloGo979!6uzHWdU(F8OgaNUyKp3)~n2v^9JHC^nwVo%1VkJxzX(!+8(pc3GA5Q)_H z-2(F*H)!x7g1Kx>t5oHcNy`F^epJx?)4!pt1zyQ?Nnw=C-)w#rCuopcvy_yJKp|ge zR3%GU3cdDRL3Hp8viba17?%DRREJt?^qEb-O8v{xx_mCsa|$mSO&1B(zP0V`)^}W2 z%_PtOVqMNz!|Ds|_l#|q3Q4zGULY^5g@oqbW{@7i*_6OtvZ$D+6>V7mGoXwhl|85*A#W?1*=0L(Lu{QleTtKG2^RWVH67yzI$oblSTv|NoGW{`Fz}iT^ z3|&bpjD^$@4yo}@lO1D{IgwsWS!@RTdTy@LJ=@-KzU@l~fyY&bA@;^=s0mU~Xz}1A zV>gF;TbF9Cl2hTp{Q9>mt<39Irfp<|owM@d*Z^pmVJMpse%K_(2dKGVX_iiR(Y^qC zMB3;zm(_ey=0N33DZ^DG{*C>R9pUH+MTfOLZYgUS%vb5vK7OYUs9b8mjUNE=q<>g0 zEqd_rf1AKcEz_bk92fvj!QFP;WgEw`4)6RgPCAD$y3eJK6}Exk@wz~Dqv0Ok-pNMP zY5c&@E69IErbtWV3Gq+62%QO|3_TuCilvRCfBIw;R3j>2uS?&5j0SNfph znDrF3!gbB#b`07`EY}A=bK#PkaYiZPcSeq%Qq1`kdxrPp;AetL1kOEB-m)K}z&e~} z><|H-(t$$e1T2T|sF!`sHI*6rWI??0-|OjWTlj9cQE%-CDqj}MjKzb2P(S`V3W}?fkbLsm;BnRKIL#0eWP2DQd>y9 zX&jL|4b^x7n%bHg)!l+)l)#xvo8E=ki7XtQppIJrD7EvfgJaakL-kfoYZI}NC1k_d z11vv~{*rFh6Y%pwss8W+;8A4Uj|^2%5N{w{r>qQGg4F-W45ae};ZnZpj&9PmY(N}G zq`yMFt?GlmP-(YA(*x%S#37-2n*>RismJ!GX`{#*W7bjC7arv6n?*F{4jG13q-<2p zCuJpQjH&h=N$1}?wm)zVe*|Gi;u8LGN!6np$wl_aFwC~{oV*bu{yhRlE3#K&9PfC( zVDCOiMAV{9#Xy)!N*Fqm&heG}|E9(JpW~-yOCkPAmvi}-tSBjzwuk(+Thic>t{H&? z6y_qj{MNE|=oC0m&v1<90VlF$;(UhwWhh1!w}782ofaA1rw!V4&Gl?C@sCe2VTN0e z>BEFzy38rcQm2*kL{8FXHWj)FQj5e*g9=WRP7NLMb6mH3xrWbdi#y-f?-c&#{vSza z85TwRws8cJlJ0J4kOnE~?vn2A?(U_#LAtwJ8l<}$K}vdwCEj`d?*|ShZkCyyYwkR+ z-`NBVI&5xIbA(@hd8#5?wb;d~+Tbp=s`FbhXFRG%;bZd2|Mq71_c>E(hEPmgj-R!y zi_o|Nl+jh*5jd&>hypdQti!#5O6KGT%W4D%2rg_FS%Jg+J-mWEy=z{~>UueJZbXKPrvcpP)1+1C?cR)HTG}o}B zqRBfyUT56oB$<(Ho!xiAw46FpA4RKjCuoe5c`#8iL0-Z zuG8drwnCrxSnZuiL4CbVkDxKj!E~qBltOIv*a%9*v_$H3$q}RP50f>h(i~Glj4-x? z)*#-2ppKN18tM!motWcKq1^m7Uylin=EhKOgbqF{dFz2d-ht`cdcKbdD|;e18YBsQ z-R^@FIsVde*~)u?Tk)ultuiCuL7N^wIz8F79k53?IkWCcRY!lwZPp}>$oh8Q3#?}b zuQyq{hB8pSg(MV{^;)3ennGc-PFwm`-VH5125H8Wys5XJ#vL7_iLvMTjjvX-An3A8 z+ZM`PN#tO?Uv&1FmTem>VyVkp<&&J*k(nfs`H}P}Q_)QmF?y=jNo7$85cmxB7FN=k zAA0;PlekKKOf9GS>{&)l_aRb6teQ9rAeo#?K6R~0x11Ph9tabKe;V6{J5ykEO_HzPT6+~L(hR7dN3Gxo3Qm_rtmg!prv!k? zxK!TVY&O)tVeudmGR)Lh+X%)64fEnkWE^bH7?h@;$?zx-NOs~)tiB5T<=bda-eXya zc9EzTX;6v^K|g9g+;?aJc?$dwGPN`U-Xi;qzaExKf;SS$l2nh1rVz>a3FgHpq8$;| zqi1aHG}V!qW0@@OL0~sL2}mua)`hd_*o9P%YGC5x@8$t*c*Es&!6Hl@uI~)GW`Hk! zb$xR_HnquT7bnbRoBie;q2S17gL5CpM)big=W(d}K+maphey6i0bT&7QTQ;7jt>;u zpZ^j75mny^^(LvU9!AS{s`ml|h`%@1O}oTNOp~U5dgHbmMFc{g_Za&RHCU`^^dsgy z=vx@Z>?mBJ`&7s1ji{1_A!^gc9Hclqo7~VioWopI@06wB@y+TeAie030s#Uga%Dc6 zg3+DH@~Q82lVw{gyen^|TtAfI|d!66ZBCej5dv7(Vfm|N?X z0Fpuf?DTl*tSt)W+u~+!@MWO4?R##w_hrUIF}%Ip+&>5wdt;g$N>8{v!?i7$>)iK_ z?Z8d01chZ%BY)O)cm)l$jUiCVU$(XvrgSWnkY$x#H+AU$decR4_1*DcO^zxc2;ci=F#y zaJpLu`DQvkFE}+O1>V|xOFQ3KwDPUC8s5z9z9Dq3)>+yXN1%7{_}_%u;@l?&fKU9O zocle89U2?t6@Vm}flERX`@h=Z=R0o5n)tv-_WJ@!7!6DHda3*R$4n?@GW)ahh)H47 znKLiBym;57K{%7Ov$+p=<3Z>Hcz_Ju`0}%42C2jQ_lY|qKx9F`3Zxg<@sn9=p{QD* z^aqE6neYWxgH*fz+QDH^L@fTsA;ym~v=HWy^xP2@)Lh`L@ey$ zo)hN>BXa{ed$MbMTggt~f4Cwux96{lXzoru*G3J4JnS8W^<^t1>G5tSV%^Q`^3#$; zJabho+5y>CaCpw;lBf^+b5_quRh=}n{hi9I-0brCkE)l8GgmiKmp-1Cd#_DH;tV2% z`~R@Qmp_z;Ph_lWgb->JxDA> zQ69hpRX#-~SPwhjq7Y6M1-#YkA0x|-EV{J;Q7gJo`!11ZI>|||K0K`4^M&iW8 z{Ebb1;?4tn)lB<|mZH_9+5@eosPlav%<*TOLLX@=We)Rh81gUKcdd7u9M34P?^08H zv2*Y44#-aZ3ba7J8=~%tMmu;r)es+IPd7zWRG;`1^?~ua=g>5bVlO(lTJ}NigKC#6n4%tTjcm~+rY)& zCCWD!Rec_pOlb?#jw-|WC?Jo6PB)eWcTc$nE z;=X$a3o2cFbrx(c^RPzk=HD&?Jq}#sS4ML0pvN?XA)_l!29cz4v1|&7riPf&bRAl! z`n~)GyL`PdgY#)0y0c4foO!aAOz^-{tS8UOx;TqXqI|YZQ+T~ay{EP4O@QdqbMq|{ zMrb~O>t(JUv}|P^qqPyXkFl5YuXJ`UV#*Vz$U*)#5|7l}VM z{n#Z>j(nZWpP_#G?4$Mg-tlmGwz`uRre}_LzRE>#E$8R)isXBOknwXR3LBa9K2HhV zNv-@{H?eEJ6vIV+atqZb$s8ftTV~#f;26;)$u4Mi+=^1Yi=wfZO&DAlt7z(sCJr3+ z;aKp$Uj2+sP|NS0B-p?n%|iMuJV!`Y@mvB@&bO`Yc! zFX3P-u=Z}`MB2H8Ws<1OL69$&`^+-}MG|Rb)H272$yu=O@1)WVWHyS#@296_p~<3T zMw>^LLiB_W=B~`~1+RGR-EWhoyP$my0k&9y(ezHS$tNR7c|39~@uVhEd&!3^ z?dx3cj_Dcd_Bj%LOMfCHsG{D_lT0#p&gR!{a+$G3o;~3GT%4*%vPOdUx3-|%Q!Nx@ zMS48{!gULegc74qvu}o?3JYnLbe)80RWhMo3i8Tu2iG6q<*jJuuPeCEo+?${@1A1` z=;!a=^RW2@lVpS>d&>3hQz@YPt`-d)FP}(%Q*$`-mE!*@S$d7z-WP4^&Ck{4?VW`& z1Q$mBG87|6sk|njM}-Ci2i5g2JTxdI{GE z-sS1W??z^DU02y<0VRr9WszXkEa{b9_e6uxbIynpR0?rwQEr_B=eM0l^R3K$@K$QCe`~{5^VY?|-PlGMXl`i6q=njFOY%-BxjmhVZ zzhBmos;lF&8P1;Fe;Kypotke4KjsKOy~6rrCuiwxY|Dr2$!s|XOQ@J?<{#YWsM?wD zyf>bw=%5!qh1IezQoE^{4{NQ_z0U0 z-J%@xrO(ghh2_7vj>y4%-_oRoMFY1hsh@(rUs3yCORhgy(kEpLJJtsPKI%+pzEQ-B z!rJL*U3oHLexjkApA{gQ&na`P_Y?lVnL;PiFnn>(>Cd48*}kF76{YBG)-E!6RoHMk zm^N5a{7Xc+%(NXW=2*Vi)lv@IO7w({ZV2!SgH=Sl*Td_pB9c%7H>Ls#01}!#GL*(M-*jq3?)S zv_*4P#u6U}Jwz=-9%-{eV{|J^Zz)_{GK=vt68o0%gM5`3KN<&Gvi7KxYARAxfQc>g zda86%n;xFX*C1HtmvVuhK!$X|jsG#ef7VYltFoPAbh$C`oC{vO+a=c{S^r?&_=-RW zYaazyZZ!Op^s?gb-h*L&THETMw04}@AzC@`y+Kit(QX<~g*@!KhtC}jKsRG@PgN?n zaDla{PW021^KYs>n5o*DUR0!zYd!ojPOgZ|Fmi+Neqb7l#sEuG=PNTEmWu-z+RcA?sg-b79mMpSbE1uA+s>H) zGN|X_Qv3sHWr}bP%Q~??(9$^d1gViMGeXk6VTn$LoK%y%KztU&w*{EUgK^_F-`T~h zRkq4JEzG({TJK2bDiF&!fmDJV>M}%($QoEUiCQv9#{era}%UOv|7 z_g@O{40!Gs;dC_Zw8s+C?c+I@___ieRrYheSCyj{C}??16&AvxU3O?_`~H-qWuW9z~@r_Rkw^YB_RwTMeSYs;p94MHyy>R4uf`z9d$tbsY`wy5>S`Ap|;oD z;dd=P;gQ;()cJaB&)3tP$<9@NGUTmD_JU9KL@4?-I=YB`6?bB!=Ll)rF^Nu%$astq z(G0=hzBJL83Cj}hqvb*w8jKJqX*D2U5wf#M+JrP)IuqDrM<3BSGILE5HJyI`>IUe} z@V^9NX7q@z#v&zQxhFmg@t^lD@SppC^<2H@gSs5WpPI05F~F+B6~6u!v1-z(08i(( zNyts7@3Z93s?M@FTNTp{I>>j}S++#lkX*+R-5DR^cBlJ*JNLk$v)`LGv-KnqvD_A_ zZDVdaCVtmti(psgke>kd3GuN-c%x&cSU(n;ls1^yp(^OrVA!TJ#s=XD6F9!1j5b~S zJv-hNzn*sM4LlU#s6spGdl}df^7P5=C-_dKkTI2h-0!9c3bx`m6~INP^0Z&Cg3zR|3(X@;eUCG%AeOUsN0x^Cf)Y=fd(5H} zHnyiD7(K)53sL15=~1;r$lmF41$oJ4P~e(Y%wk z$|x9-V%d?Ieb9;PlX745L#Lx_8m_{vneEWL49zMxdY0_5aIC}Og=UMiCS<6Bu<4IG z>`ShpC2oH1zMK^)#%R z?k|ug{uz?f7&2T>=Dwpzy?44ME*&1L&1f)EH~Zr7FkWp);pS&iZH}AKvMk` z0;VRE84x6uLrL5hPusBRWJ`4|e=YXSHJFGaZ}nrNOw`C;F5fSke;q2$_bh80$NMRt z9|WMC)^P^=nlStJk4vlNSqQ!$WNB^~KdwO%6VCNmNt#W8NpxT)jK^XcIT=fMjW29V z9M8R>^*1v=Y{XVcpY&>O+k}yw)J!)?fx_6lGs-%Z6+(w$z&Lx)A6z2m8*XJnG=Nr3 z?%dz&mrf#&)x9c+O2}&?i_XP=yq@kQ-lpUzKkICT=#-9VB)`&Ijk3Eoni&h=pMQca zX)XBg{PsV+9r5c17wsbcYbb$FL;{l@H#027o4fzs7pg|U0{DF7eO08QUrXEjCdE(4 zD*2W^mR#fU59AbBwJ-%~PRV8pleqB*mfwJ6)Ie~rV3E(g;rjbm&MH+pq-$zb#w)6I z`pp2lsBSN*$miUbY^&2b-qm^Olb$SyYy^u%zijT!T(cm9j&bNn2~o>#u=?!9t+Hal z`dm%jEBq;hk9%MoS3vhMo5?`5jy(Baxeu(XpfAKiA7-qUVnuV)TIV_1 zv&^_a_^FA=u%f(mkK)ln0hL+c*89vW_(T!4zWH#Kk$tmS(6zB_BH3pqn=FA+R&joU z?%#fcmaxFzbr0prnbX?i8ZsaU-vE)7i{X6ZbTz#NLpQa_jGx1WU9(9QUPX_U-=oaN zU>$@G?kLAQ?H^A8;Nq3%9A#S=YuHx8)9qrY{tvf;al*!)%z4&qiRixVeu5b^vHhv# zpQWU$ld?Q%`o(ZswsJovLf~6tumUV*2A>}CseF!MhyIJQ(5*+6E+b76J%)kW)g_eA zUDGNHeb;|aBlIkKDQBi~w9`#Z7hxD1VH{8JD*AoeKhD^e24BTy9xTT>101$lq@P%S}7rTzD z-e1SJ?xEMM%B1AYcayq9bJNTY1&J?5V*t@U80iLDu$Eb1W)HE;Cb`JWK6-#@+AWZz%W6K|QvJEYEHCji0 zG{;gj&k7(pPS{(_30_AA{o@=&1UXyCaAr-mC>n@btV)#c%6OE6@v{g!?g&sND=M>(zJ^xg9C560sHYMc zT2(mPYREe8EhhmNTx3liKF&#O8%&1H3cS=fN9G>V1+J-69$!Lp>AM`I zq&GpBjxP#;-uwXF)d8KeDKsP=Uo6)^&R*a;;`jEYIrO(}$P9W)51)|-LWJI2!4Wx# zNSN}>epSFR+~@)3Oyr3DDQ*P`0Ql@VBvDB%>-nypF+Y8i+d0eR&QbEju-4|aHzTKR zP%z%mtUhZ8hq1Di{unnch&^X;=dk;y0AMAVo#Vd#Q`qP=_8x7Bm!$(_xWeyNMG0GD zy~ep?+f)c$W4y(+8#9Ng=P~EuzQ%j1RqxV=zHEDRKUm4WkK&-i4}ai@SXoje=TJQ-ao%}8lUe0PXW@)TuQxvv<~$W zIzvyYLybftc}Gt9i;Us&c`x4X23XuO){H_S`!AWIBQ~3lSuT}JU_k1>(rXL{KsZfG zk}xLGsM1c*D2_Rud`6Y^4?+Eb8f4^+JyS}HYj)V8!|El6U4MYKzihCD0z{nkxLTDC99` z2iINnON<*$M23;p1Zp=R#=bqVwlq6@KOys4(XyPr$nNSu+UPiFxMYUVjHCXz9#xc<9C(Z`Y z4$00L&=&>TE+G6Y>OZjjj1BoW=;q<~|21E1q;)m*wsD;!nFB#+m!!6CfgKK7E}q(| zIQm{Gs{raso`H9l&}gS+pls4p`w(9|*w2RJmXt*&A*iKGJi&q#E0SM4D3KwNI$W-b zsQ7~dYz@`P_MqNZHY?XqX-B>FYs1|1aI+D>LItg^8ct!^Of^<3X-jr;dtOGGXd&3Q zAx>d2=%?QXYG~o`w3uAMyC763$-PfjEHX$mmz(&lx(Nm_$rD z0ZT<^L@KdXumA`;q(m6KRQbol%n(NK@QbD{aaZLHCyE{O!JiI{%Jp#6SNWq}NiVfV zEY!?INyOgcUB7t$b;W&426+_le3aI)D0$L^q6$JHxM{z@&6k-WMMG4gTnB)uhyGB< z7T)A9NY4yWSA5p&43z z=$x<}UcA=tzshDvN(B>w_|J#$FC6kp>VGg&Bde+I6s;KQF-%62B;%H@__U3P_@8D5 z(!quZ+uhp*5M72Ob9jJDDW!s_=u$!ViUr)<8@v7$j?)UoCR6iCO(kfNwtAJrcHBDq zC$E;nkz!lk(z$>X!>#Z5c1^vH9pNA|O*--b^Lta!V69S{n96tdOpZ=$^GFm6U@2Ha z-0Vy8NEipVbm#y8-a^*xCl1^YR@rWtd2}$!kD>?A14*3XtC|Y;c-sR+7`OtA!j&2n zFS*l-UASl?7bT%gDz&Ld{N>Fc8Ti z8!8?^xxmh)Iz^d#m|goHb@^M+S;w{!b5bhZw1{ZIk8&N*Q~`z&;xNF#_$|0lA@Sa% zu+%(bsjLHbviM%@hHp3$-|Oc#EIz2=f@er~`9qBs_&zDbxNHVTKL4z+X3}IS$1nrd zC25COZtglvn=SF{SRVtq90#+Deg=KbMZUfGUD~s@jezYt!(Nf>$IC#Hg`DZkzQj)!eqaBYFT?h`r#hf2AG5_jYd1F5t(U;JRI+0* z0`In_yuWsmBV#a|BvHhGeiLPL^2kmh6DVgnNl);HRzz-@u3E&*W&u4TRX3e50Au`> zo_;~_pnyA~XLvn@Oq~I}l)`-7VzMs-j0{K*g1HlpmXK~3nIkkOjT{Q3=yTdWkb4de z^RZ)dHlIwXHJ6KNp{3HoP>7?63`)>j^ANCOV{;&OKREo9Zb9Ceo-GwBTkFExW_H=R zNy=P<0NrP>eZE7nXezPn!>U zAm;mz47v;UwqGoavYjCSY)Z+fbXpKN=?iOQG%NNagH=Lv$_c=V2iDL0w|CAyDAys4 zf%8c|l5z52L{8b<^k~7xv-OiSyQt*?{ZtCY6DN&oEKIiHIu_;RrvZ2Bm{nt(%iknF zBj1;*O%Oswy5{BRD(%d#r!84%`w!OnH~~VbrC8?P`{`=QJ{i zk^xjs!Csx)f=%2e@Y|vPU!{2U$SuSswXqIS*=r<%2(CWzb6eeP;G0Kt&1?!_<2rJtcrGsI+ z91g}?P8+A6@Vvd97SO_U_QG+v2fV#R0j+qb@{mt})``qNR2#ymQp|SvF;-{;o`8k< zq6tUu|IeXw=x}%_?OHagf*7_cs@Y4giZ)t>cS_xi z4VJ}kC%{az0!uUkh$2eQKF&O)K|FDJ*^Rg4t46LlXz7X>DW%QX{sf^B0 zc<|-NR9-`LFCg=zX^|<~I|hEg(A!v8V}q6;y>>Bal1cCNJK&HYc2blUIlMm3a+ys= zfrDg3Z(PFA!moHD0|%sGT=T|HEjxYsk@_^B8V>x12g=puxBS&!_fQOFzxz*3J*42D z>$hBJL+43J5-$S?3WfQe%#K&I-I&L#f>ZJsBYkxckuBmgs1KCW?w5WW+A%3ntankzKp>`R2cO{*(_iG_^b&z7L-_f6=T>K8rTmIpjB@Td)0pzSvbCOrf z)|XU7QK`c(E_uA`gHdxj*FZbpZMNYf zO_c%d`Ghhcoh6IWxan1p5juCC6dloV>^rIN|DM0pQK)Q>oq`D`aO2P!Mg+r$vNG5_sF$2 z+UctnUx83GvqbD-v?@CyM65lSkLG|F?V(xmlxhG0SPa_J_JD(y#lEhfY!5)|avi3B@5$a2l>AcM?0^PT4Vp`F zQ|n+m>9+@wY%Dt5ZiEF;13H)*u_l99)%-?vojV~$8oFdy#Uy_VdK%WD8Amo105{jO zB>JdY(DOc&ie%?8D5EUq!J^b1Z!gZ3&h%8wzE%8Th$64D8xwrXwzzc2Us;0;3Jg&2RnTXL(}l=28NxD4KAv=q%Xs9Wjs4-CYteGF^*lQfD$PB@-Q z`%o8LF49_xILtuwr|rBT^#x`T*&V%DDTnwZC&|pe81po(rJ52UWs=>dv^Wg6%`{Wp zD6Es(0i~n7qIK<2FNc2X1t2xFv3OK2OU*l6s<}Yy8#yHar=HO8ZW!_@Rl6NG1+Hv# zis;k<3uV!5@zpDBuIU3cq8q0?VE}C$=@*a8-<1}7%Yz-!9XSBeK-OUS&lI#<4xnFm z73FQkh;St_C^G{x7sd+nQQ?R4J8cqJWvT~pk_M+=G5Lelo*5TD?djjT0=4RZqU+EDxph+Q(Re%*te-(m+o78wK)si~L3@ zwDz36a5*+-np9d6v63Od+BAbN{d?v16OgBTP4J*p6>;_-FuVATIgTnbItv?~P=A7J zdD)}-kS5;>ol?~{KU#jX`XKesX79!Yjw7?@Ep2>UWWOt%a4`3irUyNW7K_a0XW*HT z#Tali6!L_<`GV3~0tl9%v8$pY@%p^L%xP+Hzqh?U%!w<31r1kg@>hv?&b8Uw>-P58 zCB;|e`Jk9>WHgWn|5Gs$^AonGI=nQ;?KYO0wtVf+8W<%(ZF7YCo{(0ORkTe;x{+Rx z26S7>m(<_gU^|-du6u2OIgg{s;jGDuyUiYJ9W*Rg z3$yL^+qj&eDK(A1c$ZJ3P&aZ%acK6=-PyyOZFHJV$N0nCusHpNq(fRBoZe1;9$d+; z4^yh@XVyzPtipv09nCFge-c=Sz<~Ks?hI zK;S}G%&HOnp>N7r^QGT0`u2tzF5UKdu6w{jt3K26=R?Q0EtgKsiEdACSbAYskIy;B z{KsBT{*bFa;vN%^0HN-}hbfbXo?cCX!&PD#u+`V~hAwtjX_kCSqOQ@{_T(KsjwnU9KVPu-b674 z5U}VvL(WOZY3@#rH@>tlY~l`C?enoP7lvTCoGBA%Yg~O-7}fBaekMP>K(^^c!t(Io8%Y z@x(Mq>t*d~V}iK;1u-o%eo<*?PuiZDZ{zt9bV>FDiq-Qtip0~D8zb*27`~DvFmRZ+ zJUHy-7UM>z@;=T&VgXLgH(IS*6KkypM2+j)R@|3HWsi~ow=`ID_%}06o5yr7IeC*C z5*(VIr+T&RLs<4gYtDDU;7cgCV`S5ZVc{~xhoviSm93jLqf)tk2;)~$=2XikAddx0Oe~$x(;v$olh~iv?3B7yWVtg=OO>r!V;xf8Y{e*Y& ztrp`21pL-VO0Y}2viL4gY^tH+{2NWKMSTa0Nu@}3&kkmju+K|g;&=XM@0{N6jU-*A z&`|P4r49D3Ks#pq)e01rCkG1!3Jd?Kh$S0wc4RBE*eQ1Z42kmlx_ZTKvojVGgVX5E zbP=)A-ptJlz@#x04v?^%SRfL)c9X1(Y!j{r92<% zuRe<@dN$?+vQJfKljm58lAD>=_waYj3$sUb%s<@+btRnI|Aokl9W*j$M2^&AnqEhIMMeo5Yen#nfBox6(_1|HPZKFj^()Vn@BP8$zhI!P z@}cmm`Jt}xz2WMInTGj7liPfZ^m0<)?bT643;XO?`Z_lokm#=bAptB8-LS11j}w25 z@|&mD^orgAqkk)NRkG06cIU@3oh_2G#{yWHaLypu1++tB;*pqR7$81ZsQ|5Nyq_rM z!(mYf?>~9PJ(w=cNU2pt1JTJ)jdW(-{Z&2FEbQDmn=(NsPk! zuv53Irv)kZrIFf#uUr#Zf57?N*^8}@FPD|}0fd&h;TM3f9~_r|$bA1Y20U3btQM7` zD?Q8ON1d+~h^N5g|JJ(ReC*`RPM~$=hoq0lIqv+-6;szuv`ti+%8PX@wi*wL zko+A#CPY0ExWv@768*|kOLO#_#_*3^mMR)1<7BWrUV@#A)9!7_K|Ont>f1T9shkQt zJ?+0oqCNv&EoYdH!QmIH>1Q)#z@RH1w3-|4?H`bNPB`%!&W5$z4(Eb$zPW2@ z0mOmqMheezgRS|o%i)veJCrtQlwVf@0DR6`GWeY8wx zqW=3RE%-pkGKCa~SH&~Y6yOk17cy}EDEEgdg2?z^{?8`6E6*9R%LyM!Z`{#;ijxhp zg}m<_CLY_jtHTo(xak9mC+{7~Ea%~gb0X@r?aJ52e&KP6`4JtUQ7q1V8-4pXIlHvD zj*4dibJOnpD4Yri5B;(coKYm^M74m!M%4bJzple$zjI@lmV}eBQ-o2;hHJ4jI3We1VsUDA7G+#eI+>W5I|+P@$5v$#t46n7xLeAl1ax1A6lGrG*B&<>}}X9hN3>Ecg| zBhEqls9!5MX$h_WrTSclQTf7*?a{XWhdGXCMWj5xE=s=+f7g%Q zbtSI<=2?nU0CG9jC;j`egBxZnY3@C0&)fT9igD$4+U`0Pv`iPMU@GxHa`a-t9?Tj2 zCfbv)l-(Jv;Gze?^AZzWi7tWot=LVRZ>&+LMB3Iy^^gADNiZolcdkwXrK3(oa`AlV ze(#Fu#xGFZ`=gd)`~pmE+IQ_+KhED?c+T-LX6CYA%BSeTOfLyYNS6AW-yzFqcRZ}2 zIg`0uwJ*_AC~tPYl;T{)4d|``%xXRXlqlun_qjX~^w;PFN!bRW5n-NT%L)zReK|H_ zvaT~dBy; zw4D+u8hz|EdUoYif3>V@mDK2Kqk8YGI6rJ*6>G)YmHG z5oA$iJ4z&g#Y|<-=oY~Ipm9UuT*;H%aH$5lHgK-&&~C6XSo{f5X!NSk`Qz9m8o<{U zC>Ymc?JrP_s~!byP3c{tRTg+{SP`T~OgoubrSV^6u_ z9Ik5qaZC6Z2CJMZ(YPIZY^7>otMNBr=#pB~O2szKp~gL3ymr~o=|4WQdzgz3(64Y!Buh)IAXmZ2`sS_O^3AyGjevjQC7T>JdskBKGbs zdSric)~U^Sp~!|$9@HW;x;WuKmul>~Y8P)=Q#})TKG?Tdj3pouWnQPD%N93ZRIS;Q zMpQ0bGwQj_aJoB4&7Sro`m#W?i2r5sU#~QDR^>^AUFUdOMiegzTV~sc(7$)Cl6gYM z&bhXZolCfRZjF|5z-Ai8K9zVYjuj~HJ0SZ0!A~}{Eph;?BZe9a3{HeBDFcQHyRBq= z&$*Vz;+DCNRW54NdN6yq^9=8LH)HdG*k0cjbnk=0?WN{HG_yB#adkE`vLgew9E`0I z5jnn+eI*07$oTmY$;epLyd2HQSbiuPTbr4<{&zst&DiyS$E59yEX@8pqG@I7YDvby z!}ayQJt;FQ3rknB|KAa@a&=KMa~5^5b9Asbvv(!q`LBqmgRO(Js-uw!@X2Ck?p7vd zDv~1q`)qk57aKBmUf>E;{@a(ZvUN3cCes17Y>iya#LP?_OwGvj{yQaSW^V!fS56*Q zc5XyLL9+k93q;SH^PaP~1Bphamr?2pZ?2s^7;uAImHmOwv;f|Z6tzEj*ZmTGCq^S- z#h%jUBZxAUTtUA^RyV{G@lDNjm$e(#^9{f>O*QVv>g@wwE{{d4dbX{C`kIi&&ar^k z{CVF*7KdX;_GKX&i1OCRsgl6Nnm^(D`+E&Z=*m!U<;E!&^HQ#1ZHHQ$a?QB;d-{_T zS6BQg;!@Mg!G+LKbT?7$ApxWkXHScH341vr`3doz=jBrNkHI7-3*-zD>~MvmXL`TX z`{n(9hm?in%@5&?scM+jz|@acv#Y*7BVf?{rjg;IsuQX0y7As|s-P1Y(xe9YaeusI zu5w}PzC!foiNN>kX=1szKKr6#T|(nmIF4=;vSy&JsH}{^6t>3{!KUESB zdlSDGc%()K^7nAm2vWGsXc@SbP*{LW342KuaeLNJ@@bY_f&2E8uQ#9bRIl%=xzN1^ zc_pt``-q8XRot}0<*zPpWE}>af|`?$J7jgEZ!_wig{KO=CNs|Z!d;m=G);V(K~+y$ zm6pjUQ%H>w-Tufr`_G0CviF&4mm@5xE{PkD?oZ;42#(Tv;6Zw%@9yMLJq9SGM+~7* zfxWLRzcxr315by<;xf=8bZ2A2_eEDb`Z;YFr#H`Qmx65*7WxpoMR{C>x4~1_ztI!_ z`!;p2T_uvl;&sh?n##<@S2wDP`g{cnk#2&i#m->FE5C=HB$?N`mnnT%H6ZKzD;e=f zU5uLQ5~SI)t5@Ecyc5J=TXp#-Se#6V2YW!_g8KDxJ?YIuuc`Q5PiOwU*6KO_$wT_R z3yfL%&Wx)SlKm_127b1$09wf&1sttL^Mx3*KERJ{3T@TXms9DGNLSP$E5xQX&}Lgi z?~j=dh4R$d^ z-vpF{6t-u#(rjGM1yRydbB3nDMQkODPOZpy=?CxkwKg^#KM0nMmZ~EqKuTXw!~!)!=B+3NIHRu>A@#PHL16&antAez6Lx!#g7r zSrpzg(~gUxzR=fCkp97z}vvCT#y^fYtoqh*FG^t;E5A{!_}0aOvR&Nu$e!-drP3 zfY+A|&e8|<;^P zyRvR)`@}HJ6Vt|SbSZAXItJbtd!rxa1^yOsuT zk7$vEqutHPF3k;1$uiXd3Y5HpvWV}zGcXG^m{t8;N8m#RzcC_Lyfk**yumz& zvB8(GtSt@(wJT7dRT;n=68#QwJtv?H2ud*GjogQM7wbz;c*{?}GaxaQeuvvxrGD*e z$!B<#beW`nC2ac&uTq212WwxO-PbU=aK(j1`JpI!JD& zNb)$b=Pur1+Zs7->VLg#qV0Ydi(oNOjC^*Q%HB;G@=i>uY8>-s^FM$sS37gdSP4HD z5&CFO*0GcBc2lZWGGj1$*VniD3ka^j3jZGRUZVEg7bd>4?*z0ki(_9 zOsD|79*y@Pr3@_1lnM{tmm!5ut;Z6o)NMM+UFr%yRYAwGGNPS_#NYlnR%E? zdk--$DND(%;4T2Ac%cjkfnGQ!0X6!V1Zq9JdRf!v05t)LjCNZ6Za*WM9^w$`IX=7pLP|n zz2NgAxm&TbXm7s${(}|o326`-g_d;)eZ32~;8K>yrp&ZlgN~cgts5I_QYB4QpmHb; z0c70>lTn_gpi4FxOqccbP$C;$_m;3aL-8E`RXEKD?q8(Q8K4fZe{0+97zu_=dfEwd z*?a|(^0OCS>b8qHBvvX4{Owa9iWFUIBWcs>pobbCPX4`^`4<}zcsWDDDCo4+vQ_`;Zrl(cx`RkhAXUTQt&X5?FB5lHVeX_bl?M2 zte_b;Mb7;ez8c$iSN|}+D-dgj{S_GU{2GTGXMNs7=>1MK07;HHW|d?;CV#sGUD z$OH*2bIHO4;h?|0paY4*rg}v*k!sVa@fb~b%g#lIdD-Bs5 zxTUi(*cfJ#LZvx*D3;$eF-cbC#xYRGx@8fv~Xy+Sl@) zfE+Hmh-ubL_}lQgU0$q;wKR95MAdE?bA@d_Y}ye6>)|DysICF9q89fq5`pBmDVfOv zs)$nrf~tEp54EKKasx~HKWu3FPwC-Lm;PUu^uK8NcS-;Iwxs{v`{6Ji#l;ab9rZ75 zjHZ`%Ev`Ac_!nAF*uTxCgmD1Ky$T!!S3fwL=QT@+7$7khbL=YdKbDtKtXP^AOK$In zc^uFSPho&vaVR{|ukRFGS(w7%Z;55RKAz3F9<%enJW)Rxm!!tw6DB6<8JWSMlWQy+ zQS-N7?Kv;ux8YrV?~sP*rT)^X@c{XH3s*$dxwhFxqMUp@GhpfU_w0fOv-4hdB{V8d z*?G8MS|A_$MQZpZawlPCoR#HAe;dvhM%5w}QA8XdD2-UFsU1_$%LxI!d^w_nfQx1m zu!NfOw^WU^r4q!>3x5mEAyRf8?iXc}ULYoEzyg)%G{8M;9wLAHA-xr2Mb!ScY@&05 zRYY44748QaS{D+l0GU3SX;X#rd~FzV>FMl9qSLB-7LHoDt}CAm7H`+4EoN{=bIBTv z=8I6J*Q)RF+joIXfBOh0=FUQ9QGUT0IsK_2i)!LESEC}{3QJ@j?%xoY?I|#W{flhu zF8*y?gV6-kH9-y*+C*~D8qBjXb8kxc(Cb{Ri^JiOtg#4}A4`Js4;ZSYD(?^-47qH#D*?pLSEA`(7 z@dPWdO7wL>^@andA*fRdSaC@Gay6Ikn~NOjld&Ubu1?4qU;xCEB4@zB`{Br$(g``^ zfB^hiip*uZ$ZSX@w8#vlAxn|jeyciQ1-VGw(T1Lv^qCFQh}tlim5OKPUPMSnkApc4 z+|ut7&|<6VAXiH|z?L9TWa8*k;*Pd~yTM|)2wy|V1x6Umz^XP1t3at={0n{HX8)2p zgh+p2{x!m2YC~W!1GiK&pn-#)@cAbv26Vnp58NW84UPP30B=Yg42z{jx5uNaPUbLI zn*56fa^znN!@Ws!e*5m?U$ZI9$;&lz)*wBy$3mcMEy4f#Kc#k)vwxl0dFY1b`qk)! zg%aXo$fP9bPIy*hwysfYMx^TBW~(E*G?HA{d9@+9soH$7Pol1t9d_0;BFzYSP03GK zd4W{O{4yP3#v$FYIxTfjSIge#+sr<*I1<9_6Tc`s&js^P_%KO5uuoPtXnRJa9GCf< zyfhh+X$S#u6_6WVF*6RH6ztQ3MtG>wU04mX0zXop6u)@X7~3ZEK*4@xh=nlh6U`Ge zgk-987yMEy&gK5PesmZKh3V%`m6;{|XIs+$*qtotf7h1uzw2MKE$M&v4}a41zo;RL zSbODx{tfXeDG68SX3M{MIfeLl8%}fcBh;fJyj)W=pfT6DFrY28g|=*hnc=R?K8tKZ zZ8Ay#!x+@o4A6YDzb!7RLBtde3fQ@S*vyFh?Yqos%se-rr$TkJs>CF<0d(0^g%wk$ zv9dwiGa`92$?h7vXq|aT72RBrr^aK9W06n>z_B{3@szvIt9*C(E1C#a8YY4X(g`R< zx>TrcZi$O#7~@!gI$!Nqpo-|(zy?+M?pDl9~YrwSDsn%*pks9VE$cwib}(PD$a$Zgxk-Zn;H zf>B~kSjhduHVZ~Cl3h_;(_GXCvYZBPiRCqRP>WeWk7&h-*?IYY$SfH8Qp`esH3uAW z4ZwowTQhSC(CK}we}&~lFFfks$FZFHrVMB((t9ien$W+}anm@{&^UX?QRt!|?S#!J z6x)Cd;d1gX10=HjD=Z;GR%jt2``6XKplklb6OguvG!2l9CWT|+sbVg)zZf26W5oTX=k%OJt z*EbSTEJ0?02>yWSs+A4e3eS`vfB09{7097iaI}^Zt{n(mY>48JJeP+!EsUHAf4CrL zx)*s8r!f&<}2=I{yQ zAsHk&n0BidxJU1$^pZV|NJerWN`8CkAA?R~*2`SE$)Q|ht)xv~)1y9yl=^J}qzva( zkz4)8yuwR+lL40T9UOK%u&VskVEQVL@~^;G)S*WIzLk_6SVW9#(@L6~Ukb1K*p@0e zpi(s5N%an=|4D<^pr59HyyT9HQbh%biXwruAKIa)KW7Z@=d#m^e={R|sidhxJO7ws zmk-;TMsTcmg}RS-p$CBa#9)YTe74ZZC)ailgo&%OdMJFjDY0!Jui zK$)Z&7wORYS_trereDNdoV;0qqjP^yn>g82^qY&gy>fXYJQTJqsDPRfnpGRu8Y9?& zDs70qF?${reOo>JrZ_1I{CPsnvXk%6&`!R`3tYWNThjj}{hxHrlKywDDehj<|0Vq& zzsRRg|IfbZzl*!czi@=JwM3pAJk&qU{#|8e&E#LGp+-Qd5(G+hAI-zvtHZxSo`?xL zDf}t-r)i9cI<)hTsjfNTBwvRHVs}A=S`LnBxaQ`G9c%K$ynN(l1ek3&g5XGzjmU$Y z*D)6+sbX4?gXV{UNlHyjVqO!7g~Ss|=5u9Sq=nD7uK-*T?O2mX1BE!JJlZhJTjvmw zH+3Rd9#)6J1EAE23p=l4ZcNghOCFtf1ulWsv_7STWL%-4^&#acE3I$b93)%>zOu7S zC2KBXdgX|F-jD)>5SmqFZn5+1ez6jiVvlzF${9?%c$R5^t@U{~M9V5qDjS!fc-5(h z+Dsx4Ck+Z&5RyGdrZg7XFGHMbQ>X9fwc6xcSKmH7G)~>-J2y8*)q8YM`|g6CeLAN# zYf}wN-Z^l&0~eoTLI183t=8{&>Vry9k7R!iH}CwaTkMjT+6iL=QR1KXd`Ek zJn`Yk8S>^sku!#hU(8%I*cCbR0I*gMIde53XHbcude)?uU!JMRYyfKw7Mb(P2wG&$ zYZ-Je^2|kMAF!6&RxoHX&SUp@nbtME$yw5Ql*`|YDsGQ`OfeTOb6fhu(=}F=n42Z~ zYMe-Nb0;ByJY|jgRr-Gu)xU~3d3p-zr3{ZM|M#saoC0IqgMZ2H?BCVl($VX%`qwhJ zvt9DwIN^8FY9NvbaT5i8w1ImD`vnFjslqJVF>|&o@ajl6k4T4wvA>oBv!{fT9wVfP+sB~BpZ-@ea&TYti3YUq! zuF_#k`oE761Pui0H53H)s*j6w9Uej@L{lSjv-xK0r%j0|a zcW70w_^Pf2*9ws_m9~)Tn*LzNrX`)6IZ6W>1Z?c{%1Sv4g5`-p^*!Vxxw9{CE|RbM z9=`Y62DHo=N)Bn1od@NKbA2*CxUy`;p^h0UqSDiBMK2!yF0YL zxK({O+j@@@A9RT_I=20xd%8p!pRE&B3T5Z@%?IQ|h)0BQL?EBMc@zDidqnWhqi^HG z6kNok`sO0YyxCcxxwlWps_$jGj!OUQ2yCqC{m((>OFRi-XdT#j12^VEUgo$CQ?<%v zlFHZ7lE083EoX>!6+DFU4yxAZtU*z<$9W($VbK|YoU1LxoTI-NqEjxPC*R5~wk&3G z#~O`L*H4B5stW~F_IjqooO@^hw?W^d&zm*`u1_);Zus69@DGgje3XB+=FqIFi+?R^ zNV_rO-{H%`V?6~Ckv|dmc8NZ;p_$rBkoIM3RXa*MDW;H4sBqyh_;2t5J;r)E`IokZ zWdHUDJGRF@rape~?+MK2RIkiUB}`od%Q0z3zK#9Pc8y>>&gp59Qsc`eLaRlplOIQ9 z{V-tv>iF@JuN^mGweBBuV*%q0YPdOSK?2lWVY5ZRBe4D(E#41U1NkZMYk03uWNI_AQqKn{En% zf-Z7@|JKn_r;45hauff8C=`xDXZUKg*9J9(Z7M+B)fNy`(n1jkw(Msm0^UelC>J4R zNo{6ujf#3fUSU2cuwjlEoyYgL{CTBna@szmhH@NutBa2ysRR{lfivZ2pwr2#-__ z*9dp@2cN=;Wd!A}f}c5BV;o%&zj`>b&GsvP5mSgoH@VA#m3l%7y-_H|lKwC0f68hv z>3?TcnFIB+rT=N4-je>Ox@JlLZ_Gu;M8qxc>)-WZ0N$`>rSx?FQY?XToZ(RsgGTZ} zE}EHv3X1eGg|?8qGYpOp5`1a$$)3xB?OQ+v>@L2#=yGq*BFe;5EKfOkVi#5<$dE&s zhz!Yv6%F{MX6Jc-G6LWPnWQ{Z7*$8VrdLE?da6f78yS*V5%m${LQ5!PCg^%ll!;y& zh-@1Iyws5dwLpF6ZO>vc7zBCxhO_fV7ev4n0LVvAf3zZ+4)T$qPF;a|<;o=;83x^$ zfs5qSl=A%ICdve<>rgEs7344`P%l*Uv>nyJT^+cH2Rm=jsO*zHEdFMdn#L1Q5zP$A z1Ri`F1g;M6=^4FkL{9f2OqakKAA=?!Qmkm^!-2{<9VC*xh4D+%Et%t{C|sAcmc(1Wwb<#z84w8Pa_e^{F`OOai*FB;NL;}qNQe}=Ch_Nq?benO){Efc<>+x zR)?%5BASQ;o1^;PHv^%QZMxa3; zla!%BSPURUfV7gYjPSdyC#xV^nOGx|Qwcb}>kVf?&ZuAh8mhtOsSq1f-~09{kTVe3 z_EE?gP`-6Gb&AE$LEZcCqJ)kTY;@zkO%Xuzp!Xnz;!V@l1SP=tlCXc1SYTuR&09SW|BjhXjlt*Y;uBymGy!({ zB68dh{oEkpF1D%;Fxt72nz6(!-I~EVNa7}Rxs;##-?5)l^-j;9ix|$%ir~jPNN*O>PX4)Gp)ZRrm;Q63erbMg20^OO;|RSc1lS|0Rt|G-lbEDJTclw%VOMa;~7^2BA>) zsr9b<@a_Mc7ON9l0LecW^9xD*fz#nf?-17dP$nsaoKYs}^fN|&E`8FgVfygE((#;y zc@P>-$eHUSkTcz%OCQ7icS6p9dRdOhnG`6?vm<9dbCJ3GUuIN&>z_-&8;sc}DKbOn zOW{%VO|j>hgwCY?Nfn@25g_?x7S1d_01-pJP2A+uOhOmr&(!`Om+4N#%PBI-LHYpU zBTQU>Xf98#Ir;aT;$I3NM~|Ci|Gwj2jf;O{H_40}Y-Bcx-k`+%L=_-GHcnh*BB$O& zKfOe&-Xa{35HT0LtByp6x{WMqG#SuRPJJ3fuC7T_G|j(PP@z%$JKI;&^w$8qtB4)# zAoYVmRqX)}hOy4&n6iZGO-*m)BR;=m*w9=w=$ku+-OL}12^p{e>()>z5Wi|jJS zN?NXeL>sRogBLR|k|rM)FKH$!@Oz8^aHuiHZH(HPZVF_A2!zcHDnME??TH4qjMc=PZm5MS58bXU=f#*}q~;tgT5C)1*c)@~wHKrs&x zHeSa5Vr|xh1;NH14Gmt*e$rji;Kc|TQ1`k?sDIvA$>F=r94nb?5o%|;CGH_{OQd#2 z#!99SUZg1Q@$zU1H;LtmBZC+7o-}Y4rg^(EYi308Tl@PH?{Jpl_n6I%(-=eDWZ1~y z#k|K%L*2v`zgKCbY!}6E7Z6UwM2upGkunY_DI;<4Vm(%JkPMhOcrk0N+DFNCb>kL;!Xk8H&OQULHq(rMe~!5+5(nC8EC)%bruNnNd`yxEbta|1j_A-*|y8 z$G_-+=DEKbCHO!wxt4#S95b=}8!zCj_DOOyF3Fd~X0u@cC^b8U$m)~$H%?s5^KTk) zbZPmDC9INGTnKJ@ zBG^WR@dvV}^&1su4ySm5F?X!wpt&5cvBz{|l46l_;^0LIdWSxWramxP5#_OxfWB_- zSV@C1(g4a6CBVBUa%Kz$kTiJl?}wa$shuctrc4>U_$iPxPDSSP-HXfvhe+b!MJY0) zsx>8uoSayYPgP{bO%4}eQ=VP?JFO$P zA;!v>`x+J);NKKe|3Z8C^s2hZ){W@MWf>E};yQ97em>T579F{X@re43+xPG+r7!z} z9B4tNNlKyAgebRq{G=u5Pz5KhTuO`yt6BZca-^9Cx{X6{=(xh|gB|#0%6dC!+ zcOXSZ{`GjlvGJ^njRuWc_Ohld2{#^&lA@qjxnEDXi+ms zK|FJs;!wntRUKoJPWH9qa#iv}!u5c@?mH9#>MQ_DiZ33(o6BTu7JmU`40jZ+tSX|YDv66Ti6A{lN~?1a@a! za;ixo$2BpOod=0CxP-ECqxT0L-zM)5s70B;BvnzP(Iu6NXcYR3i=s3opgGfjnQ0Dy z;;Jy4oC_iAR8sXEDMd;HaX-vOEpFbB(OyQ@1l2K<2GE?JOi^oQf=K2xS^J2kK;rcS zA3bGwSV`b^jkf?KLcnBoTY6SALNui@2Py#E%fAwsjeMRt{yih2wd&s)MMB6mm-z0T z<{FO)DaTk-On->)b}R-+k)zRf0MONG0;f6C{}5U2VSR=)-NK}cY-3r~<_D~>KK!BQf@AV@a`iw$BQ;=k=aACzy*2bhMYNE7UWF* zuue4L6y(e(6R^>{OF+(GOu#atB;(^3pCYphyED1SJaY6mMdopA#^15X436+lW0HcV zBJf}c`i}1plOpgbQ=WyYJl?i@5^dfTYk^ULfdW1v@b7U%D>v@r5hl%Xj>$v>se%3U ztk0PJ_MKaqNKrItRapdnfAvrS^6+outJzM&U0nP-Y2;ssypv+hL4!qO-HGboj%8+C-S7az;RRqILC1>paw%zl_JLlP!;0_Rv9XZ1z*8 z#GNRcr7Z{wy%yXQD9ty;Bo!QTv@fIL zNaM~Wzrbo^C8#EpVox$BbW&wh)b*nWE|FqlzI&397AdAoQn1-^K_wGKy?JzeUJ5mv zONbE#{wGlzOR**WH`tQ?cU`lj|3?2lRr){v=`HEM!8P|w|KR}~cS-*XN#0K`m>Jl= z=SYnAg?pM&)dKPFamv3>FsnDk2qsjb?G>3CV?S#&Ejo{>Jf+NXZA}#!!K;XTI@GhS z9uu#;O`5BOJ4Vt!OkgL3(ik~>LsyG9~3Ek}fNy|PuL}v1XDiWYIlOI&t!=miG z6mw;g;$k(U5myTFN+OW)I95L>4+g>9--}3^$56GC<|1j%x;l|fhN>paMi~6v?PG_Xl#%0)!S(WbdCq_ve-%?kPEP8#Lo_fBYMzEp-!<$=<5;6ftA$v{06Zz0ld5}m8tW8@ z&rMr+Y7k`%OOqU^j$Ya}>uCMlM|O)^P! zsKNNJ1e9Q`CYHv&pD>M8W^{@^ZwVFwD8Tc2-pP8`ByuJeHcvv)CT&5^bRCz1oCzqw z6yyx>Y1haZKxrgtNuOg*=pBp9kn+Y-WS;AJqZ0k8&+DV|G};K?LGCk zJP z6;t}jNfsnhFW@7`#kCT@%DA|eu=5ZMfCoD-(R`SsQ{}tqM~*T{75_Q0r1A2dU;uzX z#RY|!>KEZGKsYg0=YwG$<(RmZmfSB91*f9vR}M#Cug8x`cHZ=p3OjH106@7yIFodO z_%{8>6q7W>ayb;qskJg;@X(^H**s8*@n)5fBKN!HrIENZdf;;#w&+#z}Li zF{YUhlQf}xH)%@W9xi7EzD)J5Mv*!32@b6q0sv#?L+UPx%#!|R*^>Tu%r*VTMhPtG zf8TLS`ft18CH4QjZF-RGpr|N z4fIZ84Ejmc$^>(uy{9gShr*IzT7XB64>w876XP`;LL!|ZNs1{XlA|e;6x)anR}YxS zbqwZ_qG?|U;&D_PL5ALfKmuAT1iPDPEy)7A!jeq!z|KU9%|<1KQ#9@4W9cT5NGYaB zqWk$XxdL&wawxc(Il%k5I|vR5;C21kto755s4&y znV}j^%HY&Vo20usngf$m;O<~WG?rtE0N~U)DDz5&BDZ>QDw1PL1ag=3U#o~9*X#@; z>q3ICEyqfcS`43PAci;OF#1tUvQ(0mONL_4e)JbL7!^wosd_*BuBI9VqGO2GNtTNI zXRJm$GR0fBTrk_Z*D2#fc$wY5i7ccf|3Wgtjelnr2`TDe11m+6YtS)XafQ{CdBH`L zVI9&~iUAN^9Syu=vKU@Q7=RP1TlmIlChp(yuz8m>gH;&xqyBvdb%a7YdrGg&%{8?; z3efD+;q~C1#2ECGvIcB%20e!>h$OXkf$xHx;kOY)$jc*xlgH0vlgAT<;x~ssBLOzS zdmu>)7j|Cif^fYH6qJ}$S4(>2(NjQFe5dMNadkDCdw52XGY5(>?owoSLe7*6a>mgX z`4LS44ipHcOU+I-DQF-cZ zGT{~7UO>)liu8x4Yed8k`ni-@;R&lc8vm1QT9RxFHD}8K;anLJ1+{fT!Gz~70h46Y zjb0~Q1?Zo&F(UZNN0x}tYDk8QT^plG3R-)2)+OTR-EN9q;{n>z&hWiITzbaP^o zj^d^gtda*t^@3{%6>d{x9i&eb2j3k^UzET{Qh45aM%6|Ity= znLoFr|EYG*^uKtfYSN0W=U)LbZKva+1ph+A=3M-H=buw}Jg9y!46l+=0tpSiW;jtV zc=j13zzsfZa$?4Uz*BM(xo=ZXeICsdlkaeh`xfqy=ibh9hjW+{lQgN`7%|#yh9hSt zaHU9^3w5OzIs4t=>_btTXW1svaN;K1H-HEh;l9xwCe78ACeBbXdDc6e!<;}qS5S{4 z!X!<RLyF=`rkLdp=P=cOfX00AjE3qPhsZ47-dFpv(;;kS zDI-2tgk%^DV>qru>i>y)WnSj;b2NY(jYT6ziL}fT_V$SS{ffZh)vuWEu$jAbms6(D zkM!ZMQ^dd0b4e(gMg8j_nI%GGfPeFTPKHX`_o7A~4QMp$*s=kpcD0oy5)FjcFqCen zo)zR8;bj1Ucix&LZx<0`|H9kFWpKNY1y5@ zIRhoscSg>9k|J|bMJ`%oJ}pINgWau!n1! zSz95cR}69{C7=^na9;6X>)TT=OSxTH-j@!oRg~LNR;Gh8f0n7<2vl8}&%e^I-=$U{ zasQ6q-hEr@MWZDGT|_ZL5C>;a&M{ZHUFQzm{!2&Y_B*X|#@ zU!J^%Df4@1MP`}n*id{!>jlQYu@+gXvaS@?Zg)jh<}V$T`A77<=P)@Uw^)&Iwke8P zlPHH3_+9ve9_+jY~5(1^f+XBkr9_tDeiU~fcEZw_11|J2)C(*Gs>uUGX`r2qRR z{Wo6Z+0*}!7o0y``ky!!c49&1^e^+6CdWL*{fiGyN*o2^=^D4Oq39?j(b?{=_Tika z@4Xpx&5otBr$MK##F#@kx|(SbX?Siup`Y z9AT1XO`?1~4q#S&CQ*9K!p<_6T96CWN4Qb9E*J};2dxDaxPjk~h0uAo7ixF+L(~^i z3p#q@C3SEcI5W|q@0RzAE@MMy^Dhn7%s@?#`}g88n6Cu= zo9CM7sP|OY90tRx%sV*}2j}*fXvNG)7m>DO2cLQT3m?q)<;duQ`?d zQ75?le#aoSS=RFJJ@j=885?><$A<1?A~TX{DuAcA+7#HoBz`pn_3vQIsih9rY*ji5 z8Az13ARe=8=bNIKHHlK%m%YSF`Gepj$_vQO%d*5NiW3)c;Atw8^tMKnHHlJcM2D_! ziPI!XbYsc;#m|A9nHXCyR)@{ECC9%ta%Oi%rzpB0XNJ<%7pbd!GUUvY6`61TrDu^D zgpMpl<~bj>2{6(=z~L2RMKVkiRY6wGzfmoYR78C-Bs%0$SeB^cj)?lgNmMGL0+ivJ z0Tm!^b|gcl`=T@r5grkL3k8!f{~alq7;Nw)%Ch_q-jIGZMn_Iiq7}hTD-aNYVx#q+qJ%fal z!Qw`)qX^CX3`pr^nVUp(*LAY zx_|m#!`e|j;Va?d93ZJ}{|W~=)H+)$Sc3!S&Ugp9i#VXaiZZ@P-8&bC*jX-X2yh0vK7)LmI*|+~> zp)P%l^dG<-xM^$wlPRbfdhUow&`6Ywc2A!mprg{E`v3hA_44@eVDu(hPJ@gNnjCi9 z8>BJU!25&FM_t1sZd)O@jF7kuDzaUZg(3Gdl}^PA7yka;?DFEhh=0>tqJ4AmufcGB zebLZx@csN|=MlbqdTdtjJcmyA4J+VF^C;}P_jHZG+MmL|WhZP_B1w*adnXI!(Ir>` zSW{8-?hTqhX;r~YlhhBeJ5ex3vwaanAp>>aj7MyztHM#mR*9p>`xXIk7*%8}X~spi z99%UuqNdxD99+q}-Rctw0U1OzNh*CmrxcPWLZgeun50?u(o?XJF81M)KB`z^hSo(~ zmCWxql&bhSku%K|7UT@twwN0^gOUgDjhuO+A~UO%E=6Yk(I+l4&tbU{_@K=Zfipck zFKrQlyC%b$DQ&rrX#|c#XwVVNoi>~;ZCP=Hh&Yv}f8`%#c1EUa zT>RTHJ)7>DwH37#!1e;E0C5BeMzgz{Q=oeD!~375**~;CMs4U$u)~eGVEV$iA2is?q7|{kKiqvAmf9yY&0;IFd!&M#Wy*=cD}S*grABZ2~dOShz{35CsZgy21RjnTLuIg@$@Eri@X+*Gc0n54FEutO{E zv$;*{Q?|dsyV;WdPui0HFX?~BT=t?R{hz~@^ncPGmHrnlxHvCFZW|kKf-!gf>jq=) zGMMh=nlcNK+qanzxdxbPXR642Fy=d0qc{ZYMMC*RXV-?@>h+s0G9%)0ATBDR+aSK^ zyK7o$mb>y`=NZhENebPGu%zo4fFz8v6q$53^tq{s?obe^N`*lCq0K~(9S92>ofF{Z zl^LXdk)R^4upo)EelMNEg3UUGg}WJLQl&eSH2d*yK|Z!%US|^3716STqBN}!VLa~3 zcPQ#u9RMrJ(T|C`hf}*c3-r{seS=Kjt^quqZ_sAS&bxP->B%JZn+T)dVBU+`fmpXh zkbp zFr{yE3{0`fkOpn=>Q4?Q^_1U~nY%Y=Dv!`0KWMm*hL=zvBn2*2#xtPT8bN+4aP`q^ zmbnXfDVZDsUl3 zOcyyL!TjGBIfD=VT#C$d*mD+{=QAf2AkRtb=JE7O5D5GBtmEnLV_B2dhh5`6Xff`(#&<*o*U&2WGwHm@8N9P8sS8KO%4eY$0 zUut&VUDfJzL0p)mWg9nTuy!p@BCB0C6O(jHL@7&D=D^;%Aax($7aCFt3pHmdW%cbw zDXSKJ`u*Qo7io(lX+~2*MQPGBzJKMm@M4lOy1=g%XPeq45q@!# z+5^+E+f&;#YqhPEWvelE{o+w$H2*Z?rX1_xHfz`7bk=I#1*L;5iOj&P)m)QVtB(kk zi>FTiv%&C7`aj^BCHfhVDg8geY!cCn(T~<3!)GUKfx+OxF=*!?+ z7H99U9~zgG>MGQK2ZmHK$Qg{iTLl@L41SeY)&&^?FLh<`bFBkjx~I(n^08T)#ikMv zd45st1xjItWbkv%1><2|Qo*RSN4;lXgpYmg=71zifYxxH2z+MSZc)8>JkhHpJh-}cH3MV3)WYh8$=YN2; zrV7`xp5dX)=E)>=nZ(^hR@qlj*h6S}Jjp{L#wqPfW;yQW5qh&TEEkdS0q4#vtt_j> zkt9zCG8&hMLd=OtT7pMR%_K$Wv0AV#pX8w+zeqU_Jo@2soQ&`&6-{dLOE?q)FeuJP+t=_FjkH&{dBYo;E88E~2G zV>UC9t!+L;ww(Zb^efJORYJFGD|0KJo57{G%`il}O=cYiRG6rsn~x+PBZ*c13r zh$)c`_+VX$YzPgcPMkd->Os9`0r`NZKaV5^lmQ6k7(hO%_hmtpDa`o#Bo77oWzTp9 zP^`d>$RGRn{JRMQK$xd)DPJZbTAt z@BXmqS#@2rvtY=*OoajYY~}m+ZP>D{6cjGTPs`&Yx}bqWz;-TOFQ>b z=2WzC5+UD>?Z%Rohu4+pA>w}-7f$~CSd5$$j(MhNo>Za#cf?9Rx}t4%3~kMzrvj6{^(Ln15V z&9DML?}rZ`UI|)Th8OTlNCQEIRY4l>LRe)}(NS@v%W98iG&nmCwC5R#$ZDuEzQ=Sr zh&U42GYqeU{Nf|*_5p4kg^F&;2rUzmTom|eAA14`KFFR&*o~Q_D={L3g5XqGPdw*>uL z^k(Tk#OirZ20(k`8jpEZEHot8X=~goisCGtgybUulZFBYKoiBGM~_65ffqaI>m%-V zxjJ6V>^wCG${}dJOj7d|bW(GeC1gf}vt;7S)?rFAWxmkxO3+BH8dVE%8HuU=b=drPU2({sW+bB4Lj+uByvVWXRzF-<9I@vaiMTp`1kB8l@G91qgv!)h&wTvw zO3T9p+qLsb{vLR!tp<7s;LE5Wv^iCu%0nTX3VN|hTs{mGYi=GadqYb zm_gPyuNh=a4hp?p(?&$C8OjaA+X6KKH;4CnmiMDfb?v~hvtIr^^ZY(*G~(c2d7@*9 zH+ezhyv(LF*gQxWLxxenv?ubihcx9lgb?*(pfV#e-H+36DRgiZsH*Mg-xW4%)y2QX z?X1;@xu%)-^k7Y`wbmjC7h${^Nmmb-dKRb6ZfC7N#x+ke5^?>;#hL307zxUKKyL9o ze0U{jPcjnmi_R=~p$*M;^43FmpJ8|<>X!vMGwhcIIU}|pXKt4C35(48>r!NXwj%Qj z4Wfz}2}IkC@SoH$1+JrrYv@iC>hJ{!x;BDi!JrOAI28pCuYljY7h;daNz78nhAZkd27{FBqPMkw9T# zznUxjKjew_P@6yic0q~0JhF}6ZTMuOZ}J|Ccn@c3MnkbT`IM$+ptpgQD@jM_rhH&_DfvH9WM7j7>0H6gqIeahs@)x3A16SaXtX%Ja%>5{vAu?$$R86b?{@;4`Q>Fhb(infA@!d?e5$HPP-;%Nb z;AZGHUbYuAp3SQQuok{Q_&B(09HPV*K5o$B%sCVR4&^`Ij9e0i_b`$K{c5HbHk2%8 z-|;TA7XfbwCuNf#_{2rHdVd!Q7=FxfpwTAO+(fMg8^vi z9zXrDH)O8`BET;%M|CbR1BeOB@r31Nf1MpUv%BJ_ww8zyzi0#kjm-F9oC%^5z%mr% z7i?ic*vt+t{@3vdT6yEztWm-j{K+6aL|GXm&^@t#u`00yRM^LR<%=L7aBaI!R6AN%kw4;5KAFaS$hlM@r$A-^2pSTQttLo~8BFDVTJ<K~x0S@?m1Dx;y=%G|$MSZ=%LCsMQ`$tbPycK$w>3-A1D?N&rjrtnrG_uq$v}jg`cI zaBPnhZv)tv$%g1BBX1h;$&?N;03JDunwfnUDp*06)auMv;HfCOshUg21azG4n1Kha~ugbz-qEuKK^* z6C`Q=?ea^w+6CdFt`#>G{kkW-wo+;>v>EQsPvI9La3KM6P-ms~5Tc8|-YZK8`CjT# zV#ppM)g)k5cP0Gi0x&?(4oxD1RMfdFM&I4&iXF>U{Cru`|65zq|9M>V+0y@A?5kPQ z|K48o2d~MJ{@=RhXG#AL|9at?SZq~Q8$Z6M@y3YwmzpE+IS#r;8dA_avfsXQ*L4Gg z0Rd>F&>H)ys%x-Sl^z@(V&Sg&WoMlA+`RK)RZ9eqNjiNd(SR7y+ES zg~I@BQ+=rgOHmzfnHFKbLf{%JgB$&1usm_abR_hk!NW5KfMG)oj#rBDu7J{em;|cD zndnwAkuF4%M0g#SVpsv(!IS7SuZIJ11RY=Ll+kMb2$1SS-)c@j`X(wT{B=c=hx+$24oqeuKeUVn93fP7AXem-;bsz7VGv5g`pe?j!E?^BIj3lNWaqN`YmJ{87Rd7Pe zJ3{V5>zQab^F^j(K=T>b{`?}ks9`S>s(gfu|dOvyWuNdeXa$9THQBZoNLDc;u^ z4d@z|j0RFI4nko9zp)o*Hrw;demd@*_#9+IgJ4k%ym=NxlXX4Ws4#m$DmfR%Bkiy$6u$&s1c7j$-EY%JY_sgl&f_9}N#2-^|*5=zK;3 zUDKR#`v})+hY@k7U1?XD5Z8pa2&sA2lWmb@K`kg|P!ftvr2YNJ%kHccA>(z{-`;ut zJAL4o;thQ`F8)QvlH#`Bqa(`$4@D|J=he}85%Mn`C0mF)A1-yIx#w>f_nEQ`aBcqRO**u0g@+1}4ErKtW9Q3ir#K zL}&=Qe$B{gs)?D4z(Sj%Y7#V4-s4RR0Q>No*}q)S0?3eRFUVo{`t3sHqcd`7ZnOvV zvWEzI>)-$Vg2^Knf)Ye`c+f}+80+qR`wvq@SG1=YFLLCM?gAzwBxx94wl6@QxFNrQ zQlg-d78#^8D|y)tiey$_SuyVfo(@dDsQioS=Ix-lR}OxG6(oWyU>;f9s)$xmBCxUl_MPI804gwFWW_^X z_Ru5|(5e>|fxF0q>{YwN+TYRQaM%eqTl!6-%}IBNAA)w%i5L^uXm!q-v4dMq zULYcJa1EU@$hRL}_@lOFtQQG`)dCmBqe0ANKnMRq0~T@P_Ab($De884$Rmsg4b9&? z3oss>!r<}MYz_{IDrm1#xP!jj5SvL1a5A2ozkTO&*^4Os+Ha=X0q~ZSi+@3*u=xZQ z?s(D@W1G#Dg!Q3;XCQIW%Ylvw41c?(3Os~~!d*i`QeZn{b^LhIQnR_AxIQ!z?g+So zC$%B$%ff?D02-xuXQZoAu=H_g7MBPDhXFj?#7F$X-!B|~hbIC>?GOu~mu(4hG?ZRZ zA_yE&J7jH4p#T08A!jaNY!<*O2Wd3_T*#S6VgP7LEZR|B9WO7eZjB&kLZ9pGAe{Jf z6qyeUcL5K|%Ti?aH7+twul(;cqJIFS4q8w5Tp1!|IzlQmfI_-Q!|-6~Vp)I104!DhCt7#W4r- zfxELzAj7ppHKq;iK*w%)OG~giN31mTtYKE#1M#SQIv^T=^*U6qsJR`?>k$0H zOj0Cu3b2Q8&_Hsa;bl8hBKa8DgA=2c8n{Q1YB3y|^*Z=~mZ@oil(V!o2Gzt6ldjDU zljhh`Yv6b_XEd@7`=B%F!6ZH7WPugWEO-#?fr9o6n3UD)z-O+FNh<4b_`sQ@6y2e? z>nd0cuNeTmgnpejkUcaMwPxob*a=>T7gmA->)~)Mx=>!*qv+c-&HUog7YKnamuPJD zaE`RA2!u7Ok$U)&{x?str2jKmogN|=SvSQe{cZDLOoc=n!URvD zPMDx3qE{v}FG?gzY?!1#UB%_(wVN<%OOR1Zf$m9*W|m8_yic9}BWyB>B6g*Xt;{By z;p6(45(0s|06Osl^ctu$OTlelgSYMVF5&25MOq~CcQN8Az`{-8g%8#8HBEZ0u4!=% zDRYMLTcps7e8o*85}D?(CwML9U&N@^9Vj^vl<{jgwX07L;pp*fCh_kMI{1X6hxwPt z{zQra#$Q6NVJS!}hm=ja)!VZa@J(@M%`vPqBj~x@{Ch_Hix8mh^ad68L4$|c0_pGpQ?P>+=&woDa9lpW058YUBMAK%u0J? zgvQ_>Nc#AHs9aVCL=zRh49AubEB0p}Cg~AnlFG}5)kY9o@6dUsMa`()e>XEp>vfIrXY^b^@r{L4$ zwepC=3CIZxwyHee5b0W)jp}kJx}G*e-KUx8H5x}&WV*5*v zd6(>?s|^CG^Db*9Y4(12;}-=#Bl{tD*1(#W)qaSY8Oo^!m|C>xwr(pSN{k#@DtZs&B}`Hd6!Q0@Fo3U(*L<^N&jQ6SFi+15mzhL6j}ziS?%k?-pk%-HJ$BnmdbSmZ1KM1-QNik);U zMa~<$@P49;ZUD_UJcA=JjDGQ$Hq~b5t>}|6h@Z6QU9Moop$&gB z7?YHhX+b4bo2jHZGyy~^qPsdDu`o%c+IFZvIus`?uq9wWROxAGv@!7OwDSNAG6hbA zlckl>YFWFL+4C`t}deaH~~)pb_L;G$YKU;*GN-f1S)8c2pNxdmbqQ;(HMQ zCulT9=mPRJ>X19MW>|n_d&%vMhW-?h9g4a^jE*%w`}z0Ye$ih?56bqGC_QMhlkOY; zhTgZuzc;R7zCWf+E2Nl5_@!vXsIeFzh)4uYT}_U%cgR}Ls`?*cha{~bgdK1GesAtd z{QIDuCN~hlk0S(zZ6c}Y5Ta8fh_sB0*W85tFLDPS70X~ z&o>0m8ocLg|7nj>YMY&>({{2iqTkw;n53v*Lidec5@c~)#*^91CC?Ql$pic752{HT zipU$&-BILB$vxudLC$>sBJ!4z_%l{u-w=iB zRfX_5(zS%nn$_3uxc;s2r@hjgouoOcz<&=%QZ{`g~CwtK_3L`Vv~2#KOA8b@bwW?qCN5M{66OwuL&FP8Lw9$V7? z>8D%L|0VtJ-26|R{>!fD<==aU0Yv-^{Z^!l(ebZT05Ye>D5OW4gEs#TuIgqFH5}{t zQ+IZawqGwu&@R$Rs;Uu2d*@FTQL=-4ddgUYp3bQ~jdEITwh`o&eK+o~^JHYq{=9z6 zSP*6BU2pw@cl6FH=#%+DV80U*ej9K8NXRh|g1*1$KN^^%1juP-k-IQSbw32_8(hu1 z_xIxWW;ST6D(fU)XI-=VW;#^AYi&9JNY=H%C&#S!yJx5fsQU6}S zXvDax0&yv!giaD|jjS5o!d(BJLH~AF_3%zjJ*=L&zgm>fVRIRq+bMAIB;3_551l1> zkh+G-*XR^2KMqv3{3&kSo$*kik=!8woG44mipJaQyrL;PgZKoalw56XoysKfE2p3kVy@@KoFlyoP&J+`(Ktu#Up zs476vTeP7iT4NWVJ} zXApTVU#~fsT3>F5uV=8Pkp!x%!8Ng5v++hd*5{2%w6;H`r?ee*UePc~v7-8|yo|wA z90>{$v#pji2PTlJuya}K<p!q-N48#3_>$C&}U?JT4&cGS_C(QIz3IIkC_xpvcav zR;b`p55EP;7);Z>)18sq4qtkMqLDA%P!FdFCo_=J|wfi^lb zRzui%EqMW7p=0w!ROtAwJG!`?@C!I-3iBSq#tHKUF1 zyOsHrFAg{5izZszr7lRw8g3;Hd_X>o-v+J_LWn~NRzwYk!}%y(4b_;Nw>=Z&BiVYp zn8_fY9V8bo1#m!4%0;rw;unHgBSmJ_vS@$l%{b0fzkKVK$cRaLc43l&9H^DfYPqLh z^h*b3qJ=O0()rQ_4W7*1=+Vq*(j z{F`e{)B$wOhB)j$Xly}705I-ftPIY&2RVJ!fd>qto#?KZZ@Pv+%-lr#H?din6^io^ z;VPD>PkhlD!st2m_Y3>?41T|s-zBV0u1evpsee`KvuK!8sp-s!f6r}Nx4|0vRdQlA zutaZE^v+a1_i)WS$UZByIMe<{a@CIqzY%6EBJB8?N>6t%pBeFC+|>2?+j7va*=eYtfyZ2?N?6eHLC8-vm{XEdv~=C$l7T^sN16C-D?4#=5K zp7;|YXYMV1%t{MLqgm3`R`0`#oVnQyU63=MxyYOs*$ysgN1SjeGUH|_GRx;s-6}FF z!lNjZYZ6Pm+4n{XQFh&DR}uT9ux;$wRkIFL0SX1oat&O>r6`nZf&PyTORZug7TM@L zyAJ72dRNDaiY_WKPX0yFEV<@VG#>P?7X8v*v*6!>cUwn$fRIHr;AuKIz!{foE=A+P zBR~pksW1F+QBhuaQ0RcaU+@_Pt#rS%n&R+0#K^$25BZl>p3>WVG5C@S zFp_xlDfx=uI?4%re!<_ZLxQ^id*{ltA^Du}l-;m${5q z>1bHp!!Lm~hDI!d6J4_u`1|ZUxiZ`z>@%1wt8_ak;SR<*COpw~0Qascnn}+xhOfr! z;l+~vFX_LxE$M&iGk(_e|6@u2-RrLyNcf%qizwW2Ol)7`)wJ@$%aCNZ3zJm#1Z;{{XZqV6Om)Bg z#rAaoP137gv-3JdX$O!`t%T+`{p}7W93RXtl&*FQxiWt?F&YmQ(Q`l3#6dnmtbpM9 zEh)wPi|~AwJ5nAx1AuHs_2e!)FH1^ste!mBtjV%Qzyv5Gi00uvqh(Phgm}1v_2gV8 z>0mv1z5DQBlG3UIqaq%HM0Jt$7tr>%xys&xrar`?fv0W`q9CMfpnNGw5IN_C(VO zS|}NIeAkBNpLhx;J>|}`eEZ1iBo1o6QSNyH%dMXNy=QnPntl!irH+3GG}$KnJ8-Os zf5GUHVhPZ{qSuVHfF4HI--i_8-zcOHCyPHQ!uj01e(=mKo$vQIiz!g5czp zop-x>b(=Dcwy*5GTNr?cDg{YyqEqMkB4%@&Orroe8nxPLx0sp3Bpuw!lu7D2v(@UC z&xxEFswd|oX9iS`p9VSeCk_5)>r%Y!67?YDlua)k46k1>iAoR(su8}L-;P;Twoq!1rsW)rK-fp zw3^-*vHtbFL%6owA*(!LT9NACJM9wd0IMs(6DQ(d;ld|udQtzDFIaOq_?Nm-NWi0r zjyrudEjR%(1mQY%1f(;>*ZW~2Pe8N4s-(^L3;MSTXm=1=DcuCdQ?1Fb_MAEb;}Mmo zgiT)kJFwy4h115r0INmuHc%p&anJQkH{c?aR-eKUgx)*JJ@*udcz;|}ZMXt}#1e-R z(!ZrQ@1Q^s%riOB`veoT%z*9`JGqI;bHcAQYKyx^&PS7D`vo zePOzW_mptvjxC)qNl~`K8N_wC053C^)MM`*t1)IN@Q+PDahZF?ZIqdg(K$?)4ieFd zv=Y+m;bW}?t%pPD;gbF%u36ImjxFhbx-IGdfPa_t-+a$r>Hi2G#z6qE{(fEjdoOSu z_r#I>I^thqPMuP^!!qM?NbX4$0I>OJ2Xt!Em;%6j=Arr+Db8FI8}~Xc>eA1x1{va6 z)|@rKz=%PL*?gvLP0YF6Tkq$IJzehcr5k4F6^$wdbn?oiHh@X03=wF?O2!TI_70|U zBP3i^%}rvGie6c7>0FqkN-+a=p%IGNOs26J1h9+%CuC?v0!e3V>6Bd#1*?QLLP0(f zA_5iByq`PLHxBTdTIp)HBAPyfTVPtfrE>xKXc~(x6f9Ym_j7aZy%Gy0#JXc@Z+=Wt z6dj~PUhee0q%Ym*Q%gm(?9UBMXOfPQaGP=SM?QX<((Blp;Zv2P;VQ3VoE| zoD+v5yb{!Npq|MIPR?|dfya~t_8pohD6Y9zf?2aXpc#l`*~$;TcuLt^;)LEy5_U6q zC`lxN%~&f5{_m7v*4-Io8;|&xj*p}SHtJtg*RJs|kp7eI*(tPm0CY#Xg~(?JIGuOT z;|%@ubCcR1!(5L+hIpp^AdU~D?M(hH!S6TAsxK7eC6RxJWdW!omPAM){|>je#J?UY z?(MN_xi+Q%FsEzq8JDBbg>;6vv_FR0m&y^dvL~v90}3>q2I1v*UanNDwj(;ekz+z-PljQ}iBcpQ6b-A}iAoGs zoqH1hrkl2kfG<@1I~)cissJVV7hKgLC7kT#+NG8VJX~`DBj=*7Bn%ZyR$sqIK8M;= zN3k3%h{>6YW-%VJbyRq{j}9kiMz5HbOT@qN&*Ao|&tp27>p(~eI|(!&jR*9AYC;~% zmAa}yuLf;8Zz$~@JRF;mf>YTjJ@v4TqN*QU5H^!4&eU3DDW9jHTeHc z9agCGmK61O-q1t-~LQ>NgRK`#17A zv@IZTV*b5?!Ik=VfSQrNT=&?}d`1b-S2MP5+}@omXy}-XfwLyS!{A0Uoi)(Vs6xU3 zC^1ho7g|A_ou{*Cr;^R_5t*(`QjhTaF338CI|BJNiyn+rL}kYJ6o;!y@FO`d&So0Z zk403M1^i!i`Bv5eS6bt}CLm>$kWR z=%jKo1SU*mlEwk6E;{oPfk3Cj51GFG`@BwJu1nNGoc)70VEEtjc*jPn}JZ$!v&wqgUgMkn{;O|d8HKv z0E7Mw0l;oL07&vLI#q}KixtgWmMitQ4lw4tfmIA#B=Ou-x!3dH3^fV7vB2KPzjvG% zBK=d$H6qkD^g`0-a7tlSgxEWT%_IJWJNPdC)#bX2YxW%cU~LN)j2gV*kV;&}K8G9E za0E3N=Dl56Zx%w%;9Wu=&T^7D4X6rbgs}ltTr8c`8x(b&q43F*Ns8ufsagT3)u}OX zk=3yzfv@3`g^VxR(HzPlabZL?KI30g4Z{qj-#DY*7`Ua&S;l zy1A4qlUKDmWjuDb|dN8|s{jiCoyG&wqH#E~Q5`9UX8PU}d#W_eg z(M3i+#iDe@BvbVDXl9hskczYO3Ku46l+cuDBEmU8x9*h#r-Z>Jqb96}(acC-4^bxR z>g#vOj7DM}0=uF;KCOw_{o+y+OEH&m5)&Z6S{!M-s6P2J`!GqFuz-dT*E1957 z(4u26a|)AG;;s?Yr3;gkfR`g3ne>amz{{j14N21lqyS9T7*k^1NR6@Zt%qanw$SVt zX<|B>&di#(xsy^4*Ba6A^9l@UN&j>2HYxp|N@SMwzw^9H`fu^?lK%JnyQKfQ&-+Qz z|3Xw^&?$}j{mwj4z+-SB0prhO!1y9M_OyB4DLH8IFV-0$|CTU}5FLw|W)6sP1saVO zXQZGJO(kejc5GCiOFuD@7#q9KCJeB1T9bZgcfs45E0NC{-X%7qM>?oQ-~2aGc3#o+ znz2Z7oY0hLP53?Y3=WzUgA=$YXBi2cngI~w@l1o^8LNmgml^d7S8l$u~76P5q2K?#g$14RH~1}{hu9F?=Vhc z{rkV;b)*y~>7-s6gK8iqX+0_e_++$QGCOkHCj>oQ#uOyvKj8X*G_#8jwiB`{I0bxrI^d$LK!$a?q3~y z8q3^Q`-v8hgP@J}RnaLABm#h-JCa;;{0mQJH5MK3?@Jjun*L7>wv(U;6f7c+4=VFW z-|y<{yhSq?NNUT!W1Zq@Ldvv%S=TQ5=}q72uEghPuQ=HR#$qP9Cg4EOfj+_|*^fp( zq}7>=wc#866Ns5t<}#OZJIapvqnHfq9kyPB}4)e1A9pf0t6`@9^dbzQFuSW;hlco zN&gB+>^xQ&PXT$>{zVF>3IfE`4=5)BQ85X>G7;e?J#PXCki&p6kXQ=Hvj&MlC*%BO z1Q(O98w+}0Q_AMtuo%lm1=3JPiq#F16j2HL>L39};WxU^O#DQeIQGOvL>xP|>rN{0 z^Kh$3Eb77}rA%S=GJ=cA&{Ck@l`^zchKY7+Q4&K!)L9V?hNdmpTti>=b67bBKZFc;iZydY=Siplb zN$*3zaWQ;uQOeL#CFzV(fKw_SxCUUMn;`=7(GUW{PE6nDT@Zjeqj~hqO{sXefPDCT zL68+Ll4aBPDML|_i~OMM;1t;$z9_VNtfi8&IS7*!oX|9(YCdgRjDjkn)A#9v0K7~f z0P8_QBc=NkV3kk$zrUmmHJ(~DCbP`w7oSn%Q^!Xk5}@Y@s6K_`>C%Oq6^N@tmCFlLA+E z(X~_mLW@SdR}|eb{VU7?bl`Z#IDnHK-jrJ9hKnlI&I!PYCpmyArcvU&uA%%6l>$!j zFBe`$2`Q=slHy-P*RI6@1m;Bw2XN*M?dU+{CywVt4#>$!B#K+@-s2q4uybxv!H_$s zJh_;pcw0=8IssNUIT~*gR@aQido+_YrH%v|!RpRnD=K9`!zB4m$VAZq9%qvJAZH}V z|N9_kCa9(hawf~P5&0>QGoPr)TzV9lC-e-bi_8g|!{4vSd|qLhY*0Ay{|pB9mdixMo}?h{FC@ zb+`3fuu4o#ta!A4rdNzg7UQ@^lbvEm+C9-Z)f>aK!;R+!Fh+=kL6n$MZ4XJXlA(g_;D-!eu zlO7q@znv1K!cFu@fewOVJ4f*h@}ET&_zBN&ncffGn54M68VbCO+h+TL$7X99dNMgB zM4=G_&yt9`6lg@1Cqm%NcN|2TB94TZNSb3igG^tVa&Cl4D%JAcM77+7Nvg35*zAZ2 zQsG9C5?W+PtT9Gv=7~dK6*=R=Bn2xx(WwWpP0mzGx(GwEr<@yC;9nh+@;^Rf{zLv<(*K@+(HmaU{~LRj^xxON03>E&RcpWl(yf?+0n4*Q zdxbg*B+!6)ghjjFt88|DMS&tF)jf;Ud!&(MZ~&`uwNq ziYUw^{qi*^l0``-WyTlw-i!v@FsMRnZAfeMKofH zs)FXY5vpoh&LR%-5q70(BuNAI5u|K>X>4vAO1XHd-#ZiOIZxC0(W|l=wrg&h1J$-u9unHkH zjCe3nuukK1tf+Eu&@IIMJF%*wM-7E%I;CamS$N>f2n0xUgr+_R7hOB@FMPrZtYt3O zxEyCvFqw{=FOd{4@v8~QnLP@wzzg_QbQjhws`daHK7uV2s{^=VLP$`tF~dBL#5(iq z@ncfCdis$?Py!+7{qOueO*Cl=r{T7o6t##mNoAv(#1eQgN&imBnahHl@iiah3`<%~ z?LrC2ne!cxGfR=V=e~19y&-J~tXGlw{C6la>$1P&{T(Vq&o!{dWphv!i|Mc-q5`B_ z$MnxBbQXGWALV4OYR)6TB{IeP6GDe)eZQ0wiX!UEAY(nTU{W}t9X$Ozk78|T*~4{p z86=b-chEH7dn!O&bx-N+wET;x06EBbu05uoj~OK(@Q7Y+i0`KB|1>{qSU)XYW~34N zfY9|H4wVEVdVv0on6O=dgSAl-PVg^Bt^LAyo__-^?t~Oh#lJq2lxGV^UHUsz?nvqH zP+{%d=Zh&-Ek&VsS|fMT^n3*2d1%)%Vu=~?)M{T7MO;OJzjtmXvh#v@;HD%l1@&*4 zD>_dGr$-?^-yx|fGaAnX-fpT49nK^bz0lEaa++T}YGPxi6-X#H(-3r8d5Ontg%h)v z(x#&>pM*(T3xUo9dkEV#$Y!F|z6`E*$0FiLlUjDof_N}V6RTdarzWfj2)rCM$L%_y zj1ZKdMsQP!?7X638Q{$hNZ7oY(>D*dPC~M;cKtV1W}c3wBK7defho1Q)Wetbzhg`K zpKeR~zoh@o&n@YH`t|>o=|6qHClCLgK+%%e^*zQGrz7512c8`ku(a#12?7q z1u`0syHFHj! z(W4^ULolHE21vZ?C2dfr^7u86p_Ja=>;ft;tATy1RV#hUOGC? zbcYTFC@oM-|CfQ4OxU*mzLzqsMx5w@j&mW`>n!+LO3hlJfMl7o3KV1L>pcJB<#8b^ zLBoL3(T^tcz@Ow4D3mtU!)HoYbb3G!g@UQ&(=oeq`@?$u)ckJTGW@H$g}w01;$ORK zn({cXlc$%*t*$u}pdI=u)9Wg#d)8koPKz!nBF}hvJdrOpaS`UU&V!tBN~lxWd29MF z`>1jqteI42mJzFH)dHPc6_IFqzkkTbWY zibDgfu?0EPT@W|q%yd@%Jjj{PP-J%5u0LIo`TElrnOnE|A%Ns(Re55iBMb%26JS%7 zj-;@5TfNDBM*Qn;u;PH!i~?)Vb8Hd!S2`M;eJo>Wk`X(JI&4!HxjOiFhx&KSgcyR6 zDYE>lDo=y{JtqcT>R-?`xPMc1_AIN)A^>2AItQ^63Tyj5<6ECG4Y8v-dsrPnbQGZl z6fnRHI-DZzfejkV@~;$54`rvYM&pK4`;|VlxMbS+^hKt0_6$Zd;Lc-$rKzqNLu3s; z%dhW)I&AVGq@6V`+9uMqL?Sc~B+sDTUzul2fj^y{S9r-E!B9_?KSHG~22Exj0Y}*S z_?Jx8Oey=16j+qpk#^4>Oj50hVe=wAYGNa|$F9LJ4>{~S!A;$6Ai{-Ao15d3(z=ZB z5N)d&PJfx(0@nPgh?KZj4>C!c{(f4{i!(`GMtHaYFNasjZ!B+Ojd4(cKb@T?7x9{X zJfy#raS;}Ao#A{5^3HpFEN__}O(~Z6=HsF+Dv`+c(;cY7qaI!?>HoklzAx#2(lajU z|C0XK&$6WdY4&94f2zQvOZu;46u@qygMWvw{OuhFJY@M-dWF3c-{M~kH>EQBSO}CR zvv0dHJ{d<89@5_7WDGB2sF3uvUyI)FZctjgZJZ1(gs<9=)ibLmJP4c-D`R}$NBa@ z&SB@#f}nCkHIuZjzm#tBR?krUmyqm^HN7z=Da8Y+5eP9!FDR2VnFTOrEtH^rYWe7@ zy40D&E_7XeOLFdd_eZ}qMyGkkP#z^;d(3zO!yY1%&rxc|qq621)8MT7GW1H#Iia19 zS+HR-E@KP$V@II8)W+7NM9v^#{PYv&i>R)HS6wNz~r8AOBr#*{~!0xn_v-YS! ziz8qOw5sgiwA^;|PPn`?1Gi3MKlH1~c!!C08e+l@zlMM!WnvLPsY&>>CTMz5!&y%2 z#^#uItdJ^)u=CPDFZJZX+kI=8vVwY`@5?MdpB1al0Tn zx>|NSIiAD40TCVLuDIOdD1sI)uEyiv%MhveUZomRqI(l!F!9)5;yeP z0x{H}=P1BDvxT0-S4?OHl- zXe#dsc4UT?8%LK^##Xle4JT7MqKjGVq(RGNCkp%#~k~<~y+UnWUkd zo0&}c3=KJ=J=}D;p1dWM;PZ6P2^6)Ya9jB#_x+b#3@r%UQxiVJnklj91d5Dy$sm(d zdfdsct_$jnnjH|4M4=kc2#XF&Qh0X ze12TI8Tvu}dbkj&k}I)3_3$PA@4M!?(tj+)Uef=Cx)lI35*6x~QYH?vCf{9CTllrYCk8jc7YMQ0$czS_$O!}ms`1R!|_;{9cf zija`CwV?^7YnKtjOPB}rPaAkV@Mh{nZ>Y&NutYNa8tm(F5iIqS(LAyFQNxj^Oj2Y) z9EOjGUegX5e>3oO$M9&N;+DL+$thbM6Snh_Eb2s|5MLDD%$g4XL|>;)JD)OROzJ$p z^xpsJKk2E)mT5CPiiN zy@fqtcs9_8=|JJu&a9eUsji_+bPJoK)>-w) zK~u5zZ+d;BuL&j;FwDOO;~W_YddGCnaN~WlKdUtJ-tuOZ_BFwzO_`Gx;q3TOz=zew zHd}OPRBVZGNs8MHC2oWqxFI0uk(WAQr||e>n(3&(+x{}dN5k#Q@rrk`bG2^z$bn{h zS8_eyWhUv1f@8?6#D3kOVkTV&2O{q)t_eRbq3bgQJ010c7l zeO7`sv5vXGYzT&N$%SEbRDf*KA0oDo&Uiv46v7s<^F}*pn;x1$sbgxh`VJkA0Lh!2 z$Tb-kkzEC>aPpnF_}5kC$pK~~{yk;+w}S|(k@hD4VyjBITl#4}yo`HBvv_Kwi9`%4 zSeHi;Dx|P>sX+pvU_$4679d0!=+MnO`PU&^>0T3t*%T)Ks>)N-!&>d$vj7i;69`0v z8bI{}@-Kt|^H|lPi)72k^@op3^p&HR*l3#o5Ok^ul(7EoDXS(heOHYjKfoN6Mq$od zS1a%I*R6i;dWb_`Srr+dxA746rL%sGvliX*ktnY{jQ z;lU)WfoGr&OcwAg>Bjab1KL(&)R|ve0WhgGDmU4F^E$#KFHrB8@Yh@`QM8|+)7GT! zloL&Ln4~slxHokrm-K&0|2wO?r2jLl>d-|#ar*C)tEzuJ!)9e~ zfv&Omw=*>c^RKGE}&5y9L^H`|4+08Q9d4-eWkTOZ3jY!Idu7V*fX^!;4ZJ@yp$Uz9*dFhD* zlhnYb>02(FCdGKjI9g?;Ij32`2~nTW-Oo1XlwbfQ^07D67z8DC_?I$A-2BohlGto; z&gsOT@R_S1pBglnmCoQGpB6v`KuL{^MuPkzu@L5$eYTjx`uBfR8gi91)3l$gXS7$YAvPkad*_)vl90Dhs{uT{b$glR&jf%{fRyCVgW?GncPM z&sk5Lu+I$2eE$aJSduK@&qR>+)tvzTHLmK8DG%UOI0u>E?llh%)1x>s$x41T0}{Y3 zb>B|8*{%x%T>uQ2ZlU-W`+j?_aiHxR{HxM2O}xqtIK;m;6aQi_e6GSk;?p^NHHS-f zd!om$ky=ewThoVu&P5?;8AY5c zAn`73B%Z;>Cecqk%Po^mk$4%8=E5X>UgXT~@)+dI;idq%AZL1y=7F3UnsYkwCxV>m zr!#j&&MZadjx9yziAVD&GLPKq)k)>a?XLJG1dE?mjRjR=Ar&Bz{>bE+)}up^U6;$q zA-e}SykU#jqa#`dT!Z2LHe1@b^7{pCl^Dj@Bu-wg%|#`q2A{k5*GuK8S_%VIp?g=P znpHU{{|}qb4fQXov_q~*R@xbOmg7}KkN`AG+eE(ttdDJtV|m-|(1J;}fBADm>d%F* zl9H3klX5YjwAAe1_I7Hnhn);1D4#wF1#&8(*PRHd{gc3x4ZwAdn$y42;)lVRgV zksgdox9SkKnWS7`&rN4sn4~hoBWHYA&m4f4w@Uy^LA1X5XLxCIWJm`t!ZpVH_ieRn zr6 zC_%qbkIE6ooXhp|{I_MbJ5g=6ENW1C=0(C*wnb&_tJov#=b+Z8X*xi}cG;YtllhA7m%^idkKwBd0-w;QYpnq>xl`?m3^_njt{>_iNxs<`}s#W0p zR$q%Il`eA z-V)k1i@<7QU|Qz^bh%j^s!Kp|g&xGYV|qk}nu?h=c3z<;ln;~it9=n%fG#%|^q_=u z0GwMdYBNb|o&4-#rU#SsS&=hn)p|kB)c5a=oPmb6e|F@|Qe^Hf$Wmk;F_$89{8qtH zfUA5NR)IB=WZH^W@(=5R+-#j zedYO#XVI~$f#y8t5?%&#|_<733Ds-RA>|dR$LSN0rKmjY7!YQ^b z*JE>mI<|7_e0owrOK^{C30`YnN%r5eXTOFN^2NmTr@1P@zfh*o>RQ^@0q$Bhm-1;V z+XpW5=N5!gsSIT}@?3CJG9eC>6J*$fM-1RuE--Z*1YJ+T^U5@%+=WT1H8Dt#P-|j7 z36~TtffBtGE%TclMXh{tC=uscHDnrVFgXAr#YHi@d8j=)8BNuzEM3c*NlK_o;~*ZK zN!kKl+E>yAc-i>na0X|rAUk}MW?E~Eh0?d-dbsg`YgY1Bfgdz{#)?SJny4}L0f(po zyVS#%^uPNop6NfB9xmzs?XxWD|F|vbf6@4NN&j#E_Bqmj7hGK9U*P+#%>|Z*__yxi z!v2MlGW9Rk2xgQ*KAJt^8t|*p&X*}qR2caRm}IT}L;xP|G0Ov2%&sj2S2SuNYxs5d zBEZ1q)j>uitFDD*ZDmVDnWSOz&O;Tt9?eKnPX45&*v;J{G`hxZqHOQChhpMo@I<0Rgc}2)8Di*I$jF;@Sn%O&DB_+6BNj@ z`d8akm-Sm|j%p;jJLU~l>6rGspv82lr8HMNRN;47y)*WU{PtbqE6Z6!K;?sGc_wX4 zokIi#MJ~F9;$JUm9gm&@`S)z|FUPCZS%dm_hru(%znIJ*kdzIq%rV^3%3)lxv4<{N z-{0($taUUSgycu+eyw#Vy&^Q);nA-c$-(Out&N>mcrr=Rx7}s_FI%01Bgh#VbZ+bh z5|gz0V6_o%nqiHDvYrw-b6t=#3v#Ca>ra84S&Gb^CG{*aKbT26Ly_5e(CY22!W=_} z!F$|K-7|$&Y?nO&_U0Z43d_7~>$~I!LIcqbRDuRYnb@=i4015(J)XOAfc|R69^54OY!!OG=k+iPXNMX(W;jN)Z(wc z7ZAGH(!YHSET?-Z7?1|C^Q3zlp!N2yv`i2B3x-byJb9tm7Q0x8n6$O6sHN7E)ColkFsO9UzB-N=mV6)?d0x!v2TFEv4+W0I@nrR$dh0v6mrSKTu*H++1Od&c@NXDbh z%pWgFC4^0^mJ`f3hkE#u{tvijN&kmebxHr*ck=(*`_^5zkz?yWwxn%0vmu-sdBD?Fd)~YT2zq2j&TOhz31D@g?AmqIw0_WZqlB2Fl5tTb(XUXk3& zMOKR|JP<4=L}-;cWxiV$+8dD~09Xd3Jn_O`u6bd7n52?2+czQw_(9`u*j&qi*5Zt^ zx9k;BVUj}X?lS%Zt%o>BC>LHL8z*Q;1f!HcBF$p!jET`wps^6K9vmmcLNQe1F^un#O2 zD+4lZic4qaGN31u6yX>O3?3pYv609Cq!w7T1uN^S@)y?}++im%)-#=SkJqnRe>lkc!b8?B4n;;$Ii2XUYHyqEgs{-`Y}nf zr+|%?;tCQKby;|O2QJc_dK{3L{<-js&h0T_Nx*%Wq(3Ke#(s9+A!kg~_zgKTeUYC6 zIkOd+hYPY5nJ4_aTx15bgPqiEuw1G6B!ftW5?5_jUR6EMZlOd_+AHdX%wP>QPh?>~ zp8ud106PuO4lTJuS${a8t17N3v5U~2iFAIsum-M4h<3`5b0IB42{2&)I=F_m+})XF zuYeCHc-g)tEJQ%Z;*$%f63v3G`SSOjhif?6`KVc~$!acE*t5tc#h?=nS(8HuS1Q8R z+JT@x{(Y}_f5!GA*^a=AkZYRw9N?o-wFLEVS%Cr?Z=dPx#>TG`x2|$<%~1+;_A8XU zKSOnXo&$ol`2Xbn8F}Fmf%ooNN{&b!J{f3N)RqU5(jHFo<(koboxnSgIwAAKyNi_9 z4<#H~Nq7bX0AWch@Qerw`~i50Df!SF@+|G0*7TGCzZY)LVOJ2p0Pomm&S;=jZCNem zD-^;cy&{AK&CbA>s`+Ft=n=!G|JfchGeQ{N4C&hki6p!&=POKhemVb6K(dP{B-=M4 zT2<(XxkxR`TEJ<-Iey0w+=Wv;yaK!GOj0130&FXj-~n;&g+2Sp3TfkdcsLz^^q=bC zVO6*Ef4G%x>3@4CTlzm-kS+b6`)aoIU!P@5|A)rnhnA`Lt%Y3G$-n%j;qN@OF>03w zV;p?r0}JwRS%a~6*9Zn8=P)c@mK2MeB_9ELaOIU-p9laWwAaJc!en8)Yv|PbPy!%< z_nUdHasM_bLc{#h_RfIoG_TnQtnI~AqtK#7CTLJRgW#sZ+ismF-dccOH~IS!%rsg4 zv<5R)gn3&|0_o>~6AD{&Eq;5*_vg z(u7gH0?N)VRENZhW~bVrgK*^fzcpqixp)>XHZMr1h|(*H_(jG{9Fb8GH}#9lR)z%L z5^|gKI}THK52a=$w+sA5cwUna}`N0}cqqD?+mNG@0ePFE5B|n(xlRHL{geP*lbjL8`>f z>3_bFYk-O5B#F~p1gUp9`WFqD+YJrLF(oj&n7aUlIv44@cLKjaJ(I*n0x=fJF#`@f zq|C5u%BxR96P&UkoJaeBB-U{S753=+y@I-hy`Cl*Hn%+*$hlw`urDhg|6)SlolY+h zCp1J5ih6t^^?vC)Pa)gF{bdZ{yW>pwY zEbJjJOj1beW3R%e4u0_{?;HTXFq4#?1>uqLDFcyne=6k6x!#a7t!>DefiaWxBUUuq zip+OQ>QQ7C<>bFok-0gP&C2SH?T>VyC3LJe+tddlR+9j)(E|LNw|(FuTz5sQH=BuIZyR+Yvz+AmVxK5$VTa!nOna{^t%>Uq$rHUT*?7NHOP<2yG^>@Ug3_v#}Z z&9Hwf)-|%bhOp@9SHs#_C#cuJq;&`XVvt3pqJT~0`U4^SG1q8z0J)}lLoUs>2Gu;j z)(-84vIhJ6Aza~*82I$Wzu2lussg%3D!>(_tp5HV{(d3<3MAF;TtZ%j(kqgRhKcZ} z3U*D45kkH`L6M;Yu!zHjlo~#K{vAy4KYebFi3{=p!S?#^T4kL(>3~Z zlw1QDHo^M0NM^k!X*EPQuLzOV<-@5)Kbf$kHF(f4rX5L&3HCrS05FquuT4*Lf*)>! z2r0<3h>kZHHcJkOo-!X`(P!-AH^^BRh6FU`2zW+ zi<#}K8lv}*&R|l&-0T2Oy4{%tTCwT9Bx{VE4m+kR9>Md4{DL)Z=tV`x0PT2Tk$QMZ z>0xOn=!L3UTMW1RMN%r*FQKsSFpL09|AhhuTwzQ9M<(e%SQ6jT|DkKP^nc2~Tl#)@kqp&OM{CB1LF58lj!2t%)Ty z%q2m299)q=@{us30b-Jdw>^Y3*8|We(uyd2(3IGIc=BmCvpPDGN;In~H4O+8OR2=k zj;{YCMSu(PwzFTH0ssglc=(06s19@I5s=Rzq^r$(UOt&CZ$b71FWp}~iU0u=(YziI zZ<+_+W0g049OR@s1nOl)(-n=7Cpjw_d1d}yS|Li%FBE}5RP-hdIYTX#qGghnb}-Uj z8X{0|$m)DhG$nqiv5-tqUJ&T|y#k}Df*?Sl$P5(!-UhE!(oqaO{)xGw|l zLVF&(b%NrD12$N#Xa{g$BUYR5&Y_iAdPHSsdef|ARsYs;cKO>oCW(mV6$ofAM1em%4ywTKpwR?LMeXUs|48hKkJi5DPL%gxNG;aglbdl8NBT&x zH2V{snI>$!0;hOkBRbgw?>$8z$cNtx{_UEIx*#6nNF@{w6`g>#@ii0CJo1bEqa(4Y z13=#Vbd>M|fy2qoFdiPs5G4(P>ftoP!(I>PiDtBqRr`}Qt_x%Duu>;SAlTp@HXj9k zSXpsP|Hrna|J^-o>Hj+Z<&11g|A))+0{-37|LG^f(|_2%dx7{?xPQ%2gscWZeBZF- zE?np9_Z_kPpjCYV|LW{K61RLe?nrOU;K1^CZYAT9^X>~b`mw1Z1g-A;3T2Y+&j>=8;7rzD zl@z*F#@~JqCup!j(MCZYNV9zzfP%;{k*+%oXu#4tAE3FP{^$QJuAvF7A4R{#*kYE? z7HcrIdS!_An!2WfzrH_rtRw@JnsNW`IvgqH-{u~G0)F?7!9}y(J4v5mI-imrf>8wK z-~G8A5@#;s|0%>P;P|G-y*ZC5 zhII=Oa!ujuU#lvGZfHEJ$@n-FIbXm6z6fjrv?(@8y*(l{LewY06wo>5mG$yNGEqZO~AC9Nhi9z zO5xPBo8g+q9XAKAL=~<~Qd=s)Cdg+~I?(p!BnvRr#8iL<>o0gFS(e7?6<+f-B|~oem+C*|F)%hA~M!05&X3ZUA1k8wkaRM&P9jnD)RpC6A-u z<+M^RIk*Yj%y{^4vNZqv^EV0p^Qq`6FJK?bQb+_+frkQ{XFVLdA4K(TOaJHWWzzo} zl>SS4xTXK2mD$q&p>65E*p~j!nYN@Y{#7A}0E)x>du{v+DIb3Q<^>flI$WFsX6ae} z6&T5hG8$gq{K$F#nR35pV+xZy4&`%rWFk^tV|O#^SjD?VVj7qa#67& z6|?icpv1bO%|~433V{F{8aZLu&Gvu)#$O5o;1pO62o7X!4p0$o&6P8r~Y2vO zNVv-(4VKOzl4Y$7omsMsSVBQ1{)sYlcP6J*jUYX^iU?{Zkh-RkNqS)Y_Ok-o^DCml z&U*oQfo?(I)2d~XLNmNhT+Fojltek+Z`xxrHA4kD?l2Pp(J1KMk4nk|^;H*1c{w+Y zPf_u|J&>G~4G4z@xfU~ZuDwSQRcV?W_MlXDY zL})JTyzYJ|s6dGr@2J|(;q=|Ce=d_%!?ft{=FMbR)@GloDSaCz))gJX%7sY^I`?Kv z2Yiq-<;@8>gCdCZQvY;7&YV!`v%&*8(;P8RM$Qnj>nB6bP?7m+qZA3D2`w_CtxOko zp8ADPD`+zEs}z}KANv7{%=&ZH+pl>*6otW1xYbSq%0#o!U>9hDd?7_nJ5zq*(N2&` zjNBDWi*6AMx#A3A%Ox00bBxMoe$JlK`|0x)|CC%{@OKw1QN_8Ug3Z>z>O)n235wu(X9OJ^$qo zQqByeW3vK30mxB;fa?Fa;J00wq#<*$KbIL}bD-ig7Y6rq;^fxEI(FV?d(i8`&bxaq zPHFKOI@m=>UF~MrQArR<7?+HH2o%oTi_n~CM3@ml(oUKulN1R!tr(j=W!ntAr0@L( zkGeo>jQ6)x<2Z0LZmN5(&y}qnPAxf6s@KCe`!*QufE=Sd>NSMPX`M2NB2K;;5VMCEz{CoFY=bAo4sJHIw z-|Sqk4DRG=|SVYr44oPnyJ$Jrhvk zb`y`ayNCxn@9w!y6-e@J;h@-a8JVPv4CJ?6Nkf@EP3fp&l|w*-ZsxgQCaH{lhlYyo z-~VIl6d%gpTQr?Yb!ER}QV9W0nGQH%nrAfeT)ekq-~`s;M}%eQxvmC;hNO7Zd>2Tn zA%u{D$cQAhU4w4YoIpM`GRv<3W>*P~g?yosW%-qAVdvSw=PvBLzPU^#Ce4Hjd*7Pp zx)>6@e$*ksVgC0bv%k^G;SH>a_D!b}8)uU0b1{h|9O$C*VfcSQE59daxtL=C(3DqJ2@2^P$!As@l05t$8G9)&yL-v6trahy9CZ za~5>yoVn{@Y!azhx$hTMRU5l=OVy%2+x2pzzMKj+W_0zK48~SHQ;D)4caa@w})n* zi~H9u9X*tjVwu!NDPGOske*mj9_vuJs320#VRBaQxx%@514+I*ej4j(TA8H%x7{{0 z_P|B6vO@G9+=&1j6d?i^y;K4~G_gLO0XahoFdK4a`XbLq&QLMaj-0uI9QG#O{wa|& z_9AnSvJDiOIg_$)#V+i;`{%MxPwPEb{p=z$UF63pGTT&uxV+hRoeq@MW-0lE`#i$3 zAwn&`ArfT6Ysx9_q5=fgOoEcnArs#_kPWdY`Lr6dP;>C#A*eXH?b}69=><}pYocqo z{;B@WTOR>zYwW6_V5Wah#+?J6fM>ZcVJ&yTTT#Uzx5? zUQJBDGLIbtVCN0};(-U#lonK1%Vv@eVul`XDC2i+U)k{H3BU&Odiv(WB;{}j3~cfz ziz)J4HV_3~<~3paHAef*(@O>EWDfoEofY^IJebzQp;yjO5ARxX+;tKO&?-xT--V1L zl?Oi{O5s=!e}_7ZTlzmRzw|#lJsd8wJw3c`>HnN<>3^}M|KoqPrT!n((~^Qx(8GQXujX{e=^v+v|^l>1=zl_@iO8__<`ZV#c~RtFv)ibJG1`Pkgsj1 z7)##)gGsySdX26LGfCTU2w-z4TRCTo7AnfM6$a#OEenI~!XnX~-1U2*SoaM;>1(CB zhUQn6Jai_rr9#N7PhaF{(>6`c?}iyhwbPsnw{yQ}r*Gp-QcTNH7`~aW9M2JGE3vyE z`IRly$!{h+)!hQ-k60^fkA!(NwKfnB5#rL@*Kd?Q=OR(>rn>8Xm|2;Dr@AYB8+thh zCV>s+?oetz;o>K?VLAzoiK!X~6@LD;+3tL|ueum_0pQOWoqeO?HkT~_3VvI0&Z6Ov z>zdL?l(=`z6$F7#T$6Rr0C#t14e;W1+jWkA2Ll8#|AM*L4fpTp#=becGbUZTzKQxl zrhkPyrYheG&&Znxs*}yJ1`SDt>|Dm9w>QT14G_@;f6k;Ykv(Nq^-g6$q^F-7p}|~K z7k1vjl;ryaCTZV>J^jQ5kvvHLtF5Qs=YZSHMUrb^GQSeM2!F_66X9e+&h);rXCi0l zyL&a{jB2p|(8w8R8A+1MZH_S8iy&v9A~Ss;Sdkfesa~|m9GIkAkvXHt+`U4{Kf%*~ zcD=eBsoq_)YL&JM$?zhAe)ohr6y0fvjW;^8QY(^T{7Gns>n=IF*9^K_Rh_nw(LZ(3 zn029+Pq^mn&_j_A9GzmB=imL`zlDbBsb2we@UP|0B~J6)x(iMa&S?vBcVboFZ+Il>IhHs5BES5> z$eeys(4Uo-Vx3+tz{hF!Ph2Z`soAuxJ+zE7ML6y75XQ4dT^sR7Xl3q~V15sDY zy7SB6&ZWJc{46d4EH3Q4u?Z3t;~(MQa*t`7ysGERAdjFJDWedr(^R3*#XJl#Zla8e zGD*>IxzqVc?iWb@-doaK;H9mSKlF~u)n%k<=;pYy_06!3Baqn%Ty)$L<0713OyifH9HLP(#^i%FWzSe)@o>eG$;IJ!g`s9K#P z05TmsM+mjHr)nN5Rv-{r>;akco4l2gM(Ev{+wF(R=ajTE9R|bY$@wO&Y8dNz0oliI zwBchSA=&;FM*n>v$K9*+)0|?eOOW+L2E%y_{u`U>x4eRX>n#8FL_&H?9U3$__{K0~C^SN6h z@$UuN7T&+-#u75wt+%Q=r6Re!BQOAnk0T02*m$_Hg+4D_i<7afCunSIe*#^SE2V&c z7hC4)c51gBT0@+jH@zUoE2zn!95+x4g*k4ie?M6vr@_-195?BCVbSSZ=69NCqCoy| zCh5>G$FRr`N6t71ux!YgfsHw^`N)|+oscuxA}7mF_Zr9>{%xVA#LN z{QYMuGUt5z>|6veY%4O4IgCk*GgyHf4x=c3V^z3bLCh2CP*_!B1{OeW)b57{3gm&@ zra^RB97f_uUO|mn7Gedf-;<^wC`bj!1q7ArUj<3t-F9Z+kqwd@n~Q(v%tr<2;r=C6 zv>}Kt7v#2kufg$5Jw$<S~$+ z-TiTgKu9}|ag`4jcHX2Z5*3=m)x%BMjhLjVGKth->C_#&|DBs4X^7w4GXC^M^5?l^ zT=@lNwn}9wZR*?%r#KIIIcDeO8`l^wNR4s!_D-mnu%RA4HWi#ttE&VUKmFo;n#mo* zLfwk`eN(*L+kau{Q)x~2cA{@v35pEmt3GW|Qvk<9#l zT{zCU9N3&IJE(=Ie?iw|H0b9zl35(aL-{+7;?_|S{;tXDCoZfi$bHB`AT&Gt_+uA* zX)*%AZ8jXn&YLtL`Hr%Kyo-2f9cN_+1Wq0f4$%5!>Or%ojp*sK;U>+MNebPGV2u)s z%&g)vnoue1iL@+0N6k7=X%Kea?Crs0xIZaM7D>1iNtV&%kvn#t!EkootY5;np8?GsTc}hY zNrU~}o&{$$IKnRyXln4H?#he`0M*9f$s;+n@hszs9v)26I-RjN!~(0CB=agm^n%RhiOzO*vAfV3IR@cFHx^^phgjbZjwH z_NOQmok5)LUtx1k#YMUPbxMo;{Zh0E0yaF0#RNS3+ngf_fBE(MT)L#NuH^-Po$X@I zL_XqJW8z@{OiyNKFOuwEot!m6;m`9gOz?5>@0@j!B!GE%uzyuFY}mjp<|Bj&*LZFh ztGH%T`#skrZa-rgTyod))0fKx;*l3TS^xHMngAMQnY27Gc3#A|bb#cB9d61&|91Hq zSq6Es>m;y;gzaTdamxWynbYR=Dt_@{lG1*N5g&d_B|Zf73xR=u{nzj!vh6QFi%)5k zYmDn`W%&yH6PCp!owO`1>p77<6-P=4%sfk@tN6uO#uzOo4cK7B|@5s?JTGHtn zW1e3;YK*hb_=Q>wn3yopx2wc@_>3vjEg^a5>e<+Xk)vl|+T?{|QNtvcbTcUMPc2l9 z_b#{ef4Cr9`j6c6mi`Y`bxZ$W)xTT%pKdf_OQlt9ll7m$VIf|ylJi3BIk>&8gPlyZ@fu3q32 zy8_vHF~5wotSuMe*BI5ZPGXWqB+codNlI5mIToaEQ`);y4B*5htx%mA=@cjN;zenH zR3g@Gf4LOq1Jw}V#45#1!R(!(G2B_2!*eDaganX}_Q!{R*@n|86;Xo3U&j^Ej2mtz z{&-7L7bdy*iG>Q>{2G-_NR}*{J4ezb%ZQzao{28(y!j=Sx!#ae=9d}|>C>5{lCX^Y z(mQ$*R`r}W!EkK7*T8=(dpwhLcD0lFw!&?k`Z;ctq@Zdg;Bg4aR$)36IW_ax9l8kA zaOWBhaJ$u~g;H+)$x?~oJ~%EJv>UhB}e3wptDCWS}{y0Fv})@o13;$&zo{!QrV zNBq0SJzG}QL+8`Uzo~G^ay zS8);8QB8@2;Hu5^$A~7XVx{1eh@E#$Y30N&0<-gC3*shb4$T-eF zOW4hD`I^Fm&J!_DCh4Pe4}|NDB4=Rbx>b=g+;RoK=yS#-h#AX8&P;G;@{uzY!UuFw zuA8%0LC$0snJ3PX-Ivfbe{7L?t)t(y$PDs2Q<ll-ns&t`@(D@M(uu_+@g-P25YVU=mUTWUj7@%Kli7g26c_b=`9(*zI+FV9tc1E<#@6~;g78dlB4#=HUICje^G)D(KOJpzY9-#{+3v0h?tXqlVnCBb%0Jcb@8{{ z=EAH+tSh<_5GXkR4OHey?pnqYJ*gxwh3=H-UDGuor!OKckG1?FDA2NkZjy0RV5Trr z#~A(DtPn(E9fPXP8RI@DO+@on5Ji`p^k9;{y?-Ao`{ny33Gt}ti0R*wEMTc7HpkA( z@QX~Rg39tKH;L@Gn$kkDy2>C}*cmjPoc0SzR#uB#A=-tY8Bg8mzry$}xyc;mtJ#}m z@HP;lPhLQ=&2-*`da`bd%Ra($n%yBI;^s_3-$-U=lG{?yBpaiFCt* zXkn-(tsqn@H(Az?tcTB;I=5a<|4*~ie|p-RTl%ldwWa@SxMoZLO}3@~6Th{k|5>XF zr~gIrV7|DhDem8lr%tA67_Z;q;(%54^zXv{Ae^`v*N9-n(oV%BUyre{YZ2>;&;{d!wP2+R`-mH1B^WrA^EyBQ3kk9Um{pE?^OZyfd z<&cOk-P5!hq&QP}M0X1}$sivLx6j;s8y9ZUg-OahwIhV6PZ`V?GP~1k0Y^%mOCN$3a3C6K zI@BCk)t4CD7DxAWuK8QVWwFV)D-ng*!tx!6QLFi-=(1_(BKYuk^>4ixLPQF58UE$C z8hB*#@8#q9hWK~kNqq*lJZO~!PHJyvT*RZ!JSQ_X{4;(B%8BqSkpbj_C(%0L zT3eY9laz_fppvlg;ujJ?MYa7EkTa=r!O@$%5V*pA8;?ZJyuEM8nPk5t7Ma7hIjhl{ zTx4cc8(w6d7>eO#N+EQREBs-K%v?%xDKaN0EKOQUU=Y=+RA|fK@n!i<|B(s`d!hOD1xC+pr{FbN^6T3))e;1X$ za{P<6c$jv9D8Vk7@-n8I2&wn!=-+7eN0~_MK-`7xy}6Uviuq^>o|&h=qH8qYSw?`w z?sHy8F5Oc6yQuV)<6rDx_3-bKF)#xvjJNr$11>u1Uq&=FVb5G>l%f+DdT?hf7Hv1Q zb!Ma7|4Ndq=$u95%F`{SYZ-AjRAOh~{o);dEE|D`P^{{AMiKdD6cABV@x!U8spNEdPuJ) z*2Ci__3(J|9&J>$3jC40tesed366!>9&EbB&7~ghGyG*s{|C>qrT-?|(*NP#B&Gk= zmj1W4rT;70i=_W4{w01^Oz1n=zt@O=Q;c$==D=D}`LJj~AV+L&-5IAv|96oV9T_Dc z&%$!AQJ7FhB<32JIMb7qoSkU7I14xhXR<5tcA*11Z`m)W>*Be& zysBwT(ugUOG={uA@YsTRVd`+uoEOgby$h+Cwg^z_A#N^+M`DuVT4A%|Y?5&KUcM>h7{2Tu;Q_8=I6z_%SP53ZTqj}cNSA)=eNG^UE zLZqeQQ2|I{l1kMy(wAATi2j4)Iz)Fx zE2678g@5HyOwxthpsYMT{ADLKvDrV+!5lH?;_%?2J?WMRFNnEJUDqQ9QwZUirwf0> zlRjowHR+u4AT;rjx*mPI=+8!hXtMHK>wzgi+|%Ll!p?c zJRG#BvbKLUyr2D>fZRAQ85aMH*48s<$5NyfuOl~ zAuU2_vneaaqirGu-joJ?gq@dYF6_MJ1rfhEFiDXvF?C95&?k!UEIltQ^{}`g z4`h-iJnZyTBR0|J+>kTr7fGI=9kJltP-KpF@S`7Q3UWp%-Wzfz)iR3AGpYB_RAg>K zAiT)Dh%rvFzf_SqeADrWDOc7`ck@ zCSIo~n!2j5Q8ZJC{%p1@oR{bekmO%X2d2YatPJ1McL4OSL(y!}zbQpCCJMdH9Q0Zg z#fxTWQ8dL|I+BMILEo{WS-fkh=SXZAP^cnCyOs}wXW&MJwJH*_CS4>tPA<_F#>uG$ zO9Y;=2#Z||ty7FNSn5R$7SNIv_@lS_D<1*Soh*_XQfRY66Q22-ZU8I(uxpk(bV081 zV|UToly+5hHHsk@XtRsrNH}ell%mn-F2$Ufq^J<(;s}qF;=g=!r`aPri1}5{*9XpCMs!F&%ebnQ7NWV zV{lAVERp1<)dG&_onzw&FcQYz5LIN=Q3CQTZ9g$ORb;_69z~DEadLW&%rD52(r*_A z%)lm7%!Qqow5n0UTGFjXm3~t%vV3ikV z-v{JVqPy;*WSMRt(TglemQlq68ffmq&Py?#B?RhSIKZJL0i1BbsI^SwB1DFGbUA zQSi1m8yCNx zlkV2jzjG^}qG_fBbY@P0*U_v?G14@{X1F_Pnk{P9#ryk(n|~Lq_3wJ)x8zwwv#y3U z%_=a)Tl8;=rWs{t^Vl0V&AOOgnVV}^)9fAM&bVlrk)}ix^s*#uvN%po!hqB2!X~&a zN6>g>iB&!X^|sU%>r8X+a*sBwe%zA!m5h><@#Sc|L8n!%nP@ zoPomozZ!BTxyT&9jm0AK)v2QXqZFC1k18_9F7m)4GX%TsmVM^)r^97gb5&5aQ#E9z zx>x&md+12gA2m1>BlWieOVt$AB8c`wdCOhgf~2rE`7%pa7g9}BDZ&bAbEmqd z9XJle_AY~9$iK7r?YGdE38m)vMUwoBoQC4x3*z5IQ_6#j3XqF`ryp4$;!ES1;#wlo zngNfh@(O~YlkHDj1xRLNVU6{;e+j0ttVf#UUr^DSPQA6Ix8%3ZXyokY-&qN6ZfGvD zGpMju&&9NRnimhQ>I1X{d#<6Hr-xcNf;EbFEfXiC>%KSjX9?`Q<(u>vCztFO;zoH) zNXPVVV@y&Nf?kT8qgfuu7|6&2-EtohIqR4Yhv{bE=)(w{pdES=FaEcH#>p~~P(0Au z&gzP_;+M}d9uX4Hl#~`!SDWoLb&}>$*T*T|Z|~o6VMf_r)<0rgnWWf9$5_OvI#P-< zXR!plOsO$0-y~dPOf=Ozfn+2X>)|Oz$@_FYJdxeg0a~W=vXp_gi>49C>Ya|lu^xV! zt%s-Bmi`ZHOaHU)b4&k+|L>OmKi9uo`af{ZOQipC|0W)1F8*C|&Evir#(03ZxV8PO zNP~s>jB$komq~DXU_By2bCC>H`7HYl$KeEW)+~hqG(u(eG{GCzF6_KSdzDZ>$|Ox> zB2%$(7GF)_cMVCJ2aa&qEq7nmW!4v7Oj61?z@pjVbepRrC(bNZg4HxjD+M^Qe3Js4 zSQorarf_rwZB7I$5NXUHpSfbAWW?qF#xD|~cuNR@LE=UC_(7*X(Lj(9oC$LA3Agc$ zf{@AocL8GBU1VOejA80=cHXjIJlJ`u3*y$TfaEL$L^{_}Imd)qx^-pQ z2)gg?PU7d(`MRiQ6}QkXX(FZQED0~`0v@0R5E4KNhoC_)QRTzLY%8ANC;B&T>fhA^ z=AxxM07WzMFWTaf1b@cAiE1`7KxZc9QCc)knOS#WefL`|M+3wF0vN`m9;k&k`~Ak- zH=PF;{QC{>X}b6~^|v^`1KSoW`!^AttJs@qSc}UfxLt7l6=bU=8rN08DQq&`4B({1 z)t>dNS-MF1dt~wPFu;YKm+Ti8Jjo5Lh;~8gB@mB&lSy-gfv*RaEg6; zq@a5kwUZWg0`FYF$H6G3U6hhYF)4^)T9N7YI^ulCqX2*hh0QM_OdT1GK?g^b(x+(B=Sc+b>*(@jEQkw}6h@m9@N)VbS=6HM zUu5zeaRJP@)EG1TB2SGsJF2&LK)rMR9NC?SShob*F1mAMW;2{RdNQ8z{f3VtOgGnh zICLk{N7&MTHNW(KVbpKJMYi<+&ir1d7fJu8g`i(2U&~mKE&Wfnzij#+@o(t4hwxx| zlb7%e^Y5JLm=DOm=|Yk?uip=mw4*Atvc`3?E?t4NP#_ zt5!GI|>*x3(fPkD;PakPi-MCMIc(6wQkHb0l)~3_Uo1j?5iB>Eq3_-%_Q`f^eb-Yf3 zgq1shwV%RAU4fbj8LR5{I?-g475p2H-BSq6lDf<>|B?~~G60TTv#25CW$D{RY*p9X zE>xOzcHUXvNI`dkHz9P_V}vRQQr@2hOEe<4%wwWzj zYHj6S)44}Fx|c_rb;Ot+4%4u;JkSgMe)S!v7n?_rQ3%~1B<6Y+Uafp<}E-+lRm z?-0p=vaI)QK6z}YrbR>lW+}H%`}bv(`EyN}F8~l_RsU+7ob*x8X%6Gc?Qv!AmFz|4 zhIIbDKUP#UHEC6q7c=(nm9!$ExXweFKhF~9!o{@2A^XANjotOEG9&#?pMTt3^W0FQxhQ>Bol<1JCz~H1N z^_GItzwpy=t8$?X+_>v2=FcoVl>`GJlc9ksy$;@&Tbc znd}0~grL+;%5->4ulls)TE^{>ge;;Io&Sp~GD*{Ia$ayAF?VAKQ_8MhuyI?@ztUn(UXUHX z-uLls;;7WU1#lfr(j_WpMvIx5nVHFAhAU>4#b_~07Be$j%oc;i%uE(rEba9-GynXv zGrR9?#74Y$SBl%Wv%0#ovb(CgPiCDAr&!{qmateEk4DTUY{AT)=4g*eH`cXZ0Ueqe zZ@?OXp30Ufx)rx|Ue>^>1QOT+S@KA4+t3&UNn82T~E3U!OSmtx!#P& z+RzK}X9Lme*Me8Po_eHD7?}CUpy_%26KLuz8O9%%-}?CyS|7A|3dk?UPSjG*|k;r zaR7zRENj3*~GKwTsMi1w$+ zQY5IP>PL;C`w+C`+OkArKh8KSDmclg@rtO=cNu7D(863@#DApY%%z(F`i#7K(l|X` zcS!lgVKJQ33vSJ19$-elh###?P9Mp#W5dV-smL^n&F$CnX`6xluqS+JD9OTWkn!ep zB%N-xe)9dtH{q!X>~sq$1f@s72I*~ZNx>P@JB-93#C56(aQ;elqIZH<6&U-dar82| zl=EdlF&i0DONER8D5TYV>s?>k5;L%91w$&a9ZE)wzpzF`#2zY1d()D|E$0}vy=|*Mb9;DM9R|7NGS3XET#NNX%x?Xaw?#hHC972>d{AD?Fgs6frerXi{Sg{dNjBU4IQ3 ze2RLn#Ii678ZH#GdKV>R!Bu(x6PpZT;vv6hI}v!RbOyZrRlP(&FS&phi_EpoFJE+_ zB#c^Fn~jfI3GUu5;IM_@H(Gt5s6SYo$_Mdu{5=adMrpD-$2{~%U;}~9M;$&

`6Y zb%wt`>M+($z0*=jK!!Q~XO$T+FxXh;+UpnEX<^3K`v4i*Irc;@l+|YYU=Vp~QNweZ ztDRRo#@1|`4I|eOnG8cw;EkA|_G<&5Atg^VyazBq?AMsX=P2;usCD5!h~UvY=+7RZ z#e{i$I4;M3wy42zIu3V;vQ}w#Tz6I|n=?{4f%y(n^2#@C9KA7GQIEYTF-^PF{t4vMNP~ARD>vEbd-fi)r0rr)nodHLf8%5@ zct@hYSU8%7n~Cjnm5n66jIn5_PL{839&7*I`8|iiFxk6xPxx51@Ttr!#7WOp&%2E( zGKmRmM~ep@?jtZiJvHC7k?WE2`Od1{3D3$tGQ*BaBB>S6N927BqV zuq=|7l?1jA{XO8-*9GHjUNYh{j)tSvHu9>~^9mwyxF25?ywUw7A-ynz@^If~wSSfQ z*U@?(+J5ukEEYrf6Tf*Xi#`EPuklD7rQSf6$7CIEh1(PzI|yu2M=g+GCH>c(7Di;N zWbf?f9hVT^+g2>7}`7<+j*^{h<#V^zrlu;4pb6LnET9whaf4))Tgy zOgjo4A+0cCH{Q6HfZ?lE3yxoq^vwA26eYp;vpB$wm?76RbB$hhj05Oi5FDOeor9oO zuu#*~A^n6_QmsFIv=Gh?lu#)z5#6&U|<9gIs64S%X@rgmT~cB+OS>zP*;k8zO~ z(_BvzRQPtcY|adWD<+ctXX*xj^bDzE=Hx~B_syM7_4GfCMx-|@6$M-*bRcp%K9DhZ z7>!Lx;9IMKe>7m3*z=Ns#4Yx4TZX*Cmw0ocJ0o(#pWG?&|6WY(vK8z=SIQsjfO)I5 zCyt#yngBo;DW*^AMT#o&Y;4$apPnpfTOi)ImBovC#iPMl%fpAtp(9^feQB5$Mta$> zZDn@4&-$7;%U>1)+U@d~t;kN8sXU&mJmG`6VNSI_k!`jTmbDVk_Ukw4NIFO4gu^9p z_EP!C`kCqby2PQN^*n!0&eKNKO$eDSDNpn^PdCvcN!yTf5}$mta%PZ?8Ynm^}XYom32sh#nil$?!6fV2n%nHZI5ahbbz?{q(Cc<9WLPMPd zU=E5JVxs8o4e+OMMd`ye!YP^qn@qX_k7MOGS-FG3PaxLiW{g(I z+1%pAxNp0CQ;j&ygw}QU!rH(&3r&|}_7h1{T%-CZDfPRN$4^1s4uqI0FSYO@AZCdM zeUX;_SB5>kiGa60{|1(zeDer6$}|NSFr%hRmVyGMYqq3sFUKOmLn9$JlBNPg=Dgep z)|0IhM3*m`@boL+*>?=%)hJ;f(XY}OkCm7D90fpx-$xf5h(?&RiCSjlEe;lf73FqE zVU#M4w)_Gq&PX5L@3%)r0`H5yP_7f6nviUBj`V!X^K(RiiQzP!@J=-lKHzD&#{r^q zbA-;yN~c6xhk{l;DLmVVIKY=G3r=iDn5p6m$jFal%AWv@%a=&rRjq5StgkL1@LZJT z6c#<-5qVrLzvbfaxNO9;dGZ1&L@r-}6e48P%{mF`tH(_;?>Y}D84b1%6h3MS${WK+ znUfNu&@36PrzChmp%51s$dN8JL~+faPUOTpd+PCPWwYZhC49|cQZu3Uoo!#YuShGH z9SE!WZX8mI(Ri4#DToGrJ_q2xdDl#$`vf78K=SY0(#%jR!c$ILqBht}^~_b606>2c z8GFn=d*sb015USu_TwcYO)IPd9bBXvSAX4_IY*ekY1~p3v=lSJ8)ifkEIn+46>|E(K|0nLkfS6;M z8|HX1MA@s~#TnspRVE$WydvrV8UiQd%h7+=B&t^@rymxIpUM;9vPxBv2s?gvOth3!z%jmZ1hLm9?XDq zFY67-Q`ePBMv{zqSeAYP7>clDsUJJ+CSFzrKNs!F@8q*GOp4nkwld31NB39Q+AV5m zFNxi3lxZFUy5&`GC3IxqQWEQ0(`H;d8Z9qKnH90OA@;Gu@`&nTR|VqZCRYbyO@6GV z?lwz%ruYn(EQF9z>efz-r#`0%U?dPgVQWP-5H=sN& zg)CvG0Jt!|;^bZskXD9TI&aOfvaY6;e#F)B3|fb38s~=bvTllw@`3ZgkpCE$ySn_A zA(%U+8if9#5$@lSVr=$)+n)YxFO0475oAKMYj|?si5Kf|u;j1u$~Mak_eCS$F@}69 zoCO4L<7Zk9xVuEKw8L$x-yV%s8;X5bQlyJIzXzoX{Cv;P3RPA}%1gy}%rrQjRqlCt z!LCCHi(i;Ui3-`R7V?rw7EkhpW@GUE8;<3smaFe}!-aM?!I7!MGx+F00=zBY8>e}a z(|!q|$;_E}VR|4oqrh?xu;WRe;29t%Rp`)dVjlfj;;K`>%;iXkdim zr_~JB0`RBG>*f4Aw8Cit7EgQw((wgY;5{dE-J*q7&1Lt=CyLMXAFd3m%a{9meC6@5 zLQAI^WWl`-dh-oiaaheLA3=*TE0B!4$6ImqWJdR_L}Pr=>g>S%ipkY=KzpkwP83_- z4n1xrMj#KJh5Pe>ibtg$v%9ay7i49W`X>}<=(_%hO0`ot0}=&8gOaJXQV;9Pt^PcJ z)LQ%?v4hKXz0r2N7j43h#tgF;>7+%lknUD89(8U7Y30HSsGZmDte~|`VLS~N>=}Sx6iuFAoVJtrs&225aIMsJ^Cq9uf zBw^^nQ6?^P0Vn+!@VkRF4Z*w|^q6}EF0OvzcBbOzg5F7_6YCRsQ;LdF8fWo6+mQw# zJMjl5_!L^JEcwt_0#4oU0^a##fnf`5HNbwk8061`!(y5`*i#HW^1FPNx1qw~M9LJ| zWLVG5<7TQWB}&^t18?^n*HZiUWip?TsjaUEGNB>jJvv>;@P^{ls!G?0djchG63k>o z`1N4p5I`f8i0kVO>e-~F1P1oV?$vn^es&&B(tQ8q3FB_xBruCn6YIdM86$WlHDBLr z&H;A6K7;{7qI&uf>$-kOd@e~LsF7b)EyZ3AXqutF(O_e=8=g@-awOXfMHjKBr(^_i ze)gk8+y3-jl)6FQZIs*N<%Wc`fv^tkVw}g87&}QgHduiANJIo4DO2wvywQ0lh&3`K z{Txz!vW1Kf&84UGn9y|+EI2pJw@_hYKuMbnT8|5&Rf%uW;8+#UP~sy|9QA-^D-^{b z2S_#g69h+dzv}1ZZM>Vya#7rb{Vm)(Cf!P!2l^$9YB=_r*a-i84|(>v*o_diU?+n` zpPtr|EX!B{Sk2l8<#dj@WnP79j~8vS>IJr33=LbT7tQ_t-oX{5n+Mhz`2kT>arC&0 z8ZxV}$vR4d6B3%*3{xf7Nj%J7KTnCO(kYV~sZBW?qP#{BRtPIl(hWoJ9hn57+WdS7CSPRQaZ$jjmdjin0J}5*^ptueLL-iM0 z|AZQNVZ#A~ELk8CB3doCkWlGY!|WHch*=Uk^jqR9j5N6uT#?;TMdkH-`A9^9aaTUP z8th!yw&`5C7ca~K-`UC=MQcc4aDIoK%Z3^ZZx+b57N9OAzq+lN3VoTR)yg@b)d`BX zu_r3*7;I3vhVDYF2D05@F6p6kMb$lhGZsa^TX=D9oJ?^`cvR zz2H}u{z0fE5D(Ho@%6T&(}5f9xvJC2bpcojqvyL`mR~+peCte7j$dnw+RS@k?8ZmF ztpWKqU>}bYO`s>QGsQgJgACmKRD^;If3+ck0CQAPqffr~C4@QT5Hre@MT9Pa5Agex zUwfvQu<;kdmP5Eh&V++AI`0r*o~WHGaq*M}OpVvP8kUkly&h?bz>)YRFb>SZqIqd4 zipiEWe_w(Y5$$01hel3Qx|*5xW_3rs8K-DbV9*I)vmydNr43mxc|+-i34LeEe=+I_ zXeRh3e%S8WO)rTJgk;-HYLnkJQ3`;uz|en!``O|;f!rJLz$v-G>IyO+u(I>qEQf|; zC|ljD`UA#n#v$iP0hSra4wjEj!H}Aska?Yy5@6%+fJ7$Zd#~rI4$|2~B>JAluQtnk z@irm-Ry`vLq8X;m@$)FpzywD7^T9XbznRKv)%^+)5%~vam;+>*J!fpcZbYCES?VPD za?$Y&RVG|z4zO{nL)h5cAq41s<$F{=M^WiL-Idr3$om$~fUSIB`jIZ!&bB@*#g-A7 zqU3las=598%SR;ac;=CziS+rz^Pa~9w})5?VNX5pvUs!nUF>eU=2{{1Rh1-<25q=I z;B)Br+7I(z?yt8>TFbc4yIS8tJHIAKr(sS2w1)b{z59 zV2n;Py$)!(tmN#JUc5FKip$>=Z~j~5S}_$&W6=_>4#Tg`v(G~Kfy!c7?`E=;`C3O0 zkQdF4sE)4YdCj{l3nxLT8TvYG1*Dk1SwC(+Tf;OfP=409pQz)ys(kwObCSPLKOjjA zggC~WUOYLH8VY3jTUMBG-hr^ywN+N1AtGVsHC1CBEd55Qs6~Rj_$-R8=-m5j2Vu73 zG6I2CMkm=a-uo*79I9p=m~ahjvAOuyzQ$@;tjWhciC^Rww}z+NFjU2(G*y+)R04_s z^P^EsvICgAA`q7Xf+XRDsH{p1@wvn$#!d>-g%`(!22qP{mndjwIBYfo#ZAxl`bT?+ z9(pXc59bk_tK1$8XDAbLAkP*}54jngkaWV+o)sNy<(sR-;Rmvj5Bdchz~0Qo)fr%H zM-2SsU}6mi$Ie2`Obq-*%+C);Ow1%{W$OxXCe{W1vNd)EhyzR=%mBpte~RP*_7<*| z#Oxg0%y2*u?{E8o^US)?lXJLeLEU`Od_>j@#qSQxiz+~NT{#5Pf5Bgaj4YC9p!sRI zMe>8>D+a~sNVf=9%+9(gfegOiZ4L=dF66sU!lTenQKo*OE&ngiPckKEH!GprSQpLC zhb!rMSX6t4Pc^x@-B)>kqa&NKZ%qqV7h)a5z;Uf$0yw>@D>bl+hR`=0OE6N{1! zg@f-NeZ3R~hjR_zudntlmHdC?Rt_u@p&prp-cFk&41Iw|62gI&{3`v8T)Bt)(vi56 zi|H~~p{o#|4lJ2Q*-$`j{ z%F2*L+Ovbd&ohY_!7!Xv9k)h2+%WUC8X*TF6nln#a*`Lj9WY0lFrhR+rRGjHT)ZHh zP3R{v>^0ICQ!GctlY6&WhOzcLqfmoYxURT?a_SnKXReUD9ODp#`pNT=tH`x4U2Rm2 zG;fG!U7_l%TTF`&;S;1z;}2Um%_H_^jbCanWBjQW_qL1{S@!tQ1sJ@cEvc2m8*kAj zWY{}lxl`h2l$p{aqay>{HEx>W00qeqDJWko!Z#`%DF^K@`1Ya?77mgtO9#ZM!%ZO0qz?KY?6Cm27=V`z~KJMa;r-8c5zdD}MK!IT#c; z9SDxW&^s#PBV|UZ^Qm}o`ZQDt4e=llq+DW*wWm!X`VurSBU3>1^B42PQjPKy^TNS` zeljDvV9vo-gx@($_%febCs1Zpa(l)Pd02LHddMP9$t}R?WEHfcyJE{#e-!#4sQG~B zP2t(S@p$84f!|Pl*JY-0B0XBLo@|3ILAKiJ78#j6WV#r>2~F;@@}u&*HO3gfTk*Fl^TdVB z<>r7=ftp9dUS5fx}jv z!8LbIo3ybk@U@(qpPw6?ZV@`Q#yo4}Sl` zxoX{0$}{V0CI4kOP*+KBGoi{@uXq{1{W!6x>?-z$LMRkP26ZAcrOqtAf^RIlrmJgG zO4ry?dCSAiyu^GLC;H(nb?Y3`UDxpY5Cf=#YKAkIAe$9VV)`C`!0N*nM!=}x4@TJu z-<(EKvU+_3)p(fd3mW{c<_Go@GOHiV2F7|M-bHE2lD~u(>dfX0D%nLXJTf0FgxYdT zfcAB1W69iv?$^BV!rsq`PXdh-cJGT{VodY2!o(OA=PJd4^;v?FB&UqS#;VelkHjJi z&3h#!kPNKGcoHQ}49@?q(N6=HT_743)0$J-tNlR@2}ZG{+Yck{I2v+#%B`Dp4NA+x zK9s4XhEu2$CDNwc2?AbSTgLeg9wH-;-6trT77NQm6_vi!4O5p;l@Lz`ZsR6Zppu~i z@+p7Z1OZ40#p@b!B*@Wa^o?UWJr?8s$SzY@+%q9bgKwo5{-kg<+~U~$Tcp}#8ga(F zs0~w;tK<)b!%%thbUO1>)lch?XrrB7taC8IpJ7}$Z?X z{0bGFV2?;x6tH7Y+9sx2AQWVy30zng^bv{6m8qqJ>Z1AvnQl}`XCjhsNHpcfx6as) zYv1)*KYd0DL7BDfeuazqA6 ztEhnnYf2^QTtY!csFDU7KAZeJf{8II^%e->H!(cKBI)f=2?`8TwRI`Xc}=V*pPF`s zw)^S@1>U4n`rHD0jY9Z$&Qo`=vT3#NaT1COYT%HLPQb)BYl)yXrb=N}`#Bsm@qvH_e6Gjj&F|7BnUfg_v*oKW0jOB)b6bdYjU)ZFgQZA z^A?&Ed3*!SqUI{25joiM)|FChmc>OcdE|{aFD6c& zx)3}RrD*O47;_rfveHF?*IADSa7DwfJE88hpTvF({!E$YbRLMDA}=kL5nc%xZ%vQX zrfL6~=4+J*haWi#!IWpVIV9S&%AWKaOax&(@w%=)RRo6_^t?S>4fe8_v3lg&#By&h zJkKWSL7wabgMaM9*6qFvt6>!3d51D6?UKCTcV3nB8H)Dw>GPLGbRt{@sI)tH9lexq zZ3v)^tHe_H(DD|sfNGh8viRCi2blioRU6{gPta%X<+8{@*CK&TPBV0DN;R@dSwr_FA<8`=y9f~P_zkOuT`PAgESXJdvr@D{ zD^mZWQ`2<_+q3T%HVz7XPt=NQ|H~hxXvMZBFyvA{1o{0Z<>)q!^gPN9kHHa0!pvdP zC4zffF3zJAg}Lm#1aq=Zk(MUy`6{J+R-ft!@#byF2*;K#GL_4;`}8ITis$j;7zn=S z5ILZUai76Z&27CQXFq0zQUPgSB+nvT4}2A(Lt0C7{{oC41dyI@L43COPHt3|4U35| zvZC$;B`+X@NE4Q5{xT)GKqEQDa)}u%lnp$rf|i-}5K&oOvnt)9SYp_Y=!FuRELxK{ zrt;J8Z9NNd{VY0=l5R&7(I*N|@XcHEerY}#K9ff2*n$v)I^cvZ8EQfZGs!0o;U=yq zdB_IeL+>3B`T8xhT$utXRpy_u0w>Z&n=8I#nf}u{Vk(f~Xq97CGrP?TgQ+BOfdUc- zq|2*Jvy}rs$4px=zmc+?cpIyLgvvP}j35Zcqh~MsGj`2qGRg=m!pZtP;}}hu`=ZLz zVB^>vc=OA~=!aTq%>YIcxFf8z2{0SV1k!fpWm-Ae4(`C*fRK}X(RUq87E~S^s-=w( z)bC@vu5T2jBxdvYa$=m%51)wD#-IcAY%ZHPaQAO^Z@OW+Q3@^$XhOd$&-O1lB-km& zD@#8m=6hbi0J)88fh5d~r#W#xA0_v3y$9G#H{gXwZYAJF}KE&2(B?@MyPBeHR9e$j^Gl#e88!m zY^istAf+YEPq}O|SP?G=cWIhtQjz@AUtO_F*z`{>tU_v8xRVL1Y{~6bzu(H*`-iL# z1^b1h-Xkm!me97{x9m2(SR^w?A&u)>ic8+}Q;eY1V4)BL(5ckwv8RrDyct$CwPR`w z1LF{-=u%c}CD$u#!$W`de*RssIt3+{0>NarQjoNc7*U38x9D$1g>weOjV6SKK62I+ zNy}H_=k1{3HHy~>6Np5cX)Ig65Rs(jjczr|G&QZDi2gI(;YGw*9e z+e%|)vZz@?i!qP*YmdLf0M1*y*SCD#r;nP&9SQk#Ve}q84rW=gw-)xvRT#sWD(JV! zg9yk$Fu56dc;{Fjj!Pfcn@+#sX1bN!dx2VjXz=M!d(1EqE#yvL5W$z)bBN~;zihK} z7DI}xEZL@+w7ArRNcv~`P#1kZlxo$XU!4H|9z$tFd43z?u~sE% z#6$36j=RmqVjqFMwDKMOP@PuZ;WWd^c{DX`&yD#sK}&Z??2MW>177Ygv~HT~B{`p=T4Z?lLiNW>S0c zGTy08_w}Re+bk!0kR{-av)iE+7qI*|-C1hE%e7#UNXJzA5}`xGwG)y&4AQRkg>olE zRs^C#{N79TB%#5_%EK2)n~JtYStVHa5j{hlTkHoO9Lf!81*zTOMKHco(#OUrx0wn} zneq<b~QqkEfv#9Ucw6Bz7L&>dkV{SqlU-*?gv=iX#}hB-DZ6_!PX<$E34eEoFx{ zxWuW3lZhm6$s2dUNh&{cr7?-keUSrkwL|b(I#yqGnBOk9;Y+<2yz*OE?&pWTU#;~< z-?k;tvx0n}HW;Yu`jY1~3h=w4+`duSSt;Y-WCJ9QrjvC&)E51gyl&U#uLEK;=Z`m|uDPe0(>pHi@#=xI_jIoM& zSxCuK^x218)n2M4npXy>wkV9@CB7DeW>3o+j+R{JCXv=Sx)7o6U`Qct_#)|$pKs30 z8fkuzwzmflW{}aZFb?c^*1(xJ4tzTldvJo>!p~b3oSP7foU9osz-a2Y6D+Z#+@DNj zZRu#xoH(Q&dNt@4w`;UXvh^PB2+Bu8Y!Q18v}Cq-&uq6=hEr-w2uSS~*jtKo8XQ)W zGHs@9T<8y!l4`p>&;t{@Lrm2a6c`CkWp*T}!T+zRpCvwQp}*ogICU?VXHdsl$Hs|)d8aFXgD zxJcR987LwCv)y0o3IH=JV^IfBAhyH|{A1x{WnpAzCuU`5W@lvP{u{*f*~<~|r=|tq zuRS|A0}-;*!Knp8=k(#7r`Fz+%zAFU9`8l=)kIRe+0wo3kmv-~x!4(5Svfg4S^pHUv;9}WAN23928ud3oBah2{yBlnf0_I*xyV1Y z0UrGC`k1;}IoSWb<{y=anbcKf{<#iZA*Qx;b#-*%Wn!|haujWNO9%0I+cZm{|e9Yz|x;Y&yV|IVMpN;76QJ>a(V?t&1hV%1+tY zf#J^>;AZz{LvetMDe&0F_O5?6|8qg}{M9f2J`Omj+gtsGJoEf*{P^#h{^^SU*EN;+ zkD4l(*jfP%`@c|_6R3#lzbVZ1NBS?O{WDVhUsqU?PWiKfgS`WTD!{_c*4X(!>&U|V zAFay5{O@M{)0%&3`TxQXz{B!C`2qBGYxi0c{DgY?{qryrf6 hy|PrPL~AouN@^y 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 e9D07>)On6oCj(6_$g|oQZdh$M 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%0DLuQlG0NjA#t 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%0AWIRl7O!qZ!XJEXCX!RZ4SEL_o);1zQr=*2ZV|JW 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

3dON4v;Ax~>K$3|)_lJMyMK0@E(=%;8nJN3l% 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

-NKq^t-XQOzxEb~ytkW$*n%J^f+O9@ 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 z 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 $y7L-Lt2<$q{(?EcSz6)=p++5EzNhuA^i)#%+mh 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


hy2=bybHy6W`WP%o9MSPARsmUcW$ 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%0DyZ9c850%Qkp;xgOeJY`S2gPc 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πwz1<}_kicgIc;DBrPJ$vKFI^4d3~}d(N16 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

UzX#(pFxHCoBE1xV)r;TIAkjBRoeU+4 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

R|aVZ|TCsylCKGFF4i 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 z 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�=Ll&;CqIgmkO1O&RubS(#vKvz*T^{6bI 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

quC+i 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 @YwE2w;A{j(edvy0I~1R%w@UFk4e%*?F^V{zYl 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

Uk~2e8?;BlPJ~jy=4)R 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 L?vkT12c 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

4f7q@1UkHk}Oa<0YUqG7P^bgE+ef` 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

aY#7mg8mk@gcBs9FlG=P1NrGh*k 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 TT6I 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ξb_6ni%93Z{RM6xx@?)l@`++ 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 EKf7V2wEzGB literal 0 HcmV?d00001 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/assets/banner.jpg b/packages/wallet/wallet-contracts/lib/foundry-huff/assets/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce74a95da59f6a3026d8e8393cb777c34d883981 GIT binary patch literal 45536 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 SO)Ezm0MwMU6szSe!u}6eKl^+D literal 0 HcmV?d00001 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/assets/foundry.png b/packages/wallet/wallet-contracts/lib/foundry-huff/assets/foundry.png new file mode 100644 index 0000000000000000000000000000000000000000..8e24b87ef689e559f913575513a21af749593214 GIT binary patch literal 14491 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 literal 0 HcmV?d00001 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/assets/foundry_huff_banner.jpg b/packages/wallet/wallet-contracts/lib/foundry-huff/assets/foundry_huff_banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2b759648554b59b7cf0811dbd10a2468bc94157 GIT binary patch literal 45502 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%0Di6_MOerz+BcH~@oz`ReRwxBm+ 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 literal 0 HcmV?d00001 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/assets/huff.png b/packages/wallet/wallet-contracts/lib/foundry-huff/assets/huff.png new file mode 100644 index 0000000000000000000000000000000000000000..d5727988439ab8f911baef93ee98d124e27f212a GIT binary patch literal 11820 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 R1LXn-ypvOtt$>(^{SOA623Y_A literal 0 HcmV?d00001 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/assets/inverted_huff.png b/packages/wallet/wallet-contracts/lib/foundry-huff/assets/inverted_huff.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ed658ceca1a27ce7e8ab09d2d8f7bfd4710fa2 GIT binary patch literal 14651 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 LIg#q0`houglpFKo literal 0 HcmV?d00001 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/assets/x.jpg b/packages/wallet/wallet-contracts/lib/foundry-huff/assets/x.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1da702c0d4fd67e38173b9501322f5ca782b1c13 GIT binary patch literal 8013 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 uint256) public map_addr; + // mapping(address => Packed) public map_packed; + mapping(address => UnpackedStruct) public map_struct; + mapping(address => mapping(address => uint256)) public deep_map; + mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; + UnpackedStruct public basicStruct = UnpackedStruct({ + a: 1, + b: 2 + }); + + function hidden() public view returns (bytes32 t) { + // an extremely hidden storage slot + bytes32 slot = keccak256("my.random.var"); + assembly { + t := sload(slot) + } + } +} +``` + +### stdCheats + +This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for address that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you. + + +#### Example usage: +```solidity + +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; + +// Inherit the stdCheats +contract StdCheatsTest is Test { + Bar test; + function setUp() public { + test = new Bar(); + } + + function testHoax() public { + // we call `hoax`, which gives the target address + // eth and then calls `prank` + hoax(address(1337)); + test.bar{value: 100}(address(1337)); + + // overloaded to allow you to specify how much eth to + // initialize the address with + hoax(address(1337), 1); + test.bar{value: 1}(address(1337)); + } + + function testStartHoax() public { + // we call `startHoax`, which gives the target address + // eth and then calls `startPrank` + // + // it is also overloaded so that you can specify an eth amount + startHoax(address(1337)); + test.bar{value: 100}(address(1337)); + test.bar{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } +} + +contract Bar { + function bar(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + } +} +``` + +### Std Assertions + +Expand upon the assertion functions from the `DSTest` library. + +### `console.log` + +Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log). +It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces. + +```solidity +// import it indirectly via Test.sol +import "forge-std/Test.sol"; +// or directly import it +import "forge-std/console2.sol"; +... +console2.log(someValue); +``` + +If you need compatibility with Hardhat, you must use the standard `console.sol` instead. +Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces. + +```solidity +// import it indirectly via Test.sol +import "forge-std/Test.sol"; +// or directly import it +import "forge-std/console.sol"; +... +console.log(someValue); +``` + +## License + +Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license. diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/foundry.toml b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/foundry.toml new file mode 100644 index 000000000..f9679ee61 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/foundry.toml @@ -0,0 +1,21 @@ +[profile.default] +fs_permissions = [{ access = "read-write", path = "./"}] + +[rpc_endpoints] +# The RPC URLs are modified versions of the default for testing initialization. +mainnet = "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3" # Different API key. +optimism_goerli = "https://goerli.optimism.io/" # Adds a trailing slash. +arbitrum_one_goerli = "https://goerli-rollup.arbitrum.io/rpc/" # Adds a trailing slash. +needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}" + +[fmt] +# These are all the `forge fmt` defaults. +line_length = 120 +tab_width = 4 +bracket_spacing = false +int_types = 'long' +multiline_func_header = 'attributes_first' +quote_style = 'double' +number_underscore = 'preserve' +single_line_statement_blocks = 'preserve' +ignore = ["src/console.sol", "src/console2.sol"] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/.github/workflows/build.yml b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/.github/workflows/build.yml new file mode 100644 index 000000000..d2ff97db7 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/.github/workflows/build.yml @@ -0,0 +1,41 @@ +name: "Build" +on: + pull_request: + push: +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: cachix/install-nix-action@v20 + with: + nix_path: nixpkgs=channel:nixos-unstable + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + + - name: setup dapp binary cache + uses: cachix/cachix-action@v12 + with: + name: dapp + + - name: install dapptools + run: nix profile install github:dapphub/dapptools#dapp --accept-flake-config + + - name: install foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: test with solc-0.5.17 + run: dapp --use solc-0.5.17 test -v + + - name: test with solc-0.6.11 + run: dapp --use solc-0.6.11 test -v + + - name: test with solc-0.7.6 + run: dapp --use solc-0.7.6 test -v + + - name: test with solc-0.8.18 + run: dapp --use solc-0.8.18 test -v + + - name: Run tests with foundry + run: forge test -vvv + diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/LICENSE b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/LICENSE new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/Makefile b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/Makefile new file mode 100644 index 000000000..661dac486 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/Makefile @@ -0,0 +1,14 @@ +all:; dapp build + +test: + -dapp --use solc:0.4.23 build + -dapp --use solc:0.4.26 build + -dapp --use solc:0.5.17 build + -dapp --use solc:0.6.12 build + -dapp --use solc:0.7.5 build + +demo: + DAPP_SRC=demo dapp --use solc:0.7.5 build + -hevm dapp-test --verbose 3 + +.PHONY: test demo diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/default.nix b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/default.nix new file mode 100644 index 000000000..cf65419ab --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/default.nix @@ -0,0 +1,4 @@ +{ solidityPackage, dappsys }: solidityPackage { + name = "ds-test"; + src = ./src; +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/demo/demo.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/demo/demo.sol new file mode 100644 index 000000000..f3bb48e70 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/demo/demo.sol @@ -0,0 +1,222 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity >=0.5.0; + +import "../src/test.sol"; + +contract DemoTest is DSTest { + function test_this() public pure { + require(true); + } + function test_logs() public { + emit log("-- log(string)"); + emit log("a string"); + + emit log("-- log_named_uint(string, uint)"); + emit log_named_uint("uint", 512); + + emit log("-- log_named_int(string, int)"); + emit log_named_int("int", -512); + + emit log("-- log_named_address(string, address)"); + emit log_named_address("address", address(this)); + + emit log("-- log_named_bytes32(string, bytes32)"); + emit log_named_bytes32("bytes32", "a string"); + + emit log("-- log_named_bytes(string, bytes)"); + emit log_named_bytes("bytes", hex"cafefe"); + + emit log("-- log_named_string(string, string)"); + emit log_named_string("string", "a string"); + + emit log("-- log_named_decimal_uint(string, uint, uint)"); + emit log_named_decimal_uint("decimal uint", 1.0e18, 18); + + emit log("-- log_named_decimal_int(string, int, uint)"); + emit log_named_decimal_int("decimal int", -1.0e18, 18); + } + event log_old_named_uint(bytes32,uint); + function test_old_logs() public { + emit log_old_named_uint("key", 500); + emit log_named_bytes32("bkey", "val"); + } + function test_trace() public view { + this.echo("string 1", "string 2"); + } + function test_multiline() public { + emit log("a multiline\\nstring"); + emit log("a multiline string"); + emit log_bytes("a string"); + emit log_bytes("a multiline\nstring"); + emit log_bytes("a multiline\\nstring"); + emit logs(hex"0000"); + emit log_named_bytes("0x0000", hex"0000"); + emit logs(hex"ff"); + } + function echo(string memory s1, string memory s2) public pure + returns (string memory, string memory) + { + return (s1, s2); + } + + function prove_this(uint x) public { + emit log_named_uint("sym x", x); + assertGt(x + 1, 0); + } + + function test_logn() public { + assembly { + log0(0x01, 0x02) + log1(0x01, 0x02, 0x03) + log2(0x01, 0x02, 0x03, 0x04) + log3(0x01, 0x02, 0x03, 0x04, 0x05) + } + } + + event MyEvent(uint, uint indexed, uint, uint indexed); + function test_events() public { + emit MyEvent(1, 2, 3, 4); + } + + function test_asserts() public { + string memory err = "this test has failed!"; + emit log("## assertTrue(bool)\n"); + assertTrue(false); + emit log("\n"); + assertTrue(false, err); + + emit log("\n## assertEq(address,address)\n"); + assertEq(address(this), msg.sender); + emit log("\n"); + assertEq(address(this), msg.sender, err); + + emit log("\n## assertEq32(bytes32,bytes32)\n"); + assertEq32("bytes 1", "bytes 2"); + emit log("\n"); + assertEq32("bytes 1", "bytes 2", err); + + emit log("\n## assertEq(bytes32,bytes32)\n"); + assertEq32("bytes 1", "bytes 2"); + emit log("\n"); + assertEq32("bytes 1", "bytes 2", err); + + emit log("\n## assertEq(uint,uint)\n"); + assertEq(uint(0), 1); + emit log("\n"); + assertEq(uint(0), 1, err); + + emit log("\n## assertEq(int,int)\n"); + assertEq(-1, -2); + emit log("\n"); + assertEq(-1, -2, err); + + emit log("\n## assertEqDecimal(int,int,uint)\n"); + assertEqDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertEqDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertEqDecimal(uint,uint,uint)\n"); + assertEqDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertEqDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertGt(uint,uint)\n"); + assertGt(uint(0), 0); + emit log("\n"); + assertGt(uint(0), 0, err); + + emit log("\n## assertGt(int,int)\n"); + assertGt(-1, -1); + emit log("\n"); + assertGt(-1, -1, err); + + emit log("\n## assertGtDecimal(int,int,uint)\n"); + assertGtDecimal(-2.0e18, -1.1e18, 18); + emit log("\n"); + assertGtDecimal(-2.0e18, -1.1e18, 18, err); + + emit log("\n## assertGtDecimal(uint,uint,uint)\n"); + assertGtDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertGtDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertGe(uint,uint)\n"); + assertGe(uint(0), 1); + emit log("\n"); + assertGe(uint(0), 1, err); + + emit log("\n## assertGe(int,int)\n"); + assertGe(-1, 0); + emit log("\n"); + assertGe(-1, 0, err); + + emit log("\n## assertGeDecimal(int,int,uint)\n"); + assertGeDecimal(-2.0e18, -1.1e18, 18); + emit log("\n"); + assertGeDecimal(-2.0e18, -1.1e18, 18, err); + + emit log("\n## assertGeDecimal(uint,uint,uint)\n"); + assertGeDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertGeDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertLt(uint,uint)\n"); + assertLt(uint(0), 0); + emit log("\n"); + assertLt(uint(0), 0, err); + + emit log("\n## assertLt(int,int)\n"); + assertLt(-1, -1); + emit log("\n"); + assertLt(-1, -1, err); + + emit log("\n## assertLtDecimal(int,int,uint)\n"); + assertLtDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertLtDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertLtDecimal(uint,uint,uint)\n"); + assertLtDecimal(uint(2.0e18), 1.1e18, 18); + emit log("\n"); + assertLtDecimal(uint(2.0e18), 1.1e18, 18, err); + + emit log("\n## assertLe(uint,uint)\n"); + assertLe(uint(1), 0); + emit log("\n"); + assertLe(uint(1), 0, err); + + emit log("\n## assertLe(int,int)\n"); + assertLe(0, -1); + emit log("\n"); + assertLe(0, -1, err); + + emit log("\n## assertLeDecimal(int,int,uint)\n"); + assertLeDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertLeDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertLeDecimal(uint,uint,uint)\n"); + assertLeDecimal(uint(2.0e18), 1.1e18, 18); + emit log("\n"); + assertLeDecimal(uint(2.0e18), 1.1e18, 18, err); + + emit log("\n## assertEq(string,string)\n"); + string memory s1 = "string 1"; + string memory s2 = "string 2"; + assertEq(s1, s2); + emit log("\n"); + assertEq(s1, s2, err); + + emit log("\n## assertEq0(bytes,bytes)\n"); + assertEq0(hex"abcdef01", hex"abcdef02"); + emit log("\n"); + assertEq0(hex"abcdef01", hex"abcdef02", err); + } +} + +contract DemoTestWithSetUp { + function setUp() public { + } + function test_pass() public pure { + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/package.json b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/package.json new file mode 100644 index 000000000..4802adaa3 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/package.json @@ -0,0 +1,15 @@ +{ + "name": "ds-test", + "version": "1.0.0", + "description": "Assertions, equality checks and other test helpers ", + "bugs": "https://github.com/dapphub/ds-test/issues", + "license": "GPL-3.0", + "author": "Contributors to ds-test", + "files": [ + "src/*" + ], + "repository": { + "type": "git", + "url": "https://github.com/dapphub/ds-test.git" + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/src/test.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/src/test.sol new file mode 100644 index 000000000..2bf337567 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/src/test.sol @@ -0,0 +1,592 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity >=0.5.0; + +contract DSTest { + event log (string); + event logs (bytes); + + event log_address (address); + event log_bytes32 (bytes32); + event log_int (int); + event log_uint (uint); + event log_bytes (bytes); + event log_string (string); + + event log_named_address (string key, address val); + event log_named_bytes32 (string key, bytes32 val); + event log_named_decimal_int (string key, int val, uint decimals); + event log_named_decimal_uint (string key, uint val, uint decimals); + event log_named_int (string key, int val); + event log_named_uint (string key, uint val); + event log_named_bytes (string key, bytes val); + event log_named_string (string key, string val); + + bool public IS_TEST = true; + bool private _failed; + + address constant HEVM_ADDRESS = + address(bytes20(uint160(uint256(keccak256('hevm cheat code'))))); + + modifier mayRevert() { _; } + modifier testopts(string memory) { _; } + + function failed() public returns (bool) { + if (_failed) { + return _failed; + } else { + bool globalFailed = false; + if (hasHEVMContext()) { + (, bytes memory retdata) = HEVM_ADDRESS.call( + abi.encodePacked( + bytes4(keccak256("load(address,bytes32)")), + abi.encode(HEVM_ADDRESS, bytes32("failed")) + ) + ); + globalFailed = abi.decode(retdata, (bool)); + } + return globalFailed; + } + } + + function fail() internal virtual { + if (hasHEVMContext()) { + (bool status, ) = HEVM_ADDRESS.call( + abi.encodePacked( + bytes4(keccak256("store(address,bytes32,bytes32)")), + abi.encode(HEVM_ADDRESS, bytes32("failed"), bytes32(uint256(0x01))) + ) + ); + status; // Silence compiler warnings + } + _failed = true; + } + + function hasHEVMContext() internal view returns (bool) { + uint256 hevmCodeSize = 0; + assembly { + hevmCodeSize := extcodesize(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D) + } + return hevmCodeSize > 0; + } + + modifier logs_gas() { + uint startGas = gasleft(); + _; + uint endGas = gasleft(); + emit log_named_uint("gas", startGas - endGas); + } + + function assertTrue(bool condition) internal { + if (!condition) { + emit log("Error: Assertion Failed"); + fail(); + } + } + + function assertTrue(bool condition, string memory err) internal { + if (!condition) { + emit log_named_string("Error", err); + assertTrue(condition); + } + } + + function assertEq(address a, address b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [address]"); + emit log_named_address(" Left", a); + emit log_named_address(" Right", b); + fail(); + } + } + function assertEq(address a, address b, string memory err) internal { + if (a != b) { + emit log_named_string ("Error", err); + assertEq(a, b); + } + } + + function assertEq(bytes32 a, bytes32 b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [bytes32]"); + emit log_named_bytes32(" Left", a); + emit log_named_bytes32(" Right", b); + fail(); + } + } + function assertEq(bytes32 a, bytes32 b, string memory err) internal { + if (a != b) { + emit log_named_string ("Error", err); + assertEq(a, b); + } + } + function assertEq32(bytes32 a, bytes32 b) internal { + assertEq(a, b); + } + function assertEq32(bytes32 a, bytes32 b, string memory err) internal { + assertEq(a, b, err); + } + + function assertEq(int a, int b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [int]"); + emit log_named_int(" Left", a); + emit log_named_int(" Right", b); + fail(); + } + } + function assertEq(int a, int b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + function assertEq(uint a, uint b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [uint]"); + emit log_named_uint(" Left", a); + emit log_named_uint(" Right", b); + fail(); + } + } + function assertEq(uint a, uint b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + function assertEqDecimal(int a, int b, uint decimals) internal { + if (a != b) { + emit log("Error: a == b not satisfied [decimal int]"); + emit log_named_decimal_int(" Left", a, decimals); + emit log_named_decimal_int(" Right", b, decimals); + fail(); + } + } + function assertEqDecimal(int a, int b, uint decimals, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEqDecimal(a, b, decimals); + } + } + function assertEqDecimal(uint a, uint b, uint decimals) internal { + if (a != b) { + emit log("Error: a == b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Left", a, decimals); + emit log_named_decimal_uint(" Right", b, decimals); + fail(); + } + } + function assertEqDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEqDecimal(a, b, decimals); + } + } + + function assertNotEq(address a, address b) internal { + if (a == b) { + emit log("Error: a != b not satisfied [address]"); + emit log_named_address(" Left", a); + emit log_named_address(" Right", b); + fail(); + } + } + function assertNotEq(address a, address b, string memory err) internal { + if (a == b) { + emit log_named_string ("Error", err); + assertNotEq(a, b); + } + } + + function assertNotEq(bytes32 a, bytes32 b) internal { + if (a == b) { + emit log("Error: a != b not satisfied [bytes32]"); + emit log_named_bytes32(" Left", a); + emit log_named_bytes32(" Right", b); + fail(); + } + } + function assertNotEq(bytes32 a, bytes32 b, string memory err) internal { + if (a == b) { + emit log_named_string ("Error", err); + assertNotEq(a, b); + } + } + function assertNotEq32(bytes32 a, bytes32 b) internal { + assertNotEq(a, b); + } + function assertNotEq32(bytes32 a, bytes32 b, string memory err) internal { + assertNotEq(a, b, err); + } + + function assertNotEq(int a, int b) internal { + if (a == b) { + emit log("Error: a != b not satisfied [int]"); + emit log_named_int(" Left", a); + emit log_named_int(" Right", b); + fail(); + } + } + function assertNotEq(int a, int b, string memory err) internal { + if (a == b) { + emit log_named_string("Error", err); + assertNotEq(a, b); + } + } + function assertNotEq(uint a, uint b) internal { + if (a == b) { + emit log("Error: a != b not satisfied [uint]"); + emit log_named_uint(" Left", a); + emit log_named_uint(" Right", b); + fail(); + } + } + function assertNotEq(uint a, uint b, string memory err) internal { + if (a == b) { + emit log_named_string("Error", err); + assertNotEq(a, b); + } + } + function assertNotEqDecimal(int a, int b, uint decimals) internal { + if (a == b) { + emit log("Error: a != b not satisfied [decimal int]"); + emit log_named_decimal_int(" Left", a, decimals); + emit log_named_decimal_int(" Right", b, decimals); + fail(); + } + } + function assertNotEqDecimal(int a, int b, uint decimals, string memory err) internal { + if (a == b) { + emit log_named_string("Error", err); + assertNotEqDecimal(a, b, decimals); + } + } + function assertNotEqDecimal(uint a, uint b, uint decimals) internal { + if (a == b) { + emit log("Error: a != b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Left", a, decimals); + emit log_named_decimal_uint(" Right", b, decimals); + fail(); + } + } + function assertNotEqDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a == b) { + emit log_named_string("Error", err); + assertNotEqDecimal(a, b, decimals); + } + } + + function assertGt(uint a, uint b) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertGt(uint a, uint b, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGt(a, b); + } + } + function assertGt(int a, int b) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertGt(int a, int b, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGt(a, b); + } + } + function assertGtDecimal(int a, int b, uint decimals) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertGtDecimal(int a, int b, uint decimals, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGtDecimal(a, b, decimals); + } + } + function assertGtDecimal(uint a, uint b, uint decimals) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertGtDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGtDecimal(a, b, decimals); + } + } + + function assertGe(uint a, uint b) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertGe(uint a, uint b, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGe(a, b); + } + } + function assertGe(int a, int b) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertGe(int a, int b, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGe(a, b); + } + } + function assertGeDecimal(int a, int b, uint decimals) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertGeDecimal(int a, int b, uint decimals, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + function assertGeDecimal(uint a, uint b, uint decimals) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertGeDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + + function assertLt(uint a, uint b) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertLt(uint a, uint b, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLt(a, b); + } + } + function assertLt(int a, int b) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertLt(int a, int b, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLt(a, b); + } + } + function assertLtDecimal(int a, int b, uint decimals) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertLtDecimal(int a, int b, uint decimals, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLtDecimal(a, b, decimals); + } + } + function assertLtDecimal(uint a, uint b, uint decimals) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertLtDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLtDecimal(a, b, decimals); + } + } + + function assertLe(uint a, uint b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertLe(uint a, uint b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLe(a, b); + } + } + function assertLe(int a, int b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertLe(int a, int b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLe(a, b); + } + } + function assertLeDecimal(int a, int b, uint decimals) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertLeDecimal(int a, int b, uint decimals, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLeDecimal(a, b, decimals); + } + } + function assertLeDecimal(uint a, uint b, uint decimals) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertLeDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLeDecimal(a, b, decimals); + } + } + + function assertEq(string memory a, string memory b) internal { + if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { + emit log("Error: a == b not satisfied [string]"); + emit log_named_string(" Left", a); + emit log_named_string(" Right", b); + fail(); + } + } + function assertEq(string memory a, string memory b, string memory err) internal { + if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertNotEq(string memory a, string memory b) internal { + if (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))) { + emit log("Error: a != b not satisfied [string]"); + emit log_named_string(" Left", a); + emit log_named_string(" Right", b); + fail(); + } + } + function assertNotEq(string memory a, string memory b, string memory err) internal { + if (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))) { + emit log_named_string("Error", err); + assertNotEq(a, b); + } + } + + function checkEq0(bytes memory a, bytes memory b) internal pure returns (bool ok) { + ok = true; + if (a.length == b.length) { + for (uint i = 0; i < a.length; i++) { + if (a[i] != b[i]) { + ok = false; + } + } + } else { + ok = false; + } + } + function assertEq0(bytes memory a, bytes memory b) internal { + if (!checkEq0(a, b)) { + emit log("Error: a == b not satisfied [bytes]"); + emit log_named_bytes(" Left", a); + emit log_named_bytes(" Right", b); + fail(); + } + } + function assertEq0(bytes memory a, bytes memory b, string memory err) internal { + if (!checkEq0(a, b)) { + emit log_named_string("Error", err); + assertEq0(a, b); + } + } + + function assertNotEq0(bytes memory a, bytes memory b) internal { + if (checkEq0(a, b)) { + emit log("Error: a != b not satisfied [bytes]"); + emit log_named_bytes(" Left", a); + emit log_named_bytes(" Right", b); + fail(); + } + } + function assertNotEq0(bytes memory a, bytes memory b, string memory err) internal { + if (checkEq0(a, b)) { + emit log_named_string("Error", err); + assertNotEq0(a, b); + } + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/src/test.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/src/test.t.sol new file mode 100644 index 000000000..d277a3094 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/lib/ds-test/src/test.t.sol @@ -0,0 +1,417 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity >=0.5.0; + +import {DSTest} from "./test.sol"; + +contract DemoTest is DSTest { + + // --- assertTrue --- + + function testAssertTrue() public { + assertTrue(true, "msg"); + assertTrue(true); + } + function testFailAssertTrue() public { + assertTrue(false); + } + function testFailAssertTrueWithMsg() public { + assertTrue(false, "msg"); + } + + // --- assertEq (Addr) --- + + function testAssertEqAddr() public { + assertEq(address(0x0), address(0x0), "msg"); + assertEq(address(0x0), address(0x0)); + } + function testFailAssertEqAddr() public { + assertEq(address(0x0), address(0x1)); + } + function testFailAssertEqAddrWithMsg() public { + assertEq(address(0x0), address(0x1), "msg"); + } + + // --- assertEq (Bytes32) --- + + function testAssertEqBytes32() public { + assertEq(bytes32("hi"), bytes32("hi"), "msg"); + assertEq(bytes32("hi"), bytes32("hi")); + } + function testFailAssertEqBytes32() public { + assertEq(bytes32("hi"), bytes32("ho")); + } + function testFailAssertEqBytes32WithMsg() public { + assertEq(bytes32("hi"), bytes32("ho"), "msg"); + } + + // --- assertEq (Int) --- + + function testAssertEqInt() public { + assertEq(-1, -1, "msg"); + assertEq(-1, -1); + } + function testFailAssertEqInt() public { + assertEq(-1, -2); + } + function testFailAssertEqIntWithMsg() public { + assertEq(-1, -2, "msg"); + } + + // --- assertEq (UInt) --- + + function testAssertEqUInt() public { + assertEq(uint(1), uint(1), "msg"); + assertEq(uint(1), uint(1)); + } + function testFailAssertEqUInt() public { + assertEq(uint(1), uint(2)); + } + function testFailAssertEqUIntWithMsg() public { + assertEq(uint(1), uint(2), "msg"); + } + + // --- assertEqDecimal (Int) --- + + function testAssertEqDecimalInt() public { + assertEqDecimal(-1, -1, 18, "msg"); + assertEqDecimal(-1, -1, 18); + } + function testFailAssertEqDecimalInt() public { + assertEqDecimal(-1, -2, 18); + } + function testFailAssertEqDecimalIntWithMsg() public { + assertEqDecimal(-1, -2, 18, "msg"); + } + + // --- assertEqDecimal (UInt) --- + + function testAssertEqDecimalUInt() public { + assertEqDecimal(uint(1), uint(1), 18, "msg"); + assertEqDecimal(uint(1), uint(1), 18); + } + function testFailAssertEqDecimalUInt() public { + assertEqDecimal(uint(1), uint(2), 18); + } + function testFailAssertEqDecimalUIntWithMsg() public { + assertEqDecimal(uint(1), uint(2), 18, "msg"); + } + + // --- assertNotEq (Addr) --- + + function testAssertNotEqAddr() public { + assertNotEq(address(0x0), address(0x1), "msg"); + assertNotEq(address(0x0), address(0x1)); + } + function testFailAssertNotEqAddr() public { + assertNotEq(address(0x0), address(0x0)); + } + function testFailAssertNotEqAddrWithMsg() public { + assertNotEq(address(0x0), address(0x0), "msg"); + } + + // --- assertNotEq (Bytes32) --- + + function testAssertNotEqBytes32() public { + assertNotEq(bytes32("hi"), bytes32("ho"), "msg"); + assertNotEq(bytes32("hi"), bytes32("ho")); + } + function testFailAssertNotEqBytes32() public { + assertNotEq(bytes32("hi"), bytes32("hi")); + } + function testFailAssertNotEqBytes32WithMsg() public { + assertNotEq(bytes32("hi"), bytes32("hi"), "msg"); + } + + // --- assertNotEq (Int) --- + + function testAssertNotEqInt() public { + assertNotEq(-1, -2, "msg"); + assertNotEq(-1, -2); + } + function testFailAssertNotEqInt() public { + assertNotEq(-1, -1); + } + function testFailAssertNotEqIntWithMsg() public { + assertNotEq(-1, -1, "msg"); + } + + // --- assertNotEq (UInt) --- + + function testAssertNotEqUInt() public { + assertNotEq(uint(1), uint(2), "msg"); + assertNotEq(uint(1), uint(2)); + } + function testFailAssertNotEqUInt() public { + assertNotEq(uint(1), uint(1)); + } + function testFailAssertNotEqUIntWithMsg() public { + assertNotEq(uint(1), uint(1), "msg"); + } + + // --- assertNotEqDecimal (Int) --- + + function testAssertNotEqDecimalInt() public { + assertNotEqDecimal(-1, -2, 18, "msg"); + assertNotEqDecimal(-1, -2, 18); + } + function testFailAssertNotEqDecimalInt() public { + assertNotEqDecimal(-1, -1, 18); + } + function testFailAssertNotEqDecimalIntWithMsg() public { + assertNotEqDecimal(-1, -1, 18, "msg"); + } + + // --- assertNotEqDecimal (UInt) --- + + function testAssertNotEqDecimalUInt() public { + assertNotEqDecimal(uint(1), uint(2), 18, "msg"); + assertNotEqDecimal(uint(1), uint(2), 18); + } + function testFailAssertNotEqDecimalUInt() public { + assertNotEqDecimal(uint(1), uint(1), 18); + } + function testFailAssertNotEqDecimalUIntWithMsg() public { + assertNotEqDecimal(uint(1), uint(1), 18, "msg"); + } + + // --- assertGt (UInt) --- + + function testAssertGtUInt() public { + assertGt(uint(2), uint(1), "msg"); + assertGt(uint(3), uint(2)); + } + function testFailAssertGtUInt() public { + assertGt(uint(1), uint(2)); + } + function testFailAssertGtUIntWithMsg() public { + assertGt(uint(1), uint(2), "msg"); + } + + // --- assertGt (Int) --- + + function testAssertGtInt() public { + assertGt(-1, -2, "msg"); + assertGt(-1, -3); + } + function testFailAssertGtInt() public { + assertGt(-2, -1); + } + function testFailAssertGtIntWithMsg() public { + assertGt(-2, -1, "msg"); + } + + // --- assertGtDecimal (UInt) --- + + function testAssertGtDecimalUInt() public { + assertGtDecimal(uint(2), uint(1), 18, "msg"); + assertGtDecimal(uint(3), uint(2), 18); + } + function testFailAssertGtDecimalUInt() public { + assertGtDecimal(uint(1), uint(2), 18); + } + function testFailAssertGtDecimalUIntWithMsg() public { + assertGtDecimal(uint(1), uint(2), 18, "msg"); + } + + // --- assertGtDecimal (Int) --- + + function testAssertGtDecimalInt() public { + assertGtDecimal(-1, -2, 18, "msg"); + assertGtDecimal(-1, -3, 18); + } + function testFailAssertGtDecimalInt() public { + assertGtDecimal(-2, -1, 18); + } + function testFailAssertGtDecimalIntWithMsg() public { + assertGtDecimal(-2, -1, 18, "msg"); + } + + // --- assertGe (UInt) --- + + function testAssertGeUInt() public { + assertGe(uint(2), uint(1), "msg"); + assertGe(uint(2), uint(2)); + } + function testFailAssertGeUInt() public { + assertGe(uint(1), uint(2)); + } + function testFailAssertGeUIntWithMsg() public { + assertGe(uint(1), uint(2), "msg"); + } + + // --- assertGe (Int) --- + + function testAssertGeInt() public { + assertGe(-1, -2, "msg"); + assertGe(-1, -1); + } + function testFailAssertGeInt() public { + assertGe(-2, -1); + } + function testFailAssertGeIntWithMsg() public { + assertGe(-2, -1, "msg"); + } + + // --- assertGeDecimal (UInt) --- + + function testAssertGeDecimalUInt() public { + assertGeDecimal(uint(2), uint(1), 18, "msg"); + assertGeDecimal(uint(2), uint(2), 18); + } + function testFailAssertGeDecimalUInt() public { + assertGeDecimal(uint(1), uint(2), 18); + } + function testFailAssertGeDecimalUIntWithMsg() public { + assertGeDecimal(uint(1), uint(2), 18, "msg"); + } + + // --- assertGeDecimal (Int) --- + + function testAssertGeDecimalInt() public { + assertGeDecimal(-1, -2, 18, "msg"); + assertGeDecimal(-1, -2, 18); + } + function testFailAssertGeDecimalInt() public { + assertGeDecimal(-2, -1, 18); + } + function testFailAssertGeDecimalIntWithMsg() public { + assertGeDecimal(-2, -1, 18, "msg"); + } + + // --- assertLt (UInt) --- + + function testAssertLtUInt() public { + assertLt(uint(1), uint(2), "msg"); + assertLt(uint(1), uint(3)); + } + function testFailAssertLtUInt() public { + assertLt(uint(2), uint(2)); + } + function testFailAssertLtUIntWithMsg() public { + assertLt(uint(3), uint(2), "msg"); + } + + // --- assertLt (Int) --- + + function testAssertLtInt() public { + assertLt(-2, -1, "msg"); + assertLt(-1, 0); + } + function testFailAssertLtInt() public { + assertLt(-1, -2); + } + function testFailAssertLtIntWithMsg() public { + assertLt(-1, -1, "msg"); + } + + // --- assertLtDecimal (UInt) --- + + function testAssertLtDecimalUInt() public { + assertLtDecimal(uint(1), uint(2), 18, "msg"); + assertLtDecimal(uint(2), uint(3), 18); + } + function testFailAssertLtDecimalUInt() public { + assertLtDecimal(uint(1), uint(1), 18); + } + function testFailAssertLtDecimalUIntWithMsg() public { + assertLtDecimal(uint(2), uint(1), 18, "msg"); + } + + // --- assertLtDecimal (Int) --- + + function testAssertLtDecimalInt() public { + assertLtDecimal(-2, -1, 18, "msg"); + assertLtDecimal(-2, -1, 18); + } + function testFailAssertLtDecimalInt() public { + assertLtDecimal(-2, -2, 18); + } + function testFailAssertLtDecimalIntWithMsg() public { + assertLtDecimal(-1, -2, 18, "msg"); + } + + // --- assertLe (UInt) --- + + function testAssertLeUInt() public { + assertLe(uint(1), uint(2), "msg"); + assertLe(uint(1), uint(1)); + } + function testFailAssertLeUInt() public { + assertLe(uint(4), uint(2)); + } + function testFailAssertLeUIntWithMsg() public { + assertLe(uint(3), uint(2), "msg"); + } + + // --- assertLe (Int) --- + + function testAssertLeInt() public { + assertLe(-2, -1, "msg"); + assertLe(-1, -1); + } + function testFailAssertLeInt() public { + assertLe(-1, -2); + } + function testFailAssertLeIntWithMsg() public { + assertLe(-1, -3, "msg"); + } + + // --- assertLeDecimal (UInt) --- + + function testAssertLeDecimalUInt() public { + assertLeDecimal(uint(1), uint(2), 18, "msg"); + assertLeDecimal(uint(2), uint(2), 18); + } + function testFailAssertLeDecimalUInt() public { + assertLeDecimal(uint(1), uint(0), 18); + } + function testFailAssertLeDecimalUIntWithMsg() public { + assertLeDecimal(uint(1), uint(0), 18, "msg"); + } + + // --- assertLeDecimal (Int) --- + + function testAssertLeDecimalInt() public { + assertLeDecimal(-2, -1, 18, "msg"); + assertLeDecimal(-2, -2, 18); + } + function testFailAssertLeDecimalInt() public { + assertLeDecimal(-2, -3, 18); + } + function testFailAssertLeDecimalIntWithMsg() public { + assertLeDecimal(-1, -2, 18, "msg"); + } + + // --- assertNotEq (String) --- + + function testAssertNotEqString() public { + assertNotEq(new string(1), new string(2), "msg"); + assertNotEq(new string(1), new string(2)); + } + function testFailAssertNotEqString() public { + assertNotEq(new string(1), new string(1)); + } + function testFailAssertNotEqStringWithMsg() public { + assertNotEq(new string(1), new string(1), "msg"); + } + + // --- assertNotEq0 (Bytes) --- + + function testAssertNotEq0Bytes() public { + assertNotEq0(bytes("hi"), bytes("ho"), "msg"); + assertNotEq0(bytes("hi"), bytes("ho")); + } + function testFailAssertNotEq0Bytes() public { + assertNotEq0(bytes("hi"), bytes("hi")); + } + function testFailAssertNotEq0BytesWithMsg() public { + assertNotEq0(bytes("hi"), bytes("hi"), "msg"); + } + + // --- fail override --- + + // ensure that fail can be overridden + function fail() internal override { + super.fail(); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/package.json b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/package.json new file mode 100644 index 000000000..310d46c8c --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/package.json @@ -0,0 +1,16 @@ +{ + "name": "forge-std", + "version": "1.6.0", + "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", + "homepage": "https://book.getfoundry.sh/forge/forge-std", + "bugs": "https://github.com/foundry-rs/forge-std/issues", + "license": "(Apache-2.0 OR MIT)", + "author": "Contributors to Forge Standard Library", + "files": [ + "src/**/*" + ], + "repository": { + "type": "git", + "url": "https://github.com/foundry-rs/forge-std.git" + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Base.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Base.sol new file mode 100644 index 000000000..851ac0cd2 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Base.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {StdStorage} from "./StdStorage.sol"; +import {Vm, VmSafe} from "./Vm.sol"; + +abstract contract CommonBase { + // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D. + address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); + // console.sol and console2.sol work by executing a staticcall to this address. + address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; + // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. + address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38. + address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller")))); + // Address of the test contract, deployed by the DEFAULT_SENDER. + address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; + // Deterministic deployment address of the Multicall3 contract. + address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11; + // The order of the secp256k1 curve. + uint256 internal constant SECP256K1_ORDER = + 115792089237316195423570985008687907852837564279074904382605163141518161494337; + + uint256 internal constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + Vm internal constant vm = Vm(VM_ADDRESS); + StdStorage internal stdstore; +} + +abstract contract TestBase is CommonBase {} + +abstract contract ScriptBase is CommonBase { + VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Script.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Script.sol new file mode 100644 index 000000000..94e75f6cb --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Script.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +// 💬 ABOUT +// Forge Std's default Script. + +// 🧩 MODULES +import {console} from "./console.sol"; +import {console2} from "./console2.sol"; +import {safeconsole} from "./safeconsole.sol"; +import {StdChains} from "./StdChains.sol"; +import {StdCheatsSafe} from "./StdCheats.sol"; +import {stdJson} from "./StdJson.sol"; +import {stdMath} from "./StdMath.sol"; +import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; +import {StdStyle} from "./StdStyle.sol"; +import {StdUtils} from "./StdUtils.sol"; +import {VmSafe} from "./Vm.sol"; + +// 📦 BOILERPLATE +import {ScriptBase} from "./Base.sol"; + +// ⭐️ SCRIPT +abstract contract Script is ScriptBase, StdChains, StdCheatsSafe, StdUtils { + // Note: IS_SCRIPT() must return true. + bool public IS_SCRIPT = true; +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdAssertions.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdAssertions.sol new file mode 100644 index 000000000..2778b3a0e --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdAssertions.sol @@ -0,0 +1,376 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {DSTest} from "ds-test/test.sol"; +import {stdMath} from "./StdMath.sol"; + +abstract contract StdAssertions is DSTest { + event log_array(uint256[] val); + event log_array(int256[] val); + event log_array(address[] val); + event log_named_array(string key, uint256[] val); + event log_named_array(string key, int256[] val); + event log_named_array(string key, address[] val); + + function fail(string memory err) internal virtual { + emit log_named_string("Error", err); + fail(); + } + + function assertFalse(bool data) internal virtual { + assertTrue(!data); + } + + function assertFalse(bool data, string memory err) internal virtual { + assertTrue(!data, err); + } + + function assertEq(bool a, bool b) internal virtual { + if (a != b) { + emit log("Error: a == b not satisfied [bool]"); + emit log_named_string(" Left", a ? "true" : "false"); + emit log_named_string(" Right", b ? "true" : "false"); + fail(); + } + } + + function assertEq(bool a, bool b, string memory err) internal virtual { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(bytes memory a, bytes memory b) internal virtual { + assertEq0(a, b); + } + + function assertEq(bytes memory a, bytes memory b, string memory err) internal virtual { + assertEq0(a, b, err); + } + + function assertEq(uint256[] memory a, uint256[] memory b) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log("Error: a == b not satisfied [uint[]]"); + emit log_named_array(" Left", a); + emit log_named_array(" Right", b); + fail(); + } + } + + function assertEq(int256[] memory a, int256[] memory b) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log("Error: a == b not satisfied [int[]]"); + emit log_named_array(" Left", a); + emit log_named_array(" Right", b); + fail(); + } + } + + function assertEq(address[] memory a, address[] memory b) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log("Error: a == b not satisfied [address[]]"); + emit log_named_array(" Left", a); + emit log_named_array(" Right", b); + fail(); + } + } + + function assertEq(uint256[] memory a, uint256[] memory b, string memory err) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(int256[] memory a, int256[] memory b, string memory err) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(address[] memory a, address[] memory b, string memory err) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + // Legacy helper + function assertEqUint(uint256 a, uint256 b) internal virtual { + assertEq(uint256(a), uint256(b)); + } + + function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log("Error: a ~= b not satisfied [uint]"); + emit log_named_uint(" Left", a); + emit log_named_uint(" Right", b); + emit log_named_uint(" Max Delta", maxDelta); + emit log_named_uint(" Delta", delta); + fail(); + } + } + + function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log_named_string("Error", err); + assertApproxEqAbs(a, b, maxDelta); + } + } + + function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log("Error: a ~= b not satisfied [uint]"); + emit log_named_decimal_uint(" Left", a, decimals); + emit log_named_decimal_uint(" Right", b, decimals); + emit log_named_decimal_uint(" Max Delta", maxDelta, decimals); + emit log_named_decimal_uint(" Delta", delta, decimals); + fail(); + } + } + + function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, string memory err) + internal + virtual + { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log_named_string("Error", err); + assertApproxEqAbsDecimal(a, b, maxDelta, decimals); + } + } + + function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log("Error: a ~= b not satisfied [int]"); + emit log_named_int(" Left", a); + emit log_named_int(" Right", b); + emit log_named_uint(" Max Delta", maxDelta); + emit log_named_uint(" Delta", delta); + fail(); + } + } + + function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log_named_string("Error", err); + assertApproxEqAbs(a, b, maxDelta); + } + } + + function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log("Error: a ~= b not satisfied [int]"); + emit log_named_decimal_int(" Left", a, decimals); + emit log_named_decimal_int(" Right", b, decimals); + emit log_named_decimal_uint(" Max Delta", maxDelta, decimals); + emit log_named_decimal_uint(" Delta", delta, decimals); + fail(); + } + } + + function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, string memory err) + internal + virtual + { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log_named_string("Error", err); + assertApproxEqAbsDecimal(a, b, maxDelta, decimals); + } + } + + function assertApproxEqRel( + uint256 a, + uint256 b, + uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100% + ) internal virtual { + if (b == 0) return assertEq(a, b); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log("Error: a ~= b not satisfied [uint]"); + emit log_named_uint(" Left", a); + emit log_named_uint(" Right", b); + emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18); + emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18); + fail(); + } + } + + function assertApproxEqRel( + uint256 a, + uint256 b, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + string memory err + ) internal virtual { + if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log_named_string("Error", err); + assertApproxEqRel(a, b, maxPercentDelta); + } + } + + function assertApproxEqRelDecimal( + uint256 a, + uint256 b, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals + ) internal virtual { + if (b == 0) return assertEq(a, b); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log("Error: a ~= b not satisfied [uint]"); + emit log_named_decimal_uint(" Left", a, decimals); + emit log_named_decimal_uint(" Right", b, decimals); + emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18); + emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18); + fail(); + } + } + + function assertApproxEqRelDecimal( + uint256 a, + uint256 b, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals, + string memory err + ) internal virtual { + if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log_named_string("Error", err); + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); + } + } + + function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta) internal virtual { + if (b == 0) return assertEq(a, b); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log("Error: a ~= b not satisfied [int]"); + emit log_named_int(" Left", a); + emit log_named_int(" Right", b); + emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18); + emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18); + fail(); + } + } + + function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err) internal virtual { + if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log_named_string("Error", err); + assertApproxEqRel(a, b, maxPercentDelta); + } + } + + function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals) internal virtual { + if (b == 0) return assertEq(a, b); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log("Error: a ~= b not satisfied [int]"); + emit log_named_decimal_int(" Left", a, decimals); + emit log_named_decimal_int(" Right", b, decimals); + emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18); + emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18); + fail(); + } + } + + function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, string memory err) + internal + virtual + { + if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log_named_string("Error", err); + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); + } + } + + function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual { + assertEqCall(target, callDataA, target, callDataB, true); + } + + function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB) + internal + virtual + { + assertEqCall(targetA, callDataA, targetB, callDataB, true); + } + + function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData) + internal + virtual + { + assertEqCall(target, callDataA, target, callDataB, strictRevertData); + } + + function assertEqCall( + address targetA, + bytes memory callDataA, + address targetB, + bytes memory callDataB, + bool strictRevertData + ) internal virtual { + (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA); + (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB); + + if (successA && successB) { + assertEq(returnDataA, returnDataB, "Call return data does not match"); + } + + if (!successA && !successB && strictRevertData) { + assertEq(returnDataA, returnDataB, "Call revert data does not match"); + } + + if (!successA && successB) { + emit log("Error: Calls were not equal"); + emit log_named_bytes(" Left call revert data", returnDataA); + emit log_named_bytes(" Right call return data", returnDataB); + fail(); + } + + if (successA && !successB) { + emit log("Error: Calls were not equal"); + emit log_named_bytes(" Left call return data", returnDataA); + emit log_named_bytes(" Right call revert data", returnDataB); + fail(); + } + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdChains.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdChains.sol new file mode 100644 index 000000000..79a88d09a --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdChains.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {VmSafe} from "./Vm.sol"; + +/** + * StdChains provides information about EVM compatible chains that can be used in scripts/tests. + * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are + * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of + * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the + * alias used in this contract, which can be found as the first argument to the + * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. + * + * There are two main ways to use this contract: + * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or + * `setChain(string memory chainAlias, Chain memory chain)` + * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. + * + * The first time either of those are used, chains are initialized with the default set of RPC URLs. + * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in + * `defaultRpcUrls`. + * + * The `setChain` function is straightforward, and it simply saves off the given chain data. + * + * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say + * we want to retrieve the RPC URL for `mainnet`: + * - If you have specified data with `setChain`, it will return that. + * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it + * is valid (e.g. a URL is specified, or an environment variable is given and exists). + * - If neither of the above conditions is met, the default data is returned. + * + * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults. + */ +abstract contract StdChains { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + bool private stdChainsInitialized; + + struct ChainData { + string name; + uint256 chainId; + string rpcUrl; + } + + struct Chain { + // The chain name. + string name; + // The chain's Chain ID. + uint256 chainId; + // The chain's alias. (i.e. what gets specified in `foundry.toml`). + string chainAlias; + // A default RPC endpoint for this chain. + // NOTE: This default RPC URL is included for convenience to facilitate quick tests and + // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy + // usage as you will be throttled and this is a disservice to others who need this endpoint. + string rpcUrl; + } + + // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data. + mapping(string => Chain) private chains; + // Maps from the chain's alias to it's default RPC URL. + mapping(string => string) private defaultRpcUrls; + // Maps from a chain ID to it's alias. + mapping(uint256 => string) private idToAlias; + + bool private fallbackToDefaultRpcUrls = true; + + // The RPC URL will be fetched from config or defaultRpcUrls if possible. + function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) { + require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string."); + + initializeStdChains(); + chain = chains[chainAlias]; + require( + chain.chainId != 0, + string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found.")) + ); + + chain = getChainWithUpdatedRpcUrl(chainAlias, chain); + } + + function getChain(uint256 chainId) internal virtual returns (Chain memory chain) { + require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0."); + initializeStdChains(); + string memory chainAlias = idToAlias[chainId]; + + chain = chains[chainAlias]; + + require( + chain.chainId != 0, + string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found.")) + ); + + chain = getChainWithUpdatedRpcUrl(chainAlias, chain); + } + + // set chain info, with priority to argument's rpcUrl field. + function setChain(string memory chainAlias, ChainData memory chain) internal virtual { + require( + bytes(chainAlias).length != 0, + "StdChains setChain(string,ChainData): Chain alias cannot be the empty string." + ); + + require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0."); + + initializeStdChains(); + string memory foundAlias = idToAlias[chain.chainId]; + + require( + bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)), + string( + abi.encodePacked( + "StdChains setChain(string,ChainData): Chain ID ", + vm.toString(chain.chainId), + " already used by \"", + foundAlias, + "\"." + ) + ) + ); + + uint256 oldChainId = chains[chainAlias].chainId; + delete idToAlias[oldChainId]; + + chains[chainAlias] = + Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl}); + idToAlias[chain.chainId] = chainAlias; + } + + // set chain info, with priority to argument's rpcUrl field. + function setChain(string memory chainAlias, Chain memory chain) internal virtual { + setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl})); + } + + function _toUpper(string memory str) private pure returns (string memory) { + bytes memory strb = bytes(str); + bytes memory copy = new bytes(strb.length); + for (uint256 i = 0; i < strb.length; i++) { + bytes1 b = strb[i]; + if (b >= 0x61 && b <= 0x7A) { + copy[i] = bytes1(uint8(b) - 32); + } else { + copy[i] = b; + } + } + return string(copy); + } + + // lookup rpcUrl, in descending order of priority: + // current -> config (foundry.toml) -> environment variable -> default + function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) private returns (Chain memory) { + if (bytes(chain.rpcUrl).length == 0) { + try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) { + chain.rpcUrl = configRpcUrl; + } catch (bytes memory err) { + string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL")); + if (fallbackToDefaultRpcUrls) { + chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]); + } else { + chain.rpcUrl = vm.envString(envName); + } + // distinguish 'not found' from 'cannot read' + bytes memory notFoundError = + abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias))); + if (keccak256(notFoundError) != keccak256(err) || bytes(chain.rpcUrl).length == 0) { + /// @solidity memory-safe-assembly + assembly { + revert(add(32, err), mload(err)) + } + } + } + } + return chain; + } + + function setFallbackToDefaultRpcUrls(bool useDefault) internal { + fallbackToDefaultRpcUrls = useDefault; + } + + function initializeStdChains() private { + if (stdChainsInitialized) return; + + stdChainsInitialized = true; + + // If adding an RPC here, make sure to test the default RPC URL in `testRpcs` + setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545")); + setChainWithDefaultRpcUrl( + "mainnet", ChainData("Mainnet", 1, "https://mainnet.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") + ); + setChainWithDefaultRpcUrl( + "goerli", ChainData("Goerli", 5, "https://goerli.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") + ); + setChainWithDefaultRpcUrl( + "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") + ); + setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io")); + setChainWithDefaultRpcUrl("optimism_goerli", ChainData("Optimism Goerli", 420, "https://goerli.optimism.io")); + setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc")); + setChainWithDefaultRpcUrl( + "arbitrum_one_goerli", ChainData("Arbitrum One Goerli", 421613, "https://goerli-rollup.arbitrum.io/rpc") + ); + setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc")); + setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com")); + setChainWithDefaultRpcUrl( + "polygon_mumbai", ChainData("Polygon Mumbai", 80001, "https://rpc-mumbai.maticvigil.com") + ); + setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc")); + setChainWithDefaultRpcUrl( + "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc") + ); + setChainWithDefaultRpcUrl( + "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org") + ); + setChainWithDefaultRpcUrl( + "bnb_smart_chain_testnet", + ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel") + ); + setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com")); + setChainWithDefaultRpcUrl("moonbeam", ChainData("Moonbeam", 1284, "https://rpc.api.moonbeam.network")); + setChainWithDefaultRpcUrl( + "moonriver", ChainData("Moonriver", 1285, "https://rpc.api.moonriver.moonbeam.network") + ); + setChainWithDefaultRpcUrl("moonbase", ChainData("Moonbase", 1287, "https://rpc.testnet.moonbeam.network")); + } + + // set chain info, with priority to chainAlias' rpc url in foundry.toml + function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private { + string memory rpcUrl = chain.rpcUrl; + defaultRpcUrls[chainAlias] = rpcUrl; + chain.rpcUrl = ""; + setChain(chainAlias, chain); + chain.rpcUrl = rpcUrl; // restore argument + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdCheats.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdCheats.sol new file mode 100644 index 000000000..008b74314 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdCheats.sol @@ -0,0 +1,817 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {StdStorage, stdStorage} from "./StdStorage.sol"; +import {console2} from "./console2.sol"; +import {Vm} from "./Vm.sol"; + +abstract contract StdCheatsSafe { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + uint256 private constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + bool private gasMeteringOff; + + // Data structures to parse Transaction objects from the broadcast artifact + // that conform to EIP1559. The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct RawTx1559 { + string[] arguments; + address contractAddress; + string contractName; + // json value name = function + string functionSig; + bytes32 hash; + // json value name = tx + RawTx1559Detail txDetail; + // json value name = type + string opcode; + } + + struct RawTx1559Detail { + AccessList[] accessList; + bytes data; + address from; + bytes gas; + bytes nonce; + address to; + bytes txType; + bytes value; + } + + struct Tx1559 { + string[] arguments; + address contractAddress; + string contractName; + string functionSig; + bytes32 hash; + Tx1559Detail txDetail; + string opcode; + } + + struct Tx1559Detail { + AccessList[] accessList; + bytes data; + address from; + uint256 gas; + uint256 nonce; + address to; + uint256 txType; + uint256 value; + } + + // Data structures to parse Transaction objects from the broadcast artifact + // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct TxLegacy { + string[] arguments; + address contractAddress; + string contractName; + string functionSig; + string hash; + string opcode; + TxDetailLegacy transaction; + } + + struct TxDetailLegacy { + AccessList[] accessList; + uint256 chainId; + bytes data; + address from; + uint256 gas; + uint256 gasPrice; + bytes32 hash; + uint256 nonce; + bytes1 opcode; + bytes32 r; + bytes32 s; + uint256 txType; + address to; + uint8 v; + uint256 value; + } + + struct AccessList { + address accessAddress; + bytes32[] storageKeys; + } + + // Data structures to parse Receipt objects from the broadcast artifact. + // The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct RawReceipt { + bytes32 blockHash; + bytes blockNumber; + address contractAddress; + bytes cumulativeGasUsed; + bytes effectiveGasPrice; + address from; + bytes gasUsed; + RawReceiptLog[] logs; + bytes logsBloom; + bytes status; + address to; + bytes32 transactionHash; + bytes transactionIndex; + } + + struct Receipt { + bytes32 blockHash; + uint256 blockNumber; + address contractAddress; + uint256 cumulativeGasUsed; + uint256 effectiveGasPrice; + address from; + uint256 gasUsed; + ReceiptLog[] logs; + bytes logsBloom; + uint256 status; + address to; + bytes32 transactionHash; + uint256 transactionIndex; + } + + // Data structures to parse the entire broadcast artifact, assuming the + // transactions conform to EIP1559. + + struct EIP1559ScriptArtifact { + string[] libraries; + string path; + string[] pending; + Receipt[] receipts; + uint256 timestamp; + Tx1559[] transactions; + TxReturn[] txReturns; + } + + struct RawEIP1559ScriptArtifact { + string[] libraries; + string path; + string[] pending; + RawReceipt[] receipts; + TxReturn[] txReturns; + uint256 timestamp; + RawTx1559[] transactions; + } + + struct RawReceiptLog { + // json value = address + address logAddress; + bytes32 blockHash; + bytes blockNumber; + bytes data; + bytes logIndex; + bool removed; + bytes32[] topics; + bytes32 transactionHash; + bytes transactionIndex; + bytes transactionLogIndex; + } + + struct ReceiptLog { + // json value = address + address logAddress; + bytes32 blockHash; + uint256 blockNumber; + bytes data; + uint256 logIndex; + bytes32[] topics; + uint256 transactionIndex; + uint256 transactionLogIndex; + bool removed; + } + + struct TxReturn { + string internalType; + string value; + } + + struct Account { + address addr; + uint256 key; + } + + enum AddressType { + Payable, + NonPayable, + ZeroAddress, + Precompile, + ForgeAddress + } + + // Checks that `addr` is not blacklisted by token contracts that have a blacklist. + function assumeNotBlacklisted(address token, address addr) internal view virtual { + // Nothing to check if `token` is not a contract. + uint256 tokenCodeSize; + assembly { + tokenCodeSize := extcodesize(token) + } + require(tokenCodeSize > 0, "StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); + + bool success; + bytes memory returnData; + + // 4-byte selector for `isBlacklisted(address)`, used by USDC. + (success, returnData) = token.staticcall(abi.encodeWithSelector(0xfe575a87, addr)); + vm.assume(!success || abi.decode(returnData, (bool)) == false); + + // 4-byte selector for `isBlackListed(address)`, used by USDT. + (success, returnData) = token.staticcall(abi.encodeWithSelector(0xe47d6060, addr)); + vm.assume(!success || abi.decode(returnData, (bool)) == false); + } + + // Checks that `addr` is not blacklisted by token contracts that have a blacklist. + // This is identical to `assumeNotBlacklisted(address,address)` but with a different name, for + // backwards compatibility, since this name was used in the original PR which has already has + // a release. This function can be removed in a future release once we want a breaking change. + function assumeNoBlacklisted(address token, address addr) internal view virtual { + assumeNotBlacklisted(token, addr); + } + + function assumeAddressIsNot(address addr, AddressType addressType) internal virtual { + if (addressType == AddressType.Payable) { + assumeNotPayable(addr); + } else if (addressType == AddressType.NonPayable) { + assumePayable(addr); + } else if (addressType == AddressType.ZeroAddress) { + assumeNotZeroAddress(addr); + } else if (addressType == AddressType.Precompile) { + assumeNotPrecompile(addr); + } else if (addressType == AddressType.ForgeAddress) { + assumeNotForgeAddress(addr); + } + } + + function assumeAddressIsNot(address addr, AddressType addressType1, AddressType addressType2) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + } + + function assumeAddressIsNot( + address addr, + AddressType addressType1, + AddressType addressType2, + AddressType addressType3 + ) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + assumeAddressIsNot(addr, addressType3); + } + + function assumeAddressIsNot( + address addr, + AddressType addressType1, + AddressType addressType2, + AddressType addressType3, + AddressType addressType4 + ) internal virtual { + assumeAddressIsNot(addr, addressType1); + assumeAddressIsNot(addr, addressType2); + assumeAddressIsNot(addr, addressType3); + assumeAddressIsNot(addr, addressType4); + } + + // This function checks whether an address, `addr`, is payable. It works by sending 1 wei to + // `addr` and checking the `success` return value. + // NOTE: This function may result in state changes depending on the fallback/receive logic + // implemented by `addr`, which should be taken into account when this function is used. + function _isPayable(address addr) private returns (bool) { + require( + addr.balance < UINT256_MAX, + "StdCheats _isPayable(address): Balance equals max uint256, so it cannot receive any more funds" + ); + uint256 origBalanceTest = address(this).balance; + uint256 origBalanceAddr = address(addr).balance; + + vm.deal(address(this), 1); + (bool success,) = payable(addr).call{value: 1}(""); + + // reset balances + vm.deal(address(this), origBalanceTest); + vm.deal(addr, origBalanceAddr); + + return success; + } + + // NOTE: This function may result in state changes depending on the fallback/receive logic + // implemented by `addr`, which should be taken into account when this function is used. See the + // `_isPayable` method for more information. + function assumePayable(address addr) internal virtual { + vm.assume(_isPayable(addr)); + } + + function assumeNotPayable(address addr) internal virtual { + vm.assume(!_isPayable(addr)); + } + + function assumeNotZeroAddress(address addr) internal pure virtual { + vm.assume(addr != address(0)); + } + + function assumeNotPrecompile(address addr) internal pure virtual { + assumeNotPrecompile(addr, _pureChainId()); + } + + function assumeNotPrecompile(address addr, uint256 chainId) internal pure virtual { + // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific + // address), but the same rationale for excluding them applies so we include those too. + + // These should be present on all EVM-compatible chains. + vm.assume(addr < address(0x1) || addr > address(0x9)); + + // forgefmt: disable-start + if (chainId == 10 || chainId == 420) { + // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21 + vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800)); + } else if (chainId == 42161 || chainId == 421613) { + // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains + vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068)); + } else if (chainId == 43114 || chainId == 43113) { + // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59 + vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff)); + vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF)); + vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff)); + } + // forgefmt: disable-end + } + + function assumeNotForgeAddress(address addr) internal pure virtual { + // vm, console, and Create2Deployer addresses + vm.assume( + addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 + && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C + ); + } + + function readEIP1559ScriptArtifact(string memory path) + internal + view + virtual + returns (EIP1559ScriptArtifact memory) + { + string memory data = vm.readFile(path); + bytes memory parsedData = vm.parseJson(data); + RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact)); + EIP1559ScriptArtifact memory artifact; + artifact.libraries = rawArtifact.libraries; + artifact.path = rawArtifact.path; + artifact.timestamp = rawArtifact.timestamp; + artifact.pending = rawArtifact.pending; + artifact.txReturns = rawArtifact.txReturns; + artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts); + artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions); + return artifact; + } + + function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) { + Tx1559[] memory txs = new Tx1559[](rawTxs.length); + for (uint256 i; i < rawTxs.length; i++) { + txs[i] = rawToConvertedEIPTx1559(rawTxs[i]); + } + return txs; + } + + function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) { + Tx1559 memory transaction; + transaction.arguments = rawTx.arguments; + transaction.contractName = rawTx.contractName; + transaction.functionSig = rawTx.functionSig; + transaction.hash = rawTx.hash; + transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail); + transaction.opcode = rawTx.opcode; + return transaction; + } + + function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail) + internal + pure + virtual + returns (Tx1559Detail memory) + { + Tx1559Detail memory txDetail; + txDetail.data = rawDetail.data; + txDetail.from = rawDetail.from; + txDetail.to = rawDetail.to; + txDetail.nonce = _bytesToUint(rawDetail.nonce); + txDetail.txType = _bytesToUint(rawDetail.txType); + txDetail.value = _bytesToUint(rawDetail.value); + txDetail.gas = _bytesToUint(rawDetail.gas); + txDetail.accessList = rawDetail.accessList; + return txDetail; + } + + function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) { + string memory deployData = vm.readFile(path); + bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions"); + RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[])); + return rawToConvertedEIPTx1559s(rawTxs); + } + + function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) { + string memory deployData = vm.readFile(path); + string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]")); + bytes memory parsedDeployData = vm.parseJson(deployData, key); + RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559)); + return rawToConvertedEIPTx1559(rawTx); + } + + // Analogous to readTransactions, but for receipts. + function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) { + string memory deployData = vm.readFile(path); + bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts"); + RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[])); + return rawToConvertedReceipts(rawReceipts); + } + + function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) { + string memory deployData = vm.readFile(path); + string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]")); + bytes memory parsedDeployData = vm.parseJson(deployData, key); + RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt)); + return rawToConvertedReceipt(rawReceipt); + } + + function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) { + Receipt[] memory receipts = new Receipt[](rawReceipts.length); + for (uint256 i; i < rawReceipts.length; i++) { + receipts[i] = rawToConvertedReceipt(rawReceipts[i]); + } + return receipts; + } + + function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) { + Receipt memory receipt; + receipt.blockHash = rawReceipt.blockHash; + receipt.to = rawReceipt.to; + receipt.from = rawReceipt.from; + receipt.contractAddress = rawReceipt.contractAddress; + receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice); + receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed); + receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed); + receipt.status = _bytesToUint(rawReceipt.status); + receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex); + receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber); + receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs); + receipt.logsBloom = rawReceipt.logsBloom; + receipt.transactionHash = rawReceipt.transactionHash; + return receipt; + } + + function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs) + internal + pure + virtual + returns (ReceiptLog[] memory) + { + ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length); + for (uint256 i; i < rawLogs.length; i++) { + logs[i].logAddress = rawLogs[i].logAddress; + logs[i].blockHash = rawLogs[i].blockHash; + logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber); + logs[i].data = rawLogs[i].data; + logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex); + logs[i].topics = rawLogs[i].topics; + logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex); + logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex); + logs[i].removed = rawLogs[i].removed; + } + return logs; + } + + // Deploy a contract by fetching the contract bytecode from + // the artifacts directory + // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))` + function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) { + bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); + /// @solidity memory-safe-assembly + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed."); + } + + function deployCode(string memory what) internal virtual returns (address addr) { + bytes memory bytecode = vm.getCode(what); + /// @solidity memory-safe-assembly + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string): Deployment failed."); + } + + /// @dev deploy contract with value on construction + function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) { + bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); + /// @solidity memory-safe-assembly + assembly { + addr := create(val, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed."); + } + + function deployCode(string memory what, uint256 val) internal virtual returns (address addr) { + bytes memory bytecode = vm.getCode(what); + /// @solidity memory-safe-assembly + assembly { + addr := create(val, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed."); + } + + // creates a labeled address and the corresponding private key + function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) { + privateKey = uint256(keccak256(abi.encodePacked(name))); + addr = vm.addr(privateKey); + vm.label(addr, name); + } + + // creates a labeled address + function makeAddr(string memory name) internal virtual returns (address addr) { + (addr,) = makeAddrAndKey(name); + } + + // Destroys an account immediately, sending the balance to beneficiary. + // Destroying means: balance will be zero, code will be empty, and nonce will be 0 + // This is similar to selfdestruct but not identical: selfdestruct destroys code and nonce + // only after tx ends, this will run immediately. + function destroyAccount(address who, address beneficiary) internal virtual { + uint256 currBalance = who.balance; + vm.etch(who, abi.encode()); + vm.deal(who, 0); + vm.resetNonce(who); + + uint256 beneficiaryBalance = beneficiary.balance; + vm.deal(beneficiary, currBalance + beneficiaryBalance); + } + + // creates a struct containing both a labeled address and the corresponding private key + function makeAccount(string memory name) internal virtual returns (Account memory account) { + (account.addr, account.key) = makeAddrAndKey(name); + } + + function deriveRememberKey(string memory mnemonic, uint32 index) + internal + virtual + returns (address who, uint256 privateKey) + { + privateKey = vm.deriveKey(mnemonic, index); + who = vm.rememberKey(privateKey); + } + + function _bytesToUint(bytes memory b) private pure returns (uint256) { + require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32."); + return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); + } + + function isFork() internal view virtual returns (bool status) { + try vm.activeFork() { + status = true; + } catch (bytes memory) {} + } + + modifier skipWhenForking() { + if (!isFork()) { + _; + } + } + + modifier skipWhenNotForking() { + if (isFork()) { + _; + } + } + + modifier noGasMetering() { + vm.pauseGasMetering(); + // To prevent turning gas monitoring back on with nested functions that use this modifier, + // we check if gasMetering started in the off position. If it did, we don't want to turn + // it back on until we exit the top level function that used the modifier + // + // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well. + // funcA will have `gasStartedOff` as false, funcB will have it as true, + // so we only turn metering back on at the end of the funcA + bool gasStartedOff = gasMeteringOff; + gasMeteringOff = true; + + _; + + // if gas metering was on when this modifier was called, turn it back on at the end + if (!gasStartedOff) { + gasMeteringOff = false; + vm.resumeGasMetering(); + } + } + + // We use this complex approach of `_viewChainId` and `_pureChainId` to ensure there are no + // compiler warnings when accessing chain ID in any solidity version supported by forge-std. We + // can't simply access the chain ID in a normal view or pure function because the solc View Pure + // Checker changed `chainid` from pure to view in 0.8.0. + function _viewChainId() private view returns (uint256 chainId) { + // Assembly required since `block.chainid` was introduced in 0.8.0. + assembly { + chainId := chainid() + } + + address(this); // Silence warnings in older Solc versions. + } + + function _pureChainId() private pure returns (uint256 chainId) { + function() internal view returns (uint256) fnIn = _viewChainId; + function() internal pure returns (uint256) pureChainId; + assembly { + pureChainId := fnIn + } + chainId = pureChainId(); + } +} + +// Wrappers around cheatcodes to avoid footguns +abstract contract StdCheats is StdCheatsSafe { + using stdStorage for StdStorage; + + StdStorage private stdstore; + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; + + // Skip forward or rewind time by the specified number of seconds + function skip(uint256 time) internal virtual { + vm.warp(block.timestamp + time); + } + + function rewind(uint256 time) internal virtual { + vm.warp(block.timestamp - time); + } + + // Setup a prank from an address that has some ether + function hoax(address msgSender) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.prank(msgSender); + } + + function hoax(address msgSender, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.prank(msgSender); + } + + function hoax(address msgSender, address origin) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.prank(msgSender, origin); + } + + function hoax(address msgSender, address origin, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.prank(msgSender, origin); + } + + // Start perpetual prank from an address that has some ether + function startHoax(address msgSender) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.startPrank(msgSender); + } + + function startHoax(address msgSender, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.startPrank(msgSender); + } + + // Start perpetual prank from an address that has some ether + // tx.origin is set to the origin parameter + function startHoax(address msgSender, address origin) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.startPrank(msgSender, origin); + } + + function startHoax(address msgSender, address origin, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.startPrank(msgSender, origin); + } + + function changePrank(address msgSender) internal virtual { + console2_log("changePrank is deprecated. Please use vm.startPrank instead."); + vm.stopPrank(); + vm.startPrank(msgSender); + } + + function changePrank(address msgSender, address txOrigin) internal virtual { + vm.stopPrank(); + vm.startPrank(msgSender, txOrigin); + } + + // The same as Vm's `deal` + // Use the alternative signature for ERC20 tokens + function deal(address to, uint256 give) internal virtual { + vm.deal(to, give); + } + + // Set the balance of an account for any ERC20 token + // Use the alternative signature to update `totalSupply` + function deal(address token, address to, uint256 give) internal virtual { + deal(token, to, give, false); + } + + // Set the balance of an account for any ERC1155 token + // Use the alternative signature to update `totalSupply` + function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual { + dealERC1155(token, to, id, give, false); + } + + function deal(address token, address to, uint256 give, bool adjust) internal virtual { + // get current balance + (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); + uint256 prevBal = abi.decode(balData, (uint256)); + + // update balance + stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give); + + // update total supply + if (adjust) { + (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0x18160ddd)); + uint256 totSup = abi.decode(totSupData, (uint256)); + if (give < prevBal) { + totSup -= (prevBal - give); + } else { + totSup += (give - prevBal); + } + stdstore.target(token).sig(0x18160ddd).checked_write(totSup); + } + } + + function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual { + // get current balance + (, bytes memory balData) = token.staticcall(abi.encodeWithSelector(0x00fdd58e, to, id)); + uint256 prevBal = abi.decode(balData, (uint256)); + + // update balance + stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give); + + // update total supply + if (adjust) { + (, bytes memory totSupData) = token.staticcall(abi.encodeWithSelector(0xbd85b039, id)); + require( + totSupData.length != 0, + "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply." + ); + uint256 totSup = abi.decode(totSupData, (uint256)); + if (give < prevBal) { + totSup -= (prevBal - give); + } else { + totSup += (give - prevBal); + } + stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup); + } + } + + function dealERC721(address token, address to, uint256 id) internal virtual { + // check if token id is already minted and the actual owner. + (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id)); + require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted."); + + // get owner current balance + (, bytes memory fromBalData) = + token.staticcall(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address)))); + uint256 fromPrevBal = abi.decode(fromBalData, (uint256)); + + // get new user current balance + (, bytes memory toBalData) = token.staticcall(abi.encodeWithSelector(0x70a08231, to)); + uint256 toPrevBal = abi.decode(toBalData, (uint256)); + + // update balances + stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal); + stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal); + + // update owner + stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to); + } + + function deployCodeTo(string memory what, address where) internal virtual { + deployCodeTo(what, "", 0, where); + } + + function deployCodeTo(string memory what, bytes memory args, address where) internal virtual { + deployCodeTo(what, args, 0, where); + } + + function deployCodeTo(string memory what, bytes memory args, uint256 value, address where) internal virtual { + bytes memory creationCode = vm.getCode(what); + vm.etch(where, abi.encodePacked(creationCode, args)); + (bool success, bytes memory runtimeBytecode) = where.call{value: value}(""); + require(success, "StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); + vm.etch(where, runtimeBytecode); + } + + // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. + function console2_log(string memory p0) private view { + (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string)", p0)); + status; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdError.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdError.sol new file mode 100644 index 000000000..a302191fa --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdError.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test +pragma solidity >=0.6.2 <0.9.0; + +library stdError { + bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01); + bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11); + bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12); + bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21); + bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22); + bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31); + bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32); + bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41); + bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdInvariant.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdInvariant.sol new file mode 100644 index 000000000..fd9d0a1db --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdInvariant.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +abstract contract StdInvariant { + struct FuzzSelector { + address addr; + bytes4[] selectors; + } + + address[] private _excludedContracts; + address[] private _excludedSenders; + address[] private _targetedContracts; + address[] private _targetedSenders; + + string[] private _excludedArtifacts; + string[] private _targetedArtifacts; + + FuzzSelector[] private _targetedArtifactSelectors; + FuzzSelector[] private _targetedSelectors; + + // Functions for users: + // These are intended to be called in tests. + + function excludeContract(address newExcludedContract_) internal { + _excludedContracts.push(newExcludedContract_); + } + + function excludeSender(address newExcludedSender_) internal { + _excludedSenders.push(newExcludedSender_); + } + + function excludeArtifact(string memory newExcludedArtifact_) internal { + _excludedArtifacts.push(newExcludedArtifact_); + } + + function targetArtifact(string memory newTargetedArtifact_) internal { + _targetedArtifacts.push(newTargetedArtifact_); + } + + function targetArtifactSelector(FuzzSelector memory newTargetedArtifactSelector_) internal { + _targetedArtifactSelectors.push(newTargetedArtifactSelector_); + } + + function targetContract(address newTargetedContract_) internal { + _targetedContracts.push(newTargetedContract_); + } + + function targetSelector(FuzzSelector memory newTargetedSelector_) internal { + _targetedSelectors.push(newTargetedSelector_); + } + + function targetSender(address newTargetedSender_) internal { + _targetedSenders.push(newTargetedSender_); + } + + // Functions for forge: + // These are called by forge to run invariant tests and don't need to be called in tests. + + function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) { + excludedArtifacts_ = _excludedArtifacts; + } + + function excludeContracts() public view returns (address[] memory excludedContracts_) { + excludedContracts_ = _excludedContracts; + } + + function excludeSenders() public view returns (address[] memory excludedSenders_) { + excludedSenders_ = _excludedSenders; + } + + function targetArtifacts() public view returns (string[] memory targetedArtifacts_) { + targetedArtifacts_ = _targetedArtifacts; + } + + function targetArtifactSelectors() public view returns (FuzzSelector[] memory targetedArtifactSelectors_) { + targetedArtifactSelectors_ = _targetedArtifactSelectors; + } + + function targetContracts() public view returns (address[] memory targetedContracts_) { + targetedContracts_ = _targetedContracts; + } + + function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) { + targetedSelectors_ = _targetedSelectors; + } + + function targetSenders() public view returns (address[] memory targetedSenders_) { + targetedSenders_ = _targetedSenders; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdJson.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdJson.sol new file mode 100644 index 000000000..014e6b15e --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdJson.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {VmSafe} from "./Vm.sol"; + +// Helpers for parsing and writing JSON files +// To parse: +// ``` +// using stdJson for string; +// string memory json = vm.readFile("some_peth"); +// json.parseUint(""); +// ``` +// To write: +// ``` +// using stdJson for string; +// string memory json = "deploymentArtifact"; +// Contract contract = new Contract(); +// json.serialize("contractAddress", address(contract)); +// json = json.serialize("deploymentTimes", uint(1)); +// // store the stringified JSON to the 'json' variable we have been using as a key +// // as we won't need it any longer +// string memory json2 = "finalArtifact"; +// string memory final = json2.serialize("depArtifact", json); +// final.write(""); +// ``` + +library stdJson { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) { + return vm.parseJson(json, key); + } + + function readUint(string memory json, string memory key) internal returns (uint256) { + return vm.parseJsonUint(json, key); + } + + function readUintArray(string memory json, string memory key) internal returns (uint256[] memory) { + return vm.parseJsonUintArray(json, key); + } + + function readInt(string memory json, string memory key) internal returns (int256) { + return vm.parseJsonInt(json, key); + } + + function readIntArray(string memory json, string memory key) internal returns (int256[] memory) { + return vm.parseJsonIntArray(json, key); + } + + function readBytes32(string memory json, string memory key) internal returns (bytes32) { + return vm.parseJsonBytes32(json, key); + } + + function readBytes32Array(string memory json, string memory key) internal returns (bytes32[] memory) { + return vm.parseJsonBytes32Array(json, key); + } + + function readString(string memory json, string memory key) internal returns (string memory) { + return vm.parseJsonString(json, key); + } + + function readStringArray(string memory json, string memory key) internal returns (string[] memory) { + return vm.parseJsonStringArray(json, key); + } + + function readAddress(string memory json, string memory key) internal returns (address) { + return vm.parseJsonAddress(json, key); + } + + function readAddressArray(string memory json, string memory key) internal returns (address[] memory) { + return vm.parseJsonAddressArray(json, key); + } + + function readBool(string memory json, string memory key) internal returns (bool) { + return vm.parseJsonBool(json, key); + } + + function readBoolArray(string memory json, string memory key) internal returns (bool[] memory) { + return vm.parseJsonBoolArray(json, key); + } + + function readBytes(string memory json, string memory key) internal returns (bytes memory) { + return vm.parseJsonBytes(json, key); + } + + function readBytesArray(string memory json, string memory key) internal returns (bytes[] memory) { + return vm.parseJsonBytesArray(json, key); + } + + function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bool[] memory value) + internal + returns (string memory) + { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256[] memory value) + internal + returns (string memory) + { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256[] memory value) + internal + returns (string memory) + { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address[] memory value) + internal + returns (string memory) + { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string[] memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function write(string memory jsonKey, string memory path) internal { + vm.writeJson(jsonKey, path); + } + + function write(string memory jsonKey, string memory path, string memory valueKey) internal { + vm.writeJson(jsonKey, path, valueKey); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdMath.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdMath.sol new file mode 100644 index 000000000..459523bda --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdMath.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +library stdMath { + int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968; + + function abs(int256 a) internal pure returns (uint256) { + // Required or it will fail when `a = type(int256).min` + if (a == INT256_MIN) { + return 57896044618658097711785492504343953926634992332820282019728792003956564819968; + } + + return uint256(a > 0 ? a : -a); + } + + function delta(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a - b : b - a; + } + + function delta(int256 a, int256 b) internal pure returns (uint256) { + // a and b are of the same sign + // this works thanks to two's complement, the left-most bit is the sign bit + if ((a ^ b) > -1) { + return delta(abs(a), abs(b)); + } + + // a and b are of opposite signs + return abs(a) + abs(b); + } + + function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 absDelta = delta(a, b); + + return absDelta * 1e18 / b; + } + + function percentDelta(int256 a, int256 b) internal pure returns (uint256) { + uint256 absDelta = delta(a, b); + uint256 absB = abs(b); + + return absDelta * 1e18 / absB; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdStorage.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdStorage.sol new file mode 100644 index 000000000..708db32cd --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdStorage.sol @@ -0,0 +1,331 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {Vm} from "./Vm.sol"; + +struct StdStorage { + mapping(address => mapping(bytes4 => mapping(bytes32 => uint256))) slots; + mapping(address => mapping(bytes4 => mapping(bytes32 => bool))) finds; + bytes32[] _keys; + bytes4 _sig; + uint256 _depth; + address _target; + bytes32 _set; +} + +library stdStorageSafe { + event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot); + event WARNING_UninitedSlot(address who, uint256 slot); + + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function sigs(string memory sigStr) internal pure returns (bytes4) { + return bytes4(keccak256(bytes(sigStr))); + } + + /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against + // slot complexity: + // if flat, will be bytes32(uint256(uint)); + // if map, will be keccak256(abi.encode(key, uint(slot))); + // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))); + // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); + function find(StdStorage storage self) internal returns (uint256) { + address who = self._target; + bytes4 fsig = self._sig; + uint256 field_depth = self._depth; + bytes32[] memory ins = self._keys; + + // calldata to test against + if (self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]) { + return self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]; + } + bytes memory cald = abi.encodePacked(fsig, flatten(ins)); + vm.record(); + bytes32 fdat; + { + (, bytes memory rdat) = who.staticcall(cald); + fdat = bytesToBytes32(rdat, 32 * field_depth); + } + + (bytes32[] memory reads,) = vm.accesses(address(who)); + if (reads.length == 1) { + bytes32 curr = vm.load(who, reads[0]); + if (curr == bytes32(0)) { + emit WARNING_UninitedSlot(who, uint256(reads[0])); + } + if (fdat != curr) { + require( + false, + "stdStorage find(StdStorage): Packed slot. This would cause dangerous overwriting and currently isn't supported." + ); + } + emit SlotFound(who, fsig, keccak256(abi.encodePacked(ins, field_depth)), uint256(reads[0])); + self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = uint256(reads[0]); + self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = true; + } else if (reads.length > 1) { + for (uint256 i = 0; i < reads.length; i++) { + bytes32 prev = vm.load(who, reads[i]); + if (prev == bytes32(0)) { + emit WARNING_UninitedSlot(who, uint256(reads[i])); + } + // store + vm.store(who, reads[i], bytes32(hex"1337")); + bool success; + bytes memory rdat; + { + (success, rdat) = who.staticcall(cald); + fdat = bytesToBytes32(rdat, 32 * field_depth); + } + + if (success && fdat == bytes32(hex"1337")) { + // we found which of the slots is the actual one + emit SlotFound(who, fsig, keccak256(abi.encodePacked(ins, field_depth)), uint256(reads[i])); + self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = uint256(reads[i]); + self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = true; + vm.store(who, reads[i], prev); + break; + } + vm.store(who, reads[i], prev); + } + } else { + revert("stdStorage find(StdStorage): No storage use detected for target."); + } + + require( + self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))], + "stdStorage find(StdStorage): Slot(s) not found." + ); + + delete self._target; + delete self._sig; + delete self._keys; + delete self._depth; + + return self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]; + } + + function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { + self._target = _target; + return self; + } + + function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { + self._sig = _sig; + return self; + } + + function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { + self._sig = sigs(_sig); + return self; + } + + function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { + self._keys.push(bytes32(uint256(uint160(who)))); + return self; + } + + function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { + self._keys.push(bytes32(amt)); + return self; + } + + function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { + self._keys.push(key); + return self; + } + + function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { + self._depth = _depth; + return self; + } + + function read(StdStorage storage self) private returns (bytes memory) { + address t = self._target; + uint256 s = find(self); + return abi.encode(vm.load(t, bytes32(s))); + } + + function read_bytes32(StdStorage storage self) internal returns (bytes32) { + return abi.decode(read(self), (bytes32)); + } + + function read_bool(StdStorage storage self) internal returns (bool) { + int256 v = read_int(self); + if (v == 0) return false; + if (v == 1) return true; + revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); + } + + function read_address(StdStorage storage self) internal returns (address) { + return abi.decode(read(self), (address)); + } + + function read_uint(StdStorage storage self) internal returns (uint256) { + return abi.decode(read(self), (uint256)); + } + + function read_int(StdStorage storage self) internal returns (int256) { + return abi.decode(read(self), (int256)); + } + + function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { + bytes32 out; + + uint256 max = b.length > 32 ? 32 : b.length; + for (uint256 i = 0; i < max; i++) { + out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); + } + return out; + } + + function flatten(bytes32[] memory b) private pure returns (bytes memory) { + bytes memory result = new bytes(b.length * 32); + for (uint256 i = 0; i < b.length; i++) { + bytes32 k = b[i]; + /// @solidity memory-safe-assembly + assembly { + mstore(add(result, add(32, mul(32, i))), k) + } + } + + return result; + } +} + +library stdStorage { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function sigs(string memory sigStr) internal pure returns (bytes4) { + return stdStorageSafe.sigs(sigStr); + } + + function find(StdStorage storage self) internal returns (uint256) { + return stdStorageSafe.find(self); + } + + function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { + return stdStorageSafe.target(self, _target); + } + + function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { + return stdStorageSafe.sig(self, _sig); + } + + function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { + return stdStorageSafe.sig(self, _sig); + } + + function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, who); + } + + function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, amt); + } + + function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, key); + } + + function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { + return stdStorageSafe.depth(self, _depth); + } + + function checked_write(StdStorage storage self, address who) internal { + checked_write(self, bytes32(uint256(uint160(who)))); + } + + function checked_write(StdStorage storage self, uint256 amt) internal { + checked_write(self, bytes32(amt)); + } + + function checked_write_int(StdStorage storage self, int256 val) internal { + checked_write(self, bytes32(uint256(val))); + } + + function checked_write(StdStorage storage self, bool write) internal { + bytes32 t; + /// @solidity memory-safe-assembly + assembly { + t := write + } + checked_write(self, t); + } + + function checked_write(StdStorage storage self, bytes32 set) internal { + address who = self._target; + bytes4 fsig = self._sig; + uint256 field_depth = self._depth; + bytes32[] memory ins = self._keys; + + bytes memory cald = abi.encodePacked(fsig, flatten(ins)); + if (!self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]) { + find(self); + } + bytes32 slot = bytes32(self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]); + + bytes32 fdat; + { + (, bytes memory rdat) = who.staticcall(cald); + fdat = bytesToBytes32(rdat, 32 * field_depth); + } + bytes32 curr = vm.load(who, slot); + + if (fdat != curr) { + require( + false, + "stdStorage find(StdStorage): Packed slot. This would cause dangerous overwriting and currently isn't supported." + ); + } + vm.store(who, slot, set); + delete self._target; + delete self._sig; + delete self._keys; + delete self._depth; + } + + function read_bytes32(StdStorage storage self) internal returns (bytes32) { + return stdStorageSafe.read_bytes32(self); + } + + function read_bool(StdStorage storage self) internal returns (bool) { + return stdStorageSafe.read_bool(self); + } + + function read_address(StdStorage storage self) internal returns (address) { + return stdStorageSafe.read_address(self); + } + + function read_uint(StdStorage storage self) internal returns (uint256) { + return stdStorageSafe.read_uint(self); + } + + function read_int(StdStorage storage self) internal returns (int256) { + return stdStorageSafe.read_int(self); + } + + // Private function so needs to be copied over + function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { + bytes32 out; + + uint256 max = b.length > 32 ? 32 : b.length; + for (uint256 i = 0; i < max; i++) { + out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); + } + return out; + } + + // Private function so needs to be copied over + function flatten(bytes32[] memory b) private pure returns (bytes memory) { + bytes memory result = new bytes(b.length * 32); + for (uint256 i = 0; i < b.length; i++) { + bytes32 k = b[i]; + /// @solidity memory-safe-assembly + assembly { + mstore(add(result, add(32, mul(32, i))), k) + } + } + + return result; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdStyle.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdStyle.sol new file mode 100644 index 000000000..d371e0c60 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdStyle.sol @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +import {VmSafe} from "./Vm.sol"; + +library StdStyle { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + string constant RED = "\u001b[91m"; + string constant GREEN = "\u001b[92m"; + string constant YELLOW = "\u001b[93m"; + string constant BLUE = "\u001b[94m"; + string constant MAGENTA = "\u001b[95m"; + string constant CYAN = "\u001b[96m"; + string constant BOLD = "\u001b[1m"; + string constant DIM = "\u001b[2m"; + string constant ITALIC = "\u001b[3m"; + string constant UNDERLINE = "\u001b[4m"; + string constant INVERSE = "\u001b[7m"; + string constant RESET = "\u001b[0m"; + + function styleConcat(string memory style, string memory self) private pure returns (string memory) { + return string(abi.encodePacked(style, self, RESET)); + } + + function red(string memory self) internal pure returns (string memory) { + return styleConcat(RED, self); + } + + function red(uint256 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(int256 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(address self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(bool self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function redBytes(bytes memory self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function redBytes32(bytes32 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function green(string memory self) internal pure returns (string memory) { + return styleConcat(GREEN, self); + } + + function green(uint256 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(int256 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(address self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(bool self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function greenBytes(bytes memory self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function greenBytes32(bytes32 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function yellow(string memory self) internal pure returns (string memory) { + return styleConcat(YELLOW, self); + } + + function yellow(uint256 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(int256 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(address self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(bool self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellowBytes(bytes memory self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellowBytes32(bytes32 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function blue(string memory self) internal pure returns (string memory) { + return styleConcat(BLUE, self); + } + + function blue(uint256 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(int256 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(address self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(bool self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blueBytes(bytes memory self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blueBytes32(bytes32 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function magenta(string memory self) internal pure returns (string memory) { + return styleConcat(MAGENTA, self); + } + + function magenta(uint256 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(int256 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(address self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(bool self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magentaBytes(bytes memory self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magentaBytes32(bytes32 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function cyan(string memory self) internal pure returns (string memory) { + return styleConcat(CYAN, self); + } + + function cyan(uint256 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(int256 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(address self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(bool self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyanBytes(bytes memory self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyanBytes32(bytes32 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function bold(string memory self) internal pure returns (string memory) { + return styleConcat(BOLD, self); + } + + function bold(uint256 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(int256 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(address self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(bool self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function boldBytes(bytes memory self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function boldBytes32(bytes32 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function dim(string memory self) internal pure returns (string memory) { + return styleConcat(DIM, self); + } + + function dim(uint256 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(int256 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(address self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(bool self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dimBytes(bytes memory self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dimBytes32(bytes32 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function italic(string memory self) internal pure returns (string memory) { + return styleConcat(ITALIC, self); + } + + function italic(uint256 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(int256 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(address self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(bool self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italicBytes(bytes memory self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italicBytes32(bytes32 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function underline(string memory self) internal pure returns (string memory) { + return styleConcat(UNDERLINE, self); + } + + function underline(uint256 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(int256 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(address self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(bool self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underlineBytes(bytes memory self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underlineBytes32(bytes32 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function inverse(string memory self) internal pure returns (string memory) { + return styleConcat(INVERSE, self); + } + + function inverse(uint256 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(int256 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(address self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(bool self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverseBytes(bytes memory self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverseBytes32(bytes32 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdUtils.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdUtils.sol new file mode 100644 index 000000000..ad9566ecc --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/StdUtils.sol @@ -0,0 +1,198 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {IMulticall3} from "./interfaces/IMulticall3.sol"; +import {VmSafe} from "./Vm.sol"; + +abstract contract StdUtils { + /*////////////////////////////////////////////////////////////////////////// + CONSTANTS + //////////////////////////////////////////////////////////////////////////*/ + + IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; + uint256 private constant INT256_MIN_ABS = + 57896044618658097711785492504343953926634992332820282019728792003956564819968; + uint256 private constant SECP256K1_ORDER = + 115792089237316195423570985008687907852837564279074904382605163141518161494337; + uint256 private constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. + address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + + /*////////////////////////////////////////////////////////////////////////// + INTERNAL FUNCTIONS + //////////////////////////////////////////////////////////////////////////*/ + + function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { + require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min."); + // If x is between min and max, return x directly. This is to ensure that dictionary values + // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188 + if (x >= min && x <= max) return x; + + uint256 size = max - min + 1; + + // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side. + // This helps ensure coverage of the min/max values. + if (x <= 3 && size > x) return min + x; + if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x); + + // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive. + if (x > max) { + uint256 diff = x - max; + uint256 rem = diff % size; + if (rem == 0) return max; + result = min + rem - 1; + } else if (x < min) { + uint256 diff = min - x; + uint256 rem = diff % size; + if (rem == 0) return min; + result = max - rem + 1; + } + } + + function bound(uint256 x, uint256 min, uint256 max) internal view virtual returns (uint256 result) { + result = _bound(x, min, max); + console2_log("Bound Result", result); + } + + function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { + require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min."); + + // Shifting all int256 values to uint256 to use _bound function. The range of two types are: + // int256 : -(2**255) ~ (2**255 - 1) + // uint256: 0 ~ (2**256 - 1) + // So, add 2**255, INT256_MIN_ABS to the integer values. + // + // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow. + // So, use `~uint256(x) + 1` instead. + uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS); + uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS); + uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS); + + uint256 y = _bound(_x, _min, _max); + + // To move it back to int256 value, subtract INT256_MIN_ABS at here. + result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS); + } + + function bound(int256 x, int256 min, int256 max) internal view virtual returns (int256 result) { + result = _bound(x, min, max); + console2_log("Bound result", vm.toString(result)); + } + + function boundPrivateKey(uint256 privateKey) internal pure virtual returns (uint256 result) { + result = _bound(privateKey, 1, SECP256K1_ORDER - 1); + } + + function bytesToUint(bytes memory b) internal pure virtual returns (uint256) { + require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32."); + return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); + } + + /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce + /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol) + function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) { + // forgefmt: disable-start + // The integer zero is treated as an empty byte string, and as a result it only has a length prefix, 0x80, computed via 0x80 + 0. + // A one byte integer uses its own value as its length prefix, there is no additional "0x80 + length" prefix that comes before it. + if (nonce == 0x00) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, bytes1(0x80)))); + if (nonce <= 0x7f) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, uint8(nonce)))); + + // Nonces greater than 1 byte all follow a consistent encoding scheme, where each value is preceded by a prefix of 0x80 + length. + if (nonce <= 2**8 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd7), bytes1(0x94), deployer, bytes1(0x81), uint8(nonce)))); + if (nonce <= 2**16 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd8), bytes1(0x94), deployer, bytes1(0x82), uint16(nonce)))); + if (nonce <= 2**24 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd9), bytes1(0x94), deployer, bytes1(0x83), uint24(nonce)))); + // forgefmt: disable-end + + // More details about RLP encoding can be found here: https://eth.wiki/fundamentals/rlp + // 0xda = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x84 ++ nonce) + // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex) + // 0x84 = 0x80 + 0x04 (0x04 = the bytes length of the nonce, 4 bytes, in hex) + // We assume nobody can have a nonce large enough to require more than 32 bytes. + return addressFromLast20Bytes( + keccak256(abi.encodePacked(bytes1(0xda), bytes1(0x94), deployer, bytes1(0x84), uint32(nonce))) + ); + } + + function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer) + internal + pure + virtual + returns (address) + { + return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, initcodeHash))); + } + + /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer + function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) { + return computeCreate2Address(salt, initCodeHash, CREATE2_FACTORY); + } + + /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments + /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode + function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) { + return hashInitCode(creationCode, ""); + } + + /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2 + /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode + /// @param args the ABI-encoded arguments to the constructor of C + function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(creationCode, args)); + } + + // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses. + function getTokenBalances(address token, address[] memory addresses) + internal + virtual + returns (uint256[] memory balances) + { + uint256 tokenCodeSize; + assembly { + tokenCodeSize := extcodesize(token) + } + require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract."); + + // ABI encode the aggregate call to Multicall3. + uint256 length = addresses.length; + IMulticall3.Call[] memory calls = new IMulticall3.Call[](length); + for (uint256 i = 0; i < length; ++i) { + // 0x70a08231 = bytes4("balanceOf(address)")) + calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))}); + } + + // Make the aggregate call. + (, bytes[] memory returnData) = multicall.aggregate(calls); + + // ABI decode the return data and return the balances. + balances = new uint256[](length); + for (uint256 i = 0; i < length; ++i) { + balances[i] = abi.decode(returnData[i], (uint256)); + } + } + + /*////////////////////////////////////////////////////////////////////////// + PRIVATE FUNCTIONS + //////////////////////////////////////////////////////////////////////////*/ + + function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) { + return address(uint160(uint256(bytesValue))); + } + + // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. + + function console2_log(string memory p0, uint256 p1) private view { + (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string,uint256)", p0, p1)); + status; + } + + function console2_log(string memory p0, string memory p1) private view { + (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string,string)", p0, p1)); + status; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Test.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Test.sol new file mode 100644 index 000000000..743c1834d --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Test.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +// 💬 ABOUT +// Forge Std's default Test. + +// 🧩 MODULES +import {console} from "./console.sol"; +import {console2} from "./console2.sol"; +import {safeconsole} from "./safeconsole.sol"; +import {StdAssertions} from "./StdAssertions.sol"; +import {StdChains} from "./StdChains.sol"; +import {StdCheats} from "./StdCheats.sol"; +import {stdError} from "./StdError.sol"; +import {StdInvariant} from "./StdInvariant.sol"; +import {stdJson} from "./StdJson.sol"; +import {stdMath} from "./StdMath.sol"; +import {StdStorage, stdStorage} from "./StdStorage.sol"; +import {StdStyle} from "./StdStyle.sol"; +import {StdUtils} from "./StdUtils.sol"; +import {Vm} from "./Vm.sol"; + +// 📦 BOILERPLATE +import {TestBase} from "./Base.sol"; +import {DSTest} from "ds-test/test.sol"; + +// ⭐️ TEST +abstract contract Test is TestBase, DSTest, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils { +// Note: IS_TEST() must return true. +// Note: Must have failure system, https://github.com/dapphub/ds-test/blob/cd98eff28324bfac652e63a239a60632a761790b/src/test.sol#L39-L76. +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Vm.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Vm.sol new file mode 100644 index 000000000..aa173f0b8 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/Vm.sol @@ -0,0 +1,542 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +// Cheatcodes are marked as view/pure/none using the following rules: +// 0. A call's observable behaviour includes its return value, logs, reverts and state writes, +// 1. If you can influence a later call's observable behaviour, you're neither `view` nor `pure (you are modifying some state be it the EVM, interpreter, filesystem, etc), +// 2. Otherwise if you can be influenced by an earlier call, or if reading some state, you're `view`, +// 3. Otherwise you're `pure`. + +interface VmSafe { + enum CallerMode { + None, + Broadcast, + RecurrentBroadcast, + Prank, + RecurrentPrank + } + + struct Log { + bytes32[] topics; + bytes data; + address emitter; + } + + struct Rpc { + string key; + string url; + } + + struct DirEntry { + string errorMessage; + string path; + uint64 depth; + bool isDir; + bool isSymlink; + } + + struct FsMetadata { + bool isDir; + bool isSymlink; + uint256 length; + bool readOnly; + uint256 modified; + uint256 accessed; + uint256 created; + } + + struct Wallet { + address addr; + uint256 publicKeyX; + uint256 publicKeyY; + uint256 privateKey; + } + + // Derives a private key from the name, labels the account with that name, and returns the wallet + function createWallet(string calldata walletLabel) external returns (Wallet memory wallet); + // Generates a wallet from the private key and returns the wallet + function createWallet(uint256 privateKey) external returns (Wallet memory wallet); + // Generates a wallet from the private key, labels the account with that name, and returns the wallet + function createWallet(uint256 privateKey, string calldata walletLabel) external returns (Wallet memory wallet); + // Signs data, (Wallet, digest) => (v, r, s) + function sign(Wallet calldata wallet, bytes32 digest) external returns (uint8 v, bytes32 r, bytes32 s); + // Get nonce for a Wallet + function getNonce(Wallet calldata wallet) external returns (uint64 nonce); + + // Loads a storage slot from an address + function load(address target, bytes32 slot) external view returns (bytes32 data); + // Signs data + function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); + // Gets the address for a given private key + function addr(uint256 privateKey) external pure returns (address keyAddr); + // Gets the nonce of an account + function getNonce(address account) external view returns (uint64 nonce); + // Performs a foreign function call via the terminal + function ffi(string[] calldata commandInput) external returns (bytes memory result); + // Sets environment variables + function setEnv(string calldata name, string calldata value) external; + // Reads environment variables, (name) => (value) + function envBool(string calldata name) external view returns (bool value); + function envUint(string calldata name) external view returns (uint256 value); + function envInt(string calldata name) external view returns (int256 value); + function envAddress(string calldata name) external view returns (address value); + function envBytes32(string calldata name) external view returns (bytes32 value); + function envString(string calldata name) external view returns (string memory value); + function envBytes(string calldata name) external view returns (bytes memory value); + // Reads environment variables as arrays + function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value); + function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value); + function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value); + function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value); + function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value); + function envString(string calldata name, string calldata delim) external view returns (string[] memory value); + function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value); + // Read environment variables with default value + function envOr(string calldata name, bool defaultValue) external returns (bool value); + function envOr(string calldata name, uint256 defaultValue) external returns (uint256 value); + function envOr(string calldata name, int256 defaultValue) external returns (int256 value); + function envOr(string calldata name, address defaultValue) external returns (address value); + function envOr(string calldata name, bytes32 defaultValue) external returns (bytes32 value); + function envOr(string calldata name, string calldata defaultValue) external returns (string memory value); + function envOr(string calldata name, bytes calldata defaultValue) external returns (bytes memory value); + // Read environment variables as arrays with default value + function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue) + external + returns (bool[] memory value); + function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue) + external + returns (uint256[] memory value); + function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue) + external + returns (int256[] memory value); + function envOr(string calldata name, string calldata delim, address[] calldata defaultValue) + external + returns (address[] memory value); + function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue) + external + returns (bytes32[] memory value); + function envOr(string calldata name, string calldata delim, string[] calldata defaultValue) + external + returns (string[] memory value); + function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue) + external + returns (bytes[] memory value); + // Records all storage reads and writes + function record() external; + // Gets all accessed reads and write slot from a recording session, for a given address + function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots); + // Gets the _creation_ bytecode from an artifact file. Takes in the relative path to the json file + function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode); + // Gets the _deployed_ bytecode from an artifact file. Takes in the relative path to the json file + function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode); + // Labels an address in call traces + function label(address account, string calldata newLabel) external; + // Gets the label for the specified address + function getLabel(address account) external returns (string memory currentLabel); + // Using the address that calls the test contract, has the next call (at this call depth only) create a transaction that can later be signed and sent onchain + function broadcast() external; + // Has the next call (at this call depth only) create a transaction with the address provided as the sender that can later be signed and sent onchain + function broadcast(address signer) external; + // Has the next call (at this call depth only) create a transaction with the private key provided as the sender that can later be signed and sent onchain + function broadcast(uint256 privateKey) external; + // Using the address that calls the test contract, has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain + function startBroadcast() external; + // Has all subsequent calls (at this call depth only) create transactions with the address provided that can later be signed and sent onchain + function startBroadcast(address signer) external; + // Has all subsequent calls (at this call depth only) create transactions with the private key provided that can later be signed and sent onchain + function startBroadcast(uint256 privateKey) external; + // Stops collecting onchain transactions + function stopBroadcast() external; + + // Get the path of the current project root. + function projectRoot() external view returns (string memory path); + // Reads the entire content of file to string. `path` is relative to the project root. + function readFile(string calldata path) external view returns (string memory data); + // Reads the entire content of file as binary. `path` is relative to the project root. + function readFileBinary(string calldata path) external view returns (bytes memory data); + // Reads next line of file to string. + function readLine(string calldata path) external view returns (string memory line); + // Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does. + // `path` is relative to the project root. + function writeFile(string calldata path, string calldata data) external; + // Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does. + // `path` is relative to the project root. + function writeFileBinary(string calldata path, bytes calldata data) external; + // Writes line to file, creating a file if it does not exist. + // `path` is relative to the project root. + function writeLine(string calldata path, string calldata data) external; + // Copies the contents of one file to another. This function will **overwrite** the contents of `to`. + // On success, the total number of bytes copied is returned and it is equal to the length of the `to` file as reported by `metadata`. + // Both `from` and `to` are relative to the project root. + function copyFile(string calldata from, string calldata to) external returns (uint64 copied); + // Closes file for reading, resetting the offset and allowing to read it from beginning with readLine. + // `path` is relative to the project root. + function closeFile(string calldata path) external; + // Removes a file from the filesystem. + // This cheatcode will revert in the following situations, but is not limited to just these cases: + // - `path` points to a directory. + // - The file doesn't exist. + // - The user lacks permissions to remove the file. + // `path` is relative to the project root. + function removeFile(string calldata path) external; + // Creates a new, empty directory at the provided path. + // This cheatcode will revert in the following situations, but is not limited to just these cases: + // - User lacks permissions to modify `path`. + // - A parent of the given path doesn't exist and `recursive` is false. + // - `path` already exists and `recursive` is false. + // `path` is relative to the project root. + function createDir(string calldata path, bool recursive) external; + // Removes a directory at the provided path. + // This cheatcode will revert in the following situations, but is not limited to just these cases: + // - `path` doesn't exist. + // - `path` isn't a directory. + // - User lacks permissions to modify `path`. + // - The directory is not empty and `recursive` is false. + // `path` is relative to the project root. + function removeDir(string calldata path, bool recursive) external; + // Reads the directory at the given path recursively, up to `max_depth`. + // `max_depth` defaults to 1, meaning only the direct children of the given directory will be returned. + // Follows symbolic links if `follow_links` is true. + function readDir(string calldata path) external view returns (DirEntry[] memory entries); + function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries); + function readDir(string calldata path, uint64 maxDepth, bool followLinks) + external + view + returns (DirEntry[] memory entries); + // Reads a symbolic link, returning the path that the link points to. + // This cheatcode will revert in the following situations, but is not limited to just these cases: + // - `path` is not a symbolic link. + // - `path` does not exist. + function readLink(string calldata linkPath) external view returns (string memory targetPath); + // Given a path, query the file system to get information about a file, directory, etc. + function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata); + + // Convert values to a string + function toString(address value) external pure returns (string memory stringifiedValue); + function toString(bytes calldata value) external pure returns (string memory stringifiedValue); + function toString(bytes32 value) external pure returns (string memory stringifiedValue); + function toString(bool value) external pure returns (string memory stringifiedValue); + function toString(uint256 value) external pure returns (string memory stringifiedValue); + function toString(int256 value) external pure returns (string memory stringifiedValue); + // Convert values from a string + function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue); + function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue); + function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue); + function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue); + function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue); + function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue); + // Record all the transaction logs + function recordLogs() external; + // Gets all the recorded logs + function getRecordedLogs() external returns (Log[] memory logs); + // Derive a private key from a provided mnenomic string (or mnenomic file path) at the derivation path m/44'/60'/0'/0/{index} + function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey); + // Derive a private key from a provided mnenomic string (or mnenomic file path) at {derivationPath}{index} + function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index) + external + pure + returns (uint256 privateKey); + // Adds a private key to the local forge wallet and returns the address + function rememberKey(uint256 privateKey) external returns (address keyAddr); + // + // parseJson + // + // ---- + // In case the returned value is a JSON object, it's encoded as a ABI-encoded tuple. As JSON objects + // don't have the notion of ordered, but tuples do, they JSON object is encoded with it's fields ordered in + // ALPHABETICAL order. That means that in order to successfully decode the tuple, we need to define a tuple that + // encodes the fields in the same order, which is alphabetical. In the case of Solidity structs, they are encoded + // as tuples, with the attributes in the order in which they are defined. + // For example: json = { 'a': 1, 'b': 0xa4tb......3xs} + // a: uint256 + // b: address + // To decode that json, we need to define a struct or a tuple as follows: + // struct json = { uint256 a; address b; } + // If we defined a json struct with the opposite order, meaning placing the address b first, it would try to + // decode the tuple in that order, and thus fail. + // ---- + // Given a string of JSON, return it as ABI-encoded + function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData); + function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData); + + // The following parseJson cheatcodes will do type coercion, for the type that they indicate. + // For example, parseJsonUint will coerce all values to a uint256. That includes stringified numbers '12' + // and hex numbers '0xEF'. + // Type coercion works ONLY for discrete values or arrays. That means that the key must return a value or array, not + // a JSON object. + function parseJsonUint(string calldata json, string calldata key) external returns (uint256); + function parseJsonUintArray(string calldata json, string calldata key) external returns (uint256[] memory); + function parseJsonInt(string calldata json, string calldata key) external returns (int256); + function parseJsonIntArray(string calldata json, string calldata key) external returns (int256[] memory); + function parseJsonBool(string calldata json, string calldata key) external returns (bool); + function parseJsonBoolArray(string calldata json, string calldata key) external returns (bool[] memory); + function parseJsonAddress(string calldata json, string calldata key) external returns (address); + function parseJsonAddressArray(string calldata json, string calldata key) external returns (address[] memory); + function parseJsonString(string calldata json, string calldata key) external returns (string memory); + function parseJsonStringArray(string calldata json, string calldata key) external returns (string[] memory); + function parseJsonBytes(string calldata json, string calldata key) external returns (bytes memory); + function parseJsonBytesArray(string calldata json, string calldata key) external returns (bytes[] memory); + function parseJsonBytes32(string calldata json, string calldata key) external returns (bytes32); + function parseJsonBytes32Array(string calldata json, string calldata key) external returns (bytes32[] memory); + + // Checks if a key exists in a JSON or TOML object. + function keyExists(string calldata json, string calldata key) external view returns (bool); + + // Returns array of keys for a JSON object + function parseJsonKeys(string calldata json, string calldata key) external returns (string[] memory keys); + + // Serialize a key and value to a JSON object stored in-memory that can be later written to a file + // It returns the stringified version of the specific JSON file up to that moment. + function serializeBool(string calldata objectKey, string calldata valueKey, bool value) + external + returns (string memory json); + function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value) + external + returns (string memory json); + function serializeInt(string calldata objectKey, string calldata valueKey, int256 value) + external + returns (string memory json); + function serializeAddress(string calldata objectKey, string calldata valueKey, address value) + external + returns (string memory json); + function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value) + external + returns (string memory json); + function serializeString(string calldata objectKey, string calldata valueKey, string calldata value) + external + returns (string memory json); + function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value) + external + returns (string memory json); + + function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values) + external + returns (string memory json); + function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values) + external + returns (string memory json); + function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values) + external + returns (string memory json); + function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values) + external + returns (string memory json); + function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values) + external + returns (string memory json); + function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values) + external + returns (string memory json); + function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values) + external + returns (string memory json); + + // + // writeJson + // + // ---- + // Write a serialized JSON object to a file. If the file exists, it will be overwritten. + // Let's assume we want to write the following JSON to a file: + // + // { "boolean": true, "number": 342, "object": { "title": "finally json serialization" } } + // + // ``` + // string memory json1 = "some key"; + // vm.serializeBool(json1, "boolean", true); + // vm.serializeBool(json1, "number", uint256(342)); + // json2 = "some other key"; + // string memory output = vm.serializeString(json2, "title", "finally json serialization"); + // string memory finalJson = vm.serialize(json1, "object", output); + // vm.writeJson(finalJson, "./output/example.json"); + // ``` + // The critical insight is that every invocation of serialization will return the stringified version of the JSON + // up to that point. That means we can construct arbitrary JSON objects and then use the return stringified version + // to serialize them as values to another JSON object. + // + // json1 and json2 are simply keys used by the backend to keep track of the objects. So vm.serializeJson(json1,..) + // will find the object in-memory that is keyed by "some key". + function writeJson(string calldata json, string calldata path) external; + // Write a serialized JSON object to an **existing** JSON file, replacing a value with key = + // This is useful to replace a specific value of a JSON file, without having to parse the entire thing + function writeJson(string calldata json, string calldata path, string calldata valueKey) external; + // Returns the RPC url for the given alias + function rpcUrl(string calldata rpcAlias) external view returns (string memory json); + // Returns all rpc urls and their aliases `[alias, url][]` + function rpcUrls() external view returns (string[2][] memory urls); + // Returns all rpc urls and their aliases as structs. + function rpcUrlStructs() external view returns (Rpc[] memory urls); + // If the condition is false, discard this run's fuzz inputs and generate new ones. + function assume(bool condition) external pure; + // Pauses gas metering (i.e. gas usage is not counted). Noop if already paused. + function pauseGasMetering() external; + // Resumes gas metering (i.e. gas usage is counted again). Noop if already on. + function resumeGasMetering() external; + // Writes a breakpoint to jump to in the debugger + function breakpoint(string calldata char) external; + // Writes a conditional breakpoint to jump to in the debugger + function breakpoint(string calldata char, bool value) external; +} + +interface Vm is VmSafe { + // Sets block.timestamp + function warp(uint256 newTimestamp) external; + // Sets block.height + function roll(uint256 newHeight) external; + // Sets block.basefee + function fee(uint256 newBasefee) external; + // Sets block.difficulty + // Not available on EVM versions from Paris onwards. Use `prevrandao` instead. + // If used on unsupported EVM versions it will revert. + function difficulty(uint256 newDifficulty) external; + // Sets block.prevrandao + // Not available on EVM versions before Paris. Use `difficulty` instead. + // If used on unsupported EVM versions it will revert. + function prevrandao(bytes32 newPrevrandao) external; + // Sets block.chainid + function chainId(uint256 newChainId) external; + // Sets tx.gasprice + function txGasPrice(uint256 newGasPrice) external; + // Stores a value to an address' storage slot. + function store(address target, bytes32 slot, bytes32 value) external; + // Sets the nonce of an account; must be higher than the current nonce of the account + function setNonce(address account, uint64 newNonce) external; + // Sets the nonce of an account to an arbitrary value + function setNonceUnsafe(address account, uint64 newNonce) external; + // Resets the nonce of an account to 0 for EOAs and 1 for contract accounts + function resetNonce(address account) external; + // Sets the *next* call's msg.sender to be the input address + function prank(address msgSender) external; + // Sets all subsequent calls' msg.sender to be the input address until `stopPrank` is called + function startPrank(address msgSender) external; + // Sets the *next* call's msg.sender to be the input address, and the tx.origin to be the second input + function prank(address msgSender, address txOrigin) external; + // Sets all subsequent calls' msg.sender to be the input address until `stopPrank` is called, and the tx.origin to be the second input + function startPrank(address msgSender, address txOrigin) external; + // Resets subsequent calls' msg.sender to be `address(this)` + function stopPrank() external; + // Reads the current `msg.sender` and `tx.origin` from state and reports if there is any active caller modification + function readCallers() external returns (CallerMode callerMode, address msgSender, address txOrigin); + // Sets an address' balance + function deal(address account, uint256 newBalance) external; + // Sets an address' code + function etch(address target, bytes calldata newRuntimeBytecode) external; + // Marks a test as skipped. Must be called at the top of the test. + function skip(bool skipTest) external; + // Expects an error on next call + function expectRevert(bytes calldata revertData) external; + function expectRevert(bytes4 revertData) external; + function expectRevert() external; + + // Prepare an expected log with all four checks enabled. + // Call this function, then emit an event, then call a function. Internally after the call, we check if + // logs were emitted in the expected order with the expected topics and data. + // Second form also checks supplied address against emitting contract. + function expectEmit() external; + function expectEmit(address emitter) external; + + // Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData). + // Call this function, then emit an event, then call a function. Internally after the call, we check if + // logs were emitted in the expected order with the expected topics and data (as specified by the booleans). + // Second form also checks supplied address against emitting contract. + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) + external; + + // Mocks a call to an address, returning specified data. + // Calldata can either be strict or a partial match, e.g. if you only + // pass a Solidity selector to the expected calldata, then the entire Solidity + // function will be mocked. + function mockCall(address callee, bytes calldata data, bytes calldata returnData) external; + // Mocks a call to an address with a specific msg.value, returning specified data. + // Calldata match takes precedence over msg.value in case of ambiguity. + function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external; + // Reverts a call to an address with specified revert data. + function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external; + // Reverts a call to an address with a specific msg.value, with specified revert data. + function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData) + external; + // Clears all mocked calls + function clearMockedCalls() external; + // Expects a call to an address with the specified calldata. + // Calldata can either be a strict or a partial match + function expectCall(address callee, bytes calldata data) external; + // Expects given number of calls to an address with the specified calldata. + function expectCall(address callee, bytes calldata data, uint64 count) external; + // Expects a call to an address with the specified msg.value and calldata + function expectCall(address callee, uint256 msgValue, bytes calldata data) external; + // Expects given number of calls to an address with the specified msg.value and calldata + function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external; + // Expect a call to an address with the specified msg.value, gas, and calldata. + function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external; + // Expects given number of calls to an address with the specified msg.value, gas, and calldata. + function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external; + // Expect a call to an address with the specified msg.value and calldata, and a *minimum* amount of gas. + function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external; + // Expect given number of calls to an address with the specified msg.value and calldata, and a *minimum* amount of gas. + function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count) + external; + // Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other + // memory is written to, the test will fail. Can be called multiple times to add more ranges to the set. + function expectSafeMemory(uint64 min, uint64 max) external; + // Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext. + // If any other memory is written to, the test will fail. Can be called multiple times to add more ranges + // to the set. + function expectSafeMemoryCall(uint64 min, uint64 max) external; + // Sets block.coinbase + function coinbase(address newCoinbase) external; + // Snapshot the current state of the evm. + // Returns the id of the snapshot that was created. + // To revert a snapshot use `revertTo` + function snapshot() external returns (uint256 snapshotId); + // Revert the state of the EVM to a previous snapshot + // Takes the snapshot id to revert to. + // This deletes the snapshot and all snapshots taken after the given snapshot id. + function revertTo(uint256 snapshotId) external returns (bool success); + // Creates a new fork with the given endpoint and block and returns the identifier of the fork + function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); + // Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork + function createFork(string calldata urlOrAlias) external returns (uint256 forkId); + // Creates a new fork with the given endpoint and at the block the given transaction was mined in, replays all transaction mined in the block before the transaction, + // and returns the identifier of the fork + function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); + // Creates _and_ also selects a new fork with the given endpoint and block and returns the identifier of the fork + function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); + // Creates _and_ also selects new fork with the given endpoint and at the block the given transaction was mined in, replays all transaction mined in the block before + // the transaction, returns the identifier of the fork + function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); + // Creates _and_ also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork + function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId); + // Takes a fork identifier created by `createFork` and sets the corresponding forked state as active. + function selectFork(uint256 forkId) external; + /// Returns the identifier of the currently active fork. Reverts if no fork is currently active. + function activeFork() external view returns (uint256 forkId); + // Updates the currently active fork to given block number + // This is similar to `roll` but for the currently active fork + function rollFork(uint256 blockNumber) external; + // Updates the currently active fork to given transaction + // this will `rollFork` with the number of the block the transaction was mined in and replays all transaction mined before it in the block + function rollFork(bytes32 txHash) external; + // Updates the given fork to given block number + function rollFork(uint256 forkId, uint256 blockNumber) external; + // Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block + function rollFork(uint256 forkId, bytes32 txHash) external; + // Marks that the account(s) should use persistent storage across fork swaps in a multifork setup + // Meaning, changes made to the state of this account will be kept when switching forks + function makePersistent(address account) external; + function makePersistent(address account0, address account1) external; + function makePersistent(address account0, address account1, address account2) external; + function makePersistent(address[] calldata accounts) external; + // Revokes persistent status from the address, previously added via `makePersistent` + function revokePersistent(address account) external; + function revokePersistent(address[] calldata accounts) external; + // Returns true if the account is marked as persistent + function isPersistent(address account) external view returns (bool persistent); + // In forking mode, explicitly grant the given address cheatcode access + function allowCheatcodes(address account) external; + // Fetches the given transaction from the active fork and executes it on the current state + function transact(bytes32 txHash) external; + // Fetches the given transaction from the given fork and executes it on the current state + function transact(uint256 forkId, bytes32 txHash) external; +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/console.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/console.sol new file mode 100644 index 000000000..ad57e5368 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/console.sol @@ -0,0 +1,1533 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +library console { + address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); + + function _sendLogPayload(bytes memory payload) private view { + uint256 payloadLength = payload.length; + address consoleAddress = CONSOLE_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + let payloadStart := add(payload, 32) + let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) + } + } + + function log() internal view { + _sendLogPayload(abi.encodeWithSignature("log()")); + } + + function logInt(int p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); + } + + function logUint(uint p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); + } + + function logString(string memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function logBool(bool p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function logAddress(address p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function logBytes(bytes memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); + } + + function logBytes1(bytes1 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); + } + + function logBytes2(bytes2 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); + } + + function logBytes3(bytes3 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); + } + + function logBytes4(bytes4 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); + } + + function logBytes5(bytes5 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); + } + + function logBytes6(bytes6 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); + } + + function logBytes7(bytes7 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); + } + + function logBytes8(bytes8 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); + } + + function logBytes9(bytes9 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); + } + + function logBytes10(bytes10 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); + } + + function logBytes11(bytes11 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); + } + + function logBytes12(bytes12 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); + } + + function logBytes13(bytes13 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); + } + + function logBytes14(bytes14 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); + } + + function logBytes15(bytes15 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); + } + + function logBytes16(bytes16 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); + } + + function logBytes17(bytes17 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); + } + + function logBytes18(bytes18 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); + } + + function logBytes19(bytes19 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); + } + + function logBytes20(bytes20 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); + } + + function logBytes21(bytes21 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); + } + + function logBytes22(bytes22 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); + } + + function logBytes23(bytes23 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); + } + + function logBytes24(bytes24 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); + } + + function logBytes25(bytes25 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); + } + + function logBytes26(bytes26 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); + } + + function logBytes27(bytes27 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); + } + + function logBytes28(bytes28 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); + } + + function logBytes29(bytes29 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); + } + + function logBytes30(bytes30 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); + } + + function logBytes31(bytes31 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); + } + + function logBytes32(bytes32 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); + } + + function log(uint p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); + } + + function log(string memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function log(bool p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function log(address p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function log(uint p0, uint p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); + } + + function log(uint p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); + } + + function log(uint p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); + } + + function log(uint p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); + } + + function log(string memory p0, uint p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); + } + + function log(string memory p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); + } + + function log(string memory p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); + } + + function log(string memory p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); + } + + function log(bool p0, uint p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); + } + + function log(bool p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); + } + + function log(bool p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); + } + + function log(bool p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); + } + + function log(address p0, uint p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); + } + + function log(address p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); + } + + function log(address p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); + } + + function log(address p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); + } + + function log(uint p0, uint p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); + } + + function log(uint p0, uint p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); + } + + function log(uint p0, uint p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); + } + + function log(uint p0, uint p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); + } + + function log(uint p0, bool p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); + } + + function log(uint p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); + } + + function log(uint p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); + } + + function log(uint p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); + } + + function log(uint p0, address p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); + } + + function log(uint p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); + } + + function log(uint p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); + } + + function log(uint p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); + } + + function log(string memory p0, address p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); + } + + function log(string memory p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); + } + + function log(string memory p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); + } + + function log(string memory p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); + } + + function log(bool p0, uint p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); + } + + function log(bool p0, uint p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); + } + + function log(bool p0, uint p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); + } + + function log(bool p0, uint p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); + } + + function log(bool p0, bool p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); + } + + function log(bool p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); + } + + function log(bool p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); + } + + function log(bool p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); + } + + function log(bool p0, address p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); + } + + function log(bool p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); + } + + function log(bool p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); + } + + function log(bool p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); + } + + function log(address p0, uint p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); + } + + function log(address p0, uint p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); + } + + function log(address p0, uint p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); + } + + function log(address p0, uint p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); + } + + function log(address p0, string memory p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); + } + + function log(address p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); + } + + function log(address p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); + } + + function log(address p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); + } + + function log(address p0, bool p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); + } + + function log(address p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); + } + + function log(address p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); + } + + function log(address p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); + } + + function log(address p0, address p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); + } + + function log(address p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); + } + + function log(address p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); + } + + function log(address p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); + } + + function log(uint p0, uint p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); + } + +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/console2.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/console2.sol new file mode 100644 index 000000000..c1e2cd754 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/console2.sol @@ -0,0 +1,1558 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +/// @dev The original console.sol uses `int` and `uint` for computing function selectors, but it should +/// use `int256` and `uint256`. This modified version fixes that. This version is recommended +/// over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in +/// forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. +/// Reference: https://github.com/NomicFoundation/hardhat/issues/2178 +library console2 { + address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); + + function _castLogPayloadViewToPure( + function(bytes memory) internal view fnIn + ) internal pure returns (function(bytes memory) internal pure fnOut) { + assembly { + fnOut := fnIn + } + } + + function _sendLogPayload(bytes memory payload) internal pure { + _castLogPayloadViewToPure(_sendLogPayloadView)(payload); + } + + function _sendLogPayloadView(bytes memory payload) private view { + uint256 payloadLength = payload.length; + address consoleAddress = CONSOLE_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + let payloadStart := add(payload, 32) + let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) + } + } + + function log() internal pure { + _sendLogPayload(abi.encodeWithSignature("log()")); + } + + function logInt(int256 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); + } + + function logUint(uint256 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); + } + + function logString(string memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function logBool(bool p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function logAddress(address p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function logBytes(bytes memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); + } + + function logBytes1(bytes1 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); + } + + function logBytes2(bytes2 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); + } + + function logBytes3(bytes3 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); + } + + function logBytes4(bytes4 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); + } + + function logBytes5(bytes5 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); + } + + function logBytes6(bytes6 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); + } + + function logBytes7(bytes7 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); + } + + function logBytes8(bytes8 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); + } + + function logBytes9(bytes9 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); + } + + function logBytes10(bytes10 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); + } + + function logBytes11(bytes11 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); + } + + function logBytes12(bytes12 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); + } + + function logBytes13(bytes13 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); + } + + function logBytes14(bytes14 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); + } + + function logBytes15(bytes15 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); + } + + function logBytes16(bytes16 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); + } + + function logBytes17(bytes17 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); + } + + function logBytes18(bytes18 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); + } + + function logBytes19(bytes19 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); + } + + function logBytes20(bytes20 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); + } + + function logBytes21(bytes21 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); + } + + function logBytes22(bytes22 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); + } + + function logBytes23(bytes23 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); + } + + function logBytes24(bytes24 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); + } + + function logBytes25(bytes25 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); + } + + function logBytes26(bytes26 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); + } + + function logBytes27(bytes27 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); + } + + function logBytes28(bytes28 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); + } + + function logBytes29(bytes29 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); + } + + function logBytes30(bytes30 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); + } + + function logBytes31(bytes31 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); + } + + function logBytes32(bytes32 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); + } + + function log(uint256 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); + } + + function log(int256 p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); + } + + function log(string memory p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function log(bool p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function log(address p0) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function log(uint256 p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); + } + + function log(uint256 p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); + } + + function log(uint256 p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); + } + + function log(uint256 p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); + } + + function log(string memory p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); + } + + function log(string memory p0, int256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1)); + } + + function log(string memory p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); + } + + function log(string memory p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); + } + + function log(string memory p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); + } + + function log(bool p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); + } + + function log(bool p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); + } + + function log(bool p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); + } + + function log(bool p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); + } + + function log(address p0, uint256 p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); + } + + function log(address p0, string memory p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); + } + + function log(address p0, bool p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); + } + + function log(address p0, address p1) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); + } + + function log(uint256 p0, uint256 p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); + } + + function log(string memory p0, address p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); + } + + function log(string memory p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); + } + + function log(string memory p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); + } + + function log(string memory p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); + } + + function log(bool p0, bool p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); + } + + function log(bool p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); + } + + function log(bool p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); + } + + function log(bool p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); + } + + function log(bool p0, address p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); + } + + function log(bool p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); + } + + function log(bool p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); + } + + function log(bool p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); + } + + function log(address p0, string memory p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); + } + + function log(address p0, string memory p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); + } + + function log(address p0, string memory p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); + } + + function log(address p0, string memory p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); + } + + function log(address p0, bool p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); + } + + function log(address p0, bool p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); + } + + function log(address p0, bool p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); + } + + function log(address p0, bool p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); + } + + function log(address p0, address p1, uint256 p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); + } + + function log(address p0, address p1, string memory p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); + } + + function log(address p0, address p1, bool p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); + } + + function log(address p0, address p1, address p2) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, uint256 p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, string memory p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, bool p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, address p3) internal pure { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); + } + +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC1155.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC1155.sol new file mode 100644 index 000000000..f7dd2b410 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC1155.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC165.sol"; + +/// @title ERC-1155 Multi Token Standard +/// @dev See https://eips.ethereum.org/EIPS/eip-1155 +/// Note: The ERC-165 identifier for this interface is 0xd9b67a26. +interface IERC1155 is IERC165 { + /// @dev + /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). + /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). + /// - The `_from` argument MUST be the address of the holder whose balance is decreased. + /// - The `_to` argument MUST be the address of the recipient whose balance is increased. + /// - The `_id` argument MUST be the token type being transferred. + /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. + /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). + /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). + event TransferSingle( + address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value + ); + + /// @dev + /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). + /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). + /// - The `_from` argument MUST be the address of the holder whose balance is decreased. + /// - The `_to` argument MUST be the address of the recipient whose balance is increased. + /// - The `_ids` argument MUST be the list of tokens being transferred. + /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. + /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). + /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). + event TransferBatch( + address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values + ); + + /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled). + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. + /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". + event URI(string _value, uint256 indexed _id); + + /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). + /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). + /// - MUST revert if `_to` is the zero address. + /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent. + /// - MUST revert on any other error. + /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). + /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). + /// @param _from Source address + /// @param _to Target address + /// @param _id ID of the token type + /// @param _value Transfer amount + /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` + function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; + + /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). + /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). + /// - MUST revert if `_to` is the zero address. + /// - MUST revert if length of `_ids` is not the same as length of `_values`. + /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. + /// - MUST revert on any other error. + /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). + /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). + /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). + /// @param _from Source address + /// @param _to Target address + /// @param _ids IDs of each token type (order and length must match _values array) + /// @param _values Transfer amounts per token type (order and length must match _ids array) + /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` + function safeBatchTransferFrom( + address _from, + address _to, + uint256[] calldata _ids, + uint256[] calldata _values, + bytes calldata _data + ) external; + + /// @notice Get the balance of an account's tokens. + /// @param _owner The address of the token holder + /// @param _id ID of the token + /// @return The _owner's balance of the token type requested + function balanceOf(address _owner, uint256 _id) external view returns (uint256); + + /// @notice Get the balance of multiple account/token pairs + /// @param _owners The addresses of the token holders + /// @param _ids ID of the tokens + /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair) + function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) + external + view + returns (uint256[] memory); + + /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. + /// @dev MUST emit the ApprovalForAll event on success. + /// @param _operator Address to add to the set of authorized operators + /// @param _approved True if the operator is approved, false to revoke approval + function setApprovalForAll(address _operator, bool _approved) external; + + /// @notice Queries the approval status of an operator for a given owner. + /// @param _owner The owner of the tokens + /// @param _operator Address of authorized operator + /// @return True if the operator is approved, false if not + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC165.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC165.sol new file mode 100644 index 000000000..9af4bf800 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC165.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +interface IERC165 { + /// @notice Query if a contract implements an interface + /// @param interfaceID The interface identifier, as specified in ERC-165 + /// @dev Interface identification is specified in ERC-165. This function + /// uses less than 30,000 gas. + /// @return `true` if the contract implements `interfaceID` and + /// `interfaceID` is not 0xffffffff, `false` otherwise + function supportsInterface(bytes4 interfaceID) external view returns (bool); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC20.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC20.sol new file mode 100644 index 000000000..ba40806c3 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC20.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +/// @dev Interface of the ERC20 standard as defined in the EIP. +/// @dev This includes the optional name, symbol, and decimals metadata. +interface IERC20 { + /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). + event Transfer(address indexed from, address indexed to, uint256 value); + + /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` + /// is the new allowance. + event Approval(address indexed owner, address indexed spender, uint256 value); + + /// @notice Returns the amount of tokens in existence. + function totalSupply() external view returns (uint256); + + /// @notice Returns the amount of tokens owned by `account`. + function balanceOf(address account) external view returns (uint256); + + /// @notice Moves `amount` tokens from the caller's account to `to`. + function transfer(address to, uint256 amount) external returns (bool); + + /// @notice Returns the remaining number of tokens that `spender` is allowed + /// to spend on behalf of `owner` + function allowance(address owner, address spender) external view returns (uint256); + + /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. + /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + function approve(address spender, uint256 amount) external returns (bool); + + /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. + /// `amount` is then deducted from the caller's allowance. + function transferFrom(address from, address to, uint256 amount) external returns (bool); + + /// @notice Returns the name of the token. + function name() external view returns (string memory); + + /// @notice Returns the symbol of the token. + function symbol() external view returns (string memory); + + /// @notice Returns the decimals places of the token. + function decimals() external view returns (uint8); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC4626.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC4626.sol new file mode 100644 index 000000000..bfe3a1155 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC4626.sol @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC20.sol"; + +/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in +/// https://eips.ethereum.org/EIPS/eip-4626 +interface IERC4626 is IERC20 { + event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); + + event Withdraw( + address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares + ); + + /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. + /// @dev + /// - MUST be an ERC-20 token contract. + /// - MUST NOT revert. + function asset() external view returns (address assetTokenAddress); + + /// @notice Returns the total amount of the underlying asset that is “managed” by Vault. + /// @dev + /// - SHOULD include any compounding that occurs from yield. + /// - MUST be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT revert. + function totalAssets() external view returns (uint256 totalManagedAssets); + + /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal + /// scenario where all the conditions are met. + /// @dev + /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT show any variations depending on the caller. + /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + /// - MUST NOT revert. + /// + /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the + /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and + /// from. + function convertToShares(uint256 assets) external view returns (uint256 shares); + + /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal + /// scenario where all the conditions are met. + /// @dev + /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT show any variations depending on the caller. + /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + /// - MUST NOT revert. + /// + /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the + /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and + /// from. + function convertToAssets(uint256 shares) external view returns (uint256 assets); + + /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, + /// through a deposit call. + /// @dev + /// - MUST return a limited value if receiver is subject to some deposit limit. + /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. + /// - MUST NOT revert. + function maxDeposit(address receiver) external view returns (uint256 maxAssets); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given + /// current on-chain conditions. + /// @dev + /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit + /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called + /// in the same transaction. + /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the + /// deposit would be accepted, regardless if the user has enough tokens approved, etc. + /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by depositing. + function previewDeposit(uint256 assets) external view returns (uint256 shares); + + /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. + /// @dev + /// - MUST emit the Deposit event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// deposit execution, and are accounted for during deposit. + /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not + /// approving enough underlying tokens to the Vault contract, etc). + /// + /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + function deposit(uint256 assets, address receiver) external returns (uint256 shares); + + /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. + /// @dev + /// - MUST return a limited value if receiver is subject to some mint limit. + /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. + /// - MUST NOT revert. + function maxMint(address receiver) external view returns (uint256 maxShares); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given + /// current on-chain conditions. + /// @dev + /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call + /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the + /// same transaction. + /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint + /// would be accepted, regardless if the user has enough tokens approved, etc. + /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by minting. + function previewMint(uint256 shares) external view returns (uint256 assets); + + /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. + /// @dev + /// - MUST emit the Deposit event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint + /// execution, and are accounted for during mint. + /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not + /// approving enough underlying tokens to the Vault contract, etc). + /// + /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + function mint(uint256 shares, address receiver) external returns (uint256 assets); + + /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the + /// Vault, through a withdraw call. + /// @dev + /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + /// - MUST NOT revert. + function maxWithdraw(address owner) external view returns (uint256 maxAssets); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, + /// given current on-chain conditions. + /// @dev + /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw + /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if + /// called + /// in the same transaction. + /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though + /// the withdrawal would be accepted, regardless if the user has enough shares, etc. + /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by depositing. + function previewWithdraw(uint256 assets) external view returns (uint256 shares); + + /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver. + /// @dev + /// - MUST emit the Withdraw event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// withdraw execution, and are accounted for during withdraw. + /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner + /// not having enough shares, etc). + /// + /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + /// Those methods should be performed separately. + function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); + + /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, + /// through a redeem call. + /// @dev + /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. + /// - MUST NOT revert. + function maxRedeem(address owner) external view returns (uint256 maxShares); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, + /// given current on-chain conditions. + /// @dev + /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call + /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the + /// same transaction. + /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the + /// redemption would be accepted, regardless if the user has enough shares, etc. + /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by redeeming. + function previewRedeem(uint256 shares) external view returns (uint256 assets); + + /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver. + /// @dev + /// - MUST emit the Withdraw event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// redeem execution, and are accounted for during redeem. + /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner + /// not having enough shares, etc). + /// + /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + /// Those methods should be performed separately. + function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC721.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC721.sol new file mode 100644 index 000000000..0a16f45cc --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IERC721.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC165.sol"; + +/// @title ERC-721 Non-Fungible Token Standard +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x80ac58cd. +interface IERC721 is IERC165 { + /// @dev This emits when ownership of any NFT changes by any mechanism. + /// This event emits when NFTs are created (`from` == 0) and destroyed + /// (`to` == 0). Exception: during contract creation, any number of NFTs + /// may be created and assigned without emitting Transfer. At the time of + /// any transfer, the approved address for that NFT (if any) is reset to none. + event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); + + /// @dev This emits when the approved address for an NFT is changed or + /// reaffirmed. The zero address indicates there is no approved address. + /// When a Transfer event emits, this also indicates that the approved + /// address for that NFT (if any) is reset to none. + event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); + + /// @dev This emits when an operator is enabled or disabled for an owner. + /// The operator can manage all NFTs of the owner. + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + /// @notice Count all NFTs assigned to an owner + /// @dev NFTs assigned to the zero address are considered invalid, and this + /// function throws for queries about the zero address. + /// @param _owner An address for whom to query the balance + /// @return The number of NFTs owned by `_owner`, possibly zero + function balanceOf(address _owner) external view returns (uint256); + + /// @notice Find the owner of an NFT + /// @dev NFTs assigned to zero address are considered invalid, and queries + /// about them do throw. + /// @param _tokenId The identifier for an NFT + /// @return The address of the owner of the NFT + function ownerOf(uint256 _tokenId) external view returns (address); + + /// @notice Transfers the ownership of an NFT from one address to another address + /// @dev Throws unless `msg.sender` is the current owner, an authorized + /// operator, or the approved address for this NFT. Throws if `_from` is + /// not the current owner. Throws if `_to` is the zero address. Throws if + /// `_tokenId` is not a valid NFT. When transfer is complete, this function + /// checks if `_to` is a smart contract (code size > 0). If so, it calls + /// `onERC721Received` on `_to` and throws if the return value is not + /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + /// @param data Additional data with no specified format, sent in call to `_to` + function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; + + /// @notice Transfers the ownership of an NFT from one address to another address + /// @dev This works identically to the other function with an extra data parameter, + /// except this function just sets data to "". + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; + + /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE + /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE + /// THEY MAY BE PERMANENTLY LOST + /// @dev Throws unless `msg.sender` is the current owner, an authorized + /// operator, or the approved address for this NFT. Throws if `_from` is + /// not the current owner. Throws if `_to` is the zero address. Throws if + /// `_tokenId` is not a valid NFT. + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + function transferFrom(address _from, address _to, uint256 _tokenId) external payable; + + /// @notice Change or reaffirm the approved address for an NFT + /// @dev The zero address indicates there is no approved address. + /// Throws unless `msg.sender` is the current NFT owner, or an authorized + /// operator of the current owner. + /// @param _approved The new approved NFT controller + /// @param _tokenId The NFT to approve + function approve(address _approved, uint256 _tokenId) external payable; + + /// @notice Enable or disable approval for a third party ("operator") to manage + /// all of `msg.sender`'s assets + /// @dev Emits the ApprovalForAll event. The contract MUST allow + /// multiple operators per owner. + /// @param _operator Address to add to the set of authorized operators + /// @param _approved True if the operator is approved, false to revoke approval + function setApprovalForAll(address _operator, bool _approved) external; + + /// @notice Get the approved address for a single NFT + /// @dev Throws if `_tokenId` is not a valid NFT. + /// @param _tokenId The NFT to find the approved address for + /// @return The approved address for this NFT, or the zero address if there is none + function getApproved(uint256 _tokenId) external view returns (address); + + /// @notice Query if an address is an authorized operator for another address + /// @param _owner The address that owns the NFTs + /// @param _operator The address that acts on behalf of the owner + /// @return True if `_operator` is an approved operator for `_owner`, false otherwise + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} + +/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. +interface IERC721TokenReceiver { + /// @notice Handle the receipt of an NFT + /// @dev The ERC721 smart contract calls this function on the recipient + /// after a `transfer`. This function MAY throw to revert and reject the + /// transfer. Return of other than the magic value MUST result in the + /// transaction being reverted. + /// Note: the contract address is always the message sender. + /// @param _operator The address which called `safeTransferFrom` function + /// @param _from The address which previously owned the token + /// @param _tokenId The NFT identifier which is being transferred + /// @param _data Additional data with no specified format + /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` + /// unless throwing + function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) + external + returns (bytes4); +} + +/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x5b5e139f. +interface IERC721Metadata is IERC721 { + /// @notice A descriptive name for a collection of NFTs in this contract + function name() external view returns (string memory _name); + + /// @notice An abbreviated name for NFTs in this contract + function symbol() external view returns (string memory _symbol); + + /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. + /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC + /// 3986. The URI may point to a JSON file that conforms to the "ERC721 + /// Metadata JSON Schema". + function tokenURI(uint256 _tokenId) external view returns (string memory); +} + +/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x780e9d63. +interface IERC721Enumerable is IERC721 { + /// @notice Count NFTs tracked by this contract + /// @return A count of valid NFTs tracked by this contract, where each one of + /// them has an assigned and queryable owner not equal to the zero address + function totalSupply() external view returns (uint256); + + /// @notice Enumerate valid NFTs + /// @dev Throws if `_index` >= `totalSupply()`. + /// @param _index A counter less than `totalSupply()` + /// @return The token identifier for the `_index`th NFT, + /// (sort order not specified) + function tokenByIndex(uint256 _index) external view returns (uint256); + + /// @notice Enumerate NFTs assigned to an owner + /// @dev Throws if `_index` >= `balanceOf(_owner)` or if + /// `_owner` is the zero address, representing invalid NFTs. + /// @param _owner An address where we are interested in NFTs owned by them + /// @param _index A counter less than `balanceOf(_owner)` + /// @return The token identifier for the `_index`th NFT assigned to `_owner`, + /// (sort order not specified) + function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IMulticall3.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IMulticall3.sol new file mode 100644 index 000000000..0d031b71d --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/interfaces/IMulticall3.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +interface IMulticall3 { + struct Call { + address target; + bytes callData; + } + + struct Call3 { + address target; + bool allowFailure; + bytes callData; + } + + struct Call3Value { + address target; + bool allowFailure; + uint256 value; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + function aggregate(Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes[] memory returnData); + + function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); + + function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData); + + function blockAndAggregate(Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); + + function getBasefee() external view returns (uint256 basefee); + + function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash); + + function getBlockNumber() external view returns (uint256 blockNumber); + + function getChainId() external view returns (uint256 chainid); + + function getCurrentBlockCoinbase() external view returns (address coinbase); + + function getCurrentBlockDifficulty() external view returns (uint256 difficulty); + + function getCurrentBlockGasLimit() external view returns (uint256 gaslimit); + + function getCurrentBlockTimestamp() external view returns (uint256 timestamp); + + function getEthBalance(address addr) external view returns (uint256 balance); + + function getLastBlockHash() external view returns (bytes32 blockHash); + + function tryAggregate(bool requireSuccess, Call[] calldata calls) + external + payable + returns (Result[] memory returnData); + + function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/safeconsole.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/safeconsole.sol new file mode 100644 index 000000000..5714d0902 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/src/safeconsole.sol @@ -0,0 +1,13248 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +/// @author philogy +/// @dev Code generated automatically by script. +library safeconsole { + uint256 constant CONSOLE_ADDR = 0x000000000000000000000000000000000000000000636F6e736F6c652e6c6f67; + + // Credit to [0age](https://twitter.com/z0age/status/1654922202930888704) and [0xdapper](https://github.com/foundry-rs/forge-std/pull/374) + // for the view-to-pure log trick. + function _sendLogPayload(uint256 offset, uint256 size) private pure { + function(uint256, uint256) internal view fnIn = _sendLogPayloadView; + function(uint256, uint256) internal pure pureSendLogPayload; + assembly { + pureSendLogPayload := fnIn + } + pureSendLogPayload(offset, size); + } + + function _sendLogPayloadView(uint256 offset, uint256 size) private view { + assembly { + pop(staticcall(gas(), CONSOLE_ADDR, offset, size, 0x0, 0x0)) + } + } + + function _memcopy(uint256 fromOffset, uint256 toOffset, uint256 length) private pure { + function(uint256, uint256, uint256) internal view fnIn = _memcopyView; + function(uint256, uint256, uint256) internal pure pureMemcopy; + assembly { + pureMemcopy := fnIn + } + pureMemcopy(fromOffset, toOffset, length); + } + + function _memcopyView(uint256 fromOffset, uint256 toOffset, uint256 length) private view { + assembly { + pop(staticcall(gas(), 0x4, fromOffset, length, toOffset, length)) + } + } + + function logMemory(uint256 offset, uint256 length) internal pure { + if (offset >= 0x60) { + // Sufficient memory before slice to prepare call header. + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(sub(offset, 0x60)) + m1 := mload(sub(offset, 0x40)) + m2 := mload(sub(offset, 0x20)) + // Selector of `logBytes(bytes)`. + mstore(sub(offset, 0x60), 0xe17bf956) + mstore(sub(offset, 0x40), 0x20) + mstore(sub(offset, 0x20), length) + } + _sendLogPayload(offset - 0x44, length + 0x44); + assembly { + mstore(sub(offset, 0x60), m0) + mstore(sub(offset, 0x40), m1) + mstore(sub(offset, 0x20), m2) + } + } else { + // Insufficient space, so copy slice forward, add header and reverse. + bytes32 m0; + bytes32 m1; + bytes32 m2; + uint256 endOffset = offset + length; + assembly { + m0 := mload(add(endOffset, 0x00)) + m1 := mload(add(endOffset, 0x20)) + m2 := mload(add(endOffset, 0x40)) + } + _memcopy(offset, offset + 0x60, length); + assembly { + // Selector of `logBytes(bytes)`. + mstore(add(offset, 0x00), 0xe17bf956) + mstore(add(offset, 0x20), 0x20) + mstore(add(offset, 0x40), length) + } + _sendLogPayload(offset + 0x1c, length + 0x44); + _memcopy(offset + 0x60, offset, length); + assembly { + mstore(add(endOffset, 0x00), m0) + mstore(add(endOffset, 0x20), m1) + mstore(add(endOffset, 0x40), m2) + } + } + } + + function log(address p0) internal pure { + bytes32 m0; + bytes32 m1; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(address)`. + mstore(0x00, 0x2c2ecbc2) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(bool p0) internal pure { + bytes32 m0; + bytes32 m1; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(bool)`. + mstore(0x00, 0x32458eed) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(uint256 p0) internal pure { + bytes32 m0; + bytes32 m1; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + // Selector of `log(uint256)`. + mstore(0x00, 0xf82c50f1) + mstore(0x20, p0) + } + _sendLogPayload(0x1c, 0x24); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + } + } + + function log(bytes32 p0) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(string)`. + mstore(0x00, 0x41304fac) + mstore(0x20, 0x20) + writeString(0x40, p0) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,address)`. + mstore(0x00, 0xdaf0d4aa) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,bool)`. + mstore(0x00, 0x75b605d3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(address,uint256)`. + mstore(0x00, 0x8309e8a8) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(address p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,string)`. + mstore(0x00, 0x759f86bb) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,address)`. + mstore(0x00, 0x853c4849) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,bool)`. + mstore(0x00, 0x2a110e83) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(bool,uint256)`. + mstore(0x00, 0x399174d3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(bool p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,string)`. + mstore(0x00, 0x8feac525) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,address)`. + mstore(0x00, 0x69276c86) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,bool)`. + mstore(0x00, 0x1c9d7eb3) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + // Selector of `log(uint256,uint256)`. + mstore(0x00, 0xf666715a) + mstore(0x20, p0) + mstore(0x40, p1) + } + _sendLogPayload(0x1c, 0x44); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + } + } + + function log(uint256 p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,string)`. + mstore(0x00, 0x643fd0df) + mstore(0x20, p0) + mstore(0x40, 0x40) + writeString(0x60, p1) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, address p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,address)`. + mstore(0x00, 0x319af333) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, bool p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,bool)`. + mstore(0x00, 0xc3b55635) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, uint256 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(string,uint256)`. + mstore(0x00, 0xb60e72cc) + mstore(0x20, 0x40) + mstore(0x40, p1) + writeString(0x60, p0) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bytes32 p0, bytes32 p1) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,string)`. + mstore(0x00, 0x4b5c4277) + mstore(0x20, 0x40) + mstore(0x40, 0x80) + writeString(0x60, p0) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,address)`. + mstore(0x00, 0x018c84c2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,bool)`. + mstore(0x00, 0xf2a66286) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,address,uint256)`. + mstore(0x00, 0x17fe6185) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,address,string)`. + mstore(0x00, 0x007150be) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,address)`. + mstore(0x00, 0xf11699ed) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,bool)`. + mstore(0x00, 0xeb830c92) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,bool,uint256)`. + mstore(0x00, 0x9c4f99fb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,bool,string)`. + mstore(0x00, 0x212255cc) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,address)`. + mstore(0x00, 0x7bc0d848) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,bool)`. + mstore(0x00, 0x678209a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(address,uint256,uint256)`. + mstore(0x00, 0xb69bcaf6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(address p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,uint256,string)`. + mstore(0x00, 0xa1f2e8aa) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,address)`. + mstore(0x00, 0xf08744e8) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,bool)`. + mstore(0x00, 0xcf020fb1) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(address,string,uint256)`. + mstore(0x00, 0x67dd6ff1) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(address p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(address,string,string)`. + mstore(0x00, 0xfb772265) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bool p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,address)`. + mstore(0x00, 0xd2763667) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,bool)`. + mstore(0x00, 0x18c9c746) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,address,uint256)`. + mstore(0x00, 0x5f7b9afb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,address,string)`. + mstore(0x00, 0xde9a9270) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,address)`. + mstore(0x00, 0x1078f68d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,bool)`. + mstore(0x00, 0x50709698) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,bool,uint256)`. + mstore(0x00, 0x12f21602) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,bool,string)`. + mstore(0x00, 0x2555fa46) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,address)`. + mstore(0x00, 0x088ef9d2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,bool)`. + mstore(0x00, 0xe8defba9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(bool,uint256,uint256)`. + mstore(0x00, 0x37103367) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(bool p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,uint256,string)`. + mstore(0x00, 0xc3fc3970) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,address)`. + mstore(0x00, 0x9591b953) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,bool)`. + mstore(0x00, 0xdbb4c247) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(bool,string,uint256)`. + mstore(0x00, 0x1093ee11) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(bool,string,string)`. + mstore(0x00, 0xb076847f) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(uint256 p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,address)`. + mstore(0x00, 0xbcfd9be0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,bool)`. + mstore(0x00, 0x9b6ec042) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,address,uint256)`. + mstore(0x00, 0x5a9b5ed5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,address,string)`. + mstore(0x00, 0x63cb41f9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,address)`. + mstore(0x00, 0x35085f7b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,bool)`. + mstore(0x00, 0x20718650) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,bool,uint256)`. + mstore(0x00, 0x20098014) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,bool,string)`. + mstore(0x00, 0x85775021) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,address)`. + mstore(0x00, 0x5c96b331) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,bool)`. + mstore(0x00, 0x4766da72) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + // Selector of `log(uint256,uint256,uint256)`. + mstore(0x00, 0xd1ed7a3c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + } + _sendLogPayload(0x1c, 0x64); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,uint256,string)`. + mstore(0x00, 0x71d04af2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x60) + writeString(0x80, p2) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,address)`. + mstore(0x00, 0x7afac959) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,bool)`. + mstore(0x00, 0x4ceda75a) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(uint256,string,uint256)`. + mstore(0x00, 0x37aa7d4c) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, p2) + writeString(0x80, p1) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(uint256,string,string)`. + mstore(0x00, 0xb115611f) + mstore(0x20, p0) + mstore(0x40, 0x60) + mstore(0x60, 0xa0) + writeString(0x80, p1) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, address p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,address)`. + mstore(0x00, 0xfcec75e0) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,bool)`. + mstore(0x00, 0xc91d5ed4) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,address,uint256)`. + mstore(0x00, 0x0d26b925) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, address p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,address,string)`. + mstore(0x00, 0xe0e9ad4f) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bool p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,address)`. + mstore(0x00, 0x932bbb38) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,bool)`. + mstore(0x00, 0x850b7ad6) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,bool,uint256)`. + mstore(0x00, 0xc95958d6) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,bool,string)`. + mstore(0x00, 0xe298f47d) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, uint256 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,address)`. + mstore(0x00, 0x1c7ec448) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,bool)`. + mstore(0x00, 0xca7733b1) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + // Selector of `log(string,uint256,uint256)`. + mstore(0x00, 0xca47c4eb) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, p2) + writeString(0x80, p0) + } + _sendLogPayload(0x1c, 0xa4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,uint256,string)`. + mstore(0x00, 0x5970e089) + mstore(0x20, 0x60) + mstore(0x40, p1) + mstore(0x60, 0xa0) + writeString(0x80, p0) + writeString(0xc0, p2) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, address p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,address)`. + mstore(0x00, 0x95ed0195) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,bool)`. + mstore(0x00, 0xb0e0f9b5) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + // Selector of `log(string,string,uint256)`. + mstore(0x00, 0x5821efa1) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, p2) + writeString(0x80, p0) + writeString(0xc0, p1) + } + _sendLogPayload(0x1c, 0xe4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + // Selector of `log(string,string,string)`. + mstore(0x00, 0x2ced7cef) + mstore(0x20, 0x60) + mstore(0x40, 0xa0) + mstore(0x60, 0xe0) + writeString(0x80, p0) + writeString(0xc0, p1) + writeString(0x100, p2) + } + _sendLogPayload(0x1c, 0x124); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + } + } + + function log(address p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,address)`. + mstore(0x00, 0x665bf134) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,bool)`. + mstore(0x00, 0x0e378994) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,address,uint256)`. + mstore(0x00, 0x94250d77) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,address,string)`. + mstore(0x00, 0xf808da20) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,address)`. + mstore(0x00, 0x9f1bc36e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,bool)`. + mstore(0x00, 0x2cd4134a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,bool,uint256)`. + mstore(0x00, 0x3971e78c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,bool,string)`. + mstore(0x00, 0xaa6540c8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,address)`. + mstore(0x00, 0x8da6def5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,bool)`. + mstore(0x00, 0x9b4254e2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,address,uint256,uint256)`. + mstore(0x00, 0xbe553481) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,uint256,string)`. + mstore(0x00, 0xfdb4f990) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,address)`. + mstore(0x00, 0x8f736d16) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,bool)`. + mstore(0x00, 0x6f1a594e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,address,string,uint256)`. + mstore(0x00, 0xef1cefe7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,address,string,string)`. + mstore(0x00, 0x21bdaf25) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,address)`. + mstore(0x00, 0x660375dd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,bool)`. + mstore(0x00, 0xa6f50b0f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,address,uint256)`. + mstore(0x00, 0xa75c59de) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,address,string)`. + mstore(0x00, 0x2dd778e6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,address)`. + mstore(0x00, 0xcf394485) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,bool)`. + mstore(0x00, 0xcac43479) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,bool,uint256)`. + mstore(0x00, 0x8c4e5de6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,bool,string)`. + mstore(0x00, 0xdfc4a2e8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,address)`. + mstore(0x00, 0xccf790a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,bool)`. + mstore(0x00, 0xc4643e20) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,bool,uint256,uint256)`. + mstore(0x00, 0x386ff5f4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,uint256,string)`. + mstore(0x00, 0x0aa6cfad) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,address)`. + mstore(0x00, 0x19fd4956) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,bool)`. + mstore(0x00, 0x50ad461d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,bool,string,uint256)`. + mstore(0x00, 0x80e6a20b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,bool,string,string)`. + mstore(0x00, 0x475c5c33) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,address)`. + mstore(0x00, 0x478d1c62) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,bool)`. + mstore(0x00, 0xa1bcc9b3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,address,uint256)`. + mstore(0x00, 0x100f650e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,address,string)`. + mstore(0x00, 0x1da986ea) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,address)`. + mstore(0x00, 0xa31bfdcc) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,bool)`. + mstore(0x00, 0x3bf5e537) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,bool,uint256)`. + mstore(0x00, 0x22f6b999) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,bool,string)`. + mstore(0x00, 0xc5ad85f9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,address)`. + mstore(0x00, 0x20e3984d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,bool)`. + mstore(0x00, 0x66f1bc67) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(address,uint256,uint256,uint256)`. + mstore(0x00, 0x34f0e636) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(address p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,uint256,string)`. + mstore(0x00, 0x4a28c017) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,address)`. + mstore(0x00, 0x5c430d47) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,bool)`. + mstore(0x00, 0xcf18105c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,uint256,string,uint256)`. + mstore(0x00, 0xbf01f891) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,uint256,string,string)`. + mstore(0x00, 0x88a8c406) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,address)`. + mstore(0x00, 0x0d36fa20) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,bool)`. + mstore(0x00, 0x0df12b76) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,address,uint256)`. + mstore(0x00, 0x457fe3cf) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,address,string)`. + mstore(0x00, 0xf7e36245) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,address)`. + mstore(0x00, 0x205871c2) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,bool)`. + mstore(0x00, 0x5f1d5c9f) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,bool,uint256)`. + mstore(0x00, 0x515e38b6) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,bool,string)`. + mstore(0x00, 0xbc0b61fe) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,address)`. + mstore(0x00, 0x63183678) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,bool)`. + mstore(0x00, 0x0ef7e050) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(address,string,uint256,uint256)`. + mstore(0x00, 0x1dc8e1b8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(address p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,uint256,string)`. + mstore(0x00, 0x448830a8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,address)`. + mstore(0x00, 0xa04e2f87) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,bool)`. + mstore(0x00, 0x35a5071f) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(address,string,string,uint256)`. + mstore(0x00, 0x159f8927) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(address p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(address,string,string,string)`. + mstore(0x00, 0x5d02c50b) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bool p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,address)`. + mstore(0x00, 0x1d14d001) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,bool)`. + mstore(0x00, 0x46600be0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,address,uint256)`. + mstore(0x00, 0x0c66d1be) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,address,string)`. + mstore(0x00, 0xd812a167) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,address)`. + mstore(0x00, 0x1c41a336) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,bool)`. + mstore(0x00, 0x6a9c478b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,bool,uint256)`. + mstore(0x00, 0x07831502) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,bool,string)`. + mstore(0x00, 0x4a66cb34) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,address)`. + mstore(0x00, 0x136b05dd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,bool)`. + mstore(0x00, 0xd6019f1c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,address,uint256,uint256)`. + mstore(0x00, 0x7bf181a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,uint256,string)`. + mstore(0x00, 0x51f09ff8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,address)`. + mstore(0x00, 0x6f7c603e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,bool)`. + mstore(0x00, 0xe2bfd60b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,address,string,uint256)`. + mstore(0x00, 0xc21f64c7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,address,string,string)`. + mstore(0x00, 0xa73c1db6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,address)`. + mstore(0x00, 0xf4880ea4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,bool)`. + mstore(0x00, 0xc0a302d8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,address,uint256)`. + mstore(0x00, 0x4c123d57) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,address,string)`. + mstore(0x00, 0xa0a47963) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,address)`. + mstore(0x00, 0x8c329b1a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,bool)`. + mstore(0x00, 0x3b2a5ce0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,bool,uint256)`. + mstore(0x00, 0x6d7045c1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,bool,string)`. + mstore(0x00, 0x2ae408d4) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,address)`. + mstore(0x00, 0x54a7a9a0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,bool)`. + mstore(0x00, 0x619e4d0e) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,bool,uint256,uint256)`. + mstore(0x00, 0x0bb00eab) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,uint256,string)`. + mstore(0x00, 0x7dd4d0e0) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,address)`. + mstore(0x00, 0xf9ad2b89) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,bool)`. + mstore(0x00, 0xb857163a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,bool,string,uint256)`. + mstore(0x00, 0xe3a9ca2f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,bool,string,string)`. + mstore(0x00, 0x6d1e8751) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,address)`. + mstore(0x00, 0x26f560a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,bool)`. + mstore(0x00, 0xb4c314ff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,address,uint256)`. + mstore(0x00, 0x1537dc87) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,address,string)`. + mstore(0x00, 0x1bb3b09a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,address)`. + mstore(0x00, 0x9acd3616) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,bool)`. + mstore(0x00, 0xceb5f4d7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,bool,uint256)`. + mstore(0x00, 0x7f9bbca2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,bool,string)`. + mstore(0x00, 0x9143dbb1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,address)`. + mstore(0x00, 0x00dd87b9) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,bool)`. + mstore(0x00, 0xbe984353) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(bool,uint256,uint256,uint256)`. + mstore(0x00, 0x374bb4b2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(bool p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,uint256,string)`. + mstore(0x00, 0x8e69fb5d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,address)`. + mstore(0x00, 0xfedd1fff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,bool)`. + mstore(0x00, 0xe5e70b2b) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,uint256,string,uint256)`. + mstore(0x00, 0x6a1199e2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,uint256,string,string)`. + mstore(0x00, 0xf5bc2249) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,address)`. + mstore(0x00, 0x2b2b18dc) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,bool)`. + mstore(0x00, 0x6dd434ca) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,address,uint256)`. + mstore(0x00, 0xa5cada94) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,address,string)`. + mstore(0x00, 0x12d6c788) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,address)`. + mstore(0x00, 0x538e06ab) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,bool)`. + mstore(0x00, 0xdc5e935b) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,bool,uint256)`. + mstore(0x00, 0x1606a393) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,bool,string)`. + mstore(0x00, 0x483d0416) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,address)`. + mstore(0x00, 0x1596a1ce) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,bool)`. + mstore(0x00, 0x6b0e5d53) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(bool,string,uint256,uint256)`. + mstore(0x00, 0x28863fcb) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bool p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,uint256,string)`. + mstore(0x00, 0x1ad96de6) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,address)`. + mstore(0x00, 0x97d394d8) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,bool)`. + mstore(0x00, 0x1e4b87e5) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(bool,string,string,uint256)`. + mstore(0x00, 0x7be0c3eb) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bool p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(bool,string,string,string)`. + mstore(0x00, 0x1762e32a) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(uint256 p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,address)`. + mstore(0x00, 0x2488b414) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,bool)`. + mstore(0x00, 0x091ffaf5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,address,uint256)`. + mstore(0x00, 0x736efbb6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,address,string)`. + mstore(0x00, 0x031c6f73) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,address)`. + mstore(0x00, 0xef72c513) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,bool)`. + mstore(0x00, 0xe351140f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,bool,uint256)`. + mstore(0x00, 0x5abd992a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,bool,string)`. + mstore(0x00, 0x90fb06aa) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,address)`. + mstore(0x00, 0x15c127b5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,bool)`. + mstore(0x00, 0x5f743a7c) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,address,uint256,uint256)`. + mstore(0x00, 0x0c9cd9c1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,uint256,string)`. + mstore(0x00, 0xddb06521) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,address)`. + mstore(0x00, 0x9cba8fff) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,bool)`. + mstore(0x00, 0xcc32ab07) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,address,string,uint256)`. + mstore(0x00, 0x46826b5d) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,address,string,string)`. + mstore(0x00, 0x3e128ca3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,address)`. + mstore(0x00, 0xa1ef4cbb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,bool)`. + mstore(0x00, 0x454d54a5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,address,uint256)`. + mstore(0x00, 0x078287f5) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,address,string)`. + mstore(0x00, 0xade052c7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,address)`. + mstore(0x00, 0x69640b59) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,bool)`. + mstore(0x00, 0xb6f577a1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,bool,uint256)`. + mstore(0x00, 0x7464ce23) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,bool,string)`. + mstore(0x00, 0xdddb9561) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,address)`. + mstore(0x00, 0x88cb6041) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,bool)`. + mstore(0x00, 0x91a02e2a) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,bool,uint256,uint256)`. + mstore(0x00, 0xc6acc7a8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,uint256,string)`. + mstore(0x00, 0xde03e774) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,address)`. + mstore(0x00, 0xef529018) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,bool)`. + mstore(0x00, 0xeb928d7f) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,bool,string,uint256)`. + mstore(0x00, 0x2c1d0746) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,bool,string,string)`. + mstore(0x00, 0x68c8b8bd) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,address)`. + mstore(0x00, 0x56a5d1b1) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,bool)`. + mstore(0x00, 0x15cac476) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,address,uint256)`. + mstore(0x00, 0x88f6e4b2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,address,string)`. + mstore(0x00, 0x6cde40b8) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,address)`. + mstore(0x00, 0x9a816a83) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,bool)`. + mstore(0x00, 0xab085ae6) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,bool,uint256)`. + mstore(0x00, 0xeb7f6fd2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,bool,string)`. + mstore(0x00, 0xa5b4fc99) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,address)`. + mstore(0x00, 0xfa8185af) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,bool)`. + mstore(0x00, 0xc598d185) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + assembly { + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + // Selector of `log(uint256,uint256,uint256,uint256)`. + mstore(0x00, 0x193fb800) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + } + _sendLogPayload(0x1c, 0x84); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + } + } + + function log(uint256 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,uint256,string)`. + mstore(0x00, 0x59cfcbe3) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0x80) + writeString(0xa0, p3) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,address)`. + mstore(0x00, 0x42d21db7) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,bool)`. + mstore(0x00, 0x7af6ab25) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,uint256,string,uint256)`. + mstore(0x00, 0x5da297eb) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, p3) + writeString(0xa0, p2) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,uint256,string,string)`. + mstore(0x00, 0x27d8afd2) + mstore(0x20, p0) + mstore(0x40, p1) + mstore(0x60, 0x80) + mstore(0x80, 0xc0) + writeString(0xa0, p2) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,address)`. + mstore(0x00, 0x6168ed61) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,bool)`. + mstore(0x00, 0x90c30a56) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,address,uint256)`. + mstore(0x00, 0xe8d3018d) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,address,string)`. + mstore(0x00, 0x9c3adfa1) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,address)`. + mstore(0x00, 0xae2ec581) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,bool)`. + mstore(0x00, 0xba535d9c) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,bool,uint256)`. + mstore(0x00, 0xcf009880) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,bool,string)`. + mstore(0x00, 0xd2d423cd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,address)`. + mstore(0x00, 0x3b2279b4) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,bool)`. + mstore(0x00, 0x691a8f74) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(uint256,string,uint256,uint256)`. + mstore(0x00, 0x82c25b74) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p1) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(uint256 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,uint256,string)`. + mstore(0x00, 0xb7b914ca) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p1) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,address)`. + mstore(0x00, 0xd583c602) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,bool)`. + mstore(0x00, 0xb3a6b6bd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(uint256,string,string,uint256)`. + mstore(0x00, 0xb028c9bd) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p1) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(uint256 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(uint256,string,string,string)`. + mstore(0x00, 0x21ad0683) + mstore(0x20, p0) + mstore(0x40, 0x80) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p1) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, address p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,address)`. + mstore(0x00, 0xed8f28f6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,bool)`. + mstore(0x00, 0xb59dbd60) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,address,uint256)`. + mstore(0x00, 0x8ef3f399) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,address,string)`. + mstore(0x00, 0x800a1c67) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,address)`. + mstore(0x00, 0x223603bd) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,bool)`. + mstore(0x00, 0x79884c2b) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,bool,uint256)`. + mstore(0x00, 0x3e9f866a) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,bool,string)`. + mstore(0x00, 0x0454c079) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,address)`. + mstore(0x00, 0x63fb8bc5) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,bool)`. + mstore(0x00, 0xfc4845f0) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,address,uint256,uint256)`. + mstore(0x00, 0xf8f51b1e) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, address p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,uint256,string)`. + mstore(0x00, 0x5a477632) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,address)`. + mstore(0x00, 0xaabc9a31) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,bool)`. + mstore(0x00, 0x5f15d28c) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,address,string,uint256)`. + mstore(0x00, 0x91d1112e) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, address p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,address,string,string)`. + mstore(0x00, 0x245986f2) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bool p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,address)`. + mstore(0x00, 0x33e9dd1d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,bool)`. + mstore(0x00, 0x958c28c6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,address,uint256)`. + mstore(0x00, 0x5d08bb05) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,address,string)`. + mstore(0x00, 0x2d8e33a4) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,address)`. + mstore(0x00, 0x7190a529) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,bool)`. + mstore(0x00, 0x895af8c5) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,bool,uint256)`. + mstore(0x00, 0x8e3f78a9) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,bool,string)`. + mstore(0x00, 0x9d22d5dd) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,address)`. + mstore(0x00, 0x935e09bf) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,bool)`. + mstore(0x00, 0x8af7cf8a) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,bool,uint256,uint256)`. + mstore(0x00, 0x64b5bb67) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, bool p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,uint256,string)`. + mstore(0x00, 0x742d6ee7) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,address)`. + mstore(0x00, 0xe0625b29) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,bool)`. + mstore(0x00, 0x3f8a701d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,bool,string,uint256)`. + mstore(0x00, 0x24f91465) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bool p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,bool,string,string)`. + mstore(0x00, 0xa826caeb) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, uint256 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,address)`. + mstore(0x00, 0x5ea2b7ae) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,bool)`. + mstore(0x00, 0x82112a42) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,address,uint256)`. + mstore(0x00, 0x4f04fdc6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,address,string)`. + mstore(0x00, 0x9ffb2f93) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,address)`. + mstore(0x00, 0xe0e95b98) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,bool)`. + mstore(0x00, 0x354c36d6) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,bool,uint256)`. + mstore(0x00, 0xe41b6f6f) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,bool,string)`. + mstore(0x00, 0xabf73a98) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,address)`. + mstore(0x00, 0xe21de278) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,bool)`. + mstore(0x00, 0x7626db92) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + // Selector of `log(string,uint256,uint256,uint256)`. + mstore(0x00, 0xa7a87853) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + } + _sendLogPayload(0x1c, 0xc4); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + } + } + + function log(bytes32 p0, uint256 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,uint256,string)`. + mstore(0x00, 0x854b3496) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, p2) + mstore(0x80, 0xc0) + writeString(0xa0, p0) + writeString(0xe0, p3) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,address)`. + mstore(0x00, 0x7c4632a4) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,bool)`. + mstore(0x00, 0x7d24491d) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,uint256,string,uint256)`. + mstore(0x00, 0xc67ea9d1) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p2) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, uint256 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,uint256,string,string)`. + mstore(0x00, 0x5ab84e1f) + mstore(0x20, 0x80) + mstore(0x40, p1) + mstore(0x60, 0xc0) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p2) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,address)`. + mstore(0x00, 0x439c7bef) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,bool)`. + mstore(0x00, 0x5ccd4e37) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,address,uint256)`. + mstore(0x00, 0x7cc3c607) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, address p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,address,string)`. + mstore(0x00, 0xeb1bff80) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,address)`. + mstore(0x00, 0xc371c7db) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,bool)`. + mstore(0x00, 0x40785869) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,bool,uint256)`. + mstore(0x00, 0xd6aefad2) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, bool p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,bool,string)`. + mstore(0x00, 0x5e84b0ea) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,address)`. + mstore(0x00, 0x1023f7b2) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,bool)`. + mstore(0x00, 0xc3a8a654) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + // Selector of `log(string,string,uint256,uint256)`. + mstore(0x00, 0xf45d7d2c) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + } + _sendLogPayload(0x1c, 0x104); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + } + } + + function log(bytes32 p0, bytes32 p1, uint256 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,uint256,string)`. + mstore(0x00, 0x5d1a971a) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, p2) + mstore(0x80, 0x100) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p3) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, address p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,address)`. + mstore(0x00, 0x6d572f44) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, bool p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,bool)`. + mstore(0x00, 0x2c1754ed) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, uint256 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + // Selector of `log(string,string,string,uint256)`. + mstore(0x00, 0x8eafb02b) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, p3) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + } + _sendLogPayload(0x1c, 0x144); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + } + } + + function log(bytes32 p0, bytes32 p1, bytes32 p2, bytes32 p3) internal pure { + bytes32 m0; + bytes32 m1; + bytes32 m2; + bytes32 m3; + bytes32 m4; + bytes32 m5; + bytes32 m6; + bytes32 m7; + bytes32 m8; + bytes32 m9; + bytes32 m10; + bytes32 m11; + bytes32 m12; + assembly { + function writeString(pos, w) { + let length := 0 + for {} lt(length, 0x20) { length := add(length, 1) } { if iszero(byte(length, w)) { break } } + mstore(pos, length) + let shift := sub(256, shl(3, length)) + mstore(add(pos, 0x20), shl(shift, shr(shift, w))) + } + m0 := mload(0x00) + m1 := mload(0x20) + m2 := mload(0x40) + m3 := mload(0x60) + m4 := mload(0x80) + m5 := mload(0xa0) + m6 := mload(0xc0) + m7 := mload(0xe0) + m8 := mload(0x100) + m9 := mload(0x120) + m10 := mload(0x140) + m11 := mload(0x160) + m12 := mload(0x180) + // Selector of `log(string,string,string,string)`. + mstore(0x00, 0xde68f20a) + mstore(0x20, 0x80) + mstore(0x40, 0xc0) + mstore(0x60, 0x100) + mstore(0x80, 0x140) + writeString(0xa0, p0) + writeString(0xe0, p1) + writeString(0x120, p2) + writeString(0x160, p3) + } + _sendLogPayload(0x1c, 0x184); + assembly { + mstore(0x00, m0) + mstore(0x20, m1) + mstore(0x40, m2) + mstore(0x60, m3) + mstore(0x80, m4) + mstore(0xa0, m5) + mstore(0xc0, m6) + mstore(0xe0, m7) + mstore(0x100, m8) + mstore(0x120, m9) + mstore(0x140, m10) + mstore(0x160, m11) + mstore(0x180, m12) + } + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdAssertions.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdAssertions.t.sol new file mode 100644 index 000000000..fcc346be6 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdAssertions.t.sol @@ -0,0 +1,999 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdAssertionsTest is Test { + string constant CUSTOM_ERROR = "guh!"; + + bool constant EXPECT_PASS = false; + bool constant EXPECT_FAIL = true; + + bool constant SHOULD_REVERT = true; + bool constant SHOULD_RETURN = false; + + bool constant STRICT_REVERT_DATA = true; + bool constant NON_STRICT_REVERT_DATA = false; + + TestTest t = new TestTest(); + + /*////////////////////////////////////////////////////////////////////////// + FAIL(STRING) + //////////////////////////////////////////////////////////////////////////*/ + + function testShouldFail() external { + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._fail(CUSTOM_ERROR); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_FALSE + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertFalse_Pass() external { + t._assertFalse(false, EXPECT_PASS); + } + + function testAssertFalse_Fail() external { + vm.expectEmit(false, false, false, true); + emit log("Error: Assertion Failed"); + t._assertFalse(true, EXPECT_FAIL); + } + + function testAssertFalse_Err_Pass() external { + t._assertFalse(false, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertFalse_Err_Fail() external { + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertFalse(true, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ(BOOL) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEq_Bool_Pass(bool a) external { + t._assertEq(a, a, EXPECT_PASS); + } + + function testAssertEq_Bool_Fail(bool a, bool b) external { + vm.assume(a != b); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [bool]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_BoolErr_Pass(bool a) external { + t._assertEq(a, a, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertEq_BoolErr_Fail(bool a, bool b) external { + vm.assume(a != b); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ(BYTES) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEq_Bytes_Pass(bytes calldata a) external { + t._assertEq(a, a, EXPECT_PASS); + } + + function testAssertEq_Bytes_Fail(bytes calldata a, bytes calldata b) external { + vm.assume(keccak256(a) != keccak256(b)); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [bytes]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_BytesErr_Pass(bytes calldata a) external { + t._assertEq(a, a, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertEq_BytesErr_Fail(bytes calldata a, bytes calldata b) external { + vm.assume(keccak256(a) != keccak256(b)); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ(ARRAY) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEq_UintArr_Pass(uint256 e0, uint256 e1, uint256 e2) public { + uint256[] memory a = new uint256[](3); + a[0] = e0; + a[1] = e1; + a[2] = e2; + uint256[] memory b = new uint256[](3); + b[0] = e0; + b[1] = e1; + b[2] = e2; + + t._assertEq(a, b, EXPECT_PASS); + } + + function testAssertEq_IntArr_Pass(int256 e0, int256 e1, int256 e2) public { + int256[] memory a = new int256[](3); + a[0] = e0; + a[1] = e1; + a[2] = e2; + int256[] memory b = new int256[](3); + b[0] = e0; + b[1] = e1; + b[2] = e2; + + t._assertEq(a, b, EXPECT_PASS); + } + + function testAssertEq_AddressArr_Pass(address e0, address e1, address e2) public { + address[] memory a = new address[](3); + a[0] = e0; + a[1] = e1; + a[2] = e2; + address[] memory b = new address[](3); + b[0] = e0; + b[1] = e1; + b[2] = e2; + + t._assertEq(a, b, EXPECT_PASS); + } + + function testAssertEq_UintArr_FailEl(uint256 e1) public { + vm.assume(e1 != 0); + uint256[] memory a = new uint256[](3); + uint256[] memory b = new uint256[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [uint[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_IntArr_FailEl(int256 e1) public { + vm.assume(e1 != 0); + int256[] memory a = new int256[](3); + int256[] memory b = new int256[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [int[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_AddressArr_FailEl(address e1) public { + vm.assume(e1 != address(0)); + address[] memory a = new address[](3); + address[] memory b = new address[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [address[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_UintArrErr_FailEl(uint256 e1) public { + vm.assume(e1 != 0); + uint256[] memory a = new uint256[](3); + uint256[] memory b = new uint256[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [uint[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_IntArrErr_FailEl(int256 e1) public { + vm.assume(e1 != 0); + int256[] memory a = new int256[](3); + int256[] memory b = new int256[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [int[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_AddressArrErr_FailEl(address e1) public { + vm.assume(e1 != address(0)); + address[] memory a = new address[](3); + address[] memory b = new address[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [address[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_UintArr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + uint256[] memory a = new uint256[](lenA); + uint256[] memory b = new uint256[](lenB); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [uint[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_IntArr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + int256[] memory a = new int256[](lenA); + int256[] memory b = new int256[](lenB); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [int[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_AddressArr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + address[] memory a = new address[](lenA); + address[] memory b = new address[](lenB); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [address[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_UintArrErr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + uint256[] memory a = new uint256[](lenA); + uint256[] memory b = new uint256[](lenB); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [uint[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_IntArrErr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + int256[] memory a = new int256[](lenA); + int256[] memory b = new int256[](lenB); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [int[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_AddressArrErr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + address[] memory a = new address[](lenA); + address[] memory b = new address[](lenB); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [address[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEqUint() public { + assertEqUint(uint8(1), uint128(1)); + assertEqUint(uint64(2), uint64(2)); + } + + function testFailAssertEqUint() public { + assertEqUint(uint64(1), uint96(2)); + assertEqUint(uint160(3), uint160(4)); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_ABS(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqAbs_Uint_Pass(uint256 a, uint256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbs(a, b, maxDelta, EXPECT_PASS); + } + + function testAssertApproxEqAbs_Uint_Fail(uint256 a, uint256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [uint]"); + t._assertApproxEqAbs(a, b, maxDelta, EXPECT_FAIL); + } + + function testAssertApproxEqAbs_UintErr_Pass(uint256 a, uint256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqAbs_UintErr_Fail(uint256 a, uint256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_ABS_DECIMAL(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqAbsDecimal_Uint_Pass(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_PASS); + } + + function testAssertApproxEqAbsDecimal_Uint_Fail(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [uint]"); + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_FAIL); + } + + function testAssertApproxEqAbsDecimal_UintErr_Pass(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqAbsDecimal_UintErr_Fail(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_ABS(INT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqAbs_Int_Pass(int256 a, int256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbs(a, b, maxDelta, EXPECT_PASS); + } + + function testAssertApproxEqAbs_Int_Fail(int256 a, int256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [int]"); + t._assertApproxEqAbs(a, b, maxDelta, EXPECT_FAIL); + } + + function testAssertApproxEqAbs_IntErr_Pass(int256 a, int256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqAbs_IntErr_Fail(int256 a, int256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_ABS_DECIMAL(INT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqAbsDecimal_Int_Pass(int256 a, int256 b, uint256 maxDelta, uint256 decimals) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_PASS); + } + + function testAssertApproxEqAbsDecimal_Int_Fail(int256 a, int256 b, uint256 maxDelta, uint256 decimals) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [int]"); + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_FAIL); + } + + function testAssertApproxEqAbsDecimal_IntErr_Pass(int256 a, int256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqAbsDecimal_IntErr_Fail(int256 a, int256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_REL(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqRel_Uint_Pass(uint256 a, uint256 b, uint256 maxPercentDelta) external { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_PASS); + } + + function testAssertApproxEqRel_Uint_Fail(uint256 a, uint256 b, uint256 maxPercentDelta) external { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [uint]"); + t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_FAIL); + } + + function testAssertApproxEqRel_UintErr_Pass(uint256 a, uint256 b, uint256 maxPercentDelta) external { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqRel_UintErr_Fail(uint256 a, uint256 b, uint256 maxPercentDelta) external { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_REL_DECIMAL(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqRelDecimal_Uint_Pass(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) + external + { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_PASS); + } + + function testAssertApproxEqRelDecimal_Uint_Fail(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) + external + { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [uint]"); + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_FAIL); + } + + function testAssertApproxEqRelDecimal_UintErr_Pass(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) + external + { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqRelDecimal_UintErr_Fail(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) + external + { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_REL(INT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqRel_Int_Pass(int128 a, int128 b, uint128 maxPercentDelta) external { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_PASS); + } + + function testAssertApproxEqRel_Int_Fail(int128 a, int128 b, uint128 maxPercentDelta) external { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [int]"); + t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_FAIL); + } + + function testAssertApproxEqRel_IntErr_Pass(int128 a, int128 b, uint128 maxPercentDelta) external { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqRel_IntErr_Fail(int128 a, int128 b, uint128 maxPercentDelta) external { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_REL_DECIMAL(INT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqRelDecimal_Int_Pass(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) + external + { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_PASS); + } + + function testAssertApproxEqRelDecimal_Int_Fail(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) + external + { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [int]"); + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_FAIL); + } + + function testAssertApproxEqRelDecimal_IntErr_Pass(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) + external + { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqRelDecimal_IntErr_Fail(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) + external + { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ_CALL + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEqCall_Return_Pass( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnData, + bool strictRevertData + ) external { + address targetA = address(new TestMockCall(returnData, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnData, SHOULD_RETURN)); + + t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_PASS); + } + + function testAssertEqCall_Return_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnDataA, + bytes memory returnDataB, + bool strictRevertData + ) external { + vm.assume(keccak256(returnDataA) != keccak256(returnDataB)); + + address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN)); + + vm.expectEmit(true, true, true, true); + emit log_named_string("Error", "Call return data does not match"); + t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_FAIL); + } + + function testAssertEqCall_Revert_Pass( + bytes memory callDataA, + bytes memory callDataB, + bytes memory revertDataA, + bytes memory revertDataB + ) external { + address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); + address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); + + t._assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA, EXPECT_PASS); + } + + function testAssertEqCall_Revert_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory revertDataA, + bytes memory revertDataB + ) external { + vm.assume(keccak256(revertDataA) != keccak256(revertDataB)); + + address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); + address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); + + vm.expectEmit(true, true, true, true); + emit log_named_string("Error", "Call revert data does not match"); + t._assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA, EXPECT_FAIL); + } + + function testAssertEqCall_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnDataA, + bytes memory returnDataB, + bool strictRevertData + ) external { + address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT)); + + vm.expectEmit(true, true, true, true); + emit log_named_bytes(" Left call return data", returnDataA); + vm.expectEmit(true, true, true, true); + emit log_named_bytes(" Right call revert data", returnDataB); + t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_FAIL); + + vm.expectEmit(true, true, true, true); + emit log_named_bytes(" Left call revert data", returnDataB); + vm.expectEmit(true, true, true, true); + emit log_named_bytes(" Right call return data", returnDataA); + t._assertEqCall(targetB, callDataB, targetA, callDataA, strictRevertData, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_NOT_EQ(BYTES) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertNotEq_Bytes_Pass(bytes32 a, bytes32 b) external { + vm.assume(a != b); + t._assertNotEq(a, b, EXPECT_PASS); + } + + function testAssertNotEq_Bytes_Fail(bytes32 a) external { + vm.expectEmit(false, false, false, true); + emit log("Error: a != b not satisfied [bytes32]"); + t._assertNotEq(a, a, EXPECT_FAIL); + } + + function testAssertNotEq_BytesErr_Pass(bytes32 a, bytes32 b) external { + vm.assume(a != b); + t._assertNotEq(a, b, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAsserNottEq_BytesErr_Fail(bytes32 a) external { + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertNotEq(a, a, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_NOT_EQ(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertNotEqUint() public { + assertNotEq(uint8(1), uint128(2)); + assertNotEq(uint64(3), uint64(4)); + } + + function testFailAssertNotEqUint() public { + assertNotEq(uint64(1), uint96(1)); + assertNotEq(uint160(2), uint160(2)); + } +} + +contract TestTest is Test { + modifier expectFailure(bool expectFail) { + bool preState = vm.load(HEVM_ADDRESS, bytes32("failed")) != bytes32(0x00); + _; + bool postState = vm.load(HEVM_ADDRESS, bytes32("failed")) != bytes32(0x00); + + if (preState == true) { + return; + } + + if (expectFail) { + require(postState == true, "expected failure not triggered"); + + // unwind the expected failure + vm.store(HEVM_ADDRESS, bytes32("failed"), bytes32(uint256(0x00))); + } else { + require(postState == false, "unexpected failure was triggered"); + } + } + + function _fail(string memory err) external expectFailure(true) { + fail(err); + } + + function _assertFalse(bool data, bool expectFail) external expectFailure(expectFail) { + assertFalse(data); + } + + function _assertFalse(bool data, string memory err, bool expectFail) external expectFailure(expectFail) { + assertFalse(data, err); + } + + function _assertEq(bool a, bool b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(bool a, bool b, string memory err, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b, err); + } + + function _assertEq(bytes memory a, bytes memory b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(bytes memory a, bytes memory b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertEq(a, b, err); + } + + function _assertEq(uint256[] memory a, uint256[] memory b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(int256[] memory a, int256[] memory b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(address[] memory a, address[] memory b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(uint256[] memory a, uint256[] memory b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertEq(a, b, err); + } + + function _assertEq(int256[] memory a, int256[] memory b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertEq(a, b, err); + } + + function _assertEq(address[] memory a, address[] memory b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertEq(a, b, err); + } + + function _assertNotEq(bytes32 a, bytes32 b, bool expectFail) external expectFailure(expectFail) { + assertNotEq32(a, b); + } + + function _assertNotEq(bytes32 a, bytes32 b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertNotEq32(a, b, err); + } + + function _assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbs(a, b, maxDelta); + } + + function _assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbs(a, b, maxDelta, err); + } + + function _assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbsDecimal(a, b, maxDelta, decimals); + } + + function _assertApproxEqAbsDecimal( + uint256 a, + uint256 b, + uint256 maxDelta, + uint256 decimals, + string memory err, + bool expectFail + ) external expectFailure(expectFail) { + assertApproxEqAbsDecimal(a, b, maxDelta, decimals, err); + } + + function _assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbs(a, b, maxDelta); + } + + function _assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbs(a, b, maxDelta, err); + } + + function _assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbsDecimal(a, b, maxDelta, decimals); + } + + function _assertApproxEqAbsDecimal( + int256 a, + int256 b, + uint256 maxDelta, + uint256 decimals, + string memory err, + bool expectFail + ) external expectFailure(expectFail) { + assertApproxEqAbsDecimal(a, b, maxDelta, decimals, err); + } + + function _assertApproxEqRel(uint256 a, uint256 b, uint256 maxPercentDelta, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRel(a, b, maxPercentDelta); + } + + function _assertApproxEqRel(uint256 a, uint256 b, uint256 maxPercentDelta, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRel(a, b, maxPercentDelta, err); + } + + function _assertApproxEqRelDecimal(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); + } + + function _assertApproxEqRelDecimal( + uint256 a, + uint256 b, + uint256 maxPercentDelta, + uint256 decimals, + string memory err, + bool expectFail + ) external expectFailure(expectFail) { + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, err); + } + + function _assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRel(a, b, maxPercentDelta); + } + + function _assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRel(a, b, maxPercentDelta, err); + } + + function _assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); + } + + function _assertApproxEqRelDecimal( + int256 a, + int256 b, + uint256 maxPercentDelta, + uint256 decimals, + string memory err, + bool expectFail + ) external expectFailure(expectFail) { + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, err); + } + + function _assertEqCall( + address targetA, + bytes memory callDataA, + address targetB, + bytes memory callDataB, + bool strictRevertData, + bool expectFail + ) external expectFailure(expectFail) { + assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); + } +} + +contract TestMockCall { + bytes returnData; + bool shouldRevert; + + constructor(bytes memory returnData_, bool shouldRevert_) { + returnData = returnData_; + shouldRevert = shouldRevert_; + } + + fallback() external payable { + bytes memory returnData_ = returnData; + + if (shouldRevert) { + assembly { + revert(add(returnData_, 0x20), mload(returnData_)) + } + } else { + assembly { + return(add(returnData_, 0x20), mload(returnData_)) + } + } + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdChains.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdChains.t.sol new file mode 100644 index 000000000..7480e48dd --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdChains.t.sol @@ -0,0 +1,215 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdChainsMock is Test { + function exposed_getChain(string memory chainAlias) public returns (Chain memory) { + return getChain(chainAlias); + } + + function exposed_getChain(uint256 chainId) public returns (Chain memory) { + return getChain(chainId); + } + + function exposed_setChain(string memory chainAlias, ChainData memory chainData) public { + setChain(chainAlias, chainData); + } + + function exposed_setFallbackToDefaultRpcUrls(bool useDefault) public { + setFallbackToDefaultRpcUrls(useDefault); + } +} + +contract StdChainsTest is Test { + function testChainRpcInitialization() public { + // RPCs specified in `foundry.toml` should be updated. + assertEq(getChain(1).rpcUrl, "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3"); + assertEq(getChain("optimism_goerli").rpcUrl, "https://goerli.optimism.io/"); + assertEq(getChain("arbitrum_one_goerli").rpcUrl, "https://goerli-rollup.arbitrum.io/rpc/"); + + // Environment variables should be the next fallback + assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc"); + vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride"); + assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride"); + vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc"); + + // Cannot override RPCs defined in `foundry.toml` + vm.setEnv("MAINNET_RPC_URL", "myoverride2"); + assertEq(getChain("mainnet").rpcUrl, "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3"); + + // Other RPCs should remain unchanged. + assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545"); + assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001"); + } + + function testRpc(string memory rpcAlias) internal { + string memory rpcUrl = getChain(rpcAlias).rpcUrl; + vm.createSelectFork(rpcUrl); + } + + // Ensure we can connect to the default RPC URL for each chain. + // function testRpcs() public { + // testRpc("mainnet"); + // testRpc("goerli"); + // testRpc("sepolia"); + // testRpc("optimism"); + // testRpc("optimism_goerli"); + // testRpc("arbitrum_one"); + // testRpc("arbitrum_one_goerli"); + // testRpc("arbitrum_nova"); + // testRpc("polygon"); + // testRpc("polygon_mumbai"); + // testRpc("avalanche"); + // testRpc("avalanche_fuji"); + // testRpc("bnb_smart_chain"); + // testRpc("bnb_smart_chain_testnet"); + // testRpc("gnosis_chain"); + // } + + function testChainNoDefault() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found."); + stdChainsMock.exposed_getChain("does_not_exist"); + } + + function testSetChainFirstFails() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\"."); + stdChainsMock.exposed_setChain("anvil2", ChainData("Anvil", 31337, "URL")); + } + + function testChainBubbleUp() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + stdChainsMock.exposed_setChain("needs_undefined_env_var", ChainData("", 123456789, "")); + vm.expectRevert( + "Failed to resolve env var `UNDEFINED_RPC_URL_PLACEHOLDER` in `${UNDEFINED_RPC_URL_PLACEHOLDER}`: environment variable not found" + ); + stdChainsMock.exposed_getChain("needs_undefined_env_var"); + } + + function testCannotSetChain_ChainIdExists() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + stdChainsMock.exposed_setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + + vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".'); + + stdChainsMock.exposed_setChain("another_custom_chain", ChainData("", 123456789, "")); + } + + function testSetChain() public { + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + Chain memory customChain = getChain("custom_chain"); + assertEq(customChain.name, "Custom Chain"); + assertEq(customChain.chainId, 123456789); + assertEq(customChain.chainAlias, "custom_chain"); + assertEq(customChain.rpcUrl, "https://custom.chain/"); + Chain memory chainById = getChain(123456789); + assertEq(chainById.name, customChain.name); + assertEq(chainById.chainId, customChain.chainId); + assertEq(chainById.chainAlias, customChain.chainAlias); + assertEq(chainById.rpcUrl, customChain.rpcUrl); + customChain.name = "Another Custom Chain"; + customChain.chainId = 987654321; + setChain("another_custom_chain", customChain); + Chain memory anotherCustomChain = getChain("another_custom_chain"); + assertEq(anotherCustomChain.name, "Another Custom Chain"); + assertEq(anotherCustomChain.chainId, 987654321); + assertEq(anotherCustomChain.chainAlias, "another_custom_chain"); + assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/"); + // Verify the first chain data was not overwritten + chainById = getChain(123456789); + assertEq(chainById.name, "Custom Chain"); + assertEq(chainById.chainId, 123456789); + } + + function testSetNoEmptyAlias() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string."); + stdChainsMock.exposed_setChain("", ChainData("", 123456789, "")); + } + + function testSetNoChainId0() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0."); + stdChainsMock.exposed_setChain("alias", ChainData("", 0, "")); + } + + function testGetNoChainId0() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0."); + stdChainsMock.exposed_getChain(0); + } + + function testGetNoEmptyAlias() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string."); + stdChainsMock.exposed_getChain(""); + } + + function testChainIdNotFound() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found."); + stdChainsMock.exposed_getChain("no_such_alias"); + } + + function testChainAliasNotFound() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found."); + + stdChainsMock.exposed_getChain(321); + } + + function testSetChain_ExistingOne() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + assertEq(getChain(123456789).chainId, 123456789); + + setChain("custom_chain", ChainData("Modified Chain", 999999999, "https://modified.chain/")); + vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found."); + stdChainsMock.exposed_getChain(123456789); + + Chain memory modifiedChain = getChain(999999999); + assertEq(modifiedChain.name, "Modified Chain"); + assertEq(modifiedChain.chainId, 999999999); + assertEq(modifiedChain.rpcUrl, "https://modified.chain/"); + } + + function testDontUseDefaultRpcUrl() public { + // We deploy a mock to properly test the revert. + StdChainsMock stdChainsMock = new StdChainsMock(); + + // Should error if default RPCs flag is set to false. + stdChainsMock.exposed_setFallbackToDefaultRpcUrls(false); + vm.expectRevert( + "Failed to get environment variable `ANVIL_RPC_URL` as type `string`: environment variable not found" + ); + stdChainsMock.exposed_getChain(31337); + vm.expectRevert( + "Failed to get environment variable `SEPOLIA_RPC_URL` as type `string`: environment variable not found" + ); + stdChainsMock.exposed_getChain("sepolia"); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdCheats.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdCheats.t.sol new file mode 100644 index 000000000..bdc7870d6 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdCheats.t.sol @@ -0,0 +1,610 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/StdCheats.sol"; +import "../src/Test.sol"; +import "../src/StdJson.sol"; + +contract StdCheatsTest is Test { + Bar test; + + using stdJson for string; + + function setUp() public { + test = new Bar(); + } + + function testSkip() public { + vm.warp(100); + skip(25); + assertEq(block.timestamp, 125); + } + + function testRewind() public { + vm.warp(100); + rewind(25); + assertEq(block.timestamp, 75); + } + + function testHoax() public { + hoax(address(1337)); + test.bar{value: 100}(address(1337)); + } + + function testHoaxOrigin() public { + hoax(address(1337), address(1337)); + test.origin{value: 100}(address(1337)); + } + + function testHoaxDifferentAddresses() public { + hoax(address(1337), address(7331)); + test.origin{value: 100}(address(1337), address(7331)); + } + + function testStartHoax() public { + startHoax(address(1337)); + test.bar{value: 100}(address(1337)); + test.bar{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } + + function testStartHoaxOrigin() public { + startHoax(address(1337), address(1337)); + test.origin{value: 100}(address(1337)); + test.origin{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } + + function testChangePrankMsgSender() public { + vm.startPrank(address(1337)); + test.bar(address(1337)); + changePrank(address(0xdead)); + test.bar(address(0xdead)); + changePrank(address(1337)); + test.bar(address(1337)); + vm.stopPrank(); + } + + function testChangePrankMsgSenderAndTxOrigin() public { + vm.startPrank(address(1337), address(1338)); + test.origin(address(1337), address(1338)); + changePrank(address(0xdead), address(0xbeef)); + test.origin(address(0xdead), address(0xbeef)); + changePrank(address(1337), address(1338)); + test.origin(address(1337), address(1338)); + vm.stopPrank(); + } + + function testMakeAccountEquivalence() public { + Account memory account = makeAccount("1337"); + (address addr, uint256 key) = makeAddrAndKey("1337"); + assertEq(account.addr, addr); + assertEq(account.key, key); + } + + function testMakeAddrEquivalence() public { + (address addr,) = makeAddrAndKey("1337"); + assertEq(makeAddr("1337"), addr); + } + + function testMakeAddrSigning() public { + (address addr, uint256 key) = makeAddrAndKey("1337"); + bytes32 hash = keccak256("some_message"); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash); + assertEq(ecrecover(hash, v, r, s), addr); + } + + function testDeal() public { + deal(address(this), 1 ether); + assertEq(address(this).balance, 1 ether); + } + + function testDealToken() public { + Bar barToken = new Bar(); + address bar = address(barToken); + deal(bar, address(this), 10000e18); + assertEq(barToken.balanceOf(address(this)), 10000e18); + } + + function testDealTokenAdjustTotalSupply() public { + Bar barToken = new Bar(); + address bar = address(barToken); + deal(bar, address(this), 10000e18, true); + assertEq(barToken.balanceOf(address(this)), 10000e18); + assertEq(barToken.totalSupply(), 20000e18); + deal(bar, address(this), 0, true); + assertEq(barToken.balanceOf(address(this)), 0); + assertEq(barToken.totalSupply(), 10000e18); + } + + function testDealERC1155Token() public { + BarERC1155 barToken = new BarERC1155(); + address bar = address(barToken); + dealERC1155(bar, address(this), 0, 10000e18, false); + assertEq(barToken.balanceOf(address(this), 0), 10000e18); + } + + function testDealERC1155TokenAdjustTotalSupply() public { + BarERC1155 barToken = new BarERC1155(); + address bar = address(barToken); + dealERC1155(bar, address(this), 0, 10000e18, true); + assertEq(barToken.balanceOf(address(this), 0), 10000e18); + assertEq(barToken.totalSupply(0), 20000e18); + dealERC1155(bar, address(this), 0, 0, true); + assertEq(barToken.balanceOf(address(this), 0), 0); + assertEq(barToken.totalSupply(0), 10000e18); + } + + function testDealERC721Token() public { + BarERC721 barToken = new BarERC721(); + address bar = address(barToken); + dealERC721(bar, address(2), 1); + assertEq(barToken.balanceOf(address(2)), 1); + assertEq(barToken.balanceOf(address(1)), 0); + dealERC721(bar, address(1), 2); + assertEq(barToken.balanceOf(address(1)), 1); + assertEq(barToken.balanceOf(bar), 1); + } + + function testDeployCode() public { + address deployed = deployCode("StdCheats.t.sol:Bar", bytes("")); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + } + + function testDestroyAccount() public { + // deploy something to destroy it + BarERC721 barToken = new BarERC721(); + address bar = address(barToken); + vm.setNonce(bar, 10); + deal(bar, 100); + + uint256 prevThisBalance = address(this).balance; + uint256 size; + assembly { + size := extcodesize(bar) + } + + assertGt(size, 0); + assertEq(bar.balance, 100); + assertEq(vm.getNonce(bar), 10); + + destroyAccount(bar, address(this)); + assembly { + size := extcodesize(bar) + } + assertEq(address(this).balance, prevThisBalance + 100); + assertEq(vm.getNonce(bar), 0); + assertEq(size, 0); + assertEq(bar.balance, 0); + } + + function testDeployCodeNoArgs() public { + address deployed = deployCode("StdCheats.t.sol:Bar"); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + } + + function testDeployCodeVal() public { + address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + assertEq(deployed.balance, 1 ether); + } + + function testDeployCodeValNoArgs() public { + address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + assertEq(deployed.balance, 1 ether); + } + + // We need this so we can call "this.deployCode" rather than "deployCode" directly + function deployCodeHelper(string memory what) external { + deployCode(what); + } + + function testDeployCodeFail() public { + vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed.")); + this.deployCodeHelper("StdCheats.t.sol:RevertingContract"); + } + + function getCode(address who) internal view returns (bytes memory o_code) { + /// @solidity memory-safe-assembly + assembly { + // retrieve the size of the code, this needs assembly + let size := extcodesize(who) + // allocate output byte array - this could also be done without assembly + // by using o_code = new bytes(size) + o_code := mload(0x40) + // new "memory end" including padding + mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) + // store length in memory + mstore(o_code, size) + // actually retrieve the code, this needs assembly + extcodecopy(who, add(o_code, 0x20), 0, size) + } + } + + function testDeriveRememberKey() public { + string memory mnemonic = "test test test test test test test test test test test junk"; + + (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0); + assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); + } + + function testBytesToUint() public { + assertEq(3, bytesToUint_test(hex"03")); + assertEq(2, bytesToUint_test(hex"02")); + assertEq(255, bytesToUint_test(hex"ff")); + assertEq(29625, bytesToUint_test(hex"73b9")); + } + + function testParseJsonTxDetail() public { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + string memory json = vm.readFile(path); + bytes memory transactionDetails = json.parseRaw(".transactions[0].tx"); + RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail)); + Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail); + assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512); + assertEq( + txDetail.data, + hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004" + ); + assertEq(txDetail.nonce, 3); + assertEq(txDetail.txType, 2); + assertEq(txDetail.gas, 29625); + assertEq(txDetail.value, 0); + } + + function testReadEIP1559Transaction() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + uint256 index = 0; + Tx1559 memory transaction = readTx1559(path, index); + transaction; + } + + function testReadEIP1559Transactions() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + Tx1559[] memory transactions = readTx1559s(path); + transactions; + } + + function testReadReceipt() public { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + uint256 index = 5; + Receipt memory receipt = readReceipt(path, index); + assertEq( + receipt.logsBloom, + hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100" + ); + } + + function testReadReceipts() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + Receipt[] memory receipts = readReceipts(path); + receipts; + } + + function testGasMeteringModifier() public { + uint256 gas_start_normal = gasleft(); + addInLoop(); + uint256 gas_used_normal = gas_start_normal - gasleft(); + + uint256 gas_start_single = gasleft(); + addInLoopNoGas(); + uint256 gas_used_single = gas_start_single - gasleft(); + + uint256 gas_start_double = gasleft(); + addInLoopNoGasNoGas(); + uint256 gas_used_double = gas_start_double - gasleft(); + + emit log_named_uint("Normal gas", gas_used_normal); + emit log_named_uint("Single modifier gas", gas_used_single); + emit log_named_uint("Double modifier gas", gas_used_double); + assertTrue(gas_used_double + gas_used_single < gas_used_normal); + } + + function addInLoop() internal pure returns (uint256) { + uint256 b; + for (uint256 i; i < 10000; i++) { + b += i; + } + return b; + } + + function addInLoopNoGas() internal noGasMetering returns (uint256) { + return addInLoop(); + } + + function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) { + return addInLoopNoGas(); + } + + function bytesToUint_test(bytes memory b) private pure returns (uint256) { + uint256 number; + for (uint256 i = 0; i < b.length; i++) { + number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1)))); + } + return number; + } + + function testAssumeAddressIsNot(address addr) external { + // skip over Payable and NonPayable enums + for (uint8 i = 2; i < uint8(type(AddressType).max); i++) { + assumeAddressIsNot(addr, AddressType(i)); + } + assertTrue(addr != address(0)); + assertTrue(addr < address(1) || addr > address(9)); + assertTrue(addr != address(vm) || addr != 0x000000000000000000636F6e736F6c652e6c6f67); + } + + function testAssumePayable() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + + // all should revert since these addresses are not payable + + // VM address + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + + // Console address + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x000000000000000000636F6e736F6c652e6c6f67); + + // Create2Deployer + vm.expectRevert(); + stdCheatsMock.exposed_assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); + + // all should pass since these addresses are payable + + // vitalik.eth + stdCheatsMock.exposed_assumePayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045); + + // mock payable contract + MockContractPayable cp = new MockContractPayable(); + stdCheatsMock.exposed_assumePayable(address(cp)); + } + + function testAssumeNotPayable() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + + // all should pass since these addresses are not payable + + // VM address + stdCheatsMock.exposed_assumeNotPayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + + // Console address + stdCheatsMock.exposed_assumeNotPayable(0x000000000000000000636F6e736F6c652e6c6f67); + + // Create2Deployer + stdCheatsMock.exposed_assumeNotPayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); + + // all should revert since these addresses are payable + + // vitalik.eth + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotPayable(0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045); + + // mock payable contract + MockContractPayable cp = new MockContractPayable(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotPayable(address(cp)); + } + + function testAssumeNotPrecompile(address addr) external { + assumeNotPrecompile(addr, getChain("optimism_goerli").chainId); + assertTrue( + addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000)) + || addr > address(0x4200000000000000000000000000000000000800) + ); + } + + function testAssumeNotForgeAddress(address addr) external { + assumeNotForgeAddress(addr); + assertTrue( + addr != address(vm) && addr != 0x000000000000000000636F6e736F6c652e6c6f67 + && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C + ); + } + + function testCannotDeployCodeTo() external { + vm.expectRevert("StdCheats deployCodeTo(string,bytes,uint256,address): Failed to create runtime bytecode."); + this._revertDeployCodeTo(); + } + + function _revertDeployCodeTo() external { + deployCodeTo("StdCheats.t.sol:RevertingContract", address(0)); + } + + function testDeployCodeTo() external { + address arbitraryAddress = makeAddr("arbitraryAddress"); + + deployCodeTo( + "StdCheats.t.sol:MockContractWithConstructorArgs", + abi.encode(uint256(6), true, bytes20(arbitraryAddress)), + 1 ether, + arbitraryAddress + ); + + MockContractWithConstructorArgs ct = MockContractWithConstructorArgs(arbitraryAddress); + + assertEq(arbitraryAddress.balance, 1 ether); + assertEq(ct.x(), 6); + assertTrue(ct.y()); + assertEq(ct.z(), bytes20(arbitraryAddress)); + } +} + +contract StdCheatsMock is StdCheats { + function exposed_assumePayable(address addr) external { + assumePayable(addr); + } + + function exposed_assumeNotPayable(address addr) external { + assumeNotPayable(addr); + } + + // We deploy a mock version so we can properly test expected reverts. + function exposed_assumeNotBlacklisted(address token, address addr) external view { + return assumeNotBlacklisted(token, addr); + } +} + +contract StdCheatsForkTest is Test { + address internal constant SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; + address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD; + address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; + address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A; + + function setUp() public { + // All tests of the `assumeNotBlacklisted` method are fork tests using live contracts. + vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); + } + + function testCannotAssumeNoBlacklisted_EOA() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + address eoa = vm.addr({privateKey: 1}); + vm.expectRevert("StdCheats assumeNotBlacklisted(address,address): Token address is not a contract."); + stdCheatsMock.exposed_assumeNotBlacklisted(eoa, address(0)); + } + + function testAssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external { + assumeNotBlacklisted(SHIB, addr); + assertTrue(true); + } + + function testAssumeNoBlacklisted_USDC() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotBlacklisted(USDC, USDC_BLACKLISTED_USER); + } + + function testAssumeNotBlacklisted_USDC(address addr) external { + assumeNotBlacklisted(USDC, addr); + assertFalse(USDCLike(USDC).isBlacklisted(addr)); + } + + function testAssumeNoBlacklisted_USDT() external { + // We deploy a mock version so we can properly test the revert. + StdCheatsMock stdCheatsMock = new StdCheatsMock(); + vm.expectRevert(); + stdCheatsMock.exposed_assumeNotBlacklisted(USDT, USDT_BLACKLISTED_USER); + } + + function testAssumeNotBlacklisted_USDT(address addr) external { + assumeNotBlacklisted(USDT, addr); + assertFalse(USDTLike(USDT).isBlackListed(addr)); + } +} + +contract Bar { + constructor() payable { + /// `DEAL` STDCHEAT + totalSupply = 10000e18; + balanceOf[address(this)] = totalSupply; + } + + /// `HOAX` and `CHANGEPRANK` STDCHEATS + function bar(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + } + + function origin(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + require(tx.origin == expectedSender, "!prank"); + } + + function origin(address expectedSender, address expectedOrigin) public payable { + require(msg.sender == expectedSender, "!prank"); + require(tx.origin == expectedOrigin, "!prank"); + } + + /// `DEAL` STDCHEAT + mapping(address => uint256) public balanceOf; + uint256 public totalSupply; +} + +contract BarERC1155 { + constructor() payable { + /// `DEALERC1155` STDCHEAT + _totalSupply[0] = 10000e18; + _balances[0][address(this)] = _totalSupply[0]; + } + + function balanceOf(address account, uint256 id) public view virtual returns (uint256) { + return _balances[id][account]; + } + + function totalSupply(uint256 id) public view virtual returns (uint256) { + return _totalSupply[id]; + } + + /// `DEALERC1155` STDCHEAT + mapping(uint256 => mapping(address => uint256)) private _balances; + mapping(uint256 => uint256) private _totalSupply; +} + +contract BarERC721 { + constructor() payable { + /// `DEALERC721` STDCHEAT + _owners[1] = address(1); + _balances[address(1)] = 1; + _owners[2] = address(this); + _owners[3] = address(this); + _balances[address(this)] = 2; + } + + function balanceOf(address owner) public view virtual returns (uint256) { + return _balances[owner]; + } + + function ownerOf(uint256 tokenId) public view virtual returns (address) { + address owner = _owners[tokenId]; + return owner; + } + + mapping(uint256 => address) private _owners; + mapping(address => uint256) private _balances; +} + +interface USDCLike { + function isBlacklisted(address) external view returns (bool); +} + +interface USDTLike { + function isBlackListed(address) external view returns (bool); +} + +contract RevertingContract { + constructor() { + revert(); + } +} + +contract MockContractWithConstructorArgs { + uint256 public immutable x; + bool public y; + bytes20 public z; + + constructor(uint256 _x, bool _y, bytes20 _z) payable { + x = _x; + y = _y; + z = _z; + } +} + +contract MockContractPayable { + receive() external payable {} +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdError.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdError.t.sol new file mode 100644 index 000000000..ccd3eface --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdError.t.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import "../src/StdError.sol"; +import "../src/Test.sol"; + +contract StdErrorsTest is Test { + ErrorsTest test; + + function setUp() public { + test = new ErrorsTest(); + } + + function testExpectAssertion() public { + vm.expectRevert(stdError.assertionError); + test.assertionError(); + } + + function testExpectArithmetic() public { + vm.expectRevert(stdError.arithmeticError); + test.arithmeticError(10); + } + + function testExpectDiv() public { + vm.expectRevert(stdError.divisionError); + test.divError(0); + } + + function testExpectMod() public { + vm.expectRevert(stdError.divisionError); + test.modError(0); + } + + function testExpectEnum() public { + vm.expectRevert(stdError.enumConversionError); + test.enumConversion(1); + } + + function testExpectEncodeStg() public { + vm.expectRevert(stdError.encodeStorageError); + test.encodeStgError(); + } + + function testExpectPop() public { + vm.expectRevert(stdError.popError); + test.pop(); + } + + function testExpectOOB() public { + vm.expectRevert(stdError.indexOOBError); + test.indexOOBError(1); + } + + function testExpectMem() public { + vm.expectRevert(stdError.memOverflowError); + test.mem(); + } + + function testExpectIntern() public { + vm.expectRevert(stdError.zeroVarError); + test.intern(); + } +} + +contract ErrorsTest { + enum T {T1} + + uint256[] public someArr; + bytes someBytes; + + function assertionError() public pure { + assert(false); + } + + function arithmeticError(uint256 a) public pure { + a -= 100; + } + + function divError(uint256 a) public pure { + 100 / a; + } + + function modError(uint256 a) public pure { + 100 % a; + } + + function enumConversion(uint256 a) public pure { + T(a); + } + + function encodeStgError() public { + /// @solidity memory-safe-assembly + assembly { + sstore(someBytes.slot, 1) + } + keccak256(someBytes); + } + + function pop() public { + someArr.pop(); + } + + function indexOOBError(uint256 a) public pure { + uint256[] memory t = new uint256[](0); + t[a]; + } + + function mem() public pure { + uint256 l = 2 ** 256 / 32; + new uint256[](l); + } + + function intern() public returns (uint256) { + function(uint256) internal returns (uint256) x; + x(2); + return 7; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdMath.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdMath.t.sol new file mode 100644 index 000000000..31c8a315a --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdMath.t.sol @@ -0,0 +1,212 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import "../src/StdMath.sol"; +import "../src/Test.sol"; + +contract StdMathMock is Test { + function exposed_percentDelta(uint256 a, uint256 b) public pure returns (uint256) { + return stdMath.percentDelta(a, b); + } + + function exposed_percentDelta(int256 a, int256 b) public pure returns (uint256) { + return stdMath.percentDelta(a, b); + } +} + +contract StdMathTest is Test { + function testGetAbs() external { + assertEq(stdMath.abs(-50), 50); + assertEq(stdMath.abs(50), 50); + assertEq(stdMath.abs(-1337), 1337); + assertEq(stdMath.abs(0), 0); + + assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1); + assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1)); + } + + function testGetAbs_Fuzz(int256 a) external { + uint256 manualAbs = getAbs(a); + + uint256 abs = stdMath.abs(a); + + assertEq(abs, manualAbs); + } + + function testGetDelta_Uint() external { + assertEq(stdMath.delta(uint256(0), uint256(0)), 0); + assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337); + assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max); + assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max); + assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max); + + assertEq(stdMath.delta(0, uint256(0)), 0); + assertEq(stdMath.delta(1337, uint256(0)), 1337); + assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max); + assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max); + assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max); + + assertEq(stdMath.delta(1337, uint256(1337)), 0); + assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0); + assertEq(stdMath.delta(5000, uint256(1250)), 3750); + } + + function testGetDelta_Uint_Fuzz(uint256 a, uint256 b) external { + uint256 manualDelta; + if (a > b) { + manualDelta = a - b; + } else { + manualDelta = b - a; + } + + uint256 delta = stdMath.delta(a, b); + + assertEq(delta, manualDelta); + } + + function testGetDelta_Int() external { + assertEq(stdMath.delta(int256(0), int256(0)), 0); + assertEq(stdMath.delta(int256(0), int256(1337)), 1337); + assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1); + assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1); + assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1); + + assertEq(stdMath.delta(0, int256(0)), 0); + assertEq(stdMath.delta(1337, int256(0)), 1337); + assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1); + assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1); + assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1); + + assertEq(stdMath.delta(-0, int256(0)), 0); + assertEq(stdMath.delta(-1337, int256(0)), 1337); + assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1); + assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1); + assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1); + + assertEq(stdMath.delta(int256(0), -0), 0); + assertEq(stdMath.delta(int256(0), -1337), 1337); + assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1); + assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1); + assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1); + + assertEq(stdMath.delta(1337, int256(1337)), 0); + assertEq(stdMath.delta(type(int256).max, type(int256).max), 0); + assertEq(stdMath.delta(type(int256).min, type(int256).min), 0); + assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max); + assertEq(stdMath.delta(5000, int256(1250)), 3750); + } + + function testGetDelta_Int_Fuzz(int256 a, int256 b) external { + uint256 absA = getAbs(a); + uint256 absB = getAbs(b); + uint256 absDelta = absA > absB ? absA - absB : absB - absA; + + uint256 manualDelta; + if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { + manualDelta = absDelta; + } + // (a < 0 && b >= 0) || (a >= 0 && b < 0) + else { + manualDelta = absA + absB; + } + + uint256 delta = stdMath.delta(a, b); + + assertEq(delta, manualDelta); + } + + function testGetPercentDelta_Uint() external { + StdMathMock stdMathMock = new StdMathMock(); + + assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18); + + assertEq(stdMath.percentDelta(1337, uint256(1337)), 0); + assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0); + assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18); + assertEq(stdMath.percentDelta(2500, uint256(2500)), 0); + assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18); + assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18); + + vm.expectRevert(stdError.divisionError); + stdMathMock.exposed_percentDelta(uint256(1), 0); + } + + function testGetPercentDelta_Uint_Fuzz(uint192 a, uint192 b) external { + vm.assume(b != 0); + uint256 manualDelta; + if (a > b) { + manualDelta = a - b; + } else { + manualDelta = b - a; + } + + uint256 manualPercentDelta = manualDelta * 1e18 / b; + uint256 percentDelta = stdMath.percentDelta(a, b); + + assertEq(percentDelta, manualPercentDelta); + } + + function testGetPercentDelta_Int() external { + // We deploy a mock version so we can properly test the revert. + StdMathMock stdMathMock = new StdMathMock(); + + assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18); + assertEq(stdMath.percentDelta(int256(0), -1337), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18); + + assertEq(stdMath.percentDelta(1337, int256(1337)), 0); + assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0); + assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0); + + assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down + assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down + assertEq(stdMath.percentDelta(0, int256(2500)), 1e18); + assertEq(stdMath.percentDelta(2500, int256(2500)), 0); + assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18); + assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18); + + vm.expectRevert(stdError.divisionError); + stdMathMock.exposed_percentDelta(int256(1), 0); + } + + function testGetPercentDelta_Int_Fuzz(int192 a, int192 b) external { + vm.assume(b != 0); + uint256 absA = getAbs(a); + uint256 absB = getAbs(b); + uint256 absDelta = absA > absB ? absA - absB : absB - absA; + + uint256 manualDelta; + if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { + manualDelta = absDelta; + } + // (a < 0 && b >= 0) || (a >= 0 && b < 0) + else { + manualDelta = absA + absB; + } + + uint256 manualPercentDelta = manualDelta * 1e18 / absB; + uint256 percentDelta = stdMath.percentDelta(a, b); + + assertEq(percentDelta, manualPercentDelta); + } + + /*////////////////////////////////////////////////////////////////////////// + HELPERS + //////////////////////////////////////////////////////////////////////////*/ + + function getAbs(int256 a) private pure returns (uint256) { + if (a < 0) { + return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a); + } + + return uint256(a); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdStorage.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdStorage.t.sol new file mode 100644 index 000000000..fbf169d9f --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdStorage.t.sol @@ -0,0 +1,293 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/StdStorage.sol"; +import "../src/Test.sol"; + +contract StdStorageTest is Test { + using stdStorage for StdStorage; + + StorageTest internal test; + + function setUp() public { + test = new StorageTest(); + } + + function testStorageHidden() public { + assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find()); + } + + function testStorageObvious() public { + assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find()); + } + + function testStorageCheckedWriteHidden() public { + stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100); + assertEq(uint256(test.hidden()), 100); + } + + function testStorageCheckedWriteObvious() public { + stdstore.target(address(test)).sig(test.exists.selector).checked_write(100); + assertEq(test.exists(), 100); + } + + function testStorageCheckedWriteSignedIntegerHidden() public { + stdstore.target(address(test)).sig(test.hidden.selector).checked_write_int(-100); + assertEq(int256(uint256(test.hidden())), -100); + } + + function testStorageCheckedWriteSignedIntegerObvious() public { + stdstore.target(address(test)).sig(test.tG.selector).checked_write_int(-100); + assertEq(test.tG(), -100); + } + + function testStorageMapStructA() public { + uint256 slot = + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find(); + assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot); + } + + function testStorageMapStructB() public { + uint256 slot = + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find(); + assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot); + } + + function testStorageDeepMap() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key( + address(this) + ).find(); + assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot); + } + + function testStorageCheckedWriteDeepMap() public { + stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this)) + .checked_write(100); + assertEq(100, test.deep_map(address(this), address(this))); + } + + function testStorageDeepMapStructA() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) + .with_key(address(this)).depth(0).find(); + assertEq( + bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0), + bytes32(slot) + ); + } + + function testStorageDeepMapStructB() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) + .with_key(address(this)).depth(1).find(); + assertEq( + bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1), + bytes32(slot) + ); + } + + function testStorageCheckedWriteDeepMapStructA() public { + stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( + address(this) + ).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); + assertEq(100, a); + assertEq(0, b); + } + + function testStorageCheckedWriteDeepMapStructB() public { + stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( + address(this) + ).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); + assertEq(0, a); + assertEq(100, b); + } + + function testStorageCheckedWriteMapStructA() public { + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.map_struct(address(this)); + assertEq(a, 100); + assertEq(b, 0); + } + + function testStorageCheckedWriteMapStructB() public { + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.map_struct(address(this)); + assertEq(a, 0); + assertEq(b, 100); + } + + function testStorageStructA() public { + uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find(); + assertEq(uint256(7), slot); + } + + function testStorageStructB() public { + uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find(); + assertEq(uint256(7) + 1, slot); + } + + function testStorageCheckedWriteStructA() public { + stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.basic(); + assertEq(a, 100); + assertEq(b, 1337); + } + + function testStorageCheckedWriteStructB() public { + stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.basic(); + assertEq(a, 1337); + assertEq(b, 100); + } + + function testStorageMapAddrFound() public { + uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find(); + assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot); + } + + function testStorageMapUintFound() public { + uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find(); + assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot); + } + + function testStorageCheckedWriteMapUint() public { + stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100); + assertEq(100, test.map_uint(100)); + } + + function testStorageCheckedWriteMapAddr() public { + stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100); + assertEq(100, test.map_addr(address(this))); + } + + function testStorageCheckedWriteMapBool() public { + stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true); + assertTrue(test.map_bool(address(this))); + } + + function testFailStorageCheckedWriteMapPacked() public { + // expect PackedSlot error but not external call so cant expectRevert + stdstore.target(address(test)).sig(test.read_struct_lower.selector).with_key(address(uint160(1337))) + .checked_write(100); + } + + function testStorageCheckedWriteMapPackedSuccess() public { + uint256 full = test.map_packed(address(1337)); + // keep upper 128, set lower 128 to 1337 + full = (full & (uint256((1 << 128) - 1) << 128)) | 1337; + stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write( + full + ); + assertEq(1337, test.read_struct_lower(address(1337))); + } + + function testFailStorageConst() public { + // vm.expectRevert(abi.encodeWithSignature("NotStorage(bytes4)", bytes4(keccak256("const()")))); + stdstore.target(address(test)).sig("const()").find(); + } + + function testFailStorageNativePack() public { + stdstore.target(address(test)).sig(test.tA.selector).find(); + stdstore.target(address(test)).sig(test.tB.selector).find(); + + // these both would fail + stdstore.target(address(test)).sig(test.tC.selector).find(); + stdstore.target(address(test)).sig(test.tD.selector).find(); + } + + function testStorageReadBytes32() public { + bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32(); + assertEq(val, hex"1337"); + } + + function testStorageReadBool_False() public { + bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool(); + assertEq(val, false); + } + + function testStorageReadBool_True() public { + bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool(); + assertEq(val, true); + } + + function testStorageReadBool_Revert() public { + vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); + this.readNonBoolValue(); + } + + function readNonBoolValue() public { + stdstore.target(address(test)).sig(test.tE.selector).read_bool(); + } + + function testStorageReadAddress() public { + address val = stdstore.target(address(test)).sig(test.tF.selector).read_address(); + assertEq(val, address(1337)); + } + + function testStorageReadUint() public { + uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint(); + assertEq(val, 1); + } + + function testStorageReadInt() public { + int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int(); + assertEq(val, type(int256).min); + } +} + +contract StorageTest { + uint256 public exists = 1; + mapping(address => uint256) public map_addr; + mapping(uint256 => uint256) public map_uint; + mapping(address => uint256) public map_packed; + mapping(address => UnpackedStruct) public map_struct; + mapping(address => mapping(address => uint256)) public deep_map; + mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; + UnpackedStruct public basic; + + uint248 public tA; + bool public tB; + + bool public tC = false; + uint248 public tD = 1; + + struct UnpackedStruct { + uint256 a; + uint256 b; + } + + mapping(address => bool) public map_bool; + + bytes32 public tE = hex"1337"; + address public tF = address(1337); + int256 public tG = type(int256).min; + bool public tH = true; + + constructor() { + basic = UnpackedStruct({a: 1337, b: 1337}); + + uint256 two = (1 << 128) | 1; + map_packed[msg.sender] = two; + map_packed[address(uint160(1337))] = 1 << 128; + } + + function read_struct_upper(address who) public view returns (uint256) { + return map_packed[who] >> 128; + } + + function read_struct_lower(address who) public view returns (uint256) { + return map_packed[who] & ((1 << 128) - 1); + } + + function hidden() public view returns (bytes32 t) { + bytes32 slot = keccak256("my.random.var"); + /// @solidity memory-safe-assembly + assembly { + t := sload(slot) + } + } + + function const() public pure returns (bytes32 t) { + t = bytes32(hex"1337"); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdStyle.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdStyle.t.sol new file mode 100644 index 000000000..f6fffe7ac --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdStyle.t.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdStyleTest is Test { + function testStyleColor() public pure { + console2.log(StdStyle.red("StdStyle.red String Test")); + console2.log(StdStyle.red(uint256(10e18))); + console2.log(StdStyle.red(int256(-10e18))); + console2.log(StdStyle.red(true)); + console2.log(StdStyle.red(address(0))); + console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.redBytes32("StdStyle.redBytes32")); + console2.log(StdStyle.green("StdStyle.green String Test")); + console2.log(StdStyle.green(uint256(10e18))); + console2.log(StdStyle.green(int256(-10e18))); + console2.log(StdStyle.green(true)); + console2.log(StdStyle.green(address(0))); + console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32")); + console2.log(StdStyle.yellow("StdStyle.yellow String Test")); + console2.log(StdStyle.yellow(uint256(10e18))); + console2.log(StdStyle.yellow(int256(-10e18))); + console2.log(StdStyle.yellow(true)); + console2.log(StdStyle.yellow(address(0))); + console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32")); + console2.log(StdStyle.blue("StdStyle.blue String Test")); + console2.log(StdStyle.blue(uint256(10e18))); + console2.log(StdStyle.blue(int256(-10e18))); + console2.log(StdStyle.blue(true)); + console2.log(StdStyle.blue(address(0))); + console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32")); + console2.log(StdStyle.magenta("StdStyle.magenta String Test")); + console2.log(StdStyle.magenta(uint256(10e18))); + console2.log(StdStyle.magenta(int256(-10e18))); + console2.log(StdStyle.magenta(true)); + console2.log(StdStyle.magenta(address(0))); + console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32")); + console2.log(StdStyle.cyan("StdStyle.cyan String Test")); + console2.log(StdStyle.cyan(uint256(10e18))); + console2.log(StdStyle.cyan(int256(-10e18))); + console2.log(StdStyle.cyan(true)); + console2.log(StdStyle.cyan(address(0))); + console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32")); + } + + function testStyleFontWeight() public pure { + console2.log(StdStyle.bold("StdStyle.bold String Test")); + console2.log(StdStyle.bold(uint256(10e18))); + console2.log(StdStyle.bold(int256(-10e18))); + console2.log(StdStyle.bold(address(0))); + console2.log(StdStyle.bold(true)); + console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32")); + console2.log(StdStyle.dim("StdStyle.dim String Test")); + console2.log(StdStyle.dim(uint256(10e18))); + console2.log(StdStyle.dim(int256(-10e18))); + console2.log(StdStyle.dim(address(0))); + console2.log(StdStyle.dim(true)); + console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32")); + console2.log(StdStyle.italic("StdStyle.italic String Test")); + console2.log(StdStyle.italic(uint256(10e18))); + console2.log(StdStyle.italic(int256(-10e18))); + console2.log(StdStyle.italic(address(0))); + console2.log(StdStyle.italic(true)); + console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32")); + console2.log(StdStyle.underline("StdStyle.underline String Test")); + console2.log(StdStyle.underline(uint256(10e18))); + console2.log(StdStyle.underline(int256(-10e18))); + console2.log(StdStyle.underline(address(0))); + console2.log(StdStyle.underline(true)); + console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32")); + console2.log(StdStyle.inverse("StdStyle.inverse String Test")); + console2.log(StdStyle.inverse(uint256(10e18))); + console2.log(StdStyle.inverse(int256(-10e18))); + console2.log(StdStyle.inverse(address(0))); + console2.log(StdStyle.inverse(true)); + console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32")); + } + + function testStyleCombined() public pure { + console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test"))); + console2.log(StdStyle.green(StdStyle.dim(uint256(10e18)))); + console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18)))); + console2.log(StdStyle.blue(StdStyle.underline(address(0)))); + console2.log(StdStyle.magenta(StdStyle.inverse(true))); + } + + function testStyleCustom() public pure { + console2.log(h1("Custom Style 1")); + console2.log(h2("Custom Style 2")); + } + + function h1(string memory a) private pure returns (string memory) { + return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a))); + } + + function h2(string memory a) private pure returns (string memory) { + return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a))); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdUtils.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdUtils.t.sol new file mode 100644 index 000000000..d648512c8 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/StdUtils.t.sol @@ -0,0 +1,342 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdUtilsMock is StdUtils { + // We deploy a mock version so we can properly test expected reverts. + function exposed_getTokenBalances(address token, address[] memory addresses) + external + returns (uint256[] memory balances) + { + return getTokenBalances(token, addresses); + } + + function exposed_bound(int256 num, int256 min, int256 max) external view returns (int256) { + return bound(num, min, max); + } + + function exposed_bound(uint256 num, uint256 min, uint256 max) external view returns (uint256) { + return bound(num, min, max); + } + + function exposed_bytesToUint(bytes memory b) external pure returns (uint256) { + return bytesToUint(b); + } +} + +contract StdUtilsTest is Test { + /*////////////////////////////////////////////////////////////////////////// + BOUND UINT + //////////////////////////////////////////////////////////////////////////*/ + + function testBound() public { + assertEq(bound(uint256(5), 0, 4), 0); + assertEq(bound(uint256(0), 69, 69), 69); + assertEq(bound(uint256(0), 68, 69), 68); + assertEq(bound(uint256(10), 150, 190), 174); + assertEq(bound(uint256(300), 2800, 3200), 3107); + assertEq(bound(uint256(9999), 1337, 6666), 4669); + } + + function testBound_WithinRange() public { + assertEq(bound(uint256(51), 50, 150), 51); + assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150)); + assertEq(bound(uint256(149), 50, 150), 149); + assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150)); + } + + function testBound_EdgeCoverage() public { + assertEq(bound(uint256(0), 50, 150), 50); + assertEq(bound(uint256(1), 50, 150), 51); + assertEq(bound(uint256(2), 50, 150), 52); + assertEq(bound(uint256(3), 50, 150), 53); + assertEq(bound(type(uint256).max, 50, 150), 150); + assertEq(bound(type(uint256).max - 1, 50, 150), 149); + assertEq(bound(type(uint256).max - 2, 50, 150), 148); + assertEq(bound(type(uint256).max - 3, 50, 150), 147); + } + + function testBound_DistributionIsEven(uint256 min, uint256 size) public { + size = size % 100 + 1; + min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size); + uint256 max = min + size - 1; + uint256 result; + + for (uint256 i = 1; i <= size * 4; ++i) { + // x > max + result = bound(max + i, min, max); + assertEq(result, min + (i - 1) % size); + // x < min + result = bound(min - i, min, max); + assertEq(result, max - (i - 1) % size); + } + } + + function testBound(uint256 num, uint256 min, uint256 max) public { + if (min > max) (min, max) = (max, min); + + uint256 result = bound(num, min, max); + + assertGe(result, min); + assertLe(result, max); + assertEq(result, bound(result, min, max)); + if (num >= min && num <= max) assertEq(result, num); + } + + function testBoundUint256Max() public { + assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1); + assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max); + } + + function testCannotBoundMaxLessThanMin() public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); + stdUtils.exposed_bound(uint256(5), 100, 10); + } + + function testCannotBoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.assume(min > max); + vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); + stdUtils.exposed_bound(num, min, max); + } + + /*////////////////////////////////////////////////////////////////////////// + BOUND INT + //////////////////////////////////////////////////////////////////////////*/ + + function testBoundInt() public { + assertEq(bound(-3, 0, 4), 2); + assertEq(bound(0, -69, -69), -69); + assertEq(bound(0, -69, -68), -68); + assertEq(bound(-10, 150, 190), 154); + assertEq(bound(-300, 2800, 3200), 2908); + assertEq(bound(9999, -1337, 6666), 1995); + } + + function testBoundInt_WithinRange() public { + assertEq(bound(51, -50, 150), 51); + assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150)); + assertEq(bound(149, -50, 150), 149); + assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150)); + } + + function testBoundInt_EdgeCoverage() public { + assertEq(bound(type(int256).min, -50, 150), -50); + assertEq(bound(type(int256).min + 1, -50, 150), -49); + assertEq(bound(type(int256).min + 2, -50, 150), -48); + assertEq(bound(type(int256).min + 3, -50, 150), -47); + assertEq(bound(type(int256).min, 10, 150), 10); + assertEq(bound(type(int256).min + 1, 10, 150), 11); + assertEq(bound(type(int256).min + 2, 10, 150), 12); + assertEq(bound(type(int256).min + 3, 10, 150), 13); + + assertEq(bound(type(int256).max, -50, 150), 150); + assertEq(bound(type(int256).max - 1, -50, 150), 149); + assertEq(bound(type(int256).max - 2, -50, 150), 148); + assertEq(bound(type(int256).max - 3, -50, 150), 147); + assertEq(bound(type(int256).max, -50, -10), -10); + assertEq(bound(type(int256).max - 1, -50, -10), -11); + assertEq(bound(type(int256).max - 2, -50, -10), -12); + assertEq(bound(type(int256).max - 3, -50, -10), -13); + } + + function testBoundInt_DistributionIsEven(int256 min, uint256 size) public { + size = size % 100 + 1; + min = bound(min, -int256(size / 2), int256(size - size / 2)); + int256 max = min + int256(size) - 1; + int256 result; + + for (uint256 i = 1; i <= size * 4; ++i) { + // x > max + result = bound(max + int256(i), min, max); + assertEq(result, min + int256((i - 1) % size)); + // x < min + result = bound(min - int256(i), min, max); + assertEq(result, max - int256((i - 1) % size)); + } + } + + function testBoundInt(int256 num, int256 min, int256 max) public { + if (min > max) (min, max) = (max, min); + + int256 result = bound(num, min, max); + + assertGe(result, min); + assertLe(result, max); + assertEq(result, bound(result, min, max)); + if (num >= min && num <= max) assertEq(result, num); + } + + function testBoundIntInt256Max() public { + assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1); + assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max); + } + + function testBoundIntInt256Min() public { + assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min); + assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1); + } + + function testCannotBoundIntMaxLessThanMin() public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); + stdUtils.exposed_bound(-5, 100, 10); + } + + function testCannotBoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + vm.assume(min > max); + vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); + stdUtils.exposed_bound(num, min, max); + } + + /*////////////////////////////////////////////////////////////////////////// + BOUND PRIVATE KEY + //////////////////////////////////////////////////////////////////////////*/ + + function testBoundPrivateKey() public { + assertEq(boundPrivateKey(0), 1); + assertEq(boundPrivateKey(1), 1); + assertEq(boundPrivateKey(300), 300); + assertEq(boundPrivateKey(9999), 9999); + assertEq(boundPrivateKey(SECP256K1_ORDER - 1), SECP256K1_ORDER - 1); + assertEq(boundPrivateKey(SECP256K1_ORDER), 1); + assertEq(boundPrivateKey(SECP256K1_ORDER + 1), 2); + assertEq(boundPrivateKey(UINT256_MAX), UINT256_MAX & SECP256K1_ORDER - 1); // x&y is equivalent to x-x%y + } + + /*////////////////////////////////////////////////////////////////////////// + BYTES TO UINT + //////////////////////////////////////////////////////////////////////////*/ + + function testBytesToUint() external { + bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bytes memory two = hex"02"; + bytes memory millionEther = hex"d3c21bcecceda1000000"; + + assertEq(bytesToUint(maxUint), type(uint256).max); + assertEq(bytesToUint(two), 2); + assertEq(bytesToUint(millionEther), 1_000_000 ether); + } + + function testCannotConvertGT32Bytes() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32."); + stdUtils.exposed_bytesToUint(thirty3Bytes); + } + + /*////////////////////////////////////////////////////////////////////////// + COMPUTE CREATE ADDRESS + //////////////////////////////////////////////////////////////////////////*/ + + function testComputeCreateAddress() external { + address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; + uint256 nonce = 14; + address createAddress = computeCreateAddress(deployer, nonce); + assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45); + } + + /*////////////////////////////////////////////////////////////////////////// + COMPUTE CREATE2 ADDRESS + //////////////////////////////////////////////////////////////////////////*/ + + function testComputeCreate2Address() external { + bytes32 salt = bytes32(uint256(31415)); + bytes32 initcodeHash = keccak256(abi.encode(0x6080)); + address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; + address create2Address = computeCreate2Address(salt, initcodeHash, deployer); + assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3); + } + + function testComputeCreate2AddressWithDefaultDeployer() external { + bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0; + bytes32 initcodeHash = hashInitCode(hex"6080", ""); + assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0); + address create2Address = computeCreate2Address(salt, initcodeHash); + assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6); + } +} + +contract StdUtilsForkTest is Test { + /*////////////////////////////////////////////////////////////////////////// + GET TOKEN BALANCES + //////////////////////////////////////////////////////////////////////////*/ + + address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; + address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170; + address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA; + address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385; + + address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17; + address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52; + + function setUp() public { + // All tests of the `getTokenBalances` method are fork tests using live contracts. + vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); + } + + function testCannotGetTokenBalances_NonTokenContract() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function, + // so the `balanceOf` call should revert. + address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f); + address[] memory addresses = new address[](1); + addresses[0] = USDC_HOLDER_0; + + vm.expectRevert("Multicall3: call failed"); + stdUtils.exposed_getTokenBalances(token, addresses); + } + + function testCannotGetTokenBalances_EOA() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + address eoa = vm.addr({privateKey: 1}); + address[] memory addresses = new address[](1); + addresses[0] = USDC_HOLDER_0; + vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract."); + stdUtils.exposed_getTokenBalances(eoa, addresses); + } + + function testGetTokenBalances_Empty() external { + address[] memory addresses = new address[](0); + uint256[] memory balances = getTokenBalances(USDC, addresses); + assertEq(balances.length, 0); + } + + function testGetTokenBalances_USDC() external { + address[] memory addresses = new address[](2); + addresses[0] = USDC_HOLDER_0; + addresses[1] = USDC_HOLDER_1; + uint256[] memory balances = getTokenBalances(USDC, addresses); + assertEq(balances[0], 159_000_000_000_000); + assertEq(balances[1], 131_350_000_000_000); + } + + function testGetTokenBalances_SHIB() external { + address[] memory addresses = new address[](3); + addresses[0] = SHIB_HOLDER_0; + addresses[1] = SHIB_HOLDER_1; + addresses[2] = SHIB_HOLDER_2; + uint256[] memory balances = getTokenBalances(SHIB, addresses); + assertEq(balances[0], 3_323_256_285_484.42e18); + assertEq(balances[1], 1_271_702_771_149.99999928e18); + assertEq(balances[2], 606_357_106_247e18); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationScript.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationScript.sol new file mode 100644 index 000000000..e205cfff3 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationScript.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Script.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationScript is Script {} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationScriptBase.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationScriptBase.sol new file mode 100644 index 000000000..ce8e0e954 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationScriptBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Script.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationScriptBase is ScriptBase {} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationTest.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationTest.sol new file mode 100644 index 000000000..9beeafeb7 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationTest.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Test.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationTest is Test {} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationTestBase.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationTestBase.sol new file mode 100644 index 000000000..e993535bc --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/compilation/CompilationTestBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Test.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationTestBase is TestBase {} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/fixtures/broadcast.log.json b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/fixtures/broadcast.log.json new file mode 100644 index 000000000..0a0200bca --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/forge-std/test/fixtures/broadcast.log.json @@ -0,0 +1,187 @@ +{ + "transactions": [ + { + "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "function": "multiple_arguments(uint256,address,uint256[]):(uint256)", + "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "gas": "0x73b9", + "value": "0x0", + "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004", + "nonce": "0x3", + "accessList": [] + } + }, + { + "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "function": "inc():(uint256)", + "arguments": [], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "gas": "0xdcb2", + "value": "0x0", + "data": "0x371303c0", + "nonce": "0x4", + "accessList": [] + } + }, + { + "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "function": "t(uint256):(uint256)", + "arguments": ["1"], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "gas": "0x8599", + "value": "0x0", + "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x5", + "accessList": [] + } + } + ], + "receipts": [ + { + "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181", + "transactionIndex": "0x0", + "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af", + "blockNumber": "0x1", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "cumulativeGasUsed": "0x13f3a", + "gasUsed": "0x13f3a", + "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782", + "transactionIndex": "0x0", + "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148", + "blockNumber": "0x2", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "cumulativeGasUsed": "0x45d80", + "gasUsed": "0x45d80", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d", + "transactionIndex": "0x0", + "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58", + "blockNumber": "0x3", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "cumulativeGasUsed": "0x45feb", + "gasUsed": "0x45feb", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", + "transactionIndex": "0x0", + "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629", + "blockNumber": "0x4", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "cumulativeGasUsed": "0x5905", + "gasUsed": "0x5905", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", + "transactionIndex": "0x0", + "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11", + "blockNumber": "0x5", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "cumulativeGasUsed": "0xa9c4", + "gasUsed": "0xa9c4", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "transactionIndex": "0x0", + "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", + "blockNumber": "0x6", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "cumulativeGasUsed": "0x66c5", + "gasUsed": "0x66c5", + "contractAddress": null, + "logs": [ + { + "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "topics": [ + "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000", + "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", + "blockNumber": "0x6", + "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "transactionIndex": "0x1", + "logIndex": "0x0", + "transactionLogIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16", + "transactionIndex": "0x0", + "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c", + "blockNumber": "0x7", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x0000000000000000000000000000000000001337", + "cumulativeGasUsed": "0x5208", + "gasUsed": "0x5208", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + } + ], + "libraries": [ + "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3" + ], + "pending": [], + "path": "broadcast/Broadcast.t.sol/31337/run-latest.json", + "returns": {}, + "timestamp": 1655140035 +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/binary_check.sh b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/binary_check.sh new file mode 100644 index 000000000..725a058b5 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/binary_check.sh @@ -0,0 +1,11 @@ +#! /bin/bash + +if ! [[ "$(npm list -g huffc)" =~ "empty" ]]; then + # huffc was installed via npm, return 0x00 + echo -n 0x00 +elif [[ "$(yarn global list)" =~ "huffc" ]]; then + # huffc was installed via yarn, return 0x00 + echo -n 0x00 +else + echo -n 0x01 +fi diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/file_writer.sh b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/file_writer.sh new file mode 100644 index 000000000..93e3a8d32 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/file_writer.sh @@ -0,0 +1,3 @@ +#! /bin/bash + +echo "$2" > $1 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/rand_bytes.sh b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/rand_bytes.sh new file mode 100644 index 000000000..fdd992106 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/rand_bytes.sh @@ -0,0 +1,3 @@ +#! /bin/bash + +echo -n $(hexdump -n 16 -v -e '"0x" 32/1 "%02x" "\n"' /dev/urandom) \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/read_and_append.sh b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/read_and_append.sh new file mode 100644 index 000000000..a14336571 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/foundry-huff/scripts/read_and_append.sh @@ -0,0 +1,3 @@ +#! /bin/bash + +cat $2 >> $1 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.gitattributes b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.gitattributes new file mode 100644 index 000000000..52031de51 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.gitattributes @@ -0,0 +1 @@ +*.sol linguist-language=Solidity diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.github/workflows/ci.yml b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.github/workflows/ci.yml new file mode 100644 index 000000000..2f339b276 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.github/workflows/ci.yml @@ -0,0 +1,14 @@ +name: "CI" +on: "push" +jobs: + tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2.3.4 + - uses: cachix/install-nix-action@v13 + - name: Install dapp + run: nix-env -iA dapp -f $(curl -sS https://api.github.com/repos/dapphub/dapptools/releases/latest | jq -r .tarball_url) + - name: Fetch submodules + run: git submodule update --init + - name: Run tests + run: make test diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.gitmodules b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.gitmodules new file mode 100644 index 000000000..e12471968 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/ds-test"] + path = lib/ds-test + url = https://github.com/dapphub/ds-test diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/LICENSE b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/LICENSE new file mode 100644 index 000000000..769c24095 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2016 Nick Johnson + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/Makefile b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/Makefile new file mode 100644 index 000000000..31975ee25 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/Makefile @@ -0,0 +1,4 @@ +all :; dapp build +clean :; dapp clean +test :; dapp test +deploy :; dapp create SolidityStringutils diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/README b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/README new file mode 100644 index 000000000..ad344af7e --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/README @@ -0,0 +1 @@ +Basic string utilities for Solidity, optimized for low gas usage. diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/README.md b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/README.md new file mode 100644 index 000000000..458634147 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/README.md @@ -0,0 +1,357 @@ + +# String & slice utility library for Solidity +## Overview +Functionality in this library is largely implemented using an abstraction called a 'slice'. A slice represents a part of a string - anything from the entire string to a single character, or even no characters at all (a 0-length slice). Since a slice only has to specify an offset and a length, copying and manipulating slices is a lot less expensive than copying and manipulating the strings they reference. + +To further reduce gas costs, most functions on slice that need to return a slice modify the original one instead of allocating a new one; for instance, `s.split(".")` will return the text up to the first '.', modifying s to only contain the remainder of the string after the '.'. In situations where you do not want to modify the original slice, you can make a copy first with `.copy()`, for example: `s.copy().split(".")`. Try and avoid using this idiom in loops; since Solidity has no memory management, it will result in allocating many short-lived slices that are later discarded. + +Functions that return two slices come in two versions: a non-allocating version that takes the second slice as an argument, modifying it in place, and an allocating version that allocates and returns the second slice; see `nextRune` for example. + +Functions that have to copy string data will return strings rather than slices; these can be cast back to slices for further processing if required. + +## Examples +### Basic usage + import "github.com/Arachnid/solidity-stringutils/strings.sol"; + + contract Contract { + using strings for *; + + // ... + } + +### Getting the character length of a string + var len = "Unicode snowman ☃".toSlice().len(); // 17 + +### Splitting a string around a delimiter + var s = "foo bar baz".toSlice(); + var foo = s.split(" ".toSlice()); + +After the above code executes, `s` is now "bar baz", and `foo` is now "foo". + +### Splitting a string into an array + var s = "www.google.com".toSlice(); + var delim = ".".toSlice(); + var parts = new string[](s.count(delim) + 1); + for(uint i = 0; i < parts.length; i++) { + parts[i] = s.split(delim).toString(); + } + +### Extracting the middle part of a string + var s = "www.google.com".toSlice(); + strings.slice memory part; + s.split(".".toSlice(), part); // part and return value is "www" + s.split(".".toSlice(), part); // part and return value is "google" + +This approach uses less memory than the above, by reusing the slice `part` for each section of string extracted. + +### Converting a slice back to a string + var myString = mySlice.toString(); + +### Finding and returning the first occurrence of a substring + var s = "A B C B D".toSlice(); + s.find("B".toSlice()); // "B C B D" + +`find` modifies `s` to contain the part of the string from the first match onwards. + +### Finding and returning the last occurrence of a substring + var s = "A B C B D".toSlice(); + s.rfind("B".toSlice()); // "A B C B" + +`rfind` modifies `s` to contain the part of the string from the last match back to the start. + +### Finding without modifying the original slice. + var s = "A B C B D".toSlice(); + var substring = s.copy().rfind("B".toSlice()); // "A B C B" + +`copy` lets you cheaply duplicate a slice so you don't modify the original. + +### Prefix and suffix matching + var s = "A B C B D".toSlice(); + s.startsWith("A".toSlice()); // True + s.endsWith("D".toSlice()); // True + s.startsWith("B".toSlice()); // False + +### Removing a prefix or suffix + var s = "A B C B D".toSlice(); + s.beyond("A ".toSlice()).until(" D".toSlice()); // "B C B" + +`beyond` modifies `s` to contain the text after its argument; `until` modifies `s` to contain the text up to its argument. If the argument isn't found, `s` is unmodified. + +### Finding and returning the string up to the first match + var s = "A B C B D".toSlice(); + var needle = "B".toSlice(); + var substring = s.until(s.copy().find(needle).beyond(needle)); + +Calling `find` on a copy of `s` returns the part of the string from `needle` onwards; calling `.beyond(needle)` removes `needle` as a prefix, and finally calling `s.until()` removes the entire end of the string, leaving everything up to and including the first match. + +### Concatenating strings + var s = "abc".toSlice().concat("def".toSlice()); // "abcdef" + +## Reference + +### toSlice(string self) internal returns (slice) +Returns a slice containing the entire string. + +Arguments: + + - self The string to make a slice from. + +Returns A newly allocated slice containing the entire string. + +### copy(slice self) internal returns (slice) +Returns a new slice containing the same data as the current slice. + +Arguments: + + - self The slice to copy. + +Returns A new slice containing the same data as `self`. + +### toString(slice self) internal returns (string) + +Copies a slice to a new string. + +Arguments: + + - self The slice to copy. + +Returns A newly allocated string containing the slice's text. + +### len(slice self) internal returns (uint) + +Returns the length in runes of the slice. Note that this operation takes time proportional to the length of the slice; avoid using it in loops, and call `slice.empty()` if you only need to know whether the slice is empty or not. + +Arguments: + + - self The slice to operate on. + +Returns The length of the slice in runes. + +### empty(slice self) internal returns (bool) + +Returns true if the slice is empty (has a length of 0). + +Arguments: + + - self The slice to operate on. + +Returns True if the slice is empty, False otherwise. + +### compare(slice self, slice other) internal returns (int) + +Returns a positive number if `other` comes lexicographically after `self`, a negative number if it comes before, or zero if the contents of the two slices are equal. Comparison is done per-rune, on unicode codepoints. + +Arguments: + + - self The first slice to compare. + - other The second slice to compare. + +Returns The result of the comparison. + +### equals(slice self, slice other) internal returns (bool) + +Returns true if the two slices contain the same text. + +Arguments: + + - self The first slice to compare. + - self The second slice to compare. + +Returns True if the slices are equal, false otherwise. + +### nextRune(slice self, slice rune) internal returns (slice) + +Extracts the first rune in the slice into `rune`, advancing the slice to point to the next rune and returning `self`. + +Arguments: + + - self The slice to operate on. + - rune The slice that will contain the first rune. + +Returns `rune`. + +### nextRune(slice self) internal returns (slice ret) + +Returns the first rune in the slice, advancing the slice to point to the next rune. + +Arguments: + + - self The slice to operate on. + +Returns A slice containing only the first rune from `self`. + +### ord(slice self) internal returns (uint ret) + +Returns the number of the first codepoint in the slice. + +Arguments: + + - self The slice to operate on. + +Returns The number of the first codepoint in the slice. + +### keccak(slice self) internal returns (bytes32 ret) + +Returns the keccak-256 hash of the slice. + +Arguments: + + - self The slice to hash. + +Returns The hash of the slice. + +### startsWith(slice self, slice needle) internal returns (bool) + +Returns true if `self` starts with `needle`. + +Arguments: + + - self The slice to operate on. + - needle The slice to search for. + +Returns True if the slice starts with the provided text, false otherwise. + +### beyond(slice self, slice needle) internal returns (slice) + +If `self` starts with `needle`, `needle` is removed from the beginning of `self`. Otherwise, `self` is unmodified. + +Arguments: + + - self The slice to operate on. + - needle The slice to search for. + +Returns `self` + +### endsWith(slice self, slice needle) internal returns (bool) + +Returns true if the slice ends with `needle`. + +Arguments: + + - self The slice to operate on. + - needle The slice to search for. + +Returns True if the slice starts with the provided text, false otherwise. + +### until(slice self, slice needle) internal returns (slice) + +If `self` ends with `needle`, `needle` is removed from the end of `self`. Otherwise, `self` is unmodified. + +Arguments: + + - self The slice to operate on. + - needle The slice to search for. + +Returns `self` + +### find(slice self, slice needle) internal returns (slice) + +Modifies `self` to contain everything from the first occurrence of `needle` to the end of the slice. `self` is set to the empty slice if `needle` is not found. + +Arguments: + + - self The slice to search and modify. + - needle The text to search for. + +Returns `self`. + +### rfind(slice self, slice needle) internal returns (slice) + +Modifies `self` to contain the part of the string from the start of `self` to the end of the first occurrence of `needle`. If `needle` is not found, `self` is set to the empty slice. + +Arguments: + + - self The slice to search and modify. + - needle The text to search for. + +Returns `self`. + +### split(slice self, slice needle, slice token) internal returns (slice) + +Splits the slice, setting `self` to everything after the first occurrence of `needle`, and `token` to everything before it. If `needle` does not occur in `self`, `self` is set to the empty slice, and `token` is set to the entirety of `self`. + +Arguments: + + - self The slice to split. + - needle The text to search for in `self`. + - token An output parameter to which the first token is written. + +Returns `token`. + +### split(slice self, slice needle) internal returns (slice token) + +Splits the slice, setting `self` to everything after the first occurrence of `needle`, and returning everything before it. If `needle` does not occur in `self`, `self` is set to the empty slice, and the entirety of `self` is returned. + +Arguments: + + - self The slice to split. + - needle The text to search for in `self`. + +Returns The part of `self` up to the first occurrence of `delim`. + +### rsplit(slice self, slice needle, slice token) internal returns (slice) + +Splits the slice, setting `self` to everything before the last occurrence of `needle`, and `token` to everything after it. If `needle` does not occur in `self`, `self` is set to the empty slice, and `token` is set to the entirety of `self`. + +Arguments: + + - self The slice to split. + - needle The text to search for in `self`. + - token An output parameter to which the first token is written. + +Returns `token`. + +### rsplit(slice self, slice needle) internal returns (slice token) + +Splits the slice, setting `self` to everything before the last occurrence of `needle`, and returning everything after it. If `needle` does not occur in `self`, `self` is set to the empty slice, and the entirety of `self` is returned. + +Arguments: + + - self The slice to split. + - needle The text to search for in `self`. + +Returns The part of `self` after the last occurrence of `delim`. + +### count(slice self, slice needle) internal returns (uint count) + +Counts the number of nonoverlapping occurrences of `needle` in `self`. + +Arguments: + + - self The slice to search. + - needle The text to search for in `self`. + +Returns The number of occurrences of `needle` found in `self`. + +### contains(slice self, slice needle) internal returns (bool) + +Returns True if `self` contains `needle`. + +Arguments: + + - self The slice to search. + - needle The text to search for in `self`. + +Returns True if `needle` is found in `self`, false otherwise. + +### concat(slice self, slice other) internal returns (string) + +Returns a newly allocated string containing the concatenation of `self` and `other`. + +Arguments: + + - self The first slice to concatenate. + - other The second slice to concatenate. + +Returns The concatenation of the two strings. + +### join(slice self, slice[] parts) internal returns (string) + +Joins an array of slices, using `self` as a delimiter, returning a newly allocated string. + +Arguments: + + - self The delimiter to use. + - parts A list of slices to join. + +Returns A newly allocated string containing all the slices in `parts`, joined with `self`. diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/dappfile b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/dappfile new file mode 100644 index 000000000..8772d9771 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/dappfile @@ -0,0 +1,8 @@ +version: 2.0.0 +tags: [] +layout: + sol_sources: . + build_dir: build +dependencies: {} +ignore: [] +name: ethereum-stringutils diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/LICENSE b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/LICENSE new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/Makefile b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/Makefile new file mode 100644 index 000000000..661dac486 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/Makefile @@ -0,0 +1,14 @@ +all:; dapp build + +test: + -dapp --use solc:0.4.23 build + -dapp --use solc:0.4.26 build + -dapp --use solc:0.5.17 build + -dapp --use solc:0.6.12 build + -dapp --use solc:0.7.5 build + +demo: + DAPP_SRC=demo dapp --use solc:0.7.5 build + -hevm dapp-test --verbose 3 + +.PHONY: test demo diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/default.nix b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/default.nix new file mode 100644 index 000000000..cf65419ab --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/default.nix @@ -0,0 +1,4 @@ +{ solidityPackage, dappsys }: solidityPackage { + name = "ds-test"; + src = ./src; +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/demo/demo.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/demo/demo.sol new file mode 100644 index 000000000..d3a7d81fc --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/demo/demo.sol @@ -0,0 +1,223 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity >=0.4.23; + +import "../src/test.sol"; + +contract DemoTest is DSTest { + function test_this() public pure { + require(true); + } + function test_logs() public { + emit log("-- log(string)"); + emit log("a string"); + + emit log("-- log_named_uint(string, uint)"); + log_named_uint("uint", 512); + + emit log("-- log_named_int(string, int)"); + log_named_int("int", -512); + + emit log("-- log_named_address(string, address)"); + log_named_address("address", address(this)); + + emit log("-- log_named_bytes32(string, bytes32)"); + log_named_bytes32("bytes32", "a string"); + + emit log("-- log_named_bytes(string, bytes)"); + log_named_bytes("bytes", hex"cafefe"); + + emit log("-- log_named_string(string, string)"); + log_named_string("string", "a string"); + + emit log("-- log_named_decimal_uint(string, uint, uint)"); + log_named_decimal_uint("decimal uint", 1.0e18, 18); + + emit log("-- log_named_decimal_int(string, int, uint)"); + log_named_decimal_int("decimal int", -1.0e18, 18); + } + event log_old_named_uint(bytes32,uint); + function test_old_logs() public { + log_old_named_uint("key", 500); + log_named_bytes32("bkey", "val"); + } + function test_trace() public view { + this.echo("string 1", "string 2"); + } + function test_multiline() public { + emit log("a multiline\\n" "string"); + emit log("a multiline " "string"); + log_bytes("a string"); + log_bytes("a multiline\n" "string"); + log_bytes("a multiline\\n" "string"); + emit log(unicode"Ώ"); + logs(hex"0000"); + log_named_bytes("0x0000", hex"0000"); + logs(hex"ff"); + } + function echo(string memory s1, string memory s2) public pure + returns (string memory, string memory) + { + return (s1, s2); + } + + function prove_this(uint x) public { + log_named_uint("sym x", x); + assertGt(x + 1, 0); + } + + function test_logn() public { + assembly { + log0(0x01, 0x02) + log1(0x01, 0x02, 0x03) + log2(0x01, 0x02, 0x03, 0x04) + log3(0x01, 0x02, 0x03, 0x04, 0x05) + } + } + + event MyEvent(uint, uint indexed, uint, uint indexed); + function test_events() public { + emit MyEvent(1, 2, 3, 4); + } + + function test_asserts() public { + string memory err = "this test has failed!"; + emit log("## assertTrue(bool)\n"); + assertTrue(false); + emit log("\n"); + assertTrue(false, err); + + emit log("\n## assertEq(address,address)\n"); + assertEq(address(this), msg.sender); + emit log("\n"); + assertEq(address(this), msg.sender, err); + + emit log("\n## assertEq32(bytes32,bytes32)\n"); + assertEq32("bytes 1", "bytes 2"); + emit log("\n"); + assertEq32("bytes 1", "bytes 2", err); + + emit log("\n## assertEq(bytes32,bytes32)\n"); + assertEq32("bytes 1", "bytes 2"); + emit log("\n"); + assertEq32("bytes 1", "bytes 2", err); + + emit log("\n## assertEq(uint,uint)\n"); + assertEq(uint(0), 1); + emit log("\n"); + assertEq(uint(0), 1, err); + + emit log("\n## assertEq(int,int)\n"); + assertEq(-1, -2); + emit log("\n"); + assertEq(-1, -2, err); + + emit log("\n## assertEqDecimal(int,int,uint)\n"); + assertEqDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertEqDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertEqDecimal(uint,uint,uint)\n"); + assertEqDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertEqDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertGt(uint,uint)\n"); + assertGt(uint(0), 0); + emit log("\n"); + assertGt(uint(0), 0, err); + + emit log("\n## assertGt(int,int)\n"); + assertGt(-1, -1); + emit log("\n"); + assertGt(-1, -1, err); + + emit log("\n## assertGtDecimal(int,int,uint)\n"); + assertGtDecimal(-2.0e18, -1.1e18, 18); + emit log("\n"); + assertGtDecimal(-2.0e18, -1.1e18, 18, err); + + emit log("\n## assertGtDecimal(uint,uint,uint)\n"); + assertGtDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertGtDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertGe(uint,uint)\n"); + assertGe(uint(0), 1); + emit log("\n"); + assertGe(uint(0), 1, err); + + emit log("\n## assertGe(int,int)\n"); + assertGe(-1, 0); + emit log("\n"); + assertGe(-1, 0, err); + + emit log("\n## assertGeDecimal(int,int,uint)\n"); + assertGeDecimal(-2.0e18, -1.1e18, 18); + emit log("\n"); + assertGeDecimal(-2.0e18, -1.1e18, 18, err); + + emit log("\n## assertGeDecimal(uint,uint,uint)\n"); + assertGeDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertGeDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertLt(uint,uint)\n"); + assertLt(uint(0), 0); + emit log("\n"); + assertLt(uint(0), 0, err); + + emit log("\n## assertLt(int,int)\n"); + assertLt(-1, -1); + emit log("\n"); + assertLt(-1, -1, err); + + emit log("\n## assertLtDecimal(int,int,uint)\n"); + assertLtDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertLtDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertLtDecimal(uint,uint,uint)\n"); + assertLtDecimal(uint(2.0e18), 1.1e18, 18); + emit log("\n"); + assertLtDecimal(uint(2.0e18), 1.1e18, 18, err); + + emit log("\n## assertLe(uint,uint)\n"); + assertLe(uint(1), 0); + emit log("\n"); + assertLe(uint(1), 0, err); + + emit log("\n## assertLe(int,int)\n"); + assertLe(0, -1); + emit log("\n"); + assertLe(0, -1, err); + + emit log("\n## assertLeDecimal(int,int,uint)\n"); + assertLeDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertLeDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertLeDecimal(uint,uint,uint)\n"); + assertLeDecimal(uint(2.0e18), 1.1e18, 18); + emit log("\n"); + assertLeDecimal(uint(2.0e18), 1.1e18, 18, err); + + emit log("\n## assertEq(string,string)\n"); + string memory s1 = "string 1"; + string memory s2 = "string 2"; + assertEq(s1, s2); + emit log("\n"); + assertEq(s1, s2, err); + + emit log("\n## assertEq0(bytes,bytes)\n"); + assertEq0(hex"abcdef01", hex"abcdef02"); + log("\n"); + assertEq0(hex"abcdef01", hex"abcdef02", err); + } +} + +contract DemoTestWithSetUp { + function setUp() public { + } + function test_pass() public pure { + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/src/test.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/src/test.sol new file mode 100644 index 000000000..96d3c1543 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/lib/ds-test/src/test.sol @@ -0,0 +1,434 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity >=0.4.23; + +contract DSTest { + event log (string); + event logs (bytes); + + event log_address (address); + event log_bytes32 (bytes32); + event log_int (int); + event log_uint (uint); + event log_bytes (bytes); + event log_string (string); + + event log_named_address (string key, address val); + event log_named_bytes32 (string key, bytes32 val); + event log_named_decimal_int (string key, int val, uint decimals); + event log_named_decimal_uint (string key, uint val, uint decimals); + event log_named_int (string key, int val); + event log_named_uint (string key, uint val); + event log_named_bytes (string key, bytes val); + event log_named_string (string key, string val); + + bool public IS_TEST = true; + bool public failed; + + address constant HEVM_ADDRESS = + address(bytes20(uint160(uint256(keccak256('hevm cheat code'))))); + + modifier mayRevert() { _; } + modifier testopts(string memory) { _; } + + function fail() internal { + failed = true; + } + + modifier logs_gas() { + uint startGas = gasleft(); + _; + uint endGas = gasleft(); + emit log_named_uint("gas", startGas - endGas); + } + + function assertTrue(bool condition) internal { + if (!condition) { + emit log("Error: Assertion Failed"); + fail(); + } + } + + function assertTrue(bool condition, string memory err) internal { + if (!condition) { + emit log_named_string("Error", err); + assertTrue(condition); + } + } + + function assertEq(address a, address b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [address]"); + emit log_named_address(" Expected", b); + emit log_named_address(" Actual", a); + fail(); + } + } + function assertEq(address a, address b, string memory err) internal { + if (a != b) { + emit log_named_string ("Error", err); + assertEq(a, b); + } + } + + function assertEq(bytes32 a, bytes32 b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [bytes32]"); + emit log_named_bytes32(" Expected", b); + emit log_named_bytes32(" Actual", a); + fail(); + } + } + function assertEq(bytes32 a, bytes32 b, string memory err) internal { + if (a != b) { + emit log_named_string ("Error", err); + assertEq(a, b); + } + } + function assertEq32(bytes32 a, bytes32 b) internal { + assertEq(a, b); + } + function assertEq32(bytes32 a, bytes32 b, string memory err) internal { + assertEq(a, b, err); + } + + function assertEq(int a, int b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [int]"); + emit log_named_int(" Expected", b); + emit log_named_int(" Actual", a); + fail(); + } + } + function assertEq(int a, int b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + function assertEq(uint a, uint b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [uint]"); + emit log_named_uint(" Expected", b); + emit log_named_uint(" Actual", a); + fail(); + } + } + function assertEq(uint a, uint b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + function assertEqDecimal(int a, int b, uint decimals) internal { + if (a != b) { + emit log("Error: a == b not satisfied [decimal int]"); + emit log_named_decimal_int(" Expected", b, decimals); + emit log_named_decimal_int(" Actual", a, decimals); + fail(); + } + } + function assertEqDecimal(int a, int b, uint decimals, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEqDecimal(a, b, decimals); + } + } + function assertEqDecimal(uint a, uint b, uint decimals) internal { + if (a != b) { + emit log("Error: a == b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Expected", b, decimals); + emit log_named_decimal_uint(" Actual", a, decimals); + fail(); + } + } + function assertEqDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEqDecimal(a, b, decimals); + } + } + + function assertGt(uint a, uint b) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertGt(uint a, uint b, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGt(a, b); + } + } + function assertGt(int a, int b) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertGt(int a, int b, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGt(a, b); + } + } + function assertGtDecimal(int a, int b, uint decimals) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertGtDecimal(int a, int b, uint decimals, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGtDecimal(a, b, decimals); + } + } + function assertGtDecimal(uint a, uint b, uint decimals) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertGtDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGtDecimal(a, b, decimals); + } + } + + function assertGe(uint a, uint b) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertGe(uint a, uint b, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGe(a, b); + } + } + function assertGe(int a, int b) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertGe(int a, int b, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGe(a, b); + } + } + function assertGeDecimal(int a, int b, uint decimals) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertGeDecimal(int a, int b, uint decimals, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + function assertGeDecimal(uint a, uint b, uint decimals) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertGeDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + + function assertLt(uint a, uint b) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertLt(uint a, uint b, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLt(a, b); + } + } + function assertLt(int a, int b) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertLt(int a, int b, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLt(a, b); + } + } + function assertLtDecimal(int a, int b, uint decimals) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertLtDecimal(int a, int b, uint decimals, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLtDecimal(a, b, decimals); + } + } + function assertLtDecimal(uint a, uint b, uint decimals) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertLtDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLtDecimal(a, b, decimals); + } + } + + function assertLe(uint a, uint b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertLe(uint a, uint b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLe(a, b); + } + } + function assertLe(int a, int b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertLe(int a, int b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLe(a, b); + } + } + function assertLeDecimal(int a, int b, uint decimals) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertLeDecimal(int a, int b, uint decimals, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLeDecimal(a, b, decimals); + } + } + function assertLeDecimal(uint a, uint b, uint decimals) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertLeDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + + function assertEq(string memory a, string memory b) internal { + if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { + emit log("Error: a == b not satisfied [string]"); + emit log_named_string(" Value a", a); + emit log_named_string(" Value b", b); + fail(); + } + } + function assertEq(string memory a, string memory b, string memory err) internal { + if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function checkEq0(bytes memory a, bytes memory b) internal pure returns (bool ok) { + ok = true; + if (a.length == b.length) { + for (uint i = 0; i < a.length; i++) { + if (a[i] != b[i]) { + ok = false; + } + } + } else { + ok = false; + } + } + function assertEq0(bytes memory a, bytes memory b) internal { + if (!checkEq0(a, b)) { + emit log("Error: a == b not satisfied [bytes]"); + emit log_named_bytes(" Expected", a); + emit log_named_bytes(" Actual", b); + fail(); + } + } + function assertEq0(bytes memory a, bytes memory b, string memory err) internal { + if (!checkEq0(a, b)) { + emit log_named_string("Error", err); + assertEq0(a, b); + } + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/src/strings.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/src/strings.sol new file mode 100644 index 000000000..c801990e8 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/src/strings.sol @@ -0,0 +1,727 @@ +/* + * @title String & slice utility library for Solidity contracts. + * @author Nick Johnson + * + * @dev Functionality in this library is largely implemented using an + * abstraction called a 'slice'. A slice represents a part of a string - + * anything from the entire string to a single character, or even no + * characters at all (a 0-length slice). Since a slice only has to specify + * an offset and a length, copying and manipulating slices is a lot less + * expensive than copying and manipulating the strings they reference. + * + * To further reduce gas costs, most functions on slice that need to return + * a slice modify the original one instead of allocating a new one; for + * instance, `s.split(".")` will return the text up to the first '.', + * modifying s to only contain the remainder of the string after the '.'. + * In situations where you do not want to modify the original slice, you + * can make a copy first with `.copy()`, for example: + * `s.copy().split(".")`. Try and avoid using this idiom in loops; since + * Solidity has no memory management, it will result in allocating many + * short-lived slices that are later discarded. + * + * Functions that return two slices come in two versions: a non-allocating + * version that takes the second slice as an argument, modifying it in + * place, and an allocating version that allocates and returns the second + * slice; see `nextRune` for example. + * + * Functions that have to copy string data will return strings rather than + * slices; these can be cast back to slices for further processing if + * required. + * + * For convenience, some functions are provided with non-modifying + * variants that create a new slice and return both; for instance, + * `s.splitNew('.')` leaves s unmodified, and returns two values + * corresponding to the left and right parts of the string. + */ + +pragma solidity ^0.8.0; + +library strings { + struct slice { + uint _len; + uint _ptr; + } + + function memcpy(uint dest, uint src, uint length) private pure { + // Copy word-length chunks while possible + for(; length >= 32; length -= 32) { + assembly { + mstore(dest, mload(src)) + } + dest += 32; + src += 32; + } + + // Copy remaining bytes + uint mask = type(uint).max; + if (length > 0) { + mask = 256 ** (32 - length) - 1; + } + assembly { + let srcpart := and(mload(src), not(mask)) + let destpart := and(mload(dest), mask) + mstore(dest, or(destpart, srcpart)) + } + } + + /* + * @dev Returns a slice containing the entire string. + * @param self The string to make a slice from. + * @return A newly allocated slice containing the entire string. + */ + function toSlice(string memory self) internal pure returns (slice memory) { + uint ptr; + assembly { + ptr := add(self, 0x20) + } + return slice(bytes(self).length, ptr); + } + + /* + * @dev Returns the length of a null-terminated bytes32 string. + * @param self The value to find the length of. + * @return The length of the string, from 0 to 32. + */ + function len(bytes32 self) internal pure returns (uint) { + uint ret; + if (self == 0) + return 0; + if (uint(self) & type(uint128).max == 0) { + ret += 16; + self = bytes32(uint(self) / 0x100000000000000000000000000000000); + } + if (uint(self) & type(uint64).max == 0) { + ret += 8; + self = bytes32(uint(self) / 0x10000000000000000); + } + if (uint(self) & type(uint32).max == 0) { + ret += 4; + self = bytes32(uint(self) / 0x100000000); + } + if (uint(self) & type(uint16).max == 0) { + ret += 2; + self = bytes32(uint(self) / 0x10000); + } + if (uint(self) & type(uint8).max == 0) { + ret += 1; + } + return 32 - ret; + } + + /* + * @dev Returns a slice containing the entire bytes32, interpreted as a + * null-terminated utf-8 string. + * @param self The bytes32 value to convert to a slice. + * @return A new slice containing the value of the input argument up to the + * first null. + */ + function toSliceB32(bytes32 self) internal pure returns (slice memory ret) { + // Allocate space for `self` in memory, copy it there, and point ret at it + assembly { + let ptr := mload(0x40) + mstore(0x40, add(ptr, 0x20)) + mstore(ptr, self) + mstore(add(ret, 0x20), ptr) + } + ret._len = len(self); + } + + /* + * @dev Returns a new slice containing the same data as the current slice. + * @param self The slice to copy. + * @return A new slice containing the same data as `self`. + */ + function copy(slice memory self) internal pure returns (slice memory) { + return slice(self._len, self._ptr); + } + + /* + * @dev Copies a slice to a new string. + * @param self The slice to copy. + * @return A newly allocated string containing the slice's text. + */ + function toString(slice memory self) internal pure returns (string memory) { + string memory ret = new string(self._len); + uint retptr; + assembly { retptr := add(ret, 32) } + + memcpy(retptr, self._ptr, self._len); + return ret; + } + + /* + * @dev Returns the length in runes of the slice. Note that this operation + * takes time proportional to the length of the slice; avoid using it + * in loops, and call `slice.empty()` if you only need to know whether + * the slice is empty or not. + * @param self The slice to operate on. + * @return The length of the slice in runes. + */ + function len(slice memory self) internal pure returns (uint l) { + // Starting at ptr-31 means the LSB will be the byte we care about + uint ptr = self._ptr - 31; + uint end = ptr + self._len; + for (l = 0; ptr < end; l++) { + uint8 b; + assembly { b := and(mload(ptr), 0xFF) } + if (b < 0x80) { + ptr += 1; + } else if(b < 0xE0) { + ptr += 2; + } else if(b < 0xF0) { + ptr += 3; + } else if(b < 0xF8) { + ptr += 4; + } else if(b < 0xFC) { + ptr += 5; + } else { + ptr += 6; + } + } + } + + /* + * @dev Returns true if the slice is empty (has a length of 0). + * @param self The slice to operate on. + * @return True if the slice is empty, False otherwise. + */ + function empty(slice memory self) internal pure returns (bool) { + return self._len == 0; + } + + /* + * @dev Returns a positive number if `other` comes lexicographically after + * `self`, a negative number if it comes before, or zero if the + * contents of the two slices are equal. Comparison is done per-rune, + * on unicode codepoints. + * @param self The first slice to compare. + * @param other The second slice to compare. + * @return The result of the comparison. + */ + function compare(slice memory self, slice memory other) internal pure returns (int) { + uint shortest = self._len; + if (other._len < self._len) + shortest = other._len; + + uint selfptr = self._ptr; + uint otherptr = other._ptr; + for (uint idx = 0; idx < shortest; idx += 32) { + uint a; + uint b; + assembly { + a := mload(selfptr) + b := mload(otherptr) + } + if (a != b) { + // Mask out irrelevant bytes and check again + uint mask = type(uint).max; // 0xffff... + if(shortest < 32) { + mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); + } + unchecked { + uint diff = (a & mask) - (b & mask); + if (diff != 0) + return int(diff); + } + } + selfptr += 32; + otherptr += 32; + } + return int(self._len) - int(other._len); + } + + /* + * @dev Returns true if the two slices contain the same text. + * @param self The first slice to compare. + * @param self The second slice to compare. + * @return True if the slices are equal, false otherwise. + */ + function equals(slice memory self, slice memory other) internal pure returns (bool) { + return compare(self, other) == 0; + } + + /* + * @dev Extracts the first rune in the slice into `rune`, advancing the + * slice to point to the next rune and returning `self`. + * @param self The slice to operate on. + * @param rune The slice that will contain the first rune. + * @return `rune`. + */ + function nextRune(slice memory self, slice memory rune) internal pure returns (slice memory) { + rune._ptr = self._ptr; + + if (self._len == 0) { + rune._len = 0; + return rune; + } + + uint l; + uint b; + // Load the first byte of the rune into the LSBs of b + assembly { b := and(mload(sub(mload(add(self, 32)), 31)), 0xFF) } + if (b < 0x80) { + l = 1; + } else if(b < 0xE0) { + l = 2; + } else if(b < 0xF0) { + l = 3; + } else { + l = 4; + } + + // Check for truncated codepoints + if (l > self._len) { + rune._len = self._len; + self._ptr += self._len; + self._len = 0; + return rune; + } + + self._ptr += l; + self._len -= l; + rune._len = l; + return rune; + } + + /* + * @dev Returns the first rune in the slice, advancing the slice to point + * to the next rune. + * @param self The slice to operate on. + * @return A slice containing only the first rune from `self`. + */ + function nextRune(slice memory self) internal pure returns (slice memory ret) { + nextRune(self, ret); + } + + /* + * @dev Returns the number of the first codepoint in the slice. + * @param self The slice to operate on. + * @return The number of the first codepoint in the slice. + */ + function ord(slice memory self) internal pure returns (uint ret) { + if (self._len == 0) { + return 0; + } + + uint word; + uint length; + uint divisor = 2 ** 248; + + // Load the rune into the MSBs of b + assembly { word:= mload(mload(add(self, 32))) } + uint b = word / divisor; + if (b < 0x80) { + ret = b; + length = 1; + } else if(b < 0xE0) { + ret = b & 0x1F; + length = 2; + } else if(b < 0xF0) { + ret = b & 0x0F; + length = 3; + } else { + ret = b & 0x07; + length = 4; + } + + // Check for truncated codepoints + if (length > self._len) { + return 0; + } + + for (uint i = 1; i < length; i++) { + divisor = divisor / 256; + b = (word / divisor) & 0xFF; + if (b & 0xC0 != 0x80) { + // Invalid UTF-8 sequence + return 0; + } + ret = (ret * 64) | (b & 0x3F); + } + + return ret; + } + + /* + * @dev Returns the keccak-256 hash of the slice. + * @param self The slice to hash. + * @return The hash of the slice. + */ + function keccak(slice memory self) internal pure returns (bytes32 ret) { + assembly { + ret := keccak256(mload(add(self, 32)), mload(self)) + } + } + + /* + * @dev Returns true if `self` starts with `needle`. + * @param self The slice to operate on. + * @param needle The slice to search for. + * @return True if the slice starts with the provided text, false otherwise. + */ + function startsWith(slice memory self, slice memory needle) internal pure returns (bool) { + if (self._len < needle._len) { + return false; + } + + if (self._ptr == needle._ptr) { + return true; + } + + bool equal; + assembly { + let length := mload(needle) + let selfptr := mload(add(self, 0x20)) + let needleptr := mload(add(needle, 0x20)) + equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) + } + return equal; + } + + /* + * @dev If `self` starts with `needle`, `needle` is removed from the + * beginning of `self`. Otherwise, `self` is unmodified. + * @param self The slice to operate on. + * @param needle The slice to search for. + * @return `self` + */ + function beyond(slice memory self, slice memory needle) internal pure returns (slice memory) { + if (self._len < needle._len) { + return self; + } + + bool equal = true; + if (self._ptr != needle._ptr) { + assembly { + let length := mload(needle) + let selfptr := mload(add(self, 0x20)) + let needleptr := mload(add(needle, 0x20)) + equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) + } + } + + if (equal) { + self._len -= needle._len; + self._ptr += needle._len; + } + + return self; + } + + /* + * @dev Returns true if the slice ends with `needle`. + * @param self The slice to operate on. + * @param needle The slice to search for. + * @return True if the slice starts with the provided text, false otherwise. + */ + function endsWith(slice memory self, slice memory needle) internal pure returns (bool) { + if (self._len < needle._len) { + return false; + } + + uint selfptr = self._ptr + self._len - needle._len; + + if (selfptr == needle._ptr) { + return true; + } + + bool equal; + assembly { + let length := mload(needle) + let needleptr := mload(add(needle, 0x20)) + equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) + } + + return equal; + } + + /* + * @dev If `self` ends with `needle`, `needle` is removed from the + * end of `self`. Otherwise, `self` is unmodified. + * @param self The slice to operate on. + * @param needle The slice to search for. + * @return `self` + */ + function until(slice memory self, slice memory needle) internal pure returns (slice memory) { + if (self._len < needle._len) { + return self; + } + + uint selfptr = self._ptr + self._len - needle._len; + bool equal = true; + if (selfptr != needle._ptr) { + assembly { + let length := mload(needle) + let needleptr := mload(add(needle, 0x20)) + equal := eq(keccak256(selfptr, length), keccak256(needleptr, length)) + } + } + + if (equal) { + self._len -= needle._len; + } + + return self; + } + + // Returns the memory address of the first byte of the first occurrence of + // `needle` in `self`, or the first byte after `self` if not found. + function findPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) { + uint ptr = selfptr; + uint idx; + + if (needlelen <= selflen) { + if (needlelen <= 32) { + bytes32 mask; + if (needlelen > 0) { + mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1)); + } + + bytes32 needledata; + assembly { needledata := and(mload(needleptr), mask) } + + uint end = selfptr + selflen - needlelen; + bytes32 ptrdata; + assembly { ptrdata := and(mload(ptr), mask) } + + while (ptrdata != needledata) { + if (ptr >= end) + return selfptr + selflen; + ptr++; + assembly { ptrdata := and(mload(ptr), mask) } + } + return ptr; + } else { + // For long needles, use hashing + bytes32 hash; + assembly { hash := keccak256(needleptr, needlelen) } + + for (idx = 0; idx <= selflen - needlelen; idx++) { + bytes32 testHash; + assembly { testHash := keccak256(ptr, needlelen) } + if (hash == testHash) + return ptr; + ptr += 1; + } + } + } + return selfptr + selflen; + } + + // Returns the memory address of the first byte after the last occurrence of + // `needle` in `self`, or the address of `self` if not found. + function rfindPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) { + uint ptr; + + if (needlelen <= selflen) { + if (needlelen <= 32) { + bytes32 mask; + if (needlelen > 0) { + mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1)); + } + + bytes32 needledata; + assembly { needledata := and(mload(needleptr), mask) } + + ptr = selfptr + selflen - needlelen; + bytes32 ptrdata; + assembly { ptrdata := and(mload(ptr), mask) } + + while (ptrdata != needledata) { + if (ptr <= selfptr) + return selfptr; + ptr--; + assembly { ptrdata := and(mload(ptr), mask) } + } + return ptr + needlelen; + } else { + // For long needles, use hashing + bytes32 hash; + assembly { hash := keccak256(needleptr, needlelen) } + ptr = selfptr + (selflen - needlelen); + while (ptr >= selfptr) { + bytes32 testHash; + assembly { testHash := keccak256(ptr, needlelen) } + if (hash == testHash) + return ptr + needlelen; + ptr -= 1; + } + } + } + return selfptr; + } + + /* + * @dev Modifies `self` to contain everything from the first occurrence of + * `needle` to the end of the slice. `self` is set to the empty slice + * if `needle` is not found. + * @param self The slice to search and modify. + * @param needle The text to search for. + * @return `self`. + */ + function find(slice memory self, slice memory needle) internal pure returns (slice memory) { + uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr); + self._len -= ptr - self._ptr; + self._ptr = ptr; + return self; + } + + /* + * @dev Modifies `self` to contain the part of the string from the start of + * `self` to the end of the first occurrence of `needle`. If `needle` + * is not found, `self` is set to the empty slice. + * @param self The slice to search and modify. + * @param needle The text to search for. + * @return `self`. + */ + function rfind(slice memory self, slice memory needle) internal pure returns (slice memory) { + uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr); + self._len = ptr - self._ptr; + return self; + } + + /* + * @dev Splits the slice, setting `self` to everything after the first + * occurrence of `needle`, and `token` to everything before it. If + * `needle` does not occur in `self`, `self` is set to the empty slice, + * and `token` is set to the entirety of `self`. + * @param self The slice to split. + * @param needle The text to search for in `self`. + * @param token An output parameter to which the first token is written. + * @return `token`. + */ + function split(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) { + uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr); + token._ptr = self._ptr; + token._len = ptr - self._ptr; + if (ptr == self._ptr + self._len) { + // Not found + self._len = 0; + } else { + self._len -= token._len + needle._len; + self._ptr = ptr + needle._len; + } + return token; + } + + /* + * @dev Splits the slice, setting `self` to everything after the first + * occurrence of `needle`, and returning everything before it. If + * `needle` does not occur in `self`, `self` is set to the empty slice, + * and the entirety of `self` is returned. + * @param self The slice to split. + * @param needle The text to search for in `self`. + * @return The part of `self` up to the first occurrence of `delim`. + */ + function split(slice memory self, slice memory needle) internal pure returns (slice memory token) { + split(self, needle, token); + } + + /* + * @dev Splits the slice, setting `self` to everything before the last + * occurrence of `needle`, and `token` to everything after it. If + * `needle` does not occur in `self`, `self` is set to the empty slice, + * and `token` is set to the entirety of `self`. + * @param self The slice to split. + * @param needle The text to search for in `self`. + * @param token An output parameter to which the first token is written. + * @return `token`. + */ + function rsplit(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) { + uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr); + token._ptr = ptr; + token._len = self._len - (ptr - self._ptr); + if (ptr == self._ptr) { + // Not found + self._len = 0; + } else { + self._len -= token._len + needle._len; + } + return token; + } + + /* + * @dev Splits the slice, setting `self` to everything before the last + * occurrence of `needle`, and returning everything after it. If + * `needle` does not occur in `self`, `self` is set to the empty slice, + * and the entirety of `self` is returned. + * @param self The slice to split. + * @param needle The text to search for in `self`. + * @return The part of `self` after the last occurrence of `delim`. + */ + function rsplit(slice memory self, slice memory needle) internal pure returns (slice memory token) { + rsplit(self, needle, token); + } + + /* + * @dev Counts the number of nonoverlapping occurrences of `needle` in `self`. + * @param self The slice to search. + * @param needle The text to search for in `self`. + * @return The number of occurrences of `needle` found in `self`. + */ + function count(slice memory self, slice memory needle) internal pure returns (uint cnt) { + uint ptr = findPtr(self._len, self._ptr, needle._len, needle._ptr) + needle._len; + while (ptr <= self._ptr + self._len) { + cnt++; + ptr = findPtr(self._len - (ptr - self._ptr), ptr, needle._len, needle._ptr) + needle._len; + } + } + + /* + * @dev Returns True if `self` contains `needle`. + * @param self The slice to search. + * @param needle The text to search for in `self`. + * @return True if `needle` is found in `self`, false otherwise. + */ + function contains(slice memory self, slice memory needle) internal pure returns (bool) { + return rfindPtr(self._len, self._ptr, needle._len, needle._ptr) != self._ptr; + } + + /* + * @dev Returns a newly allocated string containing the concatenation of + * `self` and `other`. + * @param self The first slice to concatenate. + * @param other The second slice to concatenate. + * @return The concatenation of the two strings. + */ + function concat(slice memory self, slice memory other) internal pure returns (string memory) { + string memory ret = new string(self._len + other._len); + uint retptr; + assembly { retptr := add(ret, 32) } + memcpy(retptr, self._ptr, self._len); + memcpy(retptr + self._len, other._ptr, other._len); + return ret; + } + + /* + * @dev Joins an array of slices, using `self` as a delimiter, returning a + * newly allocated string. + * @param self The delimiter to use. + * @param parts A list of slices to join. + * @return A newly allocated string containing all the slices in `parts`, + * joined with `self`. + */ + function join(slice memory self, slice[] memory parts) internal pure returns (string memory) { + if (parts.length == 0) + return ""; + + uint length = self._len * (parts.length - 1); + for(uint i = 0; i < parts.length; i++) + length += parts[i]._len; + + string memory ret = new string(length); + uint retptr; + assembly { retptr := add(ret, 32) } + + for(uint i = 0; i < parts.length; i++) { + memcpy(retptr, parts[i]._ptr, parts[i]._len); + retptr += parts[i]._len; + if (i < parts.length - 1) { + memcpy(retptr, self._ptr, self._len); + retptr += self._len; + } + } + + return ret; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/src/strings.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/src/strings.t.sol new file mode 100644 index 000000000..bc3581cc2 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/lib/solidity-stringutils/src/strings.t.sol @@ -0,0 +1,216 @@ +pragma solidity ^0.8.0; + +import 'ds-test/test.sol'; +import './strings.sol'; + +contract StringsTest is DSTest { + using strings for *; + + + function abs(int x) private pure returns (int) { + if(x < 0) + return -x; + return x; + } + + function sign(int x) private pure returns (int) { + return x == 0 ? int(0) : (x < 0 ? -1 : int(1)); + } + + function assertEq0(string memory a, string memory b) internal { + assertEq0(bytes(a), bytes(b)); + } + + function assertEq0(strings.slice memory a, strings.slice memory b) internal { + assertEq0(a.toString(), b.toString()); + } + + function assertEq0(strings.slice memory a, string memory b) internal { + assertEq0(a.toString(), b); + } + + function testSliceToString() public { + string memory test = "Hello, world!"; + assertEq0(test, test.toSlice().toString()); + } + + function testBytes32Len() public { + bytes32 test; + for(uint i = 0; i <= 32; i++) { + assertEq(i, test.len()); + test = bytes32((uint(test) / 0x100) | 0x2000000000000000000000000000000000000000000000000000000000000000); + } + } + + + function testToSliceB32() public { + assertEq0(bytes32("foobar").toSliceB32(), "foobar".toSlice()); + } + + function testCopy() public { + string memory test = "Hello, world!"; + strings.slice memory s1 = test.toSlice(); + strings.slice memory s2 = s1.copy(); + s1._len = 0; + assertEq(s2._len, bytes(test).length); + } + + function testLen() public { + assertEq("".toSlice().len(), 0); + assertEq("Hello, world!".toSlice().len(), 13); + assertEq(unicode"naïve".toSlice().len(), 5); + assertEq(unicode"こんにちは".toSlice().len(), 5); + } + + function testEmpty() public { + assertTrue("".toSlice().empty()); + assertTrue(!"x".toSlice().empty()); + } + + function testEquals() public { + assertTrue("".toSlice().equals("".toSlice())); + assertTrue("foo".toSlice().equals("foo".toSlice())); + assertTrue(!"foo".toSlice().equals("bar".toSlice())); + } + + function testNextRune() public { + strings.slice memory s = unicode"a¡ࠀ𐀡".toSlice(); + assertEq0(s.nextRune(), "a"); + assertEq0(s, unicode"¡ࠀ𐀡"); + assertEq0(s.nextRune(), unicode"¡"); + assertEq0(s, unicode"ࠀ𐀡"); + assertEq0(s.nextRune(), unicode"ࠀ"); + assertEq0(s, unicode"𐀡"); + assertEq0(s.nextRune(), unicode"𐀡"); + assertEq0(s, ""); + assertEq0(s.nextRune(), ""); + } + + function testOrd() public { + assertEq("a".toSlice().ord(), 0x61); + assertEq(unicode"¡".toSlice().ord(), 0xA1); + assertEq(unicode"ࠀ".toSlice().ord(), 0x800); + assertEq(unicode"𐀡".toSlice().ord(), 0x10021); + } + + function testCompare() public { + + assertEq(sign("foobie".toSlice().compare("foobie".toSlice())), 0); + assertEq(sign("foobie".toSlice().compare("foobif".toSlice())), -1); + assertEq(sign("foobie".toSlice().compare("foobid".toSlice())), 1); + assertEq(sign("foobie".toSlice().compare("foobies".toSlice())), -1); + assertEq(sign("foobie".toSlice().compare("foobi".toSlice())), 1); + assertEq(sign("foobie".toSlice().compare("doobie".toSlice())), 1); + assertEq(sign("01234567890123456789012345678901".toSlice().compare("012345678901234567890123456789012".toSlice())), -1); + assertEq(sign("0123456789012345678901234567890123".toSlice().compare("1123456789012345678901234567890123".toSlice())), -1); + assertEq(sign("foo.bar".toSlice().split(".".toSlice()).compare("foo".toSlice())), 0); + } + + function testStartsWith() public { + strings.slice memory s = "foobar".toSlice(); + assertTrue(s.startsWith("foo".toSlice())); + assertTrue(!s.startsWith("oob".toSlice())); + assertTrue(s.startsWith("".toSlice())); + assertTrue(s.startsWith(s.copy().rfind("foo".toSlice()))); + } + + function testBeyond() public { + strings.slice memory s = "foobar".toSlice(); + assertEq0(s.beyond("foo".toSlice()), "bar"); + assertEq0(s, "bar"); + assertEq0(s.beyond("foo".toSlice()), "bar"); + assertEq0(s.beyond("bar".toSlice()), ""); + assertEq0(s, ""); + } + + function testEndsWith() public { + strings.slice memory s = "foobar".toSlice(); + assertTrue(s.endsWith("bar".toSlice())); + assertTrue(!s.endsWith("oba".toSlice())); + assertTrue(s.endsWith("".toSlice())); + assertTrue(s.endsWith(s.copy().find("bar".toSlice()))); + } + + function testUntil() public { + strings.slice memory s = "foobar".toSlice(); + assertEq0(s.until("bar".toSlice()), "foo"); + assertEq0(s, "foo"); + assertEq0(s.until("bar".toSlice()), "foo"); + assertEq0(s.until("foo".toSlice()), ""); + assertEq0(s, ""); + } + + function testFind() public { + assertEq0("abracadabra".toSlice().find("abracadabra".toSlice()), "abracadabra"); + assertEq0("abracadabra".toSlice().find("bra".toSlice()), "bracadabra"); + assertTrue("abracadabra".toSlice().find("rab".toSlice()).empty()); + assertTrue("12345".toSlice().find("123456".toSlice()).empty()); + assertEq0("12345".toSlice().find("".toSlice()), "12345"); + assertEq0("12345".toSlice().find("5".toSlice()), "5"); + } + + function testRfind() public { + assertEq0("abracadabra".toSlice().rfind("bra".toSlice()), "abracadabra"); + assertEq0("abracadabra".toSlice().rfind("cad".toSlice()), "abracad"); + assertTrue("12345".toSlice().rfind("123456".toSlice()).empty()); + assertEq0("12345".toSlice().rfind("".toSlice()), "12345"); + assertEq0("12345".toSlice().rfind("1".toSlice()), "1"); + } + + function testSplit() public { + strings.slice memory s = "foo->bar->baz".toSlice(); + strings.slice memory delim = "->".toSlice(); + assertEq0(s.split(delim), "foo"); + assertEq0(s, "bar->baz"); + assertEq0(s.split(delim), "bar"); + assertEq0(s.split(delim), "baz"); + assertTrue(s.empty()); + assertEq0(s.split(delim), ""); + assertEq0(".".toSlice().split(".".toSlice()), ""); + } + + function testRsplit() public { + strings.slice memory s = "foo->bar->baz".toSlice(); + strings.slice memory delim = "->".toSlice(); + assertEq0(s.rsplit(delim), "baz"); + assertEq0(s.rsplit(delim), "bar"); + assertEq0(s.rsplit(delim), "foo"); + assertTrue(s.empty()); + assertEq0(s.rsplit(delim), ""); + } + + function testCount() public { + assertEq("1121123211234321".toSlice().count("1".toSlice()), 7); + assertEq("ababababa".toSlice().count("aba".toSlice()), 2); + } + + function testContains() public { + assertTrue("foobar".toSlice().contains("f".toSlice())); + assertTrue("foobar".toSlice().contains("o".toSlice())); + assertTrue("foobar".toSlice().contains("r".toSlice())); + assertTrue("foobar".toSlice().contains("".toSlice())); + assertTrue("foobar".toSlice().contains("foobar".toSlice())); + assertTrue(!"foobar".toSlice().contains("s".toSlice())); + } + + function testConcat() public { + assertEq0("foo".toSlice().concat("bar".toSlice()), "foobar"); + assertEq0("".toSlice().concat("bar".toSlice()), "bar"); + assertEq0("foo".toSlice().concat("".toSlice()), "foo"); + } + + function testJoin() public { + strings.slice[] memory parts = new strings.slice[](4); + parts[0] = "zero".toSlice(); + parts[1] = "one".toSlice(); + parts[2] = "".toSlice(); + parts[3] = "two".toSlice(); + + assertEq0(" ".toSlice().join(parts), "zero one two"); + assertEq0("".toSlice().join(parts), "zeroonetwo"); + + parts = new strings.slice[](1); + parts[0] = "zero".toSlice(); + assertEq0(" ".toSlice().join(parts), "zero"); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/remappings.txt b/packages/wallet/wallet-contracts/lib/foundry-huff/remappings.txt new file mode 100644 index 000000000..1722d907e --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/remappings.txt @@ -0,0 +1,2 @@ +forge-std/=lib/forge-std/src/ +stringutils/=lib/solidity-stringutils/ \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/binary_check.sh b/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/binary_check.sh new file mode 100644 index 000000000..725a058b5 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/binary_check.sh @@ -0,0 +1,11 @@ +#! /bin/bash + +if ! [[ "$(npm list -g huffc)" =~ "empty" ]]; then + # huffc was installed via npm, return 0x00 + echo -n 0x00 +elif [[ "$(yarn global list)" =~ "huffc" ]]; then + # huffc was installed via yarn, return 0x00 + echo -n 0x00 +else + echo -n 0x01 +fi diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/file_writer.sh b/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/file_writer.sh new file mode 100644 index 000000000..93e3a8d32 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/file_writer.sh @@ -0,0 +1,3 @@ +#! /bin/bash + +echo "$2" > $1 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/rand_bytes.sh b/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/rand_bytes.sh new file mode 100644 index 000000000..fdd992106 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/rand_bytes.sh @@ -0,0 +1,3 @@ +#! /bin/bash + +echo -n $(hexdump -n 16 -v -e '"0x" 32/1 "%02x" "\n"' /dev/urandom) \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/read_and_append.sh b/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/read_and_append.sh new file mode 100644 index 000000000..a14336571 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/scripts/read_and_append.sh @@ -0,0 +1,3 @@ +#! /bin/bash + +cat $2 >> $1 diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/HuffConfig.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/HuffConfig.sol new file mode 100644 index 000000000..a6f8b09a4 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/HuffConfig.sol @@ -0,0 +1,247 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.8.13 <0.9.0; + +import {Vm} from "forge-std/Vm.sol"; +import {strings} from "stringutils/strings.sol"; + +contract HuffConfig { + using strings for *; + + /// @notice Initializes cheat codes in order to use ffi to compile Huff contracts + Vm public constant vm = Vm(address(bytes20(uint160(uint256(keccak256("hevm cheat code")))))); + + /// @notice Struct that represents a constant to be passed to the `-c` flag + struct Constant { + string key; + string value; + } + + /// @notice additional code to append to the source file + string public code; + + /// @notice arguments to append to the bytecode + bytes public args; + + /// @notice value to deploy the contract with + uint256 public value; + + /// @notice address that will be the `msg.sender` (op: caller) in the constructor + /// @dev set to config address to ensure backwards compatibility + address public deployer = address(this); + + /// @notice whether to broadcast the deployment tx + bool public should_broadcast; + + /// @notice supported evm versions + string public evm_version; + + /// @notice constant overrides for the current compilation environment + Constant[] public const_overrides; + + /// @notice sets the code to be appended to the source file + function with_code(string memory code_) public returns (HuffConfig) { + code = code_; + return this; + } + + /// @notice sets the arguments to be appended to the bytecode + function with_args(bytes memory args_) public returns (HuffConfig) { + args = args_; + return this; + } + + /// @notice sets the amount of wei to deploy the contract with + function with_value(uint256 value_) public returns (HuffConfig) { + value = value_; + return this; + } + + /// @notice sets the caller of the next deployment + function with_deployer(address _deployer) public returns (HuffConfig) { + deployer = _deployer; + return this; + } + + /// @notice sets the evm version to compile with + function with_evm_version(string memory _evm_version) public returns (HuffConfig) { + evm_version = _evm_version; + return this; + } + + /// @notice sets a constant to a bytes memory value in the current compilation environment + /// @dev The `value` string must contain a valid hex number that is <= 32 bytes + /// i.e. "0x01", "0xa57b", "0x0de0b6b3a7640000", etc. + function with_constant(string memory key, string memory value_) public returns (HuffConfig) { + const_overrides.push(Constant(key, value_)); + return this; + } + + /// @notice sets a constant to an address value in the current compilation environment + function with_addr_constant(string memory key, address value_) public returns (HuffConfig) { + const_overrides.push(Constant(key, bytesToString(abi.encodePacked(value_)))); + return this; + } + + /// @notice sets a constant to a bytes32 value in the current compilation environment + function with_bytes32_constant(string memory key, bytes32 value_) public returns (HuffConfig) { + const_overrides.push(Constant(key, bytesToString(abi.encodePacked(value_)))); + return this; + } + + /// @notice sets a constant to a uint256 value in the current compilation environment + function with_uint_constant(string memory key, uint256 value_) public returns (HuffConfig) { + const_overrides.push(Constant(key, bytesToString(abi.encodePacked(value_)))); + return this; + } + + /// @notice sets whether to broadcast the deployment + function set_broadcast(bool broadcast) public returns (HuffConfig) { + should_broadcast = broadcast; + return this; + } + + /// @notice Checks for huffc binary conflicts + function binary_check() public { + string[] memory bincheck = new string[](1); + bincheck[0] = "./lib/foundry-huff/scripts/binary_check.sh"; + bytes memory retData = vm.ffi(bincheck); + bytes8 first_bytes = retData[0]; + bool decoded = first_bytes == bytes8(hex"01"); + require( + decoded, "Invalid huffc binary. Run `curl -L get.huff.sh | bash` and `huffup` to fix." + ); + } + + function bytes32ToString(bytes32 x) internal pure returns (string memory) { + string memory result; + for (uint256 j = 0; j < x.length; j++) { + result = string.concat(result, string(abi.encodePacked(uint8(x[j]) % 26 + 97))); + } + return result; + } + + function bytesToString(bytes memory data) public pure returns (string memory) { + bytes memory alphabet = "0123456789abcdef"; + + bytes memory str = new bytes(2 + data.length * 2); + str[0] = "0"; + str[1] = "x"; + for (uint256 i = 0; i < data.length; i++) { + str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))]; + str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))]; + } + return string(str); + } + + /// @notice Get the evm version string | else return default ("shanghai") + function get_evm_version() public view returns (string memory) { + bytes32 _evm_version = bytes32(bytes(abi.encodePacked(evm_version))); + if (_evm_version == bytes32(0x0)) { + return "shanghai"; + } + return evm_version; + } + + /// @notice Get the creation bytecode of a contract + function creation_code(string memory file) public payable returns (bytes memory bytecode) { + binary_check(); + + // Split the file into its parts + strings.slice memory s = file.toSlice(); + strings.slice memory delim = "/".toSlice(); + string[] memory parts = new string[](s.count(delim) + 1); + for (uint256 i = 0; i < parts.length; i++) { + parts[i] = s.split(delim).toString(); + } + + // Get the system time with our script + string[] memory time = new string[](1); + time[0] = "./lib/foundry-huff/scripts/rand_bytes.sh"; + bytes memory retData = vm.ffi(time); + string memory rand_bytes = bytes32ToString(keccak256(abi.encode(bytes32(retData)))); + + // Re-concatenate the file with a "__TEMP__" prefix + string memory tempFile = parts[0]; + if (parts.length <= 1) { + tempFile = string.concat("__TEMP__", rand_bytes, tempFile); + } else { + for (uint256 i = 1; i < parts.length - 1; i++) { + tempFile = string.concat(tempFile, "/", parts[i]); + } + tempFile = string.concat(tempFile, "/", "__TEMP__", rand_bytes, parts[parts.length - 1]); + } + + // Paste the code in a new temp file + string[] memory create_cmds = new string[](3); + // TODO: create_cmds[0] = "$(find . -name \"file_writer.sh\")"; + create_cmds[0] = "./lib/foundry-huff/scripts/file_writer.sh"; + create_cmds[1] = string.concat("src/", tempFile, ".huff"); + create_cmds[2] = string.concat(code, "\n"); + vm.ffi(create_cmds); + + // Append the real code to the temp file + string[] memory append_cmds = new string[](3); + append_cmds[0] = "./lib/foundry-huff/scripts/read_and_append.sh"; + append_cmds[1] = string.concat("src/", tempFile, ".huff"); + append_cmds[2] = string.concat("src/", file, ".huff"); + vm.ffi(append_cmds); + + /// Create a list of strings with the commands necessary to compile Huff contracts + string[] memory cmds = new string[](5); + if (const_overrides.length > 0) { + cmds = new string[](6 + const_overrides.length); + cmds[5] = "-c"; + + Constant memory cur_const; + for (uint256 i; i < const_overrides.length; i++) { + cur_const = const_overrides[i]; + cmds[6 + i] = string.concat(cur_const.key, "=", cur_const.value); + } + } + + cmds[0] = "huffc"; + cmds[1] = string(string.concat("src/", tempFile, ".huff")); + cmds[2] = "-b"; + cmds[3] = "-e"; + cmds[4] = get_evm_version(); + + /// @notice compile the Huff contract and return the bytecode + bytecode = vm.ffi(cmds); + + // Clean up temp files + string[] memory cleanup = new string[](2); + cleanup[0] = "rm"; + cleanup[1] = string.concat("src/", tempFile, ".huff"); + + // set `msg.sender` for upcoming create context + vm.prank(deployer); + + + vm.ffi(cleanup); + } + + /// @notice get creation code of a contract plus encoded arguments + function creation_code_with_args(string memory file) public payable returns (bytes memory bytecode) { + bytecode = creation_code(file); + return bytes.concat(bytecode, args); + } + + /// @notice Deploy the Contract + function deploy(string memory file) public payable returns (address) { + bytes memory concatenated = creation_code_with_args(file); + + /// @notice deploy the bytecode with the create instruction + address deployedAddress; + if (should_broadcast) vm.broadcast(); + assembly { + let val := sload(value.slot) + deployedAddress := create(val, add(concatenated, 0x20), mload(concatenated)) + } + + /// @notice check that the deployment was successful + require(deployedAddress != address(0), "HuffDeployer could not deploy contract"); + + /// @notice return the address that the contract was deployed to + return deployedAddress; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/HuffDeployer.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/HuffDeployer.sol new file mode 100644 index 000000000..1608e524e --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/HuffDeployer.sol @@ -0,0 +1,134 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.8.13 <0.9.0; + +import {Vm} from "forge-std/Vm.sol"; +import {HuffConfig} from "./HuffConfig.sol"; + +library HuffDeployer { + /// @notice Create a new huff config + function config() public returns (HuffConfig) { + return new HuffConfig(); + } + + // @notice Deterministically create a new huff config using create2 and a salt + function config_with_create_2(uint256 salt) public returns (HuffConfig) { + return new HuffConfig{salt: bytes32(salt)}(); + } + + // @notice Get the address of a HuffConfig deployed with config_with_create_2 + function get_config_with_create_2(uint256 salt) public view returns (address) { + return + address( + uint160( + uint256( + keccak256( + abi.encodePacked( + bytes1(0xff), address(this), bytes32(salt), keccak256(type(HuffConfig).creationCode) + ) + ) + ) + ) + ); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @return The address that the contract was deployed to + function deploy(string memory fileName) internal returns (address) { + return config().deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @return The address that the contract was deployed to + function broadcast(string memory fileName) internal returns (address) { + return config().set_broadcast(true).deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @param value - Value to deploy with + /// @return The address that the contract was deployed to + function deploy_with_value(string memory fileName, uint256 value) internal returns (address) { + return config().with_value(value).deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @param value - Value to deploy with + /// @return The address that the contract was deployed to + function broadcast_with_value(string memory fileName, uint256 value) + internal + returns (address) + { + return config().set_broadcast(true).with_value(value).deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @param args - Constructor Args to append to the bytecode + /// @return The address that the contract was deployed to + function deploy_with_args(string memory fileName, bytes memory args) + internal + returns (address) + { + return config().with_args(args).deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @param args - Constructor Args to append to the bytecode + /// @return The address that the contract was deployed to + function broadcast_with_args(string memory fileName, bytes memory args) + internal + returns (address) + { + return config().set_broadcast(true).with_args(args).deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @param code - Code to append to the file source code (e.g. a constructor macro to make the contract instantiable) + /// @return The address that the contract was deployed to + function deploy_with_code(string memory fileName, string memory code) + internal + returns (address) + { + return config().with_code(code).deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @param code - Code to append to the file source code (e.g. a constructor macro to make the contract instantiable) + /// @return The address that the contract was deployed to + function broadcast_with_code(string memory fileName, string memory code) + internal + returns (address) + { + return config().set_broadcast(true).with_code(code).deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @param code - Code to append to the file source code (e.g. a constructor macro to make the contract instantiable) + /// @param args - Constructor Args to append to the bytecode + /// @return The address that the contract was deployed to + function deploy_with_code_args(string memory fileName, string memory code, bytes memory args) + internal + returns (address) + { + return config().with_code(code).with_args(args).deploy(fileName); + } + + /// @notice Compiles a Huff contract and returns the address that the contract was deployeod to + /// @param fileName - The file name of the Huff contract. For example, the file name for "SimpleStore.huff" is "SimpleStore" + /// @param code - Code to append to the file source code (e.g. a constructor macro to make the contract instantiable) + /// @param args - Constructor Args to append to the bytecode + /// @return The address that the contract was deployed to + function broadcast_with_code_args(string memory fileName, string memory code, bytes memory args) + internal + returns (address) + { + return config().set_broadcast(true).with_code(code).with_args(args).deploy(fileName); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/depreciated/StatefulDeployer.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/depreciated/StatefulDeployer.sol new file mode 100644 index 000000000..b67b98e5d --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/depreciated/StatefulDeployer.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.8.13 <0.9.0; + +import {Vm} from "forge-std/Vm.sol"; +import {strings} from "stringutils/strings.sol"; +import {HuffDeployer} from "../HuffDeployer.sol"; + +contract StatefulDeployer { + using strings for *; + + /// @notice Initializes cheat codes in order to use ffi to compile Huff contracts + Vm public constant vm = Vm(address(bytes20(uint160(uint256(keccak256("hevm cheat code")))))); + + /// @notice additional code to append to the source file + string public code; + + /// @notice arguments to append to the bytecode + bytes public args; + + /// @notice sets the code to be appended to the source file + function setCode(string memory acode) public { + code = acode; + } + + /// @notice sets the arguments to be appended to the bytecode + function setArgs(bytes memory aargs) public { + args = aargs; + } + + /// @notice Deployment wrapper + function deploy(string memory file) public returns (address) { + // Split the file into it's parts + strings.slice memory s = file.toSlice(); + strings.slice memory delim = "/".toSlice(); + string[] memory parts = new string[](s.count(delim) + 1); + for (uint256 i = 0; i < parts.length; i++) { + parts[i] = s.split(delim).toString(); + } + + // Re-concatenate the file with a "__TEMP__" prefix + string memory tempFile = parts[0]; + for (uint256 i = 1; i < parts.length - 1; i++) { + tempFile = string.concat(tempFile, "/", parts[i]); + } + tempFile = string.concat(tempFile, "/", "__TEMP__", parts[parts.length - 1]); + + // Paste the code in a new temp file + string[] memory create_cmds = new string[](3); + create_cmds[0] = "./scripts/file_writer.sh"; + create_cmds[1] = string.concat("src/", tempFile, ".huff"); + create_cmds[2] = string.concat(code, "\n"); + vm.ffi(create_cmds); + + // Append the real code to the temp file + string[] memory append_cmds = new string[](3); + append_cmds[0] = "./scripts/read_and_append.sh"; + append_cmds[1] = string.concat("src/", tempFile, ".huff"); + append_cmds[2] = string.concat("src/", file, ".huff"); + vm.ffi(append_cmds); + + // Deploy with args the temp file + address deployed = HuffDeployer.deploy_with_args(tempFile, args); + + // Clean up temp files + string[] memory cleanup = new string[](2); + cleanup[0] = "rm"; + cleanup[1] = string.concat("src/", tempFile, ".huff"); + vm.ffi(cleanup); + + // Return the deployed address + return deployed; + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/depreciated/StatefulDeployer.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/depreciated/StatefulDeployer.t.sol new file mode 100644 index 000000000..477396552 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/depreciated/StatefulDeployer.t.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +import "forge-std/Test.sol"; + +import {INumber} from "../test/interfaces/INumber.sol"; +import {IConstructor} from "../test/interfaces/IConstructor.sol"; +import {StatefulDeployer} from "./StatefulDeployer.sol"; + +contract StatefulDeployerTest is Test { + StatefulDeployer public deployer; + IConstructor public construct; + + function setUp() public { + deployer = new StatefulDeployer(); + } + + function testSetArgs(bytes memory some) public { + deployer.setArgs(some); + assertEq(deployer.args(), some); + } + + function testSetCode(string memory code) public { + deployer.setCode(code); + assertEq(deployer.code(), code); + } + + function testDeployWithArgsAndCode() public { + deployer.setArgs(bytes.concat(abi.encode(uint256(0x420)), abi.encode(uint256(0x420)))); + deployer.setCode( + "" "#define macro CONSTRUCTOR() = takes(0) returns (0) { \n" + " // Copy the first argument into memory \n" + " 0x20 // [size] - byte size to copy \n" + " 0x40 codesize sub // [offset, size] - offset in the code to copy from \n" + " 0x00 // [mem, offset, size] - offset in memory to copy to \n" + " codecopy // [] \n" + " // Store the first argument in storage \n" + " 0x00 mload // [arg] \n" + " [CONSTRUCTOR_ARG_ONE] // [CONSTRUCTOR_ARG_ONE, arg] \n" + " sstore // [] \n" + " // Copy the second argument into memory \n" + " 0x20 // [size] - byte size to copy \n" + " 0x20 codesize sub // [offset, size] - offset in the code to copy from \n" + " 0x00 // [mem, offset, size] - offset in memory to copy to \n" + " codecopy // [] \n" + " // Store the second argument in storage \n" + " 0x00 mload // [arg] \n" + " [CONSTRUCTOR_ARG_TWO] // [CONSTRUCTOR_ARG_TWO, arg] \n" + " sstore // [] \n" "}" + ); + + construct = IConstructor(deployer.deploy("test/contracts/NoConstructor")); + assertEq(address(0x420), construct.getArgOne()); + assertEq(uint256(0x420), construct.getArgTwo()); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/HuffConfig.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/HuffConfig.t.sol new file mode 100644 index 000000000..03fdb7beb --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/HuffConfig.t.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +import "forge-std/Test.sol"; + +import {INumber} from "./interfaces/INumber.sol"; +import {IConstructor} from "./interfaces/IConstructor.sol"; +import {HuffConfig} from "../HuffConfig.sol"; + +contract HuffConfigTest is Test { + HuffConfig public config; + INumber public number; + + function setUp() public { + config = new HuffConfig(); + } + + function testWithDeployer(address deployer) public { + config.with_deployer(deployer); + assertEq(config.deployer(), deployer); + } + + function testWithArgs(bytes memory some) public { + config.with_args(some); + assertEq(config.args(), some); + } + + function testWithValue(uint256 value) public { + config.with_value(value); + assertEq(config.value(), value); + } + + function testWithCode(string memory code) public { + config.with_code(code); + assertEq(config.code(), code); + } + + function testWithConstantOverrides(string memory key, string memory value) public { + config.with_constant(key, value); + (string memory k, string memory v) = config.const_overrides(0); + assertEq(key, k); + assertEq(value, v); + } + + function testSetBroadcast(bool broadcast) public { + config.set_broadcast(broadcast); + bool b = config.should_broadcast(); + assertEq(b, broadcast); + } + + function testWithEvmVersion() public { + config.with_evm_version("paris"); + assertEq(config.evm_version(), "paris"); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/HuffDeployer.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/HuffDeployer.t.sol new file mode 100644 index 000000000..c0496de14 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/HuffDeployer.t.sol @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +import "forge-std/Test.sol"; + +import {HuffConfig} from "../HuffConfig.sol"; +import {HuffDeployer} from "../HuffDeployer.sol"; +import {INumber} from "./interfaces/INumber.sol"; +import {IConstructor} from "./interfaces/IConstructor.sol"; +import {IRememberCreator} from "./interfaces/IRememberCreator.sol"; + +contract HuffDeployerTest is Test { + INumber number; + IConstructor structor; + + event ArgumentsUpdated(address indexed one, uint256 indexed two); + + function setUp() public { + number = INumber(HuffDeployer.deploy("test/contracts/Number")); + + // Backwards-compatible Constructor creation + vm.recordLogs(); + structor = IConstructor( + HuffDeployer.deploy_with_args( + "test/contracts/Constructor", + bytes.concat(abi.encode(address(0x420)), abi.encode(uint256(0x420))) + ) + ); + Vm.Log[] memory entries = vm.getRecordedLogs(); + + assertEq(entries.length, 1); + assertEq(entries[0].topics.length, 3); + assertEq(entries[0].topics[0], bytes32(uint256(keccak256("ArgumentsUpdated(address,uint256)")))); + assertEq(entries[0].topics[1], bytes32(uint256(uint160(address(0x420))))); + assertEq(entries[0].topics[2], bytes32(uint256(0x420))); + + } + + function testChaining() public { + // Defined Constructor + string memory constructor_macro = "#define macro CONSTRUCTOR() = takes(0) returns (0) {" + " // Copy the first argument into memory \n" + " 0x20 // [size] - byte size to copy \n" + " 0x40 codesize sub // [offset, size] - offset in the code to copy from\n " + " 0x00 // [mem, offset, size] - offset in memory to copy to \n" + " codecopy // [] \n" + " // Store the first argument in storage\n" + " 0x00 mload dup1 // [arg1, arg1] \n" + " [CONSTRUCTOR_ARG_ONE] // [CONSTRUCTOR_ARG_ONE, arg1, arg1] \n" + " sstore // [arg1] \n" + " // Copy the second argument into memory \n" + " 0x20 // [size, arg1] - byte size to copy \n" + " 0x20 codesize sub // [offset, size, arg1] - offset in the code to copy from \n" + " 0x00 // [mem, offset, size, arg1] - offset in memory to copy to \n" + " codecopy // [arg1] \n" + " // Store the second argument in storage \n" + " 0x00 mload dup1 // [arg2, arg2, arg1] \n" + " [CONSTRUCTOR_ARG_TWO] // [CONSTRUCTOR_ARG_TWO, arg2, arg2, arg1] \n" + " sstore // [arg2, arg1] \n" + " // Emit the owner updated event \n" + " swap1 // [arg1, arg2] \n" + " [ARGUMENTS_TOPIC] // [sig, arg1, arg2] \n" + " 0x00 0x00 // [0, 0, sig, arg1, arg2] \n" + " log3 // [] \n" "}"; + + // New pattern + vm.recordLogs(); + IConstructor chained = IConstructor( + HuffDeployer.config().with_args( + bytes.concat(abi.encode(address(0x420)), abi.encode(uint256(0x420))) + ).with_code(constructor_macro).deploy("test/contracts/NoConstructor") + ); + + Vm.Log[] memory entries = vm.getRecordedLogs(); + assertEq(entries.length, 1); + assertEq(entries[0].topics.length, 3); + assertEq(entries[0].topics[0], bytes32(uint256(keccak256("ArgumentsUpdated(address,uint256)")))); + assertEq(entries[0].topics[1], bytes32(uint256(uint160(address(0x420))))); + assertEq(entries[0].topics[2], bytes32(uint256(0x420))); + + assertEq(address(0x420), chained.getArgOne()); + assertEq(uint256(0x420), chained.getArgTwo()); + } + + function testChaining_Create2() public { + // Defined Constructor + string memory constructor_macro = "#define macro CONSTRUCTOR() = takes(0) returns (0) {" + " // Copy the first argument into memory \n" + " 0x20 // [size] - byte size to copy \n" + " 0x40 codesize sub // [offset, size] - offset in the code to copy from\n " + " 0x00 // [mem, offset, size] - offset in memory to copy to \n" + " codecopy // [] \n" " // Store the first argument in storage\n" + " 0x00 mload dup1 // [arg1, arg1] \n" + " [CONSTRUCTOR_ARG_ONE] // [CONSTRUCTOR_ARG_ONE, arg1, arg1] \n" + " sstore // [arg1] \n" " // Copy the second argument into memory \n" + " 0x20 // [size, arg1] - byte size to copy \n" + " 0x20 codesize sub // [offset, size, arg1] - offset in the code to copy from \n" + " 0x00 // [mem, offset, size, arg1] - offset in memory to copy to \n" + " codecopy // [arg1] \n" " // Store the second argument in storage \n" + " 0x00 mload dup1 // [arg2, arg2, arg1] \n" + " [CONSTRUCTOR_ARG_TWO] // [CONSTRUCTOR_ARG_TWO, arg2, arg2, arg1] \n" + " sstore // [arg2, arg1] \n" " // Emit the owner updated event \n" + " swap1 // [arg1, arg2] \n" + " [ARGUMENTS_TOPIC] // [sig, arg1, arg2] \n" + " 0x00 0x00 // [0, 0, sig, arg1, arg2] \n" + " log3 // [] \n" "}"; + + // New pattern + vm.recordLogs(); + IConstructor chained = IConstructor( + HuffDeployer.config_with_create_2(1).with_args(bytes.concat(abi.encode(address(0x420)), abi.encode(uint256(0x420)))) + .with_code(constructor_macro).deploy("test/contracts/NoConstructor") + ); + + Vm.Log[] memory entries = vm.getRecordedLogs(); + assertEq(entries.length, 1); + assertEq(entries[0].topics.length, 3); + assertEq(entries[0].topics[0], bytes32(uint256(keccak256("ArgumentsUpdated(address,uint256)")))); + assertEq(entries[0].topics[1], bytes32(uint256(uint160(address(0x420))))); + assertEq(entries[0].topics[2], bytes32(uint256(0x420))); + + assertEq(address(0x420), chained.getArgOne()); + assertEq(uint256(0x420), chained.getArgTwo()); + } + + function testArgOne() public { + assertEq(address(0x420), structor.getArgOne()); + } + + function testArgTwo() public { + assertEq(uint256(0x420), structor.getArgTwo()); + } + + function testBytecode() public { + bytes memory b = bytes( + hex"5f3560e01c80633fb5c1cb1461001b578063f2c9ecd814610021575b6004355f555b5f545f5260205ff3" + ); + assertEq(getCode(address(number)), b); + } + + function testWithValueDeployment() public { + uint256 value = 1 ether; + HuffDeployer.config().with_value(value).deploy{value: value}( + "test/contracts/ConstructorNeedsValue" + ); + } + + function testWithValueDeployment_Create2() public { + uint256 value = 1 ether; + HuffDeployer.config_with_create_2(1).with_value(value).deploy{value: value}("test/contracts/ConstructorNeedsValue"); + } + + function testConstantOverride() public { + // Test address constant + address a = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF; + address deployed = HuffDeployer.config().with_addr_constant("a", a).with_constant( + "b", "0x420" + ).deploy("test/contracts/ConstOverride"); + assertEq(getCode(deployed), hex"73DeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF610420"); + + // Test uint constant + address deployed_2 = HuffDeployer.config().with_uint_constant("a", 32).with_constant( + "b", "0x420" + ).deploy("test/contracts/ConstOverride"); + assertEq(getCode(deployed_2), hex"6020610420"); + + // Test bytes32 constant + address deployed_3 = HuffDeployer.config().with_bytes32_constant("a", bytes32(hex"01")) + .with_constant("b", "0x420").deploy("test/contracts/ConstOverride"); + assertEq( + getCode(deployed_3), + hex"7f0100000000000000000000000000000000000000000000000000000000000000610420" + ); + + // Keep default "a" value and assign "b", which is unassigned in "ConstOverride.huff" + address deployed_4 = + HuffDeployer.config().with_constant("b", "0x420").deploy("test/contracts/ConstOverride"); + assertEq(getCode(deployed_4), hex"6001610420"); + } + + function testConstantOverride_Create2() public { + // Test address constant + address a = 0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF; + address deployed = HuffDeployer.config_with_create_2(1).with_addr_constant("a", a).with_constant("b", "0x420").deploy( + "test/contracts/ConstOverride" + ); + assertEq(getCode(deployed), hex"73DeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF610420"); + + // Test uint constant + address deployed_2 = HuffDeployer.config_with_create_2(2).with_uint_constant("a", 32).with_constant("b", "0x420").deploy( + "test/contracts/ConstOverride" + ); + assertEq(getCode(deployed_2), hex"6020610420"); + + // Test bytes32 constant + address deployed_3 = HuffDeployer.config_with_create_2(3).with_bytes32_constant("a", bytes32(hex"01")).with_constant( + "b", "0x420" + ).deploy("test/contracts/ConstOverride"); + assertEq(getCode(deployed_3), hex"7f0100000000000000000000000000000000000000000000000000000000000000610420"); + + // Keep default "a" value and assign "b", which is unassigned in "ConstOverride.huff" + address deployed_4 = HuffDeployer.config_with_create_2(4).with_constant("b", "0x420").deploy("test/contracts/ConstOverride"); + assertEq(getCode(deployed_4), hex"6001610420"); + } + + function getCode(address who) internal view returns (bytes memory o_code) { + /// @solidity memory-safe-assembly + assembly { + // retrieve the size of the code, this needs assembly + let size := extcodesize(who) + // allocate output byte array - this could also be done without assembly + // by using o_code = new bytes(size) + o_code := mload(0x40) + // new "memory end" including padding + mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) + // store length in memory + mstore(o_code, size) + // actually retrieve the code, this needs assembly + extcodecopy(who, add(o_code, 0x20), 0, size) + } + } + + function testSet(uint256 num) public { + number.setNumber(num); + assertEq(num, number.getNumber()); + } + + function testConstructorDefaultCaller() public { + HuffConfig config = HuffDeployer.config(); + IRememberCreator rememberer = IRememberCreator(config.deploy("test/contracts/RememberCreator")); + assertEq(rememberer.CREATOR(), address(config)); + } + + function runTestConstructorCaller(address deployer) public { + IRememberCreator rememberer = IRememberCreator( + HuffDeployer + .config() + .with_deployer(deployer) + .deploy("test/contracts/RememberCreator") + ); + assertEq(rememberer.CREATOR(), deployer); + } + + // @dev fuzzed test too slow, random examples and address(0) chosen + function testConstructorCaller() public { + runTestConstructorCaller(address(uint160(uint256(keccak256("random addr 1"))))); + runTestConstructorCaller(address(uint160(uint256(keccak256("random addr 2"))))); + runTestConstructorCaller(address(0)); + runTestConstructorCaller(address(uint160(0x1000))); + } + + /// @dev test that compilation is different with new evm versions + function testSettingEVMVersion() public { + /// expected bytecode for EVM version "paris" + bytes memory expectedParis = hex"6000"; + HuffConfig config = HuffDeployer.config().with_evm_version("paris"); + address withParis = config.deploy("test/contracts/EVMVersionCheck"); + + bytes memory parisBytecode = withParis.code; + assertEq(parisBytecode, expectedParis); + + /// expected bytecode for EVM version "shanghai" | default + bytes memory expectedShanghai = hex"5f"; + HuffConfig shanghaiConfig = HuffDeployer.config().with_evm_version("shanghai"); + address withShanghai = shanghaiConfig.deploy("test/contracts/EVMVersionCheck"); + bytes memory shanghaiBytecode = withShanghai.code; + assertEq(shanghaiBytecode, expectedShanghai); + + /// Default should be shanghai (latest) + HuffConfig defaultConfig = HuffDeployer.config().with_evm_version(""); + address withDefault = defaultConfig.deploy("test/contracts/EVMVersionCheck"); + + bytes memory defaultBytecode = withDefault.code; + assertEq(defaultBytecode, expectedShanghai); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/Logging.t.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/Logging.t.sol new file mode 100644 index 000000000..829cc0511 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/Logging.t.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +import "forge-std/Test.sol"; + +import {HuffConfig} from "../HuffConfig.sol"; +import {HuffDeployer} from "../HuffDeployer.sol"; +import {INumber} from "./interfaces/INumber.sol"; +import {IConstructor} from "./interfaces/IConstructor.sol"; + +contract LoggingTest is Test { + event LogOne(); + event LogTwo(address indexed a); + event LogThree(address indexed a, uint256 indexed b); + event LogFour(address indexed a, uint256 indexed b, bytes32 indexed c); + event Extended( + address indexed a, uint256 indexed b, bytes32 indexed h1, bytes32 h2, bytes32 two + ); + + function testLoggingWithArgs() public { + vm.recordLogs(); + HuffDeployer.deploy_with_args( + "test/contracts/LotsOfLogging", + bytes.concat(abi.encode(address(0x420)), abi.encode(uint256(0x420))) + ); + Vm.Log[] memory entries = vm.getRecordedLogs(); + + assertEq(entries.length, 5); + assertEq(entries[0].topics.length, 1); + assertEq(entries[0].topics[0], bytes32(uint256(keccak256("LogOne()")))); + assertEq(entries[1].topics.length, 2); + assertEq(entries[1].topics[0], bytes32(uint256(keccak256("LogTwo(address)")))); + // assertEq(entries[1].topics[1], ?); should be address from deployed config + assertEq(entries[2].topics.length, 3); + assertEq(entries[2].topics[0], bytes32(uint256(keccak256("LogThree(address,uint256)")))); + // assertEq(entries[2].topics[1], ?); should be address from deployed config + assertEq(entries[2].topics[2], bytes32(uint256(0x0))); + assertEq(entries[3].topics.length, 4); + assertEq(entries[3].topics[0], bytes32(uint256(keccak256("LogFour(address,uint256,bytes32)")))); + // assertEq(entries[3].topics[1], ?); should be address from deployed config + assertEq(entries[3].topics[2], bytes32(uint256(0x0))); + assertEq(entries[3].topics[3], bytes32(uint256(keccak256(abi.encode(1))))); + assertEq(entries[4].topics.length, 4); + assertEq(entries[4].topics[0], bytes32(uint256(keccak256("Extended(address,uint256,bytes32,bytes32,bytes32)")))); + // assertEq(entries[4].topics[1], ?); should be address from deployed config + assertEq(entries[4].topics[2], bytes32(uint256(0x0))); + assertEq(entries[4].topics[3], bytes32(uint256(keccak256(abi.encode(1))))); + assertEq(entries[4].data, abi.encode(keccak256(abi.encode(2)), keccak256(abi.encode(3)))); + } + + function testLoggingWithDeploy() public { + vm.expectEmit(false, true, true, true); + emit LogOne(); + emit LogTwo(address(0)); + emit LogThree(address(0), 0); + emit LogFour(address(0), 0, keccak256(abi.encode(1))); + emit Extended( + address(0), + 0, + keccak256(abi.encode(1)), + keccak256(abi.encode(2)), + keccak256(abi.encode(3)) + ); + HuffDeployer.deploy("test/contracts/LotsOfLogging"); + } + + function testConfigLogging() public { + HuffConfig config = HuffDeployer.config().with_args(abi.encode(address(0x420))); + vm.expectEmit(true, true, true, true); + emit LogOne(); + emit LogTwo(address(config)); + emit LogThree(address(config), 0); + emit LogFour(address(config), 0, keccak256(abi.encode(1))); + emit Extended( + address(config), + 0, + keccak256(abi.encode(1)), + keccak256(abi.encode(2)), + keccak256(abi.encode(3)) + ); + config.deploy("test/contracts/LotsOfLogging"); + } +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/ConstOverride.huff b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/ConstOverride.huff new file mode 100644 index 000000000..ce80a69fe --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/ConstOverride.huff @@ -0,0 +1,6 @@ +#define constant a = 0x01 + +#define macro MAIN() = takes (0) returns (0) { + [a] + [b] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/Constructor.huff b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/Constructor.huff new file mode 100644 index 000000000..ce3a0bc6d --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/Constructor.huff @@ -0,0 +1,69 @@ +/* Interface */ +#define function getArgOne() view returns (address) +#define function getArgTwo() view returns (uint256) + +/* Storage Slots */ +#define constant CONSTRUCTOR_ARG_ONE = FREE_STORAGE_POINTER() +#define constant CONSTRUCTOR_ARG_TWO = FREE_STORAGE_POINTER() + +/* Events */ +#define event ArgumentsUpdated(address indexed one, uint256 indexed two) + +#define constant ARGUMENTS_TOPIC = 0xd0a6a6b9636b3b1e85120bfc8c36f7bc862769b48e0854deaf8780636a71ce7d + +/* Constructor */ +#define macro CONSTRUCTOR() = takes(0) returns (0) { + // Copy the first argument into memory + 0x20 // [size] - byte size to copy + 0x40 codesize sub // [offset, size] - offset in the code to copy from + 0x00 // [mem, offset, size] - offset in memory to copy to + codecopy // [] + + // Store the first argument in storage + 0x00 mload dup1 // [arg1, arg1] + [CONSTRUCTOR_ARG_ONE] // [CONSTRUCTOR_ARG_ONE, arg1, arg1] + sstore // [arg1] + + // Copy the second argument into memory + 0x20 // [size, arg1] - byte size to copy + 0x20 codesize sub // [offset, size, arg1] - offset in the code to copy from + 0x00 // [mem, offset, size, arg1] - offset in memory to copy to + codecopy // [arg1] + + // Store the second argument in storage + 0x00 mload dup1 // [arg2, arg2, arg1] + [CONSTRUCTOR_ARG_TWO] // [CONSTRUCTOR_ARG_TWO, arg2, arg2, arg1] + sstore // [arg2, arg1] + + // Emit the owner updated event + swap1 // [arg1, arg2] + [ARGUMENTS_TOPIC] // [sig, arg1, arg2] + 0x00 0x00 // [0, 0, sig, arg1, arg2] + log3 // [] +} + +/* First Argument Accessor */ +#define macro GET_ARG_ONE() = takes (0) returns (0) { + [CONSTRUCTOR_ARG_ONE] sload + 0x00 mstore + 0x20 0x00 return +} + +/* Second Argument Accessor */ +#define macro GET_ARG_TWO() = takes (0) returns (0) { + [CONSTRUCTOR_ARG_TWO] sload + 0x00 mstore + 0x20 0x00 return +} + +/* Main Macro */ +#define macro MAIN() = takes (0) returns (0) { + 0x00 calldataload 0xE0 shr + dup1 0xbb01e52d eq arg_one jumpi + dup1 0x98e45be4 eq arg_two jumpi + + arg_one: + GET_ARG_ONE() + arg_two: + GET_ARG_TWO() +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/ConstructorNeedsValue.huff b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/ConstructorNeedsValue.huff new file mode 100644 index 000000000..27da3e78b --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/ConstructorNeedsValue.huff @@ -0,0 +1,16 @@ + +#define macro CONSTRUCTOR() = takes (0) returns (0) { + callvalue // [msg.value] + iszero // [is_msg_value_zero] + iszero // [is_msg_value_non_zero] + deposited // [deposited_jumpdest, is_msg_value_non_zero] + jumpi // [] + 0x00 0x00 revert + deposited: +} + +#define macro MAIN() = takes (0) returns (0) { + 0x00 calldataload 0xE0 shr + 0x00 mstore + 0x20 0x00 return +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/EVMVersionCheck.huff b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/EVMVersionCheck.huff new file mode 100644 index 000000000..960917a32 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/EVMVersionCheck.huff @@ -0,0 +1,5 @@ + + +#define macro MAIN() = { + 0x00 +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/LotsOfLogging.huff b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/LotsOfLogging.huff new file mode 100644 index 000000000..f2bfe6cbd --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/LotsOfLogging.huff @@ -0,0 +1,56 @@ +/* Events */ +#define event LogOne() +#define event LogTwo(address indexed a) +#define event LogThree(address indexed a, uint256 indexed b) +#define event LogFour(address indexed a, uint256 indexed b, bytes32 indexed c) +#define event Extended(address indexed a, uint256 indexed b, bytes32 indexed h1, bytes32 h2, bytes32 two) + +/* Constructor */ +#define macro CONSTRUCTOR() = takes(0) returns (0) { + // Empty Anonymous Log + // 0x00 0x00 log0 + + // LogOne + __EVENT_HASH(LogOne) // [hash] + 0x00 0x00 log1 // [] + + // LogTwo + caller // [address] + __EVENT_HASH(LogTwo) // [hash, address] + 0x00 0x00 log2 // [] + + // LogThree + selfbalance // [balance] + caller // [address, balance] + __EVENT_HASH(LogThree) // [hash, address, balance] + 0x00 0x00 log3 // [] + + // LogFour + 0x01 0x00 mstore // [] + 0x20 0x00 sha3 // [bytes32_hash] + selfbalance // [balance, bytes32_hash] + caller // [address, balance, bytes32_hash] + __EVENT_HASH(LogFour) // [hash, address, balance, bytes32_hash] + 0x00 0x00 log4 // [] + + // Evented Log + 0x01 0x00 mstore // [] + 0x20 0x00 sha3 // [hash1] + 0x02 0x00 mstore // [hash1] + 0x20 0x00 sha3 // [hash2, hash1] + 0x00 mstore // [hash1] + 0x03 0x20 mstore // [hash1] + 0x20 0x20 sha3 // [two, hash1] + 0x20 mstore // [hash1] + selfbalance // [balance, hash1] + caller // [address, balance, hash1] + __EVENT_HASH(Extended) // [hash, address, balance, hash1] + 0x40 0x00 log4 // [] +} + +/* Main Macro - Does Nothing */ +#define macro MAIN() = takes (0) returns (0) { + 0x00 calldataload 0xE0 shr + 0x00 mstore + 0x20 0x00 return +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/NoConstructor.huff b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/NoConstructor.huff new file mode 100644 index 000000000..4bf49c8ba --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/NoConstructor.huff @@ -0,0 +1,38 @@ +/* Interface */ +#define function getArgOne() view returns (address) +#define function getArgTwo() view returns (uint256) + +/* Storage Slots */ +#define constant CONSTRUCTOR_ARG_ONE = FREE_STORAGE_POINTER() +#define constant CONSTRUCTOR_ARG_TWO = FREE_STORAGE_POINTER() + +/* Events */ +#define event ArgumentsUpdated(address indexed one, uint256 indexed two) + +#define constant ARGUMENTS_TOPIC = 0xd0a6a6b9636b3b1e85120bfc8c36f7bc862769b48e0854deaf8780636a71ce7d + +/* First Argument Accessor */ +#define macro GET_ARG_ONE() = takes (0) returns (0) { + [CONSTRUCTOR_ARG_ONE] sload + 0x00 mstore + 0x20 0x00 return +} + +/* Second Argument Accessor */ +#define macro GET_ARG_TWO() = takes (0) returns (0) { + [CONSTRUCTOR_ARG_TWO] sload + 0x00 mstore + 0x20 0x00 return +} + +/* Main Macro */ +#define macro MAIN() = takes (0) returns (0) { + 0x00 calldataload 0xE0 shr + dup1 0xbb01e52d eq arg_one jumpi + dup1 0x98e45be4 eq arg_two jumpi + + arg_one: + GET_ARG_ONE() + arg_two: + GET_ARG_TWO() +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/Number.huff b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/Number.huff new file mode 100644 index 000000000..d6813e4b1 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/Number.huff @@ -0,0 +1,38 @@ +/* Interface */ +#define function setNumber(uint256) nonpayable returns () +#define function getNumber() view returns (uint256) + +/* Storage Slots */ +#define constant NUMBER_LOCATION = FREE_STORAGE_POINTER() + +/* Methods */ +#define macro SET_NUMBER() = takes (0) returns (0) { + 0x04 calldataload // [number] + [NUMBER_LOCATION] // [ptr, number] + sstore // [] +} + +#define macro GET_NUMBER() = takes (0) returns (0) { + // Load number from storage. + [NUMBER_LOCATION] // [ptr] + sload // [number] + + // Store number in memory. + 0x00 mstore + + // Return number + 0x20 0x00 return +} + +#define macro MAIN() = takes (0) returns (0) { + // Identify which function is being called. + 0x00 calldataload 0xE0 shr + dup1 0x3fb5c1cb eq set jumpi + dup1 0xf2c9ecd8 eq get jumpi + + set: + SET_NUMBER() + get: + GET_NUMBER() + +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/RememberCreator.huff b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/RememberCreator.huff new file mode 100644 index 000000000..cab97c15b --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/contracts/RememberCreator.huff @@ -0,0 +1,24 @@ +#define constant CREATOR_SLOT = FREE_STORAGE_POINTER() + +#define function CREATOR() view returns (address) + +#define macro CONSTRUCTOR() = takes(0) returns(0) { + caller [CREATOR_SLOT] sstore +} + +#define macro MAIN() = takes(0) returns(0) { + 0x00 calldataload 0xE0 shr // [selector] + __FUNC_SIG(CREATOR) eq get_creator jumpi + + // no selector matched, revert + base_error: + returndatasize returndatasize revert + + get_creator: + // check no call value + callvalue base_error jumpi + // read and return creator + [CREATOR_SLOT] sload // [creator] + returndatasize mstore // [] + 0x20 returndatasize return +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/IConstructor.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/IConstructor.sol new file mode 100644 index 000000000..c63d409bd --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/IConstructor.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +interface IConstructor { + function getArgOne() external returns (address); + function getArgTwo() external returns (uint256); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/INumber.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/INumber.sol new file mode 100644 index 000000000..5fabb79f1 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/INumber.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +interface INumber { + function setNumber(uint256) external; + function getNumber() external returns (uint256); +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/IRememberCreator.sol b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/IRememberCreator.sol new file mode 100644 index 000000000..a9b6ec71d --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/src/test/interfaces/IRememberCreator.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +interface IRememberCreator { + function CREATOR() external view returns (address); +} diff --git a/packages/wallet/wallet-contracts/networks/arbitrum.json b/packages/wallet/wallet-contracts/networks/arbitrum.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/arbitrum.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/arbitrumGoerli.json b/packages/wallet/wallet-contracts/networks/arbitrumGoerli.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/arbitrumGoerli.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/arbitrumNova.json b/packages/wallet/wallet-contracts/networks/arbitrumNova.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/arbitrumNova.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/avalanche.json b/packages/wallet/wallet-contracts/networks/avalanche.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/avalanche.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/avalancheFuji.json b/packages/wallet/wallet-contracts/networks/avalancheFuji.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/avalancheFuji.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/bnb.json b/packages/wallet/wallet-contracts/networks/bnb.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/bnb.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/bnbTestnet.json b/packages/wallet/wallet-contracts/networks/bnbTestnet.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/bnbTestnet.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/gnosis.json b/packages/wallet/wallet-contracts/networks/gnosis.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/gnosis.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/goerli.json b/packages/wallet/wallet-contracts/networks/goerli.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/goerli.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/hardhat.json b/packages/wallet/wallet-contracts/networks/hardhat.json new file mode 100644 index 000000000..67df434ce --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/hardhat.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xE1846F966D116B86d65481Fe81886219D698b60D" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0xB39E1ed61caC9E8eE8CDD3218765cF6a7fE390db" + }, + { + "contractName": "GuestModule", + "address": "0x28Ec0675C7b40ed78EBcBBbDF39e5652c0787B18" + }, + { + "contractName": "SequenceUtils", + "address": "0x4817Fe9f2352E88991A7c84E4385708Ccff05704" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/mainnet.json b/packages/wallet/wallet-contracts/networks/mainnet.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/mainnet.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/mumbai.json b/packages/wallet/wallet-contracts/networks/mumbai.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/mumbai.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/optimism.json b/packages/wallet/wallet-contracts/networks/optimism.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/optimism.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/polygon.json b/packages/wallet/wallet-contracts/networks/polygon.json new file mode 100644 index 000000000..c58ed64f4 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/polygon.json @@ -0,0 +1,26 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + }, + { + "contractName": "TrustFactory", + "address": "0x4483FaA9dEEDd6D6FaCFee9c686f1E394A1280f9" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/networks/polygonZkevm.json b/packages/wallet/wallet-contracts/networks/polygonZkevm.json new file mode 100644 index 000000000..d92732502 --- /dev/null +++ b/packages/wallet/wallet-contracts/networks/polygonZkevm.json @@ -0,0 +1,22 @@ +[ + { + "contractName": "WalletFactory", + "address": "0xFaA5c0b14d1bED5C888Ca655B9a8A5911F78eF4A" + }, + { + "contractName": "MainModule", + "address": "0xfBf8f1A5E00034762D928f46d438B947f5d4065d" + }, + { + "contractName": "MainModuleUpgradable", + "address": "0x4222dcA3974E39A8b41c411FeDDE9b09Ae14b911" + }, + { + "contractName": "GuestModule", + "address": "0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE" + }, + { + "contractName": "SequenceUtils", + "address": "0xdbbFa3cB3B087B64F4ef5E3D20Dda2488AA244e6" + } +] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/package-lock.json b/packages/wallet/wallet-contracts/package-lock.json new file mode 100644 index 000000000..cedf440ee --- /dev/null +++ b/packages/wallet/wallet-contracts/package-lock.json @@ -0,0 +1,24771 @@ +{ + "name": "@0xsequence/wallet-contracts", + "version": "3.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@0xsequence/wallet-contracts", + "version": "3.0.1", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/wallet": "^2.3.33", + "@typechain/ethers-v6": "^0.5.1", + "0xsequence": "^1.10.15", + "ethers": "^6.15.0", + "keccak256": "^1.0.6" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ethers": "^4.0.3", + "@nomicfoundation/hardhat-verify": "^3.0.7", + "@nomiclabs/hardhat-truffle5": "^2.1.0", + "@nomiclabs/hardhat-web3": "^2.1.0", + "@tenderly/hardhat-tenderly": "^2.5.2", + "@types/chai": "^4.3.20", + "@types/chai-as-promised": "^7.1.8", + "@types/chai-string": "^1.4.5", + "@types/mocha": "^8.2.3", + "@typescript-eslint/eslint-plugin": "^8.46.4", + "@typescript-eslint/parser": "^8.46.4", + "bn-chai": "^1.0.1", + "chai": "^4.5.0", + "chai-as-promised": "^7.1.2", + "chai-bignumber": "^3.1.0", + "chai-shallow-deep-equal": "^1.4.6", + "chai-string": "^1.6.0", + "child_process": "^1.0.2", + "dotenv": "^8.6.0", + "eslint": "^9.39.2", + "eslint-config-prettier": "^8.10.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^3.4.1", + "ethereum-waffle": "^4.0.10", + "ganache-cli": "6.12.2", + "hardhat": "^2.27.0", + "hardhat-gas-reporter": "1.0.10", + "husky": "^9.1.7", + "ora": "^5.4.1", + "rimraf": "^3.0.2", + "scrypt": "github:barrysteyn/node-scrypt#fb60a8d3c158fe115a624b5ffa7480f3a24b03fb", + "solhint": "^3.6.2", + "solidity-coverage": "^0.7.22", + "threads": "^1.7.0", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^4.9.5", + "yesno": "^0.3.1" + } + }, + "node_modules/@0xsequence/abi": { + "version": "2.3.33", + "resolved": "https://registry.npmjs.org/@0xsequence/abi/-/abi-2.3.33.tgz", + "integrity": "sha512-SSkzgtcsludAzXAVhTRlgxjTSKtqdpnqX2uivomRN9FFEIfKjOzNtSN7LmGA+nhEF9fW6ILAAJfIhjZgmMNz9w==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/account": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/account/-/account-1.10.15.tgz", + "integrity": "sha512-NJhnOKWSRMj5YuI58HFTf3gC2Ld0FvUw6DUTikpF8JTx3xExWjafz5PJrQkJ/SpIYvS5GQJTB0Hjx6d6j1/dSQ==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/migration": "1.10.15", + "@0xsequence/network": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/sessions": "1.10.15", + "@0xsequence/utils": "1.10.15", + "@0xsequence/wallet": "1.10.15", + "ethers": "^5.5.2" + } + }, + "node_modules/@0xsequence/account/node_modules/@0xsequence/abi": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/abi/-/abi-1.10.15.tgz", + "integrity": "sha512-nuh68P8tRDzIMIH7mnGX1Eab0jsYVGhZa7IlNIs8CfTnGoanxLS+MGk5ioZBa6+slzxb9VP8mnQ5QhAWeFySeg==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/account/node_modules/@0xsequence/core": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/core/-/core-1.10.15.tgz", + "integrity": "sha512-wrE5soJSqrhhm7pC+NxckLR0lJSOnsHPLKdDqWeTRmyuhtZ4e0DsrcoeoD40I/3Bd77tdZ1GGbq00CryV7JfFw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5" + } + }, + "node_modules/@0xsequence/account/node_modules/@0xsequence/indexer": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/indexer/-/indexer-1.10.15.tgz", + "integrity": "sha512-bc2gAIEplMcmWJMwLuXZZ0wifoxuV/zHyWzEdbQ5+9ruIXArxyoG0Ue9fMEzKWHfsAWyBKBJCCFbr4XJEQ5YjA==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/account/node_modules/@0xsequence/network": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/network/-/network-1.10.15.tgz", + "integrity": "sha512-wHp8RGqFrncuoIh0ityO/jUobliargQ7SWlvZCf8Ez0T7uiXDEDokrFSN2F9FIl6i5a5NmcEpXhfhwS/L0pN2w==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "1.10.15", + "@0xsequence/indexer": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/account/node_modules/@0xsequence/relayer": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/relayer/-/relayer-1.10.15.tgz", + "integrity": "sha512-QpNAzRjqCl9xJdXzErQA0kmv2jzEXPfVlPwutbgmrCEIj+rHdw3M+kiG0MWBnOqxoSEA98oJnxXmpBL5mkCA6g==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/account/node_modules/@0xsequence/signhub": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/signhub/-/signhub-1.10.15.tgz", + "integrity": "sha512-9yZWb8d2aXoWOQp0XC81hkS+hLWxO/pZIyCRtNVdif0/SPA86v6e96xPmuj45KONYgiH33ROVDpeJEKhOEo0jg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "1.10.15", + "ethers": "^5.5.2" + } + }, + "node_modules/@0xsequence/account/node_modules/@0xsequence/utils": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/utils/-/utils-1.10.15.tgz", + "integrity": "sha512-LIrQS5J+3MOER+i7ajX7fiT6ga3QoDf8wsi5KY/2eFZS39sbCXGzg1ORxjtee++c/S/h4nuRYX1IRuseGYJWPw==", + "license": "Apache-2.0", + "dependencies": { + "js-base64": "^3.7.2" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/account/node_modules/@0xsequence/wallet": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/wallet/-/wallet-1.10.15.tgz", + "integrity": "sha512-UhaIaiK3IF+bv1flg/N1yuGPZXos/orJlwAd9GbPDHOIBqkBsniyraDcO+xwBKWMBHhQL6NqfSDI9j/Zxv7ocg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/network": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/signhub": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/account/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/@0xsequence/api": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/api/-/api-1.10.15.tgz", + "integrity": "sha512-FHzJLsOF/RU66pndfFP38yqLIaNiy46uv4f6DsJvnFSoHYfbkZjpx5m+M+vig0oN6RhtqU+sKL78z1IYF6JTkA==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/core": { + "version": "2.3.33", + "resolved": "https://registry.npmjs.org/@0xsequence/core/-/core-2.3.33.tgz", + "integrity": "sha512-P0xkHk7GelGOlW6lW+d1AnnK2PbBfamiC02l2ms5M1hxYZ7LJmam1yb9zDRRiaWoPSpKJruArzQV9RlgY3W3xw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "2.3.33", + "@0xsequence/utils": "2.3.33" + }, + "peerDependencies": { + "ethers": ">=6" + } + }, + "node_modules/@0xsequence/ethauth": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@0xsequence/ethauth/-/ethauth-0.8.1.tgz", + "integrity": "sha512-P21cxRSS+2mDAqFVAJt0lwQFtbObX+Ewlj8DMyDELp81+QbfHFh6LCyu8dTXNdBx6UbmRFOCSBno5Txd50cJPQ==", + "license": "MIT", + "dependencies": { + "js-base64": "^3.7.2" + }, + "peerDependencies": { + "ethers": ">=5.5" + } + }, + "node_modules/@0xsequence/guard": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/guard/-/guard-1.10.15.tgz", + "integrity": "sha512-YrHIrOXDGn+xOUcA7DI+ROW42cJqiL9WVaLKGAaGwjHLz/QKLiH1MmECWJMM76JczjA6Th8G9YZUFwO99Cpzpg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/account": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/signhub": "1.10.15", + "@0xsequence/utils": "1.10.15", + "ethers": "^5.7.2" + } + }, + "node_modules/@0xsequence/guard/node_modules/@0xsequence/abi": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/abi/-/abi-1.10.15.tgz", + "integrity": "sha512-nuh68P8tRDzIMIH7mnGX1Eab0jsYVGhZa7IlNIs8CfTnGoanxLS+MGk5ioZBa6+slzxb9VP8mnQ5QhAWeFySeg==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/guard/node_modules/@0xsequence/core": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/core/-/core-1.10.15.tgz", + "integrity": "sha512-wrE5soJSqrhhm7pC+NxckLR0lJSOnsHPLKdDqWeTRmyuhtZ4e0DsrcoeoD40I/3Bd77tdZ1GGbq00CryV7JfFw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5" + } + }, + "node_modules/@0xsequence/guard/node_modules/@0xsequence/signhub": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/signhub/-/signhub-1.10.15.tgz", + "integrity": "sha512-9yZWb8d2aXoWOQp0XC81hkS+hLWxO/pZIyCRtNVdif0/SPA86v6e96xPmuj45KONYgiH33ROVDpeJEKhOEo0jg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "1.10.15", + "ethers": "^5.5.2" + } + }, + "node_modules/@0xsequence/guard/node_modules/@0xsequence/utils": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/utils/-/utils-1.10.15.tgz", + "integrity": "sha512-LIrQS5J+3MOER+i7ajX7fiT6ga3QoDf8wsi5KY/2eFZS39sbCXGzg1ORxjtee++c/S/h4nuRYX1IRuseGYJWPw==", + "license": "Apache-2.0", + "dependencies": { + "js-base64": "^3.7.2" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/guard/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/@0xsequence/indexer": { + "version": "2.3.33", + "resolved": "https://registry.npmjs.org/@0xsequence/indexer/-/indexer-2.3.33.tgz", + "integrity": "sha512-GjS6he4bKl3LtT9mZ/hFUVMTK3wzr54s5STf1Mi4wsfVk5nmkggJPWmnCbBJvQyAWt1uLjSDZSN00/Esl17thQ==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/metadata": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/metadata/-/metadata-1.10.15.tgz", + "integrity": "sha512-eakkeV4ZtSkyo80JglSUdkUwOjYHAO5udCYAet6ekzHYgiF62dS9WcJdrrWkE2umAXn1sF94tQHf/OFZJGWwIg==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/migration": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/migration/-/migration-1.10.15.tgz", + "integrity": "sha512-muZllmKQOz3yEyJULrhDpycpML2IOH+KJiBN70reKPoMm/pxx/B4v4PAFOkd3oZ1ynSqcF0TkHqGmeyf5/SZ3g==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/wallet": "1.10.15", + "ethers": "^5.5.2" + } + }, + "node_modules/@0xsequence/migration/node_modules/@0xsequence/abi": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/abi/-/abi-1.10.15.tgz", + "integrity": "sha512-nuh68P8tRDzIMIH7mnGX1Eab0jsYVGhZa7IlNIs8CfTnGoanxLS+MGk5ioZBa6+slzxb9VP8mnQ5QhAWeFySeg==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/migration/node_modules/@0xsequence/core": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/core/-/core-1.10.15.tgz", + "integrity": "sha512-wrE5soJSqrhhm7pC+NxckLR0lJSOnsHPLKdDqWeTRmyuhtZ4e0DsrcoeoD40I/3Bd77tdZ1GGbq00CryV7JfFw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5" + } + }, + "node_modules/@0xsequence/migration/node_modules/@0xsequence/indexer": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/indexer/-/indexer-1.10.15.tgz", + "integrity": "sha512-bc2gAIEplMcmWJMwLuXZZ0wifoxuV/zHyWzEdbQ5+9ruIXArxyoG0Ue9fMEzKWHfsAWyBKBJCCFbr4XJEQ5YjA==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/migration/node_modules/@0xsequence/network": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/network/-/network-1.10.15.tgz", + "integrity": "sha512-wHp8RGqFrncuoIh0ityO/jUobliargQ7SWlvZCf8Ez0T7uiXDEDokrFSN2F9FIl6i5a5NmcEpXhfhwS/L0pN2w==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "1.10.15", + "@0xsequence/indexer": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/migration/node_modules/@0xsequence/relayer": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/relayer/-/relayer-1.10.15.tgz", + "integrity": "sha512-QpNAzRjqCl9xJdXzErQA0kmv2jzEXPfVlPwutbgmrCEIj+rHdw3M+kiG0MWBnOqxoSEA98oJnxXmpBL5mkCA6g==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/migration/node_modules/@0xsequence/signhub": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/signhub/-/signhub-1.10.15.tgz", + "integrity": "sha512-9yZWb8d2aXoWOQp0XC81hkS+hLWxO/pZIyCRtNVdif0/SPA86v6e96xPmuj45KONYgiH33ROVDpeJEKhOEo0jg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "1.10.15", + "ethers": "^5.5.2" + } + }, + "node_modules/@0xsequence/migration/node_modules/@0xsequence/utils": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/utils/-/utils-1.10.15.tgz", + "integrity": "sha512-LIrQS5J+3MOER+i7ajX7fiT6ga3QoDf8wsi5KY/2eFZS39sbCXGzg1ORxjtee++c/S/h4nuRYX1IRuseGYJWPw==", + "license": "Apache-2.0", + "dependencies": { + "js-base64": "^3.7.2" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/migration/node_modules/@0xsequence/wallet": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/wallet/-/wallet-1.10.15.tgz", + "integrity": "sha512-UhaIaiK3IF+bv1flg/N1yuGPZXos/orJlwAd9GbPDHOIBqkBsniyraDcO+xwBKWMBHhQL6NqfSDI9j/Zxv7ocg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/network": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/signhub": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/@0xsequence/migration/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/@0xsequence/network": { + "version": "2.3.33", + "resolved": "https://registry.npmjs.org/@0xsequence/network/-/network-2.3.33.tgz", + "integrity": "sha512-0sTGguIitsGcjz6nlFBQBPhowC55RlO4UR8zKdFbukIfleTgAxbnyKDxp0apQhj229PeUK0BMyVeLei0b7EHjg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "2.3.33", + "@0xsequence/indexer": "2.3.33", + "@0xsequence/relayer": "2.3.33", + "@0xsequence/utils": "2.3.33" + }, + "peerDependencies": { + "ethers": ">=6" + } + }, + "node_modules/@0xsequence/relayer": { + "version": "2.3.33", + "resolved": "https://registry.npmjs.org/@0xsequence/relayer/-/relayer-2.3.33.tgz", + "integrity": "sha512-vHHi6pSstBomaM+GZwaj0FNlIbtcLfr89gSUpIIyrsIETWA0CeWbvLs0K02TeDPUiC0z2fh3Yi0bA77yv/gZFw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "2.3.33", + "@0xsequence/core": "2.3.33", + "@0xsequence/utils": "2.3.33" + }, + "peerDependencies": { + "ethers": ">=6" + } + }, + "node_modules/@0xsequence/replacer": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/replacer/-/replacer-1.10.15.tgz", + "integrity": "sha512-ZV9cl/oDqCZf0cJUclGqTWY8iGuvGrXzUBT2w1AvneuQWjqYWIEzvXRBnscHVEtTEdOIV9sqBaC0MiK0TedC8Q==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5" + } + }, + "node_modules/@0xsequence/replacer/node_modules/@0xsequence/abi": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/abi/-/abi-1.10.15.tgz", + "integrity": "sha512-nuh68P8tRDzIMIH7mnGX1Eab0jsYVGhZa7IlNIs8CfTnGoanxLS+MGk5ioZBa6+slzxb9VP8mnQ5QhAWeFySeg==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/replacer/node_modules/@0xsequence/core": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/core/-/core-1.10.15.tgz", + "integrity": "sha512-wrE5soJSqrhhm7pC+NxckLR0lJSOnsHPLKdDqWeTRmyuhtZ4e0DsrcoeoD40I/3Bd77tdZ1GGbq00CryV7JfFw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5" + } + }, + "node_modules/@0xsequence/sessions": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/sessions/-/sessions-1.10.15.tgz", + "integrity": "sha512-Zack16p3p92sO3ZFfZFz9Fa9Nlkxkt3ew48xnsnN3P3XCJFLX+MM7hoNOpkS3yQFVEb5QDhYrrAfE019U5hgww==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "1.10.15", + "@0xsequence/migration": "1.10.15", + "@0xsequence/replacer": "1.10.15", + "ethers": "^5.5.2", + "idb": "^7.1.1" + } + }, + "node_modules/@0xsequence/sessions/node_modules/@0xsequence/abi": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/abi/-/abi-1.10.15.tgz", + "integrity": "sha512-nuh68P8tRDzIMIH7mnGX1Eab0jsYVGhZa7IlNIs8CfTnGoanxLS+MGk5ioZBa6+slzxb9VP8mnQ5QhAWeFySeg==", + "license": "Apache-2.0" + }, + "node_modules/@0xsequence/sessions/node_modules/@0xsequence/core": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/core/-/core-1.10.15.tgz", + "integrity": "sha512-wrE5soJSqrhhm7pC+NxckLR0lJSOnsHPLKdDqWeTRmyuhtZ4e0DsrcoeoD40I/3Bd77tdZ1GGbq00CryV7JfFw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5" + } + }, + "node_modules/@0xsequence/sessions/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/@0xsequence/signhub": { + "version": "2.3.33", + "resolved": "https://registry.npmjs.org/@0xsequence/signhub/-/signhub-2.3.33.tgz", + "integrity": "sha512-Ve3gvn6dzXRVdd2eEfCoL3UvehxKbEtYcpxNnX/7CxcvGU5a61Ol7WkM4tKScz1zc6AMdX8YE2C7VDN46ew0/Q==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "2.3.33" + }, + "peerDependencies": { + "ethers": ">=6" + } + }, + "node_modules/@0xsequence/utils": { + "version": "2.3.33", + "resolved": "https://registry.npmjs.org/@0xsequence/utils/-/utils-2.3.33.tgz", + "integrity": "sha512-qaPlV5oMaJKIf1j4GVYoN2OthoL9EVgblglUJIKp3/Tgfs0B85GOxc92BCSjLRn7NYzaW9P5FIsDAcCQifQdDQ==", + "license": "Apache-2.0", + "dependencies": { + "js-base64": "^3.7.2" + }, + "peerDependencies": { + "ethers": ">=6" + } + }, + "node_modules/@0xsequence/wallet": { + "version": "2.3.33", + "resolved": "https://registry.npmjs.org/@0xsequence/wallet/-/wallet-2.3.33.tgz", + "integrity": "sha512-jl5zrnvcqr9f4pNtP7q63rf0FPe7noC6hVn0eTaO8YXDy9a/8rkkhstcTLYQFdNhii7XMY85kJcmBb4ws7EglA==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "2.3.33", + "@0xsequence/core": "2.3.33", + "@0xsequence/network": "2.3.33", + "@0xsequence/relayer": "2.3.33", + "@0xsequence/signhub": "2.3.33", + "@0xsequence/utils": "2.3.33" + }, + "peerDependencies": { + "ethers": ">=6" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "license": "MIT" + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.932.0.tgz", + "integrity": "sha512-C7XVPe2XI8An6HgCv6RmoIp9ShdUVqcNFKzdu+HGcxCHZhqg5kvvWjfG0nJuI+CarwBUQqxYdwnBWSrZaBMuYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.932.0", + "@aws-sdk/credential-provider-node": "3.932.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.930.0", + "@aws-sdk/middleware-user-agent": "3.932.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.932.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.932.0.tgz", + "integrity": "sha512-XHqHa5iv2OQsKoM2tUQXs7EAyryploC00Wg0XSFra/KAKqyGizUb5XxXsGlyqhebB29Wqur+zwiRwNmejmN0+Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.932.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.930.0", + "@aws-sdk/middleware-user-agent": "3.932.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.932.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.932.0.tgz", + "integrity": "sha512-ozge/c7NdHUDyHqro6+P5oHt8wfKSUBN+olttiVfBe9Mw3wBMpPa3gQ0pZnG+gwBkKskBuip2bMR16tqYvUSEA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.932.0.tgz", + "integrity": "sha512-b6N9Nnlg8JInQwzBkUq5spNaXssM3h3zLxGzpPrnw0nHSIWPJPTbZzA5Ca285fcDUFuKP+qf3qkuqlAjGOdWhg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.932.0.tgz", + "integrity": "sha512-ZBjSAXVGy7danZRHCRMJQ7sBkG1Dz39thYlvTiUaf9BKZ+8ymeiFhuTeV1OkWUBBnY0ki2dVZJvboTqfINhNxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/credential-provider-env": "3.932.0", + "@aws-sdk/credential-provider-http": "3.932.0", + "@aws-sdk/credential-provider-process": "3.932.0", + "@aws-sdk/credential-provider-sso": "3.932.0", + "@aws-sdk/credential-provider-web-identity": "3.932.0", + "@aws-sdk/nested-clients": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.932.0.tgz", + "integrity": "sha512-SEG9t2taBT86qe3gTunfrK8BxT710GVLGepvHr+X5Pw+qW225iNRaGN0zJH+ZE/j91tcW9wOaIoWnURkhR5wIg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.932.0", + "@aws-sdk/credential-provider-http": "3.932.0", + "@aws-sdk/credential-provider-ini": "3.932.0", + "@aws-sdk/credential-provider-process": "3.932.0", + "@aws-sdk/credential-provider-sso": "3.932.0", + "@aws-sdk/credential-provider-web-identity": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.932.0.tgz", + "integrity": "sha512-BodZYKvT4p/Dkm28Ql/FhDdS1+p51bcZeMMu2TRtU8PoMDHnVDhHz27zASEKSZwmhvquxHrZHB0IGuVqjZUtSQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.932.0.tgz", + "integrity": "sha512-XYmkv+ltBjjmPZ6AmR1ZQZkQfD0uzG61M18/Lif3HAGxyg3dmod0aWx9aL6lj9SvxAGqzscrx5j4PkgLqjZruw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.932.0", + "@aws-sdk/core": "3.932.0", + "@aws-sdk/token-providers": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.932.0.tgz", + "integrity": "sha512-Yw/hYNnC1KHuVIQF9PkLXbuKN7ljx70OSbJYDRufllQvej3kRwNcqQSnzI1M4KaObccqKaE6srg22DqpPy9p8w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/nested-clients": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.930.0.tgz", + "integrity": "sha512-x30jmm3TLu7b/b+67nMyoV0NlbnCVT5DI57yDrhXAPCtdgM1KtdLWt45UcHpKOm1JsaIkmYRh2WYu7Anx4MG0g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.930.0.tgz", + "integrity": "sha512-vh4JBWzMCBW8wREvAwoSqB2geKsZwSHTa0nSt0OMOLp2PdTYIZDi0ZiVMmpfnjcx9XbS6aSluLv9sKx4RrG46A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.930.0.tgz", + "integrity": "sha512-gv0sekNpa2MBsIhm2cjP3nmYSfI4nscx/+K9u9ybrWZBWUIC4kL2sV++bFjjUz4QxUIlvKByow3/a9ARQyCu7Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws/lambda-invoke-store": "^0.1.1", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.932.0.tgz", + "integrity": "sha512-9BGTbJyA/4PTdwQWE9hAFIJGpsYkyEW20WON3i15aDqo5oRZwZmqaVageOD57YYqG8JDJjvcwKyDdR4cc38dvg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.932.0.tgz", + "integrity": "sha512-E2ucBfiXSpxZflHTf3UFbVwao4+7v7ctAeg8SWuglc1UMqMlpwMFFgWiSONtsf0SR3+ZDoWGATyCXOfDWerJuw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.932.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.930.0", + "@aws-sdk/middleware-user-agent": "3.932.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.932.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.930.0.tgz", + "integrity": "sha512-KL2JZqH6aYeQssu1g1KuWsReupdfOoxD6f1as2VC+rdwYFUu4LfzMsFfXnBvvQWWqQ7rZHWOw1T+o5gJmg7Dzw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.932.0.tgz", + "integrity": "sha512-43u82ulVuHK4zWhcSPyuPS18l0LNHi3QJQ1YtP2MfP8bPf5a6hMYp5e3lUr9oTDEWcpwBYtOW0m1DVmoU/3veA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/nested-clients": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.930.0.tgz", + "integrity": "sha512-M2oEKBzzNAYr136RRc6uqw3aWlwCxqTP1Lawps9E1d2abRPvl1p1ztQmmXp1Ak4rv8eByIZ+yQyKQ3zPdRG5dw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.930.0.tgz", + "integrity": "sha512-q6lCRm6UAe+e1LguM5E4EqM9brQlDem4XDcQ87NzEvlTW6GzmNCO0w1jS0XgCFXQHjDxjdlNFX+5sRbHijwklg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.932.0.tgz", + "integrity": "sha512-/kC6cscHrZL74TrZtgiIL5jJNbVsw9duGGPurmaVgoCbP7NnxyaSWEurbNV3VPNPhNE3bV3g4Ci+odq+AlsYQg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.1.tgz", + "integrity": "sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bytecodealliance/preview2-shim": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.0.tgz", + "integrity": "sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ==", + "dev": true, + "license": "(Apache-2.0 WITH LLVM-exception)" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@databeat/tracker": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@databeat/tracker/-/tracker-0.9.3.tgz", + "integrity": "sha512-eGsiNU/CRFujcNtUUqvBiqveCs6S6SiAhalXPDodbk74d3FzvLqHDn5k6WfOEJIhrP3CbYgfMXL0nk51s/rQsg==", + "license": "Apache 2.0", + "dependencies": { + "@noble/hashes": "^1.5.0" + } + }, + "node_modules/@databeat/tracker/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ensdomains/address-encoder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", + "dev": true, + "license": "BSD", + "dependencies": { + "bech32": "^1.1.3", + "blakejs": "^1.1.0", + "bn.js": "^4.11.8", + "bs58": "^4.0.1", + "crypto-addr-codec": "^0.1.7", + "nano-base32": "^1.0.1", + "ripemd160": "^2.0.2" + } + }, + "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ensdomains/ens": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "deprecated": "Please use @ensdomains/ens-contracts", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "bluebird": "^3.5.2", + "eth-ens-namehash": "^2.0.8", + "solc": "^0.4.20", + "testrpc": "0.0.1", + "web3-utils": "^1.0.0-beta.31" + } + }, + "node_modules/@ensdomains/ensjs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "dev": true, + "license": "ISC", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@ensdomains/address-encoder": "^0.1.7", + "@ensdomains/ens": "0.4.5", + "@ensdomains/resolver": "0.2.4", + "content-hash": "^2.5.2", + "eth-ens-namehash": "^2.0.8", + "ethers": "^5.0.13", + "js-sha3": "^0.8.0" + } + }, + "node_modules/@ensdomains/ensjs/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts", + "dev": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@ethereum-waffle/chai": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz", + "integrity": "sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethereum-waffle/provider": "4.0.5", + "debug": "^4.3.4", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" + } + }, + "node_modules/@ethereum-waffle/compiler": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz", + "integrity": "sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@resolver-engine/imports": "^0.3.3", + "@resolver-engine/imports-fs": "^0.3.3", + "@typechain/ethers-v5": "^10.0.0", + "@types/mkdirp": "^0.5.2", + "@types/node-fetch": "^2.6.1", + "mkdirp": "^0.5.1", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*", + "solc": "*", + "typechain": "^8.0.0" + } + }, + "node_modules/@ethereum-waffle/compiler/node_modules/@typechain/ethers-v5": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" + } + }, + "node_modules/@ethereum-waffle/ens": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz", + "integrity": "sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "@ensdomains/ens": "^0.4.4", + "@ensdomains/resolver": "^0.2.4", + "ethers": "*" + } + }, + "node_modules/@ethereum-waffle/mock-contract": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz", + "integrity": "sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" + } + }, + "node_modules/@ethereum-waffle/provider": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz", + "integrity": "sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethereum-waffle/ens": "4.0.3", + "@ganache/ethereum-options": "0.1.4", + "debug": "^4.3.4", + "ganache": "7.4.3" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" + } + }, + "node_modules/@ethereumjs/block": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", + "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/common": "^2.6.5", + "@ethereumjs/tx": "^3.5.2", + "ethereumjs-util": "^7.1.5", + "merkle-patricia-tree": "^4.2.4" + } + }, + "node_modules/@ethereumjs/blockchain": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", + "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/block": "^3.6.2", + "@ethereumjs/common": "^2.6.4", + "@ethereumjs/ethash": "^1.1.0", + "debug": "^4.3.3", + "ethereumjs-util": "^7.1.5", + "level-mem": "^5.0.1", + "lru-cache": "^5.1.1", + "semaphore-async-await": "^1.5.1" + } + }, + "node_modules/@ethereumjs/common": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/ethash": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", + "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/block": "^3.5.0", + "@types/levelup": "^4.3.0", + "buffer-xor": "^2.0.1", + "ethereumjs-util": "^7.1.1", + "miller-rabin": "^4.0.0" + } + }, + "node_modules/@ethereumjs/ethash/node_modules/buffer-xor": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", + "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.1" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "dev": true, + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" + } + }, + "node_modules/@ethereumjs/util": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", + "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "ethereum-cryptography": "^2.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/@ethereumjs/vm": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz", + "integrity": "sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/block": "^3.6.0", + "@ethereumjs/blockchain": "^5.5.0", + "@ethereumjs/common": "^2.6.0", + "@ethereumjs/tx": "^3.4.0", + "async-eventemitter": "^0.2.4", + "core-js-pure": "^3.0.1", + "debug": "^2.2.0", + "ethereumjs-util": "^7.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "merkle-patricia-tree": "^4.2.2", + "rustbn.js": "~0.2.0" + } + }, + "node_modules/@ethereumjs/vm/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@ethereumjs/vm/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ethersproject/abi": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", + "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", + "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", + "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", + "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/rlp": "^5.8.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", + "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", + "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/properties": "^5.8.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", + "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", + "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", + "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.8.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", + "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.8.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", + "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", + "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", + "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", + "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", + "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" + }, + "node_modules/@ethersproject/networks": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", + "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", + "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/sha2": "^5.8.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", + "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", + "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0", + "bech32": "1.1.4", + "ws": "8.18.0" + } + }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ethersproject/random": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", + "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", + "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", + "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", + "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "bn.js": "^5.2.1", + "elliptic": "6.6.1", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", + "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", + "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", + "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", + "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", + "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/json-wallets": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", + "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", + "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@ganache/ethereum-address": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz", + "integrity": "sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ganache/utils": "0.1.4" + } + }, + "node_modules/@ganache/ethereum-options": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz", + "integrity": "sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ganache/ethereum-address": "0.1.4", + "@ganache/ethereum-utils": "0.1.4", + "@ganache/options": "0.1.4", + "@ganache/utils": "0.1.4", + "bip39": "3.0.4", + "seedrandom": "3.0.5" + } + }, + "node_modules/@ganache/ethereum-utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz", + "integrity": "sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethereumjs/common": "2.6.0", + "@ethereumjs/tx": "3.4.0", + "@ethereumjs/vm": "5.6.0", + "@ganache/ethereum-address": "0.1.4", + "@ganache/rlp": "0.1.4", + "@ganache/utils": "0.1.4", + "emittery": "0.10.0", + "ethereumjs-abi": "0.6.8", + "ethereumjs-util": "7.1.3" + } + }, + "node_modules/@ganache/ethereum-utils/node_modules/@ethereumjs/common": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", + "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.3" + } + }, + "node_modules/@ganache/ethereum-utils/node_modules/@ethereumjs/tx": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", + "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/common": "^2.6.0", + "ethereumjs-util": "^7.1.3" + } + }, + "node_modules/@ganache/ethereum-utils/node_modules/ethereumjs-util": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", + "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@ganache/options": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz", + "integrity": "sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ganache/utils": "0.1.4", + "bip39": "3.0.4", + "seedrandom": "3.0.5" + } + }, + "node_modules/@ganache/rlp": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz", + "integrity": "sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ganache/utils": "0.1.4", + "rlp": "2.2.6" + } + }, + "node_modules/@ganache/rlp/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ganache/rlp/node_modules/rlp": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", + "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^4.11.1" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/@ganache/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==", + "dev": true, + "license": "MIT", + "dependencies": { + "emittery": "0.10.0", + "keccak": "3.0.1", + "seedrandom": "3.0.5" + }, + "optionalDependencies": { + "@trufflesuite/bigint-buffer": "1.1.9" + } + }, + "node_modules/@ganache/utils/node_modules/keccak": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", + "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nomicfoundation/edr": { + "version": "0.12.0-next.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.15.tgz", + "integrity": "sha512-JMLvnro2cxSq1h/A2WYo018o5R4ns7ut/A6WoiBfXKDj/OSN8mRnEpDaICIrk6fopbAfMi6MmP8TQefDs+lKAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/edr-darwin-arm64": "0.12.0-next.15", + "@nomicfoundation/edr-darwin-x64": "0.12.0-next.15", + "@nomicfoundation/edr-linux-arm64-gnu": "0.12.0-next.15", + "@nomicfoundation/edr-linux-arm64-musl": "0.12.0-next.15", + "@nomicfoundation/edr-linux-x64-gnu": "0.12.0-next.15", + "@nomicfoundation/edr-linux-x64-musl": "0.12.0-next.15", + "@nomicfoundation/edr-win32-x64-msvc": "0.12.0-next.15" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { + "version": "0.12.0-next.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.15.tgz", + "integrity": "sha512-y/Z7fOaPxLzYTFDwWE/s4TIxvgq2cQhs6HKKh7+aJSQ6RxKrja5iKQEWg3D71jtgwizhGQpFQHtYXxmzWAjwyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nomicfoundation/edr-darwin-x64": { + "version": "0.12.0-next.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.15.tgz", + "integrity": "sha512-hLDkDmtxOyUnlf1Mem6S8TKjCZh6yiWSA8kasqq7HSDa1/QmJou5eY1zFbw2xBky3StEUx5vfn3NpgBHTOCSBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { + "version": "0.12.0-next.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.15.tgz", + "integrity": "sha512-+cHxrjLG3ILNj4+bRQ4uRBVfeCEhYYIqteZjiyryB2UXzyUJHaEqCRVxxJpiqzpsXTpTgVAsEuwYwERgT/1a5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { + "version": "0.12.0-next.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.15.tgz", + "integrity": "sha512-ppGDxVbGofWYkiFw8NrE+JlhNE39FTCXzvE586ZBaUqV3TMDcwnTkDltxzbl5YPmhNp3Qne3pJfJ0NB330Js+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.12.0-next.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.15.tgz", + "integrity": "sha512-ifOr9sAuBbnJpZtGYtFkEkwTXBsM9pT9tq7KXT3eOYBWw3TJIsP3DfnTgYF+pZObxBFyBtMJnyy0j1ItL+s9rg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nomicfoundation/edr-linux-x64-musl": { + "version": "0.12.0-next.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.15.tgz", + "integrity": "sha512-Jc0HZZOJAcPjxj3FbgtWQQGe6OmI6xiblFBAmXUGothxTZ3rn1YZeHqXews9MEjL8MCvHvfAjfLRkafSyyXX2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { + "version": "0.12.0-next.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.15.tgz", + "integrity": "sha512-TFbhcY1J+IRB4nVwXAvw/a5gy3o7+AQ83vfxT3Sk/z4Kk6v3c6Xkizy6IY6vTtpSWWmiuAh998QYq8D7LHIc3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@nomicfoundation/hardhat-errors": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-errors/-/hardhat-errors-3.0.5.tgz", + "integrity": "sha512-8Ayqf6hFM1glmrSxrXgX6n2pn5uTlHNxEB8N5Me0DOeOGB67PRIrQdiO+RzUhrNW5YgWUNWBevOLQbW06uQ79g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/hardhat-utils": "^3.0.1" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-4.0.3.tgz", + "integrity": "sha512-DtYjmHtPM1BenmNm5ZMVn5fTGD4RdDPGE/ElpaLUjDGbkQnn4ytvhqnGsY+osLaWFvDxKfhdI8fyISg53bk8Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/hardhat-errors": "^3.0.2", + "@nomicfoundation/hardhat-utils": "^3.0.5", + "debug": "^4.3.2", + "ethereum-cryptography": "^2.2.1", + "ethers": "^6.14.0" + }, + "peerDependencies": { + "hardhat": "^3.0.7" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/@nomicfoundation/hardhat-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-utils/-/hardhat-utils-3.0.5.tgz", + "integrity": "sha512-5zkQSuSxkwK7fQxKswJ1GGc/3AuWBSmxA7GhczTPLx28dAXQnubRU8nA48SkCkKesJq5x4TROP+XheSE2VkLUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@streamparser/json-node": "^0.0.22", + "debug": "^4.3.2", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^2.2.1", + "fast-equals": "^5.0.1", + "json-stream-stringify": "^3.1.6", + "rfdc": "^1.3.1", + "undici": "^6.16.1" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/@nomicfoundation/hardhat-utils/node_modules/undici": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", + "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-3.0.7.tgz", + "integrity": "sha512-2Px2Zldg2oRJvy7odx8hZ0lZ4yjkW8XLr6umqcKl5z36+XifKRanzd8phoLEGQ8SRBNaVsaw0EDHi9Q0QTUu3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.8.0", + "@nomicfoundation/hardhat-errors": "^3.0.3", + "@nomicfoundation/hardhat-utils": "^3.0.5", + "@nomicfoundation/hardhat-zod-utils": "^3.0.0", + "cbor2": "^1.9.0", + "chalk": "^5.3.0", + "debug": "^4.3.2", + "semver": "^7.6.3", + "zod": "^3.23.8" + }, + "peerDependencies": { + "hardhat": "^3.0.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nomicfoundation/hardhat-zod-utils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-zod-utils/-/hardhat-zod-utils-3.0.1.tgz", + "integrity": "sha512-I6/pyYiS9p2lLkzQuedr1ScMocH+ew8l233xTi+LP92gjEiviJDxselpkzgU01MUM0t6BPpfP8yMO958LDEJVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/hardhat-errors": "^3.0.0", + "@nomicfoundation/hardhat-utils": "^3.0.2" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@nomicfoundation/ignition-core": { + "version": "0.15.14", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.14.tgz", + "integrity": "sha512-BRgNaApHTdmk0NNTVYMltRXUFQGaWKHKnaaOyp9TG/BsUUkW3mH1ds5+rM4UBUIHivIyh3fKFDCOGJIJcQG9aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethersproject/address": "5.6.1", + "@nomicfoundation/solidity-analyzer": "^0.1.1", + "cbor": "^9.0.0", + "debug": "^4.3.2", + "ethers": "^6.14.0", + "fs-extra": "^10.0.0", + "immer": "10.0.2", + "lodash": "4.17.21", + "ndjson": "2.0.0" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/@ethersproject/address": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", + "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.6.2", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/keccak256": "^5.6.1", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/rlp": "^5.6.1" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/cbor": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", + "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@nomicfoundation/ignition-core/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@nomicfoundation/ignition-ui": { + "version": "0.15.13", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.13.tgz", + "integrity": "sha512-HbTszdN1iDHCkUS9hLeooqnLEW2U45FaqFwFEYT8nIno2prFZhG+n68JEERjmfFCB5u0WgbuJwk3CgLoqtSL7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nomicfoundation/slang": { + "version": "0.18.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/slang/-/slang-0.18.3.tgz", + "integrity": "sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bytecodealliance/preview2-shim": "0.17.0" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", + "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", + "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", + "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", + "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz", + "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz", + "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz", + "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz", + "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.1.2.tgz", + "integrity": "sha512-y5I9S5/vl3izamwYvvDmhO2zrvHmuKlGqU3J/vWbnbzN83kX1bm8f/F/NG9QtEfVUa6dGfCJxg7YEo5xFCqSZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^7.1.4", + "fs-extra": "^7.0.1" + }, + "peerDependencies": { + "@nomiclabs/hardhat-web3": "^2.1.0", + "hardhat": "^2.26.0", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/hardhat-web3": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.1.2.tgz", + "integrity": "sha512-ChnUInQ5AES1iJSNXq00JfWfQZkVUIkkSt2dtrB/8r+CfW/XeBTkvE5G+OTJTVSMme7lgqk9aieOI7d6GU6v1g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "hardhat": "^2.26.0", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/truffle-contract": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ensdomains/ensjs": "^2.0.1", + "@truffle/blockchain-utils": "^0.1.3", + "@truffle/contract-schema": "^3.4.7", + "@truffle/debug-utils": "^6.0.22", + "@truffle/error": "^0.1.0", + "@truffle/interface-adapter": "^0.5.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "peerDependencies": { + "web3": "^1.2.1", + "web3-core-helpers": "^1.2.1", + "web3-core-promievent": "^1.2.1", + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/agent/node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/redact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@openzeppelin/defender-sdk-base-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-base-client/-/defender-sdk-base-client-2.7.0.tgz", + "integrity": "sha512-J5IpvbFfdIJM4IadBcXfhCXVdX2yEpaZtRR1ecq87d8CdkmmEpniYfef/yVlG98yekvu125LaIRg0yXQOt9Bdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@aws-sdk/client-lambda": "^3.563.0", + "amazon-cognito-identity-js": "^6.3.6", + "async-retry": "^1.3.3" + } + }, + "node_modules/@openzeppelin/defender-sdk-deploy-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-deploy-client/-/defender-sdk-deploy-client-2.7.0.tgz", + "integrity": "sha512-YOHZmnHmM1y6uSqXWGfk2/5/ae4zZJE6xG92yFEAIOy8vqh1dxznWMsoCcAXRXTCWc8RdCDpFdMfEy4SBTyYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@openzeppelin/defender-sdk-base-client": "^2.7.0", + "axios": "^1.7.4", + "lodash": "^4.17.21" + } + }, + "node_modules/@openzeppelin/defender-sdk-network-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/defender-sdk-network-client/-/defender-sdk-network-client-2.7.0.tgz", + "integrity": "sha512-4CYWPa9+kSjojE5KS7kRmP161qsBATdp97TCrzyDdGoVahj0GyqgafRL9AAjm0eHZOM1c7EIYEpbvYRtFi8vyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@openzeppelin/defender-sdk-base-client": "^2.7.0", + "axios": "^1.7.4", + "lodash": "^4.17.21" + } + }, + "node_modules/@openzeppelin/upgrades-core": { + "version": "1.44.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.44.2.tgz", + "integrity": "sha512-m6iorjyhPK9ow5/trNs7qsBC/SOzJCO51pvvAF2W9nOiZ1t0RtCd+rlRmRmlWTv4M33V0wzIUeamJ2BPbzgUXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/slang": "^0.18.3", + "bignumber.js": "^9.1.2", + "cbor": "^10.0.0", + "chalk": "^4.1.0", + "compare-versions": "^6.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "minimatch": "^9.0.5", + "minimist": "^1.2.7", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.60" + }, + "bin": { + "openzeppelin-upgrades-core": "dist/cli/cli.js" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@openzeppelin/upgrades-core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@resolver-engine/core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", + "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", + "dev": true, + "license": "LGPL-3.0-or-later", + "dependencies": { + "debug": "^3.1.0", + "is-url": "^1.2.4", + "request": "^2.85.0" + } + }, + "node_modules/@resolver-engine/core/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@resolver-engine/fs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", + "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", + "dev": true, + "license": "LGPL-3.0-or-later", + "dependencies": { + "@resolver-engine/core": "^0.3.3", + "debug": "^3.1.0" + } + }, + "node_modules/@resolver-engine/fs/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@resolver-engine/imports": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", + "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", + "dev": true, + "license": "LGPL-3.0-or-later", + "dependencies": { + "@resolver-engine/core": "^0.3.3", + "debug": "^3.1.0", + "hosted-git-info": "^2.6.0", + "path-browserify": "^1.0.0", + "url": "^0.11.0" + } + }, + "node_modules/@resolver-engine/imports-fs": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", + "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", + "dev": true, + "license": "LGPL-3.0-or-later", + "dependencies": { + "@resolver-engine/fs": "^0.3.3", + "@resolver-engine/imports": "^0.3.3", + "debug": "^3.1.0" + } + }, + "node_modules/@resolver-engine/imports-fs/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@resolver-engine/imports/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.4.tgz", + "integrity": "sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.5.tgz", + "integrity": "sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.5.tgz", + "integrity": "sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.5.tgz", + "integrity": "sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.5.tgz", + "integrity": "sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.5.tgz", + "integrity": "sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.11.tgz", + "integrity": "sha512-eJXq9VJzEer1W7EQh3HY2PDJdEcEUnv6sKuNt4eVjyeNWcQFS4KmnY+CKkYOIR6tSqarn6bjjCqg1UB+8UJiPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.4", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.11.tgz", + "integrity": "sha512-EL5OQHvFOKneJVRgzRW4lU7yidSwp/vRJOe542bHgExN3KNThr1rlg0iE4k4SnA+ohC+qlUxoK+smKeAYPzfAQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.9.7", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.7.tgz", + "integrity": "sha512-pskaE4kg0P9xNQWihfqlTMyxyFR3CH6Sr6keHYghgyqqDXzjl2QJg5lAzuVe/LzZiOzcbcVtxKYi1/fZPt/3DA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.4", + "@smithy/middleware-endpoint": "^4.3.11", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.10.tgz", + "integrity": "sha512-3iA3JVO1VLrP21FsZZpMCeF93aqP3uIOMvymAT3qHIJz2YlgDeRvNUspFwCNqd/j3qqILQJGtsVQnJZICh/9YA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.13.tgz", + "integrity": "sha512-PTc6IpnpSGASuzZAgyUtaVfOFpU0jBD2mcGwrgDuHf7PlFgt5TIPxCYBDbFQs06jxgeV3kd/d/sok1pzV0nJRg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", + "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@streamparser/json": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@streamparser/json/-/json-0.0.22.tgz", + "integrity": "sha512-b6gTSBjJ8G8SuO3Gbbj+zXbVx8NSs1EbpbMKpzGLWMdkR+98McH9bEjSz3+0mPJf68c5nxa3CrJHp5EQNXM6zQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@streamparser/json-node": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@streamparser/json-node/-/json-node-0.0.22.tgz", + "integrity": "sha512-sJT2ptNRwqB1lIsQrQlCoWk5rF4tif9wDh+7yluAGijJamAhrHGYpFB/Zg3hJeceoZypi74ftXk8DHzwYpbZSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@streamparser/json": "^0.0.22" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tenderly/api-client": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@tenderly/api-client/-/api-client-1.1.0.tgz", + "integrity": "sha512-kyye7TQ+RbDbJ7bSUjNf/O9fTtRYNUDIEUZQSrmNonowMw5/EpNi664eWaOoC00NEzxgttVrtme/GHvIOu7rNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^0.27.2", + "cli-table3": "^0.6.2", + "commander": "^9.4.0", + "dotenv": "^16.4.5", + "js-yaml": "^4.1.0", + "open": "^8.4.0", + "prompts": "^2.4.2", + "tslog": "^4.4.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@tenderly/api-client/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@tenderly/api-client/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@tenderly/api-client/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@tenderly/api-client/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tenderly/hardhat-integration": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@tenderly/hardhat-integration/-/hardhat-integration-1.1.1.tgz", + "integrity": "sha512-VHa380DrKv+KA1N4vbJGLDoghbVqMZ4wEozbxRfCzlkSs5V1keNgudRSUFK6lgfKhkoAWRO+dA8MZYnJOvUOkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tenderly/api-client": "^1.1.0", + "axios": "^1.6.7", + "dotenv": "^16.4.5", + "fs-extra": "^10.1.0", + "hardhat-deploy": "^0.11.43", + "npm-registry-fetch": "^17.1.0", + "semver": "^7.6.3", + "ts-node": "^10.9.1", + "tslog": "^4.3.1", + "typescript": "^5.5.4" + }, + "peerDependencies": { + "hardhat": "^2.22.6" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/cacache": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "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" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tenderly/hardhat-integration/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@tenderly/hardhat-integration/node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/npm-registry-fetch": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tenderly/hardhat-integration/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@tenderly/hardhat-tenderly": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@tenderly/hardhat-tenderly/-/hardhat-tenderly-2.5.2.tgz", + "integrity": "sha512-JCG1UkFBRZE2fL8g4jfbKUsju7gK3Dg6CxksJO9Db9ckM1EkL4wCY9G5KTLwh/UL0cT04J8ZK1RmaZ6hG8wfKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-ignition": "^0.15.5", + "@nomicfoundation/hardhat-verify": "^2.0.8", + "@openzeppelin/hardhat-upgrades": "^3.3.0", + "@openzeppelin/upgrades-core": "^1.32.2", + "@tenderly/hardhat-integration": "^1.1.0", + "dotenv": "^16.4.5", + "ethers": "^6.8.1" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.2.tgz", + "integrity": "sha512-7xEaz2X8p47qWIAqtV2z03MmusheHm8bvY2mDlxo9JiT2BgSx59GSdv5+mzwOvsuKDbTij7oqDnwFyYOlHREEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.14.0", + "hardhat": "^2.26.0" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/@nomicfoundation/hardhat-ignition": { + "version": "0.15.15", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.15.tgz", + "integrity": "sha512-4uLp5MOyaW0gUYGAxiA8GikGIo8SLBijpxakFI3BpofUoeRXnnQdNtRJT9aAKD8ENfvFQrNFin0Z1VlXjXurkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nomicfoundation/ignition-core": "^0.15.14", + "@nomicfoundation/ignition-ui": "^0.15.13", + "chalk": "^4.0.0", + "debug": "^4.3.2", + "fs-extra": "^10.0.0", + "json5": "^2.2.3", + "prompts": "^2.4.2" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-verify": "^2.1.0", + "hardhat": "^2.26.0" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/@nomicfoundation/hardhat-verify": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.1.3.tgz", + "integrity": "sha512-danbGjPp2WBhLkJdQy9/ARM3WQIK+7vwzE0urNem1qZJjh9f54Kf5f1xuQv8DvqewUAkuPxVt/7q4Grz5WjqSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.1.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.26.0" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/@openzeppelin/hardhat-upgrades": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-3.9.1.tgz", + "integrity": "sha512-pSDjlOnIpP+PqaJVe144dK6VVKZw2v6YQusyt0OOLiCsl+WUzfo4D0kylax7zjrOxqy41EK2ipQeIF4T+cCn2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@openzeppelin/defender-sdk-base-client": "^2.1.0", + "@openzeppelin/defender-sdk-deploy-client": "^2.1.0", + "@openzeppelin/defender-sdk-network-client": "^2.1.0", + "@openzeppelin/upgrades-core": "^1.41.0", + "chalk": "^4.1.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.1.5", + "proper-lockfile": "^4.1.1", + "undici": "^6.11.1" + }, + "bin": { + "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.6", + "@nomicfoundation/hardhat-verify": "^2.0.14", + "ethers": "^6.6.0", + "hardhat": "^2.24.1" + }, + "peerDependenciesMeta": { + "@nomicfoundation/hardhat-verify": { + "optional": true + } + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/@openzeppelin/hardhat-upgrades/node_modules/undici": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.22.0.tgz", + "integrity": "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "license": "MIT", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@tenderly/hardhat-tenderly/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@truffle/abi-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.3.tgz", + "integrity": "sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.10.0" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/abi-utils/node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/blockchain-utils": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.9.tgz", + "integrity": "sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/codec": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.17.3.tgz", + "integrity": "sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "@truffle/abi-utils": "^1.0.3", + "@truffle/compile-common": "^0.9.8", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "^7.5.4", + "utf8": "^3.0.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/codec/node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@truffle/codec/node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@truffle/codec/node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/codec/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/codec/node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/compile-common": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.8.tgz", + "integrity": "sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "@truffle/error": "^0.2.2", + "colors": "1.4.0" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/compile-common/node_modules/@truffle/error": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.2.tgz", + "integrity": "sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/contract-schema": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.16.tgz", + "integrity": "sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.10.0", + "debug": "^4.3.1" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/debug-utils": { + "version": "6.0.57", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.57.tgz", + "integrity": "sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "@truffle/codec": "^0.17.3", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.6" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/error": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter": { + "version": "0.5.37", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz", + "integrity": "sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.10.0" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true + }, + "node_modules/@truffle/interface-adapter/node_modules/web3": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", + "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-bzz": "1.10.0", + "web3-core": "1.10.0", + "web3-eth": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-shh": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", + "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", + "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/bn.js": "^5.1.1", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-requestmanager": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-core-helpers": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", + "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-eth-iban": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", + "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-core-promievent": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", + "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", + "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "util": "^0.12.5", + "web3-core-helpers": "1.10.0", + "web3-providers-http": "1.10.0", + "web3-providers-ipc": "1.10.0", + "web3-providers-ws": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", + "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", + "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-accounts": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-eth-ens": "1.10.0", + "web3-eth-iban": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", + "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", + "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.1.5", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", + "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", + "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", + "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", + "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-net": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", + "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", + "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", + "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", + "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", + "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-net": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider": { + "version": "0.2.64", + "resolved": "https://registry.npmjs.org/@truffle/provider/-/provider-0.2.64.tgz", + "integrity": "sha512-ZwPsofw4EsCq/2h0t73SPnnFezu4YQWBmK4FxFaOUX0F+o8NsZuHKyfJzuZwyZbiktYmefM3yD9rM0Dj4BhNbw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "@truffle/error": "^0.1.1", + "@truffle/interface-adapter": "^0.5.25", + "debug": "^4.3.1", + "web3": "1.7.4" + } + }, + "node_modules/@truffle/provider/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@truffle/provider/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@truffle/provider/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/provider/node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/@truffle/provider/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/provider/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@truffle/provider/node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/provider/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/provider/node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/provider/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/@truffle/provider/node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/provider/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@truffle/provider/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@truffle/provider/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/provider/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@truffle/provider/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/provider/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@truffle/provider/node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/@truffle/provider/node_modules/web3": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz", + "integrity": "sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-bzz": "1.7.4", + "web3-core": "1.7.4", + "web3-eth": "1.7.4", + "web3-eth-personal": "1.7.4", + "web3-net": "1.7.4", + "web3-shh": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-bzz": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz", + "integrity": "sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/node": "^12.12.6", + "got": "9.6.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-core": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz", + "integrity": "sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/bn.js": "^5.1.0", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.7.4", + "web3-core-method": "1.7.4", + "web3-core-requestmanager": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-core-helpers": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz", + "integrity": "sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-eth-iban": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-core-method": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz", + "integrity": "sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.7.4", + "web3-core-promievent": "1.7.4", + "web3-core-subscriptions": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-core-promievent": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz", + "integrity": "sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-core-requestmanager": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz", + "integrity": "sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "util": "^0.12.0", + "web3-core-helpers": "1.7.4", + "web3-providers-http": "1.7.4", + "web3-providers-ipc": "1.7.4", + "web3-providers-ws": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-core-subscriptions": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz", + "integrity": "sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-eth": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz", + "integrity": "sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.7.4", + "web3-core-helpers": "1.7.4", + "web3-core-method": "1.7.4", + "web3-core-subscriptions": "1.7.4", + "web3-eth-abi": "1.7.4", + "web3-eth-accounts": "1.7.4", + "web3-eth-contract": "1.7.4", + "web3-eth-ens": "1.7.4", + "web3-eth-iban": "1.7.4", + "web3-eth-personal": "1.7.4", + "web3-net": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-eth-abi": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz", + "integrity": "sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-eth-accounts": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz", + "integrity": "sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "@ethereumjs/tx": "^3.3.2", + "crypto-browserify": "3.12.0", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.0.10", + "scrypt-js": "^3.0.1", + "uuid": "3.3.2", + "web3-core": "1.7.4", + "web3-core-helpers": "1.7.4", + "web3-core-method": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-eth-contract": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz", + "integrity": "sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/bn.js": "^5.1.0", + "web3-core": "1.7.4", + "web3-core-helpers": "1.7.4", + "web3-core-method": "1.7.4", + "web3-core-promievent": "1.7.4", + "web3-core-subscriptions": "1.7.4", + "web3-eth-abi": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-eth-ens": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz", + "integrity": "sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.7.4", + "web3-core-helpers": "1.7.4", + "web3-core-promievent": "1.7.4", + "web3-eth-abi": "1.7.4", + "web3-eth-contract": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-eth-iban": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz", + "integrity": "sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-eth-personal": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz", + "integrity": "sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.7.4", + "web3-core-helpers": "1.7.4", + "web3-core-method": "1.7.4", + "web3-net": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-net": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz", + "integrity": "sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.7.4", + "web3-core-method": "1.7.4", + "web3-utils": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-providers-http": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz", + "integrity": "sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core-helpers": "1.7.4", + "xhr2-cookies": "1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-providers-ipc": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz", + "integrity": "sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-providers-ws": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz", + "integrity": "sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.7.4", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-shh": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz", + "integrity": "sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.7.4", + "web3-core-method": "1.7.4", + "web3-core-subscriptions": "1.7.4", + "web3-net": "1.7.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/provider/node_modules/web3-utils": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz", + "integrity": "sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@trufflesuite/bigint-buffer": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", + "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "node-gyp-build": "4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/@trufflesuite/chromafi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^4.1.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "detect-indent": "^5.0.0", + "highlight.js": "^10.4.1", + "lodash.merge": "^4.6.2", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", + "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.2", + "typescript": ">=4.7.0" + } + }, + "node_modules/@types/abstract-leveldown": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz", + "integrity": "sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/chai": { + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/chai-string": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/chai-string/-/chai-string-1.4.5.tgz", + "integrity": "sha512-IecXRMSnpUvRnTztdpSdjcmcW7EdNme65bfDCQMi7XrSEPGmyDYYTEfc5fcactWDA6ioSm8o7NUqg9QxjBCCEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/level-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.2.tgz", + "integrity": "sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/levelup": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", + "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/abstract-leveldown": "*", + "@types/level-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mkdirp": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", + "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.4" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/secp256k1": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz", + "integrity": "sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.4.tgz", + "integrity": "sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/type-utils": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.4", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.4.tgz", + "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.4.tgz", + "integrity": "sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", + "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/0xsequence": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/0xsequence/-/0xsequence-1.10.15.tgz", + "integrity": "sha512-HtETUgbXS35vllu5buoiH8TrlV7boNQ+Odtae3mFQPTtsd/9Px81gFzHJhtCbcivK3QV6UC6+4nmK6KOKqInlw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/account": "1.10.15", + "@0xsequence/api": "1.10.15", + "@0xsequence/auth": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/guard": "1.10.15", + "@0xsequence/indexer": "1.10.15", + "@0xsequence/metadata": "1.10.15", + "@0xsequence/migration": "1.10.15", + "@0xsequence/multicall": "1.10.15", + "@0xsequence/network": "1.10.15", + "@0xsequence/provider": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/sessions": "1.10.15", + "@0xsequence/signhub": "1.10.15", + "@0xsequence/utils": "1.10.15", + "@0xsequence/wallet": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/abi": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/abi/-/abi-1.10.15.tgz", + "integrity": "sha512-nuh68P8tRDzIMIH7mnGX1Eab0jsYVGhZa7IlNIs8CfTnGoanxLS+MGk5ioZBa6+slzxb9VP8mnQ5QhAWeFySeg==", + "license": "Apache-2.0" + }, + "node_modules/0xsequence/node_modules/@0xsequence/auth": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/auth/-/auth-1.10.15.tgz", + "integrity": "sha512-ZY8vf/l9J+1HWP4pIMNTRBDFVXgi22x8zmSLgE4xAo4JDZ6yiGAQPooJpRCs59gx1LtVI2Zt+KgvfW1qVxQDtQ==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/account": "1.10.15", + "@0xsequence/api": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/ethauth": "^0.8.1", + "@0xsequence/indexer": "1.10.15", + "@0xsequence/metadata": "1.10.15", + "@0xsequence/migration": "1.10.15", + "@0xsequence/network": "1.10.15", + "@0xsequence/sessions": "1.10.15", + "@0xsequence/signhub": "1.10.15", + "@0xsequence/utils": "1.10.15", + "@0xsequence/wallet": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/core": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/core/-/core-1.10.15.tgz", + "integrity": "sha512-wrE5soJSqrhhm7pC+NxckLR0lJSOnsHPLKdDqWeTRmyuhtZ4e0DsrcoeoD40I/3Bd77tdZ1GGbq00CryV7JfFw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/indexer": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/indexer/-/indexer-1.10.15.tgz", + "integrity": "sha512-bc2gAIEplMcmWJMwLuXZZ0wifoxuV/zHyWzEdbQ5+9ruIXArxyoG0Ue9fMEzKWHfsAWyBKBJCCFbr4XJEQ5YjA==", + "license": "Apache-2.0" + }, + "node_modules/0xsequence/node_modules/@0xsequence/multicall": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/multicall/-/multicall-1.10.15.tgz", + "integrity": "sha512-yFTMDZR9tUvm3lefYyuxhohtx6mFzdpmn+qDFk9Bjo5TeEu0SGJLjdd6U2AK3rDIcPPw7rl7VvBXLweNJOMjfw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/network": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/network": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/network/-/network-1.10.15.tgz", + "integrity": "sha512-wHp8RGqFrncuoIh0ityO/jUobliargQ7SWlvZCf8Ez0T7uiXDEDokrFSN2F9FIl6i5a5NmcEpXhfhwS/L0pN2w==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "1.10.15", + "@0xsequence/indexer": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/provider": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/provider/-/provider-1.10.15.tgz", + "integrity": "sha512-oPntN3xWvwEnPuZ4LoxWL50v7FLhJa8guOP27FFltm4sjxydYCZ37griBR093YW5NKtWO8mtmnnnTZChJS8Euw==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/account": "1.10.15", + "@0xsequence/auth": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/migration": "1.10.15", + "@0xsequence/network": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/utils": "1.10.15", + "@0xsequence/wallet": "1.10.15", + "@databeat/tracker": "^0.9.1", + "eventemitter2": "^6.4.5", + "webextension-polyfill": "^0.10.0" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/relayer": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/relayer/-/relayer-1.10.15.tgz", + "integrity": "sha512-QpNAzRjqCl9xJdXzErQA0kmv2jzEXPfVlPwutbgmrCEIj+rHdw3M+kiG0MWBnOqxoSEA98oJnxXmpBL5mkCA6g==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/signhub": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/signhub/-/signhub-1.10.15.tgz", + "integrity": "sha512-9yZWb8d2aXoWOQp0XC81hkS+hLWxO/pZIyCRtNVdif0/SPA86v6e96xPmuj45KONYgiH33ROVDpeJEKhOEo0jg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/core": "1.10.15", + "ethers": "^5.5.2" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/signhub/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/utils": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/utils/-/utils-1.10.15.tgz", + "integrity": "sha512-LIrQS5J+3MOER+i7ajX7fiT6ga3QoDf8wsi5KY/2eFZS39sbCXGzg1ORxjtee++c/S/h4nuRYX1IRuseGYJWPw==", + "license": "Apache-2.0", + "dependencies": { + "js-base64": "^3.7.2" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/0xsequence/node_modules/@0xsequence/wallet": { + "version": "1.10.15", + "resolved": "https://registry.npmjs.org/@0xsequence/wallet/-/wallet-1.10.15.tgz", + "integrity": "sha512-UhaIaiK3IF+bv1flg/N1yuGPZXos/orJlwAd9GbPDHOIBqkBsniyraDcO+xwBKWMBHhQL6NqfSDI9j/Zxv7ocg==", + "license": "Apache-2.0", + "dependencies": { + "@0xsequence/abi": "1.10.15", + "@0xsequence/core": "1.10.15", + "@0xsequence/network": "1.10.15", + "@0xsequence/relayer": "1.10.15", + "@0xsequence/signhub": "1.10.15", + "@0xsequence/utils": "1.10.15" + }, + "peerDependencies": { + "ethers": ">=5.5 < 6" + } + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.8.tgz", + "integrity": "sha512-9f1iZ2uWh92VcrU9Y8x+LdM4DLj75VE0MJB8zuF1iUnroEptStw+DQ8EQPMUdfe5k+PkB1uUfDQfWbhstH8LrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/abstract-leveldown": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", + "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amazon-cognito-identity-js": { + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.16.tgz", + "integrity": "sha512-HPGSBGD6Q36t99puWh0LnptxO/4icnk2kqIQ9cTJ2tFQo5NMUnWQIgtrTAk8nm+caqUbjDzXzG56GBjI2tS6jQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "1.2.2", + "buffer": "4.9.2", + "fast-base64-decode": "^1.0.0", + "isomorphic-unfetch": "^3.0.0", + "js-cookie": "^2.2.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", + "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^1.2.2", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", + "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/amazon-cognito-identity-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "license": "BSD-3-Clause OR MIT", + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/antlr4": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.2.tgz", + "integrity": "sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16" + } + }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ast-parents": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", + "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.4.0" + } + }, + "node_modules/async-eventemitter/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/async-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bip39": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", + "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/node": "11.11.6", + "create-hash": "^1.1.0", + "pbkdf2": "^3.0.9", + "randombytes": "^2.0.1" + } + }, + "node_modules/bip39/node_modules/@types/node": { + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bn-chai": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bn-chai/-/bn-chai-1.0.1.tgz", + "integrity": "sha512-7rJXt21DwYiLLpvzLaACixBBoUGkRV1iuFD3wElEhw8Ji9IiY/QsJRtvW+c7ChRgEOyLQkGaSGFUUqBKm21SNA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/bn.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz", + "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/bowser": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz", + "integrity": "sha512-C2AUdAJg6rlM2W5QMp2Q4KGQMVBwR1lIimTsUnutJ8bMpW5B52pGpR2gEnNBNwijumDo5FojQ0L9JrXA8m4YEw==", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.2.2", + "browserify-rsa": "^4.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.6.1", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.9", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/browserify-sign/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bufferutil": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", + "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/cbor": { + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.11.tgz", + "integrity": "sha512-vIwORDd/WyB8Nc23o2zNN5RrtFGlR6Fca61TtjkUXueI3Jf2DOZDl1zsshvBntZ3wZHBM9ztjnkXSmzQDaq3WA==", + "dev": true, + "license": "MIT", + "dependencies": { + "nofilter": "^3.0.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cbor2": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/cbor2/-/cbor2-1.12.0.tgz", + "integrity": "sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.7" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 6" + } + }, + "node_modules/chai-bignumber": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/chai-bignumber/-/chai-bignumber-3.1.0.tgz", + "integrity": "sha512-omxEc80jAU+pZwRmoWr3aEzeLad4JW3iBhLRQlgISvghBdIxrMT7mVAGsDz4WSyCkKowENshH2j9OABAhld7QQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/chai-shallow-deep-equal": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/chai-shallow-deep-equal/-/chai-shallow-deep-equal-1.4.6.tgz", + "integrity": "sha512-2fBsQVRwrHdNO7IPYmoeH/V9+tuBDDg3k054NKdZ7tWeoi0URPzt8P+LNqcJioLVBTH/WiNM6a8CT5nWMebhPg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "peerDependencies": { + "chai": ">= 1.9.0" + } + }, + "node_modules/chai-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.6.0.tgz", + "integrity": "sha512-sXV7whDmpax+8H++YaZelgin7aur1LGf9ZhjZa3ojETFJ0uPVuS4XEXuIagpZ/c8uVOtsSh4MwOjy5CBLjJSXA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "chai": "^4.1.2" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", + "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.12.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio/node_modules/undici": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", + "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==", + "dev": true, + "license": "ISC" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "license": "MIT", + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-pure": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.48.0.tgz", + "integrity": "sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-addr-codec": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.8.tgz", + "integrity": "sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "base-x": "^3.0.8", + "big-integer": "1.6.36", + "blakejs": "^1.1.0", + "bs58": "^4.0.1", + "ripemd160-min": "0.0.6", + "safe-buffer": "^5.2.0", + "sha3": "^2.1.1" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/deferred-leveldown": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", + "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "license": "MIT" + }, + "node_modules/emittery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", + "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding-down": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", + "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/enquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", + "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", + "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "dev": true, + "license": "ISC", + "dependencies": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/eth-gas-reporter": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", + "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solidity-parser/parser": "^0.14.0", + "axios": "^1.5.1", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^5.7.2", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^10.2.0", + "req-cwd": "^2.0.0", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } + } + }, + "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/eth-gas-reporter/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eth-lib/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/eth-lib/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz", + "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.4.0" + } + }, + "node_modules/ethereum-bloom-filters/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereum-ens": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "bluebird": "^3.4.7", + "eth-ens-namehash": "^2.0.0", + "js-sha3": "^0.5.7", + "pako": "^1.0.4", + "underscore": "^1.8.3", + "web3": "^1.0.0-beta.34" + } + }, + "node_modules/ethereum-ens/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/ethereum-waffle": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", + "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethereum-waffle/chai": "4.0.10", + "@ethereum-waffle/compiler": "4.0.3", + "@ethereum-waffle/mock-contract": "4.0.4", + "@ethereum-waffle/provider": "4.0.5", + "solc": "0.8.15", + "typechain": "^8.0.0" + }, + "bin": { + "waffle": "bin/waffle" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "ethers": "*" + } + }, + "node_modules/ethereum-waffle/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ethereum-waffle/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/ethereum-waffle/node_modules/solc": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", + "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "deprecated": "This library has been deprecated and usage is discouraged.", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethers": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz", + "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==", + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", + "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pure-rand": "^5.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-equals": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.3.tgz", + "integrity": "sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fmix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", + "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "imul": "^1.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", + "dev": true, + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ganache": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", + "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", + "bundleDependencies": [ + "@trufflesuite/bigint-buffer", + "emittery", + "keccak", + "leveldown", + "secp256k1", + "@types/bn.js", + "@types/lru-cache", + "@types/seedrandom" + ], + "dev": true, + "hasShrinkwrap": true, + "license": "MIT", + "dependencies": { + "@trufflesuite/bigint-buffer": "1.1.10", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "5.1.1", + "@types/seedrandom": "3.0.1", + "emittery": "0.10.0", + "keccak": "3.0.2", + "leveldown": "6.1.0", + "secp256k1": "4.0.3" + }, + "bin": { + "ganache": "dist/node/cli.js", + "ganache-cli": "dist/node/cli.js" + }, + "optionalDependencies": { + "bufferutil": "4.0.5", + "utf-8-validate": "5.0.7" + } + }, + "node_modules/ganache-cli": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ganache-cli/-/ganache-cli-6.12.2.tgz", + "integrity": "sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw==", + "bundleDependencies": [ + "source-map-support", + "yargs", + "ethereumjs-util" + ], + "deprecated": "ganache-cli is now ganache; visit https://trfl.io/g7 for details", + "dev": true, + "license": "MIT", + "dependencies": { + "ethereumjs-util": "6.2.1", + "source-map-support": "0.5.12", + "yargs": "13.2.4" + }, + "bin": { + "ganache-cli": "cli.js" + } + }, + "node_modules/ganache-cli/node_modules/@types/bn.js": { + "version": "4.11.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ganache-cli/node_modules/@types/node": { + "version": "14.11.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/@types/pbkdf2": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ganache-cli/node_modules/@types/secp256k1": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ganache-cli/node_modules/ansi-regex": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/base-x": { + "version": "3.0.8", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ganache-cli/node_modules/blakejs": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/ganache-cli/node_modules/bn.js": { + "version": "4.11.9", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/brorand": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/browserify-aes": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ganache-cli/node_modules/bs58": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/ganache-cli/node_modules/bs58check": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/ganache-cli/node_modules/buffer-from": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/buffer-xor": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/cipher-base": { + "version": "1.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ganache-cli/node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/ganache-cli/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ganache-cli/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/create-hash": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/ganache-cli/node_modules/create-hmac": { + "version": "1.1.7", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/ganache-cli/node_modules/cross-spawn": { + "version": "6.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/ganache-cli/node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-cli/node_modules/elliptic": { + "version": "6.5.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "node_modules/ganache-cli/node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/ganache-cli/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ganache-cli/node_modules/ethereumjs-util": { + "version": "6.2.1", + "dev": true, + "inBundle": true, + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/ganache-cli/node_modules/ethjs-util": { + "version": "0.1.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ganache-cli/node_modules/evp_bytestokey": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/ganache-cli/node_modules/execa": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/ganache-cli/node_modules/get-stream": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/hash-base": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/hash.js": { + "version": "1.1.7", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/ganache-cli/node_modules/hmac-drbg": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/ganache-cli/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/invert-kv": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/is-hex-prefixed": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ganache-cli/node_modules/is-stream": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-cli/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/keccak": { + "version": "3.0.1", + "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ganache-cli/node_modules/lcid": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "invert-kv": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/map-age-cleaner": { + "version": "0.1.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/md5.js": { + "version": "1.3.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/ganache-cli/node_modules/mem": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/nice-try": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/node-addon-api": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/node-gyp-build": { + "version": "4.2.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/ganache-cli/node_modules/npm-run-path": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/ganache-cli/node_modules/os-locale": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/p-defer": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/p-finally": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/p-is-promise": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ganache-cli/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/path-key": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache-cli/node_modules/pbkdf2": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/ganache-cli/node_modules/pump": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/ganache-cli/node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/ganache-cli/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ganache-cli/node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-cli/node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/ripemd160": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/ganache-cli/node_modules/rlp": { + "version": "2.2.6", + "dev": true, + "inBundle": true, + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^4.11.1" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/ganache-cli/node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/scrypt-js": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/secp256k1": { + "version": "4.0.2", + "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.2", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ganache-cli/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/ganache-cli/node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/sha.js": { + "version": "2.4.11", + "dev": true, + "inBundle": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/ganache-cli/node_modules/shebang-command": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-cli/node_modules/shebang-regex": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-cli/node_modules/signal-exit": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-cli/node_modules/source-map-support": { + "version": "0.5.12", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/ganache-cli/node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/ganache-cli/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/strip-eof": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ganache-cli/node_modules/strip-hex-prefix": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ganache-cli/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache-cli/node_modules/which": { + "version": "1.3.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/ganache-cli/node_modules/which-module": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache-cli/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/y18n": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache-cli/node_modules/yargs": { + "version": "13.2.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "node_modules/ganache-cli/node_modules/yargs-parser": { + "version": "13.1.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", + "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", + "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "node-gyp-build": "4.4.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/ganache/node_modules/@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ganache/node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/@types/node": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/@types/seedrandom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", + "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/ganache/node_modules/bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", + "dev": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + } + }, + "node_modules/ganache/node_modules/catering": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", + "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "queue-tick": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ganache/node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/ganache/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/emittery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", + "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/ganache/node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/ganache/node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/ganache/node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/ganache/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ganache/node_modules/keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ganache/node_modules/leveldown": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", + "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", + "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "abstract-leveldown": "^7.2.0", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/ganache/node_modules/leveldown/node_modules/abstract-leveldown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", + "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ganache/node_modules/leveldown/node_modules/level-concat-iterator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", + "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "catering": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ganache/node_modules/leveldown/node_modules/level-supports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", + "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ganache/node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/ganache/node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ganache/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ganache/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/ganache/node_modules/utf-8-validate": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", + "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "dev": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + } + }, + "node_modules/ganache/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hardhat": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.27.0.tgz", + "integrity": "sha512-du7ecjx1/ueAUjvtZhVkJvWytPCjlagG3ZktYTphfzAbc1Flc6sRolw5mhKL/Loub1EIFRaflutM4bdB/YsUUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethereumjs/util": "^9.1.0", + "@ethersproject/abi": "^5.1.2", + "@nomicfoundation/edr": "^0.12.0-next.7", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", + "chokidar": "^4.0.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "find-up": "^5.0.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "json-stream-stringify": "^3.1.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "micro-eth-signer": "^0.14.0", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "picocolors": "^1.1.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.8.26", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tinyglobby": "^0.2.6", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/hardhat-deploy": { + "version": "0.11.45", + "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.11.45.tgz", + "integrity": "sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^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/contracts": "^5.7.0", + "@ethersproject/providers": "^5.7.2", + "@ethersproject/solidity": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wallet": "^5.7.0", + "@types/qs": "^6.9.7", + "axios": "^0.21.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "ethers": "^5.7.0", + "form-data": "^4.0.0", + "fs-extra": "^10.0.0", + "match-all": "^1.2.6", + "murmur-128": "^0.2.1", + "qs": "^6.9.4", + "zksync-web3": "^0.14.3" + } + }, + "node_modules/hardhat-deploy/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/hardhat-deploy/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/hardhat-deploy/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/hardhat-deploy/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/hardhat-deploy/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/hardhat-deploy/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/hardhat-deploy/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/hardhat-deploy/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/hardhat-deploy/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-deploy/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/hardhat-deploy/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/hardhat-deploy/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-deploy/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/hardhat-deploy/node_modules/zksync-web3": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/zksync-web3/-/zksync-web3-0.14.4.tgz", + "integrity": "sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg==", + "deprecated": "This package has been deprecated in favor of zksync-ethers@5.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ethers": "^5.7.0" + } + }, + "node_modules/hardhat-gas-reporter": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz", + "integrity": "sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" + } + }, + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/hardhat/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/hardhat/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hardhat/node_modules/solc": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", + "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/hardhat/node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/hardhat/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz", + "integrity": "sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/hash-base/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hash-base/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hash-base/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hash-base/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-solidity": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", + "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", + "dev": true, + "license": "ISC" + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "2.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/immer": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.2.tgz", + "integrity": "sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imul": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", + "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-observable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "upper-case": "^1.1.0" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-base64": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", + "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", + "license": "BSD-3-Clause" + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-bigint/node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stream-stringify": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", + "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=7.10.1" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/jsonschema": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", + "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/keccak256": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/keccak256/-/keccak256-1.0.6.tgz", + "integrity": "sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==", + "license": "MIT", + "dependencies": { + "bn.js": "^5.2.0", + "buffer": "^6.0.3", + "keccak": "^3.0.2" + } + }, + "node_modules/keccak256/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/level-codec": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", + "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "deprecated": "Superseded by level-transcoder (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-concat-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", + "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/level-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", + "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "~0.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-iterator-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", + "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-mem": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", + "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "deprecated": "Superseded by memory-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "level-packager": "^5.0.3", + "memdown": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-packager": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", + "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-supports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", + "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/level-ws": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", + "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/levelup": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", + "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.2" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/match-all": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.7.tgz", + "integrity": "sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==", + "dev": true, + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memdown": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", + "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "deprecated": "Superseded by memory-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "abstract-leveldown": "~6.2.1", + "functional-red-black-tree": "~1.0.1", + "immediate": "~3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memdown/node_modules/abstract-leveldown": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", + "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "deprecated": "Superseded by abstract-level (https://github.com/Level/community#faq)", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memdown/node_modules/immediate": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", + "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", + "dev": true, + "license": "MIT" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/merkle-patricia-tree": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", + "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@types/levelup": "^4.3.0", + "ethereumjs-util": "^7.1.4", + "level-mem": "^5.0.1", + "level-ws": "^2.0.0", + "readable-stream": "^3.6.0", + "semaphore-async-await": "^1.5.1" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micro-eth-signer": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz", + "integrity": "sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "micro-packed": "~0.7.2" + } + }, + "node_modules/micro-eth-signer/node_modules/@noble/curves": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.2" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-eth-signer/node_modules/@noble/hashes": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", + "dev": true, + "license": "MIT" + }, + "node_modules/micro-packed": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz", + "integrity": "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz", + "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "license": "ISC", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch/node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "dev": true, + "license": "ISC", + "dependencies": { + "mkdirp": "*" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "license": "MIT", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "license": "MIT", + "dependencies": { + "varint": "^5.0.0" + } + }, + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + } + }, + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", + "dev": true, + "license": "MIT", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/murmur-128": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", + "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "encode-utf8": "^1.0.2", + "fmix": "^0.1.0", + "imul": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.1.tgz", + "integrity": "sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nano-base32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", + "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ndjson": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", + "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.5", + "readable-stream": "^3.6.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "ndjson": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.19" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "license": "MIT" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "dev": true, + "license": "BSD", + "dependencies": { + "http-https": "^1.0.0" + } + }, + "node_modules/observable-fns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz", + "integrity": "sha512-fIYNuZ/HastSb80baGOuPRo1O9cf4baWw5WsAp7dBuUzeTD/BoaG8sVTdlPFksBE2lF21dN+A1AnrpIjSWqHHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^4.10.1", + "browserify-aes": "^1.2.0", + "evp_bytestokey": "^1.0.3", + "pbkdf2": "^3.1.5", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, + "node_modules/parse-headers": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz", + "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz", + "integrity": "sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "ripemd160": "^2.0.3", + "safe-buffer": "^5.2.1", + "sha.js": "^2.4.12", + "to-buffer": "^1.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/psl/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", + "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ripemd160": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", + "integrity": "sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.1.2", + "inherits": "^2.0.4" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ripemd160-min": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==", + "dev": true, + "license": "(MIT OR Apache-2.0)" + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/sc-istanbul/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/scrypt": { + "version": "6.0.3", + "resolved": "git+ssh://git@github.com/barrysteyn/node-scrypt.git#fb60a8d3c158fe115a624b5ffa7480f3a24b03fb", + "integrity": "sha512-IkT3V+hfrspn9KZBir79W1P0F4XWHIWm7QLYUhs9dvF9hBPUGypDhTOghV++XjJ2+5xS3GCqKuuE0hlLznL9tg==", + "dev": true, + "hasInstallScript": true, + "license": "zlib", + "dependencies": { + "nan": "^2.14.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" + }, + "node_modules/secp256k1": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semaphore-async-await": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", + "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.1" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sha3": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/sha3/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + }, + "bin": { + "solcjs": "solcjs" + } + }, + "node_modules/solc/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/solc/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/solc/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/solc/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true, + "license": "ISC" + }, + "node_modules/solc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/solc/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/solc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solc/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/solc/node_modules/yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "node_modules/solc/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/solhint": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-3.6.2.tgz", + "integrity": "sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@solidity-parser/parser": "^0.16.0", + "ajv": "^6.12.6", + "antlr4": "^4.11.0", + "ast-parents": "^0.0.1", + "chalk": "^4.1.2", + "commander": "^10.0.0", + "cosmiconfig": "^8.0.0", + "fast-diff": "^1.2.0", + "glob": "^8.0.3", + "ignore": "^5.2.4", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "semver": "^7.5.2", + "strip-ansi": "^6.0.1", + "table": "^6.8.1", + "text-table": "^0.2.0" + }, + "bin": { + "solhint": "solhint.js" + }, + "optionalDependencies": { + "prettier": "^2.8.3" + } + }, + "node_modules/solhint/node_modules/@solidity-parser/parser": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", + "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/solhint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/solhint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/solhint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/solhint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/solhint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/solhint/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/solhint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/solhint/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/solhint/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/solhint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/solhint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/solidity-ast": { + "version": "0.4.61", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.61.tgz", + "integrity": "sha512-OYBJYcYyG7gLV0VuXl9CUrvgJXjV/v0XnR4+1YomVe3q+QyENQXJJxAEASUz4vN6lMAl+C8RSRSr5MBAz09f6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/solidity-coverage": { + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.7.22.tgz", + "integrity": "sha512-I6Zd5tsFY+gmj1FDIp6w7OrUePx6ZpMgKQZg7dWgPaQHePLi3Jk+iJ8lwZxsWEoNy2Lcv91rMxATWHqRaFdQpw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@solidity-parser/parser": "^0.14.0", + "@truffle/provider": "^0.2.24", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.0" + }, + "bin": { + "solidity-coverage": "plugins/bin.js" + } + }, + "node_modules/solidity-coverage/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/solidity-coverage/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/solidity-coverage/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/solidity-coverage/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/solidity-coverage/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "license": "WTFPL OR MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "node_modules/swarm-js": { + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^11.8.5", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + } + }, + "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swarm-js/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/swarm-js/node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/swarm-js/node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/swarm-js/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/swarm-js/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/swarm-js/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "license": "MIT", + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/testrpc": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", + "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/threads": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", + "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0", + "debug": "^4.2.0", + "is-observable": "^2.1.0", + "observable-fns": "^0.6.1" + }, + "funding": { + "url": "https://github.com/andywer/threads.js?sponsor=1" + }, + "optionalDependencies": { + "tiny-worker": ">= 2" + } + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tiny-worker": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", + "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "esm": "^3.2.25" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "license": "ISC", + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-command-line-args/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-command-line-args/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/ts-command-line-args/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-command-line-args/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/tslog": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/tslog/-/tslog-4.10.2.tgz", + "integrity": "sha512-XuELoRpMR+sq8fuWwX7P0bcj+PRNiicOKDEb3fGNURhxWVyykCi9BNq7c4uVz7h7P0sj8qgBsr5SWS6yBClq3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/fullstack-build/tslog?sponsor=1" + } + }, + "node_modules/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", + "license": "MIT", + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typechain/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true, + "license": "MIT" + }, + "node_modules/upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "upper-case": "^1.1.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web3": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.4.tgz", + "integrity": "sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-bzz": "1.10.4", + "web3-core": "1.10.4", + "web3-eth": "1.10.4", + "web3-eth-personal": "1.10.4", + "web3-net": "1.10.4", + "web3-shh": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.4.tgz", + "integrity": "sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/web3-core": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.4.tgz", + "integrity": "sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/bn.js": "^5.1.1", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-requestmanager": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-helpers": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz", + "integrity": "sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-eth-iban": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-method": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.4.tgz", + "integrity": "sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-promievent": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz", + "integrity": "sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-requestmanager": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz", + "integrity": "sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "util": "^0.12.5", + "web3-core-helpers": "1.10.4", + "web3-providers-http": "1.10.4", + "web3-providers-ipc": "1.10.4", + "web3-providers-ws": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-subscriptions": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz", + "integrity": "sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/web3-core/node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/web3-eth": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.4.tgz", + "integrity": "sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-eth-accounts": "1.10.4", + "web3-eth-contract": "1.10.4", + "web3-eth-ens": "1.10.4", + "web3-eth-iban": "1.10.4", + "web3-eth-personal": "1.10.4", + "web3-net": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz", + "integrity": "sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.4.tgz", + "integrity": "sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethereumjs/common": "2.6.5", + "@ethereumjs/tx": "3.5.2", + "@ethereumjs/util": "^8.1.0", + "eth-lib": "0.2.8", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts/node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/web3-eth-accounts/node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/web3-eth-accounts/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-eth-accounts/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-eth-accounts/node_modules/bn.js": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", + "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/web3-eth-accounts/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/web3-eth-contract": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.4.tgz", + "integrity": "sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-ens": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.4.tgz", + "integrity": "sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-eth-contract": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz", + "integrity": "sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.4.tgz", + "integrity": "sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-net": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-personal/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/web3-net": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.4.tgz", + "integrity": "sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.10.4", + "web3-core-method": "1.10.4", + "web3-utils": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-http": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.4.tgz", + "integrity": "sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "abortcontroller-polyfill": "^1.7.5", + "cross-fetch": "^4.0.0", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz", + "integrity": "sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz", + "integrity": "sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.4", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-shh": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.4.tgz", + "integrity": "sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==", + "dev": true, + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-net": "1.10.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "@ethereumjs/util": "^8.1.0", + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereum-cryptography": "^2.1.2", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils/node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/web3-utils/node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/web3-utils/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/webextension-polyfill": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz", + "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==", + "license": "MPL-2.0" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/websocket": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", + "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.63", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "dev": true, + "license": "MIT", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "license": "MIT", + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "node_modules/xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "xhr-request": "^1.1.0" + } + }, + "node_modules/xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookiejar": "^2.1.1" + } + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yesno": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/yesno/-/yesno-0.3.1.tgz", + "integrity": "sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==", + "dev": true, + "license": "BSD" + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/packages/wallet/wallet-contracts/package.json b/packages/wallet/wallet-contracts/package.json new file mode 100644 index 000000000..48ebb0d3a --- /dev/null +++ b/packages/wallet/wallet-contracts/package.json @@ -0,0 +1,105 @@ +{ + "name": "@0xsequence/wallet-contracts", + "version": "3.0.1", + "private": true, + "license": "Apache-2.0", + "scripts": { + "build": "pnpm compile && pnpm adapter", + "compile": "hardhat --max-memory 4096 compile", + "clean": "rimraf artifacts && rimraf cache", + "typecheck": "tsc --noEmit", + "test": "hardhat test", + "benchmark": "BENCHMARK=true pnpm test", + "coverage": "COVERAGE=true NET_ID=1 hardhat coverage", + "deploy": "hardhat run utils/deploy-contracts.ts --network hardhat", + "verify": "hardhat verify --network", + "release": "pnpm publish src", + "lint": "pnpm lint:ts && pnpm lint:sol", + "lint:fix": "pnpm lint:ts:fix && pnpm lint:sol:fix", + "lint:sol": "solhint \"./contracts/**/*.sol\"", + "lint:sol:fix": "solhint \"./contracts/**/*.sol\" --fix", + "lint:ts": "eslint -c .eslintrc.js \"./**/*.ts\"", + "lint:ts:fix": "eslint -c .eslintrc.js --fix \"./**/*.ts\"", + "format": "prettier --write ./**/*.ts", + "adapter": "typechain --target ethers-v6 --out-dir gen/typechain \"./artifacts/contracts/**/*[^dbg].json\"", + "prepare": "husky" + }, + "types": "gen/typechain/index.ts", + "files": [ + "./LICENSE", + "./artifacts/contracts/**/*.json", + "./contracts/**/*.sol", + "./gen/typechain", + "./networks" + ], + "husky": { + "hooks": { + "pre-commit": "pnpm lint", + "pre-push": "pnpm lint && pnpm test" + } + }, + "devDependencies": { + "@nomicfoundation/hardhat-ethers": "^4.0.3", + "@nomicfoundation/hardhat-verify": "^3.0.7", + "@nomiclabs/hardhat-truffle5": "^2.1.0", + "@nomiclabs/hardhat-web3": "^2.1.0", + "@tenderly/hardhat-tenderly": "^2.5.2", + "@types/chai": "^4.3.20", + "@types/chai-as-promised": "^7.1.8", + "@types/chai-string": "^1.4.5", + "@types/mocha": "^8.2.3", + "@typescript-eslint/eslint-plugin": "^8.46.4", + "@typescript-eslint/parser": "^8.46.4", + "bn-chai": "^1.0.1", + "chai": "^4.5.0", + "chai-as-promised": "^7.1.2", + "chai-bignumber": "^3.1.0", + "chai-shallow-deep-equal": "^1.4.6", + "chai-string": "^1.6.0", + "child_process": "^1.0.2", + "dotenv": "^8.6.0", + "eslint": "^9.39.2", + "eslint-config-prettier": "^8.10.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-prettier": "^3.4.1", + "ethereum-waffle": "^4.0.10", + "ganache-cli": "6.12.2", + "hardhat": "^2.27.0", + "hardhat-gas-reporter": "1.0.10", + "husky": "^9.1.7", + "ora": "^5.4.1", + "rimraf": "^3.0.2", + "scrypt": "github:barrysteyn/node-scrypt#fb60a8d3c158fe115a624b5ffa7480f3a24b03fb", + "solhint": "^3.6.2", + "solidity-coverage": "^0.7.22", + "threads": "^1.7.0", + "ts-node": "^10.9.2", + "typechain": "^8.3.2", + "typescript": "^4.9.5", + "yesno": "^0.3.1" + }, + "config": { + "mnemonic": "test test test test test test test test test test test junk", + "ganacheChainID": 127001, + "ganachePort": 8545, + "ganacheGasLimit": "0xfffffffffff", + "ganacheGasPrice": "2", + "etherBalance": "100000", + "extra": "" + }, + "dependencies": { + "@0xsequence/wallet": "^2.3.33", + "@typechain/ethers-v6": "^0.5.1", + "0xsequence": "^1.10.15", + "ethers": "^6.15.0", + "keccak256": "^1.0.6" + }, + "description": "Ethereum contracts for the Sequence Smart Wallet at [https://sequence.app](https://sequence.app).", + "main": ".eslintrc.js", + "directories": { + "lib": "lib", + "test": "test" + }, + "keywords": [], + "author": "" +} diff --git a/packages/wallet/wallet-contracts/pnpm-lock.yaml b/packages/wallet/wallet-contracts/pnpm-lock.yaml new file mode 100644 index 000000000..91f5002c5 --- /dev/null +++ b/packages/wallet/wallet-contracts/pnpm-lock.yaml @@ -0,0 +1,13554 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@typechain/ethers-v6': + specifier: ^0.5.1 + version: 0.5.1(ethers@6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@4.7.4))(typescript@4.7.4) + ethers: + specifier: ^6.13.0 + version: 6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + keccak256: + specifier: ^1.0.6 + version: 1.0.6 + devDependencies: + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.5 + version: 3.0.6(ethers@6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.4 + version: 2.0.8(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-truffle5': + specifier: ^2.0.7 + version: 2.0.7(@nomiclabs/hardhat-web3@2.0.0(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core-promievent@1.10.4)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-web3': + specifier: ^2.0.0 + version: 2.0.0(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@tenderly/hardhat-tenderly': + specifier: ^1.0.11 + version: 1.0.11(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10)) + '@types/chai': + specifier: ^4.3.16 + version: 4.3.16 + '@types/chai-as-promised': + specifier: ^7.1.0 + version: 7.1.0 + '@types/chai-string': + specifier: ^1.4.1 + version: 1.4.1 + '@types/mocha': + specifier: ^8.2.1 + version: 8.2.1 + '@typescript-eslint/eslint-plugin': + specifier: ^4.18.0 + version: 4.18.0(@typescript-eslint/parser@4.18.0(eslint@7.22.0)(typescript@4.7.4))(eslint@7.22.0)(typescript@4.7.4) + '@typescript-eslint/parser': + specifier: ^4.18.0 + version: 4.18.0(eslint@7.22.0)(typescript@4.7.4) + bn-chai: + specifier: ^1.0.1 + version: 1.0.1(chai@4.3.4) + chai: + specifier: ^4.3.4 + version: 4.3.4 + chai-as-promised: + specifier: ^7.1.1 + version: 7.1.1(chai@4.3.4) + chai-bignumber: + specifier: ^3.0.0 + version: 3.0.0 + chai-shallow-deep-equal: + specifier: ^1.4.6 + version: 1.4.6(chai@4.3.4) + chai-string: + specifier: ^1.5.0 + version: 1.5.0(chai@4.3.4) + child_process: + specifier: ^1.0.2 + version: 1.0.2 + dotenv: + specifier: ^8.2.0 + version: 8.2.0 + eslint: + specifier: ^7.22.0 + version: 7.22.0 + eslint-config-prettier: + specifier: ^8.1.0 + version: 8.1.0(eslint@7.22.0) + eslint-plugin-import: + specifier: ^2.22.0 + version: 2.22.0(@typescript-eslint/parser@4.18.0(eslint@7.22.0)(typescript@4.7.4))(eslint@7.22.0) + eslint-plugin-prettier: + specifier: ^3.3.1 + version: 3.3.1(eslint-config-prettier@8.1.0(eslint@7.22.0))(eslint@7.22.0)(prettier@3.2.5) + ethereum-waffle: + specifier: ^3.4.4 + version: 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.7.4)(utf-8-validate@5.0.10) + ganache-cli: + specifier: 6.12.2 + version: 6.12.2 + hardhat: + specifier: ^2.20.1 + version: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10) + hardhat-gas-reporter: + specifier: 1.0.10 + version: 1.0.10(bufferutil@4.0.8)(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + husky: + specifier: ^9.0.11 + version: 9.0.11 + ora: + specifier: ^5.4.1 + version: 5.4.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + scrypt: + specifier: github:barrysteyn/node-scrypt#fb60a8d3c158fe115a624b5ffa7480f3a24b03fb + version: https://codeload.github.com/barrysteyn/node-scrypt/tar.gz/fb60a8d3c158fe115a624b5ffa7480f3a24b03fb + solhint: + specifier: ^3.4.1 + version: 3.4.1(typescript@4.7.4) + solidity-coverage: + specifier: 0.8.3 + version: 0.8.3(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10)) + threads: + specifier: ^1.7.0 + version: 1.7.0 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.11.20)(typescript@4.7.4) + typechain: + specifier: ^8.3.2 + version: 8.3.2(typescript@4.7.4) + typescript: + specifier: ^4.7.4 + version: 4.7.4 + yesno: + specifier: ^0.3.1 + version: 0.3.1 + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@babel/code-frame@7.12.11': + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.23.9': + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} + engines: {node: '>=6.9.0'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@ensdomains/address-encoder@0.1.9': + resolution: {integrity: sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==} + + '@ensdomains/ens@0.4.5': + resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} + deprecated: Please use @ensdomains/ens-contracts + + '@ensdomains/ensjs@2.1.0': + resolution: {integrity: sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==} + + '@ensdomains/resolver@0.2.4': + resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} + deprecated: Please use @ensdomains/ens-contracts + + '@eslint/eslintrc@0.4.3': + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} + + '@ethereum-waffle/chai@3.4.4': + resolution: {integrity: sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g==} + engines: {node: '>=10.0'} + + '@ethereum-waffle/compiler@3.4.4': + resolution: {integrity: sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ==} + engines: {node: '>=10.0'} + + '@ethereum-waffle/ens@3.4.4': + resolution: {integrity: sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg==} + engines: {node: '>=10.0'} + + '@ethereum-waffle/mock-contract@3.4.4': + resolution: {integrity: sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA==} + engines: {node: '>=10.0'} + + '@ethereum-waffle/provider@3.4.4': + resolution: {integrity: sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g==} + engines: {node: '>=10.0'} + + '@ethereumjs/common@2.5.0': + resolution: {integrity: sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==} + + '@ethereumjs/common@2.6.5': + resolution: {integrity: sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/tx@3.3.2': + resolution: {integrity: sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==} + + '@ethereumjs/tx@3.5.2': + resolution: {integrity: sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==} + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + + '@ethersproject/abi@5.0.0-beta.153': + resolution: {integrity: sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg==} + + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + + '@fastify/busboy@2.1.0': + resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + engines: {node: '>=14'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@ljharb/resumer@0.0.1': + resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==} + engines: {node: '>= 0.4'} + + '@ljharb/through@2.3.12': + resolution: {integrity: sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g==} + engines: {node: '>= 0.4'} + + '@metamask/eth-sig-util@4.0.1': + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.3.0': + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.3.3': + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nomicfoundation/ethereumjs-block@5.0.4': + resolution: {integrity: sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==} + engines: {node: '>=18'} + + '@nomicfoundation/ethereumjs-blockchain@7.0.4': + resolution: {integrity: sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==} + engines: {node: '>=18'} + + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + + '@nomicfoundation/ethereumjs-ethash@3.0.4': + resolution: {integrity: sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==} + engines: {node: '>=18'} + + '@nomicfoundation/ethereumjs-evm@2.0.4': + resolution: {integrity: sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==} + engines: {node: '>=18'} + + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + + '@nomicfoundation/ethereumjs-statemanager@2.0.4': + resolution: {integrity: sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==} + peerDependencies: + '@nomicfoundation/ethereumjs-verkle': 0.0.2 + peerDependenciesMeta: + '@nomicfoundation/ethereumjs-verkle': + optional: true + + '@nomicfoundation/ethereumjs-trie@6.0.4': + resolution: {integrity: sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==} + engines: {node: '>=18'} + + '@nomicfoundation/ethereumjs-tx@5.0.4': + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-util@9.0.4': + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-verkle@0.0.2': + resolution: {integrity: sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==} + engines: {node: '>=18'} + + '@nomicfoundation/ethereumjs-vm@7.0.4': + resolution: {integrity: sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==} + engines: {node: '>=18'} + + '@nomicfoundation/hardhat-ethers@3.0.6': + resolution: {integrity: sha512-/xzkFQAaHQhmIAYOQmvHBPwL+NkwLzT9gRZBsgWUYeV+E6pzXsBQsHfRYbAZ3XEYare+T7S+5Tg/1KDJgepSkA==} + peerDependencies: + ethers: ^6.1.0 + hardhat: ^2.0.0 + + '@nomicfoundation/hardhat-verify@2.0.8': + resolution: {integrity: sha512-x/OYya7A2Kcz+3W/J78dyDHxr0ezU23DKTrRKfy5wDPCnePqnr79vm8EXqX3gYps6IjPBYyGPZ9K6E5BnrWx5Q==} + peerDependencies: + hardhat: ^2.0.4 + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': + resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': + resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': + resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': + resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': + resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': + resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nomicfoundation/solidity-analyzer@0.1.1': + resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + engines: {node: '>= 12'} + + '@nomiclabs/hardhat-truffle5@2.0.7': + resolution: {integrity: sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==} + peerDependencies: + '@nomiclabs/hardhat-web3': ^2.0.0 + hardhat: ^2.6.4 + web3: ^1.0.0-beta.36 + + '@nomiclabs/hardhat-web3@2.0.0': + resolution: {integrity: sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==} + peerDependencies: + hardhat: ^2.0.0 + web3: ^1.0.0-beta.36 + + '@nomiclabs/truffle-contract@4.5.10': + resolution: {integrity: sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==} + peerDependencies: + web3: ^1.2.1 + web3-core-helpers: ^1.2.1 + web3-core-promievent: ^1.2.1 + web3-eth-abi: ^1.2.1 + web3-utils: ^1.2.1 + + '@resolver-engine/core@0.3.3': + resolution: {integrity: sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==} + + '@resolver-engine/fs@0.3.3': + resolution: {integrity: sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==} + + '@resolver-engine/imports-fs@0.3.3': + resolution: {integrity: sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==} + + '@resolver-engine/imports@0.3.3': + resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} + + '@scure/base@1.1.5': + resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} + + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + + '@scure/bip32@1.3.3': + resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + + '@scure/bip39@1.2.2': + resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@sindresorhus/is@0.14.0': + resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} + engines: {node: '>=6'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@solidity-parser/parser@0.14.5': + resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + + '@solidity-parser/parser@0.16.2': + resolution: {integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==} + + '@szmarczak/http-timer@1.1.2': + resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} + engines: {node: '>=6'} + + '@szmarczak/http-timer@4.0.6': + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@tenderly/hardhat-tenderly@1.0.11': + resolution: {integrity: sha512-ZWE8NYUaCNQfzLk4psVcwRXDadDzOWT6Il8hdazzOGYo4EF6vunv6/DHJTGR1JD/FLx7ub0HOwCAHJU8wL2l2A==} + peerDependencies: + hardhat: ^2.0.3 + + '@truffle/abi-utils@1.0.3': + resolution: {integrity: sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@truffle/blockchain-utils@0.1.9': + resolution: {integrity: sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@truffle/codec@0.17.3': + resolution: {integrity: sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@truffle/compile-common@0.9.8': + resolution: {integrity: sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@truffle/contract-schema@3.4.16': + resolution: {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@truffle/debug-utils@6.0.57': + resolution: {integrity: sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@truffle/error@0.1.1': + resolution: {integrity: sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@truffle/error@0.2.2': + resolution: {integrity: sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@truffle/interface-adapter@0.5.37': + resolution: {integrity: sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + '@trufflesuite/chromafi@3.0.0': + resolution: {integrity: sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==} + + '@tsconfig/node10@1.0.9': + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@typechain/ethers-v5@2.0.0': + resolution: {integrity: sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw==} + peerDependencies: + ethers: ^5.0.0 + typechain: ^3.0.0 + + '@typechain/ethers-v6@0.5.1': + resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} + peerDependencies: + ethers: 6.x + typechain: ^8.3.2 + typescript: '>=4.7.0' + + '@types/bignumber.js@5.0.0': + resolution: {integrity: sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==} + deprecated: This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed! + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + + '@types/bn.js@5.1.5': + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + + '@types/cacheable-request@6.0.3': + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + + '@types/chai-as-promised@7.1.0': + resolution: {integrity: sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==} + + '@types/chai-string@1.4.1': + resolution: {integrity: sha512-aRNMs6TKgjgPlCHwDfq/YNy5VtRR2hJ4AUWByddrT0TRVVD8eX4MiHW6/iHvmQHRlVuuPZcwnTUE7b4yFt7bEA==} + + '@types/chai@4.3.16': + resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} + + '@types/concat-stream@1.6.1': + resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/form-data@0.0.33': + resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + + '@types/mkdirp@0.5.2': + resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} + + '@types/mocha@8.2.1': + resolution: {integrity: sha512-NysN+bNqj6E0Hv4CTGWSlPzMW6vTKjDpOteycDkV4IWBsO+PU48JonrPzV9ODjiI2XrjmA05KInLgF5ivZ/YGQ==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} + + '@types/node@10.17.60': + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@18.15.13': + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + + '@types/node@20.11.20': + resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} + + '@types/node@8.10.66': + resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + '@types/qs@6.9.11': + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + + '@types/readable-stream@2.3.15': + resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} + + '@types/resolve@0.0.8': + resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} + + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + + '@typescript-eslint/eslint-plugin@4.18.0': + resolution: {integrity: sha512-Lzkc/2+7EoH7+NjIWLS2lVuKKqbEmJhtXe3rmfA8cyiKnZm3IfLf51irnBcmow8Q/AptVV0XBZmBJKuUJTe6cQ==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + '@typescript-eslint/parser': ^4.0.0 + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/experimental-utils@4.18.0': + resolution: {integrity: sha512-92h723Kblt9JcT2RRY3QS2xefFKar4ZQFVs3GityOKWQYgtajxt/tuXIzL7sVCUlM1hgreiV5gkGYyBpdOwO6A==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: '*' + + '@typescript-eslint/parser@4.18.0': + resolution: {integrity: sha512-W3z5S0ZbecwX3PhJEAnq4mnjK5JJXvXUDBYIYGoweCyWyuvAKfGHvzmpUzgB5L4cRBb+cTu9U/ro66dx7dIimA==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@4.18.0': + resolution: {integrity: sha512-olX4yN6rvHR2eyFOcb6E4vmhDPsfdMyfQ3qR+oQNkAv8emKKlfxTWUXU5Mqxs2Fwe3Pf1BoPvrwZtwngxDzYzQ==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@typescript-eslint/types@4.18.0': + resolution: {integrity: sha512-/BRociARpj5E+9yQ7cwCF/SNOWwXJ3qhjurMuK2hIFUbr9vTuDeu476Zpu+ptxY2kSxUHDGLLKy+qGq2sOg37A==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@typescript-eslint/typescript-estree@4.18.0': + resolution: {integrity: sha512-wt4xvF6vvJI7epz+rEqxmoNQ4ZADArGQO9gDU+cM0U5fdVv7N+IAuVoVAoZSOZxzGHBfvE3XQMLdy+scsqFfeg==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/visitor-keys@4.18.0': + resolution: {integrity: sha512-Q9t90JCvfYaN0OfFUgaLqByOfz8yPeTAdotn/XYNm5q9eHax90gzdb+RJ6E9T5s97Kv/UHWKERTmqA0jTKAEHw==} + engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + abbrev@1.0.9: + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + + abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + + abstract-leveldown@2.6.3: + resolution: {integrity: sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==} + + abstract-leveldown@2.7.2: + resolution: {integrity: sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==} + + abstract-leveldown@3.0.0: + resolution: {integrity: sha512-KUWx9UWGQD12zsmLNj64/pndaz4iJh/Pj7nopgkfDG6RlCcbMZvT6+9l7dchK4idog2Is8VdC/PvNbFuFmalIQ==} + engines: {node: '>=4'} + + abstract-leveldown@5.0.0: + resolution: {integrity: sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A==} + engines: {node: '>=6'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + + aes-js@3.1.2: + resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@3.2.3: + resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} + engines: {node: '>=6'} + + ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + antlr4@4.13.1: + resolution: {integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==} + engines: {node: '>=16'} + + antlr4ts@0.5.0-alpha.4: + resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + + array-back@1.0.4: + resolution: {integrity: sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==} + engines: {node: '>=0.12.0'} + + array-back@2.0.0: + resolution: {integrity: sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==} + engines: {node: '>=4'} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.reduce@1.0.6: + resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + asn1.js@5.4.1: + resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + + ast-parents@0.0.1: + resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-eventemitter@0.2.4: + resolution: {integrity: sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + async@1.5.2: + resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + + async@2.6.2: + resolution: {integrity: sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + + babel-code-frame@6.26.0: + resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} + + babel-core@6.26.3: + resolution: {integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==} + + babel-generator@6.26.1: + resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} + + babel-helper-builder-binary-assignment-operator-visitor@6.24.1: + resolution: {integrity: sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==} + + babel-helper-call-delegate@6.24.1: + resolution: {integrity: sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==} + + babel-helper-define-map@6.26.0: + resolution: {integrity: sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==} + + babel-helper-explode-assignable-expression@6.24.1: + resolution: {integrity: sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==} + + babel-helper-function-name@6.24.1: + resolution: {integrity: sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==} + + babel-helper-get-function-arity@6.24.1: + resolution: {integrity: sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==} + + babel-helper-hoist-variables@6.24.1: + resolution: {integrity: sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==} + + babel-helper-optimise-call-expression@6.24.1: + resolution: {integrity: sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==} + + babel-helper-regex@6.26.0: + resolution: {integrity: sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==} + + babel-helper-remap-async-to-generator@6.24.1: + resolution: {integrity: sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==} + + babel-helper-replace-supers@6.24.1: + resolution: {integrity: sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==} + + babel-helpers@6.24.1: + resolution: {integrity: sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==} + + babel-messages@6.23.0: + resolution: {integrity: sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==} + + babel-plugin-check-es2015-constants@6.22.0: + resolution: {integrity: sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==} + + babel-plugin-syntax-async-functions@6.13.0: + resolution: {integrity: sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==} + + babel-plugin-syntax-exponentiation-operator@6.13.0: + resolution: {integrity: sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==} + + babel-plugin-syntax-trailing-function-commas@6.22.0: + resolution: {integrity: sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==} + + babel-plugin-transform-async-to-generator@6.24.1: + resolution: {integrity: sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==} + + babel-plugin-transform-es2015-arrow-functions@6.22.0: + resolution: {integrity: sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==} + + babel-plugin-transform-es2015-block-scoped-functions@6.22.0: + resolution: {integrity: sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==} + + babel-plugin-transform-es2015-block-scoping@6.26.0: + resolution: {integrity: sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==} + + babel-plugin-transform-es2015-classes@6.24.1: + resolution: {integrity: sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==} + + babel-plugin-transform-es2015-computed-properties@6.24.1: + resolution: {integrity: sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==} + + babel-plugin-transform-es2015-destructuring@6.23.0: + resolution: {integrity: sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==} + + babel-plugin-transform-es2015-duplicate-keys@6.24.1: + resolution: {integrity: sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==} + + babel-plugin-transform-es2015-for-of@6.23.0: + resolution: {integrity: sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==} + + babel-plugin-transform-es2015-function-name@6.24.1: + resolution: {integrity: sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==} + + babel-plugin-transform-es2015-literals@6.22.0: + resolution: {integrity: sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==} + + babel-plugin-transform-es2015-modules-amd@6.24.1: + resolution: {integrity: sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==} + + babel-plugin-transform-es2015-modules-commonjs@6.26.2: + resolution: {integrity: sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==} + + babel-plugin-transform-es2015-modules-systemjs@6.24.1: + resolution: {integrity: sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==} + + babel-plugin-transform-es2015-modules-umd@6.24.1: + resolution: {integrity: sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==} + + babel-plugin-transform-es2015-object-super@6.24.1: + resolution: {integrity: sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==} + + babel-plugin-transform-es2015-parameters@6.24.1: + resolution: {integrity: sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==} + + babel-plugin-transform-es2015-shorthand-properties@6.24.1: + resolution: {integrity: sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==} + + babel-plugin-transform-es2015-spread@6.22.0: + resolution: {integrity: sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==} + + babel-plugin-transform-es2015-sticky-regex@6.24.1: + resolution: {integrity: sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==} + + babel-plugin-transform-es2015-template-literals@6.22.0: + resolution: {integrity: sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==} + + babel-plugin-transform-es2015-typeof-symbol@6.23.0: + resolution: {integrity: sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==} + + babel-plugin-transform-es2015-unicode-regex@6.24.1: + resolution: {integrity: sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==} + + babel-plugin-transform-exponentiation-operator@6.24.1: + resolution: {integrity: sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==} + + babel-plugin-transform-regenerator@6.26.0: + resolution: {integrity: sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==} + + babel-plugin-transform-strict-mode@6.24.1: + resolution: {integrity: sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==} + + babel-preset-env@1.7.0: + resolution: {integrity: sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==} + + babel-register@6.26.0: + resolution: {integrity: sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==} + + babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + + babel-template@6.26.0: + resolution: {integrity: sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==} + + babel-traverse@6.26.0: + resolution: {integrity: sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==} + + babel-types@6.26.0: + resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==} + + babelify@7.3.0: + resolution: {integrity: sha512-vID8Fz6pPN5pJMdlUnNFSfrlcx5MUule4k9aKs/zbZPyXxMTcRrB0M4Tarw22L8afr8eYSWxDPYCob3TdrqtlA==} + + babylon@6.18.0: + resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} + hasBin: true + + backoff@2.5.0: + resolution: {integrity: sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==} + engines: {node: '>= 0.6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + + big-integer@1.6.36: + resolution: {integrity: sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==} + engines: {node: '>=0.6'} + + big.js@6.2.1: + resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==} + + bigint-crypto-utils@3.3.0: + resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} + engines: {node: '>=14.0.0'} + + bignumber.js@7.2.1: + resolution: {integrity: sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bip39@2.5.0: + resolution: {integrity: sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + bn-chai@1.0.1: + resolution: {integrity: sha512-7rJXt21DwYiLLpvzLaACixBBoUGkRV1iuFD3wElEhw8Ji9IiY/QsJRtvW+c7ChRgEOyLQkGaSGFUUqBKm21SNA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + + browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + + browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + + browserify-sign@4.2.2: + resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} + engines: {node: '>= 4'} + + browserslist@3.2.8: + resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} + hasBin: true + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-to-arraybuffer@0.0.5: + resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer-xor@2.0.2: + resolution: {integrity: sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + bytewise-core@1.2.3: + resolution: {integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==} + + bytewise@1.1.0: + resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} + + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + + cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + + cacheable-lookup@6.1.0: + resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} + engines: {node: '>=10.6.0'} + + cacheable-request@6.1.0: + resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} + engines: {node: '>=8'} + + cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + + cachedown@1.0.0: + resolution: {integrity: sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU=} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + + camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + + camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001589: + resolution: {integrity: sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + cbor@5.2.0: + resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} + engines: {node: '>=6.0.0'} + + cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + + chai-as-promised@7.1.1: + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + + chai-bignumber@3.0.0: + resolution: {integrity: sha512-SubOtaSI2AILWTWe2j0c6i2yFT/f9J6UBjeVGDuwDiPLkF/U5+/eTWUE3sbCZ1KgcPF6UJsDVYbIxaYA097MQA==} + + chai-shallow-deep-equal@1.4.6: + resolution: {integrity: sha512-2fBsQVRwrHdNO7IPYmoeH/V9+tuBDDg3k054NKdZ7tWeoi0URPzt8P+LNqcJioLVBTH/WiNM6a8CT5nWMebhPg==} + engines: {node: '>= 0.6.0'} + peerDependencies: + chai: '>= 1.9.0' + + chai-string@1.5.0: + resolution: {integrity: sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw==} + peerDependencies: + chai: ^4.1.2 + + chai@4.3.4: + resolution: {integrity: sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==} + engines: {node: '>=4'} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + change-case@3.0.2: + resolution: {integrity: sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + checkpoint-store@1.1.0: + resolution: {integrity: sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + child_process@1.0.2: + resolution: {integrity: sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==} + + chokidar@3.3.0: + resolution: {integrity: sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==} + engines: {node: '>= 8.10.0'} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-table3@0.5.1: + resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: '>=6'} + + cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + + cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + command-line-args@4.0.7: + resolution: {integrity: sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==} + hasBin: true + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + + constant-case@2.0.0: + resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + + contains-path@0.1.0: + resolution: {integrity: sha512-OKZnPGeMQy2RPaUIBPFFd71iNf4791H12MCRuVQDnzGRwCYNYmTDy5pdafo2SLAcEMKzTOQnLWG4QdcjeJUMEg==} + engines: {node: '>=0.10.0'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-hash@2.5.2: + resolution: {integrity: sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + cookie-signature@1.0.6: + resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + + core-js-pure@3.36.0: + resolution: {integrity: sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==} + + core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-fetch@2.2.6: + resolution: {integrity: sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + crypto-addr-codec@0.1.8: + resolution: {integrity: sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==} + + crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + death@1.1.0: + resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.6: + resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + decompress-response@3.3.0: + resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} + engines: {node: '>=4'} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-eql@3.0.1: + resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} + engines: {node: '>=0.12'} + + deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@1.1.3: + resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + deferred-leveldown@1.2.2: + resolution: {integrity: sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==} + + deferred-leveldown@4.0.2: + resolution: {integrity: sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==} + engines: {node: '>=6'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + + defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-indent@4.0.0: + resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} + engines: {node: '>=0.10.0'} + + detect-indent@5.0.0: + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} + + detect-port@1.5.1: + resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} + hasBin: true + + diff@3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + + diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + + difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@1.5.0: + resolution: {integrity: sha512-lsGyRuYr4/PIB0txi+Fy2xOMI2dGaTguCaotzFGkVZuKR5usKfcRWIFKNM3QNrU7hh/+w2bwTW+ZeXPK5l8uVg==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + dom-walk@0.1.2: + resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dot-case@2.1.1: + resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + + dotenv@8.2.0: + resolution: {integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==} + engines: {node: '>=8'} + + dotignore@0.1.2: + resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} + hasBin: true + + duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + ee-first@1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + + electron-to-chromium@1.4.682: + resolution: {integrity: sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA==} + + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encoding-down@5.0.4: + resolution: {integrity: sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw==} + engines: {node: '>=6'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.22.4: + resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} + engines: {node: '>= 0.4'} + + es-array-method-boxes-properly@1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.63: + resolution: {integrity: sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@1.8.1: + resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} + engines: {node: '>=0.12.0'} + hasBin: true + + eslint-config-prettier@8.1.0: + resolution: {integrity: sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.22.0: + resolution: {integrity: sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-prettier@3.3.1: + resolution: {integrity: sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=5.0.0' + eslint-config-prettier: '*' + prettier: '>=1.13.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint@7.22.0: + resolution: {integrity: sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==} + engines: {node: ^10.12.0 || >=12.0.0} + hasBin: true + + esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + + esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-block-tracker@3.0.1: + resolution: {integrity: sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug==} + + eth-ens-namehash@2.0.8: + resolution: {integrity: sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==} + + eth-gas-reporter@0.2.27: + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + peerDependencies: + '@codechecks/client': ^0.1.0 + peerDependenciesMeta: + '@codechecks/client': + optional: true + + eth-json-rpc-infura@3.2.1: + resolution: {integrity: sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + eth-json-rpc-middleware@1.6.0: + resolution: {integrity: sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==} + + eth-lib@0.1.29: + resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==} + + eth-lib@0.2.8: + resolution: {integrity: sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==} + + eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} + + eth-sig-util@1.4.2: + resolution: {integrity: sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==} + deprecated: Deprecated in favor of '@metamask/eth-sig-util' + + eth-sig-util@3.0.0: + resolution: {integrity: sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ==} + deprecated: Deprecated in favor of '@metamask/eth-sig-util' + + eth-tx-summary@3.2.4: + resolution: {integrity: sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg==} + + ethashjs@0.0.8: + resolution: {integrity: sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==} + deprecated: 'New package name format for new versions: @ethereumjs/ethash. Please update.' + + ethereum-bloom-filters@1.0.10: + resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + + ethereum-common@0.0.18: + resolution: {integrity: sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==} + + ethereum-common@0.2.0: + resolution: {integrity: sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereum-cryptography@2.1.3: + resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + + ethereum-ens@0.8.0: + resolution: {integrity: sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==} + + ethereum-waffle@3.4.4: + resolution: {integrity: sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==} + engines: {node: '>=10.0'} + hasBin: true + + ethereumjs-abi@0.6.5: + resolution: {integrity: sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g==} + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + + ethereumjs-abi@https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0: + resolution: {tarball: https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0} + version: 0.6.8 + + ethereumjs-account@2.0.5: + resolution: {integrity: sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==} + + ethereumjs-account@3.0.0: + resolution: {integrity: sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA==} + deprecated: Please use Util.Account class found on package ethereumjs-util@^7.0.6 https://github.com/ethereumjs/ethereumjs-util/releases/tag/v7.0.6 + + ethereumjs-block@1.7.1: + resolution: {integrity: sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==} + deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' + + ethereumjs-block@2.2.2: + resolution: {integrity: sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==} + deprecated: 'New package name format for new versions: @ethereumjs/block. Please update.' + + ethereumjs-blockchain@4.0.4: + resolution: {integrity: sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ==} + deprecated: 'New package name format for new versions: @ethereumjs/blockchain. Please update.' + + ethereumjs-common@1.5.0: + resolution: {integrity: sha512-SZOjgK1356hIY7MRj3/ma5qtfr/4B5BL+G4rP/XSMYr2z1H5el4RX5GReYCKmQmYI/nSBmRnwrZ17IfHuG0viQ==} + deprecated: 'New package name format for new versions: @ethereumjs/common. Please update.' + + ethereumjs-tx@1.3.7: + resolution: {integrity: sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==} + deprecated: 'New package name format for new versions: @ethereumjs/tx. Please update.' + + ethereumjs-tx@2.1.2: + resolution: {integrity: sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==} + deprecated: 'New package name format for new versions: @ethereumjs/tx. Please update.' + + ethereumjs-util@4.5.1: + resolution: {integrity: sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==} + + ethereumjs-util@5.2.1: + resolution: {integrity: sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==} + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethereumjs-vm@2.6.0: + resolution: {integrity: sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==} + deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' + + ethereumjs-vm@4.2.0: + resolution: {integrity: sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA==} + deprecated: 'New package name format for new versions: @ethereumjs/vm. Please update.' + + ethereumjs-wallet@0.6.5: + resolution: {integrity: sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA==} + + ethers@4.0.49: + resolution: {integrity: sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==} + + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + + ethers@6.13.0: + resolution: {integrity: sha512-+yyQQQWEntY5UVbCv++guA14RRVFm1rSnO1GoLFdrK7/XRWMoktNgyG9UjwxrQqGBfGyFKknNZ81YpUS2emCgg==} + engines: {node: '>=14.0.0'} + + ethjs-unit@0.1.6: + resolution: {integrity: sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=} + engines: {node: '>=6.5.0', npm: '>=3'} + + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + eventemitter3@4.0.4: + resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + + express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fake-merkle-patricia-tree@1.0.1: + resolution: {integrity: sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==} + + fast-check@3.1.1: + resolution: {integrity: sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==} + engines: {node: '>=8.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fetch-ponyfill@4.1.0: + resolution: {integrity: sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-replace@1.0.3: + resolution: {integrity: sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==} + engines: {node: '>=4.0.0'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-yarn-workspace-root@1.2.1: + resolution: {integrity: sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==} + + find-yarn-workspace-root@2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@4.1.1: + resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==} + hasBin: true + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + flow-stoplight@1.0.0: + resolution: {integrity: sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA==} + + follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data-encoder@1.7.1: + resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + + fresh@0.5.2: + resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} + engines: {node: '>= 0.6'} + + fs-extra@0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + + fs-extra@4.0.3: + resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + ganache-cli@6.12.2: + resolution: {integrity: sha512-bnmwnJDBDsOWBUP8E/BExWf85TsdDEFelQSzihSJm9VChVO1SHp94YXLP5BlA4j/OTxp0wR4R1Tje9OHOuAJVw==} + deprecated: ganache-cli is now ganache; visit https://trfl.io/g7 for details + hasBin: true + bundledDependencies: + - source-map-support + - yargs + - ethereumjs-util + + ganache-core@2.13.2: + resolution: {integrity: sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw==} + engines: {node: '>=8.9.0'} + deprecated: ganache-core is now ganache; visit https://trfl.io/g7 for details + bundledDependencies: + - keccak + + get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + + get-stream@4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + ghost-testrpc@0.0.2: + resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + + glob@7.1.3: + resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==} + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + global@4.4.0: + resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@9.18.0: + resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} + engines: {node: '>=0.10.0'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + + got@12.1.0: + resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + engines: {node: '>=14.16'} + + got@9.6.0: + resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} + engines: {node: '>=8.6'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + hardhat-gas-reporter@1.0.10: + resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} + peerDependencies: + hardhat: ^2.0.2 + + hardhat@2.20.1: + resolution: {integrity: sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + + has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.3: + resolution: {integrity: sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + header-case@1.0.1: + resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + + heap@0.2.6: + resolution: {integrity: sha512-MzzWcnfB1e4EG2vHi3dXHoBupmuXNZzx6pY6HldVS55JKKBoq3xOyzfSaZRkJp37HIhEYC78knabHff3zc4dQQ==} + + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + highlightjs-solidity@2.0.6: + resolution: {integrity: sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + home-or-tmp@2.0.0: + resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-basic@8.1.3: + resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: '>=6.0.0'} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-https@1.0.0: + resolution: {integrity: sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==} + + http-response-object@3.0.2: + resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + idna-uts46-hx@2.3.1: + resolution: {integrity: sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==} + engines: {node: '>=4.0.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immediate@3.2.3: + resolution: {integrity: sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==} + + immediate@3.3.0: + resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} + + immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + + invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + + is-fn@1.0.0: + resolution: {integrity: sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-function@1.0.2: + resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha1-fY035q135dEnFIkTxXPggtd39VQ=} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-lower-case@1.1.3: + resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-observable@2.1.0: + resolution: {integrity: sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==} + engines: {node: '>=8'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-upper-case@1.1.2: + resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + + is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + js-sdsl@4.4.2: + resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} + + js-sha3@0.5.7: + resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@1.3.0: + resolution: {integrity: sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==} + hasBin: true + + json-buffer@3.0.0: + resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-rpc-engine@3.8.0: + resolution: {integrity: sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA==} + + json-rpc-error@2.0.0: + resolution: {integrity: sha512-EwUeWP+KgAZ/xqFpaP6YDAXMtCJi+o/QQpCQFIYyxr01AdADi2y413eM8hSqJcoQym9WMePAJWoaODEJufC4Ug==} + + json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stable-stringify@1.1.1: + resolution: {integrity: sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==} + engines: {node: '>= 0.4'} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@0.5.1: + resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} + hasBin: true + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + + jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyv@3.1.0: + resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + klaw-sync@6.0.0: + resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} + + klaw@1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + + lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + + level-codec@7.0.1: + resolution: {integrity: sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==} + + level-codec@9.0.2: + resolution: {integrity: sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==} + engines: {node: '>=6'} + + level-errors@1.0.5: + resolution: {integrity: sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==} + + level-errors@2.0.1: + resolution: {integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==} + engines: {node: '>=6'} + + level-iterator-stream@1.3.1: + resolution: {integrity: sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==} + + level-iterator-stream@2.0.3: + resolution: {integrity: sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig==} + engines: {node: '>=4'} + + level-iterator-stream@3.0.1: + resolution: {integrity: sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g==} + engines: {node: '>=6'} + + level-mem@3.0.1: + resolution: {integrity: sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg==} + engines: {node: '>=6'} + + level-packager@4.0.1: + resolution: {integrity: sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q==} + engines: {node: '>=6'} + + level-post@1.0.7: + resolution: {integrity: sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew==} + + level-sublevel@6.6.4: + resolution: {integrity: sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==} + + level-ws@0.0.0: + resolution: {integrity: sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==} + + level-ws@1.0.0: + resolution: {integrity: sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==} + engines: {node: '>=6'} + + levelup@1.3.9: + resolution: {integrity: sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==} + + levelup@3.1.1: + resolution: {integrity: sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg==} + engines: {node: '>=6'} + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + load-json-file@2.0.0: + resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==} + engines: {node: '>=4'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.20: + resolution: {integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@3.0.0: + resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} + engines: {node: '>=8'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + looper@2.0.0: + resolution: {integrity: sha512-6DzMHJcjbQX/UPHc1rRCBfKlLwDkvuGZ715cIR36wSdYqWXFT35uLXq5P/2orl3tz+t+VOVPxw4yPinQlUDGDQ==} + + looper@3.0.0: + resolution: {integrity: sha512-LJ9wplN/uSn72oJRsXTx+snxPet5c8XiZmOKCm906NVYu+ag6SB6vUcnJcWxgnl2NfbIyeobAn7Bwv6xRj2XJg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lower-case-first@1.0.2: + resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} + + lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + + lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@3.2.0: + resolution: {integrity: sha512-91gyOKTc2k66UG6kHiH4h3S2eltcPwE1STVfMYC/NG+nZwf8IIuiamfmpGZjpbbxzSyEJaLC0tNSmhjlQUTJow==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + ltgt@2.1.3: + resolution: {integrity: sha512-5VjHC5GsENtIi5rbJd+feEpDKhfr7j0odoUR2Uh978g+2p93nd5o34cTjQWohXsPsCZeqoDnIqEf88mPCe0Pfw==} + + ltgt@2.2.1: + resolution: {integrity: sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + + markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + media-typer@0.3.0: + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + engines: {node: '>= 0.6'} + + memdown@1.4.1: + resolution: {integrity: sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==} + + memdown@3.0.0: + resolution: {integrity: sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==} + engines: {node: '>=6'} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merkle-patricia-tree@2.3.2: + resolution: {integrity: sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==} + + merkle-patricia-tree@3.0.0: + resolution: {integrity: sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + + minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + + mkdirp-promise@5.0.1: + resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} + engines: {node: '>=4'} + deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that. + + mkdirp@0.5.5: + resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} + hasBin: true + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.3.0: + resolution: {integrity: sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==} + engines: {node: '>= 14.0.0'} + hasBin: true + + mocha@7.1.2: + resolution: {integrity: sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==} + engines: {node: '>= 8.10.0'} + hasBin: true + + mock-fs@4.14.0: + resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} + + mock-property@1.0.3: + resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==} + engines: {node: '>= 0.4'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + + multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + + multicodec@0.5.7: + resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==} + deprecated: This module has been superseded by the multiformats module + + multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + + multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + + nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + + nano-base32@1.0.1: + resolution: {integrity: sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==} + + nano-json-stream-parser@0.1.2: + resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-environment-flags@1.0.6: + resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} + + node-fetch@1.7.3: + resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + + nofilter@1.0.4: + resolution: {integrity: sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==} + engines: {node: '>=8'} + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + + normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + number-to-bn@1.7.0: + resolution: {integrity: sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA=} + engines: {node: '>=6.5.0', npm: '>=3'} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + + object-keys@0.4.0: + resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + + object.assign@4.1.0: + resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.getownpropertydescriptors@2.1.7: + resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} + engines: {node: '>= 0.8'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + oboe@2.1.4: + resolution: {integrity: sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=} + + oboe@2.1.5: + resolution: {integrity: sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=} + + observable-fns@0.6.1: + resolution: {integrity: sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + + os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-cancelable@1.1.0: + resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} + engines: {node: '>=6'} + + p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + param-case@2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-asn1@5.1.6: + resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + + parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + + parse-headers@2.0.5: + resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@2.0.1: + resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + + patch-package@6.2.2: + resolution: {integrity: sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==} + engines: {npm: '>5'} + hasBin: true + + patch-package@6.5.1: + resolution: {integrity: sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==} + engines: {node: '>=10', npm: '>5'} + hasBin: true + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-case@2.1.1: + resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.7: + resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@2.0.0: + resolution: {integrity: sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postinstall-postinstall@2.1.0: + resolution: {integrity: sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==} + + precond@0.2.3: + resolution: {integrity: sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==} + engines: {node: '>= 0.6'} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prepend-http@2.0.0: + resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} + engines: {node: '>=4'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + private@0.1.8: + resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} + engines: {node: '>= 0.6'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + promise-to-callback@1.0.0: + resolution: {integrity: sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==} + engines: {node: '>=0.10.0'} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + + pull-cat@1.1.11: + resolution: {integrity: sha512-i3w+xZ3DCtTVz8S62hBOuNLRHqVDsHMNZmgrZsjPnsxXUgbWtXEee84lo1XswE7W2a3WHyqsNuDJTjVLAQR8xg==} + + pull-defer@0.2.3: + resolution: {integrity: sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA==} + + pull-level@2.0.4: + resolution: {integrity: sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg==} + + pull-live@1.0.1: + resolution: {integrity: sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA==} + + pull-pushable@2.2.0: + resolution: {integrity: sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg==} + + pull-stream@3.7.0: + resolution: {integrity: sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw==} + + pull-window@2.1.4: + resolution: {integrity: sha512-cbDzN76BMlcGG46OImrgpkMf/VkCnupj8JhsrpBw3aWBM9ye345aYnqitmZCgauBkc0HbbRRn9hCnsa3k2FNUg==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.1.0: + resolution: {integrity: sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@5.0.5: + resolution: {integrity: sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + query-string@5.1.1: + resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==} + engines: {node: '>=0.10.0'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg-up@2.0.0: + resolution: {integrity: sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==} + engines: {node: '>=4'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + read-pkg@2.0.0: + resolution: {integrity: sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==} + engines: {node: '>=4'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.2.0: + resolution: {integrity: sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==} + engines: {node: '>= 8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.10.1: + resolution: {integrity: sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==} + + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + regexpu-core@2.0.0: + resolution: {integrity: sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==} + + regjsgen@0.2.0: + resolution: {integrity: sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==} + + regjsparser@0.1.5: + resolution: {integrity: sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==} + hasBin: true + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + repeating@2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} + + req-cwd@2.0.0: + resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: '>=4'} + + req-from@2.0.0: + resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: '>=4'} + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@1.2.1: + resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@1.0.2: + resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} + + responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + ripemd160-min@0.0.6: + resolution: {integrity: sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==} + engines: {node: '>=8'} + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rust-verkle-wasm@0.0.1: + resolution: {integrity: sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==} + + rustbn-wasm@0.2.0: + resolution: {integrity: sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==} + + rustbn.js@0.2.0: + resolution: {integrity: sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==} + + safe-array-concat@1.1.0: + resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-event-emitter@1.0.1: + resolution: {integrity: sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==} + deprecated: Renamed to @metamask/safe-event-emitter + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sc-istanbul@0.4.6: + resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + hasBin: true + + scrypt-js@2.0.4: + resolution: {integrity: sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + scrypt@https://codeload.github.com/barrysteyn/node-scrypt/tar.gz/fb60a8d3c158fe115a624b5ffa7480f3a24b03fb: + resolution: {tarball: https://codeload.github.com/barrysteyn/node-scrypt/tar.gz/fb60a8d3c158fe115a624b5ffa7480f3a24b03fb} + version: 6.0.3 + engines: {node: '>= 0.10'} + + scryptsy@1.2.1: + resolution: {integrity: sha512-aldIRgMozSJ/Gl6K6qmJZysRP82lz83Wb42vl4PWN8SaLFHIaOzLPc9nUUW2jQN88CuGm5q5HefJ9jZ3nWSmTw==} + + secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + + seedrandom@3.0.1: + resolution: {integrity: sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg==} + + semaphore@1.1.0: + resolution: {integrity: sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==} + engines: {node: '>=0.8.0'} + + semver@5.4.1: + resolution: {integrity: sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==} + hasBin: true + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + sentence-case@2.1.1: + resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + servify@0.1.12: + resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==} + engines: {node: '>=6'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-immediate-shim@1.0.1: + resolution: {integrity: sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==} + engines: {node: '>=0.10.0'} + + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + + setimmediate@1.0.4: + resolution: {integrity: sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + + sha3@2.1.4: + resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@2.8.2: + resolution: {integrity: sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==} + + slash@1.0.0: + resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} + engines: {node: '>=0.10.0'} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + snake-case@2.1.0: + resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} + + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + + solc@0.4.26: + resolution: {integrity: sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==} + hasBin: true + + solc@0.6.12: + resolution: {integrity: sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g==} + engines: {node: '>=8.0.0'} + hasBin: true + + solc@0.7.3: + resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} + engines: {node: '>=8.0.0'} + hasBin: true + + solhint@3.4.1: + resolution: {integrity: sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg==} + hasBin: true + + solidity-coverage@0.8.3: + resolution: {integrity: sha512-hbcNgj5z8zzgTlnp4F0pXiqj1v5ua8P4DH5i9cWOBtFPfUuIohLoXu5WiAixexWmpKVjyxXqupnu/mPb4IGr7Q==} + hasBin: true + peerDependencies: + hardhat: ^2.11.0 + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-support@0.4.18: + resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} + + source-map-support@0.5.12: + resolution: {integrity: sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stream-to-pull-stream@1.7.3: + resolution: {integrity: sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==} + + strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + + string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + + string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha1-DF8VX+8RUTczd96du1iNoFUA428=} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-indent@2.0.0: + resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} + engines: {node: '>=4'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@6.0.0: + resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==} + engines: {node: '>=6'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swap-case@1.1.2: + resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + + swarm-js@0.1.42: + resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + + sync-request@6.1.0: + resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: '>=8.0.0'} + + sync-rpc@1.3.6: + resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + + table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + + tape@4.17.0: + resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==} + hasBin: true + + tar@4.4.19: + resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} + engines: {node: '>=4.5'} + + test-value@2.1.0: + resolution: {integrity: sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==} + engines: {node: '>=0.10.0'} + + testrpc@0.0.1: + resolution: {integrity: sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==} + deprecated: testrpc has been renamed to ganache-cli, please use this package from now on. + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + then-request@6.0.2: + resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: '>=6.0.0'} + + threads@1.7.0: + resolution: {integrity: sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + + tiny-worker@2.3.0: + resolution: {integrity: sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==} + + title-case@2.1.1: + resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmp@0.1.0: + resolution: {integrity: sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==} + engines: {node: '>=6'} + + to-fast-properties@1.0.3: + resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} + engines: {node: '>=0.10.0'} + + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-readable-stream@1.0.0: + resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} + engines: {node: '>=6'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-right@1.0.1: + resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} + engines: {node: '>=0.10.0'} + + ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + + ts-essentials@1.0.4: + resolution: {integrity: sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==} + + ts-essentials@6.0.7: + resolution: {integrity: sha512-2E4HIIj4tQJlIHuATRHayv0EfMGK3ris/GRk1E3CFnsZzeNV+hUmelbaTZHLtXaZppM5oLhHRtO04gINC4Jusw==} + peerDependencies: + typescript: '>=3.7.0' + + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + + ts-generator@0.1.1: + resolution: {integrity: sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ==} + hasBin: true + + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + tsort@0.0.1: + resolution: {integrity: sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + + type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + + typechain@3.0.0: + resolution: {integrity: sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==} + hasBin: true + + typechain@8.3.2: + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.5: + resolution: {integrity: sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + engines: {node: '>=4.2.0'} + hasBin: true + + typewise-core@1.2.0: + resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} + + typewise@1.0.3: + resolution: {integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==} + + typewiselite@1.0.0: + resolution: {integrity: sha512-J9alhjVHupW3Wfz6qFRGgQw0N3gr8hOkw6zm7FZ6UR1Cse/oD9/JVok7DNE9TT9IbciDHX2Ex9+ksE6cRmtymw==} + + typical@2.6.1: + resolution: {integrity: sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==} + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + ultron@1.1.1: + resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==} + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + underscore@1.13.6: + resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} + + underscore@1.9.1: + resolution: {integrity: sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.3: + resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} + engines: {node: '>=14.0'} + + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unorm@1.6.0: + resolution: {integrity: sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==} + engines: {node: '>= 0.4.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + + upper-case-first@1.1.2: + resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} + + upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + url-parse-lax@3.0.0: + resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} + engines: {node: '>=4'} + + url-set-query@1.0.0: + resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==} + + url@0.11.3: + resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util.promisify@1.1.2: + resolution: {integrity: sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + engines: {node: '>= 0.4.0'} + + uuid@2.0.1: + resolution: {integrity: sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + + uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-compile-cache@2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + verror@1.10.0: + resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} + engines: {'0': node >=0.6.0} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web3-bzz@1.10.0: + resolution: {integrity: sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==} + engines: {node: '>=8.0.0'} + + web3-bzz@1.10.4: + resolution: {integrity: sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==} + engines: {node: '>=8.0.0'} + + web3-bzz@1.2.11: + resolution: {integrity: sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg==} + engines: {node: '>=8.0.0'} + + web3-core-helpers@1.10.0: + resolution: {integrity: sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==} + engines: {node: '>=8.0.0'} + + web3-core-helpers@1.10.4: + resolution: {integrity: sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==} + engines: {node: '>=8.0.0'} + + web3-core-helpers@1.2.11: + resolution: {integrity: sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A==} + engines: {node: '>=8.0.0'} + + web3-core-method@1.10.0: + resolution: {integrity: sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==} + engines: {node: '>=8.0.0'} + + web3-core-method@1.10.4: + resolution: {integrity: sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==} + engines: {node: '>=8.0.0'} + + web3-core-method@1.2.11: + resolution: {integrity: sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw==} + engines: {node: '>=8.0.0'} + + web3-core-promievent@1.10.0: + resolution: {integrity: sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==} + engines: {node: '>=8.0.0'} + + web3-core-promievent@1.10.4: + resolution: {integrity: sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==} + engines: {node: '>=8.0.0'} + + web3-core-promievent@1.2.11: + resolution: {integrity: sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA==} + engines: {node: '>=8.0.0'} + + web3-core-requestmanager@1.10.0: + resolution: {integrity: sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==} + engines: {node: '>=8.0.0'} + + web3-core-requestmanager@1.10.4: + resolution: {integrity: sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==} + engines: {node: '>=8.0.0'} + + web3-core-requestmanager@1.2.11: + resolution: {integrity: sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA==} + engines: {node: '>=8.0.0'} + + web3-core-subscriptions@1.10.0: + resolution: {integrity: sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==} + engines: {node: '>=8.0.0'} + + web3-core-subscriptions@1.10.4: + resolution: {integrity: sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==} + engines: {node: '>=8.0.0'} + + web3-core-subscriptions@1.2.11: + resolution: {integrity: sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg==} + engines: {node: '>=8.0.0'} + + web3-core@1.10.0: + resolution: {integrity: sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==} + engines: {node: '>=8.0.0'} + + web3-core@1.10.4: + resolution: {integrity: sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==} + engines: {node: '>=8.0.0'} + + web3-core@1.2.11: + resolution: {integrity: sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ==} + engines: {node: '>=8.0.0'} + + web3-eth-abi@1.10.0: + resolution: {integrity: sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==} + engines: {node: '>=8.0.0'} + + web3-eth-abi@1.10.4: + resolution: {integrity: sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==} + engines: {node: '>=8.0.0'} + + web3-eth-abi@1.2.11: + resolution: {integrity: sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg==} + engines: {node: '>=8.0.0'} + + web3-eth-accounts@1.10.0: + resolution: {integrity: sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==} + engines: {node: '>=8.0.0'} + + web3-eth-accounts@1.10.4: + resolution: {integrity: sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==} + engines: {node: '>=8.0.0'} + + web3-eth-accounts@1.2.11: + resolution: {integrity: sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw==} + engines: {node: '>=8.0.0'} + + web3-eth-contract@1.10.0: + resolution: {integrity: sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==} + engines: {node: '>=8.0.0'} + + web3-eth-contract@1.10.4: + resolution: {integrity: sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==} + engines: {node: '>=8.0.0'} + + web3-eth-contract@1.2.11: + resolution: {integrity: sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow==} + engines: {node: '>=8.0.0'} + + web3-eth-ens@1.10.0: + resolution: {integrity: sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==} + engines: {node: '>=8.0.0'} + + web3-eth-ens@1.10.4: + resolution: {integrity: sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==} + engines: {node: '>=8.0.0'} + + web3-eth-ens@1.2.11: + resolution: {integrity: sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA==} + engines: {node: '>=8.0.0'} + + web3-eth-iban@1.10.0: + resolution: {integrity: sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==} + engines: {node: '>=8.0.0'} + + web3-eth-iban@1.10.4: + resolution: {integrity: sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==} + engines: {node: '>=8.0.0'} + + web3-eth-iban@1.2.11: + resolution: {integrity: sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ==} + engines: {node: '>=8.0.0'} + + web3-eth-personal@1.10.0: + resolution: {integrity: sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==} + engines: {node: '>=8.0.0'} + + web3-eth-personal@1.10.4: + resolution: {integrity: sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==} + engines: {node: '>=8.0.0'} + + web3-eth-personal@1.2.11: + resolution: {integrity: sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw==} + engines: {node: '>=8.0.0'} + + web3-eth@1.10.0: + resolution: {integrity: sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==} + engines: {node: '>=8.0.0'} + + web3-eth@1.10.4: + resolution: {integrity: sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==} + engines: {node: '>=8.0.0'} + + web3-eth@1.2.11: + resolution: {integrity: sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ==} + engines: {node: '>=8.0.0'} + + web3-net@1.10.0: + resolution: {integrity: sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==} + engines: {node: '>=8.0.0'} + + web3-net@1.10.4: + resolution: {integrity: sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==} + engines: {node: '>=8.0.0'} + + web3-net@1.2.11: + resolution: {integrity: sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg==} + engines: {node: '>=8.0.0'} + + web3-provider-engine@14.2.1: + resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} + + web3-providers-http@1.10.0: + resolution: {integrity: sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==} + engines: {node: '>=8.0.0'} + + web3-providers-http@1.10.4: + resolution: {integrity: sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==} + engines: {node: '>=8.0.0'} + + web3-providers-http@1.2.11: + resolution: {integrity: sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==} + engines: {node: '>=8.0.0'} + + web3-providers-ipc@1.10.0: + resolution: {integrity: sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==} + engines: {node: '>=8.0.0'} + + web3-providers-ipc@1.10.4: + resolution: {integrity: sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==} + engines: {node: '>=8.0.0'} + + web3-providers-ipc@1.2.11: + resolution: {integrity: sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ==} + engines: {node: '>=8.0.0'} + + web3-providers-ws@1.10.0: + resolution: {integrity: sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==} + engines: {node: '>=8.0.0'} + + web3-providers-ws@1.10.4: + resolution: {integrity: sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==} + engines: {node: '>=8.0.0'} + + web3-providers-ws@1.2.11: + resolution: {integrity: sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg==} + engines: {node: '>=8.0.0'} + + web3-shh@1.10.0: + resolution: {integrity: sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==} + engines: {node: '>=8.0.0'} + + web3-shh@1.10.4: + resolution: {integrity: sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==} + engines: {node: '>=8.0.0'} + + web3-shh@1.2.11: + resolution: {integrity: sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==} + engines: {node: '>=8.0.0'} + + web3-utils@1.10.0: + resolution: {integrity: sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==} + engines: {node: '>=8.0.0'} + + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + + web3-utils@1.2.11: + resolution: {integrity: sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ==} + engines: {node: '>=8.0.0'} + + web3@1.10.0: + resolution: {integrity: sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==} + engines: {node: '>=8.0.0'} + + web3@1.10.4: + resolution: {integrity: sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==} + engines: {node: '>=8.0.0'} + + web3@1.2.11: + resolution: {integrity: sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ==} + engines: {node: '>=8.0.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + websocket@1.0.32: + resolution: {integrity: sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q==} + engines: {node: '>=4.0.0'} + + websocket@1.0.34: + resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} + engines: {node: '>=4.0.0'} + + whatwg-fetch@2.0.4: + resolution: {integrity: sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.14: + resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wide-align@1.1.3: + resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==} + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + window-size@0.2.0: + resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: '>= 0.10.0'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + + workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + + wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + + wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@3.3.3: + resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@5.2.3: + resolution: {integrity: sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xhr-request-promise@0.1.3: + resolution: {integrity: sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==} + + xhr-request@1.1.0: + resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==} + + xhr2-cookies@1.1.0: + resolution: {integrity: sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=} + + xhr@2.6.0: + resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} + + xmlhttprequest@1.8.0: + resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} + engines: {node: '>=0.4.0'} + + xtend@2.1.2: + resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} + engines: {node: '>=0.4'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + + yargs-parser@2.4.1: + resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + + yargs-unparser@1.6.0: + resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} + engines: {node: '>=6'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@4.8.1: + resolution: {integrity: sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==} + + yesno@0.3.1: + resolution: {integrity: sha512-7RbCXegyu6DykWPWU0YEtW8gFJH8KBL2d5l2fqB0XpkH0Y9rk59YSSWpzEv7yNJBGAouPc67h3kkq0CZkpBdFw==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adraffy/ens-normalize@1.10.1': {} + + '@babel/code-frame@7.12.11': + dependencies: + '@babel/highlight': 7.23.4 + + '@babel/code-frame@7.23.5': + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/highlight@7.23.4': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/runtime@7.23.9': + dependencies: + regenerator-runtime: 0.14.1 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@ensdomains/address-encoder@0.1.9': + dependencies: + bech32: 1.1.4 + blakejs: 1.2.1 + bn.js: 4.12.0 + bs58: 4.0.1 + crypto-addr-codec: 0.1.8 + nano-base32: 1.0.1 + ripemd160: 2.0.2 + + '@ensdomains/ens@0.4.5': + dependencies: + bluebird: 3.7.2 + eth-ens-namehash: 2.0.8 + solc: 0.4.26 + testrpc: 0.0.1 + web3-utils: 1.10.4 + + '@ensdomains/ensjs@2.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.23.9 + '@ensdomains/address-encoder': 0.1.9 + '@ensdomains/ens': 0.4.5 + '@ensdomains/resolver': 0.2.4 + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + js-sha3: 0.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ensdomains/resolver@0.2.4': {} + + '@eslint/eslintrc@0.4.3': + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + espree: 7.3.1 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@ethereum-waffle/chai@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@ethereum-waffle/provider': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@ethereum-waffle/compiler@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.7.4)(utf-8-validate@5.0.10)': + dependencies: + '@resolver-engine/imports': 0.3.3 + '@resolver-engine/imports-fs': 0.3.3 + '@typechain/ethers-v5': 2.0.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@4.7.4)) + '@types/mkdirp': 0.5.2 + '@types/node-fetch': 2.6.11 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + mkdirp: 0.5.6 + node-fetch: 2.7.0(encoding@0.1.13) + solc: 0.6.12 + ts-generator: 0.1.1 + typechain: 3.0.0(typescript@4.7.4) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + + '@ethereum-waffle/ens@3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@ensdomains/ens': 0.4.5 + '@ensdomains/resolver': 0.2.4 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethereum-waffle/mock-contract@3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abi': 5.7.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethereum-waffle/provider@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + '@ethereum-waffle/ens': 3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ganache-core: 2.13.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + patch-package: 6.5.1 + postinstall-postinstall: 2.1.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@ethereumjs/common@2.5.0': + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + + '@ethereumjs/common@2.6.5': + dependencies: + crc-32: 1.2.2 + ethereumjs-util: 7.1.5 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/tx@3.3.2': + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + + '@ethereumjs/tx@3.5.2': + dependencies: + '@ethereumjs/common': 2.6.5 + ethereumjs-util: 7.1.5 + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.1.3 + micro-ftch: 0.3.1 + + '@ethersproject/abi@5.0.0-beta.153': + 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 + optional: true + + '@ethersproject/abi@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/abstract-provider@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + + '@ethersproject/abstract-signer@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/address@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/base64@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + + '@ethersproject/basex@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/bignumber@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/constants@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + + '@ethersproject/contracts@5.7.0': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + + '@ethersproject/hash@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/hdnode@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/json-wallets@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + '@ethersproject/keccak256@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.7.0': {} + + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/pbkdf2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + + '@ethersproject/properties@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/rlp@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/sha2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + + '@ethersproject/solidity@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/strings@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/transactions@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + + '@ethersproject/units@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/wallet@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/web@5.7.1': + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/wordlists@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@fastify/busboy@2.1.0': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@ljharb/resumer@0.0.1': + dependencies: + '@ljharb/through': 2.3.12 + + '@ljharb/through@2.3.12': + dependencies: + call-bind: 1.0.7 + + '@metamask/eth-sig-util@4.0.1': + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/curves@1.3.0': + dependencies: + '@noble/hashes': 1.3.3 + + '@noble/hashes@1.2.0': {} + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.3.3': {} + + '@noble/secp256k1@1.7.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@nomicfoundation/ethereumjs-block@5.0.4': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-blockchain@7.0.4': + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.4 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-ethash': 3.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + lru-cache: 10.2.0 + transitivePeerDependencies: + - c-kzg + - supports-color + + '@nomicfoundation/ethereumjs-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-ethash@3.0.4': + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + bigint-crypto-utils: 3.3.0 + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-evm@2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-statemanager': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@types/debug': 4.1.12 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + rustbn-wasm: 0.2.0 + transitivePeerDependencies: + - '@nomicfoundation/ethereumjs-verkle' + - c-kzg + - supports-color + + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + + '@nomicfoundation/ethereumjs-statemanager@2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + js-sdsl: 4.4.2 + lru-cache: 10.2.0 + optionalDependencies: + '@nomicfoundation/ethereumjs-verkle': 0.0.2 + transitivePeerDependencies: + - c-kzg + - supports-color + + '@nomicfoundation/ethereumjs-trie@6.0.4': + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@types/readable-stream': 2.3.15 + ethereum-cryptography: 0.1.3 + lru-cache: 10.2.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-tx@5.0.4': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/ethereumjs-util@9.0.4': + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/ethereumjs-verkle@0.0.2': + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + lru-cache: 10.2.0 + rust-verkle-wasm: 0.0.1 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-vm@7.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2)': + dependencies: + '@nomicfoundation/ethereumjs-block': 5.0.4 + '@nomicfoundation/ethereumjs-blockchain': 7.0.4 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-evm': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-statemanager': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + debug: 4.3.4(supports-color@8.1.1) + ethereum-cryptography: 0.1.3 + transitivePeerDependencies: + - '@nomicfoundation/ethereumjs-verkle' + - c-kzg + - supports-color + + '@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))': + dependencies: + debug: 4.3.4(supports-color@8.1.1) + ethers: 6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.4(supports-color@8.1.1) + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10) + lodash.clonedeep: 4.5.0 + semver: 6.3.1 + table: 6.8.1 + undici: 5.28.3 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.1': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 + + '@nomiclabs/hardhat-truffle5@2.0.7(@nomiclabs/hardhat-web3@2.0.0(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(encoding@0.1.13)(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core-promievent@1.10.4)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + dependencies: + '@nomiclabs/hardhat-web3': 2.0.0(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@nomiclabs/truffle-contract': 4.5.10(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core-promievent@1.10.4)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@types/chai': 4.3.16 + chai: 4.3.4 + ethereumjs-util: 7.1.5 + fs-extra: 7.0.1 + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10) + web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + - web3-core-helpers + - web3-core-promievent + - web3-eth-abi + - web3-utils + + '@nomiclabs/hardhat-web3@2.0.0(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + dependencies: + '@types/bignumber.js': 5.0.0 + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10) + web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + + '@nomiclabs/truffle-contract@4.5.10(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)(web3-core-helpers@1.10.4)(web3-core-promievent@1.10.4)(web3-eth-abi@1.10.4)(web3-utils@1.10.4)(web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))': + dependencies: + '@ensdomains/ensjs': 2.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@truffle/blockchain-utils': 0.1.9 + '@truffle/contract-schema': 3.4.16 + '@truffle/debug-utils': 6.0.57 + '@truffle/error': 0.1.1 + '@truffle/interface-adapter': 0.5.37(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + bignumber.js: 7.2.1 + ethereum-ens: 0.8.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + ethers: 4.0.49 + source-map-support: 0.5.21 + web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-eth-abi: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@resolver-engine/core@0.3.3': + dependencies: + debug: 3.2.7 + is-url: 1.2.4 + request: 2.88.2 + transitivePeerDependencies: + - supports-color + + '@resolver-engine/fs@0.3.3': + dependencies: + '@resolver-engine/core': 0.3.3 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + + '@resolver-engine/imports-fs@0.3.3': + dependencies: + '@resolver-engine/fs': 0.3.3 + '@resolver-engine/imports': 0.3.3 + debug: 3.2.7 + transitivePeerDependencies: + - supports-color + + '@resolver-engine/imports@0.3.3': + dependencies: + '@resolver-engine/core': 0.3.3 + debug: 3.2.7 + hosted-git-info: 2.8.9 + path-browserify: 1.0.1 + url: 0.11.3 + transitivePeerDependencies: + - supports-color + + '@scure/base@1.1.5': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.5 + + '@scure/bip32@1.3.3': + dependencies: + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 + + '@scure/bip39@1.1.1': + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.5 + + '@scure/bip39@1.2.2': + dependencies: + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.5 + + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sindresorhus/is@0.14.0': + optional: true + + '@sindresorhus/is@4.6.0': {} + + '@solidity-parser/parser@0.14.5': + dependencies: + antlr4ts: 0.5.0-alpha.4 + + '@solidity-parser/parser@0.16.2': + dependencies: + antlr4ts: 0.5.0-alpha.4 + + '@szmarczak/http-timer@1.1.2': + dependencies: + defer-to-connect: 1.1.3 + optional: true + + '@szmarczak/http-timer@4.0.6': + dependencies: + defer-to-connect: 2.0.1 + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@tenderly/hardhat-tenderly@1.0.11(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))': + dependencies: + axios: 0.21.4 + fs-extra: 9.1.0 + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10) + js-yaml: 3.14.1 + transitivePeerDependencies: + - debug + + '@truffle/abi-utils@1.0.3': + dependencies: + change-case: 3.0.2 + fast-check: 3.1.1 + web3-utils: 1.10.0 + + '@truffle/blockchain-utils@0.1.9': {} + + '@truffle/codec@0.17.3': + dependencies: + '@truffle/abi-utils': 1.0.3 + '@truffle/compile-common': 0.9.8 + big.js: 6.2.1 + bn.js: 5.2.1 + cbor: 5.2.0 + debug: 4.3.4(supports-color@8.1.1) + lodash: 4.17.21 + semver: 7.6.0 + utf8: 3.0.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - supports-color + + '@truffle/compile-common@0.9.8': + dependencies: + '@truffle/error': 0.2.2 + colors: 1.4.0 + + '@truffle/contract-schema@3.4.16': + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@truffle/debug-utils@6.0.57': + dependencies: + '@truffle/codec': 0.17.3 + '@trufflesuite/chromafi': 3.0.0 + bn.js: 5.2.1 + chalk: 2.4.2 + debug: 4.3.4(supports-color@8.1.1) + highlightjs-solidity: 2.0.6 + transitivePeerDependencies: + - supports-color + + '@truffle/error@0.1.1': {} + + '@truffle/error@0.2.2': {} + + '@truffle/interface-adapter@0.5.37(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': + dependencies: + bn.js: 5.2.1 + ethers: 4.0.49 + web3: 1.10.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@trufflesuite/chromafi@3.0.0': + dependencies: + camelcase: 4.1.0 + chalk: 2.4.2 + cheerio: 1.0.0-rc.12 + detect-indent: 5.0.0 + highlight.js: 10.7.3 + lodash.merge: 4.6.2 + strip-ansi: 4.0.0 + strip-indent: 2.0.0 + + '@tsconfig/node10@1.0.9': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@typechain/ethers-v5@2.0.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@4.7.4))': + dependencies: + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + typechain: 3.0.0(typescript@4.7.4) + + '@typechain/ethers-v6@0.5.1(ethers@6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@4.7.4))(typescript@4.7.4)': + dependencies: + ethers: 6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@4.7.4) + typechain: 8.3.2(typescript@4.7.4) + typescript: 4.7.4 + + '@types/bignumber.js@5.0.0': + dependencies: + bignumber.js: 9.1.2 + + '@types/bn.js@4.11.6': + dependencies: + '@types/node': 20.11.20 + + '@types/bn.js@5.1.5': + dependencies: + '@types/node': 20.11.20 + + '@types/cacheable-request@6.0.3': + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 20.11.20 + '@types/responselike': 1.0.3 + + '@types/chai-as-promised@7.1.0': + dependencies: + '@types/chai': 4.3.16 + + '@types/chai-string@1.4.1': + dependencies: + '@types/chai': 4.3.16 + + '@types/chai@4.3.16': {} + + '@types/concat-stream@1.6.1': + dependencies: + '@types/node': 20.11.20 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/form-data@0.0.33': + dependencies: + '@types/node': 20.11.20 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.11.20 + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.11.20 + + '@types/lru-cache@5.1.1': {} + + '@types/minimatch@5.1.2': {} + + '@types/mkdirp@0.5.2': + dependencies: + '@types/node': 20.11.20 + + '@types/mocha@8.2.1': {} + + '@types/ms@0.7.34': {} + + '@types/node-fetch@2.6.11': + dependencies: + '@types/node': 20.11.20 + form-data: 4.0.0 + + '@types/node@10.17.60': {} + + '@types/node@12.20.55': {} + + '@types/node@18.15.13': {} + + '@types/node@20.11.20': + dependencies: + undici-types: 5.26.5 + + '@types/node@8.10.66': {} + + '@types/pbkdf2@3.1.2': + dependencies: + '@types/node': 20.11.20 + + '@types/prettier@2.7.3': {} + + '@types/qs@6.9.11': {} + + '@types/readable-stream@2.3.15': + dependencies: + '@types/node': 20.11.20 + safe-buffer: 5.1.2 + + '@types/resolve@0.0.8': + dependencies: + '@types/node': 20.11.20 + + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.11.20 + + '@types/secp256k1@4.0.6': + dependencies: + '@types/node': 20.11.20 + + '@typescript-eslint/eslint-plugin@4.18.0(@typescript-eslint/parser@4.18.0(eslint@7.22.0)(typescript@4.7.4))(eslint@7.22.0)(typescript@4.7.4)': + dependencies: + '@typescript-eslint/experimental-utils': 4.18.0(eslint@7.22.0)(typescript@4.7.4) + '@typescript-eslint/parser': 4.18.0(eslint@7.22.0)(typescript@4.7.4) + '@typescript-eslint/scope-manager': 4.18.0 + debug: 4.3.4(supports-color@8.1.1) + eslint: 7.22.0 + functional-red-black-tree: 1.0.1 + lodash: 4.17.21 + regexpp: 3.2.0 + semver: 7.6.0 + tsutils: 3.21.0(typescript@4.7.4) + optionalDependencies: + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/experimental-utils@4.18.0(eslint@7.22.0)(typescript@4.7.4)': + dependencies: + '@types/json-schema': 7.0.15 + '@typescript-eslint/scope-manager': 4.18.0 + '@typescript-eslint/types': 4.18.0 + '@typescript-eslint/typescript-estree': 4.18.0(typescript@4.7.4) + eslint: 7.22.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@4.18.0(eslint@7.22.0)(typescript@4.7.4)': + dependencies: + '@typescript-eslint/scope-manager': 4.18.0 + '@typescript-eslint/types': 4.18.0 + '@typescript-eslint/typescript-estree': 4.18.0(typescript@4.7.4) + debug: 4.3.4(supports-color@8.1.1) + eslint: 7.22.0 + optionalDependencies: + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@4.18.0': + dependencies: + '@typescript-eslint/types': 4.18.0 + '@typescript-eslint/visitor-keys': 4.18.0 + + '@typescript-eslint/types@4.18.0': {} + + '@typescript-eslint/typescript-estree@4.18.0(typescript@4.7.4)': + dependencies: + '@typescript-eslint/types': 4.18.0 + '@typescript-eslint/visitor-keys': 4.18.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.0 + tsutils: 3.21.0(typescript@4.7.4) + optionalDependencies: + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@4.18.0': + dependencies: + '@typescript-eslint/types': 4.18.0 + eslint-visitor-keys: 2.1.0 + + '@yarnpkg/lockfile@1.1.0': {} + + abbrev@1.0.9: {} + + abortcontroller-polyfill@1.7.5: {} + + abstract-leveldown@2.6.3: + dependencies: + xtend: 4.0.2 + + abstract-leveldown@2.7.2: + dependencies: + xtend: 4.0.2 + + abstract-leveldown@3.0.0: + dependencies: + xtend: 4.0.2 + + abstract-leveldown@5.0.0: + dependencies: + xtend: 4.0.2 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@7.4.1): + dependencies: + acorn: 7.4.1 + + acorn-walk@8.3.2: {} + + acorn@7.4.1: {} + + acorn@8.11.3: {} + + address@1.2.2: {} + + adm-zip@0.4.16: {} + + aes-js@3.0.0: {} + + aes-js@3.1.2: + optional: true + + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + amdefine@1.0.1: + optional: true + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@3.2.3: {} + + ansi-colors@4.1.1: {} + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@2.1.1: {} + + ansi-regex@3.0.1: {} + + ansi-regex@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@2.2.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + antlr4@4.13.1: {} + + antlr4ts@0.5.0-alpha.4: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + + array-back@1.0.4: + dependencies: + typical: 2.6.1 + + array-back@2.0.0: + dependencies: + typical: 2.6.1 + + array-back@3.1.0: {} + + array-back@4.0.2: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-flatten@1.1.1: {} + + array-includes@3.1.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array-uniq@1.0.3: {} + + array-unique@0.3.2: {} + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-shim-unscopables: 1.0.2 + + array.prototype.reduce@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + asap@2.0.6: {} + + asn1.js@5.4.1: + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + safer-buffer: 2.1.2 + optional: true + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + assertion-error@1.1.0: {} + + assign-symbols@1.0.0: {} + + ast-parents@0.0.1: {} + + astral-regex@2.0.0: {} + + async-eventemitter@0.2.4: + dependencies: + async: 2.6.2 + + async-limiter@1.0.1: {} + + async@1.5.2: {} + + async@2.6.2: + dependencies: + lodash: 4.17.21 + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + atob@2.1.2: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + aws-sign2@0.7.0: {} + + aws4@1.12.0: {} + + axios@0.21.4: + dependencies: + follow-redirects: 1.15.5(debug@4.3.4) + transitivePeerDependencies: + - debug + + axios@1.6.7: + dependencies: + follow-redirects: 1.15.5(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-code-frame@6.26.0: + dependencies: + chalk: 1.1.3 + esutils: 2.0.3 + js-tokens: 3.0.2 + + babel-core@6.26.3: + dependencies: + babel-code-frame: 6.26.0 + babel-generator: 6.26.1 + babel-helpers: 6.24.1 + babel-messages: 6.23.0 + babel-register: 6.26.0 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + convert-source-map: 1.9.0 + debug: 2.6.9 + json5: 0.5.1 + lodash: 4.17.21 + minimatch: 3.1.2 + path-is-absolute: 1.0.1 + private: 0.1.8 + slash: 1.0.0 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + + babel-generator@6.26.1: + dependencies: + babel-messages: 6.23.0 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + detect-indent: 4.0.0 + jsesc: 1.3.0 + lodash: 4.17.21 + source-map: 0.5.7 + trim-right: 1.0.1 + + babel-helper-builder-binary-assignment-operator-visitor@6.24.1: + dependencies: + babel-helper-explode-assignable-expression: 6.24.1 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-helper-call-delegate@6.24.1: + dependencies: + babel-helper-hoist-variables: 6.24.1 + babel-runtime: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-helper-define-map@6.26.0: + dependencies: + babel-helper-function-name: 6.24.1 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + + babel-helper-explode-assignable-expression@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-helper-function-name@6.24.1: + dependencies: + babel-helper-get-function-arity: 6.24.1 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-helper-get-function-arity@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + + babel-helper-hoist-variables@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + + babel-helper-optimise-call-expression@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + + babel-helper-regex@6.26.0: + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + lodash: 4.17.21 + + babel-helper-remap-async-to-generator@6.24.1: + dependencies: + babel-helper-function-name: 6.24.1 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-helper-replace-supers@6.24.1: + dependencies: + babel-helper-optimise-call-expression: 6.24.1 + babel-messages: 6.23.0 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-helpers@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-template: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-messages@6.23.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-check-es2015-constants@6.22.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-syntax-async-functions@6.13.0: {} + + babel-plugin-syntax-exponentiation-operator@6.13.0: {} + + babel-plugin-syntax-trailing-function-commas@6.22.0: {} + + babel-plugin-transform-async-to-generator@6.24.1: + dependencies: + babel-helper-remap-async-to-generator: 6.24.1 + babel-plugin-syntax-async-functions: 6.13.0 + babel-runtime: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-arrow-functions@6.22.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-transform-es2015-block-scoped-functions@6.22.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-transform-es2015-block-scoping@6.26.0: + dependencies: + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-classes@6.24.1: + dependencies: + babel-helper-define-map: 6.26.0 + babel-helper-function-name: 6.24.1 + babel-helper-optimise-call-expression: 6.24.1 + babel-helper-replace-supers: 6.24.1 + babel-messages: 6.23.0 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-computed-properties@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-template: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-destructuring@6.23.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-transform-es2015-duplicate-keys@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + + babel-plugin-transform-es2015-for-of@6.23.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-transform-es2015-function-name@6.24.1: + dependencies: + babel-helper-function-name: 6.24.1 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-literals@6.22.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-transform-es2015-modules-amd@6.24.1: + dependencies: + babel-plugin-transform-es2015-modules-commonjs: 6.26.2 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-modules-commonjs@6.26.2: + dependencies: + babel-plugin-transform-strict-mode: 6.24.1 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-modules-systemjs@6.24.1: + dependencies: + babel-helper-hoist-variables: 6.24.1 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-modules-umd@6.24.1: + dependencies: + babel-plugin-transform-es2015-modules-amd: 6.24.1 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-object-super@6.24.1: + dependencies: + babel-helper-replace-supers: 6.24.1 + babel-runtime: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-parameters@6.24.1: + dependencies: + babel-helper-call-delegate: 6.24.1 + babel-helper-get-function-arity: 6.24.1 + babel-runtime: 6.26.0 + babel-template: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-es2015-shorthand-properties@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + + babel-plugin-transform-es2015-spread@6.22.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-transform-es2015-sticky-regex@6.24.1: + dependencies: + babel-helper-regex: 6.26.0 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + + babel-plugin-transform-es2015-template-literals@6.22.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-transform-es2015-typeof-symbol@6.23.0: + dependencies: + babel-runtime: 6.26.0 + + babel-plugin-transform-es2015-unicode-regex@6.24.1: + dependencies: + babel-helper-regex: 6.26.0 + babel-runtime: 6.26.0 + regexpu-core: 2.0.0 + + babel-plugin-transform-exponentiation-operator@6.24.1: + dependencies: + babel-helper-builder-binary-assignment-operator-visitor: 6.24.1 + babel-plugin-syntax-exponentiation-operator: 6.13.0 + babel-runtime: 6.26.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-transform-regenerator@6.26.0: + dependencies: + regenerator-transform: 0.10.1 + + babel-plugin-transform-strict-mode@6.24.1: + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + + babel-preset-env@1.7.0: + dependencies: + babel-plugin-check-es2015-constants: 6.22.0 + babel-plugin-syntax-trailing-function-commas: 6.22.0 + babel-plugin-transform-async-to-generator: 6.24.1 + babel-plugin-transform-es2015-arrow-functions: 6.22.0 + babel-plugin-transform-es2015-block-scoped-functions: 6.22.0 + babel-plugin-transform-es2015-block-scoping: 6.26.0 + babel-plugin-transform-es2015-classes: 6.24.1 + babel-plugin-transform-es2015-computed-properties: 6.24.1 + babel-plugin-transform-es2015-destructuring: 6.23.0 + babel-plugin-transform-es2015-duplicate-keys: 6.24.1 + babel-plugin-transform-es2015-for-of: 6.23.0 + babel-plugin-transform-es2015-function-name: 6.24.1 + babel-plugin-transform-es2015-literals: 6.22.0 + babel-plugin-transform-es2015-modules-amd: 6.24.1 + babel-plugin-transform-es2015-modules-commonjs: 6.26.2 + babel-plugin-transform-es2015-modules-systemjs: 6.24.1 + babel-plugin-transform-es2015-modules-umd: 6.24.1 + babel-plugin-transform-es2015-object-super: 6.24.1 + babel-plugin-transform-es2015-parameters: 6.24.1 + babel-plugin-transform-es2015-shorthand-properties: 6.24.1 + babel-plugin-transform-es2015-spread: 6.22.0 + babel-plugin-transform-es2015-sticky-regex: 6.24.1 + babel-plugin-transform-es2015-template-literals: 6.22.0 + babel-plugin-transform-es2015-typeof-symbol: 6.23.0 + babel-plugin-transform-es2015-unicode-regex: 6.24.1 + babel-plugin-transform-exponentiation-operator: 6.24.1 + babel-plugin-transform-regenerator: 6.26.0 + browserslist: 3.2.8 + invariant: 2.2.4 + semver: 5.7.2 + transitivePeerDependencies: + - supports-color + + babel-register@6.26.0: + dependencies: + babel-core: 6.26.3 + babel-runtime: 6.26.0 + core-js: 2.6.12 + home-or-tmp: 2.0.0 + lodash: 4.17.21 + mkdirp: 0.5.6 + source-map-support: 0.4.18 + transitivePeerDependencies: + - supports-color + + babel-runtime@6.26.0: + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + + babel-template@6.26.0: + dependencies: + babel-runtime: 6.26.0 + babel-traverse: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + + babel-traverse@6.26.0: + dependencies: + babel-code-frame: 6.26.0 + babel-messages: 6.23.0 + babel-runtime: 6.26.0 + babel-types: 6.26.0 + babylon: 6.18.0 + debug: 2.6.9 + globals: 9.18.0 + invariant: 2.2.4 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + + babel-types@6.26.0: + dependencies: + babel-runtime: 6.26.0 + esutils: 2.0.3 + lodash: 4.17.21 + to-fast-properties: 1.0.3 + + babelify@7.3.0: + dependencies: + babel-core: 6.26.3 + object-assign: 4.1.1 + transitivePeerDependencies: + - supports-color + + babylon@6.18.0: {} + + backoff@2.5.0: + dependencies: + precond: 0.2.3 + + balanced-match@1.0.2: {} + + base-x@3.0.9: + dependencies: + safe-buffer: 5.2.1 + + base64-js@1.5.1: {} + + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + bech32@1.1.4: {} + + big-integer@1.6.36: {} + + big.js@6.2.1: {} + + bigint-crypto-utils@3.3.0: {} + + bignumber.js@7.2.1: {} + + bignumber.js@9.1.2: {} + + binary-extensions@2.2.0: {} + + bip39@2.5.0: + dependencies: + create-hash: 1.2.0 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + unorm: 1.6.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + blakejs@1.2.1: {} + + bluebird@3.7.2: {} + + bn-chai@1.0.1(chai@4.3.4): + dependencies: + chai: 4.3.4 + + bn.js@4.11.6: {} + + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + + body-parser@1.20.1: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + boolbase@1.0.0: {} + + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + brorand@1.1.0: {} + + browser-stdout@1.3.1: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserify-cipher@1.0.1: + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + optional: true + + browserify-des@1.0.2: + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + optional: true + + browserify-rsa@4.1.0: + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + optional: true + + browserify-sign@4.2.2: + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + inherits: 2.0.4 + parse-asn1: 5.1.6 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + optional: true + + browserslist@3.2.8: + dependencies: + caniuse-lite: 1.0.30001589 + electron-to-chromium: 1.4.682 + + bs58@4.0.1: + dependencies: + base-x: 3.0.9 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + buffer-from@1.1.2: {} + + buffer-to-arraybuffer@0.0.5: {} + + buffer-xor@1.0.3: {} + + buffer-xor@2.0.2: + dependencies: + safe-buffer: 5.2.1 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.8: + dependencies: + node-gyp-build: 4.8.0 + + bytes@3.1.2: {} + + bytewise-core@1.2.3: + dependencies: + typewise-core: 1.2.0 + + bytewise@1.1.0: + dependencies: + bytewise-core: 1.2.3 + typewise: 1.0.3 + + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + + cacheable-lookup@5.0.4: {} + + cacheable-lookup@6.1.0: {} + + cacheable-request@6.1.0: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.1 + responselike: 1.0.2 + optional: true + + cacheable-request@7.0.4: + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + + cachedown@1.0.0: + dependencies: + abstract-leveldown: 2.7.2 + lru-cache: 3.2.0 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 + + callsites@3.1.0: {} + + camel-case@3.0.0: + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + + camelcase@3.0.0: {} + + camelcase@4.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001589: {} + + caseless@0.12.0: {} + + cbor@5.2.0: + dependencies: + bignumber.js: 9.1.2 + nofilter: 1.0.4 + + cbor@8.1.0: + dependencies: + nofilter: 3.1.0 + + chai-as-promised@7.1.1(chai@4.3.4): + dependencies: + chai: 4.3.4 + check-error: 1.0.3 + + chai-bignumber@3.0.0: {} + + chai-shallow-deep-equal@1.4.6(chai@4.3.4): + dependencies: + chai: 4.3.4 + + chai-string@1.5.0(chai@4.3.4): + dependencies: + chai: 4.3.4 + + chai@4.3.4: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 3.0.1 + get-func-name: 2.0.2 + pathval: 1.1.1 + type-detect: 4.0.8 + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + change-case@3.0.2: + dependencies: + camel-case: 3.0.0 + constant-case: 2.0.0 + dot-case: 2.1.1 + header-case: 1.0.1 + is-lower-case: 1.1.3 + is-upper-case: 1.1.2 + lower-case: 1.1.4 + lower-case-first: 1.0.2 + no-case: 2.3.2 + param-case: 2.1.1 + pascal-case: 2.0.1 + path-case: 2.1.1 + sentence-case: 2.1.1 + snake-case: 2.1.0 + swap-case: 1.1.2 + title-case: 2.1.1 + upper-case: 1.1.3 + upper-case-first: 1.1.2 + + charenc@0.0.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + checkpoint-store@1.1.0: + dependencies: + functional-red-black-tree: 1.0.1 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + cheerio@1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + + child_process@1.0.2: {} + + chokidar@3.3.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.2.0 + optionalDependencies: + fsevents: 2.1.3 + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + ci-info@2.0.0: {} + + cids@0.7.5: + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + class-is@1.1.0: {} + + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-table3@0.5.1: + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + + cliui@3.2.0: + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-response@1.0.3: + dependencies: + mimic-response: 1.0.1 + + clone@1.0.4: {} + + clone@2.1.2: {} + + code-point-at@1.1.0: {} + + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colors@1.4.0: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-exists@1.2.9: {} + + command-line-args@4.0.7: + dependencies: + array-back: 2.0.0 + find-replace: 1.0.3 + typical: 2.6.1 + + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@6.1.3: + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + + commander@10.0.1: {} + + commander@3.0.2: {} + + component-emitter@1.3.1: {} + + concat-map@0.0.1: {} + + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + constant-case@2.0.0: + dependencies: + snake-case: 2.1.0 + upper-case: 1.1.3 + + contains-path@0.1.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-hash@2.5.2: + dependencies: + cids: 0.7.5 + multicodec: 0.5.7 + multihashes: 0.4.21 + + content-type@1.0.5: {} + + convert-source-map@1.9.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.4.2: {} + + cookie@0.5.0: {} + + cookiejar@2.1.4: + optional: true + + copy-descriptor@0.1.1: {} + + core-js-pure@3.36.0: {} + + core-js@2.6.12: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@8.3.6(typescript@4.7.4): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 4.7.4 + + crc-32@1.2.2: {} + + create-ecdh@4.0.4: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + optional: true + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + + cross-fetch@2.2.6(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + whatwg-fetch: 2.0.4 + transitivePeerDependencies: + - encoding + + cross-fetch@3.1.8(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + cross-fetch@4.0.0(encoding@0.1.13): + dependencies: + node-fetch: 2.7.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + + cross-spawn@6.0.5: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypt@0.0.2: {} + + crypto-addr-codec@0.1.8: + dependencies: + base-x: 3.0.9 + big-integer: 1.6.36 + blakejs: 1.2.1 + bs58: 4.0.1 + ripemd160-min: 0.0.6 + safe-buffer: 5.2.1 + sha3: 2.1.4 + + crypto-browserify@3.12.0: + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.2 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + optional: true + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-what@6.1.0: {} + + d@1.0.1: + dependencies: + es5-ext: 0.10.63 + type: 1.2.0 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + death@1.1.0: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.6(supports-color@6.0.0): + dependencies: + ms: 2.1.1 + optionalDependencies: + supports-color: 6.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.4(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + decamelize@1.2.0: {} + + decamelize@4.0.0: {} + + decode-uri-component@0.2.2: {} + + decompress-response@3.3.0: + dependencies: + mimic-response: 1.0.1 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-eql@3.0.1: + dependencies: + type-detect: 4.0.8 + + deep-equal@1.1.2: + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.5 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.2 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@1.1.3: + optional: true + + defer-to-connect@2.0.1: {} + + deferred-leveldown@1.2.2: + dependencies: + abstract-leveldown: 2.6.3 + + deferred-leveldown@4.0.2: + dependencies: + abstract-leveldown: 5.0.0 + inherits: 2.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + + defined@1.0.1: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + optional: true + + destroy@1.2.0: {} + + detect-indent@4.0.0: + dependencies: + repeating: 2.0.1 + + detect-indent@5.0.0: {} + + detect-port@1.5.1: + dependencies: + address: 1.2.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + diff@3.5.0: {} + + diff@4.0.2: {} + + diff@5.0.0: {} + + diffie-hellman@5.0.3: + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + optional: true + + difflib@0.2.4: + dependencies: + heap: 0.2.7 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@1.5.0: + dependencies: + esutils: 2.0.3 + isarray: 1.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + dom-walk@0.1.2: {} + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-case@2.1.1: + dependencies: + no-case: 2.3.2 + + dotenv@8.2.0: {} + + dotignore@0.1.2: + dependencies: + minimatch: 3.1.2 + + duplexer3@0.1.5: + optional: true + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + ee-first@1.1.1: {} + + electron-to-chromium@1.4.682: {} + + elliptic@6.5.4: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@7.0.3: {} + + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + + encoding-down@5.0.4: + dependencies: + abstract-leveldown: 5.0.0 + inherits: 2.0.4 + level-codec: 9.0.2 + level-errors: 2.0.1 + xtend: 4.0.2 + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.22.4: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.0 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.5 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.14 + + es-array-method-boxes-properly@1.0.0: {} + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.1 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.1 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + es5-ext@0.10.63: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.1 + es5-ext: 0.10.63 + es6-symbol: 3.1.3 + + es6-promise@4.2.8: {} + + es6-symbol@3.1.3: + dependencies: + d: 1.0.1 + ext: 1.7.0 + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escodegen@1.8.1: + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.2.0 + + eslint-config-prettier@8.1.0(eslint@7.22.0): + dependencies: + eslint: 7.22.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.0(@typescript-eslint/parser@4.18.0(eslint@7.22.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.9)(eslint@7.22.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 4.18.0(eslint@7.22.0)(typescript@4.7.4) + eslint: 7.22.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.22.0(@typescript-eslint/parser@4.18.0(eslint@7.22.0)(typescript@4.7.4))(eslint@7.22.0): + dependencies: + array-includes: 3.1.7 + array.prototype.flat: 1.3.2 + contains-path: 0.1.0 + debug: 2.6.9 + doctrine: 1.5.0 + eslint: 7.22.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@4.18.0(eslint@7.22.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.9)(eslint@7.22.0) + has: 1.0.4 + minimatch: 3.1.2 + object.values: 1.1.7 + read-pkg-up: 2.0.0 + resolve: 1.22.8 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 4.18.0(eslint@7.22.0)(typescript@4.7.4) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-prettier@3.3.1(eslint-config-prettier@8.1.0(eslint@7.22.0))(eslint@7.22.0)(prettier@3.2.5): + dependencies: + eslint: 7.22.0 + prettier: 3.2.5 + prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 8.1.0(eslint@7.22.0) + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-utils@2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@2.1.0: {} + + eslint@7.22.0: + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.3 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@8.1.1) + doctrine: 3.0.0 + enquirer: 2.4.1 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.1.0 + espree: 7.3.1 + esquery: 1.5.0 + esutils: 2.0.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.24.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash: 4.17.21 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.6.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + table: 6.8.1 + text-table: 0.2.0 + v8-compile-cache: 2.4.0 + transitivePeerDependencies: + - supports-color + + esm@3.2.25: + optional: true + + esniff@2.0.1: + dependencies: + d: 1.0.1 + es5-ext: 0.10.63 + event-emitter: 0.3.5 + type: 2.7.2 + + espree@7.3.1: + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + + esprima@2.7.3: {} + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@1.9.3: {} + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eth-block-tracker@3.0.1: + dependencies: + eth-query: 2.1.2 + ethereumjs-tx: 1.3.7 + ethereumjs-util: 5.2.1 + ethjs-util: 0.1.6 + json-rpc-engine: 3.8.0 + pify: 2.3.0 + tape: 4.17.0 + transitivePeerDependencies: + - supports-color + + eth-ens-namehash@2.0.8: + dependencies: + idna-uts46-hx: 2.3.1 + js-sha3: 0.5.7 + + eth-gas-reporter@0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@solidity-parser/parser': 0.14.5 + axios: 1.6.7 + cli-table3: 0.5.1 + colors: 1.4.0 + ethereum-cryptography: 1.2.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fs-readdir-recursive: 1.1.0 + lodash: 4.17.21 + markdown-table: 1.1.3 + mocha: 10.3.0 + req-cwd: 2.0.0 + sha1: 1.1.1 + sync-request: 6.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + eth-json-rpc-infura@3.2.1(encoding@0.1.13): + dependencies: + cross-fetch: 2.2.6(encoding@0.1.13) + eth-json-rpc-middleware: 1.6.0 + json-rpc-engine: 3.8.0 + json-rpc-error: 2.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + eth-json-rpc-middleware@1.6.0: + dependencies: + async: 2.6.2 + eth-query: 2.1.2 + eth-tx-summary: 3.2.4 + ethereumjs-block: 1.7.1 + ethereumjs-tx: 1.3.7 + ethereumjs-util: 5.2.1 + ethereumjs-vm: 2.6.0 + fetch-ponyfill: 4.1.0 + json-rpc-engine: 3.8.0 + json-rpc-error: 2.0.0 + json-stable-stringify: 1.1.1 + promise-to-callback: 1.0.0 + tape: 4.17.0 + transitivePeerDependencies: + - supports-color + + eth-lib@0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + nano-json-stream-parser: 0.1.2 + servify: 0.1.12 + ws: 3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xhr-request-promise: 0.1.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + eth-lib@0.2.8: + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.4 + xhr-request-promise: 0.1.3 + + eth-query@2.1.2: + dependencies: + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 + + eth-sig-util@1.4.2: + dependencies: + ethereumjs-abi: https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0 + ethereumjs-util: 5.2.1 + + eth-sig-util@3.0.0: + dependencies: + buffer: 5.7.1 + elliptic: 6.5.4 + ethereumjs-abi: 0.6.5 + ethereumjs-util: 5.2.1 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + + eth-tx-summary@3.2.4: + dependencies: + async: 2.6.2 + clone: 2.1.2 + concat-stream: 1.6.2 + end-of-stream: 1.4.4 + eth-query: 2.1.2 + ethereumjs-block: 1.7.1 + ethereumjs-tx: 1.3.7 + ethereumjs-util: 5.2.1 + ethereumjs-vm: 2.6.0 + through2: 2.0.5 + + ethashjs@0.0.8: + dependencies: + async: 2.6.2 + buffer-xor: 2.0.2 + ethereumjs-util: 7.1.5 + miller-rabin: 4.0.1 + + ethereum-bloom-filters@1.0.10: + dependencies: + js-sha3: 0.8.0 + + ethereum-common@0.0.18: {} + + ethereum-common@0.2.0: {} + + ethereum-cryptography@0.1.3: + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.3 + setimmediate: 1.0.5 + + ethereum-cryptography@1.2.0: + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + + ethereum-cryptography@2.1.3: + dependencies: + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + '@scure/bip32': 1.3.3 + '@scure/bip39': 1.2.2 + + ethereum-ens@0.8.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + bluebird: 3.7.2 + eth-ens-namehash: 2.0.8 + js-sha3: 0.5.7 + pako: 1.0.11 + underscore: 1.13.6 + web3: 1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.7.4)(utf-8-validate@5.0.10): + dependencies: + '@ethereum-waffle/chai': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@ethereum-waffle/compiler': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.7.4)(utf-8-validate@5.0.10) + '@ethereum-waffle/mock-contract': 3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethereum-waffle/provider': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + + ethereumjs-abi@0.6.5: + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 4.5.1 + + ethereumjs-abi@0.6.8: + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 6.2.1 + + ethereumjs-abi@https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0: + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 6.2.1 + + ethereumjs-account@2.0.5: + dependencies: + ethereumjs-util: 5.2.1 + rlp: 2.2.7 + safe-buffer: 5.2.1 + + ethereumjs-account@3.0.0: + dependencies: + ethereumjs-util: 6.2.1 + rlp: 2.2.7 + safe-buffer: 5.2.1 + + ethereumjs-block@1.7.1: + dependencies: + async: 2.6.2 + ethereum-common: 0.2.0 + ethereumjs-tx: 1.3.7 + ethereumjs-util: 5.2.1 + merkle-patricia-tree: 2.3.2 + + ethereumjs-block@2.2.2: + dependencies: + async: 2.6.2 + ethereumjs-common: 1.5.0 + ethereumjs-tx: 2.1.2 + ethereumjs-util: 5.2.1 + merkle-patricia-tree: 2.3.2 + + ethereumjs-blockchain@4.0.4: + dependencies: + async: 2.6.2 + ethashjs: 0.0.8 + ethereumjs-block: 2.2.2 + ethereumjs-common: 1.5.0 + ethereumjs-util: 6.2.1 + flow-stoplight: 1.0.0 + level-mem: 3.0.1 + lru-cache: 5.1.1 + rlp: 2.2.7 + semaphore: 1.1.0 + + ethereumjs-common@1.5.0: {} + + ethereumjs-tx@1.3.7: + dependencies: + ethereum-common: 0.0.18 + ethereumjs-util: 5.2.1 + + ethereumjs-tx@2.1.2: + dependencies: + ethereumjs-common: 1.5.0 + ethereumjs-util: 6.2.1 + + ethereumjs-util@4.5.1: + dependencies: + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.4 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + + ethereumjs-util@5.2.1: + dependencies: + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.4 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + safe-buffer: 5.2.1 + + ethereumjs-util@6.2.1: + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.4 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + + ethereumjs-util@7.1.5: + dependencies: + '@types/bn.js': 5.1.5 + bn.js: 5.2.1 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + + ethereumjs-vm@2.6.0: + dependencies: + async: 2.6.2 + async-eventemitter: 0.2.4 + ethereumjs-account: 2.0.5 + ethereumjs-block: 2.2.2 + ethereumjs-common: 1.5.0 + ethereumjs-util: 6.2.1 + fake-merkle-patricia-tree: 1.0.1 + functional-red-black-tree: 1.0.1 + merkle-patricia-tree: 2.3.2 + rustbn.js: 0.2.0 + safe-buffer: 5.2.1 + + ethereumjs-vm@4.2.0: + dependencies: + async: 2.6.2 + async-eventemitter: 0.2.4 + core-js-pure: 3.36.0 + ethereumjs-account: 3.0.0 + ethereumjs-block: 2.2.2 + ethereumjs-blockchain: 4.0.4 + ethereumjs-common: 1.5.0 + ethereumjs-tx: 2.1.2 + ethereumjs-util: 6.2.1 + fake-merkle-patricia-tree: 1.0.1 + functional-red-black-tree: 1.0.1 + merkle-patricia-tree: 2.3.2 + rustbn.js: 0.2.0 + safe-buffer: 5.2.1 + util.promisify: 1.1.2 + + ethereumjs-wallet@0.6.5: + dependencies: + aes-js: 3.1.2 + bs58check: 2.1.2 + ethereum-cryptography: 0.1.3 + ethereumjs-util: 6.2.1 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scryptsy: 1.2.1 + utf8: 3.0.0 + uuid: 3.4.0 + optional: true + + ethers@4.0.49: + dependencies: + aes-js: 3.0.0 + bn.js: 4.12.0 + elliptic: 6.5.4 + hash.js: 1.1.3 + js-sha3: 0.5.7 + scrypt-js: 2.0.4 + setimmediate: 1.0.4 + uuid: 2.0.1 + xmlhttprequest: 1.8.0 + + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + 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(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ethers@6.13.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.5.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ethjs-unit@0.1.6: + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + + ethjs-util@0.1.6: + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + + event-emitter@0.3.5: + dependencies: + d: 1.0.1 + es5-ext: 0.10.63 + + eventemitter3@4.0.4: {} + + events@3.3.0: {} + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + express@4.18.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + ext@1.7.0: + dependencies: + type: 2.7.2 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + + extend@3.0.2: {} + + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + extsprintf@1.3.0: {} + + fake-merkle-patricia-tree@1.0.1: + dependencies: + checkpoint-store: 1.1.0 + + fast-check@3.1.1: + dependencies: + pure-rand: 5.0.5 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fetch-ponyfill@4.1.0: + dependencies: + node-fetch: 1.7.3 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-replace@1.0.3: + dependencies: + array-back: 1.0.4 + test-value: 2.1.0 + + find-replace@3.0.0: + dependencies: + array-back: 3.1.0 + + find-up@1.1.2: + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-yarn-workspace-root@1.2.1: + dependencies: + fs-extra: 4.0.3 + micromatch: 3.1.10 + transitivePeerDependencies: + - supports-color + + find-yarn-workspace-root@2.0.0: + dependencies: + micromatch: 4.0.5 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@4.1.1: + dependencies: + is-buffer: 2.0.5 + + flat@5.0.2: {} + + flatted@3.3.1: {} + + flow-stoplight@1.0.0: {} + + follow-redirects@1.15.5(debug@4.3.4): + optionalDependencies: + debug: 4.3.4(supports-color@8.1.1) + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + forever-agent@0.6.1: {} + + form-data-encoder@1.7.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@2.5.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fp-ts@1.19.3: {} + + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + + fresh@0.5.2: {} + + fs-extra@0.30.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + + fs-extra@4.0.3: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@1.2.7: + dependencies: + minipass: 2.9.0 + + fs-readdir-recursive@1.1.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.1.3: + optional: true + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + functions-have-names: 1.2.3 + + functional-red-black-tree@1.0.1: {} + + functions-have-names@1.2.3: {} + + ganache-cli@6.12.2: {} + + ganache-core@2.13.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + abstract-leveldown: 3.0.0 + async: 2.6.2 + bip39: 2.5.0 + cachedown: 1.0.0 + clone: 2.1.2 + debug: 3.2.6(supports-color@6.0.0) + encoding-down: 5.0.4 + eth-sig-util: 3.0.0 + ethereumjs-abi: 0.6.8 + ethereumjs-account: 3.0.0 + ethereumjs-block: 2.2.2 + ethereumjs-common: 1.5.0 + ethereumjs-tx: 2.1.2 + ethereumjs-util: 6.2.1 + ethereumjs-vm: 4.2.0 + heap: 0.2.6 + level-sublevel: 6.6.4 + levelup: 3.1.1 + lodash: 4.17.20 + lru-cache: 5.1.1 + merkle-patricia-tree: 3.0.0 + patch-package: 6.2.2 + seedrandom: 3.0.1 + source-map-support: 0.5.12 + tmp: 0.1.0 + web3-provider-engine: 14.2.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + websocket: 1.0.32 + optionalDependencies: + ethereumjs-wallet: 0.6.5 + web3: 1.2.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + get-caller-file@1.0.3: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.1 + + get-port@3.2.0: {} + + get-stream@4.1.0: + dependencies: + pump: 3.0.0 + optional: true + + get-stream@5.2.0: + dependencies: + pump: 3.0.0 + + get-stream@6.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-value@2.0.6: {} + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + ghost-testrpc@0.0.2: + dependencies: + chalk: 2.4.2 + node-emoji: 1.11.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@5.0.15: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.1.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.1.7: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.2.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + global@4.4.0: + dependencies: + min-document: 2.19.0 + process: 0.11.10 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@9.18.0: {} + + globalthis@1.0.3: + dependencies: + define-properties: 1.2.1 + + globby@10.0.2: + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + glob: 7.2.3 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + got@11.8.6: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + + got@12.1.0: + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 5.0.1 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 6.1.0 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + form-data-encoder: 1.7.1 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 2.0.1 + + got@9.6.0: + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.5 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + optional: true + + graceful-fs@4.2.11: {} + + growl@1.10.5: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10) + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - debug + - utf-8-validate + + hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/ethereumjs-block': 5.0.4 + '@nomicfoundation/ethereumjs-blockchain': 7.0.4 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-evm': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-statemanager': 2.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/ethereumjs-trie': 6.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/ethereumjs-verkle': 0.0.2 + '@nomicfoundation/ethereumjs-vm': 7.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) + '@nomicfoundation/solidity-analyzer': 0.1.1 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.5 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chalk: 2.4.2 + chokidar: 3.6.0 + ci-info: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.5 + io-ts: 1.10.4 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.3.0 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.7.3(debug@4.3.4) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + tsort: 0.0.1 + undici: 5.28.3 + uuid: 8.3.2 + ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + ts-node: 10.9.1(@types/node@20.11.20)(typescript@4.7.4) + typescript: 4.7.4 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-bigints@1.0.2: {} + + has-flag@1.0.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + + has@1.0.4: {} + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.3: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasown@2.0.1: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + header-case@1.0.1: + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + + heap@0.2.6: {} + + heap@0.2.7: {} + + highlight.js@10.7.3: {} + + highlightjs-solidity@2.0.6: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + home-or-tmp@2.0.0: + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + + hosted-git-info@2.8.9: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + http-basic@8.1.3: + dependencies: + caseless: 0.12.0 + concat-stream: 1.6.2 + http-response-object: 3.0.2 + parse-cache-control: 1.0.1 + + http-cache-semantics@4.1.1: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-https@1.0.0: {} + + http-response-object@3.0.2: + dependencies: + '@types/node': 10.17.60 + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + http2-wrapper@1.0.3: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + husky@9.0.11: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + idna-uts46-hx@2.3.1: + dependencies: + punycode: 2.1.0 + + ieee754@1.2.1: {} + + ignore@4.0.6: {} + + ignore@5.3.1: {} + + immediate@3.2.3: {} + + immediate@3.3.0: {} + + immutable@4.3.5: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.1 + side-channel: 1.0.5 + + interpret@1.4.0: {} + + invariant@2.2.4: + dependencies: + loose-envify: 1.4.0 + + invert-kv@1.0.0: {} + + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + ipaddr.js@1.9.1: {} + + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.1 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.2.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-buffer@1.1.6: {} + + is-buffer@2.0.5: {} + + is-callable@1.2.7: {} + + is-ci@2.0.0: + dependencies: + ci-info: 2.0.0 + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.1 + + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.1 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-docker@2.2.1: {} + + is-extendable@0.1.1: {} + + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + + is-extglob@2.1.1: {} + + is-finite@1.1.0: {} + + is-fn@1.0.0: {} + + is-fullwidth-code-point@1.0.0: + dependencies: + number-is-nan: 1.0.1 + + is-fullwidth-code-point@2.0.0: {} + + is-fullwidth-code-point@3.0.0: {} + + is-function@1.0.2: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hex-prefixed@1.0.0: {} + + is-interactive@1.0.0: {} + + is-lower-case@1.1.3: + dependencies: + lower-case: 1.1.4 + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + + is-number@7.0.0: {} + + is-observable@2.1.0: {} + + is-plain-obj@2.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@1.1.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.14 + + is-typedarray@1.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-upper-case@1.1.2: + dependencies: + upper-case: 1.1.3 + + is-url@1.2.4: {} + + is-utf8@0.2.1: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@0.0.1: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + + isobject@3.0.1: {} + + isstream@0.1.2: {} + + js-sdsl@4.4.2: {} + + js-sha3@0.5.7: {} + + js-sha3@0.8.0: {} + + js-tokens@3.0.2: {} + + js-tokens@4.0.0: {} + + js-yaml@3.13.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@0.1.1: {} + + jsesc@0.5.0: {} + + jsesc@1.3.0: {} + + json-buffer@3.0.0: + optional: true + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-rpc-engine@3.8.0: + dependencies: + async: 2.6.2 + babel-preset-env: 1.7.0 + babelify: 7.3.0 + json-rpc-error: 2.0.0 + promise-to-callback: 1.0.0 + safe-event-emitter: 1.0.1 + transitivePeerDependencies: + - supports-color + + json-rpc-error@2.0.0: + dependencies: + inherits: 2.0.4 + + json-rpc-random-id@1.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stable-stringify@1.1.1: + dependencies: + call-bind: 1.0.7 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + + json-stringify-safe@5.0.1: {} + + json5@0.5.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsonfile@2.4.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonify@0.0.1: {} + + jsonschema@1.4.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + keccak256@1.0.6: + dependencies: + bn.js: 5.2.1 + buffer: 6.0.3 + keccak: 3.0.4 + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.0 + readable-stream: 3.6.2 + + keyv@3.1.0: + dependencies: + json-buffer: 3.0.0 + optional: true + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + + kind-of@6.0.3: {} + + klaw-sync@6.0.0: + dependencies: + graceful-fs: 4.2.11 + + klaw@1.3.1: + optionalDependencies: + graceful-fs: 4.2.11 + + lcid@1.0.0: + dependencies: + invert-kv: 1.0.0 + + level-codec@7.0.1: {} + + level-codec@9.0.2: + dependencies: + buffer: 5.7.1 + + level-errors@1.0.5: + dependencies: + errno: 0.1.8 + + level-errors@2.0.1: + dependencies: + errno: 0.1.8 + + level-iterator-stream@1.3.1: + dependencies: + inherits: 2.0.4 + level-errors: 1.0.5 + readable-stream: 1.1.14 + xtend: 4.0.2 + + level-iterator-stream@2.0.3: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + xtend: 4.0.2 + + level-iterator-stream@3.0.1: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + xtend: 4.0.2 + + level-mem@3.0.1: + dependencies: + level-packager: 4.0.1 + memdown: 3.0.0 + + level-packager@4.0.1: + dependencies: + encoding-down: 5.0.4 + levelup: 3.1.1 + + level-post@1.0.7: + dependencies: + ltgt: 2.1.3 + + level-sublevel@6.6.4: + dependencies: + bytewise: 1.1.0 + level-codec: 9.0.2 + level-errors: 2.0.1 + level-iterator-stream: 2.0.3 + ltgt: 2.1.3 + pull-defer: 0.2.3 + pull-level: 2.0.4 + pull-stream: 3.7.0 + typewiselite: 1.0.0 + xtend: 4.0.2 + + level-ws@0.0.0: + dependencies: + readable-stream: 1.0.34 + xtend: 2.1.2 + + level-ws@1.0.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + xtend: 4.0.2 + + levelup@1.3.9: + dependencies: + deferred-leveldown: 1.2.2 + level-codec: 7.0.1 + level-errors: 1.0.5 + level-iterator-stream: 1.3.1 + prr: 1.0.1 + semver: 5.4.1 + xtend: 4.0.2 + + levelup@3.1.1: + dependencies: + deferred-leveldown: 4.0.2 + level-errors: 2.0.1 + level-iterator-stream: 3.0.1 + xtend: 4.0.2 + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + load-json-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + + load-json-file@2.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + strip-bom: 3.0.0 + + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.assign@4.2.0: {} + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.isequal@4.5.0: {} + + lodash.merge@4.6.2: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.20: {} + + lodash@4.17.21: {} + + log-symbols@3.0.0: + dependencies: + chalk: 2.4.2 + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + looper@2.0.0: {} + + looper@3.0.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lower-case-first@1.0.2: + dependencies: + lower-case: 1.1.4 + + lower-case@1.1.4: {} + + lowercase-keys@1.0.1: + optional: true + + lowercase-keys@2.0.0: {} + + lowercase-keys@3.0.0: {} + + lru-cache@10.2.0: {} + + lru-cache@3.2.0: + dependencies: + pseudomap: 1.0.2 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lru_map@0.3.3: {} + + ltgt@2.1.3: {} + + ltgt@2.2.1: {} + + make-error@1.3.6: {} + + map-cache@0.2.2: {} + + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + + markdown-table@1.1.3: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + media-typer@0.3.0: {} + + memdown@1.4.1: + dependencies: + abstract-leveldown: 2.7.2 + functional-red-black-tree: 1.0.1 + immediate: 3.3.0 + inherits: 2.0.4 + ltgt: 2.2.1 + safe-buffer: 5.1.2 + + memdown@3.0.0: + dependencies: + abstract-leveldown: 5.0.0 + functional-red-black-tree: 1.0.1 + immediate: 3.2.3 + inherits: 2.0.4 + ltgt: 2.2.1 + safe-buffer: 5.1.2 + + memorystream@0.3.1: {} + + merge-descriptors@1.0.1: {} + + merge2@1.4.1: {} + + merkle-patricia-tree@2.3.2: + dependencies: + async: 1.5.2 + ethereumjs-util: 5.2.1 + level-ws: 0.0.0 + levelup: 1.3.9 + memdown: 1.4.1 + readable-stream: 2.3.8 + rlp: 2.2.7 + semaphore: 1.1.0 + + merkle-patricia-tree@3.0.0: + dependencies: + async: 2.6.2 + ethereumjs-util: 5.2.1 + level-mem: 3.0.1 + level-ws: 1.0.0 + readable-stream: 3.6.2 + rlp: 2.2.7 + semaphore: 1.1.0 + + methods@1.1.2: {} + + micro-ftch@0.3.1: {} + + micromatch@3.1.10: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + miller-rabin@4.0.1: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@1.0.1: {} + + mimic-response@3.1.0: {} + + min-document@2.19.0: + dependencies: + dom-walk: 0.1.2 + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.0.4: + dependencies: + brace-expansion: 1.1.11 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@2.9.0: + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + + minizlib@1.3.3: + dependencies: + minipass: 2.9.0 + + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + + mkdirp-promise@5.0.1: + dependencies: + mkdirp: 3.0.1 + + mkdirp@0.5.5: + dependencies: + minimist: 1.2.8 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.4 + + mocha@10.3.0: + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + + mocha@7.1.2: + dependencies: + ansi-colors: 3.2.3 + browser-stdout: 1.3.1 + chokidar: 3.3.0 + debug: 3.2.6(supports-color@6.0.0) + diff: 3.5.0 + escape-string-regexp: 1.0.5 + find-up: 3.0.0 + glob: 7.1.3 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 3.13.1 + log-symbols: 3.0.0 + minimatch: 3.0.4 + mkdirp: 0.5.5 + ms: 2.1.1 + node-environment-flags: 1.0.6 + object.assign: 4.1.0 + strip-json-comments: 2.0.1 + supports-color: 6.0.0 + which: 1.3.1 + wide-align: 1.1.3 + yargs: 13.3.2 + yargs-parser: 13.1.2 + yargs-unparser: 1.6.0 + + mock-fs@4.14.0: {} + + mock-property@1.0.3: + dependencies: + define-data-property: 1.1.4 + functions-have-names: 1.2.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + hasown: 2.0.1 + isarray: 2.0.5 + + ms@2.0.0: {} + + ms@2.1.1: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + multibase@0.6.1: + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + + multibase@0.7.0: + dependencies: + base-x: 3.0.9 + buffer: 5.7.1 + + multicodec@0.5.7: + dependencies: + varint: 5.0.2 + + multicodec@1.0.4: + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + + multihashes@0.4.21: + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + + nan@2.18.0: {} + + nano-base32@1.0.1: {} + + nano-json-stream-parser@0.1.2: {} + + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + next-tick@1.1.0: {} + + nice-try@1.0.5: {} + + no-case@2.3.2: + dependencies: + lower-case: 1.1.4 + + node-addon-api@2.0.2: {} + + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + + node-environment-flags@1.0.6: + dependencies: + object.getownpropertydescriptors: 2.1.7 + semver: 5.7.2 + + node-fetch@1.7.3: + dependencies: + encoding: 0.1.13 + is-stream: 1.1.0 + + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-gyp-build@4.8.0: {} + + nofilter@1.0.4: {} + + nofilter@3.1.0: {} + + nopt@3.0.6: + dependencies: + abbrev: 1.0.9 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-url@4.5.1: + optional: true + + normalize-url@6.1.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + number-is-nan@1.0.1: {} + + number-to-bn@1.7.0: + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + + oauth-sign@0.9.0: {} + + object-assign@4.1.1: {} + + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + + object-inspect@1.12.3: {} + + object-inspect@1.13.1: {} + + object-is@1.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@0.4.0: {} + + object-keys@1.1.1: {} + + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + + object.assign@4.1.0: + dependencies: + define-properties: 1.2.1 + function-bind: 1.1.2 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.getownpropertydescriptors@2.1.7: + dependencies: + array.prototype.reduce: 1.0.6 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + safe-array-concat: 1.1.0 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + object.values@1.1.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + obliterator@2.0.4: {} + + oboe@2.1.4: + dependencies: + http-https: 1.0.0 + optional: true + + oboe@2.1.5: + dependencies: + http-https: 1.0.0 + + observable-fns@0.6.1: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + optionator@0.9.3: + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + os-homedir@1.0.2: {} + + os-locale@1.4.0: + dependencies: + lcid: 1.0.0 + + os-tmpdir@1.0.2: {} + + p-cancelable@1.1.0: + optional: true + + p-cancelable@2.1.1: {} + + p-cancelable@3.0.0: {} + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-try@1.0.0: {} + + p-try@2.2.0: {} + + pako@1.0.11: {} + + param-case@2.1.1: + dependencies: + no-case: 2.3.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-asn1@5.1.6: + dependencies: + asn1.js: 5.4.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + optional: true + + parse-cache-control@1.0.1: {} + + parse-headers@2.0.5: {} + + parse-json@2.2.0: + dependencies: + error-ex: 1.3.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.23.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse5-htmlparser2-tree-adapter@7.0.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + parseurl@1.3.3: {} + + pascal-case@2.0.1: + dependencies: + camel-case: 3.0.0 + upper-case-first: 1.1.2 + + pascalcase@0.1.1: {} + + patch-package@6.2.2: + dependencies: + '@yarnpkg/lockfile': 1.1.0 + chalk: 2.4.2 + cross-spawn: 6.0.5 + find-yarn-workspace-root: 1.2.1 + fs-extra: 7.0.1 + is-ci: 2.0.0 + klaw-sync: 6.0.0 + minimist: 1.2.8 + rimraf: 2.7.1 + semver: 5.7.2 + slash: 2.0.0 + tmp: 0.0.33 + transitivePeerDependencies: + - supports-color + + patch-package@6.5.1: + dependencies: + '@yarnpkg/lockfile': 1.1.0 + chalk: 4.1.2 + cross-spawn: 6.0.5 + find-yarn-workspace-root: 2.0.0 + fs-extra: 9.1.0 + is-ci: 2.0.0 + klaw-sync: 6.0.0 + minimist: 1.2.8 + open: 7.4.2 + rimraf: 2.7.1 + semver: 5.7.2 + slash: 2.0.0 + tmp: 0.0.33 + yaml: 1.10.2 + + path-browserify@1.0.1: {} + + path-case@2.1.1: + dependencies: + no-case: 2.3.2 + + path-exists@2.1.0: + dependencies: + pinkie-promise: 2.0.1 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@2.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.7: {} + + path-type@1.1.0: + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + + path-type@2.0.0: + dependencies: + pify: 2.3.0 + + path-type@4.0.0: {} + + pathval@1.1.1: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + performance-now@2.1.0: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pify@4.0.1: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + + pluralize@8.0.0: {} + + posix-character-classes@0.1.1: {} + + possible-typed-array-names@1.0.0: {} + + postinstall-postinstall@2.1.0: {} + + precond@0.2.3: {} + + prelude-ls@1.1.2: {} + + prelude-ls@1.2.1: {} + + prepend-http@2.0.0: + optional: true + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@2.8.8: {} + + prettier@3.2.5: {} + + private@0.1.8: {} + + process-nextick-args@2.0.1: {} + + process@0.11.10: {} + + progress@2.0.3: {} + + promise-to-callback@1.0.0: + dependencies: + is-fn: 1.0.0 + set-immediate-shim: 1.0.1 + + promise@8.3.0: + dependencies: + asap: 2.0.6 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + prr@1.0.1: {} + + pseudomap@1.0.2: {} + + psl@1.9.0: {} + + public-encrypt@4.0.3: + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.6 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + optional: true + + pull-cat@1.1.11: {} + + pull-defer@0.2.3: {} + + pull-level@2.0.4: + dependencies: + level-post: 1.0.7 + pull-cat: 1.1.11 + pull-live: 1.0.1 + pull-pushable: 2.2.0 + pull-stream: 3.7.0 + pull-window: 2.1.4 + stream-to-pull-stream: 1.7.3 + + pull-live@1.0.1: + dependencies: + pull-cat: 1.1.11 + pull-stream: 3.7.0 + + pull-pushable@2.2.0: {} + + pull-stream@3.7.0: {} + + pull-window@2.1.4: + dependencies: + looper: 2.0.0 + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@1.4.1: {} + + punycode@2.1.0: {} + + punycode@2.3.1: {} + + pure-rand@5.0.5: {} + + qs@6.11.0: + dependencies: + side-channel: 1.0.5 + + qs@6.11.2: + dependencies: + side-channel: 1.0.5 + + qs@6.5.3: {} + + query-string@5.1.1: + dependencies: + decode-uri-component: 0.2.2 + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + + queue-microtask@1.2.3: {} + + quick-lru@5.1.1: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + randomfill@1.0.4: + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + optional: true + + range-parser@1.2.1: {} + + raw-body@2.5.1: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + read-pkg-up@1.0.1: + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + + read-pkg-up@2.0.0: + dependencies: + find-up: 2.1.0 + read-pkg: 2.0.0 + + read-pkg@1.1.0: + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + + read-pkg@2.0.0: + dependencies: + load-json-file: 2.0.0 + normalize-package-data: 2.5.0 + path-type: 2.0.0 + + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@1.1.14: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.2.0: + dependencies: + picomatch: 2.3.1 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + + recursive-readdir@2.2.3: + dependencies: + minimatch: 3.1.2 + + reduce-flatten@2.0.0: {} + + regenerate@1.4.2: {} + + regenerator-runtime@0.11.1: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.10.1: + dependencies: + babel-runtime: 6.26.0 + babel-types: 6.26.0 + private: 0.1.8 + + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpp@3.2.0: {} + + regexpu-core@2.0.0: + dependencies: + regenerate: 1.4.2 + regjsgen: 0.2.0 + regjsparser: 0.1.5 + + regjsgen@0.2.0: {} + + regjsparser@0.1.5: + dependencies: + jsesc: 0.5.0 + + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + + repeating@2.0.1: + dependencies: + is-finite: 1.1.0 + + req-cwd@2.0.0: + dependencies: + req-from: 2.0.0 + + req-from@2.0.0: + dependencies: + resolve-from: 3.0.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + require-directory@2.1.1: {} + + require-from-string@1.2.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@1.0.1: {} + + require-main-filename@2.0.0: {} + + resolve-alpn@1.2.1: {} + + resolve-from@3.0.0: {} + + resolve-from@4.0.0: {} + + resolve-url@0.2.1: {} + + resolve@1.1.7: {} + + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@1.0.2: + dependencies: + lowercase-keys: 1.0.1 + optional: true + + responselike@2.0.1: + dependencies: + lowercase-keys: 2.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + ret@0.1.15: {} + + reusify@1.0.4: {} + + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160-min@0.0.6: {} + + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + rlp@2.2.7: + dependencies: + bn.js: 5.2.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rust-verkle-wasm@0.0.1: {} + + rustbn-wasm@0.2.0: + dependencies: + '@scure/base': 1.1.5 + + rustbn.js@0.2.0: {} + + safe-array-concat@1.1.0: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-event-emitter@1.0.1: + dependencies: + events: 3.3.0 + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + + safer-buffer@2.1.2: {} + + sc-istanbul@0.4.6: + dependencies: + abbrev: 1.0.9 + async: 1.5.2 + escodegen: 1.8.1 + esprima: 2.7.3 + glob: 5.0.15 + handlebars: 4.7.8 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + nopt: 3.0.6 + once: 1.4.0 + resolve: 1.1.7 + supports-color: 3.2.3 + which: 1.3.1 + wordwrap: 1.0.0 + + scrypt-js@2.0.4: {} + + scrypt-js@3.0.1: {} + + scrypt@https://codeload.github.com/barrysteyn/node-scrypt/tar.gz/fb60a8d3c158fe115a624b5ffa7480f3a24b03fb: + dependencies: + nan: 2.18.0 + + scryptsy@1.2.1: + dependencies: + pbkdf2: 3.1.2 + optional: true + + secp256k1@4.0.3: + dependencies: + elliptic: 6.5.4 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.0 + + seedrandom@3.0.1: {} + + semaphore@1.1.0: {} + + semver@5.4.1: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + sentence-case@2.1.1: + dependencies: + no-case: 2.3.2 + upper-case-first: 1.1.2 + + serialize-javascript@6.0.0: + dependencies: + randombytes: 2.1.0 + + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + servify@0.1.12: + dependencies: + body-parser: 1.20.2 + cors: 2.8.5 + express: 4.18.2 + request: 2.88.2 + xhr: 2.6.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + set-function-length@1.2.1: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-immediate-shim@1.0.1: {} + + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + + setimmediate@1.0.4: {} + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + sha1@1.1.1: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + + sha3@2.1.4: + dependencies: + buffer: 6.0.3 + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + side-channel@1.0.5: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + signal-exit@3.0.7: {} + + simple-concat@1.0.1: {} + + simple-get@2.8.2: + dependencies: + decompress-response: 3.3.0 + once: 1.4.0 + simple-concat: 1.0.1 + + slash@1.0.0: {} + + slash@2.0.0: {} + + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + snake-case@2.1.0: + dependencies: + no-case: 2.3.2 + + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + + solc@0.4.26: + dependencies: + fs-extra: 0.30.0 + memorystream: 0.3.1 + require-from-string: 1.2.1 + semver: 5.7.2 + yargs: 4.8.1 + + solc@0.6.12: + dependencies: + command-exists: 1.2.9 + commander: 3.0.2 + fs-extra: 0.30.0 + js-sha3: 0.8.0 + memorystream: 0.3.1 + require-from-string: 2.0.2 + semver: 5.7.2 + tmp: 0.0.33 + + solc@0.7.3(debug@4.3.4): + dependencies: + command-exists: 1.2.9 + commander: 3.0.2 + follow-redirects: 1.15.5(debug@4.3.4) + fs-extra: 0.30.0 + js-sha3: 0.8.0 + memorystream: 0.3.1 + require-from-string: 2.0.2 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + + solhint@3.4.1(typescript@4.7.4): + dependencies: + '@solidity-parser/parser': 0.16.2 + ajv: 6.12.6 + antlr4: 4.13.1 + ast-parents: 0.0.1 + chalk: 4.1.2 + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@4.7.4) + fast-diff: 1.3.0 + glob: 8.1.0 + ignore: 5.3.1 + js-yaml: 4.1.0 + lodash: 4.17.21 + pluralize: 8.0.0 + semver: 6.3.1 + strip-ansi: 6.0.1 + table: 6.8.1 + text-table: 0.2.0 + optionalDependencies: + prettier: 2.8.8 + transitivePeerDependencies: + - typescript + + solidity-coverage@0.8.3(hardhat@2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10)): + dependencies: + '@ethersproject/abi': 5.7.0 + '@solidity-parser/parser': 0.14.5 + chalk: 2.4.2 + death: 1.1.0 + detect-port: 1.5.1 + difflib: 0.2.4 + fs-extra: 8.1.0 + ghost-testrpc: 0.0.2 + global-modules: 2.0.0 + globby: 10.0.2 + hardhat: 2.20.1(bufferutil@4.0.8)(ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4))(typescript@4.7.4)(utf-8-validate@5.0.10) + jsonschema: 1.4.1 + lodash: 4.17.21 + mocha: 7.1.2 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.6.0 + shelljs: 0.8.5 + web3-utils: 1.10.4 + transitivePeerDependencies: + - supports-color + + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + + source-map-support@0.4.18: + dependencies: + source-map: 0.5.7 + + source-map-support@0.5.12: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-url@0.4.1: {} + + source-map@0.2.0: + dependencies: + amdefine: 1.0.1 + optional: true + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + + spdx-license-ids@3.0.17: {} + + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + + sprintf-js@1.0.3: {} + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stacktrace-parser@0.1.10: + dependencies: + type-fest: 0.7.1 + + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + + statuses@2.0.1: {} + + stream-to-pull-stream@1.7.3: + dependencies: + looper: 3.0.0 + pull-stream: 3.7.0 + + strict-uri-encode@1.1.0: {} + + string-format@2.0.0: {} + + string-width@1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + + string-width@2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string.prototype.trimend@1.0.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string.prototype.trimstart@1.0.7: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.22.4 + + string_decoder@0.10.31: {} + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@4.0.0: + dependencies: + ansi-regex: 3.0.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@2.0.0: + dependencies: + is-utf8: 0.2.1 + + strip-bom@3.0.0: {} + + strip-hex-prefix@1.0.0: + dependencies: + is-hex-prefixed: 1.0.0 + + strip-indent@2.0.0: {} + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + supports-color@2.0.0: {} + + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@6.0.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swap-case@1.1.2: + dependencies: + lower-case: 1.1.4 + upper-case: 1.1.3 + + swarm-js@0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + bluebird: 3.7.2 + buffer: 5.7.1 + eth-lib: 0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fs-extra: 4.0.3 + got: 11.8.6 + mime-types: 2.1.35 + mkdirp-promise: 5.0.1 + mock-fs: 4.14.0 + setimmediate: 1.0.5 + tar: 4.4.19 + xhr-request: 1.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + sync-request@6.1.0: + dependencies: + http-response-object: 3.0.2 + sync-rpc: 1.3.6 + then-request: 6.0.2 + + sync-rpc@1.3.6: + dependencies: + get-port: 3.2.0 + + table-layout@1.0.2: + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + + table@6.8.1: + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tape@4.17.0: + dependencies: + '@ljharb/resumer': 0.0.1 + '@ljharb/through': 2.3.12 + call-bind: 1.0.7 + deep-equal: 1.1.2 + defined: 1.0.1 + dotignore: 0.1.2 + for-each: 0.3.3 + glob: 7.2.3 + has: 1.0.4 + inherits: 2.0.4 + is-regex: 1.1.4 + minimist: 1.2.8 + mock-property: 1.0.3 + object-inspect: 1.12.3 + resolve: 1.22.8 + string.prototype.trim: 1.2.8 + + tar@4.4.19: + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + + test-value@2.1.0: + dependencies: + array-back: 1.0.4 + typical: 2.6.1 + + testrpc@0.0.1: {} + + text-table@0.2.0: {} + + then-request@6.0.2: + dependencies: + '@types/concat-stream': 1.6.1 + '@types/form-data': 0.0.33 + '@types/node': 8.10.66 + '@types/qs': 6.9.11 + caseless: 0.12.0 + concat-stream: 1.6.2 + form-data: 2.5.1 + http-basic: 8.1.3 + http-response-object: 3.0.2 + promise: 8.3.0 + qs: 6.11.2 + + threads@1.7.0: + dependencies: + callsites: 3.1.0 + debug: 4.3.4(supports-color@8.1.1) + is-observable: 2.1.0 + observable-fns: 0.6.1 + optionalDependencies: + tiny-worker: 2.3.0 + transitivePeerDependencies: + - supports-color + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + timed-out@4.0.1: {} + + tiny-worker@2.3.0: + dependencies: + esm: 3.2.25 + optional: true + + title-case@2.1.1: + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmp@0.1.0: + dependencies: + rimraf: 2.7.1 + + to-fast-properties@1.0.3: {} + + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-readable-stream@1.0.0: + optional: true + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + + toidentifier@1.0.1: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + + tr46@0.0.3: {} + + trim-right@1.0.1: {} + + ts-command-line-args@2.5.1: + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + string-format: 2.0.0 + + ts-essentials@1.0.4: {} + + ts-essentials@6.0.7(typescript@4.7.4): + dependencies: + typescript: 4.7.4 + + ts-essentials@7.0.3(typescript@4.7.4): + dependencies: + typescript: 4.7.4 + + ts-generator@0.1.1: + dependencies: + '@types/mkdirp': 0.5.2 + '@types/prettier': 2.7.3 + '@types/resolve': 0.0.8 + chalk: 2.4.2 + glob: 7.2.3 + mkdirp: 0.5.6 + prettier: 2.8.8 + resolve: 1.22.8 + ts-essentials: 1.0.4 + + ts-node@10.9.1(@types/node@20.11.20)(typescript@4.7.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.11.20 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.7.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.4.0: {} + + tsort@0.0.1: {} + + tsutils@3.21.0(typescript@4.7.4): + dependencies: + tslib: 1.14.1 + typescript: 4.7.4 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl-util@0.15.1: {} + + tweetnacl@0.14.5: {} + + tweetnacl@1.0.3: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type@1.2.0: {} + + type@2.7.2: {} + + typechain@3.0.0(typescript@4.7.4): + dependencies: + command-line-args: 4.0.7 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 7.0.1 + js-sha3: 0.8.0 + lodash: 4.17.21 + ts-essentials: 6.0.7(typescript@4.7.4) + ts-generator: 0.1.1 + transitivePeerDependencies: + - supports-color + - typescript + + typechain@8.3.2(typescript@4.7.4): + dependencies: + '@types/prettier': 2.7.3 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.21 + mkdirp: 1.0.4 + prettier: 2.8.8 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@4.7.4) + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.5: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typedarray@0.0.6: {} + + typescript@4.7.4: {} + + typewise-core@1.2.0: {} + + typewise@1.0.3: + dependencies: + typewise-core: 1.2.0 + + typewiselite@1.0.0: {} + + typical@2.6.1: {} + + typical@4.0.0: {} + + typical@5.2.0: {} + + uglify-js@3.17.4: + optional: true + + ultron@1.1.1: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + underscore@1.13.6: {} + + underscore@1.9.1: + optional: true + + undici-types@5.26.5: {} + + undici@5.28.3: + dependencies: + '@fastify/busboy': 2.1.0 + + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unorm@1.6.0: {} + + unpipe@1.0.0: {} + + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + + upper-case-first@1.1.2: + dependencies: + upper-case: 1.1.3 + + upper-case@1.1.3: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + urix@0.1.0: {} + + url-parse-lax@3.0.0: + dependencies: + prepend-http: 2.0.0 + optional: true + + url-set-query@1.0.0: {} + + url@0.11.3: + dependencies: + punycode: 1.4.1 + qs: 6.11.2 + + use@3.1.1: {} + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.0 + + utf8@3.0.0: {} + + util-deprecate@1.0.2: {} + + util.promisify@1.1.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + for-each: 0.3.3 + has-proto: 1.0.3 + has-symbols: 1.0.3 + object.getownpropertydescriptors: 2.1.7 + safe-array-concat: 1.1.0 + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.14 + + utils-merge@1.0.1: {} + + uuid@2.0.1: {} + + uuid@3.3.2: + optional: true + + uuid@3.4.0: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + + v8-compile-cache@2.4.0: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + varint@5.0.2: {} + + vary@1.1.2: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web3-bzz@1.10.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + web3-bzz@1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@types/node': 12.20.55 + got: 12.1.0 + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + web3-bzz@1.2.11(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@types/node': 12.20.55 + got: 9.6.0 + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) + underscore: 1.9.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + optional: true + + web3-core-helpers@1.10.0: + dependencies: + web3-eth-iban: 1.10.0 + web3-utils: 1.10.0 + + web3-core-helpers@1.10.4: + dependencies: + web3-eth-iban: 1.10.4 + web3-utils: 1.10.4 + + web3-core-helpers@1.2.11: + dependencies: + underscore: 1.9.1 + web3-eth-iban: 1.2.11 + web3-utils: 1.2.11 + optional: true + + web3-core-method@1.10.0: + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.0 + web3-core-promievent: 1.10.0 + web3-core-subscriptions: 1.10.0 + web3-utils: 1.10.0 + + web3-core-method@1.10.4: + dependencies: + '@ethersproject/transactions': 5.7.0 + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-utils: 1.10.4 + + web3-core-method@1.2.11: + dependencies: + '@ethersproject/transactions': 5.7.0 + underscore: 1.9.1 + web3-core-helpers: 1.2.11 + web3-core-promievent: 1.2.11 + web3-core-subscriptions: 1.2.11 + web3-utils: 1.2.11 + optional: true + + web3-core-promievent@1.10.0: + dependencies: + eventemitter3: 4.0.4 + + web3-core-promievent@1.10.4: + dependencies: + eventemitter3: 4.0.4 + + web3-core-promievent@1.2.11: + dependencies: + eventemitter3: 4.0.4 + optional: true + + web3-core-requestmanager@1.10.0(encoding@0.1.13): + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.0 + web3-providers-http: 1.10.0(encoding@0.1.13) + web3-providers-ipc: 1.10.0 + web3-providers-ws: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + web3-core-requestmanager@1.10.4(encoding@0.1.13): + dependencies: + util: 0.12.5 + web3-core-helpers: 1.10.4 + web3-providers-http: 1.10.4(encoding@0.1.13) + web3-providers-ipc: 1.10.4 + web3-providers-ws: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-core-requestmanager@1.2.11: + dependencies: + underscore: 1.9.1 + web3-core-helpers: 1.2.11 + web3-providers-http: 1.2.11 + web3-providers-ipc: 1.2.11 + web3-providers-ws: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-core-subscriptions@1.10.0: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.0 + + web3-core-subscriptions@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + + web3-core-subscriptions@1.2.11: + dependencies: + eventemitter3: 4.0.4 + underscore: 1.9.1 + web3-core-helpers: 1.2.11 + optional: true + + web3-core@1.10.0(encoding@0.1.13): + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-core-requestmanager: 1.10.0(encoding@0.1.13) + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + web3-core@1.10.4(encoding@0.1.13): + dependencies: + '@types/bn.js': 5.1.5 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-requestmanager: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-core@1.2.11: + dependencies: + '@types/bn.js': 4.11.6 + '@types/node': 12.20.55 + bignumber.js: 9.1.2 + web3-core-helpers: 1.2.11 + web3-core-method: 1.2.11 + web3-core-requestmanager: 1.2.11 + web3-utils: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-eth-abi@1.10.0: + dependencies: + '@ethersproject/abi': 5.7.0 + web3-utils: 1.10.0 + + web3-eth-abi@1.10.4: + dependencies: + '@ethersproject/abi': 5.7.0 + web3-utils: 1.10.4 + + web3-eth-abi@1.2.11: + dependencies: + '@ethersproject/abi': 5.0.0-beta.153 + underscore: 1.9.1 + web3-utils: 1.2.11 + optional: true + + web3-eth-accounts@1.10.0(encoding@0.1.13): + dependencies: + '@ethereumjs/common': 2.5.0 + '@ethereumjs/tx': 3.3.2 + eth-lib: 0.2.8 + ethereumjs-util: 7.1.5 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.0(encoding@0.1.13) + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-accounts@1.10.4(encoding@0.1.13): + dependencies: + '@ethereumjs/common': 2.6.5 + '@ethereumjs/tx': 3.5.2 + '@ethereumjs/util': 8.1.0 + eth-lib: 0.2.8 + scrypt-js: 3.0.1 + uuid: 9.0.1 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-accounts@1.2.11: + dependencies: + crypto-browserify: 3.12.0 + eth-lib: 0.2.8 + ethereumjs-common: 1.5.0 + ethereumjs-tx: 2.1.2 + scrypt-js: 3.0.1 + underscore: 1.9.1 + uuid: 3.3.2 + web3-core: 1.2.11 + web3-core-helpers: 1.2.11 + web3-core-method: 1.2.11 + web3-utils: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-eth-contract@1.10.0(encoding@0.1.13): + dependencies: + '@types/bn.js': 5.1.5 + web3-core: 1.10.0(encoding@0.1.13) + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-core-promievent: 1.10.0 + web3-core-subscriptions: 1.10.0 + web3-eth-abi: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-contract@1.10.4(encoding@0.1.13): + dependencies: + '@types/bn.js': 5.1.5 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-promievent: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-contract@1.2.11: + dependencies: + '@types/bn.js': 4.11.6 + underscore: 1.9.1 + web3-core: 1.2.11 + web3-core-helpers: 1.2.11 + web3-core-method: 1.2.11 + web3-core-promievent: 1.2.11 + web3-core-subscriptions: 1.2.11 + web3-eth-abi: 1.2.11 + web3-utils: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-eth-ens@1.10.0(encoding@0.1.13): + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.0(encoding@0.1.13) + web3-core-helpers: 1.10.0 + web3-core-promievent: 1.10.0 + web3-eth-abi: 1.10.0 + web3-eth-contract: 1.10.0(encoding@0.1.13) + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-ens@1.10.4(encoding@0.1.13): + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-promievent: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-contract: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-ens@1.2.11: + dependencies: + content-hash: 2.5.2 + eth-ens-namehash: 2.0.8 + underscore: 1.9.1 + web3-core: 1.2.11 + web3-core-helpers: 1.2.11 + web3-core-promievent: 1.2.11 + web3-eth-abi: 1.2.11 + web3-eth-contract: 1.2.11 + web3-utils: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-eth-iban@1.10.0: + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.0 + + web3-eth-iban@1.10.4: + dependencies: + bn.js: 5.2.1 + web3-utils: 1.10.4 + + web3-eth-iban@1.2.11: + dependencies: + bn.js: 4.12.0 + web3-utils: 1.2.11 + optional: true + + web3-eth-personal@1.10.0(encoding@0.1.13): + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.0(encoding@0.1.13) + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-net: 1.10.0(encoding@0.1.13) + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-personal@1.10.4(encoding@0.1.13): + dependencies: + '@types/node': 12.20.55 + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-net: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth-personal@1.2.11: + dependencies: + '@types/node': 12.20.55 + web3-core: 1.2.11 + web3-core-helpers: 1.2.11 + web3-core-method: 1.2.11 + web3-net: 1.2.11 + web3-utils: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-eth@1.10.0(encoding@0.1.13): + dependencies: + web3-core: 1.10.0(encoding@0.1.13) + web3-core-helpers: 1.10.0 + web3-core-method: 1.10.0 + web3-core-subscriptions: 1.10.0 + web3-eth-abi: 1.10.0 + web3-eth-accounts: 1.10.0(encoding@0.1.13) + web3-eth-contract: 1.10.0(encoding@0.1.13) + web3-eth-ens: 1.10.0(encoding@0.1.13) + web3-eth-iban: 1.10.0 + web3-eth-personal: 1.10.0(encoding@0.1.13) + web3-net: 1.10.0(encoding@0.1.13) + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-helpers: 1.10.4 + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-eth-abi: 1.10.4 + web3-eth-accounts: 1.10.4(encoding@0.1.13) + web3-eth-contract: 1.10.4(encoding@0.1.13) + web3-eth-ens: 1.10.4(encoding@0.1.13) + web3-eth-iban: 1.10.4 + web3-eth-personal: 1.10.4(encoding@0.1.13) + web3-net: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-eth@1.2.11: + dependencies: + underscore: 1.9.1 + web3-core: 1.2.11 + web3-core-helpers: 1.2.11 + web3-core-method: 1.2.11 + web3-core-subscriptions: 1.2.11 + web3-eth-abi: 1.2.11 + web3-eth-accounts: 1.2.11 + web3-eth-contract: 1.2.11 + web3-eth-ens: 1.2.11 + web3-eth-iban: 1.2.11 + web3-eth-personal: 1.2.11 + web3-net: 1.2.11 + web3-utils: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-net@1.10.0(encoding@0.1.13): + dependencies: + web3-core: 1.10.0(encoding@0.1.13) + web3-core-method: 1.10.0 + web3-utils: 1.10.0 + transitivePeerDependencies: + - encoding + - supports-color + + web3-net@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-method: 1.10.4 + web3-utils: 1.10.4 + transitivePeerDependencies: + - encoding + - supports-color + + web3-net@1.2.11: + dependencies: + web3-core: 1.2.11 + web3-core-method: 1.2.11 + web3-utils: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-provider-engine@14.2.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + async: 2.6.2 + backoff: 2.5.0 + clone: 2.1.2 + cross-fetch: 2.2.6(encoding@0.1.13) + eth-block-tracker: 3.0.1 + eth-json-rpc-infura: 3.2.1(encoding@0.1.13) + eth-sig-util: 1.4.2 + ethereumjs-block: 1.7.1 + ethereumjs-tx: 1.3.7 + ethereumjs-util: 5.2.1 + ethereumjs-vm: 2.6.0 + json-rpc-error: 2.0.0 + json-stable-stringify: 1.1.1 + promise-to-callback: 1.0.0 + readable-stream: 2.3.8 + request: 2.88.2 + semaphore: 1.1.0 + ws: 5.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) + xhr: 2.6.0 + xtend: 4.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + web3-providers-http@1.10.0(encoding@0.1.13): + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 3.1.8(encoding@0.1.13) + es6-promise: 4.2.8 + web3-core-helpers: 1.10.0 + transitivePeerDependencies: + - encoding + + web3-providers-http@1.10.4(encoding@0.1.13): + dependencies: + abortcontroller-polyfill: 1.7.5 + cross-fetch: 4.0.0(encoding@0.1.13) + es6-promise: 4.2.8 + web3-core-helpers: 1.10.4 + transitivePeerDependencies: + - encoding + + web3-providers-http@1.2.11: + dependencies: + web3-core-helpers: 1.2.11 + xhr2-cookies: 1.1.0 + optional: true + + web3-providers-ipc@1.10.0: + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.0 + + web3-providers-ipc@1.10.4: + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.10.4 + + web3-providers-ipc@1.2.11: + dependencies: + oboe: 2.1.4 + underscore: 1.9.1 + web3-core-helpers: 1.2.11 + optional: true + + web3-providers-ws@1.10.0: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.0 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + + web3-providers-ws@1.10.4: + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.10.4 + websocket: 1.0.34 + transitivePeerDependencies: + - supports-color + + web3-providers-ws@1.2.11: + dependencies: + eventemitter3: 4.0.4 + underscore: 1.9.1 + web3-core-helpers: 1.2.11 + websocket: 1.0.32 + transitivePeerDependencies: + - supports-color + optional: true + + web3-shh@1.10.0(encoding@0.1.13): + dependencies: + web3-core: 1.10.0(encoding@0.1.13) + web3-core-method: 1.10.0 + web3-core-subscriptions: 1.10.0 + web3-net: 1.10.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + web3-shh@1.10.4(encoding@0.1.13): + dependencies: + web3-core: 1.10.4(encoding@0.1.13) + web3-core-method: 1.10.4 + web3-core-subscriptions: 1.10.4 + web3-net: 1.10.4(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + web3-shh@1.2.11: + dependencies: + web3-core: 1.2.11 + web3-core-method: 1.2.11 + web3-core-subscriptions: 1.2.11 + web3-net: 1.2.11 + transitivePeerDependencies: + - supports-color + optional: true + + web3-utils@1.10.0: + dependencies: + bn.js: 5.2.1 + ethereum-bloom-filters: 1.0.10 + ethereumjs-util: 7.1.5 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + + web3-utils@1.10.4: + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.1 + ethereum-bloom-filters: 1.0.10 + ethereum-cryptography: 2.1.3 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + + web3-utils@1.2.11: + dependencies: + bn.js: 4.12.0 + eth-lib: 0.2.8 + ethereum-bloom-filters: 1.0.10 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + underscore: 1.9.1 + utf8: 3.0.0 + optional: true + + web3@1.10.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + web3-bzz: 1.10.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + web3-core: 1.10.0(encoding@0.1.13) + web3-eth: 1.10.0(encoding@0.1.13) + web3-eth-personal: 1.10.0(encoding@0.1.13) + web3-net: 1.10.0(encoding@0.1.13) + web3-shh: 1.10.0(encoding@0.1.13) + web3-utils: 1.10.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + web3@1.10.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): + dependencies: + web3-bzz: 1.10.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + web3-core: 1.10.4(encoding@0.1.13) + web3-eth: 1.10.4(encoding@0.1.13) + web3-eth-personal: 1.10.4(encoding@0.1.13) + web3-net: 1.10.4(encoding@0.1.13) + web3-shh: 1.10.4(encoding@0.1.13) + web3-utils: 1.10.4 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + web3@1.2.11(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + web3-bzz: 1.2.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) + web3-core: 1.2.11 + web3-eth: 1.2.11 + web3-eth-personal: 1.2.11 + web3-net: 1.2.11 + web3-shh: 1.2.11 + web3-utils: 1.2.11 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + optional: true + + webidl-conversions@3.0.1: {} + + websocket@1.0.32: + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.63 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + + websocket@1.0.34: + dependencies: + bufferutil: 4.0.8 + debug: 2.6.9 + es5-ext: 0.10.63 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + + whatwg-fetch@2.0.4: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-module@1.0.0: {} + + which-module@2.0.1: {} + + which-typed-array@1.1.14: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wide-align@1.1.3: + dependencies: + string-width: 2.1.1 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + window-size@0.2.0: {} + + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + wordwrapjs@4.0.1: + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + + workerpool@6.2.1: {} + + wrap-ansi@2.1.0: + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + ultron: 1.1.1 + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@5.2.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + async-limiter: 1.0.1 + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@8.5.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + xhr-request-promise@0.1.3: + dependencies: + xhr-request: 1.1.0 + + xhr-request@1.1.0: + dependencies: + buffer-to-arraybuffer: 0.0.5 + object-assign: 4.1.1 + query-string: 5.1.1 + simple-get: 2.8.2 + timed-out: 4.0.1 + url-set-query: 1.0.0 + xhr: 2.6.0 + + xhr2-cookies@1.1.0: + dependencies: + cookiejar: 2.1.4 + optional: true + + xhr@2.6.0: + dependencies: + global: 4.4.0 + is-function: 1.0.2 + parse-headers: 2.0.5 + xtend: 4.0.2 + + xmlhttprequest@1.8.0: {} + + xtend@2.1.2: + dependencies: + object-keys: 0.4.0 + + xtend@4.0.2: {} + + y18n@3.2.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yaeti@0.0.6: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@2.4.1: + dependencies: + camelcase: 3.0.0 + lodash.assign: 4.2.0 + + yargs-parser@20.2.4: {} + + yargs-unparser@1.6.0: + dependencies: + flat: 4.1.1 + lodash: 4.17.21 + yargs: 13.3.2 + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + + yargs@4.8.1: + dependencies: + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + lodash.assign: 4.2.0 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + window-size: 0.2.0 + y18n: 3.2.2 + yargs-parser: 2.4.1 + + yesno@0.3.1: {} + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} diff --git a/packages/wallet/wallet-contracts/remappings.txt b/packages/wallet/wallet-contracts/remappings.txt new file mode 100644 index 000000000..a1103484d --- /dev/null +++ b/packages/wallet/wallet-contracts/remappings.txt @@ -0,0 +1,3 @@ +ds-test/=lib/forge-std/lib/ds-test/src/ +forge-std-1.11.0/=dependencies/forge-std-1.11.0/ +forge-std/=lib/forge-std/src/ diff --git a/packages/wallet/wallet-contracts/run_huff_tests.sh b/packages/wallet/wallet-contracts/run_huff_tests.sh new file mode 100644 index 000000000..53576a9d7 --- /dev/null +++ b/packages/wallet/wallet-contracts/run_huff_tests.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +for file in $(find ./src -type f -name '*.huff'); do + echo "Testing $file..." + output=$(huffc "$file" test 2>&1) + echo "$output" + + # Check for the presence of [FAIL] that is not part of another word like [PASS] + if echo "$output" | grep -E 'FAIL' > /dev/null; then + echo "Failure detected in $file" + exit 255 + else + echo "Processed $file successfully" + fi +done + +echo "All tests completed" \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/soldeer.lock b/packages/wallet/wallet-contracts/soldeer.lock new file mode 100644 index 000000000..2072d0284 --- /dev/null +++ b/packages/wallet/wallet-contracts/soldeer.lock @@ -0,0 +1,6 @@ +[[dependencies]] +name = "forge-std" +version = "1.11.0" +url = "https://soldeer-revisions.s3.amazonaws.com/forge-std/1_11_0_09-10-2025_06:23:22_forge-std-1.11.zip" +checksum = "0290ef84c693dc9086f98f6a9b4a69dc5c2b6aa1cfe10a989bd1def1a456c099" +integrity = "84aa7d32f8c7329468cf16f31f0f74e68072e634fdbde98f3bb00c6b136103b2" diff --git a/packages/wallet/wallet-contracts/src/Errors.huff b/packages/wallet/wallet-contracts/src/Errors.huff new file mode 100644 index 000000000..fbc60a09f --- /dev/null +++ b/packages/wallet/wallet-contracts/src/Errors.huff @@ -0,0 +1,158 @@ +/// @title Errors +/// @notice SPDX-License-Identifier: MIT +/// @author jtriley.eth +/// @author clabby +/// @notice Custom error utilities. + +// https://docs.soliditylang.org/en/latest/control-structures.html?highlight=panic#panic-via-assert-and-error-via-require + +// Errors +#define error Error(string) +#define error Panic(uint256) + +// Constants +// Solidity Panic Codes +#define constant COMPILER_PANIC = 0x00 +#define constant ASSERT_FALSE = 0x01 +#define constant ARITHMETIC_OVERFLOW = 0x11 +#define constant DIVIDE_BY_ZERO = 0x12 +#define constant INVALID_ENUM_VALUE = 0x21 +#define constant INVALID_STORAGE_BYTE_ARRAY = 0x22 +#define constant EMPTY_ARRAY_POP = 0x31 +#define constant ARRAY_OUT_OF_BOUNDS = 0x32 +#define constant MEMORY_TOO_LARGE = 0x41 +#define constant UNINITIALIZED_FUNCTION_POINTER = 0x51 + +/* + +Solidity Require. Error `string` MUST be no greater than 32 bytes. + +MEMORY LAYOUT WHEN THROWN +| sig || message offset || message length || message "revert" | +0x08c379a 0000000000000000000000000000000000000000000000000000000000000020 0000000000000000000000000000000000000000000000000000000000000006 7265766572740000000000000000000000000000000000000000000000000000 + +*/ +#define macro REQUIRE() = takes (3) returns (0) { + // takes: // [condition, message_length, message] + do_not_throw // [do_not_throw_jumpdest, condition, message_length, message] + jumpi // [message_length, message] + __ERROR(Error) // [error_sig, , message_length, message] + 0x00 // [mem_ptr, error_sig, message_length, message] + mstore // [message_length, message] + 0x20 // [message_offset, message_length, message] + 0x04 // [message_offset_ptr, message_offset, message_length, message] + mstore // [message_length, message] + 0x24 // [message_length_ptr, message_length, message] + mstore // [message] + 0x44 // [message_ptr, message] + mstore // [] + 0x80 // [size] + 0x00 // [offset, size] + revert // [] + do_not_throw: // [message_length, message] + pop // [message] + pop // [] +} + +/* + +Solidity Panic. + +MEMORY LAYOUT WHEN THROWN +| sig || panic code | +0x4e487b71 0000000000000000000000000000000000000000000000000000000000000001 + +*/ +#define macro PANIC() = takes (1) returns (0) { + // takes: // [panic_code] + __ERROR(Panic) // [panic_sig, panic_code] + 0x00 // [panic_sig_offset, panic_sig, panic_code] + mstore // [panic_code] + 0x04 // [panic_code_offset, panic_code] + mstore // [] + 0x24 // [revert_size] + 0x00 // [revert_offset, revert_size] + revert // [] +} + +/* +Solidity Assert. + +MEMORY LAYOUT WHEN THROWN +| sig || assert failed panic code | +0x4e487b71 0000000000000000000000000000000000000000000000000000000000000001 + +*/ +#define macro ASSERT() = takes (1) returns (0) { + // takes: // [condition] + do_not_panic // [do_not_panic_jumpdest, condition] + jumpi // [] + [ASSERT_FALSE] // [assert_false] + PANIC() // [] + do_not_panic: // [] +} + +// Assert that two stack elements are equal +#define macro ASSERT_EQ() = { + // takes: [a, b] + eq // [a == b] + ASSERT() // [] +} + +// Assert that two stack elements are not equal +#define macro ASSERT_NOT_EQ() = { + // takes: [a, b] + eq iszero // [a != b] + ASSERT() // [] +} + +// Assert that two memory offsets contain equal words +#define macro ASSERT_MEM_EQ(ptr_a, ptr_b) = { + // takes: [] + mload // [b] + mload // [a, b] + eq // [a == b] + ASSERT() // [] +} + +// Assert that two memory offsets do not contain equal words +#define macro ASSERT_MEM_NOT_EQ(ptr_a, ptr_b) = { + // takes: [] + mload // [b] + mload // [a, b] + eq iszero // [a != b] + ASSERT() // [] +} + +// Assert that two storage slots contain equal words +#define macro ASSERT_STORAGE_EQ(slot_a, slot_b) = { + // takes: [] + sload // [b] + sload // [a, b] + eq // [a == b] + ASSERT() // [] +} + +// Assert that two storage slots do not contain equal words +#define macro ASSERT_STORAGE_NOT_EQ(slot_a, slot_b) = { + // takes: [] + sload // [b] + sload // [a, b] + eq iszero // [a != b] + ASSERT() // [] +} + +/* Bubbles up revert data if call failed. Call directly after `call`, `staticcall`, `delegatecall`. */ +#define macro BUBBLE_UP_IF_FAILED() = takes (1) returns (0) { + // takes: // [call_succeeded] + call_succeeded // [call_succeeded_jumpdest, call_succeeded] + jumpi // [] + returndatasize // [returndatasize] + 0x00 // [memory_offset, returndatasize] + returndatasize // [returndatasize, memory_offset, returndatasize] + dup2 // [returndata_offset, returndatasize, memory_offset, returndatasize] + dup3 // [memory_offset, returndata_offset, returndatasize, memory_offset, returndatasize] + returndatacopy // [memory_offset, returndatasize] + revert // [] + call_succeeded: +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/L2Compressor.huff b/packages/wallet/wallet-contracts/src/L2Compressor.huff new file mode 100644 index 000000000..b5bb04435 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/L2Compressor.huff @@ -0,0 +1,140 @@ +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/L2CompressorLib.huff b/packages/wallet/wallet-contracts/src/L2CompressorLib.huff new file mode 100644 index 000000000..a5e91956f --- /dev/null +++ b/packages/wallet/wallet-contracts/src/L2CompressorLib.huff @@ -0,0 +1,2562 @@ +#include "./Errors.huff" + +#define constant ADDR_BYTES_STORAGE = 0x00 +#define constant FMS = 0xa0 + +#define constant FLAG_READ_BYTES32_2_BYTES = 0x27 +#define constant FLAG_READ_ADDRESS_2_BYTES = 0x23 + +#define constant BYTES32_SMV = 0x80 +#define constant ADDRESS_SMV = 0x01 + +#define macro PERFORM_READ_SLOTS() = takes (0) returns (1) { + // input stack: [] + + 0x01 // [0x01] + dup1 // [rindex, 0x01] + callvalue // [windex, rindex, 0x01] + + read_another: + dup2 // [rindex, windex, rindex] + calldataload // [data[rindex], windex, rindex] + sload // [sload[data[rindex]], windex, rindex] + dup2 // [windex, sload[data[rindex]], windex, rindex] + mstore // [windex, rindex] + + 0x20 // [0x20, windex, rindex] + swap2 // [rindex, windex, 0x20] + dup3 // [0x20, rindex, windex, 0x20] + add // [(0x20 + rindex), windex, 0x20] + swap2 // [0x20, windex, (0x20 + rindex)] + add // [(0x20 + windex), (0x20 + rindex)] + + calldatasize // [size, (0x20 + windex), (0x20 + rindex)] + dup3 // [(0x20 + rindex), size, (0x20 + windex), (0x20 + rindex)] + lt // [((0x20 + rindex) < size), (0x20 + windex), (0x20 + rindex)] + read_another jumpi // [windex, rindex] + + pop // [rindex, 0x01] + sub // [(rindex - 0x01)] + + // output stack: [size] +} + +#define macro PERFORM_READ_SIZES() = takes (0) returns (0) { + + callvalue // [0x00] + sload // [sload[0x00]] + callvalue // [value, sload[0x00]] + mstore // [] + +} + +#define macro PERFORM_READ_ADDRESS() = takes (0) returns (0) { + + 0x01 // [0x01] + calldataload // [data[0x01]] + + [ADDRESS_SMV] // [ADDRESS_SMV, data[0x00]] + add // [(ADDRESS_SMV + data[0x00])] + sload // [sload[(ADDRESS_SMV + data[0x00])]] + + callvalue // [0x00, sload[(ADDRESS_SMV + data[0x00])]] + mstore // [] + +} + +#define macro PERFORM_READ_BYTES32() = takes (0) returns (0) { + + 0x01 // [0x01] + calldataload // [data[0x01]] + + [BYTES32_SMV] // [BYTES32_SMV, data[0x00]] + shl // [(data[0x00] << BYTES32_SMV)] + sload // [sload[(data[0x00] << BYTES32_SMV)]] + + callvalue // [0x00, sload[(data[0x00] << BYTES32_SMV)]] + mstore // [] + +} + +#define macro PERFORM_MANY_EXECUTES(nrfs) = takes (1) returns (3) { + // input stack: [rindex] + + LOAD_1_BYTE() // [size, rindex] + callvalue // [i, size, rindex] + swap2 // [rindex, size, i] + + do_another: + PERFORM_EXECUTE() // [rindex, size, i] + swap2 // [i, size, rindex] + 0x01 // [0x01, i, size, rindex] + add // [(0x01 + i), size, rindex] + swap2 // [rindex, size, (0x01 + i)] + + dup2 // [size, rindex, size, (0x01 + i)] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i)] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i)] + do_another jumpi // [rindex, size, (0x01 + i)] + + // output stack: [rindex, size, i] +} + +#define macro PERFORM_EXECUTE(nrfs) = takes (1) returns (1) { + // input stack: [rindex] + + [FMS] // [windex, rindex] + READ_EXECUTE() // [windex, rindex] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + BACKREAD_SINGLE_VALUE() // [address, windex, rindex] + + swap1 // [windex, address, rindex] + [FMS] // [FMS, windex, address, rindex] + swap1 // [windex, FMS, address, rindex] + sub // [size, address, rindex] + + callvalue // [0x00, size, address, rindex] + swap1 // [size, 0x00, address, rindex] + [FMS] // [FMS, size, 0x00, address, rindex] + callvalue // [0x00, FMS, size, 0x00, address, rindex] + callvalue // [0x00, 0x00, FMS, size, 0x00, address, rindex] + swap5 // [address, 0x00, FMS, size, 0x00, 0x00, rindex] + gaslimit // [gasLimit, address, 0x00, FMS, size, 0x00, 0x00, rindex] + call // [success, rindex] + + // For now, pop seems safer, since it won't revert all transactions if this is a batch + // the only thing to consider is that this could difficult the gas calculation + pop // [rindex] + + // output stack: [rindex] +} + +#define macro ADDRESSES_NUM() = takes (0) returns (1) { + [ADDR_BYTES_STORAGE] sload // [packed] + 0x80 shr // [num] + + // output stack: [num] +} + +#define macro PULL_ADDRESS() = takes(0) returns (1) { + [ADDR_BYTES_STORAGE] sload // [packed] + dup1 // [packed, packed] + 0x80 shr // [num, packed] + + 0x01 add // [num + 1, packed] + swap1 // [packed, num + 1] + + // Mask packed (only want lower 128 bits) + 0xffffffffffffffffffffffffffffffff and + + dup2 // [num + 1, packed, num + 1] + 0x80 shl // [num + 1 << 0x80, packed, num + 1] + or // [nextpacked, num + 1] + + [ADDR_BYTES_STORAGE] sstore // [num + 1] + + // output stack: [num + 1] +} + +#define macro BYTES32_STORAGE_POINTER() = takes (1) returns (1) { + // input stack: [index] + 0x80 shl + // output stack: [index << 0x80] +} + +#define macro ADDRESS_STORAGE_POINTER() = takes (1) returns (1) { + // input stack: [index] + 0x01 add + // output stack: [index + 1] +} + +#define macro BYTES32_NUM() = takes (0) returns (1) { + [ADDR_BYTES_STORAGE] sload // [packed] + 0xffffffffffffffffffffffffffffffff and // [num] + + // output stack: [num] +} + +#define macro PULL_BYTES32() = takes(0) returns (1) { + [ADDR_BYTES_STORAGE] sload // [packed] + dup1 // [packed, packed] + 0xffffffffffffffffffffffffffffffff and // [num, packed] + + 0x01 add // [num + 1, packed] + swap1 // [packed, num + 1] + + 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000 and // [packed, num + 1] + + dup2 // [num + 1, packed, num + 1] + or // [nextpacked, num + 1] + + [ADDR_BYTES_STORAGE] sstore // [num + 1] + + // output stack: [num + 1] +} + +#define jumptable__packed FLAG_TABLE { + FLAG_READ_POWER_OF_10_MISC // 0x00 + FLAG_READ_BYTES32_1_BYTES // 0x01 + FLAG_READ_BYTES32_2_BYTES // 0x02 + FLAG_READ_BYTES32_3_BYTES // 0x03 + FLAG_READ_BYTES32_4_BYTES // 0x04 + FLAG_READ_BYTES32_5_BYTES // 0x05 + FLAG_READ_BYTES32_6_BYTES // 0x06 + FLAG_READ_BYTES32_7_BYTES // 0x07 + FLAG_READ_BYTES32_8_BYTES // 0x08 + FLAG_READ_BYTES32_9_BYTES // 0x09 + FLAG_READ_BYTES32_10_BYTES // 0x0a + FLAG_READ_BYTES32_11_BYTES // 0x0b + FLAG_READ_BYTES32_12_BYTES // 0x0c + FLAG_READ_BYTES32_13_BYTES // 0x0d + FLAG_READ_BYTES32_14_BYTES // 0x0e + FLAG_READ_BYTES32_15_BYTES // 0x0f + FLAG_READ_BYTES32_16_BYTES // 0x10 + FLAG_READ_BYTES32_17_BYTES // 0x11 + FLAG_READ_BYTES32_18_BYTES // 0x12 + FLAG_READ_BYTES32_19_BYTES // 0x13 + FLAG_READ_BYTES32_20_BYTES // 0x14 + FLAG_READ_BYTES32_21_BYTES // 0x15 + FLAG_READ_BYTES32_22_BYTES // 0x16 + FLAG_READ_BYTES32_23_BYTES // 0x17 + FLAG_READ_BYTES32_24_BYTES // 0x18 + FLAG_READ_BYTES32_25_BYTES // 0x19 + FLAG_READ_BYTES32_26_BYTES // 0x1a + FLAG_READ_BYTES32_27_BYTES // 0x1b + FLAG_READ_BYTES32_28_BYTES // 0x1c + FLAG_READ_BYTES32_29_BYTES // 0x1d + FLAG_READ_BYTES32_30_BYTES // 0x1e + FLAG_READ_BYTES32_31_BYTES // 0x1f + FLAG_READ_BYTES32_32_BYTES // 0x20 + FLAG_SAVE_ADDRESS // 0x21 + FLAG_SAVE_BYTES32 // 0x22 + FLAG_READ_ADDRESS_2 // 0x23 + FLAG_READ_ADDRESS_3 // 0x24 + FLAG_READ_ADDRESS_4 // 0x25 + FLAG_READ_EXECUTE // 0x26 + FLAG_READ_BYTES32_2 // 0x27 + FLAG_READ_BYTES32_3 // 0x28 + FLAG_READ_BYTES32_4 // 0x29 + FLAG_READ_POW_10_MANTISSA // 0x2a + FLAG_READ_N_BYTES // 0x2b + FLAG_READ_POWER_OF_2 // 0x2c + FLAG_ABI_0_PARAM // 0x2d + FLAG_ABI_1_PARAM // 0x2e + FLAG_ABI_2_PARAMS // 0x2f + FLAG_ABI_3_PARAMS // 0x20 + FLAG_ABI_4_PARAMS // 0x31 + FLAG_ABI_5_PARAMS // 0x32 + FLAG_ABI_6_PARAMS // 0x33 + FLAG_NESTED_N_FLAGS_8 // 0x34 + FLAG_NESTED_N_FLAGS_16 // 0x35 + // start: Signature specific methods + FLAG_SIGNATURE_W0 // 0x36 + FLAG_SIGNATURE_W1 // 0x37 + FLAG_SIGNATURE_W2 // 0x38 + FLAG_SIGNATURE_W3 // 0x39 + FLAG_SIGNATURE_W4 // 0x3a + FLAG_ADDRESS_W0 // 0x3b + FLAG_ADDRESS_W1 // 0x3c + FLAG_ADDRESS_W2 // 0x3d + FLAG_ADDRESS_W3 // 0x3e + FLAG_ADDRESS_W4 // 0x4f + FLAG_NODE // 0x40 + FLAG_BRANCH // 0x41 + FLAG_SUBDIGEST // 0x42 + FLAG_NESTED // 0x43 + FLAG_DYNAMIC_SIGNATURE // 0x44 + FLAG_S_SIG_NO_CHAIN // 0x45 + FLAG_S_SIG // 0x46 + FLAG_S_L_SIG_NO_CHAIN // 0x47 + FLAG_S_L_SIG // 0x48 + FLAG_READ_CHAINED // 0x49 + FLAG_READ_CHAINED_L // 0x4a + // end: Sequence specific methods + FLAG_READ_DYNAMIC_ABI // 0x4b + FLAG_NO_OP // 0x4c + FLAG_MIRROR_FLAG // 0x4d + FLAG_COPY_CALLDATA // 0x4e + FLAG_READ_STORE_FLAG // 0x4f +} + +#define constant HIGHEST_FLAG = 0x4f +#define constant HIGHEST_FLAG_PLUS_ONE = 0x50 + +#define macro READ_FLAG() = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + end // [end, rindex, windex] + swap2 // [windex, rindex, end] + + nrfs: + FN_READ_FLAG(nrfs) // [windex, rindex] + + end: +} + +#define macro FN_READ_FLAG(nrfs) = takes (3) returns (2) { + // input stack: [windex, rindex, jump_to] + + dup2 // [rindex, windex, rindex, jump_to] + calldataload // [cdata[rindex], windex, rindex, jump_to] + callvalue byte // [flag, windex, rindex, jump_to] + + swap2 // [rindex, windex, flag, jump_to] + 0x01 add // [rindex + 1, windex, flag, jump_to] + swap2 // [flag, windex, rindex + 1, jump_to] + + dup1 // [flag, flag, windex, rindex + 1, jump_to] + [HIGHEST_FLAG] lt // [HIGHEST_FLAG < flag, flag, windex, rindex + 1, jump_to] + default jumpi // [flag, windex, rindex + 1, jump_to] + + // Starts to become cheaper to skip the loading + // after 5 times, most real world cases will have more than + // 5 times. Notice that this assumes a single READ_FLAG instance + callvalue mload no_load jumpi + __tablesize(FLAG_TABLE) // [table_size, flag, windex, rindex + 1, jump_to] + __tablestart(FLAG_TABLE) // [table_start, table_size, flag, windex, rindex + 1, jump_to] + callvalue // [0x00, table_start, table_size, flag, windex, rindex + 1, jump_to] + codecopy // [flag, windex, rindex + 1] + no_load: + + 0x01 shl // [flag << 0x01, windex, rindex + 1, jump_to] + mload // [word, windex, rindex + 1, jump_to] + 0xf0 shr // [word >> 0xf0, windex, rindex + 1, jump_to] + jump // [windex, rindex + 1, jump_to] + + FLAG_READ_POWER_OF_10_MISC: + __tablestart(POW_10_TABLE) + READ_POW_10_AND_SELF_EXECUTE() + end jump + FLAG_READ_BYTES32_1_BYTES: + READ_BYTES32(0xf8, 0x01) + end jump + FLAG_READ_BYTES32_2_BYTES: + READ_BYTES32(0xf0, 0x02) + end jump + FLAG_READ_BYTES32_3_BYTES: + READ_BYTES32(0xe8, 0x03) + end jump + FLAG_READ_BYTES32_4_BYTES: + READ_BYTES32(0xe0, 0x04) + end jump + FLAG_READ_BYTES32_5_BYTES: + READ_BYTES32(0xd8, 0x05) + end jump + FLAG_READ_BYTES32_6_BYTES: + READ_BYTES32(0xd0, 0x06) + end jump + FLAG_READ_BYTES32_7_BYTES: + READ_BYTES32(0xc8, 0x07) + end jump + FLAG_READ_BYTES32_8_BYTES: + READ_BYTES32(0xc0, 0x08) + end jump + FLAG_READ_BYTES32_9_BYTES: + READ_BYTES32(0xb8, 0x09) + end jump + FLAG_READ_BYTES32_10_BYTES: + READ_BYTES32(0xb0, 0x0a) + end jump + FLAG_READ_BYTES32_11_BYTES: + READ_BYTES32(0xa8, 0x0b) + end jump + FLAG_READ_BYTES32_12_BYTES: + READ_BYTES32(0xa0, 0x0c) + end jump + FLAG_READ_BYTES32_13_BYTES: + READ_BYTES32(0x98, 0x0d) + end jump + FLAG_READ_BYTES32_14_BYTES: + READ_BYTES32(0x90, 0x0e) + end jump + FLAG_READ_BYTES32_15_BYTES: + READ_BYTES32(0x88, 0x0f) + end jump + FLAG_READ_BYTES32_16_BYTES: + READ_BYTES32(0x80, 0x10) + end jump + FLAG_READ_BYTES32_17_BYTES: + READ_BYTES32(0x78, 0x11) + end jump + FLAG_READ_BYTES32_18_BYTES: + READ_BYTES32(0x70, 0x12) + end jump + FLAG_READ_BYTES32_19_BYTES: + READ_BYTES32(0x68, 0x13) + end jump + FLAG_READ_BYTES32_20_BYTES: + READ_BYTES32(0x60, 0x14) + end jump + FLAG_READ_BYTES32_21_BYTES: + READ_BYTES32(0x58, 0x15) + end jump + FLAG_READ_BYTES32_22_BYTES: + READ_BYTES32(0x50, 0x16) + end jump + FLAG_READ_BYTES32_23_BYTES: + READ_BYTES32(0x48, 0x17) + end jump + FLAG_READ_BYTES32_24_BYTES: + READ_BYTES32(0x40, 0x18) + end jump + FLAG_READ_BYTES32_25_BYTES: + READ_BYTES32(0x38, 0x19) + end jump + FLAG_READ_BYTES32_26_BYTES: + READ_BYTES32(0x30, 0x1a) + end jump + FLAG_READ_BYTES32_27_BYTES: + READ_BYTES32(0x28, 0x1b) + end jump + FLAG_READ_BYTES32_28_BYTES: + READ_BYTES32(0x20, 0x1c) + end jump + FLAG_READ_BYTES32_29_BYTES: + READ_BYTES32(0x18, 0x1d) + end jump + FLAG_READ_BYTES32_30_BYTES: + READ_BYTES32(0x10, 0x1e) + end jump + FLAG_READ_BYTES32_31_BYTES: + READ_BYTES32(0x08, 0x1f) + end jump + FLAG_READ_BYTES32_32_BYTES: + READ_BYTES32_WORD() + end jump + + FLAG_SAVE_ADDRESS: + SAVE_ADDRESS() + end jump + + FLAG_SAVE_BYTES32: + SAVE_BYTES32() + end jump + + FLAG_READ_ADDRESS_2: + READ_ADDRESS_STORAGE(0x02, 0xf0) + end jump + FLAG_READ_ADDRESS_3: + READ_ADDRESS_STORAGE(0x03, 0xe8) + end jump + FLAG_READ_ADDRESS_4: + READ_ADDRESS_STORAGE(0x04, 0xe0) + end jump + + FLAG_READ_EXECUTE: + READ_EXECUTE() + end jump + + FLAG_READ_BYTES32_2: + READ_BYTES32_STORAGE(0x02, 0xf0) + end jump + FLAG_READ_BYTES32_3: + READ_BYTES32_STORAGE(0x03, 0xe8) + end jump + FLAG_READ_BYTES32_4: + READ_BYTES32_STORAGE(0x04, 0xe0) + end jump // [end jump, windex, rindex + 1, jump_to] + + FLAG_READ_POW_10_MANTISSA: + __tablestart(POW_10_TABLE) + READ_POW_10_MANTISSA(0x05, 0xd8) + end jump + + FLAG_READ_N_BYTES: + READ_N_BYTES() + end jump + + FLAG_READ_POWER_OF_2: + READ_POW_2() + end jump + + FLAG_ABI_0_PARAM: + __tablestart(COMMON_4BYTES) // [table_start, windex, rindex] + READ_ABI_0() + end jump + FLAG_ABI_1_PARAM: + __tablestart(COMMON_4BYTES) // [table_start, windex, rindex] + READ_ABI_1() + end jump + FLAG_ABI_2_PARAMS: + __tablestart(COMMON_4BYTES) // [table_start, windex, rindex] + READ_ABI_2() + end jump + FLAG_ABI_3_PARAMS: + __tablestart(COMMON_4BYTES) // [table_start, windex, rindex] + READ_ABI_3() + end jump + FLAG_ABI_4_PARAMS: + __tablestart(COMMON_4BYTES) // [table_start, windex, rindex] + READ_ABI_4() + end jump + FLAG_ABI_5_PARAMS: + __tablestart(COMMON_4BYTES) // [table_start, windex, rindex] + READ_ABI_5() + end jump + FLAG_ABI_6_PARAMS: + __tablestart(COMMON_4BYTES) // [table_start, windex, rindex] + READ_ABI_6() + end jump + + FLAG_NESTED_N_FLAGS_8: + READ_NESTED_N_FLAGS_8() + end jump + FLAG_NESTED_N_FLAGS_16: + READ_NESTED_N_FLAGS_16() + end jump + + FLAG_SIGNATURE_W0: + READ_SIGNATURE_W0() + end jump + FLAG_SIGNATURE_W1: + READ_SIGNATURE_WX(0x01) + end jump + FLAG_SIGNATURE_W2: + READ_SIGNATURE_WX(0x02) + end jump + FLAG_SIGNATURE_W3: + READ_SIGNATURE_WX(0x03) + end jump + FLAG_SIGNATURE_W4: + READ_SIGNATURE_WX(0x04) + end jump + + FLAG_ADDRESS_W0: + READ_ADDRESS_W0() + end jump + FLAG_ADDRESS_W1: + READ_ADDRESS_WX(, 0x01) + end jump + FLAG_ADDRESS_W2: + READ_ADDRESS_WX(, 0x02) + end jump + FLAG_ADDRESS_W3: + READ_ADDRESS_WX(, 0x03) + end jump + FLAG_ADDRESS_W4: + READ_ADDRESS_WX(, 0x04) + end jump + + FLAG_NODE: + READ_NODE() + end jump + FLAG_BRANCH: + READ_BRANCH() + end jump + FLAG_SUBDIGEST: + READ_SUBDIGEST() + end jump + FLAG_NESTED: + READ_NESTED() + end jump + FLAG_DYNAMIC_SIGNATURE: + READ_DYNAMIC_SIGNATURE() + end jump + + FLAG_S_SIG_NO_CHAIN: + READ_SEQUENCE_SIGNATURE(, 0x02, 0x01, 0xf8) + end jump + FLAG_S_SIG: + READ_SEQUENCE_SIGNATURE(, 0x01, 0x01, 0xf8) + end jump + FLAG_S_L_SIG_NO_CHAIN: + READ_SEQUENCE_SIGNATURE(, 0x02, 0x02, 0xf0) + end jump + FLAG_S_L_SIG: + READ_SEQUENCE_SIGNATURE(, 0x01, 0x02, 0xf0) + end jump + + FLAG_READ_CHAINED: + READ_CHAINED(, 0x01, 0xf8) + end jump + FLAG_READ_CHAINED_L: + READ_CHAINED(, 0x02, 0xf0) + end jump + + FLAG_READ_DYNAMIC_ABI: + __tablestart(COMMON_4BYTES) + READ_ABI_DYNAMIC() + end jump + + FLAG_NO_OP: + end jump + FLAG_MIRROR_FLAG: + READ_MIRROR_FLAG() + end jump + FLAG_COPY_CALLDATA: + READ_COPY_CALLDATA() + end jump + FLAG_READ_STORE_FLAG: + READ_STORE_FLAG() + end jump + + default: + // The default just pushes the flag as a byte (padded to 32 bytes) + // notice that we start at 0x01 since 0x00 can be pushed with the flag 0x00 + [HIGHEST_FLAG_PLUS_ONE] // [HIGHEST_FLAG_PLUS_ONE, flag, windex, rindex, jump_to] + swap1 sub // [flag - HIGHEST_FLAG_PLUS_ONE, windex, rindex, jump_to] + dup2 // [windex, flag - HIGHEST_FLAG_PLUS_ONE, windex, rindex, jump_to] + mstore // [windex, rindex, jump_to] + 0x20 add // [windex + 0x20, rindex, jump_to] + + end: + + swap1 // [rindex, windex, jump_to] + swap2 // [jump_to, windex, rindex] + jump // [windex, rindex] + + // output stack: // [windex, rindex] +} + +#define macro READ_POW_10_MANTISSA() = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + // The first 6 bits are exponent + + dup3 // [rindex, table_start, windex, rindex] + calldataload // [data[rindex], table_start, windex, rindex] + + 0xfa // [0xfa, data[rindex], table_start, windex, rindex] + shr // [exp, table_start, windex, rindex] + + POW_10() // [windex, rindex] + BACKREAD_SINGLE_VALUE() // [10 ** exp, windex, rindex] + + // The next 18 bits are the mantissa + + dup3 // [rindex, 10 ** exp, windex, rindex] + calldataload // [data[rindex], 10 ** exp, windex, rindex] + + 0xe8 // [0xe8, data[rindex], 10 ** exp, windex, rindex] + shr // [(data[rindex] >> 0xe8), 10 ** exp, windex, rindex] + 0x3ffff // [0x3ffff, (data[rindex] >> 0xe8), 10 ** exp, windex, rindex] + and // [mantissa, 10 ** exp, windex, rindex] + mul // [(mantissa * 10 ** exp), windex, rindex] + + dup2 // [windex, (mantissa * 10 ** exp), windex, rindex] + mstore // [windex, rindex] + + 0x20 // [0x20, windex, rindex] + add // [(0x20 + windex), rindex] + swap1 // [rindex, (0x20 + windex)] + 0x03 // [0x03, rindex, (0x20 + windex)] + add // [(0x03 + rindex), (0x20 + windex)] + swap1 // [(0x20 + windex), (0x03 + rindex)] + + // input stack: [windex, rindex] +} + +#define macro READ_POW_10_AND_SELF_EXECUTE(nrfs) = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + swap2 // [rindex, windex, table_start] + LOAD_1_BYTE() // [exp_word, rindex, windex, table_start] + + // We didn't had any more pleace for READ_SELF_EXECUTE without expanding + // the jumptable! so it has to live here. Sorry about that. + // 10 ** 0 * N is more expensive than just reading 1 byte, + // so this wasn't useful anyway + + dup1 // [exp_word, exp_word, rindex, windex, table_start] + normal_flow jumpi // [exp_word, rindex, windex, table_start] + + // --- WARNING UGLY CODE --- + + pop // [rindex, windex, table_start] + swap2 // [table_start, windex, rindex] + pop // [windex, rindex] + + READ_SELF_EXECUTE() // [windex, rindex] + end_pow_10 jump // [windex, rindex] + + normal_flow: + + // The first bit determines if we will multiply this by + // the next byte or not, this is fine as the maximum value that we + // can represent in a word is only 10 ** 77 + dup1 // [exp_word, exp_word, rindex, windex, table_start] + 0x80 and // [not_use_mul, exp_word, rindex, windex, table_start] + swap1 // [exp_word, not_use_mul, rindex, windex, table_start] + 0x7f and // [exp, not_use_mul, rindex, windex, table_start] + + swap2 // [rindex, not_use_mul, exp_word, windex, table_start] + swap4 // [table_start, not_use_mul, exp_word, windex, rindex] + swap1 // [not_use_mul, table_start, exp_word, windex, rindex] + swap3 // [windex, table_start, exp_word, not_use_mul, rindex] + swap2 // [exp_word, table_start, windex, not_use_mul, rindex] + + POW_10() // [windex, not_use_mul, rindex] + + swap1 // [not_use_mul, windex, rindex] + + end_pow_10 jumpi // [windex, rindex] + + BACKREAD_SINGLE_VALUE() // [pow_result, windex, rindex] + swap2 // [rindex, windex, pow_result] + LOAD_1_BYTE() // [mantissa, rindex, windex, pow_result] + swap1 // [rindex, mantissa, windex, pow_result] + swap3 // [pow_result, mantissa, windex, rindex] + mul // [(pow_result * mantissa), windex, rindex] + dup2 // [windex, (pow_result * mantissa), windex, rindex] + mstore // [windex, rindex] + 0x20 // [0x20, windex, rindex] + add // [(0x20 + windex), rindex] + + end_pow_10: // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro POW_10() = takes (3) returns (1) { + // input stack: [exp, table_start, windex] + + 0x05 // [0x05, exp, table_start, windex] + shl // [exp * 0x20, table_start, windex] + + add // [(table_start + exp * 0x20), windex] + + 0x20 // [0x20, (table_start + exp * 0x20), windex] + swap1 // [(table_start + exp * 0x20), 0x20, windex] + dup3 // [windex, (table_start + exp * 0x20), 0x20, windex] + codecopy // [windex] + + 0x20 add // [windex + 0x20] + + // output stack: [windex] +} + +#define macro READ_MIRROR_FLAG(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + LOAD_DYNAMIC_SIZE(0x02, 0xf0) // [trindex, rindex, windex] + swap1 // [rindex, trindex, windex] + swap2 // [windex, trindex, rindex] + + PERFORM_NESTED_READ_FLAG() // [windex, trindex, rindex] + swap1 // [trindex, windex, rindex] + pop // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_COPY_CALLDATA() = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + LOAD_DYNAMIC_SIZE(0x02, 0xf0) // [location, rindex, windex] + swap1 // [rindex, location, windex] + + LOAD_1_BYTE() // [size, rindex, location, windex] + + dup1 // [size, size, rindex, location, windex] + swap3 // [location, size, rindex, size, windex] + dup5 // [windex, location, size, rindex, size, windex] + calldatacopy // [rindex, size, windex] + + swap2 // [windex, size, rindex] + add // [(windex + size), rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_STORE_FLAG() = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + LOAD_DYNAMIC_SIZE(0x02, 0xf0) // [trindex, rindex, windex] + + dup1 // [trindex, trindex, rindex, windex] + calldataload // [data[trindex], trindex, rindex, windex] + callvalue byte // [flag, trindex, rindex, windex] + + swap1 // [trindex, flag, rindex, windex] + 0x01 add // [trindex + 1, flag, rindex, windex] + swap1 // [flag, trindex, rindex, windex] + + // There are only two cases, either the flag + // is storing an address or storing a bytes32 + // we are going to read the next 32 bytes or the next 20 bytes + + 0x21 // [0x21, flag, trindex, rindex, windex] + eq // [(0x21 == flag), trindex, rindex, windex] + is_addr jumpi // [trindex, rindex, windex] + + // is_not_addr: + calldataload // [word, rindex, windex] + + end_if jump + is_addr: // [trindex, rindex, windex] + calldataload // [word, rindex, windex] + 0x60 shr // [word >> 0x60, rindex, windex] + + end_if: + + dup3 // [windex, word, rindex, windex] + mstore // [rindex, windex] + swap1 // [windex, rindex] + 0x20 add // [windex + 0x20, rindex] + + // output stack: [windex, rindex] +} + +#define macro PERFORM_NESTED_READ_FLAG(nrfs) = takes(0) returns (0) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + back // [back, rindex, windex] + swap2 // [windex, rindex, back] + + jump // [windex, rindex] + + back: +} + +#define macro BACKREAD_SINGLE_VALUE() = takes (1) returns (2) { + // input stack: [windex] + + 0x20 swap1 sub // [windex - 0x20] + dup1 // [windex - 0x20, windex - 0x20] + + mload // [mem[windex - 0x20], windex - 0x20] + + // output stack: [mem[windex - 0x20], windex - 0x20] +} + +#define macro READ_NESTED_N_FLAGS_8(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + LOAD_1_BYTE() // [size, rindex, windex] + + swap2 // [windex, rindex, size] + READ_NESTED_N_FLAGS() + + // output stack: [windex, rindex] +} + +#define macro READ_NESTED_N_FLAGS_16(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + LOAD_DYNAMIC_SIZE(0x02, 0xf0) // [size, rindex, windex] + + swap2 // [windex, rindex, size] + READ_NESTED_N_FLAGS() + + // output stack: [windex, rindex] +} + +#define macro READ_NESTED_N_FLAGS(nrfs) = takes (3) returns (2) { + // input stack: [windex, rindex, n] + + callvalue // [i, windex, rindex, n] + + read_more: // [i, windex, rindex, n] + + swap2 // [rindex, windex, i, n] + swap1 // [windex, rindex, i, n] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, i, n] + + swap1 // [rindex, windex, i, n] + swap2 // [i, windex, rindex, n] + + 0x01 add // [i + 1, windex, rindex, n] + + dup4 // [n, i, windex, rindex, n] + dup2 // [i, n, i, windex, rindex, n] + lt // [(i < n), i, windex, rindex, n] + + read_more jumpi // [i, windex, rindex, n] + + pop // [windex, rindex, n] + swap2 // [n, rindex, windex] + pop // [rindex, windex] + swap1 // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_CHAINED(nrfs, s_bytes, s_offset) = takes (2) returns (2) { + // input stack: [windex, rindex] + + // First we need to write the chainId sequence prefix (0x03) + WRITE_SEQUENCE_FLAG(0x03) + + // Second we need to read the number of flags we are going to read + + callvalue // [0x00, windex, rindex] + swap2 // [rindex, windex, 0x00] + + LOAD_DYNAMIC_SIZE(, ) // [size, rindex, windex, 0x00] + + swap3 // [0x00, rindex, windex, size] + swap2 // [windex, rindex, 0x00, size] + + read_more: // [windex, rindex, i, size] + + // Reserve 3 bytes of the size, and keep a copy of the windex + // one will serve as a comparation point to determine the size + // the other will be the pointer that determines where we need to store + // the size + + // Clear the memory now, that way we don't need to make it later + callvalue // [0x00, windex, rindex, i, size] + dup2 // [windex, 0x00, windex, rindex, i, size] + mstore // [windex, rindex, i, size] + + // Create copies for windex, and advance 2 of them by 3 + dup1 // [windex, windex, rindex, i, size] + 0x03 add // [windex, size_pointer, rindex, i, size] + dup1 // [windex, windex, size_pointer, rindex, i, size] + + swap3 // [rindex, windex, size_pointer, windex, i, size] + swap1 // [windex, rindex, size_pointer, prev_windex, i, size] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, size_pointer, prev_windex, i, size] + + // Calculate the size and write it at the start + + swap1 // [rindex, windex, size_pointer, prev_windex, i, size] + swap3 // [prev_windex, windex, size_pointer, rindex, i, size] + dup2 // [windex, prev_windex, windex, size_pointer, rindex, i, size] + sub // [size, windex, size_pointer, rindex, i, size] + 0xe8 shl // [size << 0xe8, windex, size_pointer, rindex, i, size] + + dup3 // [size_pointer, size, windex, size_pointer, rindex, i, size] + mload // [mload[size_pointer], size, windex, size_pointer, rindex, i, size] + or // [(mload[size_pointer] | size), windex, size_pointer, rindex, i, size] + + swap1 // [windex, (mload[size_pointer] | size), size_pointer, rindex, i, size] + swap2 // [size_pointer, (mload[size_pointer] | size), windex, rindex, i, size] + mstore // [windex, rindex, i, size] + + swap2 // [i, rindex, windex, size] + 0x01 add // [i + 1, rindex, windex, size] + swap2 // [windex, rindex, i + 1, size] + + dup4 // [size, windex, rindex, i + 1, size] + dup4 // [i + 1, size, windex, rindex, i + 1, size] + lt // [(i + 1 < size), windex, rindex, i + 1, size] + read_more jumpi // [windex, rindex, i + 1, size] + + // [windex, rindex, i + 1, size] + + swap2 // [i, rindex, windex, size] + pop // [rindex, windex, size] + swap2 // [size, windex, rindex] + pop // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_DYNAMIC_SIGNATURE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + WRITE_SEQUENCE_FLAG(0x02) + + swap1 // [rindex, windex] + + // Read the weight, it is always 1 byte + LOAD_1_BYTE() // [weight, rindex, windex] + + dup3 // [windex, weight, rindex, windex] + mstore8 // [rindex, windex] + swap1 // [windex, rindex] + 0x01 add // [windex, rindex] + + // Read the address, use read flag as it may use a pointer + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + BACKREAD_SINGLE_VALUE() // [word, windex, rindex] + 0x60 shl // [address, windex, rindex] + + dup2 // [windex, word, windex, rindex] + mstore // [windex, rindex] + 0x14 add // [windex, rindex] + + // Now read another nested flag, as-is, but leave + // the space to demark the size + + // Clear the memory here, that way we don't need to mask it + // when we write the size + callvalue // [0x00, windex, rindex] + dup2 mstore // [windex, rindex] + + // Reserve 3 bytes for the size + dup1 // [windex, size_pointer, rindex] + 0x03 add // [windex, size_pointer, rindex] + + swap2 // [rindex, size_pointer, windex] + dup3 // [windex, rindex, size_pointer, prev_windex] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, size_pointer, prev_windex] + + // Need to go back and write the size now + + swap3 // [prev_windex, rindex, size_pointer, windex] + dup4 // [windex, prev_windex, rindex, size_pointer, windex] + sub // [size, rindex, size_pointer, windex] + + // The size is +1 since we also need to include the suffix "03" for EIP1271 + 0x01 add // [size + 1, rindex, size_pointer, windex] + + 0xe8 shl // [size << 0xe8, rindex, size_pointer, windex] + dup3 // [size_pointer, size, rindex, size_pointer, windex] + mload // [mload[size_pointer], size, rindex, size_pointer, windex] + or // [(mload[size_pointer] | size), rindex, size_pointer, windex] + swap1 // [rindex, (mload[size_pointer] | size), size_pointer, windex] + swap2 // [size_pointer, (mload[size_pointer] | size), rindex, windex] + mstore // [rindex, windex] + swap1 // [windex, rindex] + + // Write the suffix, just 03 + 0x03 // [0x03, windex, rindex] + dup2 // [windex, 0x03, windex, rindex] + mstore8 // [windex, rindex] + 0x01 add // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_SIGNATURE_W0() = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [weight, rindex, windex] + + swap2 // [windex, rindex, weight] + + READ_SIGNATURE() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_SIGNATURE_WX(weight) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + // [weight, rindex, windex] + swap2 // [windex, rindex, weight] + + READ_SIGNATURE() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_SIGNATURE() = takes (3) returns (2) { + // input stack: [windex, rindex, weight] + + WRITE_SEQUENCE_FLAG(0x00) + + // Second thing we must write is the weight, always 1 byte + + swap2 // [weight, rindex, windex] + dup3 // [windex, weight, rindex, windex] + mstore8 // [rindex, windex] + swap1 // [windex, rindex] + 0x01 add // [windex, rindex] + + // EOA signatures are always 66 bytes long + // we can just copy them + + 0x42 // [0x42, windex, rindex] + dup1 // [0x42, 0x42, windex, rindex] + + dup4 // [rindex, 0x42, 0x42, windex, rindex] + dup4 // [windex, rindex, 0x42, 0x42, windex, rindex] + calldatacopy // [0x42, windex, rindex] + + dup1 // [0x42, 0x42, windex, rindex] + swap3 // [rindex, 0x42, windex, 0x42] + add // [rindex, windex, 0x42] + swap2 // [0x42, windex, rindex] + add // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ADDRESS_W0(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [weight, rindex, windex] + + swap2 // [windex, rindex, weight] + + READ_ADDRESS() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ADDRESS_WX(nrfs, weight) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + // [weight, rindex, windex] + swap2 // [windex, rindex, weight] + + READ_ADDRESS() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ADDRESS(nrfs) = takes (3) returns (2) { + // input stack: [windex, rindex, weight] + + WRITE_SEQUENCE_FLAG(0x01) + + // Second thing we must write is the weight, always 1 byte + + swap2 // [weight, rindex, windex] + dup3 // [windex, weight, rindex, windex] + mstore8 // [rindex, windex] + swap1 // [windex, rindex] + 0x01 add // [windex, rindex] + + // Addresses are always 20 bytes long + // we use a nested read flag call, since this address + // could come from storage + + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + BACKREAD_SINGLE_VALUE() // [word, windex, rindex] + 0x60 shl // [address, windex, rindex] + + dup2 // [windex, word, windex, rindex] + mstore // [windex, rindex] + + 0x14 add // [windex + 0x14, rindex] +} + +#define macro READ_NODE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + WRITE_SEQUENCE_FLAG(0x03) + + // Now we just proceed by reading another flag + + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_BRANCH(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + WRITE_SEQUENCE_FLAG(0x04) + + // Now we just proceed by reading the branch + // the only important part is that we need to + // measure how much is written, as the branch is + // always prefixed by the size + + // Clear the memory here, that way we don't need to mask it + // when we write the size + callvalue // [0x00, windex, rindex] + dup2 mstore // [windex, rindex] + + // Reserve 3 bytes for the size + dup1 // [windex, size_pointer, rindex] + 0x03 add // [windex, size_pointer, rindex] + + swap2 // [rindex, size_pointer, windex] + dup3 // [windex, rindex, size_pointer, prev_windex] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, size_pointer, prev_windex] + + // Need to go back and write the size now + + swap3 // [prev_windex, rindex, size_pointer, windex] + dup4 // [windex, prev_windex, rindex, size_pointer, windex] + sub // [size, rindex, size_pointer, windex] + 0xe8 shl // [size << 0xe8, rindex, size_pointer, windex] + dup3 // [size_pointer, size, rindex, size_pointer, windex] + mload // [mload[size_pointer], size, rindex, size_pointer, windex] + or // [(mload[size_pointer] | size), rindex, size_pointer, windex] + swap1 // [rindex, (mload[size_pointer] | size), size_pointer, windex] + swap2 // [size_pointer, (mload[size_pointer] | size), rindex, windex] + mstore // [rindex, windex] + swap1 // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_SUBDIGEST(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + WRITE_SEQUENCE_FLAG(0x05) + + // Now we just proceed by reading another flag + + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + + +#define macro READ_NESTED(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + WRITE_SEQUENCE_FLAG(0x06) // [windex, rindex] + + // Read the weight and the threshold + // the weight is always 1 byte, the threshold uses 2 + // but in reality most Sequence wallets use 1, so this library + // only supports 1 byte for it. If the wallet is not compatible, READ_NESTED + // can't be used, and READ_N_BYTES must be used instead + + swap1 // [rindex, windex] + LOAD_1_BYTE() // [weight, rindex, windex] + swap1 // [rindex, weight, windex] + LOAD_1_BYTE() // [threshold, rindex, weight, windex] + 0xf0 shl // [threshold << 0xf0, rindex, weight, windex] + swap2 // [weight, rindex, threshold, windex] + + dup4 // [windex, weight, rindex, threshold, windex] + mstore8 // [rindex, threshold, windex] + swap2 // [windex, threshold, rindex] + 0x01 add // [windex, threshold, rindex] + swap1 // [threshold, windex, rindex] + dup2 // [windex, threshold, windex, rindex] + mstore // [windex, rindex] + 0x02 add // [windex, rindex] + + // Now we just proceed by reading the branch + // the only important part is that we need to + // measure how much is written, as the branch is + // always prefixed by the size + + // Clear the memory here, that way we don't need to mask it + // when we write the size + callvalue // [0x00, windex, rindex] + dup2 mstore // [windex, rindex] + + // Reserve 3 bytes for the size + dup1 // [windex, size_pointer, rindex] + 0x03 add // [windex, size_pointer, rindex] + + swap2 // [rindex, size_pointer, windex] + dup3 // [windex, rindex, size_pointer, prev_windex] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, size_pointer, prev_windex] + + // Need to go back and write the size now + + swap3 // [prev_windex, rindex, size_pointer, windex] + dup4 // [windex, prev_windex, rindex, size_pointer, windex] + sub // [size, rindex, size_pointer, windex] + 0xe8 shl // [size << 0xe8, rindex, size_pointer, windex] + dup3 // [size_pointer, size, rindex, size_pointer, windex] + mload // [mload[size_pointer], size, rindex, size_pointer, windex] + or // [(mload[size_pointer] | size), rindex, size_pointer, windex] + swap1 // [rindex, (mload[size_pointer] | size), size_pointer, windex] + swap2 // [size_pointer, (mload[size_pointer] | size), rindex, windex] + mstore // [rindex, windex] + swap1 // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro WRITE_SEQUENCE_FLAG(flag) = takes (2) returns (2) { + // input stack: [windex, rindex] + + // [flag, windex, rindex] + dup2 // [windex, flag, windex, rindex] + mstore8 // [windex, rindex] + 0x01 add // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_SEQUENCE_SIGNATURE(nrfs, sig_flag, size_t, offset_t) = takes (2) returns (2) { + // input stack: [windex, rindex] + + // Write the signature flag as-is + + // [sig_flag, windex, rindex] + dup2 // [windex, sig_flag, windex, rindex] + mstore8 // [windex, rindex] + 0x01 add // [windex, rindex] + + // Now read the threshold, it may be provided as 8 or 16 bits + // but we always write it using 16 + swap1 // [rindex, windex] + LOAD_DYNAMIC_SIZE(, ) // [threshold, rindex, windex] + 0xf0 shl // [threshold << 0xf0, rindex, windex] + dup3 // [windex, threshold << 0xf0, rindex, windex] + mstore // [rindex, windex] + swap1 // [windex, rindex] + 0x02 add // [windex, rindex] + + // Next read the checkpoint, using read flag is overkill here + // but we do it for the sake of simplicity + + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + BACKREAD_SINGLE_VALUE() // [checkpoint, windex, rindex] + + // The checkpoint always uses 4 bytes + 0xe0 shl // [checkpoint << 0xe0, windex, rindex] + dup2 // [windex, checkpoint, windex, rindex] + mstore // [windex, rindex] + 0x04 add // [windex, rindex] + + // Now read the rest of the tree, this is just another read flag + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_EXECUTE_STANDALONE() = takes (2) returns (2) { + skip jump + rf: + FN_READ_FLAG(rf) + skip: + READ_EXECUTE(rf) +} + +#define macro READ_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + // The execution function signature of Sequence is 0x7a9a1628 + + __RIGHTPAD(0x7a9a1628) // [0x7a9a1628, windex, rindex] + dup2 // [windex, 0x7a9a1628, windex, rindex] + mstore // [windex, rindex] + 0x04 add // [windex, rindex] + + // The first value is always where do the list of transactions starts + // this is always the same, as the list of transactions is the first + // dynamic type + + 0x60 // [0x60, windex, rindex] + dup2 // [windex, 0x60, windex, rindex] + mstore // [windex, rindex] + 0x20 add // [windex, rindex] + + // Reading the nonce is the simplest one, it is just a value + + READ_NONCE() // [windex, rindex] + + // We can't know when the signature will start, since we need to + // read the list of transactions first. So we leave a copy of the pointer + // to write it later. + + swap1 // [rindex, windex] + dup2 // [windex, rindex, prev_windex] + 0x20 add // [windex, rindex, prev_windex] + + // We start reading the transactions, the macro takes care of writting the + // internal pointers for them (and the number of transactions) + + READ_TRANSACTIONS() // [windex, rindex, prev_windex] + + // The signature starts at windex - prev_windex + 0x20 + // and the pointer needs to be written to prev_windex + + swap1 // [rindex, windex, prev_windex] + swap2 // [prev_windex, windex, rindex] + dup1 // [prev_windex, prev_windex, windex, rindex] + dup3 // [windex, prev_windex, prev_windex, windex, rindex] + sub // [(windex - prev_windex), prev_windex, windex, rindex] + 0x40 add // [sig_starts, prev_windex, windex, rindex] + swap1 // [prev_windex, sig_starts, windex, rindex] + + mstore // [windex, rindex] + + // Now we can read the signature, we just read a nested flag, it can generate + // a Sequence signature. We only need to take care of the size and the padding + + 0x20 add // [windex, rindex] + swap1 // [rindex, windex] + dup2 // [windex, rindex, prev_index] + + PERFORM_NESTED_READ_FLAG() + + swap1 // [rindex, windex, prev_windex] + swap2 // [prev_windex, windex, rindex] + dup1 // [prev_windex, prev_windex, windex, rindex] + dup3 // [windex, prev_windex, prev_windex, windex, rindex] + sub // [size, prev_windex, windex, rindex] + dup1 // [size, size, prev_windex, windex, rindex] + swap2 // [prev_windex, size, size, windex, rindex] + 0x20 swap1 sub // [size_place, size, size, windex, rindex] + mstore // [size, windex, rindex] + + // Last thing is handling the padding, bytes need to be multiple of 0x20 + + callvalue // [0x00, size, windex, rindex] + dup3 // [windex, 0x00, size, windex, rindex] + mstore // [size, windex, rindex] + + 0x1f and // [size % 32, windex, rindex] + 0x20 sub // [pad_diff, windex, rindex] + 0x1f and // [pad_diff % 32, windex, rindex] + add // [(padd_diff + windex), rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_NONCE_STANDALONE() = takes (2) returns (2) { + skip jump + rf: + FN_READ_FLAG(rf) + skip: + READ_NONCE(rf) +} + +#define macro READ_NONCE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + BACKREAD_SINGLE_VALUE() // [val, windex, rindex] + + 0x60 shl // [space, windex, rindex] + + swap2 // [rindex, windex, space] + swap1 // [windex, rindex, space] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, space] + BACKREAD_SINGLE_VALUE() // [nonce, windex, rindex, space] + + // Assume that we are reading the nonce already masked + + swap1 // [windex, nonce, rindex, space] + swap2 // [rindex, nonce, windex, space] + swap3 // [space, nonce, windex, rindex] + or // [(space | nonce), windex, rindex] + + // Now we have the compact representation of the nonce + // we can write it to memory on windex + + dup2 // [windex, (space | nonce), windex, rindex] + mstore // [windex, rindex] + + 0x20 add // [windex + 0x20, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_TRANSACTIONS_STANDALONE() = takes (2) returns (2) { + skip jump + rf: + FN_READ_FLAG(rf) + skip: + READ_TRANSACTIONS(rf) +} + +#define macro READ_TRANSACTIONS(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + dup2 // [rindex, windex, rindex] + calldataload // [mem[rindex], windex, rindex] + callvalue byte // [tx_num, windex, rindex] + swap2 // [rindex, windex, tx_num] + 0x01 add // [rindex + 1, windex, tx_num] + callvalue // [i, rindex, windex, tx_num] + + swap3 // [tx_num, rindex, windex, i] + swap2 // [windex, rindex, tx_num, i] + + // Write the number of transactions + + dup3 // [tx_num, windex, rindex, tx_num, i] + dup2 // [windex, tx_num, windex, rindex, tx_num, i] + mstore // [windex, rindex, tx_num, i] + 0x20 add // [windex + 0x20, rindex, tx_num, i] + + // Reserve 32 bytes for each tx (excluding the first one, as we already know) + // these will be used to store start of each tx + + // The first transaction will always start at 0x20 * txs + 0x20 + + dup3 // [tx_num, windex, rindex, tx_num, i] + 0x05 shl // [r_start, windex, rindex, tx_num, i] + dup1 // [r_start, r_start, windex, rindex, tx_num, i] + + dup3 // [windex, r_start, r_start, ts_index, rindex, tx_num, i] + add // [windex, r_start, ts_index, rindex, tx_num, i] + + swap3 // [rindex, r_start, ts_index, windex, tx_num, i] + dup4 // [windex, rindex, r_start, ts_index, windex, tx_num, i] + + do_tx: // [windex, rindex, pos, ts_index, windex, tx_num, i] + + // store pos for this transaction + // but keep a copy of it as it will be used again + + swap2 // [pos, rindex, windex, ts_index, windex, tx_num, i] + dup1 // [pos, pos, rindex, windex, ts_index, windex, tx_num, i] + dup5 // [ts_index, pos, pos, rindex, windex, ts_index, windex, tx_num, i] + mstore // [pos, rindex, windex, ts_index, windex, tx_num, i] + + swap3 // [ts_index, rindex, windex, pos, windex, tx_num, i] + 0x20 add // [ts_index, rindex, windex, pos, windex, tx_num, i] + + swap3 // [pos, rindex, windex, ts_index, windex, tx_num, i] + swap2 // [windex, rindex, pos, ts_index, windex, tx_num, i] + + READ_TRANSACTION() // [windex, rindex, pos, ts_index, prev_windex, tx_num, i] + + // size = windex - prev_windex + + swap4 // [prev_windex, rindex, r_start, ts_index, windex, tx_num, i] + dup5 // [windex, prev_windex, rindex, r_start, ts_index, windex, tx_num, i] + sub // [tx_i_size, rindex, r_start, ts_index, windex, tx_num, i] + + // pos = size + r_start + + swap1 // [rindex, tx_i_size, r_start, ts_index, windex, tx_num, i] + swap2 // [r_start, tx_i_size, rindex, ts_index, windex, tx_num, i] + add // [pos, rindex, ts_index, windex, tx_num, i] + + // Re-arrange the stack, we are about to loop back + + swap1 // [rindex, pos, ts_index, windex, tx_num, i] + dup4 // [windex, rindex, pos, ts_index, windex, tx_num, i] + + // Check if we have more to read + swap6 // [i, rindex, pos, ts_index, windex, tx_num, windex] + 0x01 add // [i + 1, rindex, pos, ts_index, windex, tx_num, windex] + swap6 // [windex, rindex, pos, ts_index, windex, tx_num, i] + dup7 // [i, windex, rindex, pos, ts_index, windex, tx_num, i] + + // The ts_index contains the index of the transaction x 32, we can + // easily get the i and compare it with the len of transactions to know if we must continue or not + + dup7 // [tx_num, i, windex, rindex, pos, ts_index, windex, tx_num, i] + xor do_tx jumpi // [windex, rindex, pos, ts_index, windex, tx_num, i] + + pop // [rindex, pos, ts_index, windex, tx_num, i] + swap5 // [i, pos, ts_index, windex, tx_num, rindex] + pop // [pos, ts_index, windex, tx_num, rindex] + pop // [ts_index, windex, tx_num, rindex] + pop // [windex, tx_num, rindex] + swap1 // [tx_num, windex, rindex] + pop // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_TRANSACTION_STANDALONE() = takes (2) returns (2) { + skip jump + rf: + FN_READ_FLAG(rf) + skip: + READ_TRANSACTION(rf) +} + +#define macro READ_TRANSACTION(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + // The first byte gives us information about what the transaction contains + + dup2 // [rindex, windex, rindex] + calldataload // [cdata[rindex], windex, rindex] + callvalue byte // [tflag, windex, rindex] + swap2 // [rindex, windex, tflag] + 0x01 add // [rindex + 1, windex, tflag] + swap2 // [tflag, windex, rindex + 1] + + // First bit of the flag determines if the transaction uses delegateCall + + dup1 // [tflag, tflag, windex, rindex] + 0x07 shr // [tflag >> 0x07, tflag, windex, rindex] + dup3 // [windex, tflag >> 0x07, tflag, windex, rindex] + mstore // [tflag, windex, rindex] + + swap1 // [windex, tflag, rindex] + 0x20 add // [windex + 0x20, tflag, rindex] + + // Second bit of the flag determines if the transaction uses revertOnError + + dup2 // [tflag, windex, tflag, rindex] + 0x06 shr // [tflag >> 0x06, windex, tflag, rindex] + 0x01 and // [tflag >> 0x06 & 0x01, windex, tflag, rindex] + dup2 // [windex, tflag >> 0x06 & 0x01, windex, tflag, rindex] + mstore // [windex, tflag, rindex] + + 0x20 add // [windex + 0x20, tflag, rindex] + + // Third bit of the flag determines if the transaction has a defined gasLimit + + dup2 // [tflag, windex, tflag, rindex] + 0x05 shr // [tflag >> 0x05, windex, tflag, rindex] + 0x01 and // [has_gas_limit, windex, tflag, rindex] + has_gas_limit jumpi // [windex, tflag, rindex] + + // The transaction has no gas_limit, we still need to write 0s + // to the memory and push the write index + + callvalue dup2 mstore // [windex, tflag, rindex] + 0x20 add // [windex + 0x20, tflag, rindex] + + // Re-arrange the stack so it matches the other branch + + swap1 // [tflag, windex, rindex] + swap2 // [rindex, windex, tflag] + swap1 // [windex, rindex, tflag] + + end_gas_Limit_if jump + + has_gas_limit: + + // Read advanced; this should only increase 32 bytes + // but we don't check that, buyer beware + + swap1 // [tflag, windex, rindex] + swap2 // [rindex, windex, tflag] + swap1 // [windex, rindex, tflag] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, tflag] + + end_gas_Limit_if: + + // All transactions must define an address + // this is simple, as it is just one more flag + + PERFORM_NESTED_READ_FLAG() + + // 4th bit of the flag determines if the transaction has a defined value + + dup3 // [tflag, windex, rindex, tflag] + 0x04 shr // [tflag >> 0x04, windex, rindex, tflag] + 0x01 and // [tflag >> 0x04 & 0x01, windex, rindex, tflag] + has_value jumpi // [windex, rindex, tflag] + + // The transaction has no value, we still need to write 0s + // to the memory and push the write index + + callvalue dup2 mstore // [windex, rindex, tflag] + 0x20 add // [windex + 0x20, rindex, tflag] + end_value_if jump + + has_value: + + // Read advanced; this should only increase 32 bytes + // but we don't check that, buyer beware + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, tflag] + + end_value_if: + + // 1st bit determines if the transaction has data + + swap2 // [tflag, rindex, windex] + 0x01 and // [has_data, rindex, windex] + + swap1 // [rindex, has_data, windex] + swap2 // [windex, has_data, rindex] + swap1 // [has_data, windex, rindex] + + has_data jumpi // [windex, rindex] + + // The transaction has no data, we still need to write 0s + // both for the pointer and size + + // All tx strucs have the same number of parameters, so 0xc0 is always the correct + //place for the start of the bytes data + + 0xc0 // [0xc0, windex, rindex] + dup2 // [windex, 0xc0, windex, rindex] + mstore // [windex, rindex] + + 0x20 // [0x20, windex, rindex] + add // [(0x20 + windex), rindex] + callvalue // [0x00, (0x20 + windex), rindex] + dup2 // [(0x20 + windex), 0x00, (0x20 + windex), rindex] + mstore // [windex, rindex] + + 0x20 // [0x20, windex, rindex] + add // [(0x20 + windex), rindex] + + end_data_if jump + + has_data: // [windex, rindex] + + // All tx strucs have the same number of parameters, so 0xc0 is always the correct + //place for the start of the bytes data + + 0xc0 // [0xc0, windex, rindex] + dup2 // [windex, 0xc0, windex, rindex] + mstore // [windex, rindex] + 0x20 add // [windex, rindex] + + // Leave some room to store the size of the data + 0x20 add // [windex + 0x20, rindex, prev_windex] + + swap1 // [rindex, windex] + dup2 // [windex, rindex, prev_windex] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, prev_windex] + + dup3 // [prev_windex, windex, rindex, prev_windex] + dup2 // [windex, prev_windex, windex, rindex, prev_windex] + sub // [size, windex, rindex, prev_windex] + + dup1 // [size, size, windex, rindex, prev_windex] + + 0x20 // [0x20, size, size, windex, rindex, prev_windex] + dup6 // [prev_windex, 0x20, size, size, windex, rindex, prev_windex] + sub // [(prev_windex - 0x20), size, size, windex, rindex, prev_windex] + mstore // [size, windex, rindex, prev_windex] + + // Write some zeros just in case + callvalue // [0x00, size, windex, rindex, prev_windex] + dup3 // [windex, 0x00, size, windex, rindex, prev_windex] + mstore // [size, windex, rindex, prev_windex] + + // Advance the windex enough so index becomes divisible by 32 + 0x1f and // [size % 32, windex, rindex, prev_windex] + 0x20 sub // [pad_diff, windex, rindex, prev_windex] + 0x1f and // [pad_diff % 32, windex, rindex, prev_windex] + add // [windex + pad_diff, rindex, prev_windex] + + swap2 // [prev_windex, rindex, windex + pad_diff] + pop // [rindex, windex] + swap1 // [windex, rindex] + + end_data_if: +} + +#define macro READ_SELF_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + // The SELF execution function signature of Sequence is 0x61c2926c + + __RIGHTPAD(0x61c2926c) // [0x61c2926c, windex, rindex] + dup2 // [windex, 0x61c2926c, windex, rindex] + mstore // [windex, rindex] + 0x04 add // [windex, rindex] + + // We need to write a single 0x20, this marks the position + // of the list of transactions. It is always the same. + 0x20 // [0x20, windex, rindex] + dup1 // [0x20, 0x20, windex, rindex] + dup3 // [windex, 0x20, 0x20, windex, rindex] + mstore // [0x20, windex, rindex] + add // [(0x20 + windex), rindex] + + // Now we can just read the list of transactions + // the macro handles all internal pointers + + READ_TRANSACTIONS() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_4_BYTES() = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + // Ideally we don't ask for table_start as an argument, we use it as a constant directly here + // but huff has a bug, if a table is used on a macro, and the macro is used many times, it will + // create copies of the table. This increases the file size a lot (2x) so I decided to have a single + // copy of the 4 bytes table. + + swap2 // [rindex, windex, table_start] + LOAD_1_BYTE() // [index, rindex, windex, table_start] + + // The 4 bytes may be provided either as an index (1 byte) + // of the known 4bytes table, or as 00 and the real 4 bytes + // 90% of the transactions use one of the common 4bytes + + dup1 // [index, index, rindex, windex, table_start] + is_index jumpi // [index, rindex, windex, table_start] + + // is_not_index: + pop // [rindex, windex, table_start] + swap2 // [table_start, windex, rindex] + pop // [windex, rindex] + + 0x04 // [0x04, windex, rindex] + dup1 // [0x04, 0x04, windex, rindex] + dup4 // [rindex, 0x04, 0x04, windex, rindex] + dup4 // [windex, rindex, 0x04, 0x04, windex, rindex] + calldatacopy // [0x04, windex, rindex] + + swap2 // [rindex, windex, 0x04] + dup3 // [0x04, rindex, windex, 0x04] + add // [(0x04 + rindex), windex, 0x04] + swap2 // [0x04, windex, (0x04 + rindex)] + add // [(0x04 + windex), (0x04 + rindex)] + end_if jump + + is_index: // [index, rindex, windex, table_start] + 0x04 // [0x04, index, rindex, windex, table_start] + swap1 // [index, 0x04, rindex, windex, table_start] + 0x02 // [0x02, index, 0x04, rindex, windex, table_start] + shl // [(index << 0x02), 0x04, rindex, windex, table_start] + + swap1 // [0x04, (index << 0x02), rindex, windex, table_start] + swap2 // [rindex, (index << 0x02), 0x04, windex, table_start] + swap4 // [table_start, (index << 0x02), 0x04, windex, rindex] + + add // [(table_start + (index << 0x02)), 0x04, windex, rindex] + dup3 // [windex, (table_start + (index << 0x02)), 0x04, windex, rindex] + codecopy // [windex, rindex] + + 0x04 add // [windex + 0x04, rindex] + + end_if: + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_0() = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + READ_ABI_4_BYTES() + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_1(nrfs) = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + READ_ABI_4_BYTES() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_2(nrfs) = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + READ_ABI_4_BYTES() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_3(nrfs) = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + READ_ABI_4_BYTES() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_4(nrfs) = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + READ_ABI_4_BYTES() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_5(nrfs) = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + READ_ABI_4_BYTES() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_6(nrfs) = takes (3) returns (2) { + // input stack: [table_start, windex, rindex] + + READ_ABI_4_BYTES() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_ABI_DYNAMIC(nrfs) = takes(3) returns (2) { + // input stack: [table_start, windex, rindex] + + READ_ABI_4_BYTES() // [table_start, windex, rindex] + + // First byte determines the number of parameters + + dup1 // [windex, windex, rindex] + swap2 // [rindex, windex, windex] + dup1 // [rindex, rindex, windex, windex] + calldataload // [word, rindex, windex, windex] + callvalue byte // [size, rindex, windex, windex] + swap1 // [rindex, size, windex, windex] + 0x01 add // [rindex, size, windex, windex] + + // Second is a bitmap, it determines which + // parameters are dynamic and which ones are static + // notice: this limits dynamic parameters to the first 8 ones + // all other ones are automatically considered static + + dup1 // [rindex, rindex, size, windex, windex] + calldataload // [word, rindex, size, windex, windex] + callvalue byte // [d_bitmap, rindex, size, windex, windex] + swap1 // [rindex, d_bitmap, size, windex, windex] + 0x01 add // [rindex, d_bitmap, size, windex, windex] + + callvalue // [0x00, rindex, d_bitmap, size, windex] + + // We will need to have two write indexes, one for the pointers (or values) + // and another one for the data blobs. The data blobs are the actual data + // of the dynamic parameters. It starts on (windex + size * 0x20). + + dup5 // [windex, i, rindex, d_bitmap, size, windex, windex] + dup5 // [size, windex, i, rindex, d_bitmap, size, windex, windex] + 0x05 shl // [size * 0x20, windex, i, rindex, d_bitmap, size, windex, windex] + add // [bwindex, i, rindex, d_bitmap, size, windex, windex] + + read_param: // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + + // We read the bitmap and determine if the param is dynamic or not + dup4 // [d_bitmap, bwindex, i, rindex, d_bitmap, size, windex, swindex] + 0x01 // [0x01, d_bitmap, bwindex, i, rindex, d_bitmap, size, windex, swindex] + dup4 // [i, 0x01, d_bitmap, bwindex, i, rindex, d_bitmap, size, windex, swindex] + shl // [(0x01 << i), d_bitmap, bwindex, i, rindex, d_bitmap, size, windex, swindex] + and // [is_dynamic, bwindex, i, rindex, d_bitmap, size, windex, swindex] + + is_dynamic jumpi // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + + // is_not_dynamic: + + // The parameter is not dynamic, we just need to read one value on windex + // and we can continue + + swap2 // [rindex, i, bwindex, d_bitmap, size, windex, swindex] + swap1 // [i, rindex, bwindex, d_bitmap, size, windex, swindex] + swap5 // [windex, rindex, bwindex, d_bitmap, size, i, swindex] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex, bwindex, d_bitmap, size, i, swindex] + + // We trust that we only increased windex by 0x20, and we keep iterating + swap5 // [i, rindex, bwindex, d_bitmap, size, windex, swindex] + 0x01 add // [i + 1, rindex, bwindex, d_bitmap, size, windex, swindex] + + swap1 // [rindex, i, bwindex, d_bitmap, size, windex, swindex] + swap2 // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + dup5 // [size, bwindex, i, rindex, d_bitmap, size, windex, swindex] + dup3 // [i, size, bwindex, i, rindex, d_bitmap, size, windex, swindex] + lt // [(i < size), bwindex, i, rindex, d_bitmap, size, windex, swindex] + read_param jumpi // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + break jump + + is_dynamic: // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + + // The parameter is dynamic, we are going to write it on bwindex + // but we need to: + // - save the pointer, since there we are going to store the size + // - keep a copy of the pointer, so we can determine the size + // - pad the end result to 32 bytes + // - store in windex a pointer to bwindex + + // The data pointer should lead to bwindex - swindex + dup7 // [swindex, bwindex, i, rindex, d_bitmap, size, windex, swindex] + dup2 // [bwindex, swindex, bwindex, i, rindex, d_bitmap, size, windex, swindex] + sub // [d_pointer, bwindex, i, rindex, d_bitmap, size, windex, swindex] + dup7 // [windex, d_pointer, bwindex, i, rindex, d_bitmap, size, windex, swindex] + mstore // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + swap5 // [windex, i, rindex, d_bitmap, size, bwindex, swindex] + 0x20 add // [windex + 0x20, i, rindex, d_bitmap, size, bwindex, swindex] + + dup6 // [bwindex, windex, i, rindex, d_bitmap, size, bwindex, swindex] + 0x20 add // [bwindex + 0x20, windex, i, rindex, d_bitmap, size, bwindex, swindex] + swap3 // [rindex, windex, i, bwindex, d_bitmap, size, size_b_pointer, swindex] + dup4 // [bwindex, rindex, windex, i, bwindex, d_bitmap, size, size_b_pointer, swindex] + + PERFORM_NESTED_READ_FLAG() // [bwindex, rindex, windex, i, prev_bwindex, d_bitmap, size, size_b_pointer, swindex] + + swap4 // [prev_bwindex, rindex, windex, i, bwindex, d_bitmap, size, size_b_pointer, swindex] + dup5 // [bwindex, prev_bwindex, rindex, windex, i, bwindex, d_bitmap, size, size_b_pointer, swindex] + sub // [b_size, rindex, windex, i, bwindex, d_bitmap, size, size_b_pointer, swindex] + + dup1 // [b_size, b_size, rindex, windex, i, bwindex, d_bitmap, size, size_b_pointer, swindex] + swap8 // [size_b_pointer, b_size, rindex, windex, i, bwindex, d_bitmap, size, b_size, swindex] + mstore // [rindex, windex, i, bwindex, d_bitmap, size, b_size, swindex] + + // Last we need to pad the bwindex + callvalue // [0x00, rindex, windex, i, bwindex, d_bitmap, size, b_size] + dup5 // [bwindex, 0x00, rindex, windex, i, bwindex, d_bitmap, size, b_size, swindex] + mstore // [rindex, windex, i, bwindex, d_bitmap, size, b_size, swindex] + + swap3 // [bwindex, windex, i, rindex, d_bitmap, size, b_size, swindex] + swap1 // [windex, bwindex, i, rindex, d_bitmap, size, b_size, swindex] + swap6 // [b_size, bwindex, i, rindex, d_bitmap, size, windex, swindex] + + 0x1f and // [b_size % 32, bwindex, i, rindex, d_bitmap, size, windex, swindex] + 0x20 sub // [pad_diff, bwindex, i, rindex, d_bitmap, size, windex, swindex] + 0x1f and // [pad_diff % 32, bwindex, i, rindex, d_bitmap, size, windex, swindex] + add // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + + swap1 // [i, bwindex, rindex, d_bitmap, size, windex, swindex] + 0x01 add // [i + 1, bwindex, rindex, d_bitmap, size, windex, swindex] + swap1 // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + + dup5 // [size, bwindex, i, rindex, d_bitmap, size, windex, swindex] + dup3 // [i, size, bwindex, i, rindex, d_bitmap, size, windex, swindex] + lt // [(i < size), bwindex, i, rindex, d_bitmap, size, windex, swindex] + read_param jumpi // [bwindex, i, rindex, d_bitmap, size, windex, swindex] + + break: + + // We have finished! we only need to clear the stack + // notice that bwindex is the windex now + swap5 // [windex, i, rindex, d_bitmap, size, bwindex, swindex] + pop // [i, rindex, d_bitmap, size, bwindex, swindex] + pop // [rindex, d_bitmap, size, bwindex, swindex] + swap4 // [swindex, d_bitmap, size, bwindex, rindex] + pop // [d_bitmap, size, bwindex, rindex] + pop // [size, bwindex, rindex] + pop // [bwindex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_BYTES32(shift_bits, read_bytes) = takes (2) returns (2) { + // input stack: [windex, rindex] + + 0x20 // [0x20, windex, rindex] + + dup3 // [rindex, 0x20, windex, rindex] + calldataload // [word, 0x20, windex, rindex] + + // Shift to the right so we only read the first bits + shr // [word >> , 0x20, windex, rindex] + + // Store on windex + dup3 // [windex, word >> , 0x20, windex, rindex] + mstore // [0x20, windex, rindex] + + add // [windex + 0x20, rindex] + + swap1 // [rindex, windex + 0x20] + add // [rindex + , windex + 0x20] + swap1 // [windex + 0x20, rindex + ] + + // output stack: [0x20 + windex, valB + rindex] +} + +#define macro READ_BYTES32_WORD() = takes (3) returns (2) { + // input stack: [windex, rindex] + + 0x20 // [0x20, windex, rindex] + dup1 // [0x20, 0x20, windex, rindex] + + dup4 // [rindex, 0x20, 0x20, windex, rindex] + calldataload // [word, 0x20, 0x20, windex, rindex] + + // Store on windex + dup4 // [windex, word >> , 0x20, 0x20, windex, rindex] + mstore // [0x20, 0x20, windex, rindex] + + swap3 // [rindex, 0x20, 0x20, windex] + add // [rindex + 0x20, 0x20, windex] + swap2 // [windex, 0x20, rindex + 0x20] + add // [windex + 0x20, rindex + 0x20] + + // output stack: [windex + 0x20, rindex + 0x20] +} + +#define macro SAVE_ADDRESS() = takes (3) returns (2) { + // input stack: [windex, rindex] + + dup2 // [rindex, windex, rindex] + calldataload // [word, windex, rindex] + + // Clean the address before storing it + // shifting it to the right by 0x60 bits + + 0x60 shr // [addr, windex, rindex] + + dup1 // [addr, addr, windex, rindex] + dup3 // [windex, addr, addr, windex, rindex] + mstore // [addr, windex, rindex] + + PULL_ADDRESS() ADDRESS_STORAGE_POINTER() sstore // [windex, rindex] + + // Add 32 bytes to windex and 20 to rindex + 0x20 add // [windex + 0x20, rindex] + swap1 // [rindex, windex + 0x20] + 0x14 add // [rindex + 0x14, windex + 0x20] + swap1 // [windex + 0x20, rindex + 0x14] + + // output stack: [windex + 0x20, rindex + 0x14] +} + +#define macro SAVE_BYTES32() = takes (3) returns (2) { + // input stack: [windex, rindex] + + dup2 // [rindex, windex, rindex] + calldataload // [word, windex, rindex] + + dup1 // [word, word, windex, rindex] + + dup3 // [windex, word, word, windex, rindex] + mstore // [word, windex, rindex] + + PULL_BYTES32() BYTES32_STORAGE_POINTER() sstore // [windex, rindex] + + // Add 32 bytes to both indexes + + 0x20 dup1 // [0x20, 0x20, windex, rindex] + swap3 // [rindex, 0x20, windex, 0x20] + add // [rindex + 0x20, 0x20, windex] + + swap2 // [windex, 0x20, rindex + 0x20] + add // [windex + 0x20, rindex + 0x20] + + // output stack: [windex + 32, rindex + 32] +} + +// Reads a stored bytes32 using a 2 to 5 bytes pointer index +#define macro READ_BYTES32_STORAGE(read_bytes, read_bits_shift) = takes (3) returns (2) { + READ_STORAGE(BYTES32_SMV, shl, , ) +} + +#define macro READ_ADDRESS_STORAGE(read_bytes, read_bits_shift) = takes (3) returns (2) { + READ_STORAGE(ADDRESS_SMV, add, , ) +} + +#define macro READ_STORAGE(smv, smc, read_bytes, read_bits_shift) = takes (3) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_DYNAMIC_SIZE(, ) // [index, nrindex + size, windex] + sload // [bytes32, nrindex + size, windex] + + dup3 // [windex, bytes32, nrindex + size, windex] + mstore // [nrindex + size, windex] + + swap1 // [windex, nrindex + size] + + 0x20 add // [windex + 0x20, nrindex + size] + + // output stack: [windex + 0x20, nrindex + size] +} + +#define macro READ_POW_2() = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [exp, rindex, windex] + + // an exp value 0 means that the formula will be 2 ** exp - 1 + // and we need to read a second exponent + + dup1 // [exp, exp, rindex, windex] + dont_sub_1 jumpi // [exp, rindex, windex] + + //sub_1: + pop // [rindex, windex] + + LOAD_1_BYTE() // [exp, rindex, windex] + + 0x01 // [0x01, exp, rindex, windex] + dup1 // [0x01, 0x01, exp, rindex, windex] + swap2 // [exp, 0x01, 0x01, rindex, windex] + dup3 // [0x01, exp, 0x01, 0x01, rindex, windex] + + add // [(0x01 + exp), 0x01, 0x01, rindex, windex] + shl // [(0x01 << (0x01 + exp)), 0x01, rindex, windex] + sub // [((0x01 << (0x01 + exp)) - 0x01), rindex, windex] + + end_if jump + + dont_sub_1: + 0x01 // [0x01, exp, rindex, windex] + swap1 // [exp, 0x01, rindex, windex] + shl // [(0x01 << exp), rindex, windex] + + end_if: + + dup3 // [windex, (0x01 << exp), rindex, windex] + swap2 // [rindex, (0x01 << exp), windex, windex] + swap3 // [windex, (0x01 << exp), windex, rindex] + + mstore // [windex, rindex] + 0x20 add // [windex + 0x20, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_N_BYTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + BACKREAD_SINGLE_VALUE() // [size, windex, rindex] + + dup2 // [windex, size, windex, rindex + 1] + dup2 add // [windex + size, size, windex, rindex + 1] + swap2 // [windex, size, windex + size, rindex + 1] + + dup4 // [rindex + 1, windex, size, windex + size, rindex + 1] + dup3 // [size, rindex + 1, windex, size, windex + size, rindex + 1] + add // [rindex + 1 + size, windex, size, windex + size, rindex + 1] + swap4 // [rindex + 1, windex, size, windex + size, rindex + 1 + size] + swap1 // [windex, rindex + 1, size, windex + size, rindex + 1 + size] + + calldatacopy // [windex, rindex + 1 + size] + + // output stack: [windex + size, rindex + size] +} + +#define macro LOAD_1_BYTE() = takes (1) returns (2) { + // input stack: [rindex] + + dup1 // [rindex, rindex] + 0x01 // [0x01, rindex, rindex] + add // [(0x01 + rindex), rindex] + swap1 // [rindex, (0x01 + rindex)] + + calldataload // [data[rindex], (0x01 + rindex)] + + callvalue // [0x00, data[rindex], (0x01 + rindex)] + byte // [byte[0x00], (0x01 + rindex)] + + // output stack: [value, rindex] +} + +#define macro LOAD_DYNAMIC_SIZE(read_bytes, read_bits_shift) = takes (1) returns (2) { + // input stack: [rindex] + + dup1 // [rindex, rindex] + + add // [rindex + size, rindex] + swap1 // [rindex, rindex + size] + + calldataload // [cdata[rindex], rindex] + + // Value needs to be shifted, so we only read + // the first "size" bytes + + // [size, cdata[rindex], rindex] + shr // [cdata[rindex] >> size bits, size + rindex] + + // output stack: [cdata[rindex] >> size bits, size + rindex] +} + +#[calldata("0xb2d10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a899")] +#define test TEST_SAVE_BYTES32() = { + 0x01 // [rindex] + 0x20 // [windex, rindex] + + SAVE_BYTES32() // [windex, rindex] + + 0x40 eq ASSERT() // [] + 0x21 eq ASSERT() // [rindex] + + // Validate that memory was written correctly + + 0x20 mload // [mem[0x20]] () + 0xd10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a899 + + eq ASSERT() // [] + + // Validate that the written address is correct + 0x01 0x80 shl sload // [addr] + 0xd10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a899 eq ASSERT() // [] + + // Validate that the total increased to 1 + BYTES32_NUM() 0x01 eq ASSERT() // [] +} + +#[calldata("0x0201f020c002f1e0040203")] +#define test TEST_READ_BYTES32() = { + // Save 3 different bytes32 values + + 0xfe9716a384ec3b055bb8aae87323a14412cbfceb52c95324dccf071fb3f83855 + 0x0201 0x80 shl sstore + + 0xcf85e6408b0191a7ed9970e635257854b95aa7b708f485ae667e6fd467e5f45e + 0xf020c002 0x80 shl sstore + + 0xa577e893e614c9aa4b19f2369e1c177adab9fe3156970a39afc166c0f2d905ee + 0xf1e0040203 0x80 shl sstore + + // Read the first bytes32 + 0x00 // [rindex] + 0x00 // [windex, rindex] + + READ_BYTES32_STORAGE(0x02, 0xf0) // [windex, rindex] + + 0x20 eq ASSERT() // [rindex] + 0x02 eq ASSERT() // [] + + 0x00 mload 0xfe9716a384ec3b055bb8aae87323a14412cbfceb52c95324dccf071fb3f83855 eq ASSERT() // [] + + // Read the second bytes32 + 0x02 // [rindex] + 0x20 // [windex, rindex] + + READ_BYTES32_STORAGE(0x04, 0xe0) // [windex, rindex] + + 0x40 eq ASSERT() // [rindex] + 0x06 eq ASSERT() // [] + + 0x20 mload 0xcf85e6408b0191a7ed9970e635257854b95aa7b708f485ae667e6fd467e5f45e eq ASSERT() // [] + + // Read the third bytes32 + 0x06 // [rindex] + 0x10 // [windex, rindex] + + READ_BYTES32_STORAGE(0x05, 0xd8) // [windex, rindex] + + 0x30 eq ASSERT() // [rindex] + 0x0b eq ASSERT() // [] + + 0x10 mload 0xa577e893e614c9aa4b19f2369e1c177adab9fe3156970a39afc166c0f2d905ee eq ASSERT() // [] +} + +#[calldata("0x0201f020c002f1e0040203")] +#define test TEST_READ_ADDRESS() = { + // Save 3 different bytes32 values + + 0x000000000000000000000000d789f5242a537b0584893b564a8c7a4be35b9238 + 0x0201 ADDRESS_STORAGE_POINTER() sstore + + 0x000000000000000000000000d5b5127436fd875ab7c334dffb62533ba011c2d9 + 0xf020c002 ADDRESS_STORAGE_POINTER() sstore + + 0x0000000000000000000000008a745d2b92c6e02e8ed087581c63d073f98f2479 + 0xf1e0040203 ADDRESS_STORAGE_POINTER() sstore + + // Read the first bytes32 + 0x00 // [rindex] + 0x00 // [windex, rindex] + + READ_ADDRESS_STORAGE(0x02, 0xf0) // [windex, rindex] + + 0x20 eq ASSERT() // [rindex] + 0x02 eq ASSERT() // [] + + 0x00 mload 0x000000000000000000000000d789f5242a537b0584893b564a8c7a4be35b9238 eq ASSERT() // [] + + // Read the second bytes32 + 0x02 // [rindex] + 0x20 // [windex, rindex] + + READ_ADDRESS_STORAGE(0x04, 0xe0) // [windex, rindex] + + 0x40 eq ASSERT() // [rindex] + 0x06 eq ASSERT() // [] + + 0x20 mload 0x000000000000000000000000d5b5127436fd875ab7c334dffb62533ba011c2d9 eq ASSERT() // [] + + // Read the third bytes32 + 0x06 // [rindex] + 0x10 // [windex, rindex] + + READ_ADDRESS_STORAGE(0x05, 0xd8) // [windex, rindex] + + 0x30 eq ASSERT() // [rindex] + 0x0b eq ASSERT() // [] + + 0x10 mload 0x0000000000000000000000008a745d2b92c6e02e8ed087581c63d073f98f2479 eq ASSERT() // [] +} + + +#[calldata("0x000203ff00ff")] +#define test TEST_READ_POW_2() = takes (2) returns (2) { + 0x00 // [rindex] + 0x00 // [windex, rindex] + + READ_POW_2() // [windex, rindex] + + 0x20 eq ASSERT() // [rindex] + 0x02 eq ASSERT() // [] + + 0x00 mload 0x07 eq ASSERT() // [] + + 0x01 // [rindex] + 0x20 // [windex, rindex] + + READ_POW_2() // [windex, rindex] + + 0x40 eq ASSERT() // [rindex] + 0x02 eq ASSERT() // [] + + 0x20 mload 0x04 eq ASSERT() // [] + + 0x02 // [rindex] + 0x05 // [windex, rindex] + + READ_POW_2() // [windex, rindex] + + 0x25 eq ASSERT() // [rindex] + 0x03 eq ASSERT() // [] + + 0x05 mload 0x08 eq ASSERT() // [] + + 0x03 // [rindex] + 0x00 // [windex, rindex] + + READ_POW_2() // [windex, rindex] + + 0x20 eq ASSERT() // [rindex] + 0x04 eq ASSERT() // [] + + 0x00 mload 0x8000000000000000000000000000000000000000000000000000000000000000 eq ASSERT() // [] + + 0x04 // [rindex] + 0x00 // [windex, rindex] + + READ_POW_2() // [windex, rindex] + + 0x20 eq ASSERT() // [rindex] + 0x06 eq ASSERT() // [] + + 0x00 mload 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff eq ASSERT() // [] +} + +#[calldata("0xb2d10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a899")] +#define test TEST_LOAD_DYNAMIC_SIZE() = { + 0x00 // [rindex] + + LOAD_DYNAMIC_SIZE(0x02, 0xf0) // [val, nrindex + size] + + 0xb2d1 eq ASSERT() // [rindex] + 0x02 eq ASSERT() // [] + + 0x04 // [rindex] + + LOAD_DYNAMIC_SIZE(0x05, 0xd8) // [val, nrindex + size] + + 0x7ef5838bb8 eq ASSERT() // [rindex] + 0x09 eq ASSERT() // [] +} + +#[calldata("0x02f1f2")] +#define test TEST_READ_FLAG_2_BYTES() = { + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + 0x20 [FMS] add eq ASSERT() // [rindex] + 0x03 eq ASSERT() // [] + + [FMS] mload 0xf1f2 eq ASSERT() // [] +} + +#define test TEST_NUMS() = { + ADDRESSES_NUM() // [num] + 0x00 eq ASSERT() // [] + + PULL_ADDRESS() // [nnum] + 0x01 eq ASSERT() // [] + + ADDRESSES_NUM() // [num] + 0x01 eq ASSERT() // [] + + PULL_ADDRESS() // [nnum] + 0x02 eq ASSERT() // [] + + ADDRESSES_NUM() // [num] + 0x02 eq ASSERT() // [] + + PULL_BYTES32() // [nnum] + 0x01 eq ASSERT() // [] + + BYTES32_NUM() // [num] + 0x01 eq ASSERT() // [] + + ADDRESSES_NUM() // [num] + 0x02 eq ASSERT() // [] + + PULL_ADDRESS() // [nnum] + 0x03 eq ASSERT() // [] + + BYTES32_NUM() // [nnum] + 0x01 eq ASSERT() // [] + + PULL_BYTES32() // [nnum] + 0x02 eq ASSERT() // [] + + BYTES32_NUM() // [num] + 0x02 eq ASSERT() // [] + + ADDRESSES_NUM() // [num] + 0x03 eq ASSERT() // [] +} + +#[calldata("0xb2d10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a8")] +#define test TEST_FLAG_READ_BYTES32() = { + 0x01 // [rindex] + [FMS] 0x40 add // [windex, rindex] + + READ_BYTES32(0xf0, 0x02) // [windex, rindex] + + [FMS] 0x60 add eq ASSERT() // [rindex] + 0x03 eq ASSERT() // [] + + [FMS] 0x40 add mload 0xd10e eq ASSERT() // [] + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_BYTES32(0x00, 0x20) // [windex, rindex] + + [FMS] 0x20 add eq ASSERT() // [rindex] + 0x20 eq ASSERT() // [] + + [FMS] mload 0xb2d10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a8 eq ASSERT() // [] + + 0x00 // [rindex] + [FMS] 0x40 add // [windex, rindex] + + READ_BYTES32_WORD() // [windex, rindex] + + [FMS] 0x60 add eq ASSERT() // [rindex] + 0x20 eq ASSERT() // [] + + [FMS] 0x40 add + mload 0xb2d10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a8 eq ASSERT() // [] +} + +// 0xd10eb37ef5838bb835ea71bbd4053daf8de7bd8e +#[calldata("0xb2d10eb37ef5838bb835ea71bbd4053daf8de7bd8ecdf638451a2bc966a145a8")] +#define test TEST_SAVE_ADDRESS() = { + 0x01 // [rindex] + [FMS] // [windex, rindex] + + SAVE_ADDRESS() // [windex, rindex] + + [FMS] 0x20 add eq ASSERT() // [rindex] + 0x15 eq ASSERT() // [] + + // Validate that memory was written correctly + + [FMS] mload // [mem[0x20]] () + 0x000000000000000000000000d10eb37ef5838bb835ea71bbd4053daf8de7bd8e + eq ASSERT() // [] + + // Validate that the written address is correct + 0x02 sload // [addr] + 0x000000000000000000000000d10eb37ef5838bb835ea71bbd4053daf8de7bd8e + eq ASSERT() // [] + + // Validate that the total increased to 1 + ADDRESSES_NUM() 0x01 eq ASSERT() // [] +} + +#define table POW_10_TABLE { + 0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000f424000000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000005f5e100000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000000000000000000000000000000000002540be400000000000000000000000000000000000000000000000000000000174876e800000000000000000000000000000000000000000000000000000000e8d4a51000000000000000000000000000000000000000000000000000000009184e72a00000000000000000000000000000000000000000000000000000005af3107a400000000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000008ac7230489e800000000000000000000000000000000000000000000000000056bc75e2d6310000000000000000000000000000000000000000000000000003635c9adc5dea0000000000000000000000000000000000000000000000000021e19e0c9bab240000000000000000000000000000000000000000000000000152d02c7e14af680000000000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000000000000000000000084595161401484a00000000000000000000000000000000000000000000000052b7d2dcc80cd2e40000000000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000204fce5e3e250261100000000000000000000000000000000000000000000001431e0fae6d7217caa0000000000000000000000000000000000000000000000c9f2c9cd04674edea40000000000000000000000000000000000000000000007e37be2022c0914b268000000000000000000000000000000000000000000004ee2d6d415b85acef8100000000000000000000000000000000000000000000314dc6448d9338c15b0a00000000000000000000000000000000000000000001ed09bead87c0378d8e6400000000000000000000000000000000000000000013426172c74d822b878fe8000000000000000000000000000000000000000000c097ce7bc90715b34b9f1000000000000000000000000000000000000000000785ee10d5da46d900f436a000000000000000000000000000000000000000004b3b4ca85a86c47a098a22400000000000000000000000000000000000000002f050fe938943acc45f655680000000000000000000000000000000000000001d6329f1c35ca4bfabb9f561000000000000000000000000000000000000000125dfa371a19e6f7cb54395ca000000000000000000000000000000000000000b7abc627050305adf14a3d9e40000000000000000000000000000000000000072cb5bd86321e38cb6ce6682e8000000000000000000000000000000000000047bf19673df52e37f2410011d100000000000000000000000000000000000002cd76fe086b93ce2f768a00b22a0000000000000000000000000000000000001c06a5ec5433c60ddaa16406f5a400000000000000000000000000000000000118427b3b4a05bc8a8a4de845986800000000000000000000000000000000000af298d050e4395d69670b12b7f41000000000000000000000000000000000006d79f82328ea3da61e066ebb2f88a0000000000000000000000000000000000446c3b15f9926687d2c40534fdb5640000000000000000000000000000000002ac3a4edbbfb8014e3ba83411e915e8000000000000000000000000000000001aba4714957d300d0e549208b31adb10000000000000000000000000000000010b46c6cdd6e3e0828f4db456ff0c8ea00000000000000000000000000000000a70c3c40a64e6c51999090b65f67d92400000000000000000000000000000006867a5a867f103b2fffa5a71fba0e7b680000000000000000000000000000004140c78940f6a24fdffc78873d4490d2100000000000000000000000000000028c87cb5c89a2571ebfdcb54864ada834a00000000000000000000000000000197d4df19d605767337e9f14d3eec8920e400000000000000000000000000000fee50b7025c36a0802f236d04753d5b48e800000000000000000000000000009f4f2726179a224501d762422c946590d91000000000000000000000000000063917877cec0556b21269d695bdcbf7a87aa0000000000000000000000000003e3aeb4ae1383562f4b82261d969f7ac94ca40000000000000000000000000026e4d30eccc3215dd8f3157d27e23acbdcfe680000000000000000000000000184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000000000000000f316271c7fc3908a8bef464e3945ef7a25360a000000000000000000000000097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000000000005ef4a74721e864761ea977768e5f518bb6891be8000000000000000000000003b58e88c75313ec9d329eaaa18fb92f75215b1710000000000000000000000025179157c93ec73e23fa32aa4f9d3bda934d8ee6a0000000000000000000000172ebad6ddc73c86d67c5faa71c245689c107950240000000000000000000000e7d34c64a9c85d4460dbbca87196b61618a4bd216800000000000000000000090e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000000005a8e89d75252446eb5d5d5b1cc5edf20a1a059e10ca000000000000000000003899162693736ac531a5a58f1fbb4b746504382ca7e40000000000000000000235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000161bcca7119915b50764b4abe86529797775a5f1719510000000000000000000dd15fe86affad91249ef0eb713f39ebeaa987b6e6fd2a0000000000000000000 +} + +#define table COMMON_4BYTES { + 0x00000000a9059cbb095ea7b37ff36ab538ed173918cbafe5202ee0edfb3bdb41e2bbb158ab834bab6ea056a923b872dda68a76cc5f5755298803dbeea22cb465c89e43612da0340990411a321cff79cd223da1ba2e1a7d4df305d71939125215d0e30db0f7654176a694fc3a1a695230b6b55f25791ac94764887334c658695c441a3e704f1d48324a25d94aa454dfa9c18a84bce2b39746178979aec9807539ddd81f82a8a41c70cf557fe33d18b9129cec63924ab0d1900dcd7a6cd9627aa49149bafe672a9400dfbe4a31c6bf3262f242432ae5ab4da240c10f192e7ba6efc23e1a211aa3a008d6b347f7ded9382a00000003e9fad8eefaebafa8ae169a50e8e3370041fe00a0fa558b712e95b6c8c48fdfca000000006a80c33f627dd56a5c11d7954946e2065e83b463ca722cdcfb90b32000000008f7c1e582a32fe0a1db006a75000000010002191ce6d66ac8a0712d685d5d442296aa7368d3392ddf0ea5812fa5d754d1d29dff129979ef457901451ca64f797659d667a500032587865a6b4f379607f57c02520082d2697fc11695488758a5f34e71d92d9ddd67ba183d4e0b8f69c188e3dec8fbedc9af952d2da8066a761202a9b1d507ca120b1ff14fcbc8961c9ae442842e0e2195995c94b918de608060405174e8532505c3d98568523a0e89439bd149d05cefef39a14ce6931a000225879bfcb236415565b0454a2ab3ce558087f7a1696342966c688b4cb0ec4faa8a26e4a76726e8eda9df1519cdeb356282bfe17376b5009952eb3d7989fe34b0793b38bcdfc0f053566e02751cecc01a8c84f463e18e3cd18ca029ada03907d6b3483805550fa59f3e0c89bbb8b2c5ebeaec4997adb6f5e54063761610fcb88a802f3ccfd60b2e2d726ca4202615b44848f51610ca95bcf64e0579b177ec22895118ed436a474d474898c0f4ed31b967cb0ca6e158f8db7fd4089120491ca415bcad8201aa3f6e5110ae5312ea8e3df02124b77d239ba67a6a45156e29f6241735bbd017e8c73f7658fd86b2ecc4c44193c39bc12042d96a094a13d98d135d4c66a3ad4451a32e17de789ec9b36be47d166cbfff3b87f884e54a0b020003ad58bdd147e7ef24bad42590c8fd6ed002032587c6427474f6162b01baa2abde1ff013f11846eac55915d806f6aa658b00024a9c564a515869328dec4454b20df5298aca853828b6f06427e5b6b4af05f3fef3a352a438b81249c58bfeab2e5af9d83bb568c2c5fb02022587d586d8e0db254e5005eec2890e7527028f4af52f6a627842508c1dbd0f694584a6417ed63049105d1e9a6950d9caed120103258748d5c7e3be389d577430e0c649b780f00af49149d508e6238e1e280cae47bea8683fa88d5db3b4df1e83409a852a12e3c2998238343009a2daa6d5560f0439589c1298a06aa1e6d24d559317 +} diff --git a/packages/wallet/wallet-contracts/src/__TEMP__csfnkjajkqagwbukjfojatjegwtjmxhdL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__csfnkjajkqagwbukjfojatjegwtjmxhdL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__csfnkjajkqagwbukjfojatjegwtjmxhdL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__cvwewezvvfcuoxtlisicumgcpzqhgavjL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__cvwewezvvfcuoxtlisicumgcpzqhgavjL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__cvwewezvvfcuoxtlisicumgcpzqhgavjL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__cvyihdgegfauooldcwyvlordhurwepivL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__cvyihdgegfauooldcwyvlordhurwepivL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__cvyihdgegfauooldcwyvlordhurwepivL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__dpdvzwushkgzisywrbnkhcrodypkvbvyL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__dpdvzwushkgzisywrbnkhcrodypkvbvyL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__dpdvzwushkgzisywrbnkhcrodypkvbvyL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__ecomtgzdrtxibkzevmerruajxffksduvL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__ecomtgzdrtxibkzevmerruajxffksduvL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__ecomtgzdrtxibkzevmerruajxffksduvL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__iacuotklnugcaogzpvcdfhvolsvzerleL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__iacuotklnugcaogzpvcdfhvolsvzerleL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__iacuotklnugcaogzpvcdfhvolsvzerleL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__jcmwhtnovsnvnyyhadlushmcopgxtlcwL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__jcmwhtnovsnvnyyhadlushmcopgxtlcwL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__jcmwhtnovsnvnyyhadlushmcopgxtlcwL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__jdfvnyqsqtnysjlyfovitokyykvxttnoL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__jdfvnyqsqtnysjlyfovitokyykvxttnoL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__jdfvnyqsqtnysjlyfovitokyykvxttnoL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__jyyzvebufexucahwkkbkfdcmuiabvbfeL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__jyyzvebufexucahwkkbkfdcmuiabvbfeL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__jyyzvebufexucahwkkbkfdcmuiabvbfeL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__kbisarygvfqaqtuxwpgejdnyqkualpwlL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__kbisarygvfqaqtuxwpgejdnyqkualpwlL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__kbisarygvfqaqtuxwpgejdnyqkualpwlL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__lszmdtforkxonmlujouewhlrvjjrmurcL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__lszmdtforkxonmlujouewhlrvjjrmurcL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__lszmdtforkxonmlujouewhlrvjjrmurcL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__mgltnswskwojupcsygtzovabokiotusaL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__mgltnswskwojupcsygtzovabokiotusaL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__mgltnswskwojupcsygtzovabokiotusaL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__mzwfsngwzygdglttftvfnbgkuxhmtqwiL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__mzwfsngwzygdglttftvfnbgkuxhmtqwiL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__mzwfsngwzygdglttftvfnbgkuxhmtqwiL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__nxqmasuaqrahclmuoszdisbtgmuppjvfL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__nxqmasuaqrahclmuoszdisbtgmuppjvfL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__nxqmasuaqrahclmuoszdisbtgmuppjvfL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__pgmagdckbktfjhzdpajytwhcpkhlmscqL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__pgmagdckbktfjhzdpajytwhcpkhlmscqL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__pgmagdckbktfjhzdpajytwhcpkhlmscqL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__pwbfbdaeweytjiloryhjilsqguaprwtwL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__pwbfbdaeweytjiloryhjilsqguaprwtwL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__pwbfbdaeweytjiloryhjilsqguaprwtwL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__pxqvpgsonlpbmziexnicojtlgsgfouyrL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__pxqvpgsonlpbmziexnicojtlgsgfouyrL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__pxqvpgsonlpbmziexnicojtlgsgfouyrL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__qcagqkszwlsndhjyagmukhxiugwadpxxL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__qcagqkszwlsndhjyagmukhxiugwadpxxL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__qcagqkszwlsndhjyagmukhxiugwadpxxL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__qymdioekngjvjjjqfpzmxlycnvbslwevL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__qymdioekngjvjjjqfpzmxlycnvbslwevL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__qymdioekngjvjjjqfpzmxlycnvbslwevL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__rpzdmcdnijxlttsivcfgzleurbgpchhzL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__rpzdmcdnijxlttsivcfgzleurbgpchhzL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__rpzdmcdnijxlttsivcfgzleurbgpchhzL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__rulclzzfmyszewnycpzlqmcopsqccarqL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__rulclzzfmyszewnycpzlqmcopsqccarqL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__rulclzzfmyszewnycpzlqmcopsqccarqL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__uexsnlcvbjyubdfmmdxzehdfcdiwufcrL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__uexsnlcvbjyubdfmmdxzehdfcdiwufcrL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__uexsnlcvbjyubdfmmdxzehdfcdiwufcrL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__ughbfnqmhbdbiuueqxutuvcxicgrmnxwL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__ughbfnqmhbdbiuueqxutuvcxicgrmnxwL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__ughbfnqmhbdbiuueqxutuvcxicgrmnxwL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__uzsvtiqnxxrhkhfelgdrwmnbwwirribaL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__uzsvtiqnxxrhkhfelgdrwmnbwwirribaL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__uzsvtiqnxxrhkhfelgdrwmnbwwirribaL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__vffsqkjyicdnumnesfhcjlgtqguwdpnpL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__vffsqkjyicdnumnesfhcjlgtqguwdpnpL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__vffsqkjyicdnumnesfhcjlgtqguwdpnpL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__vtbpzpccsyytsvygxsyhvyojjbqsghpbL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__vtbpzpccsyytsvygxsyhvyojjbqsghpbL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__vtbpzpccsyytsvygxsyhvyojjbqsghpbL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__xhuychsyvcmrjzhibkdksklxflvtfefdL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__xhuychsyvcmrjzhibkdksklxflvtfefdL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__xhuychsyvcmrjzhibkdksklxflvtfefdL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__ylxrpbrfcykqjxgggzptgdvokhmzcvamL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__ylxrpbrfcykqjxgggzptgdvokhmzcvamL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__ylxrpbrfcykqjxgggzptgdvokhmzcvamL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/__TEMP__zkzjzrglozoqyyfvpcdqeanjxglmtzbbL2Compressor.huff b/packages/wallet/wallet-contracts/src/__TEMP__zkzjzrglozoqyyfvpcdqeanjxglmtzbbL2Compressor.huff new file mode 100644 index 000000000..da1916e7d --- /dev/null +++ b/packages/wallet/wallet-contracts/src/__TEMP__zkzjzrglozoqyyfvpcdqeanjxglmtzbbL2Compressor.huff @@ -0,0 +1,142 @@ + + +#include "./L2CompressorLib.huff" + + +#define jumptable SELECTORS_TABLE { + execute_transaction // 0x00 + execute_many_transactions // 0x01 + read_address // 0x02 + read_bytes32 // 0x03 + sizes // 0x04 + read_storage_slots // 0x05 + decompress_transaction // 0x06 + decompress_many_transactions // 0x07 +} + +#define macro MAIN() = takes (0) returns (0) { + // Write the jump table to 0x20 + // or else the flags jumptable won't get written + // all this memory will be reused anyway + __tablesize(SELECTORS_TABLE) // [table_size] + __tablestart(SELECTORS_TABLE) // [table_start, table_size] + 0x20 // [0x20, table_start, table_size] + codecopy // [] + + callvalue // [0x00] + calldataload // [data[0x00]] + callvalue // [0x00, data[0x00]] + byte // [method] + + 0x05 // [0x05, method] + shl // [(method << 0x05)] + 0x20 add // [method + 0x20] + mload // [mload[method]] + jump // [] + + execute_transaction: + 0x01 // [rindex] + PERFORM_EXECUTE(nrfs) // [rindex] + callvalue callvalue return + + execute_many_transactions: + 0x01 // [rindex] + PERFORM_MANY_EXECUTES(nrfs) // [rindex, size, i] + callvalue callvalue return + + read_address: + PERFORM_READ_ADDRESS() + 0x20 callvalue return + + read_bytes32: + PERFORM_READ_BYTES32() + 0x20 callvalue return + + sizes: + PERFORM_READ_SIZES() + 0x20 callvalue return + + read_storage_slots: + PERFORM_READ_SLOTS() // [size] + callvalue // [0x00, size] + return + + decompress_transaction: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_FULL_EXECUTE(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + decompress_many_transactions: + 0x01 // [rindex] + [FMS] // [windex, rindex] + + READ_MANY_FULL_EXECUTES(nrfs) // [windex, rindex] + + [FMS] // [FMS, windex, rindex] + swap1 // [windex, FMS, rindex] + sub // [(windex - FMS), rindex] + + [FMS] // [FMS, (windex - FMS), rindex] + return // [rindex] + + // This will be appended at the end + // unreachable code as all the method return first + + nrfs: + FN_READ_FLAG(nrfs) +} + + + +#define macro READ_FULL_EXECUTE(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + READ_EXECUTE() // [windex, rindex] + PERFORM_NESTED_READ_FLAG() // [windex, rindex] + + // output stack: [windex, rindex] +} + +#define macro READ_MANY_FULL_EXECUTES(nrfs) = takes (2) returns (2) { + // input stack: [windex, rindex] + + swap1 // [rindex, windex] + + LOAD_1_BYTE() // [size, rindex, windex] + callvalue // [i, size, rindex, windex] + swap2 // [rindex, size, i, windex] + + do_another: // [rindex, size, i, windex] + swap1 // [size, rindex, i, windex] + swap2 // [i, rindex, size, windex] + swap3 // [windex, rindex, size, i] + + READ_FULL_EXECUTE() // [windex, rindex, size, i] + + swap3 // [i, rindex, size, windex] + swap2 // [size, rindex, i, windex] + swap1 // [rindex, size, i, windex] + + swap2 // [i, size, rindex, windex] + 0x01 // [0x01, i, size, rindex, windex] + add // [(0x01 + i), size, rindex, windex] + swap2 // [rindex, size, (0x01 + i), windex] + + dup2 // [size, rindex, size, (0x01 + i), windex] + dup4 // [(0x01 + i), size, rindex, size, (0x01 + i), windex] + lt // [((0x01 + i) < size), rindex, size, (0x01 + i), windex] + do_another jumpi // [rindex, size, (0x01 + i), windex] + + swap1 // [size, rindex, (0x01 + i), windex] + swap3 // [windex, rindex, (0x01 + i), size] + + // output stack: [windex, rindex, (0x01 + i), size] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/imps/L2CompressorImps.huff b/packages/wallet/wallet-contracts/src/imps/L2CompressorImps.huff new file mode 100644 index 000000000..6ea7dad70 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/L2CompressorImps.huff @@ -0,0 +1,52 @@ +#include "../L2CompressorLib.huff" + +#define function testLoadDynamicSize(bytes32 _a, bytes32 _b, uint256, uint256) view returns (uint256, uint256, bytes32) +#define function testReadBytes32(bytes32 _a, bytes32 _b, uint256, uint256, uint256) view returns (uint256, uint256) + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // Identify which function is being called. + 0x00 calldataload 0xE0 shr // [func_sig] + + dup1 __FUNC_SIG(testLoadDynamicSize) eq testLoadDynamicSize jumpi + dup1 __FUNC_SIG(testReadBytes32) eq testReadBytes32 jumpi + + // Revert if no match is found. + 0x00 dup1 revert + + testLoadDynamicSize: + IMP_LOAD_DYNAMIC_SIZE() + + testReadBytes32: + IMP_READ_BYTES32() +} + +#define macro IMP_LOAD_DYNAMIC_SIZE() = takes (2) returns (0) { + 0x04 0x40 add calldataload // [rindex] + 0x04 0x60 add calldataload // [size, rindex] + + LOAD_DYNAMIC_SIZE() // [size bits, rindex + size] + + 0x00 mstore // [rindex + size] + 0x20 mstore // [] + + 0x40 0x00 return +} + +#define macro IMP_READ_BYTES32() = takes (3) returns (2) { + 0x04 0x40 add calldataload // [rindex] + 0x04 0x60 add calldataload // [windex, rindex] + 0x04 0x80 add calldataload // [flag, windex, rindex] + + READ_BYTES32() // [windex, rindex] + + 0x00 mstore // [rindex] + 0x20 mstore // [] + + 0x04 0x60 add calldataload // [windex] + mload // [written] + + 0x40 mstore // [] + + 0x60 0x00 return +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/src/imps/L2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadExecute.huff new file mode 100644 index 000000000..b75163c89 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadExecute.huff @@ -0,0 +1,30 @@ +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/L2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadFlag.huff new file mode 100644 index 000000000..a046df236 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadFlag.huff @@ -0,0 +1,30 @@ +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/L2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadNonce.huff new file mode 100644 index 000000000..847b60031 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadNonce.huff @@ -0,0 +1,30 @@ +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/L2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadTx.huff new file mode 100644 index 000000000..113e35ba8 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadTx.huff @@ -0,0 +1,30 @@ +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/L2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadTxs.huff new file mode 100644 index 000000000..a5042b2f4 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/L2CompressorReadTxs.huff @@ -0,0 +1,30 @@ +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__aayxscdgqfgqckqcfvplniuqleqmglgpL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__aayxscdgqfgqckqcfvplniuqleqmglgpL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__aayxscdgqfgqckqcfvplniuqleqmglgpL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__agjsoduxivwxbunbrskpnttujfxlnsuqL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__agjsoduxivwxbunbrskpnttujfxlnsuqL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__agjsoduxivwxbunbrskpnttujfxlnsuqL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__aozfhsjnhfgdhkvygupcezykxnllxhooL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__aozfhsjnhfgdhkvygupcezykxnllxhooL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__aozfhsjnhfgdhkvygupcezykxnllxhooL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__auoqqxuvhsugblxkhmuynutuutdpetfmL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__auoqqxuvhsugblxkhmuynutuutdpetfmL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__auoqqxuvhsugblxkhmuynutuutdpetfmL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__bgiysfzlfrqnqopegdijkxkzjebeugweL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__bgiysfzlfrqnqopegdijkxkzjebeugweL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__bgiysfzlfrqnqopegdijkxkzjebeugweL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__bhcstacsnwaeevimfyeuyukrpkefkpjvL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__bhcstacsnwaeevimfyeuyukrpkefkpjvL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__bhcstacsnwaeevimfyeuyukrpkefkpjvL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__bjodacjzehrzeexubslwqheqqdtpojdxL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__bjodacjzehrzeexubslwqheqqdtpojdxL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__bjodacjzehrzeexubslwqheqqdtpojdxL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__bqzqrnjvdcsevkfpbluzvxgnvfnbjbvdL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__bqzqrnjvdcsevkfpbluzvxgnvfnbjbvdL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__bqzqrnjvdcsevkfpbluzvxgnvfnbjbvdL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__bxxjqefyxrrctwjijuvxauktfiveuhazL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__bxxjqefyxrrctwjijuvxauktfiveuhazL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__bxxjqefyxrrctwjijuvxauktfiveuhazL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__cczbajsfeehqceablvdedlohtwcpgruiL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__cczbajsfeehqceablvdedlohtwcpgruiL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__cczbajsfeehqceablvdedlohtwcpgruiL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__ceqwybpkmvqejmujxdddmmbuqrzcvpqlL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__ceqwybpkmvqejmujxdddmmbuqrzcvpqlL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__ceqwybpkmvqejmujxdddmmbuqrzcvpqlL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__cinzltxsvuofyvnmuiiddtfwsyytzwszL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__cinzltxsvuofyvnmuiiddtfwsyytzwszL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__cinzltxsvuofyvnmuiiddtfwsyytzwszL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__ckntqzzuqphqsecwtcwuiczrfadymzpwL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__ckntqzzuqphqsecwtcwuiczrfadymzpwL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__ckntqzzuqphqsecwtcwuiczrfadymzpwL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__ctxqvslrdaagplfabzhyfjejoyhqoxvnL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__ctxqvslrdaagplfabzhyfjejoyhqoxvnL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__ctxqvslrdaagplfabzhyfjejoyhqoxvnL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__cxyftrlslztbljuqlicrbibyyssybguhL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__cxyftrlslztbljuqlicrbibyyssybguhL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__cxyftrlslztbljuqlicrbibyyssybguhL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__cyxkjqcsonpojbyksbsvglcrgoqbepkaL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__cyxkjqcsonpojbyksbsvglcrgoqbepkaL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__cyxkjqcsonpojbyksbsvglcrgoqbepkaL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__deeivxbssjzviqkksdozrardbmkofvggL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__deeivxbssjzviqkksdozrardbmkofvggL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__deeivxbssjzviqkksdozrardbmkofvggL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__dexeqmbbqijqudvjnczxedpzkrqkrxgpL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__dexeqmbbqijqudvjnczxedpzkrqkrxgpL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__dexeqmbbqijqudvjnczxedpzkrqkrxgpL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__ebpduriemctxazssijauhsotgyqtayygL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__ebpduriemctxazssijauhsotgyqtayygL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__ebpduriemctxazssijauhsotgyqtayygL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__edfwesooemxojadwrkmombuemzhicuirL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__edfwesooemxojadwrkmombuemzhicuirL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__edfwesooemxojadwrkmombuemzhicuirL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__eicqyirjstlxuotvptvgszvdeemgpomnL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__eicqyirjstlxuotvptvgszvdeemgpomnL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__eicqyirjstlxuotvptvgszvdeemgpomnL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__eiovqvzojbuhtglrinqvkqirnywzkmmmL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__eiovqvzojbuhtglrinqvkqirnywzkmmmL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__eiovqvzojbuhtglrinqvkqirnywzkmmmL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__elmwrfrphdzesjosulrygitvkhredhzhL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__elmwrfrphdzesjosulrygitvkhredhzhL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__elmwrfrphdzesjosulrygitvkhredhzhL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__eqatcxksiizfyaalvdegpzaqhuqqhiasL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__eqatcxksiizfyaalvdegpzaqhuqqhiasL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__eqatcxksiizfyaalvdegpzaqhuqqhiasL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__etsleznlprfdbomdvycqormkvpykanxnL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__etsleznlprfdbomdvycqormkvpykanxnL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__etsleznlprfdbomdvycqormkvpykanxnL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__ezolvnoridtqgdaoucihkxihmonvdzfxL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__ezolvnoridtqgdaoucihkxihmonvdzfxL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__ezolvnoridtqgdaoucihkxihmonvdzfxL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__fjxkkzopmkrdujlfcvecckcbuhhhpvpfL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__fjxkkzopmkrdujlfcvecckcbuhhhpvpfL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__fjxkkzopmkrdujlfcvecckcbuhhhpvpfL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__fnqywxkjihwbqdurhcftzbzzrxvcmizbL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__fnqywxkjihwbqdurhcftzbzzrxvcmizbL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__fnqywxkjihwbqdurhcftzbzzrxvcmizbL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__fophszhswirxqqcvcwxtmeqbuwldxifmL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__fophszhswirxqqcvcwxtmeqbuwldxifmL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__fophszhswirxqqcvcwxtmeqbuwldxifmL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__fvrcmlbliwfwkjwbyxrediuokmghmftbL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__fvrcmlbliwfwkjwbyxrediuokmghmftbL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__fvrcmlbliwfwkjwbyxrediuokmghmftbL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__fzlawzzpwhflvpxtrdpemqiejqiknsfiL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__fzlawzzpwhflvpxtrdpemqiejqiknsfiL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__fzlawzzpwhflvpxtrdpemqiejqiknsfiL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__gllqgrsektwpyxkfoughzygdwrhxuzibL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__gllqgrsektwpyxkfoughzygdwrhxuzibL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__gllqgrsektwpyxkfoughzygdwrhxuzibL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__gmuxapiaoacldjbqqarixmvtxkffgwchL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__gmuxapiaoacldjbqqarixmvtxkffgwchL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__gmuxapiaoacldjbqqarixmvtxkffgwchL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__gnbrxkaxjdmimbyepztqmujkoilcaudgL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__gnbrxkaxjdmimbyepztqmujkoilcaudgL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__gnbrxkaxjdmimbyepztqmujkoilcaudgL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__grtgxrlusabnzjycyuqniujobcpgjuysL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__grtgxrlusabnzjycyuqniujobcpgjuysL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__grtgxrlusabnzjycyuqniujobcpgjuysL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__guymonsuywmugusjixyvzwfzordmogvuL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__guymonsuywmugusjixyvzwfzordmogvuL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__guymonsuywmugusjixyvzwfzordmogvuL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__gvmiqpcdvchroaxhcnyygzhjrvozrogmL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__gvmiqpcdvchroaxhcnyygzhjrvozrogmL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__gvmiqpcdvchroaxhcnyygzhjrvozrogmL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__hahsuwlfvumxsoepdhwqsahoduwcqrrpL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__hahsuwlfvumxsoepdhwqsahoduwcqrrpL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__hahsuwlfvumxsoepdhwqsahoduwcqrrpL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__hbzqhssjozyiqufyamizmyrwtgelqlacL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__hbzqhssjozyiqufyamizmyrwtgelqlacL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__hbzqhssjozyiqufyamizmyrwtgelqlacL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__hfunbeczbrqifdmdhdecpajexqefympmL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__hfunbeczbrqifdmdhdecpajexqefympmL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__hfunbeczbrqifdmdhdecpajexqefympmL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__htawaymiowrkxyrnxkesysithbtrbvqqL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__htawaymiowrkxyrnxkesysithbtrbvqqL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__htawaymiowrkxyrnxkesysithbtrbvqqL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__hwddxmqkngntwieovwlvozjzwlctwrzrL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__hwddxmqkngntwieovwlvozjzwlctwrzrL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__hwddxmqkngntwieovwlvozjzwlctwrzrL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__iepjlcxcjkjplwmrexbaruoucdulzvqvL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__iepjlcxcjkjplwmrexbaruoucdulzvqvL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__iepjlcxcjkjplwmrexbaruoucdulzvqvL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__igcaczanzcfoaizsmahiisgmgdjzfjxqL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__igcaczanzcfoaizsmahiisgmgdjzfjxqL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__igcaczanzcfoaizsmahiisgmgdjzfjxqL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__irlchgckchrpalaqwygxkipfvshmgystL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__irlchgckchrpalaqwygxkipfvshmgystL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__irlchgckchrpalaqwygxkipfvshmgystL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__ixvgjbblpufenoaperstvmceseoukqtcL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__ixvgjbblpufenoaperstvmceseoukqtcL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__ixvgjbblpufenoaperstvmceseoukqtcL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__jehdemzdnzfibjlvuclsezveuuexubagL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__jehdemzdnzfibjlvuclsezveuuexubagL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__jehdemzdnzfibjlvuclsezveuuexubagL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__jgpbsiwsniszmajdqepfceqpqhdfzbiiL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__jgpbsiwsniszmajdqepfceqpqhdfzbiiL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__jgpbsiwsniszmajdqepfceqpqhdfzbiiL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__jowmzjwgdpwndoapfucdlmsxiuwbhxrsL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__jowmzjwgdpwndoapfucdlmsxiuwbhxrsL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__jowmzjwgdpwndoapfucdlmsxiuwbhxrsL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__jujqtnlfowbvuxcpetgqmymkladcanwtL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__jujqtnlfowbvuxcpetgqmymkladcanwtL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__jujqtnlfowbvuxcpetgqmymkladcanwtL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__jvyndfqmdiikuahllmivwlrgrfhmdzslL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__jvyndfqmdiikuahllmivwlrgrfhmdzslL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__jvyndfqmdiikuahllmivwlrgrfhmdzslL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__kqlasykhhfirrrmebqsqsnoleofcgyciL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__kqlasykhhfirrrmebqsqsnoleofcgyciL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__kqlasykhhfirrrmebqsqsnoleofcgyciL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__krffnjyglejvywvaqrlwcoejtxsysubcL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__krffnjyglejvywvaqrlwcoejtxsysubcL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__krffnjyglejvywvaqrlwcoejtxsysubcL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__lcamxsrkjvabmusmojsaspukxeydggrhL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__lcamxsrkjvabmusmojsaspukxeydggrhL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__lcamxsrkjvabmusmojsaspukxeydggrhL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__lhhzpskainxqfqaqlpehxidlrhdvkcoyL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__lhhzpskainxqfqaqlpehxidlrhdvkcoyL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__lhhzpskainxqfqaqlpehxidlrhdvkcoyL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__lqfhpuhoyykhenkubqyenjlfkzsbjkxcL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__lqfhpuhoyykhenkubqyenjlfkzsbjkxcL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__lqfhpuhoyykhenkubqyenjlfkzsbjkxcL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__lvxixehkgptearwmufefnibyzayqaaciL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__lvxixehkgptearwmufefnibyzayqaaciL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__lvxixehkgptearwmufefnibyzayqaaciL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__lyxapewhygradusuogqwefdorgsntvcxL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__lyxapewhygradusuogqwefdorgsntvcxL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__lyxapewhygradusuogqwefdorgsntvcxL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__mfzlovayqwfmitftdbihfqfuruuvbxqbL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__mfzlovayqwfmitftdbihfqfuruuvbxqbL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__mfzlovayqwfmitftdbihfqfuruuvbxqbL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__mimqucgooefgrgmedlqkqqhszmvuuxioL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__mimqucgooefgrgmedlqkqqhszmvuuxioL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__mimqucgooefgrgmedlqkqqhszmvuuxioL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__mlmvtiltzqbjdwbouzrwkvkhpzncpjzsL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__mlmvtiltzqbjdwbouzrwkvkhpzncpjzsL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__mlmvtiltzqbjdwbouzrwkvkhpzncpjzsL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__mscgrvpcuajxspktkuiktwofhzwbszraL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__mscgrvpcuajxspktkuiktwofhzwbszraL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__mscgrvpcuajxspktkuiktwofhzwbszraL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__mscqnapvfrrvforntvdsgkeofzbhbhdsL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__mscqnapvfrrvforntvdsgkeofzbhbhdsL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__mscqnapvfrrvforntvdsgkeofzbhbhdsL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__nikafqmlyyfgnksobnextlfkyykzrdomL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__nikafqmlyyfgnksobnextlfkyykzrdomL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__nikafqmlyyfgnksobnextlfkyykzrdomL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__nmkhnrsondojimozdduewzkbcwlvsakcL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__nmkhnrsondojimozdduewzkbcwlvsakcL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__nmkhnrsondojimozdduewzkbcwlvsakcL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__nwvyiqgthdyhbeqefkhccrhufdhjjazeL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__nwvyiqgthdyhbeqefkhccrhufdhjjazeL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__nwvyiqgthdyhbeqefkhccrhufdhjjazeL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__obfmnrpwkqhjnhtlarvljeqysguhoizaL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__obfmnrpwkqhjnhtlarvljeqysguhoizaL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__obfmnrpwkqhjnhtlarvljeqysguhoizaL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__osezdxhuqmvwkwrmogebamkqmhdvljmlL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__osezdxhuqmvwkwrmogebamkqmhdvljmlL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__osezdxhuqmvwkwrmogebamkqmhdvljmlL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__pabiechkuxsxbofnkwdnlbnftvkuearfL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__pabiechkuxsxbofnkwdnlbnftvkuearfL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__pabiechkuxsxbofnkwdnlbnftvkuearfL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__paowmqtaesjuestckycmjquytqlfsdxoL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__paowmqtaesjuestckycmjquytqlfsdxoL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__paowmqtaesjuestckycmjquytqlfsdxoL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__pbsqieaiicgyhrvarrpmypzdufaanmpuL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__pbsqieaiicgyhrvarrpmypzdufaanmpuL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__pbsqieaiicgyhrvarrpmypzdufaanmpuL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__pdhdqmtavohyssvasdtggpxqllpajsfgL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__pdhdqmtavohyssvasdtggpxqllpajsfgL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__pdhdqmtavohyssvasdtggpxqllpajsfgL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__petemgomrtnkvriaaltgrrlpmnzupwinL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__petemgomrtnkvriaaltgrrlpmnzupwinL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__petemgomrtnkvriaaltgrrlpmnzupwinL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__prsagizbgnvlqmbynuotwqkanwdlaqwpL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__prsagizbgnvlqmbynuotwqkanwdlaqwpL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__prsagizbgnvlqmbynuotwqkanwdlaqwpL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__pwmrquntendpgjgzyejxobzrgvpizgfdL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__pwmrquntendpgjgzyejxobzrgvpizgfdL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__pwmrquntendpgjgzyejxobzrgvpizgfdL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__qcnbdgafrzidybihlkysfiliofczzxkhL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__qcnbdgafrzidybihlkysfiliofczzxkhL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__qcnbdgafrzidybihlkysfiliofczzxkhL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__qmgpovlxptxlyeikmnrgvhavunciniubL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__qmgpovlxptxlyeikmnrgvhavunciniubL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__qmgpovlxptxlyeikmnrgvhavunciniubL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__qotscdrriksxilvopyxfsbdteqegnyogL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__qotscdrriksxilvopyxfsbdteqegnyogL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__qotscdrriksxilvopyxfsbdteqegnyogL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__qpcuafrrwylbrmzpjfotpjfuqxtnqrznL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__qpcuafrrwylbrmzpjfotpjfuqxtnqrznL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__qpcuafrrwylbrmzpjfotpjfuqxtnqrznL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__qrusinhmosfcvmayqquwflixlquuhfxhL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__qrusinhmosfcvmayqquwflixlquuhfxhL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__qrusinhmosfcvmayqquwflixlquuhfxhL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__raqvmbdtosqccjiitanbofqxpeepnlpnL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__raqvmbdtosqccjiitanbofqxpeepnlpnL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__raqvmbdtosqccjiitanbofqxpeepnlpnL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__ruqfgeoaamevndekencowviukvlcrylcL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__ruqfgeoaamevndekencowviukvlcrylcL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__ruqfgeoaamevndekencowviukvlcrylcL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__sccswirfbmatrvwbvymwfzttbygcbfmqL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__sccswirfbmatrvwbvymwfzttbygcbfmqL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__sccswirfbmatrvwbvymwfzttbygcbfmqL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__sgfhxhvokcpqraldrihrcqjmlolnoulkL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__sgfhxhvokcpqraldrihrcqjmlolnoulkL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__sgfhxhvokcpqraldrihrcqjmlolnoulkL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__smnsryuyuhbbunwequckjtrcwgaqmtqrL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__smnsryuyuhbbunwequckjtrcwgaqmtqrL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__smnsryuyuhbbunwequckjtrcwgaqmtqrL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__stxwzpcueqdwmcsxvxwzkubprcmgpexkL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__stxwzpcueqdwmcsxvxwzkubprcmgpexkL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__stxwzpcueqdwmcsxvxwzkubprcmgpexkL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__syiwghttzfntbuucvfvlctpjeldqbrshL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__syiwghttzfntbuucvfvlctpjeldqbrshL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__syiwghttzfntbuucvfvlctpjeldqbrshL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__tadxtxolhcweyyokjpleorchotchzsecL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__tadxtxolhcweyyokjpleorchotchzsecL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__tadxtxolhcweyyokjpleorchotchzsecL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__tlpzvbklzufubgnwcvynodibgfqnidibL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__tlpzvbklzufubgnwcvynodibgfqnidibL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__tlpzvbklzufubgnwcvynodibgfqnidibL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__uobsemubvemlejzpjvdzyjcjrsbhplpsL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__uobsemubvemlejzpjvdzyjcjrsbhplpsL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__uobsemubvemlejzpjvdzyjcjrsbhplpsL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__uudbvubkefushlwgxsfgldujuphcmuueL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__uudbvubkefushlwgxsfgldujuphcmuueL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__uudbvubkefushlwgxsfgldujuphcmuueL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__uyprsxxzmvxmqqzffpwypehvvksjzbvnL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__uyprsxxzmvxmqqzffpwypehvvksjzbvnL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__uyprsxxzmvxmqqzffpwypehvvksjzbvnL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__vmmtlehczdflhfwnklqlujjtzpxrejpmL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__vmmtlehczdflhfwnklqlujjtzpxrejpmL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__vmmtlehczdflhfwnklqlujjtzpxrejpmL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__voqybenghboelsmsisgwnqqymvpjvskcL2CompressorReadFlag.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__voqybenghboelsmsisgwnqqymvpjvskcL2CompressorReadFlag.huff new file mode 100644 index 000000000..6bc3f6157 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__voqybenghboelsmsisgwnqqymvpjvskcL2CompressorReadFlag.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_FLAG() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__vtdvfmunyolkgcpjpzhtgjgwawtaakhwL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__vtdvfmunyolkgcpjpzhtgjgwawtaakhwL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__vtdvfmunyolkgcpjpzhtgjgwawtaakhwL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__vtynudukibsyoxexvoiaurnusvgnrhusL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__vtynudukibsyoxexvoiaurnusvgnrhusL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__vtynudukibsyoxexvoiaurnusvgnrhusL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__vvictwvevvjztwupwcjsnyherfswgsgcL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__vvictwvevvjztwupwcjsnyherfswgsgcL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__vvictwvevvjztwupwcjsnyherfswgsgcL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__vzqupagxqpkbexuaqyoulenyhrwfuvsiL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__vzqupagxqpkbexuaqyoulenyhrwfuvsiL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__vzqupagxqpkbexuaqyoulenyhrwfuvsiL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__wcgjgrxjyjenenrnolprlkfulinnjttkL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__wcgjgrxjyjenenrnolprlkfulinnjttkL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__wcgjgrxjyjenenrnolprlkfulinnjttkL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__weeyfqxkqtokrkcwbrxerdftkvyxqwwiL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__weeyfqxkqtokrkcwbrxerdftkvyxqwwiL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__weeyfqxkqtokrkcwbrxerdftkvyxqwwiL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__xbuxrypubsjveaucjyhkmwlwmhlgvymnL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__xbuxrypubsjveaucjyhkmwlwmhlgvymnL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__xbuxrypubsjveaucjyhkmwlwmhlgvymnL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__xeqwdqdlujruiiyywivxsxrlsluymfdiL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__xeqwdqdlujruiiyywivxsxrlsluymfdiL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__xeqwdqdlujruiiyywivxsxrlsluymfdiL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__xprohfjolmgvmuxskobwcqavoskmutltL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__xprohfjolmgvmuxskobwcqavoskmutltL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__xprohfjolmgvmuxskobwcqavoskmutltL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__yhfcljsbzcghwkonkegmtbremlhrxnejL2CompressorReadExecute.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__yhfcljsbzcghwkonkegmtbremlhrxnejL2CompressorReadExecute.huff new file mode 100644 index 000000000..7351d4df3 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__yhfcljsbzcghwkonkegmtbremlhrxnejL2CompressorReadExecute.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_EXECUTE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__yphredkigvzhxnjzbspndmkchcjaofllL2CompressorReadNonce.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__yphredkigvzhxnjzbspndmkchcjaofllL2CompressorReadNonce.huff new file mode 100644 index 000000000..eb09bd2b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__yphredkigvzhxnjzbspndmkchcjaofllL2CompressorReadNonce.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_NONCE_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__zfeyxnkrahdyldfbtyakjkbvehkjdbmgL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__zfeyxnkrahdyldfbtyakjkbvehkjdbmgL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__zfeyxnkrahdyldfbtyakjkbvehkjdbmgL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__zmblbdmtdrpbbopekynjthxzellyhsxeL2CompressorReadTxs.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__zmblbdmtdrpbbopekynjthxzellyhsxeL2CompressorReadTxs.huff new file mode 100644 index 000000000..4a6f01a18 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__zmblbdmtdrpbbopekynjthxzellyhsxeL2CompressorReadTxs.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTIONS_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/src/imps/__TEMP__zvcrygcudiscauggwhjnxbrgifehtxhfL2CompressorReadTx.huff b/packages/wallet/wallet-contracts/src/imps/__TEMP__zvcrygcudiscauggwhjnxbrgifehtxhfL2CompressorReadTx.huff new file mode 100644 index 000000000..8c9f99fc5 --- /dev/null +++ b/packages/wallet/wallet-contracts/src/imps/__TEMP__zvcrygcudiscauggwhjnxbrgifehtxhfL2CompressorReadTx.huff @@ -0,0 +1,32 @@ + + +#include "../L2CompressorLib.huff" + +#define constant FMS = 0xa0 + +// Function Dispatching +#define macro MAIN() = takes (1) returns (1) { + // readAdvanced with whatever calldata is passed + // first 32 bytes returns the new rindex and the next 32 bytes returns the new windex + + 0x00 // [rindex] + [FMS] // [windex, rindex] + + READ_TRANSACTION_STANDALONE() // [windex, rindex] + + [FMS] // [0xa0, windex, rindex] + dup2 // [windex, 0xa0, windex, rindex] + sub // [len, windex, rindex] + + swap2 // [rindex, windex, len] + + 0x80 [FMS] sub mstore // [windex, len] + 0x60 [FMS] sub mstore // [len] + + 0x60 0x40 [FMS] sub mstore // [len] + dup1 0x20 [FMS] sub mstore // [len] + + 0x80 add // [len + 0x80] + + 0x80 [FMS] sub return +} diff --git a/packages/wallet/wallet-contracts/test/ChainedSignatures.spec.ts b/packages/wallet/wallet-contracts/test/ChainedSignatures.spec.ts new file mode 100644 index 000000000..5aab0892f --- /dev/null +++ b/packages/wallet/wallet-contracts/test/ChainedSignatures.spec.ts @@ -0,0 +1,136 @@ +import { expect } from 'chai' +import { ethers } from 'ethers' +import { expectToBeRejected } from './utils' +import { deploySequenceContext, SequenceContext } from './utils/contracts' +import { SequenceWallet } from './utils/wallet' + +contract('Chained signatures', (accounts: string[]) => { + let context: SequenceContext + + let wallet: SequenceWallet + let typeHash: string + + before(async () => { + context = await deploySequenceContext() + }) + + beforeEach(async () => { + wallet = SequenceWallet.basicWallet(context) + await wallet.deploy() + typeHash = await wallet.mainModule.SET_IMAGE_HASH_TYPE_HASH() + }) + + const chain = (top: string, ...rest: { sig: string }[]) => { + const encodedRest = ethers.solidityPacked( + rest.map(() => ['uint24', 'bytes']).flat(), + rest.map(r => [ethers.getBytes(r.sig).length, r.sig]).flat() + ) + + return ethers.solidityPacked(['uint8', 'uint24', 'bytes', 'bytes'], [3, ethers.getBytes(top).length, top, encodedRest]) + } + + const hashSetImageHash = (imageHash: string) => { + return ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode(['bytes32', 'bytes32'], [typeHash, imageHash])) + } + + it('Should accept a single chained signature', async () => { + const wallet_b = SequenceWallet.basicWallet(context, { address: wallet.address }) + + const hsih = hashSetImageHash(wallet_b.imageHash) + + const sig = await wallet.signDigest(hsih) + const topsig = await wallet_b.signTransactions([{}]) + const bundled = chain(topsig, { sig: sig }) + + await wallet_b.relayTransactions([{}], bundled) + }) + + it('Should accept two chained signatures', async () => { + let wallet_b = SequenceWallet.basicWallet(context, { address: wallet.address, signing: 2, idle: 1 }) + let wallet_c = SequenceWallet.basicWallet(context, { address: wallet_b.address, signing: 3, idle: 7 }) + + const checkpoint1 = BigInt(wallet.config.checkpoint) + 1n + const checkpoint2 = checkpoint1 + 1n + + wallet_b = wallet_b.useConfig({ ...wallet_b.config, checkpoint: checkpoint1 }) + wallet_c = wallet_c.useConfig({ ...wallet_c.config, checkpoint: checkpoint2 }) + + const hsih1 = hashSetImageHash(wallet_b.imageHash) + const hsih2 = hashSetImageHash(wallet_c.imageHash) + + const sig1 = await wallet.signDigest(hsih1) + const sig2 = await wallet_b.signDigest(hsih2) + + const topsig = await wallet_c.signTransactions([{}]) + const bundled = chain(topsig, { sig: sig2 }, { sig: sig1 }) + + await wallet_c.relayTransactions([{}], bundled) + }) + + it('Should reject chained signatures if checkpoint is wrongly ordered', async () => { + let wallet_b = SequenceWallet.basicWallet(context, { address: wallet.address, signing: 2, idle: 1 }) + let wallet_c = SequenceWallet.basicWallet(context, { address: wallet_b.address, signing: 3, idle: 7 }) + + const checkpoint1 = BigInt(wallet.config.checkpoint) + 1n + const checkpoint2 = checkpoint1 - 1n + + wallet_b = wallet_b.useConfig({ ...wallet_b.config, checkpoint: checkpoint1 }) + wallet_c = wallet_c.useConfig({ ...wallet_c.config, checkpoint: checkpoint2 }) + + const hsih1 = hashSetImageHash(wallet_b.imageHash) + const hsih2 = hashSetImageHash(wallet_c.imageHash) + + const sig1 = await wallet.signDigest(hsih1) + const sig2 = await wallet_b.signDigest(hsih2) + + const topsig = await wallet_c.signTransactions([{}]) + const bundled = chain(topsig, { sig: sig2 }, { sig: sig1 }) + + const tx = wallet_c.relayTransactions([{}], bundled) + await expectToBeRejected(tx, `WrongChainedCheckpointOrder(${checkpoint1}, ${checkpoint2})`) + }) + + it('Should accept top level signature encoded as chained', async () => { + const sig = await wallet.signTransactions([{}]) + await wallet.relayTransactions([{}], chain(sig)) + }) + + it('Should accept top level signature encoded as chained twice', async () => { + const sig = await wallet.signTransactions([{}]) + await wallet.relayTransactions([{}], chain(chain(sig))) + }) + + it('Should reject signature if current checkpoint is equal to signed checkpoint', async () => { + let wallet_b = SequenceWallet.basicWallet(context, { address: wallet.address }) + + const checkpoint = BigInt(wallet.config.checkpoint) + wallet_b = wallet_b.useConfig({ ...wallet_b.config, checkpoint: checkpoint }) + + const hsih = hashSetImageHash(wallet_b.imageHash) + const sig = await wallet.signDigest(hsih) + const topsig = await wallet_b.signTransactions([{}]) + const bundled = chain(topsig, { sig: sig }) + + await expectToBeRejected( + wallet_b.relayTransactions([{}], bundled), + `WrongChainedCheckpointOrder(${checkpoint}, ${checkpoint})` + ) + }) + + it('Should reject signature if current checkpoint is above to signed checkpoint', async () => { + let wallet_b = SequenceWallet.basicWallet(context, { address: wallet.address }) + + const checkpoint = BigInt(wallet.config.checkpoint) - 1n + wallet_b = wallet_b.useConfig({ ...wallet_b.config, checkpoint: checkpoint }) + + const hsih = hashSetImageHash(wallet_b.imageHash) + const sig = await wallet.signDigest(hsih) + const topsig = await wallet_b.signTransactions([{}]) + const bundled = chain(topsig, { sig: sig }) + + await expectToBeRejected( + wallet_b.relayTransactions([{}], bundled), + `WrongChainedCheckpointOrder(${wallet.config.checkpoint}, ${checkpoint})` + ) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/ERC165.spec.ts b/packages/wallet/wallet-contracts/test/ERC165.spec.ts new file mode 100644 index 000000000..f55cf6da2 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/ERC165.spec.ts @@ -0,0 +1,73 @@ +import { ethers } from 'ethers' +import { ContractType, deploySequenceContext, ERC165CheckerMock, SequenceContext } from './utils/contracts' +import { SequenceWallet } from './utils/wallet' +import { expect, interfaceIdOf, randomHex } from './utils' + +const interfaceIds = [ + 'IERC223Receiver', + 'IERC721Receiver', + 'IERC1155Receiver', + 'IERC1271Wallet', + 'IModuleAuth', + 'IModuleCalls', + 'IModuleCreator', + 'IModuleHooks', + 'IModuleUpdate' +] + +contract('ERC165', () => { + let context: SequenceContext + let erc165checker: ContractType + let wallet: SequenceWallet + + before(async () => { + context = await deploySequenceContext() + erc165checker = await ERC165CheckerMock.deploy() + }) + + beforeEach(async () => { + wallet = SequenceWallet.basicWallet(context) + await wallet.deploy() + }) + + describe('Implement all interfaces for ERC165 on MainModule', () => { + interfaceIds.forEach(element => { + it(`Should return implements ${element} interfaceId`, async () => { + const interfaceId = interfaceIdOf(new ethers.Interface(artifacts.require(element).abi)) + expect(BigInt(interfaceId) === 0n).to.be.false + + const erc165result = await erc165checker.doesContractImplementInterface(wallet.address, interfaceId) + expect(erc165result).to.be.true + }) + }) + }) + describe('Implement all interfaces for ERC165 on MainModuleUpgradable', () => { + beforeEach(async () => { + await wallet.updateImageHash(randomHex(32)) + }) + + interfaceIds.concat('IModuleAuthUpgradable').forEach(element => { + it(`Should return implements ${element} interfaceId`, async () => { + const interfaceId = interfaceIdOf(new ethers.Interface(artifacts.require(element).abi)) + expect(BigInt(interfaceId) === 0n).to.be.false + + const erc165result = await erc165checker.doesContractImplementInterface(wallet.address, interfaceId) + expect(erc165result).to.be.true + }) + }) + }) + describe('Manually defined interfaces', () => { + const interfaces = [ + ['ERC165', '0x01ffc9a7'], + ['ERC721', '0x150b7a02'], + ['ERC1155', '0x4e2312e0'] + ] + + interfaces.forEach(i => { + it(`Should implement ${i[0]} interface`, async () => { + const erc165result = await erc165checker.doesContractImplementInterface(wallet.address, i[1]) + expect(erc165result).to.be.true + }) + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/Factory.spec.ts b/packages/wallet/wallet-contracts/test/Factory.spec.ts new file mode 100644 index 000000000..c49885746 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/Factory.spec.ts @@ -0,0 +1,65 @@ +import { ethers } from 'ethers' + +import { ethers as hethers } from 'hardhat' +import { addressOf } from './utils/sequence' +import { expect, expectToBeRejected } from './utils' +import { ContractType, Factory, ModuleMock } from './utils/contracts' + +contract('Factory', () => { + let module: ContractType + let factory: ContractType + + beforeEach(async () => { + module = await ModuleMock.deploy() + factory = await Factory.deploy() + + await module.waitForDeployment() + await factory.waitForDeployment() + }) + + describe('Deploy wallets', () => { + it('Should deploy wallet', async () => { + await factory.deploy( + await module.getAddress(), + ethers.AbiCoder.defaultAbiCoder().encode(['address'], [ethers.Wallet.createRandom().address]) + ) + await factory.waitForDeployment() + }) + + it('Should predict wallet address', async () => { + const hash = ethers.hexlify(ethers.randomBytes(32)) + const predict = addressOf(await factory.getAddress(), await module.getAddress(), hash) + await factory.deploy(await module.getAddress(), hash) + await factory.waitForDeployment() + expect(await hethers.provider.getCode(predict)).to.not.equal('0x') + }) + + it('Should initialize with main module', async () => { + const hash = ethers.hexlify(ethers.randomBytes(32)) + await factory.deploy(await module.getAddress(), hash) + const address = addressOf(await factory.getAddress(), await module.getAddress(), hash) + const wallet = await ModuleMock.attach(address) + const receipt = await (await wallet.ping()).wait() + + if (!receipt) { + throw new Error('No receipt') + } + + expect(wallet.interface.parseLog(receipt.logs[0])?.name).to.equal('Pong') + }) + + it('Should fail to deploy twice', async () => { + const hash = ethers.hexlify(ethers.randomBytes(32)) + await factory.deploy(await module.getAddress(), hash) + + const tx2 = factory.deploy(await module.getAddress(), hash) + await expectToBeRejected(tx2, `DeployFailed("${await module.getAddress()}", "${hash}")`) + }) + + it('Should fail to deploy with not enough gas', async () => { + const hash = ethers.hexlify(ethers.randomBytes(32)) + const tx = factory.deploy(await module.getAddress(), hash, { gasLimit: 80000 }) + await expectToBeRejected(tx, `DeployFailed("${await module.getAddress()}", "${hash}")`) + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/GasEstimation.spec.ts b/packages/wallet/wallet-contracts/test/GasEstimation.spec.ts new file mode 100644 index 000000000..850d6499e --- /dev/null +++ b/packages/wallet/wallet-contracts/test/GasEstimation.spec.ts @@ -0,0 +1,353 @@ +import { ethers } from 'ethers' +import { expect } from './utils' + +import { + CallReceiverMock, + ContractType, + deploySequenceContext, + GasEstimator, + GuestModule, + ModuleMock, + SequenceContext, + MainModuleGasEstimation, + MainModule +} from './utils/contracts' +import { applyTxDefaults, toSimplifiedConfig, Transaction } from './utils/sequence' +import { SequenceWallet } from './utils/wallet' + +function txBaseCost(data: ethers.BytesLike): number { + const bytes = ethers.getBytes(data) + return Number(bytes.reduce((p, c) => (c == 0 ? p + 4n : p + 16n), 0n) + 21000n) +} + +contract('Estimate gas usage', () => { + let context: SequenceContext + + let gasEstimator: ContractType + let callReceiver: ContractType + let guestModule: ContractType + let moduleMock: ContractType + + let wallet: SequenceWallet + + const bundleWithDeploy = async (txData: string) => { + return applyTxDefaults([ + { + target: await context.factory.getAddress(), + data: context.factory.interface.encodeFunctionData('deploy', [await context.mainModule.getAddress(), wallet.imageHash]) + }, + { + target: wallet.address, + data: txData + } + ]) + } + + const estimate = (address: string, data: ethers.BytesLike) => ({ + call: async () => { + return gasEstimator.estimate.staticCall(address, data) + } + }) + + const estimateGasUsage = async ( + txs: Partial[], + wallet: SequenceWallet, + deploy: boolean = false, + nonce: ethers.BigNumberish = 0 + ) => { + const stubSignature = await SequenceWallet.detailedWallet(context, { + threshold: wallet.config.threshold, + signers: toSimplifiedConfig(wallet.config).signers.map(() => ethers.Wallet.createRandom()) + }).signMessage(ethers.randomBytes(32)) + + const txData = wallet.mainModule.interface.encodeFunctionData('execute', [applyTxDefaults(txs), nonce, stubSignature]) + if (!deploy) { + const res = await estimate(wallet.address, txData).call() + return Number(res.gas + BigInt(txBaseCost(txData))) + } + + const guestModuleData = guestModule.interface.encodeFunctionData('execute', [ + await bundleWithDeploy(txData), + 0, + new Uint8Array([]) + ]) + const res = await estimate(await guestModule.getAddress(), guestModuleData).call() + return Number(res.gas + BigInt(txBaseCost(txData))) + } + + const gasUsedFor = async (tx: ethers.ContractTransactionResponse) => { + const receipt = await tx.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + return Number(BigInt(receipt.gasUsed)) + } + + before(async () => { + context = await deploySequenceContext() + + // Deploy MainModuleGasEstimation (hardhat doesn't support overwrites, so we use this as the real module) + context.mainModule = (await MainModuleGasEstimation.deploy()) as any as ContractType + + gasEstimator = await GasEstimator.deploy() + guestModule = await GuestModule.deploy() + moduleMock = await ModuleMock.deploy() + }) + + beforeEach(async () => { + wallet = SequenceWallet.basicWallet(context) + callReceiver = await CallReceiverMock.deploy() + }) + + describe('Estimate gas of transactions', () => { + describe('without wallet deployed', () => { + it('Should estimate wallet deployment', async () => { + wallet = SequenceWallet.basicWallet(context) + const factoryData = context.factory.interface.encodeFunctionData('deploy', [ + await context.mainModule.getAddress(), + wallet.imageHash + ]) + + const estimated = Number(BigInt((await estimate(await context.factory.getAddress(), factoryData).call()).gas)) + const realTx = await context.factory.deploy(await context.mainModule.getAddress(), wallet.imageHash) + expect(estimated + txBaseCost(factoryData)).to.approximately(await gasUsedFor(realTx), 5000) + }) + + it('Should estimate wallet deployment + upgrade', async () => { + const transactions = [ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImplementation', [await moduleMock.getAddress()]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet, true) + + const signature = await wallet.signTransactions(transactions, 0) + const executeTxData = await bundleWithDeploy( + wallet.mainModule.interface.encodeFunctionData('execute', [applyTxDefaults(transactions), 0, signature]) + ) + const realTx = await guestModule.execute(executeTxData, 0, new Uint8Array([])) + + expect(estimated).to.approximately(await gasUsedFor(realTx), 5000) + }) + + it('Should estimate wallet deployment + upgrade + transaction', async () => { + const transactions = [ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImplementation', [await moduleMock.getAddress()]) + }, + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(299))]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet, true) + + const signature = await wallet.signTransactions(transactions, 0) + const executeTxData = await bundleWithDeploy( + wallet.mainModule.interface.encodeFunctionData('execute', [applyTxDefaults(transactions), 0, signature]) + ) + const realTx = await guestModule.execute(executeTxData, 0, new Uint8Array([])) + + expect(estimated).to.approximately(await gasUsedFor(realTx), 5000) + + expect(await callReceiver.lastValA()).to.equal(1n) + }) + + it('Should estimate wallet deployment + upgrade + failed transaction', async () => { + await callReceiver.setRevertFlag(true) + + const transactions = [ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImplementation', [await moduleMock.getAddress()]) + }, + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(299))]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet, true) + + const signature = await wallet.signTransactions(transactions, 0) + const executeTxData = await bundleWithDeploy( + wallet.mainModule.interface.encodeFunctionData('execute', [applyTxDefaults(transactions), 0, signature]) + ) + const realTx = await guestModule.execute(executeTxData, 0, new Uint8Array([])) + + expect(estimated).to.approximately(await gasUsedFor(realTx), 5000) + }) + + it('Should estimate wallet deployment + upgrade + fixed gas transaction', async () => { + const transactions = [ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImplementation', [await moduleMock.getAddress()]) + }, + { + revertOnError: false, + gasLimit: 900000, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(299))]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet, true) + + const signature = await wallet.signTransactions(transactions, 0) + const executeTxData = await bundleWithDeploy( + wallet.mainModule.interface.encodeFunctionData('execute', [applyTxDefaults(transactions), 0, signature]) + ) + const realTx = await guestModule.execute(executeTxData, 0, new Uint8Array([])) + + expect(estimated).to.approximately(await gasUsedFor(realTx), 5000) + }) + }) + ;[ + { + name: 'single signer', + signers: 1 + }, + { + name: 'many signers', + signers: 32 + } + ].map(o => { + describe(`with wallet deployed and ${o.name}`, () => { + beforeEach(async () => { + wallet = SequenceWallet.basicWallet(context, { signing: o.signers }) + await wallet.deploy() + }) + + it('Should estimate single transaction', async () => { + const transactions = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(299))]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet) + const gasUsed = await wallet + .sendTransactions(transactions) + .then(t => t.wait()) + .then(r => Number(r?.gasUsed)) + + expect(estimated).to.approximately(gasUsed, 5000) + }) + + it('Should estimate multiple transactions', async () => { + const transactions = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(299))]) + }, + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(2299))]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet) + const gasUsed = await wallet + .sendTransactions(transactions) + .then(t => t.wait()) + .then(r => Number(r?.gasUsed)) + + // TODO: The estimator overEstimates the gas usage due to the gas refund + expect(gasUsed).to.be.below(estimated) + }) + + it('Should estimate multiple transactions with bad nonce', async () => { + const transactions = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(299))]) + }, + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(2299))]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet, false, 999999999) + const gasUsed = await wallet + .sendTransactions(transactions) + .then(t => t.wait()) + .then(r => Number(r?.gasUsed)) + + // TODO: The estimator overEstimates the gas usage due to the gas refund + expect(gasUsed).to.be.below(estimated) + }) + + it('Should estimate multiple transactions with failing transactions', async () => { + const altCallReceiver = await CallReceiverMock.deploy() + await altCallReceiver.setRevertFlag(true) + + const transactions = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(299))]) + }, + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(2299))]) + }, + { + revertOnError: false, + target: await altCallReceiver.getAddress(), + data: altCallReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(229))]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet) + const gasUsed = await wallet + .sendTransactions(transactions) + .then(t => t.wait()) + .then(r => Number(r?.gasUsed)) + + // TODO: The estimator overEstimates the gas usage due to the gas refund + expect(gasUsed).to.be.below(estimated) + }) + + it('Should estimate multiple transactions with failing transactions and fixed gas limits', async () => { + const altCallReceiver = await CallReceiverMock.deploy() + await altCallReceiver.setRevertFlag(true) + + const transactions = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(299))]) + }, + { + gasLimit: 90000, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(12))]) + }, + { + revertOnError: false, + target: await altCallReceiver.getAddress(), + data: altCallReceiver.interface.encodeFunctionData('testCall', [1, ethers.hexlify(ethers.randomBytes(229))]) + } + ] + + const estimated = await estimateGasUsage(transactions, wallet) + const gasUsed = await wallet + .sendTransactions(transactions) + .then(t => t.wait()) + .then(r => Number(r?.gasUsed)) + + // TODO: The estimator overEstimates the gas usage due to the gas refund + expect(gasUsed).to.be.below(estimated) + }) + }) + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/GuestModule.spec.ts b/packages/wallet/wallet-contracts/test/GuestModule.spec.ts new file mode 100644 index 000000000..7d466e381 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/GuestModule.spec.ts @@ -0,0 +1,98 @@ +import { expect, expectToBeRejected } from './utils' +import { ethers as hethers } from 'hardhat' +import { ethers } from 'ethers' +import { CallReceiverMock, ContractType, GuestModule, HookCallerMock, MainModule } from './utils/contracts' +import { applyTxDefaults, Transaction } from './utils/sequence' + +contract('GuestModule', () => { + let guestModule: ContractType + let callReceiver: ContractType + let hookCallerMock: ContractType + + describe('GuestModule wallet', () => { + before(async () => { + guestModule = await GuestModule.deploy() + callReceiver = await CallReceiverMock.deploy() + hookCallerMock = await HookCallerMock.deploy() + }) + + let valA: bigint + let valB: string + + let transactions: Transaction[] + + beforeEach(async () => { + valA = ethers.toBigInt(ethers.randomBytes(3)) + valB = ethers.hexlify(ethers.randomBytes(120)) + + transactions = applyTxDefaults([ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + ]) + }) + + it('Should accept transactions without signature', async () => { + await guestModule.execute(transactions, 0, new Uint8Array([])) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + it('Should accept transactions on selfExecute', async () => { + await guestModule.selfExecute(transactions) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + it('Should accept transactions with random signature', async () => { + const signature = ethers.randomBytes(96) + + await guestModule.execute(transactions, 0, signature) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + it('Should accept transactions with random nonce', async () => { + const nonce = 9123891 + + await guestModule.execute(transactions, nonce, new Uint8Array([])) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + it('Should revert on delegateCall transactions', async () => { + const transactions = applyTxDefaults([ + { + delegateCall: true + } + ]) + + const tx = guestModule.selfExecute(transactions) + await expectToBeRejected(tx, 'DelegateCallNotAllowed(0)') + }) + it('Should not accept ETH', async () => { + const signer = await hethers.provider.getSigner() + const tx = signer.sendTransaction({ value: 1, to: await guestModule.getAddress() }) + await expect(tx).to.be.rejected + }) + it('Should not implement hooks', async () => { + const tx = hookCallerMock.callERC1155Received(await guestModule.getAddress()) + await expect(tx).to.be.rejected + }) + it('Should not be upgradeable', async () => { + const mainModule = await MainModule.attach(await guestModule.getAddress()) + const newImageHash = ethers.hexlify(ethers.randomBytes(32)) + + const migrateBundle = applyTxDefaults([ + { + target: await mainModule.getAddress(), + data: mainModule.interface.encodeFunctionData('updateImageHash', [newImageHash]) + } + ]) + + const tx = guestModule.selfExecute(migrateBundle) + await expect(tx).to.be.rejected + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/LibBytes.spec.ts b/packages/wallet/wallet-contracts/test/LibBytes.spec.ts new file mode 100644 index 000000000..0212ccb8a --- /dev/null +++ b/packages/wallet/wallet-contracts/test/LibBytes.spec.ts @@ -0,0 +1,185 @@ +import { ethers } from 'ethers' + +import { expect, expectStaticToBeRejected, randomHex } from './utils' +import { ContractType, LibBytesImpl, LibBytesPointerImpl } from './utils/contracts' + +contract('LibBytes', () => { + let libBytes: ContractType + let libBytesPointer: ContractType + + before(async () => { + libBytes = await LibBytesImpl.deploy() + libBytesPointer = await LibBytesPointerImpl.deploy() + }) + + describe('readFirstUint16', () => { + it('Should read first uint16', async () => { + const res = await libBytesPointer.readFirstUint16('0x03021e4453120a') + expect(res[0]).to.equal(770n) + expect(res[1]).to.equal(2n) + }) + + it('Should read first uint16 of 2 byte array', async () => { + const res = await libBytesPointer.readFirstUint16('0xff0a') + expect(res[0]).to.equal(65290n) + expect(res[1]).to.equal(2n) + }) + + it('Should read first uint16 out of bounds', async () => { + const res = await libBytesPointer.readFirstUint16('0x') + expect(res[0]).to.equal(0n) + expect(res[1]).to.equal(2n) + }) + }) + + describe('readBytes32', () => { + let bytes32: string + beforeEach(async () => { + bytes32 = randomHex(32) + }) + it('Should read bytes32 at index zero', async () => { + const data = bytes32.concat(randomHex(16).slice(2)) + + const res = await libBytes.readBytes32(data, 0) + expect(res).to.equal(bytes32) + }) + it('Should read bytes32 at given index', async () => { + const data = randomHex(12).concat(bytes32.slice(2)).concat(randomHex(44).slice(2)) + + const res = await libBytes.readBytes32(data, 12) + expect(res).to.equal(bytes32) + }) + it('Should read bytes32 at last index', async () => { + const data = randomHex(11).concat(bytes32.slice(2)) + + const res = await libBytes.readBytes32(data, 11) + expect(res).to.equal(bytes32) + }) + it('Should read bytes32 out of bounds', async () => { + const data = randomHex(11).concat(bytes32.slice(2)) + const res = await libBytes.readBytes32(data, 12) + expect(res).to.equal('0x' + data.slice(26, 26 + 64) + '00') + }) + it('Should read bytes32 totally out of bounds', async () => { + const res = await libBytes.readBytes32('0x010203', 3145) + expect(res).to.equal(ethers.ZeroHash) + }) + }) + + describe('readUint32', () => { + it('Should read uint32 at index zero', async () => { + const res = await libBytes.readUint32('0x837fc8a10d', 0) + expect(res).to.equal(2206189729n) + }) + it('Should read uint32 at given index', async () => { + const res = await libBytes.readUint32('0x5a9c2a992a8c22199af0', 3) + expect(res).to.equal(2569702434n) + }) + it('Should read uint32 at last index', async () => { + const res = await libBytes.readUint32('0x029183af982299dfa001', 6) + expect(res).to.equal(2581569537n) + }) + it('Should read zeros uint32 out of bounds', async () => { + const res1 = await libBytes.readUint32('0x2293', 1) + const res2 = await libBytes.readUint32('0x2193000000', 1) + expect(res1).to.equal(2466250752n) + expect(res1).to.equal(res2) + }) + it('Should read all zeros uint32 fully out of bounds', async () => { + const res = await libBytes.readUint32('0xff92a09f339922', 15) + expect(res).to.equal(0n) + }) + }) + + describe('readUint16', () => { + it('Should read uint16 at index zero', async () => { + const res = await libBytesPointer.readUint16('0x5202', 0) + expect(res[0]).to.equal(20994n) + expect(res[1]).to.equal(2n) + }) + it('Should read uint16 at given index', async () => { + const res = await libBytesPointer.readUint16('0x5a9c2a1019d401d3', 3) + expect(res[0]).to.equal(4121n) + expect(res[1]).to.equal(5n) + }) + it('Should read uint16 at last index', async () => { + const res = await libBytesPointer.readUint16('0x020414', 1) + expect(res[0]).to.equal(1044n) + expect(res[1]).to.equal(3n) + }) + it('Should read zeros uint16 out of bounds', async () => { + const res1 = await libBytesPointer.readUint16('0x5a', 0) + const res2 = await libBytesPointer.readUint16('0x5a00', 0) + expect(res1[0]).to.equal(23040n) + expect(res1[0]).to.equal(res2[0]) + expect(res1[1]).to.equal(2n) + }) + it('Should read zeros uint16 fully out of bounds', async () => { + const res = await libBytesPointer.readUint16('0x5a9ca2', 12) + expect(res[0]).to.equal(0n) + expect(res[1]).to.equal(14n) + }) + }) + + describe('readUint24', () => { + it('Should read uint24 at index zero', async () => { + const res = await libBytesPointer.readUint24('0x5202fa', 0) + expect(res[0]).to.equal(5374714n) + expect(res[1]).to.equal(3n) + }) + it('Should read uint24 at given index', async () => { + const res = await libBytesPointer.readUint24('0x5202f7220c', 2) + expect(res[0]).to.equal(16196108n) + expect(res[1]).to.equal(5n) + }) + it('Should read uint24 at last index', async () => { + const res = await libBytesPointer.readUint24('0x021f2b00', 1) + expect(res[0]).to.equal(2042624n) + expect(res[1]).to.equal(4n) + }) + it('Should read zeros uint24 out of bounds', async () => { + const res1 = await libBytesPointer.readUint24('0xf598', 0) + const res2 = await libBytesPointer.readUint24('0xf59800', 0) + expect(res1[0]).to.equal(16095232n) + expect(res1[0]).to.equal(res2[0]) + expect(res1[1]).to.equal(3n) + }) + it('Should read zeros uint24 fully out of bounds', async () => { + const res = await libBytesPointer.readUint24('0x5a9ca221', 12) + expect(res[0]).to.equal(0n) + expect(res[1]).to.equal(15n) + }) + }) + + describe('readUint64', () => { + it('Should read uint64 at index zero', async () => { + const res = await libBytesPointer.readUint64('0xc1725050681dcb2a', 0) + expect(res[0]).to.equal(13939292102939495210n) + expect(res[1]).to.equal(8n) + }) + it('Should read uint64 at given index', async () => { + const res = await libBytesPointer.readUint64('0x0837acc1725050681dcb2a01cc', 3) + expect(res[0]).to.equal(13939292102939495210n) + expect(res[1]).to.equal(11n) + }) + it('Should read uint64 at last index', async () => { + const res = await libBytesPointer.readUint64('0x0837acc1725050681dcb2a', 3) + expect(res[0]).to.equal(13939292102939495210n) + expect(res[1]).to.equal(11n) + }) + it('Should read zeros uint64 out of bounds', async () => { + const res1 = await libBytesPointer.readUint64('0x5a', 0) + const res2 = await libBytesPointer.readUint64('0x5a00', 0) + const res3 = await libBytesPointer.readUint64('0x5a00000000000000', 0) + expect(res1[0]).to.equal(6485183463413514240n) + expect(res1[0]).to.equal(res2[0]) + expect(res1[0]).to.equal(res3[0]) + expect(res1[1]).to.equal(8n) + }) + it('Should read zeros uint64 fully out of bounds', async () => { + const res = await libBytesPointer.readUint64('0x5a9ca2', 12) + expect(res[0]).to.equal(0n) + expect(res[1]).to.equal(20n) + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/LibString.spec.ts b/packages/wallet/wallet-contracts/test/LibString.spec.ts new file mode 100644 index 000000000..7ca5f5c93 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/LibString.spec.ts @@ -0,0 +1,83 @@ +import { ethers } from 'ethers' + +import { expect, expectStaticToBeRejected, randomHex } from './utils' +import { ContractType, LibStringImp } from './utils/contracts' + +contract('LibString', () => { + let libString: ContractType + + before(async () => { + libString = await LibStringImp.deploy() + }) + + describe('bytesToHexadecimal', () => { + new Array(99).fill(0).map((_, i) => { + it(`Should convert ${i} bytes to hexadecimal`, async () => { + const bytes = randomHex(i) + const expected = ethers.hexlify(bytes) + const result = await libString.bytesToHexadecimal(bytes) + expect(result).to.eq(expected.slice(2)) + + const prefixed = await libString.prefixHexadecimal(result) + expect(prefixed).to.eq(expected) + }) + }) + }) + + describe('bytesToBase32', () => { + ;[ + ['0x', 'b'], + ['0x69', 'bne'], + ['0x8775', 'bq52q'], + ['0x91e0f3', 'bshqpg'], + ['0x4867e789', 'bjbt6pci'], + ['0x456fe65b8d', 'bivx6mw4n'], + ['0xb20b0f525320', 'bwifq6ustea'], + ['0xd292f6c85f4e5a', 'b2kjpnsc7jzna'], + ['0xf78beb02b622adc7', 'b66f6wavwekw4o'], + ['0xfad9c9851352f0ae0e', 'b7lm4tbitklyk4dq'], + ['0x30b4bca5f67cc95312be', 'bgc2lzjpwptevgev6'], + ['0xebc9fd66e4ae84644d502b', 'b5pe72zxev2cgitkqfm'], + ['0x0f198dc28836e24782e8d182', 'bb4my3quig3repaxi2gba'], + ['0x50059d23099f062187e9d52d8a', 'bkacz2iyjt4dcdb7j2uwyu'], + ['0x4c0e454dc43d303c896ef5f9c449', 'bjqhektoehuydzclo6x44isi'], + ['0x1ee41f4e940e4bf14df57a4fc06dd9', 'bd3sb6tuubzf7ctpvpjh4a3oz'], + ['0x04a8d211d53b45d29fed9a624bb2d5e0', 'basuneeovhnc5fh7ntjrexmwv4a'], + ['0x0a8b878364cdd555bda61db7c67503bb5e', 'bbkfypa3ezxkvlpngdw34m5idxnpa'], + ['0x313b3c6e446ee6eb6477c0b0b01b70799cb6', 'bge5ty3sen3towzdxycylag3qpgolm'], + ['0xe8be4a44970232babf052c3e75f611df8099c5', 'b5c7eurexaizlvpyffq7hl5qr36ajtri'], + ['0x461eb18d034475a35d4084a89e0e3a47980f3408', 'biyplddidir22gxkaqsuj4dr2i6ma6nai'], + ['0x519e139092a60229fe1a4db06d26fd199af9d39680', 'bkgpbheesuybct7q2jwyg2jx5dgnptu4wqa'], + ['0x0fdd1a5696148daf6986505e2b3dc9af16ed91452720', 'bb7oruvuwcsg262mgkbpcwpojv4lo3ekfe4qa'], + ['0x63a77d886c3f6593b6c6d37c7ab1f16ca3e34bd67e1ae1', 'bmotx3cdmh5szhnwg2n6hvmprnsr6gs6wpynoc'], + ['0x1198cc96b431176fc2d5bc8a8c49ce041e184649ec3b9cbb', 'bcgmmzfvugelw7qwvxsfiysooaqpbqrsj5q5zzoy'], + ['0x6b8d9af44a31c799ef835a522f8b630435c8e77e844360ad3d', 'bnogzv5ckghdzt34dljjc7c3daq24rz36qrbwblj5'], + ['0xbb2cb7057a24b8588bafd87907ee7579b159027dc7224a3f6540', 'bxmwlobl2es4frc5p3b4qp3tvpgyvsat5y4reup3fia'], + ['0x1f64b537d0e4b0158142dfa7cbfd9af76af0931862e48df02ba35b', 'bd5slkn6q4syblakc36t4x7m265vpbeyymlsi34blunnq'], + ['0x11c5655f9d5496039fe6b1a9651014d4a19e62331d61e73b48fec776', 'bchcwkx45kslahh7gwguwkeau2sqz4yrtdvq6oo2i73dxm'], + ['0x752c3c5cb4a3f06e4feff3f543278e97c7626569994b12b0d9ba9c7c83', 'bouwdyxfuupyg4t7p6p2ugj4os7dwezljtffrfmgzxkohzay'], + ['0xb6bd83f8bba80bc8aca3706f7090cd5a0f0cc6adf4e89614bff58c149880', 'bw26yh6f3vaf4rlfdobxxbegnlihqzrvn6tujmff76wgbjgea'], + ['0x90f4b198a1a1b2d3e01c36ba3460f46249f180dfa67b152f81552266a18708', 'bsd2ldgfbugznhya4g25diyhumje7dag7uz5rkl4bkurgnimhba'], + [ + '0x24cda83efac2802425b1c35a2d21b01576e71d0e512bcc80840f85f9e0af2faa', + 'betg2qpx2ykacijnrynnc2inqcv3oohiokev4zaeeb6c7tyfpf6va' + ], + [ + '0x169dc221f4cec8756de592c3205a23177867f18c383d2251bd1a5c03cc346c3fe8', + 'bc2o4eipuz3ehk3pfslbsawrdc54gp4mmha6seun5djoahtbunq76q' + ], + [ + '0x65b13b1aef3e44180314108b7f0434ddc23ad740a0df4df7984ad0bf1fdd84edcbaf', + 'bmwytwgxphzcbqayuccfx6bbu3xbdvv2audpu354yjlil6h65qtw4xly' + ] + ].map(([bytes, base32Encoded]) => { + it(`Should convert ${ethers.getBytes(bytes).length} bytes to base32`, async () => { + const result = await libString.bytesToBase32(bytes) + expect(result).to.equal(base32Encoded.slice(1)) + + const prefixed = await libString.prefixBase32(result) + expect(prefixed).to.equal(base32Encoded) + }) + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/MainModule.bench.ts b/packages/wallet/wallet-contracts/test/MainModule.bench.ts new file mode 100644 index 000000000..bf192462d --- /dev/null +++ b/packages/wallet/wallet-contracts/test/MainModule.bench.ts @@ -0,0 +1,198 @@ +import { ethers } from 'ethers' + +import { deploySequenceContext, SequenceContext } from './utils/contracts' +import { SequenceWallet } from './utils/wallet' +import { Transaction } from './utils/sequence' + +const optimalGasLimit = 2n ** 22n +const runs = 256 + +function report2(values: ethers.BigNumberish[]) { + const bns = values.map(v => BigInt(v)) + + const min = bns.reduce((a, b) => (a < b ? a : b)) + const max = bns.reduce((a, b) => (a > b ? a : b)) + const avg = bns.reduce((p, n) => (p + n) / BigInt(values.length)) + + return { min, max, avg } +} + +function report(test: string, values: ethers.BigNumberish[]) { + const { min, max, avg } = report2(values) + console.info(` -> ${test} runs: ${values.length} cost min: ${min.toString()} max: ${max.toString()} avg: ${avg.toString()}`) +} + +contract('MainModule', () => { + let context: SequenceContext + + before(async () => { + context = await deploySequenceContext() + }) + + if (process.env.BENCHMARK) { + describe.only('Benchmark', function () { + ;(this as any).timeout(0) + + it('Deploy a wallet', async () => { + const results: ethers.BigNumberish[] = [] + + for (let i = 0; i < runs; i++) { + const tx = await SequenceWallet.basicWallet(context).deploy() + const receipt = await tx?.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + results.push(receipt.gasUsed) + } + + report('deploy wallets', results) + }) + + it('Relay 1/1 transaction', async () => { + const results: ethers.BigNumberish[] = [] + + for (let i = 0; i < runs; i++) { + const wallet = SequenceWallet.basicWallet(context) + await wallet.deploy() + const tx = await wallet.sendTransactions([{}]) + const receipt = await tx.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + results.push(receipt.gasUsed) + } + + report('relay 1/1 transaction', results) + }) + + const batches = [2, 3, 5, 10, 50, 100] + batches.forEach(n => { + it(`Relay 1/1 ${n} transactions`, async () => { + const results: ethers.BigNumberish[] = [] + + const transactions = new Array(n).fill(0).map(() => ({ + delegateCall: false, + revertOnError: true, + gasLimit: optimalGasLimit, + target: ethers.ZeroAddress, + value: 0n, + data: '0x0000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12e0000000000000000000000007109709ecfa91a80626ff3989d68f67f5b1dd12e' + })) + + for (let i = 0; i < runs; i++) { + const wallet = SequenceWallet.basicWallet(context) + await wallet.deploy() + const tx = await wallet.sendTransactions(transactions) + const receipt = await tx.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + results.push(receipt.gasUsed) + } + + report(`relay 1/1 ${n} transactions`, results) + }) + }) + + batches.forEach(n => { + const ntxs = Math.floor(n / 2) + const nfailing = n - ntxs + it(`Relay 1/1 ${ntxs} transactions and ${nfailing} failing transactions`, async () => { + const results: ethers.BigNumberish[] = [] + + const transactions: Transaction[] = new Array(ntxs) + .fill(0) + .map(() => ({ + delegateCall: false, + revertOnError: true, + gasLimit: optimalGasLimit, + target: ethers.ZeroAddress, + value: 0n, + data: new Uint8Array([]) + })) + .concat( + await Promise.all( + new Array(nfailing).fill(0).map(async () => ({ + delegateCall: false, + revertOnError: false, + gasLimit: optimalGasLimit, + target: await context.factory.getAddress(), + value: 0n, + data: new Uint8Array([]) + })) + ) + ) + + for (let i = 0; i < runs; i++) { + const wallet = SequenceWallet.basicWallet(context) + await wallet.deploy() + const tx = await wallet.sendTransactions(transactions) + const receipt = await tx.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + results.push(receipt.gasUsed) + } + + report(`relay 1/1 ${ntxs} transactions and ${nfailing} failing transactions`, results) + }) + }) + + const transaction: Transaction = { + delegateCall: false, + revertOnError: true, + gasLimit: optimalGasLimit, + target: ethers.ZeroAddress, + value: 0n, + data: new Uint8Array([]) + } + + it('Relay 2/5 transaction', async () => { + const results: ethers.BigNumberish[] = [] + + for (let i = 0; i < runs; i++) { + const wallet = SequenceWallet.basicWallet(context, { signing: [3, 1], idle: [1, 1, 3], threshold: 4 }) + await wallet.deploy() + const tx = await wallet.sendTransactions([transaction]) + const receipt = await tx.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + results.push(receipt.gasUsed) + } + + report('relay 2/5 transaction', results) + }) + + it('Relay 255/255 transaction', async () => { + const results: ethers.BigNumberish[] = [] + + for (let i = 0; i < runs; i++) { + const wallet = SequenceWallet.basicWallet(context, { signing: 255, idle: 0, threshold: 255 }) + await wallet.deploy() + + const tx = await wallet.sendTransactions([transaction], undefined, { gasLimit: 60000000 }) + const receipt = await tx.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + results.push(receipt.gasUsed) + } + + report('relay 255/255 transaction', results) + }) + }) + } +}) diff --git a/packages/wallet/wallet-contracts/test/MainModule.spec.ts b/packages/wallet/wallet-contracts/test/MainModule.spec.ts new file mode 100644 index 000000000..b6204f9fc --- /dev/null +++ b/packages/wallet/wallet-contracts/test/MainModule.spec.ts @@ -0,0 +1,2247 @@ +import { ethers } from 'ethers' +import { ethers as hethers } from 'hardhat' + +import { bytes32toAddress, getChainId, expect, expectToBeRejected, randomHex, getSigHash } from './utils' + +import { + CallReceiverMock, + ContractType, + deploySequenceContext, + ModuleMock, + SequenceContext, + DelegateCallMock, + HookMock, + HookCallerMock, + GasBurnerMock, + AlwaysRevertMock +} from './utils/contracts' +import { Imposter } from './utils/imposter' +import { + applyTxDefaults, + computeStorageKey, + digestOf, + encodeNonce, + leavesOf, + legacyTopology, + merkleTopology, + optimize2SignersTopology, + printTopology, + SignatureType, + SimplifiedWalletConfig, + subdigestOf, + toSimplifiedConfig, + WalletConfig +} from './utils/sequence' +import { SequenceWallet, StaticSigner } from './utils/wallet' + +contract('MainModule', (accounts: string[]) => { + let context: SequenceContext + let callReceiver: ContractType + + let wallet: SequenceWallet + + before(async () => { + context = await deploySequenceContext() + }) + + beforeEach(async () => { + callReceiver = await CallReceiverMock.deploy() + await callReceiver.waitForDeployment() + + wallet = SequenceWallet.basicWallet(context) + await wallet.deploy() + }) + + describe('Nested signatures', () => { + it('Should accept simple nested signed ERC1271 message', async () => { + // Wallet A + const wallet_a = SequenceWallet.basicWallet(context) + await wallet_a.deploy() + + wallet = SequenceWallet.detailedWallet(context, { threshold: 1, signers: [wallet_a] }) + await wallet.deploy() + + const message = randomHex(32) + const signature = await wallet.signMessage(message) + + const hookCaller = await HookCallerMock.deploy() + await hookCaller.callERC1271isValidSignatureData(wallet.address, message, signature) + }) + + it('Should accept simple nested signer', async () => { + // Wallet A + const wallet_a = SequenceWallet.basicWallet(context) + await wallet_a.deploy() + + wallet = SequenceWallet.detailedWallet(context, { threshold: 1, signers: [wallet_a] }) + await wallet.deploy() + + const valA = 4123222n + const valB = randomHex(99) + + const transaction = { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + + await wallet.sendTransactions([transaction]) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + + it('Should accept two nested signers', async () => { + // WalletA + const wallet_a = SequenceWallet.basicWallet(context) + await wallet_a.deploy() + + // WalletB + const wallet_b = SequenceWallet.basicWallet(context) + await wallet_b.deploy() + + // Top level wallet + wallet = SequenceWallet.detailedWallet(context, { threshold: 1, signers: [wallet_a, wallet_b] }) + await wallet.deploy() + + const valA = 4123222n + const valB = randomHex(99) + + const transaction = { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + + await wallet.sendTransactions([transaction]) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + + it('Should accept mixed nested and eoa signers', async () => { + // WalletA + const wallet_a = SequenceWallet.basicWallet(context) + await wallet_a.deploy() + + // EOA (B) + const singer_b = ethers.Wallet.createRandom() + + // Top level wallet + wallet = SequenceWallet.detailedWallet(context, { threshold: 1, signers: [wallet_a, singer_b] }) + await wallet.deploy() + + const valA = 4123222n + const valB = randomHex(99) + + const transaction = { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + + await wallet.sendTransactions([transaction]) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + ;[ + { + name: '2 nested sequence wallets', + childs: 1, + depth: 2 + }, + { + name: '64 nested sequence wallets', + childs: 1, + depth: 64 + }, + { + name: '97 nested sequence wallets', + childs: 1, + depth: 97 + }, + { + name: 'binary tree of sequence wallets', + childs: 2, + depth: 5 + }, + { + name: 'ternary tree of sequence wallets', + childs: 3, + depth: 4 + }, + { + name: 'hexary tree of sequence wallets', + childs: 16, + depth: 2 + }, + { + name: 'random tree of sequence wallets (depth 1)', + depth: 1 + }, + { + name: 'random tree of sequence wallets (depth 2)', + depth: 2 + }, + { + name: 'random tree of sequence wallets (depth 3)', + depth: 3 + }, + { + name: 'random tree of sequence wallets (depth 4)', + depth: 4 + } + ].map(c => { + it(`Should handle ${c.name}`, async () => { + const genWallet = async ( + depth: number, + numChilds: number | undefined, + max: number + ): Promise => { + if (depth === max) { + return ethers.Wallet.createRandom() + } + + const nchilds = numChilds || Math.floor(Math.random() * 5) + 1 + const childs = await Promise.all(new Array(nchilds).fill(0).map(async () => genWallet(depth + 1, nchilds, max))) + const wallet = SequenceWallet.detailedWallet(context, { threshold: childs.length, signers: childs }) + await wallet.deploy() + + return wallet + } + + wallet = (await genWallet(0, c.childs, c.depth)) as SequenceWallet + + const valA = 5423n + const valB = randomHex(120) + + const transaction = { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + + await wallet.sendTransactions([transaction], undefined, { gasLimit: 50000000 }) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + }) + + it('Should reject invalid nested signature', async () => { + const wallet_a = SequenceWallet.basicWallet(context) + await wallet_a.deploy() + + let wallet_b = SequenceWallet.basicWallet(context) + await wallet_b.deploy() + + wallet = SequenceWallet.detailedWallet(context, { threshold: 1, signers: [wallet_a, wallet_b] }) + await wallet.deploy() + + const imposter = Imposter.random(wallet_b.signers[0] as StaticSigner) + wallet_b = wallet_b.useSigners([imposter]) + wallet = wallet.useSigners([wallet_a, wallet_b]) + + const transaction = { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [5423, randomHex(32)]) + } + + const subdigest = await subdigestOf(wallet.address, digestOf([transaction], await wallet.getNonce())) + const badNestedSignature = await wallet_b.signDigest(subdigest).then(s => s + '03') + + const tx = wallet.sendTransactions([transaction]) + await expectToBeRejected(tx, `InvalidNestedSignature("${subdigest}", "${wallet_b.address}", "${badNestedSignature}")`) + }) + + it('Should enforce threshold on nested sigantures', async () => { + const wallet_a = SequenceWallet.basicWallet(context) + await wallet_a.deploy() + + let wallet_b = SequenceWallet.basicWallet(context) + await wallet_b.deploy() + + wallet = SequenceWallet.detailedWallet(context, { threshold: 3, signers: [wallet_a, wallet_b] }) + await wallet.deploy() + + const signauture = await wallet.signTransactions([{}]) + const subdigest = await subdigestOf(wallet.address, digestOf([{}], await wallet.getNonce())) + + const tx = wallet.relayTransactions([{}], signauture) + await expect(tx).to.be.rejected + }) + + it('Should read weight of nested wallets', async () => { + const wallet_a = SequenceWallet.basicWallet(context) + await wallet_a.deploy() + + const wallet_b = SequenceWallet.basicWallet(context) + await wallet_b.deploy() + + const wallet_c = SequenceWallet.basicWallet(context) + await wallet_c.deploy() + + wallet = SequenceWallet.detailedWallet(context, { + threshold: 2, + signers: [wallet_a, wallet_b, { weight: 2, value: wallet_c }] + }) + await wallet.deploy() + + const valA = 5423n + const valB = randomHex(120) + + const transaction = { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + + await wallet.useSigners(wallet_c).sendTransactions([transaction]) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + }) + + describe('Authentication', () => { + it('Should accept initial owner signature', async () => { + await wallet.sendTransactions([{}]) + }) + + it('Should reject non-owner signature', async () => { + const tx = wallet.useSigners(Imposter.random(wallet.signers[0] as StaticSigner)).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + describe('Network ID', () => { + it('Should reject a transaction of another network id', async () => { + wallet = wallet.useChainId((await getChainId()) + 1n) + const tx = wallet.sendTransactions([{}]) + await expectToBeRejected(tx, 'InvalidSignature') + }) + + describe('Universal network signatures', async () => { + it('Should reject signature for another network id, even if encoded as universal', async () => { + wallet = wallet.useChainId((await getChainId()) + 1n) + const tx = wallet.sendTransactions([{}]) + await expectToBeRejected(tx, 'InvalidSignature') + }) + + it('Should reject signature with chainId zero if not using special encoding', async () => { + wallet = wallet.useChainId(0) + const tx = wallet.sendTransactions([{}]) + await expectToBeRejected(tx, 'InvalidSignature') + }) + + it('Should accept transaction with chainId zero if encoded with no chaind type', async () => { + wallet = wallet.useChainId(0).useEncodingOptions({ signatureType: SignatureType.NoChaindDynamic }) + await wallet.sendTransactions([{}]) + }) + }) + }) + + describe('Nonce', () => { + const spaces = [0n, 1n, 7342n, ethers.toBigInt(ethers.randomBytes(20)), 2n ** 160n - 1n] + + describe('Using non-encoded nonce', () => { + it('Should default to space zero', async () => { + await wallet.sendTransactions([{}]) + expect(await wallet.mainModule.nonce()).to.equal(1n) + }) + + it('Should work with zero as initial nonce', async () => { + await wallet.sendTransactions([{}]) + expect(await wallet.mainModule.readNonce(0)).to.equal(1n) + }) + + it('Should emit NonceChange event', async () => { + const receipt1 = await wallet.sendTransactions([{}]).then(t => t.wait()) + const receipt2 = await wallet.sendTransactions([{}]).then(t => t.wait()) + + if (!receipt1 || !receipt2) { + throw new Error('No receipt') + } + + const events1 = receipt1.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const ev1 = events1.find(ev => ev.eventName === 'NonceChange') + expect(ev1!.eventName).to.be.eql('NonceChange') + expect(ev1!.args._space).to.equal(0n) + expect(ev1!.args._newNonce).to.equal(1n) + + const events2 = receipt2.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const ev2 = events2.find(ev => ev.eventName === 'NonceChange') + expect(ev2!.eventName).to.be.eql('NonceChange') + expect(ev1!.args._space).to.equal(0n) + expect(ev2!.args._newNonce).to.equal(2n) + }) + + it('Should fail if nonce did not change', async () => { + await wallet.sendTransactions([{}], 0) + const tx = wallet.sendTransactions([{}], 0) + await expectToBeRejected(tx, `BadNonce(0, 0, 1)`) + }) + + it('Should fail if nonce increased by two', async () => { + await wallet.sendTransactions([{}]) + const tx = wallet.sendTransactions([{}], 2) + await expectToBeRejected(tx, `BadNonce(0, 2, 1)`) + }) + }) + + spaces.forEach(space => { + describe(`using ${ethers.toBeHex(space)} space`, () => { + it('Should work with zero as initial nonce', async () => { + await wallet.sendTransactions([{}], encodeNonce(space, 0)) + expect(await wallet.mainModule.readNonce(space)).to.equal(1n) + }) + + it('Should emit NonceChange event', async () => { + const receipt1 = await wallet.sendTransactions([{}], encodeNonce(space, 0)).then(t => t.wait()) + const receipt2 = await wallet.sendTransactions([{}], encodeNonce(space, 1)).then(t => t.wait()) + + if (!receipt1 || !receipt2) { + throw new Error('No receipt') + } + + const events1 = receipt1.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const ev1 = events1.find(ev => ev.eventName === 'NonceChange') + expect(ev1!.eventName).to.be.eql('NonceChange') + expect(ev1!.args!._space).to.equal(space) + expect(ev1!.args!._newNonce).to.equal(1n) + + const events2 = receipt2.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const ev2 = events2.find(ev => ev.eventName === 'NonceChange') + expect(ev2!.eventName).to.be.eql('NonceChange') + expect(ev2!.args!._space).to.equal(space) + expect(ev2!.args!._newNonce).to.equal(2n) + }) + + it('Should accept next nonce', async () => { + await wallet.sendTransactions([{}], encodeNonce(space, 0)) + await wallet.sendTransactions([{}], encodeNonce(space, 1)) + + expect(await wallet.mainModule.readNonce(space)).to.equal(2n) + }) + + it('Should fail if nonce did not change', async () => { + await wallet.sendTransactions([{}], encodeNonce(space, 0)) + const tx = wallet.sendTransactions([{}], encodeNonce(space, 0)) + + await expectToBeRejected(tx, `BadNonce(${space.toString()}, 0, 1)`) + }) + + it('Should fail if nonce increased by two', async () => { + await wallet.sendTransactions([{}], encodeNonce(space, 0)) + const tx = wallet.sendTransactions([{}], encodeNonce(space, 2)) + + await expectToBeRejected(tx, `BadNonce(${space.toString()}, 2, 1)`) + }) + + it('Should use nonces storage keys', async () => { + const subkey = ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [space]) + const storageKey = computeStorageKey('org.arcadeum.module.calls.nonce', subkey) + + await wallet.sendTransactions([{}], encodeNonce(space, 0)) + + const storageValue = await hethers.provider.getStorage(wallet.address, storageKey) + expect(BigInt(storageValue)).to.equal(1n) + }) + }) + }) + + describe('using two spaces simultaneously', () => { + it('Should keep separated nonce counts', async () => { + await wallet.sendTransactions([{}], encodeNonce(1, 0)) + + expect(await wallet.mainModule.readNonce(1)).to.equal(1n) + expect(await wallet.mainModule.readNonce(2)).to.equal(0n) + + await wallet.sendTransactions([{}], encodeNonce(2, 0)) + + expect(await wallet.mainModule.readNonce(1)).to.equal(1n) + expect(await wallet.mainModule.readNonce(2)).to.equal(1n) + await wallet.sendTransactions([{}], encodeNonce(2, 1)) + await wallet.sendTransactions([{}], encodeNonce(2, 2)) + + expect(await wallet.mainModule.readNonce(1)).to.equal(1n) + expect(await wallet.mainModule.readNonce(2)).to.equal(3n) + }) + + it('Should emit different events', async () => { + await wallet.sendTransactions([{}], encodeNonce(1, 0)) + await wallet.sendTransactions([{}], encodeNonce(1, 1)) + + const receipt1 = await wallet.sendTransactions([{}], encodeNonce(1, 2)).then(t => t.wait()) + const receipt2 = await wallet.sendTransactions([{}], encodeNonce(2, 0)).then(t => t.wait()) + + if (!receipt1 || !receipt2) { + throw new Error('No receipt') + } + + const events1 = receipt1.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const ev1 = events1.find(ev => ev.eventName === 'NonceChange') + expect(ev1!.eventName).to.be.eql('NonceChange') + expect(ev1!.args!._space).to.equal(1n) + expect(ev1!.args!._newNonce).to.equal(3n) + + const events2 = receipt2.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const ev2 = events2.find(ev => ev.eventName === 'NonceChange') + expect(ev2!.eventName).to.be.eql('NonceChange') + expect(ev2!.args!._space).to.equal(2n) + expect(ev2!.args!._newNonce).to.equal(1n) + }) + + it('Should not accept nonce of different space', async () => { + await wallet.sendTransactions([{}], encodeNonce(1, 0)) + const tx = wallet.sendTransactions([{}], encodeNonce(2, 1)) + await expectToBeRejected(tx, `BadNonce(2, 1, 0)`) + }) + }) + }) + + it('Should reject signature with invalid flag', async () => { + const tx = wallet.relayTransactions([{}], '0x000193812833ff01') + await expectToBeRejected(tx, 'InvalidSignatureFlag(255)') + }) + + it('Should reject signature with bad encoding type', async () => { + const tx = wallet.relayTransactions([{}], '0x2012') + const subdigest = await subdigestOf(wallet.address, digestOf([{}], 0)) + await expectToBeRejected(tx, `InvalidSignatureType("0x20")`) + }) + + it('Should reject direct calls to templates', async () => { + const tx1 = context.mainModule.execute([], 0, '0x') + await expectToBeRejected(tx1, 'OnlyDelegatecall') + + const tx2 = context.mainModuleUpgradable.execute([], 0, '0x') + await expectToBeRejected(tx2, 'OnlyDelegatecall') + }) + + it('Should reject empty dynamic signature', async () => { + const tx = wallet.relayTransactions([{}], '0x0001000000000201ABFf4013541fd79ee5b6847C9dF3C9B34183C283000000') + await expectToBeRejected(tx, 'EmptySignature()') + }) + }) + + describe('Upgradeability', () => { + it('Should update implementation', async () => { + const newImplementation = await ModuleMock.deploy() + + const transaction = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImplementation', [await newImplementation.getAddress()]) + } + + await wallet.sendTransactions([transaction]) + + const mock_wallet = ModuleMock.attach(wallet.address) + const tx = await mock_wallet.ping() + const receipt = await tx.wait() + + const events = receipt!.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + + expect(events![0].eventName).to.equal('Pong') + }) + it('Should fail to set implementation to address 0', async () => { + const transaction = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImplementation', [ethers.ZeroAddress]) + } + + const tx = wallet.sendTransactions([transaction]) + await expectToBeRejected(tx, `InvalidImplementation("${ethers.ZeroAddress}")`) + }) + it('Should fail to set implementation to non-contract', async () => { + const transaction = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImplementation', [accounts[1]]) + } + + const tx = wallet.sendTransactions([transaction]) + await expectToBeRejected(tx, `InvalidImplementation("${accounts[1]}")`) + }) + it('Should use implementation storage key', async () => { + await wallet.updateImageHash(ethers.randomBytes(32)) + + const storageValue = await hethers.provider.getStorage(wallet.address, wallet.address) + expect(bytes32toAddress(storageValue)).to.equal(await context.mainModuleUpgradable.getAddress()) + }) + }) + + describe('Extra image hashes', () => { + ;[ + { + name: 'using MainModule', + beforeEach: () => {} + }, + { + name: 'using MainModuleUpgradable', + beforeEach: async () => { + const newConfig = SequenceWallet.basicWallet(context) + await wallet.updateImageHash(newConfig.imageHash) + wallet = wallet.useAddress().useConfig(newConfig.config).useSigners(newConfig.signers) + } + } + ].map(c => { + describe(c.name, () => { + beforeEach(c.beforeEach) + + it('Should accept signatures from multiple imageHashes', async () => { + const altWallet = SequenceWallet.basicWallet(context, { signing: 3, idle: 9 }) + + await wallet.deploy() + await wallet.addExtraImageHash(altWallet.imageHash) + + wallet.sendTransactions([{}], encodeNonce(1, 0)) + + expect(await wallet.mainModule.extraImageHash(altWallet.imageHash)).to.not.equal(0) + + wallet = wallet + .useAddress() + .useConfig({ ...altWallet.config, address: undefined }) + .useSigners(altWallet.signers) + + await wallet.sendTransactions([{}]) + }) + + it('Should reject expired extra imgeHash', async () => { + const altWallet = SequenceWallet.basicWallet(context, { signing: 3, idle: 9 }) + await wallet.deploy() + await wallet.addExtraImageHash(altWallet.imageHash, 100) + + const badWallet1 = wallet + .useAddress() + .useConfig({ ...altWallet.config, address: undefined }) + .useSigners(altWallet.signers) + + const tx = badWallet1.sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should clear multiple extra imageHashes', async () => { + const altWallet1 = SequenceWallet.basicWallet(context, { signing: 3, idle: 9 }) + const altWallet2 = SequenceWallet.basicWallet(context) + + await wallet.deploy() + await wallet.addExtraImageHash(altWallet1.imageHash) + await wallet.addExtraImageHash(altWallet2.imageHash) + + expect(await wallet.mainModule.extraImageHash(altWallet1.imageHash)).to.not.equal(0) + expect(await wallet.mainModule.extraImageHash(altWallet2.imageHash)).to.not.equal(0) + + await wallet.clearExtraImageHashes([altWallet1.imageHash, altWallet2.imageHash]) + + const badWallet1 = wallet + .useAddress() + .useConfig({ ...altWallet1.config, address: undefined }) + .useSigners(altWallet1.signers) + + const badWallet2 = wallet + .useAddress() + .useConfig({ ...altWallet1.config, address: undefined }) + .useSigners(altWallet1.signers) + + expect(await wallet.mainModule.extraImageHash(altWallet1.imageHash)).to.equal(0n) + expect(await wallet.mainModule.extraImageHash(altWallet2.imageHash)).to.equal(0n) + + await expect(badWallet1.sendTransactions([{}])).to.be.rejected + await expect(badWallet2.sendTransactions([{}])).to.be.rejected + await expect(wallet.sendTransactions([{}])).to.be.fulfilled + }) + + it('Should fail to set extra imageHashes if not from self', async () => { + const altWallet = SequenceWallet.basicWallet(context) + const tx = wallet.mainModule.setExtraImageHash(altWallet.imageHash, Math.floor(Date.now() / 1000) + 1000) + await expectToBeRejected(tx, `OnlySelfAuth("${accounts[0]}", "${wallet.address}")`) + }) + + it('Should fail to clear extra imageHashes if not from self', async () => { + const tx = wallet.mainModule.clearExtraImageHashes([]) + await expectToBeRejected(tx, `OnlySelfAuth("${accounts[0]}", "${wallet.address}")`) + }) + }) + }) + }) + + describe('Static merkle digests', () => { + ;[ + { + name: 'using MainModule', + beforeEach: () => {} + }, + { + name: 'using MainModuleUpgradable', + beforeEach: async () => { + const newConfig = SequenceWallet.basicWallet(context) + await wallet.updateImageHash(newConfig.imageHash) + wallet = wallet.useAddress().useConfig(newConfig.config).useSigners(newConfig.signers) + } + } + ].map(c => { + describe(c.name, () => { + it('Should reject proof for another subdigest', async () => { + const digests = new Array(2).fill(0).map(() => ethers.hexlify(ethers.randomBytes(32))) + const subdigests = await Promise.all(digests.map(async d => ({ subdigest: await subdigestOf(wallet.address, d, 0) }))) + const subdigestsMerkle = merkleTopology([...subdigests]) + + const prevLeaves = leavesOf(wallet.config.topology) + const newMerkle = merkleTopology([subdigestsMerkle, ...prevLeaves]) + const newConfig = { threshold: wallet.config.threshold, topology: newMerkle, checkpoint: Math.floor(Date.now() / 1000) } + + await wallet.deploy() + await wallet.updateImageHash(newConfig) + wallet = wallet.useAddress(wallet.address).useConfig(newConfig) + + await wallet.sendTransactions([]) + + const subdigest = ethers.hexlify(subdigests[0].subdigest) + const encoded = wallet.staticSubdigestSign(subdigest) + const res = await wallet.mainModule['isValidSignature(bytes32,bytes)'](digests[1], encoded) + expect(res).to.equal('0x00000000') + }) + + it('Should accept merkle proof', async () => { + wallet = SequenceWallet.basicWallet(context, { signing: 10, idle: 11 }) + + const digests = new Array(33).fill(0).map(() => ethers.hexlify(ethers.randomBytes(32))) + const subdigests = await Promise.all(digests.map(async d => ({ subdigest: await subdigestOf(wallet.address, d, 0) }))) + const subdigestsMerkle = merkleTopology([...subdigests]) + + const prevLeaves = leavesOf(wallet.config.topology) + const newMerkle = merkleTopology([subdigestsMerkle, ...prevLeaves]) + const newConfig = { threshold: wallet.config.threshold, topology: newMerkle, checkpoint: Math.floor(Date.now() / 1000) } + + await wallet.deploy() + await wallet.updateImageHash(newConfig) + wallet = wallet.useAddress(wallet.address).useConfig(newConfig) + + await wallet.sendTransactions([]) + + for (let i = 0; i < subdigests.length; i++) { + const subdigest = ethers.hexlify(subdigests[i].subdigest) + const encoded = wallet.staticSubdigestSign(subdigest) + const res = await wallet.mainModule['isValidSignature(bytes32,bytes)'](digests[i], encoded) + expect(res).to.equal('0x1626ba7e') + } + }) + }) + }) + }) + + describe('Nested configurations', async () => { + it('Should use nested configuration as a regular branch', async () => { + const nested = SequenceWallet.basicWallet(context, { signing: 1, idle: 11 }) + const simplifiedConfig = { + threshold: 1, + checkpoint: 2, + signers: [ + { + address: ethers.Wallet.createRandom().address, + weight: 1 + }, + { + ...toSimplifiedConfig(nested.config), + weight: 1 + } + ] + } + + const config = { + ...simplifiedConfig, + topology: legacyTopology(simplifiedConfig) + } + + const wallet = new SequenceWallet({ context, config, signers: nested.signers }) + await wallet.deploy() + + await wallet.sendTransactions([]) + }) + it('Should use nested configuration with independent weight and threshold', async () => { + const nested = SequenceWallet.basicWallet(context, { signing: 2, idle: 11 }) + const simplifiedConfig = { + threshold: 5, + checkpoint: 2, + signers: [ + { + ...toSimplifiedConfig(nested.config), + weight: 5 + }, + { + address: ethers.Wallet.createRandom().address, + weight: 1 + } + ] + } + + const config = { + ...simplifiedConfig, + topology: merkleTopology(simplifiedConfig) + } + + const wallet = new SequenceWallet({ context, config, signers: nested.signers }) + await wallet.deploy() + + await wallet.sendTransactions([]) + }) + it('Should reject nested configuration if not enough internal signing power', async () => { + const nested = SequenceWallet.basicWallet(context, { signing: 2, idle: 11 }) + + const simplifiedConfig = { + threshold: 1, + checkpoint: 2, + signers: [ + { + ...toSimplifiedConfig(nested.config), + weight: 5 + }, + { + address: ethers.Wallet.createRandom().address, + weight: 1 + } + ] + } + + const config = { + ...simplifiedConfig, + topology: merkleTopology(simplifiedConfig) + } + + const wallet = new SequenceWallet({ context, config, signers: [nested.signers[0]] }) + await wallet.deploy() + + const tx = wallet.sendTransactions([]) + await expectToBeRejected(tx, 'InvalidSignature') + }) + it('Should limit nested signing power', async () => { + const nested = SequenceWallet.basicWallet(context, { signing: 10 }) + + const simplifiedConfig = { + threshold: 2, + checkpoint: 2, + signers: [ + { + ...toSimplifiedConfig(nested.config), + weight: 1 + }, + { + address: ethers.Wallet.createRandom().address, + weight: 1 + } + ] + } + + const config = { + ...simplifiedConfig, + topology: merkleTopology(simplifiedConfig) + } + + const wallet = new SequenceWallet({ context, config, signers: nested.signers }) + await wallet.deploy() + + const tx = wallet.sendTransactions([]) + await expectToBeRejected(tx, 'InvalidSignature') + }) + }) + + describe('External calls', () => { + let { valA, valB } = { valA: BigInt(Math.floor(Date.now())), valB: randomHex(120) } + + it('Should perform call to contract', async () => { + const transaction = { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + + await wallet.sendTransactions([transaction]) + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + it('Should return error message', async () => { + await callReceiver.setRevertFlag(true) + + const transaction = { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [0, new Uint8Array([])]) + } + + const tx = wallet.sendTransactions([transaction]) + await expect(tx).to.be.rejectedWith('CallReceiverMock#testCall: REVERT_FLAG') + }) + describe('Batch transactions', () => { + let callReceiver2: ContractType + let { val2A, val2B } = { val2A: 9422n, val2B: randomHex(31) } + + beforeEach(async () => { + callReceiver2 = await CallReceiverMock.deploy() + }) + + it('Should perform multiple calls to contracts in one tx', async () => { + const transactions = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + }, + { + target: await callReceiver2.getAddress(), + data: callReceiver2.interface.encodeFunctionData('testCall', [val2A, val2B]) + } + ] + + await wallet.sendTransactions(transactions) + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + expect(await callReceiver2.lastValA()).to.equal(val2A) + expect(await callReceiver2.lastValB()).to.equal(val2B) + }) + + it('Should perform call a contract and transfer eth in one tx', async () => { + const signer = await hethers.provider.getSigner() + await signer.sendTransaction({ to: wallet.address, value: 100 }) + const receiver = new ethers.Wallet(ethers.hexlify(ethers.randomBytes(32))) + + const transactions = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + }, + { + target: receiver.address, + value: 26 + } + ] + + await wallet.sendTransactions(transactions) + + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + expect(await hethers.provider.getBalance(receiver.address)).to.equal(26n) + }) + + it('Should fail if one transaction fails', async () => { + const signer = await hethers.provider.getSigner() + await signer.sendTransaction({ to: wallet.address, value: 100 }) + + await callReceiver.setRevertFlag(true) + + const transactions = [ + { + target: ethers.Wallet.createRandom().address, + value: 26 + }, + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [0, new Uint8Array([])]) + } + ] + + const tx = wallet.sendTransactions(transactions) + await expect(tx).to.be.rejectedWith('CallReceiverMock#testCall: REVERT_FLAG') + }) + }) + }) + + describe('Delegate calls', () => { + let delegateCallMock: ContractType + + beforeEach(async () => { + delegateCallMock = await DelegateCallMock.deploy() + }) + + it('Should delegate call to module', async () => { + const transaction1 = { + delegateCall: true, + target: await delegateCallMock.getAddress(), + data: delegateCallMock.interface.encodeFunctionData('write', [11, 45]) + } + + await wallet.sendTransactions([transaction1]) + + const transaction2 = { + delegateCall: true, + target: await delegateCallMock.getAddress(), + data: delegateCallMock.interface.encodeFunctionData('read', [11]) + } + + const tx = await wallet.sendTransactions([transaction2]) + const receipt = await tx.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + const val = BigInt(receipt.logs.slice(-2)[0].data) + expect(val).to.equal(45n) + }) + + describe('on delegate call revert', () => { + beforeEach(async () => { + await wallet.sendTransactions([ + { + delegateCall: true, + target: await delegateCallMock.getAddress(), + data: delegateCallMock.interface.encodeFunctionData('setRevertFlag', [true]) + } + ]) + }) + + it('Should pass if revertOnError is false', async () => { + const transaction = { + delegateCall: true, + revertOnError: false, + target: await delegateCallMock.getAddress(), + data: delegateCallMock.interface.encodeFunctionData('write', [11, 45]) + } + + await wallet.sendTransactions([transaction]) + }) + + it('Should fail if delegate call fails', async () => { + const transaction = { + delegateCall: true, + target: await delegateCallMock.getAddress(), + data: delegateCallMock.interface.encodeFunctionData('write', [11, 45]) + } + + const tx = wallet.sendTransactions([transaction]) + await expect(tx).to.be.rejectedWith('DelegateCallMock#write: REVERT_FLAG') + }) + }) + }) + + describe('Handle ETH', () => { + it('Should receive ETH', async () => { + const signer = await hethers.provider.getSigner() + signer.sendTransaction({ to: wallet.address, value: 1 }) + }) + + it('Should transfer ETH', async () => { + const signer = await hethers.provider.getSigner() + signer.sendTransaction({ to: wallet.address, value: 100 }) + + const receiver = ethers.Wallet.createRandom().address + + const transaction = { + target: receiver, + value: 25 + } + + await wallet.sendTransactions([transaction]) + expect(await hethers.provider.getBalance(receiver)).to.equal(25n) + }) + + it('Should call payable function', async () => { + const signer = await hethers.provider.getSigner() + signer.sendTransaction({ to: wallet.address, value: 100 }) + + const valA = 63129n + const valB = randomHex(120) + const value = 33n + + const transaction = { + target: await callReceiver.getAddress(), + value: value, + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + + await wallet.sendTransactions([transaction]) + expect(await hethers.provider.getBalance(await callReceiver.getAddress())).to.equal(value) + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + }) + + describe('Optional transactions', () => { + it('Should skip a skipOnError transaction', async () => { + await callReceiver.setRevertFlag(true) + + const transaction = { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [0, new Uint8Array([])]) + } + + const receipt = await wallet.sendTransactions([transaction]).then(r => r.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const event = events.pop() + + const reason = ethers.AbiCoder.defaultAbiCoder().decode(['string'], '0x' + event!.args!._reason.slice(10))[0] + expect(reason).to.equal('CallReceiverMock#testCall: REVERT_FLAG') + }) + + describe('With multiple transactions', () => { + let callReceiver2: ContractType + const { valA, valB } = { valA: 912341n, valB: randomHex(30) } + + beforeEach(async () => { + callReceiver2 = await CallReceiverMock.deploy() + }) + + it('Should skip failing transaction within batch', async () => { + await callReceiver.setRevertFlag(true) + + const transactions = [ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [0, new Uint8Array([])]) + }, + { + revertOnError: false, + target: await callReceiver2.getAddress(), + data: callReceiver2.interface.encodeFunctionData('testCall', [valA, valB]) + } + ] + + const receipt = await wallet.sendTransactions(transactions).then(r => r.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const ev = events.find(ev => ev.eventName === 'TxFailed') + + const reason = ethers.AbiCoder.defaultAbiCoder().decode(['string'], '0x' + ev!.args!._reason.slice(10))[0] + expect(reason).to.equal('CallReceiverMock#testCall: REVERT_FLAG') + + expect(await callReceiver2.lastValA()).to.equal(valA) + expect(await callReceiver2.lastValB()).to.equal(valB) + }) + + it('Should skip multiple failing transactions within batch', async () => { + await callReceiver.setRevertFlag(true) + + const transactions = [ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [0, new Uint8Array([])]) + }, + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [0, new Uint8Array([])]) + }, + { + target: await callReceiver2.getAddress(), + data: callReceiver2.interface.encodeFunctionData('testCall', [valA, valB]) + } + ] + + const txHash = await subdigestOf(wallet.address, digestOf(transactions, await wallet.getNonce())) + const receipt = await wallet.sendTransactions(transactions).then(r => r.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + + const event1 = events[1] + const event2 = events[2] + + const reason1 = ethers.AbiCoder.defaultAbiCoder().decode(['string'], '0x' + event1.args!._reason.slice(10))[0] + const reason2 = ethers.AbiCoder.defaultAbiCoder().decode(['string'], '0x' + event2.args!._reason.slice(10))[0] + + expect(reason1).to.equal('CallReceiverMock#testCall: REVERT_FLAG') + expect(reason2).to.equal('CallReceiverMock#testCall: REVERT_FLAG') + + expect(event1.args!._tx).to.equal(txHash) + expect(event2.args!._tx).to.equal(txHash) + + expect(await callReceiver2.lastValA()).to.equal(valA) + expect(await callReceiver2.lastValB()).to.equal(valB) + }) + + it('Should skip all failing transactions within a batch', async () => { + await callReceiver.setRevertFlag(true) + + const transactions = [ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [0, new Uint8Array([])]) + }, + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [0, new Uint8Array([])]) + } + ] + + const receipt = await wallet.sendTransactions(transactions).then(r => r.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + + const event1 = events.pop() + const event2 = events.pop() + + const reason1 = ethers.AbiCoder.defaultAbiCoder().decode(['string'], '0x' + event1!.args!._reason.slice(10))[0] + const reason2 = ethers.AbiCoder.defaultAbiCoder().decode(['string'], '0x' + event2!.args!._reason.slice(10))[0] + + expect(reason1).to.equal('CallReceiverMock#testCall: REVERT_FLAG') + expect(reason2).to.equal('CallReceiverMock#testCall: REVERT_FLAG') + }) + }) + }) + + describe('Hooks', () => { + let hookCallerMock: ContractType + + before(async () => { + hookCallerMock = await HookCallerMock.deploy() + }) + + describe('receive tokens', () => { + it('Should implement ERC1155 single transfer hook', async () => { + await hookCallerMock.callERC1155Received(wallet.address) + }) + it('Should implement ERC1155 batch transfer hook', async () => { + await hookCallerMock.callERC1155BatchReceived(wallet.address) + }) + it('Should implement ERC721 transfer hook', async () => { + await hookCallerMock.callERC721Received(wallet.address) + }) + it('Should implement ERC223 transfer hook', async () => { + await hookCallerMock.callERC223Received(wallet.address) + }) + }) + + describe('ERC1271 Wallet', () => { + let message = randomHex(250) + let hash = ethers.keccak256(ethers.randomBytes(32)) + + it('Should validate arbitrary signed data', async () => { + const signature = await wallet.signMessage(message) + await hookCallerMock.callERC1271isValidSignatureData(wallet.address, message, signature) + }) + + it('Should validate arbitrary signed hash', async () => { + const signature = await wallet.signDigest(hash) + await hookCallerMock.callERC1271isValidSignatureHash(wallet.address, hash, signature) + }) + + it('Should reject data signed by non-owner', async () => { + const impostor = SequenceWallet.basicWallet(context) + const signature = await impostor.signMessage(message) + const tx = hookCallerMock.callERC1271isValidSignatureData(wallet.address, message, signature) + await expect(tx).to.be.rejectedWith('HookCallerMock#callERC1271isValidSignatureData: INVALID_RETURN') + }) + + it('Should reject hash signed by non-owner', async () => { + const impostor = SequenceWallet.basicWallet(context) + const signature = await impostor.signDigest(hash) + const tx = hookCallerMock.callERC1271isValidSignatureHash(wallet.address, hash, signature) + await expect(tx).to.be.rejectedWith('HookCallerMock#callERC1271isValidSignatureHash: INVALID_RETURN') + }) + }) + + describe('External hooks', () => { + let hookMock: ContractType + let hookSelector: string + + before(async () => { + hookMock = await HookMock.deploy() + const fragment = hookMock.interface.getFunction('onHookMockCall') + hookSelector = getSigHash(fragment) + }) + + it('Should return zero if hook is not registered', async () => { + expect(await wallet.mainModule.readHook(hookSelector)).to.be.equal(ethers.ZeroAddress) + }) + + describe('With registered hook', () => { + beforeEach(async () => { + const transaction = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('addHook', [hookSelector, await hookMock.getAddress()]) + } + + await wallet.sendTransactions([transaction]) + }) + + it('Should read added hook', async () => { + expect(await wallet.mainModule.readHook(hookSelector)).to.be.equal(await hookMock.getAddress()) + }) + + it('Should forward call to external hook', async () => { + const walletHook = HookMock.attach(wallet.address) + expect(await walletHook.onHookMockCall(21)).to.equal(42n) + }) + + it('Should not forward call to deregistered hook', async () => { + const transaction = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('removeHook', [hookSelector]) + } + + await wallet.sendTransactions([transaction]) + + const tx2 = HookMock.attach(wallet.address).onHookMockCall(21) + await expect(tx2).to.be.rejected + }) + + it('Should use hooks storage key', async () => { + const subkey = ethers.AbiCoder.defaultAbiCoder().encode(['bytes4'], [hookSelector]) + const storageKey = computeStorageKey('org.arcadeum.module.hooks.hooks', subkey) + + const storageValue = await hethers.provider.getStorage(wallet.address, storageKey) + + const addr = (() => { + try { + return ethers.getAddress(ethers.AbiCoder.defaultAbiCoder().decode(['address'], storageValue)[0]) + } catch { + return ethers.getAddress(storageValue) + } + })() + + expect(addr).to.equal(await hookMock.getAddress()) + }) + }) + + it('Should pass calling a non registered hook', async () => { + const data = ethers.AbiCoder.defaultAbiCoder().encode(['bytes4'], [hookSelector]) + const signer = await hethers.provider.getSigner() + await signer.sendTransaction({ to: wallet.address, data: data }) + }) + }) + + it('Should not forward msg.data with less than 4 bytes', async () => { + const alwaysRevertMock = await AlwaysRevertMock.deploy() + const paddedSelector = '0x11223300' + + const transaction = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('addHook', [paddedSelector, await alwaysRevertMock.getAddress()]) + } + + await wallet.sendTransactions([transaction]) + + const signer = await hethers.provider.getSigner() + + // Calling the wallet with '0x112233' should not forward the call to the hook + const tx = signer.sendTransaction({ to: wallet.address, data: '0x112233' }).then(t => t.wait()) + await expect(tx).to.be.fulfilled + + // Calling the wallet with '0x11223300' should forward the call to the hook (and thus revert) + const tx2 = signer.sendTransaction({ to: wallet.address, data: '0x11223300' }).then(t => t.wait()) + await expect(tx2).to.be.rejected + }) + + it('Should emit an event when adding a hook', async () => { + const selector = '0x2385ac0a' + const implementation = ethers.Wallet.createRandom().address + + const transaction = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('addHook', [selector, implementation]) + } + + const receipt = await wallet.sendTransactions([transaction]).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const event = events.find(ev => ev.eventName === 'DefinedHook') + expect(event).to.not.be.undefined + expect(event!.args._signature).to.equal(selector) + expect(event!.args._implementation).to.equal(implementation) + }) + + it('Should emit an event when removing a hook', async () => { + const selector = '0x2385ac0a' + const implementation = ethers.Wallet.createRandom().address + + const transaction1 = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('addHook', [selector, implementation]) + } + + await wallet.sendTransactions([transaction1]).then(t => t.wait()) + + const transaction2 = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('removeHook', [selector]) + } + + const receipt = await wallet.sendTransactions([transaction2]).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + const event = events.find(ev => ev.eventName === 'DefinedHook') + expect(event).to.not.be.undefined + expect(event?.args._signature).to.equal(selector) + expect(event?.args._implementation).to.equal(ethers.ZeroAddress) + }) + }) + + describe('Update owners', async () => { + let walletb: SequenceWallet + + beforeEach(async () => { + walletb = SequenceWallet.basicWallet(context, { address: wallet.address }) + }) + + it('Should fail to update to invalid image hash', async () => { + const tx = wallet.updateImageHash(ethers.ZeroHash) + await expectToBeRejected(tx, 'ImageHashIsZero()') + }) + + it('Should fail to change image hash from non-self address', async () => { + const tx = wallet.mainModule.updateImageHash(ethers.randomBytes(32)) + await expectToBeRejected(tx, `OnlySelfAuth("${accounts[0]}", "${wallet.address}")`) + }) + + describe('After a migration', async () => { + beforeEach(async () => { + await wallet.updateImageHash(walletb.imageHash) + }) + + it('Should implement new upgradable module', async () => { + expect(await walletb.mainModuleUpgradable.imageHash()).to.equal(walletb.imageHash) + }) + + it('Should accept new owner signature', async () => { + await walletb.sendTransactions([{}]) + }) + + it('Should reject old owner signature', async () => { + const tx = wallet.sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should fail to update to invalid image hash', async () => { + const tx = walletb.updateImageHash(ethers.ZeroHash) + await expectToBeRejected(tx, 'ImageHashIsZero()') + }) + + it('Should fail to change image hash from non-self address', async () => { + const tx = wallet.mainModuleUpgradable.updateImageHash(ethers.randomBytes(32)) + await expectToBeRejected(tx, `OnlySelfAuth("${accounts[0]}", "${wallet.address}")`) + }) + + it('Should use image hash storage key', async () => { + const storageKey = computeStorageKey('org.arcadeum.module.auth.upgradable.image.hash') + const storageValue = await hethers.provider.getStorage(wallet.address, storageKey) + expect(ethers.AbiCoder.defaultAbiCoder().encode(['bytes32'], [storageValue])).to.equal(walletb.imageHash) + }) + + it('Should fail to execute transactions on moduleUpgradable implementation', async () => { + const tx = context.mainModuleUpgradable.execute([], 0, '0x0000') + await expect(tx).to.be.rejected + }) + + describe('After updating the image hash', () => { + let walletc: SequenceWallet + + beforeEach(async () => { + walletc = SequenceWallet.basicWallet(context, { signing: 2, address: walletb.address }) + await walletb.updateImageHash(walletc.imageHash) + }) + + it('Should have updated the image hash', async () => { + expect(await walletb.mainModuleUpgradable.imageHash()).to.equal(walletc.imageHash) + }) + + it('Should accept new owners signatures', async () => { + await walletc.sendTransactions([{}]) + }) + + it('Should reject old owner signatures', async () => { + const tx = walletb.sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should use image hash storage key', async () => { + const storageKey = computeStorageKey('org.arcadeum.module.auth.upgradable.image.hash') + const storageValue = await hethers.provider.getStorage(walletb.address, storageKey) + expect(ethers.AbiCoder.defaultAbiCoder().encode(['bytes32'], [storageValue])).to.equal(walletc.imageHash) + }) + }) + }) + }) + + describe('Multisignature', async () => { + const modes = [ + { + name: 'Forced dynamic part encoding, legacy signature type', + encodingOptions: { forceDynamicEncoding: true, signatureType: SignatureType.Legacy } + }, + { + name: 'Default part encoding, legacy signature encoding', + encodingOptions: { signatureType: SignatureType.Legacy } + }, + { + name: 'Forced dynamic part encoding, dynamic signature type', + encodingOptions: { forceDynamicEncoding: true, signatureType: SignatureType.Dynamic } + }, + { + name: 'Default part encoding, dynamic signature type', + encodingOptions: { signatureType: SignatureType.Legacy } + } + ] + + modes.map(mode => { + describe(mode.name, () => { + let encodingOptions = mode.encodingOptions + + describe('With 1/2 wallet', () => { + let signer1 = ethers.Wallet.createRandom() + let signer2 = ethers.Wallet.createRandom() + + beforeEach(async () => { + wallet = SequenceWallet.detailedWallet(context, { threshold: 1, signers: [signer1, signer2], encodingOptions }) + await wallet.deploy() + }) + + it('Should accept signed message by first owner', async () => { + await wallet.useSigners(signer1).sendTransactions([{}]) + }) + + it('Should accept signed message by second owner', async () => { + await wallet.useSigners(signer2).sendTransactions([{}]) + }) + + it('Should accept signed message by both owners', async () => { + await wallet.useSigners([signer1, signer2]).sendTransactions([{}]) + }) + + it('Should reject message without signatures', async () => { + const tx = wallet.useSigners([]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed by non-owner', async () => { + const tx = wallet.useSigners(Imposter.random(signer1)).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed by non-owner and signer2', async () => { + const tx = wallet.useSigners([signer2, Imposter.random(signer1)]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject signature of invalid length', async () => { + const signature = await wallet.signTransactions([{}]) + const badSignature = signature.slice(0, -2) + const tx = wallet.relayTransactions([{}], badSignature) + await expect(tx).to.be.rejected + }) + }) + + describe('With 2/2 wallet', () => { + let signer1 = ethers.Wallet.createRandom() + let signer2 = ethers.Wallet.createRandom() + + beforeEach(async () => { + wallet = SequenceWallet.detailedWallet(context, { threshold: 2, signers: [signer1, signer2], encodingOptions }) + await wallet.deploy() + }) + + it('Should accept signed message by both owners', async () => { + await wallet.sendTransactions([{}]) + }) + + it('Should reject message without signatures', async () => { + const tx = wallet.useSigners([]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed only by first owner', async () => { + const tx = wallet.useSigners(signer1).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed only by second owner', async () => { + const tx = wallet.useSigners(signer2).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed by non-owner', async () => { + const tx = wallet.useSigners(Imposter.random(signer1)).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + }) + + describe('With 2/3 wallet', () => { + let signer1 = ethers.Wallet.createRandom() + let signer2 = ethers.Wallet.createRandom() + let signer3 = ethers.Wallet.createRandom() + + beforeEach(async () => { + wallet = SequenceWallet.detailedWallet(context, { + threshold: 2, + signers: [signer1, signer2, signer3], + encodingOptions + }) + await wallet.deploy() + }) + + it('Should accept signed message by first and second owner', async () => { + await wallet.useSigners([signer1, signer2]).sendTransactions([{}]) + }) + + it('Should accept signed message by first and last owner', async () => { + await wallet.useSigners([signer1, signer3]).sendTransactions([{}]) + }) + + it('Should accept signed message by second and last owner', async () => { + await wallet.useSigners([signer2, signer3]).sendTransactions([{}]) + }) + + it('Should accept signed message by all owners', async () => { + await wallet.useSigners([signer1, signer2, signer3]).sendTransactions([{}]) + }) + + it('Should reject message signed only by first owner', async () => { + const tx = wallet.useSigners(signer1).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed only by second owner', async () => { + const tx = wallet.useSigners(signer2).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed only by last owner', async () => { + const tx = wallet.useSigners(signer3).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message not signed', async () => { + const tx = wallet.useSigners([]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed by non-owner', async () => { + const tx = wallet.useSigners(Imposter.random(signer1)).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed by non-owner and signer1', async () => { + const tx = wallet.useSigners([signer1, Imposter.random(signer2)]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed by two non-owners', async () => { + const tx = wallet.useSigners([Imposter.random(signer1), Imposter.random(signer2)]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message if signed with a wrong configuration', async () => { + const tx = wallet + .useConfig(SequenceWallet.detailedWallet(context, { threshold: 3, signers: [signer1, signer2] })) + .sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + }) + + describe('With 3/10 wallet', () => { + beforeEach(async () => { + wallet = SequenceWallet.basicWallet(context, { signing: 3, idle: 7 }) + await wallet.deploy() + }) + + it('Should accept message signed by 3/10 owners', async () => { + await wallet.sendTransactions([{}]) + }) + }) + + describe('With 255/255 wallet', () => { + beforeEach(async () => { + wallet = SequenceWallet.basicWallet(context, { signing: 215, encodingOptions }) + await wallet.deploy() + }) + + it('Should accept message signed by all owners', async () => { + await wallet.sendTransactions([{}], undefined, { gasLimit: 60000000 }) + }) + + it('Should reject message signed by non-owner', async () => { + const tx = wallet + .useSigners([Imposter.random(wallet.signers[0] as ethers.Wallet), ...wallet.signers.slice(1)]) + .sendTransactions([{}], undefined, { gasLimit: 60000000 }) + + await expect(tx).to.be.rejected + }) + + it('Should reject message signed by all non-owners', async () => { + const tx = wallet + .useSigners(wallet.signers.map(s => Imposter.random(s as ethers.Wallet))) + .sendTransactions([{}], undefined, { gasLimit: 60000000 }) + + await expect(tx).to.be.rejected + }) + + it('Should reject message missing a signature', async () => { + const tx = wallet.useSigners(wallet.signers.slice(1)).sendTransactions([{}], undefined, { gasLimit: 60000000 }) + await expect(tx).to.be.rejected + }) + }) + + describe('With weighted owners', () => { + let signers: ethers.BaseWallet[] + + beforeEach(async () => { + signers = new Array(5).fill(null).map(() => ethers.Wallet.createRandom()) + wallet = SequenceWallet.detailedWallet(context, { + threshold: 4, + signers: [3, 3, 1, 1, 1].map((weight, i) => ({ weight, value: signers[i] })) + }) + await wallet.deploy() + }) + + it('Should accept signed message with (3+1)/4 weight', async () => { + await wallet.useSigners([signers[0], signers[3]]).sendTransactions([{}]) + }) + + it('Should accept signed message with (3+3)/4 weight', async () => { + await wallet.useSigners([signers[0], signers[1]]).sendTransactions([{}]) + }) + + it('Should accept signed message with (3+3+1+1)/4 weight', async () => { + await wallet.useSigners(signers.slice(0, 4)).sendTransactions([{}]) + }) + + it('Should accept signed message with (3+3+1+1+1)/4 weight (all signers)', async () => { + await wallet.useSigners(signers).sendTransactions([{}]) + }) + + it('Should reject signed message with (1)/4 weight', async () => { + const tx = wallet.useSigners([signers[3]]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject signed message with (1+1)/4 weight', async () => { + const tx = wallet.useSigners([signers[2], signers[3]]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject signed message with (1+1+1)/4 weight', async () => { + const tx = wallet.useSigners([signers[2], signers[3], signers[4]]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject signed message with (3)/4 weight', async () => { + const tx = wallet.useSigners(signers[0]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject signed message with (0)/4 weight', async () => { + const tx = wallet.useSigners([]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + it('Should reject message signed by non-owner', async () => { + const tx = wallet.useSigners([signers[0], Imposter.random(signers[3])]).sendTransactions([{}]) + await expect(tx).to.be.rejected + }) + + describe('Reject invalid signatures', () => { + beforeEach(async () => { + wallet = SequenceWallet.basicWallet(context, { encodingOptions }) + await wallet.deploy() + }) + + it('Should reject invalid signature type', async () => { + const signature = await wallet.signTransactions([{}]) + const badSignature = signature.slice(0, -2) + 'ff' + const tx = wallet.relayTransactions([{}], badSignature) + await expect(tx).to.be.rejected + }) + + it('Should reject invalid s value', async () => { + const signature = await wallet.signTransactions([{}]) + const prefix = mode.encodingOptions.forceDynamicEncoding ? 118 : 74 + const invalidSignature = + signature.slice(0, prefix) + + '7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1' + + signature.slice(prefix + 64) + const tx = wallet.relayTransactions([{}], invalidSignature) + await expect(tx).to.be.reverted + }) + + it('Should reject invalid v value', async () => { + const signature = await wallet.signTransactions([{}]) + const prefix = mode.encodingOptions.forceDynamicEncoding ? 182 : 138 + const invalidSignature = signature.slice(0, prefix) + '1a' + signature.slice(prefix + 2) + const tx = wallet.relayTransactions([{}], invalidSignature) + await expect(tx).to.be.reverted + }) + }) + }) + }) + }) + }) + + describe('Gas limit', () => { + let gasBurner: ContractType + + before(async () => { + gasBurner = await GasBurnerMock.deploy() + }) + + it('Should forward the defined amount of gas', async () => { + const gas = 10000 + + const transaction = { + gasLimit: gas, + target: await gasBurner.getAddress(), + data: gasBurner.interface.encodeFunctionData('burnGas', [0]) + } + + const receipt = await wallet.sendTransactions([transaction]).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const reported = Number(BigInt(receipt.logs.slice(-2)[0].data)) + expect(reported).to.be.below(gas) + }) + + it('Should forward different amounts of gas', async () => { + const gasA = 10000 + const gasB = 350000 + + const transactions = [ + { + gasLimit: gasA, + target: await gasBurner.getAddress(), + data: gasBurner.interface.encodeFunctionData('burnGas', [8000]) + }, + { + gasLimit: gasB, + target: await gasBurner.getAddress(), + data: gasBurner.interface.encodeFunctionData('burnGas', [340000]) + } + ] + + const receipt = await wallet.sendTransactions(transactions).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const reportedB = Number(BigInt(receipt.logs.slice(-2)[0].data)) + const reportedA = Number(BigInt(receipt.logs.slice(-4)[0].data)) + + expect(reportedA).to.be.below(gasA) + expect(reportedB).to.be.below(gasB) + expect(reportedB).to.be.above(gasA) + }) + + it('Should fail if forwarded call runs out of gas', async () => { + const gas = 10000 + + const transaction = { + gasLimit: gas, + target: await gasBurner.getAddress(), + data: gasBurner.interface.encodeFunctionData('burnGas', [11000]) + } + + const tx = wallet.sendTransactions([transaction]) + expect(tx).to.be.rejected + }) + + it('Should fail without reverting if optional call runs out of gas', async () => { + const gas = 10000 + + const transaction = { + revertOnError: false, + gasLimit: gas, + target: await gasBurner.getAddress(), + data: gasBurner.interface.encodeFunctionData('burnGas', [200000]) + } + + const receipt = await wallet.sendTransactions([transaction]).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + + const log = events.pop() + expect(log!.eventName).to.be.equal('TxFailed') + }) + + it('Should continue execution if optional call runs out of gas', async () => { + const gas = 10000 + + const valA = 9512358833n + const valB = randomHex(1600) + + const transactions = [ + { + revertOnError: false, + gasLimit: gas, + target: await gasBurner.getAddress(), + data: gasBurner.interface.encodeFunctionData('burnGas', [200000]) + }, + { + revertOnError: true, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [valA, valB]) + } + ] + + const receipt = await wallet.sendTransactions(transactions).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + + const log = events.slice(-2)[0] + + expect(log.eventName).to.be.equal('TxFailed') + expect(await callReceiver.lastValA()).to.equal(valA) + expect(await callReceiver.lastValB()).to.equal(valB) + }) + + it('Should fail if transaction is executed with not enough gas', async () => { + const transaction = { + gasLimit: 1000000 + } + + const tx = wallet.sendTransactions([transaction], undefined, { gasLimit: 250000 }) + await expect(tx).to.be.rejected + }) + }) + + describe('Create contracts', () => { + it('Should create a contract', async () => { + const deployCode = CallReceiverMock.factory().bytecode + + const transaction = { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('createContract', [deployCode]) + } + + const receipt = await wallet.sendTransactions([transaction]).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + + const log = events!.find(l => l.eventName === 'CreatedContract') + + expect(log!.eventName).to.equal('CreatedContract') + + const deployed = CallReceiverMock.attach(log!.args!._contract) + await deployed.testCall(12345, '0x552299') + + expect(await deployed.lastValA()).to.equal(12345n) + expect(await deployed.lastValB()).to.equal('0x552299') + }) + + it('Should create a contract with value', async () => { + const deployCode = CallReceiverMock.factory().bytecode + + const signer = await hethers.provider.getSigner() + await signer.sendTransaction({ to: wallet.address, value: 100 }) + + const transaction = { + target: wallet.address, + value: 99, + data: wallet.mainModule.interface.encodeFunctionData('createContract', [deployCode]) + } + + const receipt = await wallet.sendTransactions([transaction]).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + + const log = events!.find(l => l.eventName === 'CreatedContract') + + expect(await hethers.provider.getBalance(log!.args!._contract)).to.equal(99n) + }) + + it('Should fail to create a contract from non-self', async () => { + const tx = wallet.mainModule.createContract(CallReceiverMock.factory().bytecode) + await expectToBeRejected(tx, `OnlySelfAuth("${accounts[0]}", "${wallet.address}")`) + }) + }) + + describe('Transaction events', () => { + it('Should emit TxExecuted event', async () => { + const txHash = await subdigestOf(wallet.address, digestOf([{}], await wallet.getNonce())) + const res = await wallet.sendTransactions([{}]) + const receipt = await res.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + const events = receipt.logs.filter(log => log instanceof ethers.EventLog) as ethers.EventLog[] + + const log = events!.find(l => l.eventName === 'TxExecuted')! + + expect(log.topics.length).to.equal(2) + expect(log.topics[1]).to.be.equal(txHash) + expect(log.data).to.be.equal(ethers.solidityPacked(['uint256'], [0])) + }) + + it('Should emit multiple TxExecuted events', async () => { + const txHash = await subdigestOf(wallet.address, digestOf([{}, {}], await wallet.getNonce())) + const receipt = await wallet.sendTransactions([{}, {}]).then(t => t.wait()) + + if (!receipt) { + throw new Error('No receipt') + } + + const log1 = receipt.logs[1] + const log2 = receipt.logs[2] + + expect(log1.topics.length).to.equal(2) + expect(log1.topics[1]).to.be.equal(txHash) + expect(log1.data).to.be.equal(ethers.solidityPacked(['uint256'], [0])) + + expect(log2.topics.length).to.equal(2) + expect(log1.topics[1]).to.be.equal(txHash) + expect(log2.data).to.be.equal(ethers.solidityPacked(['uint256'], [1])) + }) + }) + + describe('Internal bundles', () => { + it('Should execute internal bundle', async () => { + const callReceiver2 = await CallReceiverMock.deploy() + + const expected1 = randomHex(552) + const expected2 = randomHex(24) + + const bundle = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [11, expected1]) + }, + { + target: await callReceiver2.getAddress(), + data: callReceiver2.interface.encodeFunctionData('testCall', [12, expected2]) + } + ] + + const transaction = [ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('selfExecute', [applyTxDefaults(bundle)]) + } + ] + + await wallet.sendTransactions(transaction) + + expect(await callReceiver.lastValA()).to.equal(11n) + expect(await callReceiver2.lastValA()).to.equal(12n) + + expect(await callReceiver.lastValB()).to.equal(expected1) + expect(await callReceiver2.lastValB()).to.equal(expected2) + }) + + it('Should execute multiple internal bundles', async () => { + const data = [ + [ + { i: 0, a: 142n, b: 412 }, + { i: 1, a: 123n, b: 2 } + ], + [ + { i: 2, a: 142n, b: 2 }, + { i: 3, a: 642n, b: 33 }, + { i: 4, a: 122n, b: 12 }, + { i: 5, a: 611n, b: 53 } + ], + [{ i: 6, a: 2n, b: 1 }], + [] + ] + + const contracts = await Promise.all(data.flat().map(() => CallReceiverMock.deploy())) + const expectedb = await Promise.all(data.flat().map(d => randomHex(d.b))) + + const bundles = await Promise.all( + data.map(async bundle => { + return applyTxDefaults( + await Promise.all( + bundle.map(async obj => ({ + target: await contracts[obj.i].getAddress(), + data: contracts[obj.i].interface.encodeFunctionData('testCall', [obj.a, expectedb[obj.i]]) + })) + ) + ) + }) + ) + + const transactions = bundles.map(bundle => ({ + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('selfExecute', [bundle]) + })) + + await wallet.sendTransactions(transactions) + + const lastValsA = await Promise.all(contracts.map(c => c.lastValA())) + const lastValsB = await Promise.all(contracts.map(c => c.lastValB())) + + lastValsA.forEach((val, i) => expect(val).to.equal(data.flat()[i].a)) + lastValsB.forEach((val, i) => expect(val).to.equal(expectedb[i])) + }) + + it('Should execute nested internal bundles', async () => { + const callReceiver2 = await CallReceiverMock.deploy() + + const expected1 = randomHex(552) + const expected2 = randomHex(24) + + const bundle = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [11, expected1]) + }, + { + target: await callReceiver2.getAddress(), + data: callReceiver2.interface.encodeFunctionData('testCall', [12, expected2]) + } + ] + + const nestedBundle = [ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('selfExecute', [applyTxDefaults(bundle)]) + } + ] + + const transactions = [ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('selfExecute', [applyTxDefaults(nestedBundle)]) + } + ] + + await wallet.sendTransactions(transactions) + + expect(await callReceiver.lastValA()).to.equal(11n) + expect(await callReceiver2.lastValA()).to.equal(12n) + + expect(await callReceiver.lastValB()).to.equal(expected1) + expect(await callReceiver2.lastValB()).to.equal(expected2) + }) + + it('Should revert bundle without reverting transaction', async () => { + const callReceiver2 = await CallReceiverMock.deploy() + const callReceiver3 = await CallReceiverMock.deploy() + + const expected1 = randomHex(552) + const expected2 = randomHex(24) + const expected3 = randomHex(11) + + const bundle = [ + { + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [11, expected1]) + }, + { + target: await callReceiver2.getAddress(), + data: callReceiver2.interface.encodeFunctionData('testCall', [12, expected2]) + }, + { + // This transaction will revert + // because Factory has no fallback + revertOnError: true, + target: await context.factory.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [12, expected2]) + } + ] + + const transaction = [ + { + revertOnError: false, + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('selfExecute', [applyTxDefaults(bundle)]) + }, + { + revertOnError: false, + target: await callReceiver3.getAddress(), + data: callReceiver3.interface.encodeFunctionData('testCall', [51, expected3]) + } + ] + + await wallet.sendTransactions(transaction) + + expect(await callReceiver.lastValA()).to.equal(0n) + expect(await callReceiver2.lastValA()).to.equal(0n) + expect(await callReceiver3.lastValA()).to.equal(51n) + + expect(await callReceiver.lastValB()).to.equal('0x') + expect(await callReceiver2.lastValB()).to.equal('0x') + expect(await callReceiver3.lastValB()).to.equal(expected3) + }) + }) + + describe('Update imageHash and IPFS at once', () => { + ;[ + { + name: 'using MainModule', + beforeEach: () => {} + }, + { + name: 'using MainModuleUpgradable', + beforeEach: async () => { + const newConfig = SequenceWallet.basicWallet(context) + await wallet.updateImageHash(newConfig.imageHash) + wallet = wallet.useAddress().useConfig(newConfig.config).useSigners(newConfig.signers) + } + } + ].map(c => { + describe(c.name, () => { + it('Should update imageHash and IPFS at the same time', async () => { + const ipfs = randomHex(32) + const imageHash = randomHex(32) + + await wallet.sendTransactions([ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImageHashAndIPFS', [imageHash, ipfs]) + } + ]) + + expect(await wallet.mainModuleUpgradable.imageHash()).to.equal(imageHash) + expect(await wallet.mainModule.ipfsRootBytes32()).to.equal(ipfs) + }) + + it('Should fail to update imageHash and IPFS if caller is not self', async () => { + const tx = wallet.mainModule.updateImageHashAndIPFS(randomHex(32), randomHex(32)) + await expectToBeRejected(tx, 'OnlySelf') + }) + + it('Updated imageHash should be usable', async () => { + const nextWallet = SequenceWallet.basicWallet(context) + const ipfs = randomHex(32) + + await wallet.sendTransactions([ + { + target: wallet.address, + data: wallet.mainModule.interface.encodeFunctionData('updateImageHashAndIPFS', [nextWallet.imageHash, ipfs]) + } + ]) + + wallet = wallet.useAddress(wallet.address).useConfig(nextWallet.config).useSigners(nextWallet.signers) + await wallet.sendTransactions([{}]) + }) + }) + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/MerkleSignatures.spec.ts b/packages/wallet/wallet-contracts/test/MerkleSignatures.spec.ts new file mode 100644 index 000000000..bbcc2f876 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/MerkleSignatures.spec.ts @@ -0,0 +1,30 @@ +import { ethers } from 'ethers' +import { deploySequenceContext, SequenceContext } from './utils/contracts' +import { legacyTopology, merkleTopology, printTopology, toSimplifiedConfig } from './utils/sequence' +import { SequenceWallet } from './utils/wallet' + +contract('MerkleSignatures', () => { + let context: SequenceContext + + before(async () => { + context = await deploySequenceContext() + }) + + it('Should display config topology', async () => { + const wallet = SequenceWallet.basicWallet(context, { signing: 10 }) + const simplifiedConfig = toSimplifiedConfig(wallet.config) + const topology1 = legacyTopology(simplifiedConfig) + const topology2 = merkleTopology(simplifiedConfig) + + console.log(`Legacy topology:`) + const t = printTopology(topology1, undefined, true) + for (const line of t) { + console.log(line) + } + + const t2 = printTopology(topology2) + for (const line of t2) { + console.log(line) + } + }) +}) diff --git a/packages/wallet/wallet-contracts/test/MultiCallUtils.spec.ts b/packages/wallet/wallet-contracts/test/MultiCallUtils.spec.ts new file mode 100644 index 000000000..085e7b789 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/MultiCallUtils.spec.ts @@ -0,0 +1,282 @@ +import { ethers } from 'ethers' + +import { ethers as hethers } from 'hardhat' +import { getChainId, encodeError, expect, expectStaticToBeRejected } from './utils' +import { CallReceiverMock, ContractType, MultiCallUtils } from './utils/contracts' +import { applyTxDefault, applyTxDefaults } from './utils/sequence' + +contract('Multi call utils', (accounts: string[]) => { + let multiCall: ContractType + let callReceiver: ContractType + + before(async () => { + multiCall = await MultiCallUtils.deploy() + callReceiver = await CallReceiverMock.deploy() + }) + + beforeEach(async () => { + await callReceiver.setRevertFlag(false) + }) + + describe('Call multiple contracts', () => { + it('Should execute empty call', async () => { + const res = await multiCall.multiCall.staticCall([]) + + expect(res[0].length).to.equal(0) + expect(res[1].length).to.equal(0) + }) + it('Should execute single call', async () => { + await callReceiver.testCall(5123, new Uint8Array([])) + const res = await multiCall.multiCall.staticCall( + applyTxDefaults([ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValA') + } + ]) + ) + + expect(res[0].length).to.equal(1) + expect(res[1].length).to.equal(1) + expect(res[0][0]).to.be.true + expect(res[1][0]).to.be.equal(ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [5123])) + }) + it('Should execute two calls', async () => { + const bytes = ethers.randomBytes(422) + + await callReceiver.testCall(55522, bytes) + const res = await multiCall.multiCall.staticCall( + applyTxDefaults([ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValA') + }, + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValB') + } + ]) + ) + + expect(res[0].length).to.equal(2) + expect(res[1].length).to.equal(2) + expect(res[0][0]).to.be.true + expect(res[1][0]).to.be.equal(ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [55522])) + expect(res[0][1]).to.be.true + expect(ethers.AbiCoder.defaultAbiCoder().decode(['bytes'], res[1][1])[0]).to.be.equal(ethers.hexlify(bytes)) + }) + it('Should execute calls to multiple contracts', async () => { + const callReceiver2 = await CallReceiverMock.deploy() + const bytes = ethers.hexlify(ethers.randomBytes(21)) + + await callReceiver.testCall(55522, bytes) + await callReceiver2.testCall(66623, new Uint8Array([])) + + const res = await multiCall.multiCall.staticCall( + applyTxDefaults([ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValA') + }, + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValB') + }, + { + revertOnError: false, + target: await callReceiver2.getAddress(), + data: callReceiver2.interface.encodeFunctionData('lastValA') + } + ]) + ) + + expect(res[0].length).to.equal(3) + expect(res[1].length).to.equal(3) + expect(res[0][0]).to.be.true + expect(res[1][0]).to.be.equal(ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [55522])) + expect(res[0][1]).to.be.true + expect(ethers.AbiCoder.defaultAbiCoder().decode(['bytes'], res[1][1])[0]).to.be.equal(bytes) + expect(res[0][2]).to.be.true + expect(res[1][2]).to.be.equal(ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [66623])) + }) + it('Return other calls even if single call fails', async () => { + const bytes = ethers.randomBytes(422) + + await callReceiver.testCall(55522, bytes) + await callReceiver.setRevertFlag(true) + + const res = await multiCall.multiCall.staticCall( + applyTxDefaults([ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValA') + }, + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [111, bytes]) + } + ]) + ) + + expect(res[0].length).to.equal(2) + expect(res[1].length).to.equal(2) + expect(res[0][0]).to.be.true + expect(res[1][0]).to.be.equal(ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], [55522])) + expect(res[0][1]).to.be.false + }) + it('Fail if call with revert on error fails', async () => { + const bytes = ethers.randomBytes(422) + + await callReceiver.testCall(55522, bytes) + await callReceiver.setRevertFlag(true) + + const tx = multiCall.multiCall.staticCall( + applyTxDefaults([ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValA') + }, + { + revertOnError: true, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [111, bytes]) + } + ]) + ) + + await expectStaticToBeRejected(tx, `CallReverted(uint256,bytes)`, 1, encodeError('CallReceiverMock#testCall: REVERT_FLAG')) + }) + it('Fail if batch includes delegate call', async () => { + const bytes = ethers.randomBytes(422) + + await callReceiver.testCall(55522, bytes) + + const tx = multiCall.multiCall.staticCall( + applyTxDefaults([ + { + delegateCall: true, + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValA') + }, + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [111, bytes]) + } + ]) + ) + + await expectStaticToBeRejected(tx, `DelegateCallNotAllowed(uint256)`, 0) + }) + it('Fail if not enough gas for call', async () => { + const bytes = ethers.randomBytes(422) + + await callReceiver.testCall(55522, bytes) + + const tx = multiCall.multiCall.staticCall( + applyTxDefaults([ + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('lastValA') + }, + { + revertOnError: false, + target: await callReceiver.getAddress(), + data: callReceiver.interface.encodeFunctionData('testCall', [111, bytes]), + gasLimit: 2n ** 256n - 1n + } + ]) + ) + + await expectStaticToBeRejected(tx, `NotEnoughGas(uint256,uint256,uint256)`, 1, 2n ** 256n - 1n, '*') + }) + it('Should call globals', async () => { + const i = multiCall.interface + const emptyAccount = ethers.Wallet.createRandom().address + + await multiCall.multiCall.staticCall([]) + + const lastBlock = await hethers.provider.getBlock('latest') + + const txs = await Promise.all( + [ + i.encodeFunctionData('callBlockhash', [lastBlock!.number - 1]), + i.encodeFunctionData('callCoinbase'), + i.encodeFunctionData('callDifficulty'), + i.encodeFunctionData('callGasLimit'), + i.encodeFunctionData('callBlockNumber'), + i.encodeFunctionData('callTimestamp'), + i.encodeFunctionData('callGasLeft'), + i.encodeFunctionData('callGasPrice'), + i.encodeFunctionData('callOrigin'), + i.encodeFunctionData('callBalanceOf', [accounts[0]]), + i.encodeFunctionData('callBalanceOf', [emptyAccount]), + i.encodeFunctionData('callCodeSize', [accounts[0]]), + i.encodeFunctionData('callCodeSize', [await callReceiver.getAddress()]), + i.encodeFunctionData('callCode', [accounts[0]]), + i.encodeFunctionData('callCode', [await callReceiver.getAddress()]), + i.encodeFunctionData('callCodeHash', [accounts[0]]), + i.encodeFunctionData('callCodeHash', [await callReceiver.getAddress()]), + i.encodeFunctionData('callChainId') + ].map(async data => + applyTxDefault({ + revertOnError: false, + target: await multiCall.getAddress(), + data + }) + ) + ) + + const res = await multiCall.multiCall.staticCall(txs, { gasPrice: 1 }) + + const emptyBytes32 = ethers.AbiCoder.defaultAbiCoder().encode(['uint256'], ['0']) + + expect(res[0].length).to.equal(txs.length) + expect(res[1].length).to.equal(txs.length) + + // All calls must success + expect(res[0].reduce((a: boolean, c: boolean) => a && c)).to.be.true + + expect(res[1][0]).to.not.equal(emptyBytes32, 'return block hash') + + if (!process.env.COVERAGE) { + expect(res[1][1]).to.not.equal(emptyBytes32, 'return coinbase') + expect(res[1][2]).to.not.equal(emptyBytes32, 'return difficulty') + } + + expect(res[1][3]).to.not.equal(emptyBytes32) + expect(res[1][4]).to.not.equal(emptyBytes32, 'return block number') + expect(res[1][5]).to.not.equal(emptyBytes32, 'return timestamp') + expect(res[1][6]).to.not.equal(emptyBytes32, 'return gas left') + expect(BigInt(res[1][7])).to.equal(1n, 'return gas price') + expect(res[1][8]).to.not.equal(emptyBytes32, 'return origin') + expect(res[1][9]).to.not.equal(emptyBytes32, 'return balance of 0x') + expect(res[1][10]).to.equal(emptyBytes32, 'return balance of empty account') + expect(res[1][11]).to.equal(emptyBytes32, 'return code size of empty account') + expect(res[1][12]).to.not.equal(emptyBytes32, 'return code size of contract') + + expect(ethers.AbiCoder.defaultAbiCoder().decode(['bytes'], res[1][13])[0]).to.equal('0x') + + const codeSize = ethers.AbiCoder.defaultAbiCoder().decode(['uint256'], res[1][12])[0] + expect(ethers.AbiCoder.defaultAbiCoder().decode(['bytes'], res[1][14])[0].length).to.equal( + 2 + Number(codeSize) * 2, + 'return code of correct size' + ) + + expect(res[1][15]).to.not.equal(emptyBytes32) + expect(res[1][16]).to.not.equal(emptyBytes32) + + expect(ethers.AbiCoder.defaultAbiCoder().decode(['uint256'], res[1][17])[0]).to.equal(await getChainId(), 'return chain id') + }) + }) +}) diff --git a/packages/wallet/wallet-contracts/test/utils/contracts.ts b/packages/wallet/wallet-contracts/test/utils/contracts.ts new file mode 100644 index 000000000..c2d6561b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/utils/contracts.ts @@ -0,0 +1,87 @@ +import { ethers } from 'ethers' +import { ethers as hethers } from 'hardhat' +import * as t from '../../gen/typechain' + +const cachedFactories: { [name: string]: ethers.ContractFactory } = {} + +async function deploy(name: string, ...args: any[]) { + const factory = await hethers.getContractFactory(name) + cachedFactories[name] = factory + return (await factory.deploy(...args)) as unknown as Y +} + +function attach(name: string, address: string) { + return cachedFactories[name].attach(address) as Y +} + +type Adapter = { + cache: () => Promise + deploy: (...args: any[]) => Promise + attach: (address: string) => T + factory: () => ethers.ContractFactory +} + +function adapt(name: string): Adapter { + return { + cache: async () => (cachedFactories[name] = await hethers.getContractFactory(name)), + deploy: (...args: any[]) => deploy(name, ...args), + attach: (address: string) => attach(name, address), + factory: () => cachedFactories[name] + } +} + +export type ContractType> = T extends Adapter ? U : never + +export const LibBytesImpl = adapt('LibBytesImpl') +export const LibBytesPointerImpl = adapt('LibBytesPointerImpl') +export const Factory = adapt('Factory') +export const MainModule = adapt('MainModule') +export const MainModuleUpgradable = adapt('MainModuleUpgradable') +export const ERC165CheckerMock = adapt('ERC165CheckerMock') +export const ModuleMock = adapt('ModuleMock') +export const CallReceiverMock = adapt('CallReceiverMock') +export const MultiCallUtils = adapt('MultiCallUtils') +export const GuestModule = adapt('GuestModule') +export const HookMock = adapt('HookMock') +export const HookCallerMock = adapt('HookCallerMock') +export const RequireUtils = adapt('RequireUtils') +export const DelegateCallMock = adapt('DelegateCallMock') +export const GasBurnerMock = adapt('GasBurnerMock') +export const GasEstimator = adapt('GasEstimator') +export const MainModuleGasEstimation = adapt('MainModuleGasEstimation') +export const LibStringImp = adapt('LibStringImp') +export const AlwaysRevertMock = adapt('AlwaysRevertMock') +;[ + LibBytesImpl, + Factory, + MainModule, + MainModuleUpgradable, + ERC165CheckerMock, + ModuleMock, + CallReceiverMock, + MultiCallUtils, + GuestModule, + HookMock, + HookCallerMock, + RequireUtils, + DelegateCallMock, + GasEstimator +].map(c => c.cache()) + +export const deploySequenceContext = async (owner?: string) => { + const factory = await Factory.deploy() + const mainModuleUpgradable = await MainModuleUpgradable.deploy() + const mainModule = await MainModule.deploy(await factory.getAddress(), await mainModuleUpgradable.getAddress()) + + return { + factory: await factory.waitForDeployment(), + mainModule: await mainModule.waitForDeployment(), + mainModuleUpgradable: await mainModuleUpgradable.waitForDeployment() + } +} + +export type SequenceContext = { + factory: ContractType + mainModule: ContractType + mainModuleUpgradable: ContractType +} diff --git a/packages/wallet/wallet-contracts/test/utils/imposter.ts b/packages/wallet/wallet-contracts/test/utils/imposter.ts new file mode 100644 index 000000000..f8da84b43 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/utils/imposter.ts @@ -0,0 +1,43 @@ +import { ethers } from 'ethers' +import { AnyStaticSigner, StaticSigner } from './wallet' + +export class Imposter extends ethers.AbstractSigner implements StaticSigner { + static random(identity: string | AnyStaticSigner) { + return new Imposter(identity, ethers.Wallet.createRandom()) + } + + constructor( + public identity: string | AnyStaticSigner, + public signer: ethers.Signer + ) { + super() + } + + get address() { + return typeof this.identity === 'string' ? this.identity : this.identity.address + } + + async getAddress(): Promise { + return this.address + } + + signMessage(message: string | Uint8Array): Promise { + return this.signer.signMessage(message) + } + + signTypedData( + domain: ethers.TypedDataDomain, + types: Record, + value: Record + ): Promise { + return this.signer.signTypedData(domain, types, value) + } + + signTransaction(transaction: ethers.TransactionRequest): Promise { + return this.signer.signTransaction(transaction) + } + + connect(provider: ethers.Provider): ethers.Signer { + return this.signer.connect(provider) + } +} diff --git a/packages/wallet/wallet-contracts/test/utils/index.ts b/packages/wallet/wallet-contracts/test/utils/index.ts new file mode 100644 index 000000000..86eab632e --- /dev/null +++ b/packages/wallet/wallet-contracts/test/utils/index.ts @@ -0,0 +1,118 @@ +import * as chai from 'chai' +import chaiAsPromised from 'chai-as-promised' +import chaiString from 'chai-string' +import { ethers } from 'ethers' +import { solidity } from 'ethereum-waffle' +import { ethers as hethers } from 'hardhat' + +export const getChainId = async (): Promise => + process.env.NET_ID ? BigInt(process.env.NET_ID) : (await hethers.provider.getNetwork()).chainId + +export const { assert, expect } = chai.use(chaiString).use(chaiAsPromised).use(solidity) + +export function bytes32toAddress(bytes32: ethers.BytesLike): string { + const paddedValue = ethers.zeroPadValue(bytes32, 32) + return ethers.getAddress(ethers.AbiCoder.defaultAbiCoder().decode(['address'], paddedValue)[0]) +} + +export function shuffle(a: T[]): T[] { + for (let i = a.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)) + ;[a[i], a[j]] = [a[j], a[i]] + } + + return a +} + +export function randomHex(length: number): string { + return ethers.hexlify(ethers.randomBytes(length)) +} + +export async function expectToBeRejected(promise: Promise, error: string) { + if (!process.env.COVERAGE) { + await expect(promise).to.be.rejectedWith(error) + } else { + await expect(promise).to.be.rejected + } +} + +export async function expectStaticToBeRejected(promise: Promise, signature: string, ...args: any[]) { + // await expectToBeRejected(promise, `errorName="${signature.split('(')[0]}"`) + // await expectToBeRejected(promise, `errorSignature="${signature}"`) + + await expectToBeRejected(promise, `${signature.split('(')[0]}`) + + const sigTypes = signature.split('(')[1].split(')')[0].split(',') + + expect(sigTypes.length).to.equal(args.length) + + const formattedArgs = args + .map((arg, i) => { + const type = sigTypes[i] + + if (arg === '*') return '*' + + switch (type) { + case 'bytes': + if (typeof arg === 'string' && arg.length === 0) { + return ethers.hexlify(new Uint8Array([])) + } + return `"${ethers.hexlify(arg).toLowerCase()}"` + case 'string': + return `"${arg.toString()}"` + } + + if (type.startsWith('uint') || type.startsWith('int')) { + //return `{"type":"BigNumber","hex":"${ethers.toBeHex(BigInt(arg))}"}` + return BigInt(arg).toString() + } + + throw new Error(`Unknown type: ${type}`) + }) + .join(', ') + + const groups = formattedArgs.split('*') + + for (let i = 0; i < groups.length; i++) { + await expectToBeRejected(promise, `${groups[i]}`) + } + + // if (groups.length === 1) { + // // await expectToBeRejected(promise, `errorArgs=[${formattedArgs}]`) + // await expectToBeRejected(promise, `${formattedArgs}`) + // } else { + // for (let i = 0; i < groups.length; i++) { + // const group = groups[i] + // if (i === 0) { + // // await expectToBeRejected(promise, `errorArgs=[${group}`) + // await expectToBeRejected(promise, `${group}`) + // } else if (i === groups.length - 1) { + // await expectToBeRejected(promise, `${group}]`) + // } else { + // await expectToBeRejected(promise, `${group}`) + // } + // } + // } +} + +export function encodeError(error: string): string { + return '0x08c379a0' + ethers.AbiCoder.defaultAbiCoder().encode(['string'], [error]).slice(2) +} + +function xor(a: any, b: any) { + if (!Buffer.isBuffer(a)) a = Buffer.from(ethers.getBytes(a)) + if (!Buffer.isBuffer(b)) b = Buffer.from(ethers.getBytes(b)) + return ethers.hexlify(a.map((v: number, i: number) => v ^ b[i])) +} + +export function interfaceIdOf(int: ethers.Interface): string { + const signatures: string[] = [] + int.forEachFunction(fragment => { + signatures.push(getSigHash(fragment)) + }) + return signatures.reduce((p, c) => xor(p, c)) +} + +export function getSigHash(fragment: ethers.FunctionFragment): string { + return ethers.dataSlice(ethers.id(fragment.format('sighash')), 0, 4) +} diff --git a/packages/wallet/wallet-contracts/test/utils/sequence.ts b/packages/wallet/wallet-contracts/test/utils/sequence.ts new file mode 100644 index 000000000..065192ae9 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/utils/sequence.ts @@ -0,0 +1,613 @@ +import { BigNumberish, BytesLike, ethers, Wallet } from 'ethers' +import { getChainId } from '.' + +export const WALLET_CODE = '0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3' + +export enum SignatureType { + Legacy = 0, + Dynamic = 1, + NoChaindDynamic = 2 +} + +export type SignerLeaf = { + address: string + weight: BigNumberish +} + +export type SubdigestLeaf = { + subdigest: string +} + +export type NestedLeaf = { + tree: ConfigTopology + internalThreshold: BigNumberish + externalWeight: BigNumberish +} + +export type ConfigLeaf = SubdigestLeaf | SignerLeaf | NestedLeaf + +export type ImageHashNode = { + left: ConfigTopology + right: ConfigTopology +} + +export type ConfigTopology = ImageHashNode | ConfigLeaf + +export type WalletConfig = { + threshold: ethers.BigNumberish + checkpoint: ethers.BigNumberish + topology: ConfigTopology +} + +export type SimplifiedNestedWalletConfig = { + threshold: ethers.BigNumberish + weight: ethers.BigNumberish + signers: SimplifiedConfigMember[] +} + +export type SimplifiedWalletConfig = { + threshold: BigNumberish + checkpoint: BigNumberish + signers: SimplifiedConfigMember[] +} + +export type SimplifiedConfigMember = SignerLeaf | SimplifiedNestedWalletConfig + +export type Transaction = { + delegateCall: boolean + revertOnError: boolean + gasLimit: BigNumberish + target: string + value: BigNumberish + data: BytesLike +} + +export enum SignaturePartType { + Signature = 0, + Address = 1, + Dynamic = 2, + Node = 3, + Branch = 4, + Subdigest = 5, + Nested = 6 +} + +export type SignaturePart = { + address: string + type: SignaturePartType + signature?: string +} + +export function applyTxDefault( + tx: Partial, + def: Transaction = { + delegateCall: false, + revertOnError: true, + gasLimit: 0, + target: '0xFb8356E7deB64034aBE2b2a8A732634f77A2DAE4', // Random address + value: 0, + data: new Uint8Array([]) + } +): Transaction { + return { + ...def, + ...tx + } +} + +export function applyTxDefaults(tx: Partial[], def?: Transaction): Transaction[] { + return tx.map(t => applyTxDefault(t, def)) +} + +export const MetaTransactionsSolidityType = `tuple( + bool delegateCall, + bool revertOnError, + uint256 gasLimit, + address target, + uint256 value, + bytes data +)[]` + +export function isConfigLeaf(node: ConfigTopology): node is ConfigLeaf { + return !('left' in node || 'right' in node) +} + +export function isSignerLeaf(node: any): node is SignerLeaf { + return isConfigLeaf(node) && 'weight' in node && 'address' in node +} + +export function isSubdigestLeaf(node: ConfigTopology): node is SubdigestLeaf { + return isConfigLeaf(node) && 'subdigest' in node +} + +export function isNestedLeaf(node: ConfigTopology): node is NestedLeaf { + return isConfigLeaf(node) && 'tree' in node +} + +export function legacyTopology(leavesOrConfig: SimplifiedWalletConfig | ConfigTopology[]): ConfigTopology { + if (!Array.isArray(leavesOrConfig)) { + return legacyTopology(toTopology(leavesOrConfig)) + } + + return leavesOrConfig.reduce((acc, leaf) => { + return { + left: acc, + right: leaf + } + }) +} + +export function toTopology(config: SimplifiedWalletConfig | SimplifiedNestedWalletConfig): ConfigTopology[] { + return config.signers.map(s => { + if (isSignerLeaf(s)) { + return { + address: s.address, + weight: s.weight + } + } + + return { + tree: merkleTopology(toTopology(s)), + internalThreshold: s.threshold, + externalWeight: s.weight + } + }) +} + +export function merkleTopology(leavesOrConfig: SimplifiedWalletConfig | ConfigTopology[]): ConfigTopology { + if (!Array.isArray(leavesOrConfig)) { + return merkleTopology(toTopology(leavesOrConfig)) + } + + const leaves = leavesOrConfig + for (let s = leaves.length; s > 1; s = s / 2) { + for (let i = 0; i < s / 2; i++) { + const j1 = i * 2 + const j2 = j1 + 1 + + if (j2 >= s) { + leaves[i] = leaves[j1] + } else { + leaves[i] = { + left: leaves[j1], + right: leaves[j2] + } + } + } + } + + return leaves[0] +} + +export function optimize2SignersTopology(config: SimplifiedWalletConfig): ConfigTopology { + if (config.signers.length > 8) { + return merkleTopology(config) + } + + return legacyTopology(config) +} + +export function leavesOf(topology: ConfigTopology): ConfigLeaf[] { + if (isConfigLeaf(topology)) { + return [topology] + } + + return [...leavesOf(topology.left), ...leavesOf(topology.right)] +} + +export function subdigestLeaves(topology: ConfigTopology): string[] { + return leavesOf(topology) + .filter(l => isSubdigestLeaf(l)) + .map((l: SubdigestLeaf) => l.subdigest) +} + +export function toSimplifiedConfig(config: WalletConfig): SimplifiedWalletConfig { + let leaves = leavesOf(config.topology).filter(isSignerLeaf) + + return { + threshold: config.threshold, + checkpoint: config.checkpoint, + signers: leaves.map(l => ({ + weight: l.weight, + address: l.address + })) + } +} + +export function hashNode(node: ConfigTopology): string { + if (isSignerLeaf(node)) { + return leafForAddressAndWeight(node.address, node.weight) + } + + if (isSubdigestLeaf(node)) { + return ethers.solidityPackedKeccak256(['string', 'bytes32'], ['Sequence static digest:\n', node.subdigest]) + } + + if (isNestedLeaf(node)) { + return ethers.solidityPackedKeccak256( + ['string', 'bytes32', 'uint256', 'uint256'], + ['Sequence nested config:\n', hashNode(node.tree), node.internalThreshold, node.externalWeight] + ) + } + + return ethers.solidityPackedKeccak256(['bytes32', 'bytes32'], [hashNode(node.left), hashNode(node.right)]) +} + +export function imageHash2(threshold: ethers.BigNumberish, topology: ConfigTopology): string { + const root = hashNode(topology) + return ethers.keccak256(ethers.solidityPacked(['bytes32', 'uint256'], [root, threshold])) +} + +export function printTopology(topology: ConfigTopology, threshold?: ethers.BigNumberish, inverse = false): string[] { + if (threshold) { + const imageHash = imageHash2(threshold, topology) + + const result: string[] = [`imageHash: ${imageHash}`] + const signers = printTopology(topology, undefined, inverse) + result.push(` ├─ threshold: ${threshold}`) + for (let i = 0; i < signers.length; i++) { + const prefix = i === 0 ? ' └─ ' : ' ' + result.push(`${prefix}${signers[i]}`) + } + + return result + } + + if (isSignerLeaf(topology)) { + return [`weight: ${topology.weight} - address: ${topology.address}`] + } + + if (isSubdigestLeaf(topology)) { + return [`subdigest: ${topology.subdigest}`] + } + + if (isNestedLeaf(topology)) { + const result: string[] = [`internalThreshold: ${topology.internalThreshold} - externalWeight: ${topology.externalWeight}`] + const signers = printTopology(topology.tree, undefined, inverse) + for (let i = 0; i < signers.length; i++) { + const prefix = i === 0 ? '└─ ' : ' ' + result.push(`${prefix}${signers[i]}`) + } + + return result + } + + const root = hashNode(topology) + let printLeft = printTopology(topology.left, undefined, inverse) + let printRight = printTopology(topology.right, undefined, inverse) + + if (inverse) { + ;[printLeft, printRight] = [printRight, printLeft] + } + + const result = [`${root}`] + for (let i = 0; i < printLeft.length; i++) { + const prefix = i === 0 ? ' ├─ ' : ' │' + result.push(`${prefix}${printLeft[i]}`) + } + + for (let i = 0; i < printRight.length; i++) { + const prefix = i === 0 ? ' └─ ' : ' ' + result.push(`${prefix}${printRight[i]}`) + } + + return result +} + +export function addressOf(factory: string, firstModule: string, imageHash: string): string { + const codeHash = ethers.keccak256( + ethers.solidityPacked(['bytes', 'bytes32'], [WALLET_CODE, ethers.zeroPadValue(firstModule, 32)]) + ) + + const hash = ethers.keccak256( + ethers.solidityPacked(['bytes1', 'address', 'bytes32', 'bytes32'], ['0xff', factory, imageHash, codeHash]) + ) + + return ethers.getAddress(ethers.dataSlice(hash, 12)) +} + +export function encodeNonce(space: BigNumberish, nonce: BigNumberish) { + return BigInt(ethers.solidityPacked(['uint160', 'uint96'], [space, nonce])) +} + +export function leafForAddressAndWeight(address: string, weight: ethers.BigNumberish) { + return ethers.solidityPacked(['uint96', 'address'], [weight, address]) +} + +export function imageHash(config: WalletConfig): string { + const signersRoot = hashNode(config.topology) + + const preImageHash = ethers.keccak256( + ethers.AbiCoder.defaultAbiCoder().encode(['bytes32', 'uint256'], [signersRoot, config.threshold]) + ) + + return ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode(['bytes32', 'uint256'], [preImageHash, config.checkpoint])) +} + +export function digestOf(txs: Partial[], nonce: ethers.BigNumberish) { + return ethers.keccak256( + ethers.AbiCoder.defaultAbiCoder().encode(['uint256', MetaTransactionsSolidityType], [nonce, applyTxDefaults(txs)]) + ) +} + +export async function subdigestOf(wallet: string, digest: ethers.BytesLike, chainId?: ethers.BigNumberish) { + chainId = chainId ?? (await getChainId()) + return ethers.keccak256( + ethers.solidityPacked(['string', 'uint256', 'address', 'bytes32'], ['\x19\x01', chainId, wallet, digest]) + ) +} + +export function computeStorageKey(key: string, subkey?: string): string { + if (!subkey) { + return ethers.id(key) + } + + return ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode(['bytes32', 'bytes32'], [computeStorageKey(key), subkey])) +} + +export type EncodingOptions = { + forceDynamicEncoding?: boolean + signatureType?: SignatureType + disableTrim?: boolean +} + +function leftSlice(topology: ConfigTopology): ConfigTopology[] { + // Returns left side of the tree + let stack: ConfigTopology[] = [] + + let prev = topology + while (!isConfigLeaf(prev)) { + stack.unshift(prev.right) + prev = prev.left + } + + stack.unshift(prev) + + return stack +} + +type DecodedSignatureMember = { + weight?: ethers.BigNumberish + address?: string + type: SignaturePartType + value?: string + innerThreshold?: ethers.BigNumberish +} + +export class SignatureConstructor { + private members: DecodedSignatureMember[] = [] + + constructor(public disableTrim = false) {} + + tryTrim(): void { + if (this.disableTrim) return + + // Can only trim when we have two members + if (this.members.length !== 2) return + + // There are 4 valid trim options: + // 1. Trim the first addr, second is node + // 2. Trim the first node, second is addr + // 3. Trim the first addr, second is addr + // 4. Trim the first node, second is node + + const first = this.members[0] + const second = this.members[1] + + if (first.type !== SignaturePartType.Address && first.type !== SignaturePartType.Node) return + if (second.type !== SignaturePartType.Address && second.type !== SignaturePartType.Node) return + + const firstNode = + first.type === SignaturePartType.Address ? leafForAddressAndWeight(first.address!, first.weight!) : first.value + const secondNode = + second.type === SignaturePartType.Address ? leafForAddressAndWeight(second.address!, second.weight!) : second.value + + const nextNode = ethers.keccak256(ethers.solidityPacked(['bytes32', 'bytes32'], [firstNode, secondNode])) + + this.members = [ + { + type: SignaturePartType.Node, + value: nextNode + } + ] + } + + appendPart(weight: ethers.BigNumberish, part: SignaturePart) { + switch (part.type) { + case SignaturePartType.Address: + this.members.push({ weight, address: part.address, type: SignaturePartType.Address }) + break + + case SignaturePartType.Signature: + this.members.push({ weight, address: part.address, type: SignaturePartType.Signature, value: part.signature }) + break + + case SignaturePartType.Dynamic: + this.members.push({ weight, address: part.address, type: SignaturePartType.Dynamic, value: part.signature }) + break + + default: + throw new Error(`Unknown signature part type: ${part.type}`) + } + + this.tryTrim() + } + + appendNode(node: string) { + this.members.push({ type: SignaturePartType.Node, value: node }) + this.tryTrim() + } + + appendBranch(branch: string) { + this.members.push({ type: SignaturePartType.Branch, value: branch }) + } + + appendSubdigest(subdigest: string) { + this.members.push({ type: SignaturePartType.Subdigest, value: subdigest }) + } + + appendNested(branch: string, weight: ethers.BigNumberish, innerThreshold: ethers.BigNumberish) { + this.members.push({ type: SignaturePartType.Nested, value: branch, innerThreshold, weight }) + } + + encode(): string { + let result = '0x' + + for (const member of this.members) { + switch (member.type) { + case SignaturePartType.Address: + result = ethers.solidityPacked( + ['bytes', 'uint8', 'uint8', 'address'], + [result, SignaturePartType.Address, member.weight, member.address] + ) + break + + case SignaturePartType.Signature: + result = ethers.solidityPacked( + ['bytes', 'uint8', 'uint8', 'bytes'], + [result, SignaturePartType.Signature, member.weight, member.value] + ) + break + + case SignaturePartType.Dynamic: + const signature = ethers.getBytes(member.value ?? new Uint8Array([])) + result = ethers.solidityPacked( + ['bytes', 'uint8', 'uint8', 'address', 'uint24', 'bytes'], + [result, SignaturePartType.Dynamic, member.weight, member.address, signature.length, signature] + ) + break + + case SignaturePartType.Node: + result = ethers.solidityPacked(['bytes', 'uint8', 'bytes32'], [result, SignaturePartType.Node, member.value]) + break + + case SignaturePartType.Branch: + const branch = ethers.getBytes(member.value ?? new Uint8Array([])) + result = ethers.solidityPacked( + ['bytes', 'uint8', 'uint24', 'bytes'], + [result, SignaturePartType.Branch, branch.length, branch] + ) + break + + case SignaturePartType.Subdigest: + result = ethers.solidityPacked(['bytes', 'uint8', 'bytes32'], [result, SignaturePartType.Subdigest, member.value]) + break + + case SignaturePartType.Nested: + const nestedBranch = ethers.getBytes(member.value ?? new Uint8Array([])) + result = ethers.solidityPacked( + ['bytes', 'uint8', 'uint8', 'uint16', 'uint24', 'bytes'], + [result, SignaturePartType.Nested, member.weight, member.innerThreshold, nestedBranch.length, nestedBranch] + ) + break + + default: + throw new Error(`Unknown signature part type: ${member.type}`) + } + } + + return result + } +} + +export function encodeSigners( + topology: ConfigTopology, + parts: SignaturePart[] | Map, + subdigests: string[], + options?: EncodingOptions +): { encoded: string; weight: bigint } { + // Map part to signers + if (Array.isArray(parts)) { + const partOfSigner = new Map() + for (const part of parts) { + partOfSigner.set(part.address, part) + } + return encodeSigners(topology, partOfSigner, subdigests, options) + } + + const slice = leftSlice(topology) + let weight = 0n + + const constructor = new SignatureConstructor(options?.disableTrim) + for (const node of slice) { + if (!isConfigLeaf(node)) { + // If the node opens up to another branch + // we recurse the encoding, and if the result has any weight + // we have to embed the whole branch, otherwise we just add the node + const nested = encodeSigners(node, parts, subdigests, options) + if (nested.weight === 0n && !options?.disableTrim) { + constructor.appendNode(hashNode(node)) + } else { + constructor.appendBranch(nested.encoded) + weight = weight + nested.weight + } + } else { + if (isSignerLeaf(node)) { + // If the node is a signer leaf, we can just add the member + const part = parts.get(node.address) ?? { type: SignaturePartType.Address, address: node.address } + if (part.type !== SignaturePartType.Address) { + weight = weight + BigInt(node.weight) + } + + constructor.appendPart(node.weight, part) + } else if (isNestedLeaf(node)) { + // If the node opens up to another branch + // we recurse the encoding, and if the result has any weight + // we have to embed the whole branch, otherwise we just add the node + const nested = encodeSigners(node.tree, parts, subdigests, options) + if (nested.weight === 0n && !options?.disableTrim) { + constructor.appendNode(hashNode(node)) + } else { + // Nested configs only have weight if the inner threshold is met + // and the weight is always the external weight + if (nested.weight >= BigInt(node.internalThreshold)) { + weight = weight + BigInt(node.externalWeight) + } + + constructor.appendNested(nested.encoded, node.externalWeight, node.internalThreshold) + } + } else { + // If the node is a subdigest add the node (unless it's an static subdigest signature) + if (subdigests.includes(node.subdigest)) { + weight += 2n ** 256n - 1n + constructor.appendSubdigest(node.subdigest) + } else { + constructor.appendNode(hashNode(node)) + } + } + } + } + + return { + encoded: constructor.encode(), + weight + } +} + +export function encodeSignature( + config: WalletConfig, + parts: SignaturePart[] | Map, + subdigests: string[], + options?: EncodingOptions +) { + const encodedSigners = encodeSigners(config.topology, parts, subdigests, options) + + switch (options?.signatureType || SignatureType.Legacy) { + case SignatureType.Dynamic: + return ethers.solidityPacked( + ['uint8', 'uint16', 'uint32', 'bytes'], + [SignatureType.Dynamic, config.threshold, config.checkpoint, encodedSigners.encoded] + ) + case SignatureType.NoChaindDynamic: + return ethers.solidityPacked( + ['uint8', 'uint16', 'uint32', 'bytes'], + [SignatureType.NoChaindDynamic, config.threshold, config.checkpoint, encodedSigners.encoded] + ) + default: + case SignatureType.Legacy: + return ethers.solidityPacked( + ['uint8', 'uint8', 'uint32', 'bytes'], + [SignatureType.Legacy, config.threshold, config.checkpoint, encodedSigners.encoded] + ) + } +} diff --git a/packages/wallet/wallet-contracts/test/utils/wallet.ts b/packages/wallet/wallet-contracts/test/utils/wallet.ts new file mode 100644 index 000000000..110da5508 --- /dev/null +++ b/packages/wallet/wallet-contracts/test/utils/wallet.ts @@ -0,0 +1,329 @@ +import { ethers, Overrides } from 'ethers' +import { ethers as hethers } from 'hardhat' +import { shuffle } from '.' +import { MainModule, MainModuleUpgradable, SequenceContext } from './contracts' +import { + addressOf, + applyTxDefaults, + ConfigTopology, + digestOf, + encodeSignature, + EncodingOptions, + imageHash, + merkleTopology, + optimize2SignersTopology, + SignaturePartType, + SignatureType, + SimplifiedWalletConfig, + subdigestOf, + Transaction, + WalletConfig +} from './sequence' + +export type StaticSigner = ethers.Signer & { address: string } +export type AnyStaticSigner = StaticSigner | SequenceWallet + +export function isAnyStaticSigner(s: any): s is AnyStaticSigner { + return s.address !== undefined +} + +let LAST_CHECKPOINT = 0 + +export function getCheckpoint() { + let cand = Math.floor(Date.now() / 1000) + + if (cand === LAST_CHECKPOINT) { + cand++ + } + + LAST_CHECKPOINT = cand + return cand +} + +export type WalletOptions = { + context: SequenceContext + config: WalletConfig + address?: string + signers: (ethers.Signer | SequenceWallet)[] + encodingOptions?: EncodingOptions + chainId?: ethers.BigNumberish +} + +export type BasicWalletOptions = { + address?: string + threshold?: number + signing: number | number[] + idle: number | number[] + encodingOptions?: EncodingOptions + topologyConverter: (simple: SimplifiedWalletConfig) => ConfigTopology +} + +export type DetailedWalletOptions = { + address?: string + threshold: ethers.BigNumberish + signers: (string | AnyStaticSigner | Weighted | Weighted)[] + encodingOptions?: EncodingOptions +} + +export type Weighted = { weight: number; value: T } + +export function isWeighted(w: any): w is Weighted { + return w.weight !== undefined && w.value !== undefined +} + +export function weightedVal(w: Weighted | T): T { + return isWeighted(w) ? w.value : w +} + +export function isSequenceSigner(signer: ethers.Signer | SequenceWallet): signer is SequenceWallet { + return 'isSequence' in signer && signer.isSequence +} + +const defaultTopology = optimize2SignersTopology + +export class SequenceWallet { + public isSequence = true + _isSigner: boolean = true + + constructor(public options: WalletOptions) {} + + static basicWallet(context: SequenceContext, opts?: Partial): SequenceWallet { + const options = { ...{ signing: 1, idle: 0, topologyConverter: defaultTopology }, ...opts } + + const signersWeight = Array.isArray(options.signing) ? options.signing : new Array(options.signing).fill(0).map(() => 1) + const idleWeight = Array.isArray(options.idle) ? options.idle : new Array(options.idle).fill(0).map(() => 1) + + const signers = signersWeight.map(s => (isAnyStaticSigner(s) ? s : ethers.Wallet.createRandom())) + const idle = idleWeight.map(() => ethers.getAddress(ethers.hexlify(ethers.randomBytes(20)))) + const checkpoint = getCheckpoint() + + const simplifiedConfig = { + checkpoint, + threshold: options.threshold ? options.threshold : signers.length, + signers: shuffle( + signers + .map((s, i) => ({ + address: s.address, + weight: signersWeight[i] + })) + .concat( + idle.map((s, i) => ({ + address: s, + weight: idleWeight[i] + })) + ) + ) + } + + return new SequenceWallet({ + address: options.address, + context, + encodingOptions: options.encodingOptions, + config: { + ...simplifiedConfig, + topology: options.topologyConverter(simplifiedConfig) + }, + signers: signers + }) + } + + static detailedWallet(context: SequenceContext, opts: DetailedWalletOptions): SequenceWallet { + const simplifiedConfig = { + threshold: opts.threshold, + checkpoint: getCheckpoint(), + signers: opts.signers.map(s => ({ + weight: isWeighted(s) ? s.weight : 1, + address: (() => { + const v = weightedVal(s) + return isAnyStaticSigner(v) ? v.address : v + })() + })) + } + + return new SequenceWallet({ + context, + encodingOptions: opts.encodingOptions, + address: opts.address, + config: { + ...simplifiedConfig, + topology: defaultTopology(simplifiedConfig) + }, + signers: opts.signers.map(s => weightedVal(s)).filter(isAnyStaticSigner) + }) + } + + useAddress(address?: string) { + return new SequenceWallet({ ...this.options, address: address ? address : this.address }) + } + + useConfig(of: SequenceWallet | WalletConfig) { + const config = 'config' in of ? of.config : of + return new SequenceWallet({ ...this.options, config }) + } + + useSigners(signers: (ethers.Signer | SequenceWallet)[] | ethers.Signer | SequenceWallet) { + return new SequenceWallet({ ...this.options, signers: Array.isArray(signers) ? signers : [signers] }) + } + + useEncodingOptions(encodingOptions?: EncodingOptions) { + return new SequenceWallet({ ...this.options, encodingOptions }) + } + + useChainId(chainId?: ethers.BigNumberish) { + return new SequenceWallet({ ...this.options, chainId }) + } + + get config() { + return this.options.config + } + + get signers() { + return this.options.signers + } + + get address() { + if (this.options.address) return this.options.address + return addressOf( + this.options.context.factory.target as string, + this.options.context.mainModule.target as string, + this.imageHash + ) + } + + getAddress() { + return this.address + } + + get imageHash() { + return imageHash(this.config) + } + + get mainModule() { + return MainModule.attach(this.address) + } + + get mainModuleUpgradable() { + return MainModuleUpgradable.attach(this.address) + } + + async deploy() { + if ((await hethers.provider.getCode(this.address)) !== '0x') { + return + } + + return await this.options.context.factory.deploy(await this.options.context.mainModule.getAddress(), this.imageHash) + } + + async getNonce(space: ethers.BigNumberish = 0) { + return this.mainModule.readNonce(space) + } + + async updateImageHash(input: ethers.BytesLike | WalletConfig): Promise { + if (!ethers.isBytesLike(input)) return this.updateImageHash(imageHash(input)) + + return this.sendTransactions([ + { + target: this.address, + data: this.options.context.mainModule.interface.encodeFunctionData('updateImageHash', [input]) + } + ]) + } + + async addExtraImageHash( + input: ethers.BytesLike | WalletConfig, + expiration: ethers.BigNumberish = 2n ** 248n + ): Promise { + if (!ethers.isBytesLike(input)) return this.addExtraImageHash(imageHash(input)) + + return this.sendTransactions([ + { + target: this.address, + data: this.options.context.mainModule.interface.encodeFunctionData('setExtraImageHash', [input, expiration]) + } + ]) + } + + async clearExtraImageHashes(imageHashes: (ethers.BytesLike | WalletConfig)[]) { + return this.sendTransactions([ + { + target: this.address, + data: this.options.context.mainModule.interface.encodeFunctionData('clearExtraImageHashes', [ + imageHashes.map(h => (ethers.isBytesLike(h) ? h : imageHash(h))) + ]) + } + ]) + } + + async signMessage(message: ethers.BytesLike): Promise { + return this.signDigest(ethers.keccak256(ethers.getBytes(message))) + } + + async signDigest(digest: ethers.BytesLike): Promise { + const subdigest = ethers.getBytes(await subdigestOf(this.address, digest, this.options.chainId)) + return this.signSubdigest(subdigest) + } + + staticSubdigestSign(subdigest: ethers.BytesLike, useNoChainId = true): string { + const signatureType = useNoChainId ? SignatureType.NoChaindDynamic : this.options.encodingOptions?.signatureType + return encodeSignature(this.config, [], [ethers.hexlify(subdigest)], { ...this.options.encodingOptions, signatureType }) + } + + async signSubdigest(subdigest: ethers.BytesLike): Promise { + const sigParts = await Promise.all( + this.signers.map(async s => { + if (isSequenceSigner(s)) { + return { + address: s.address, + signature: await s.signDigest(subdigest).then(s => s + '03'), + type: SignaturePartType.Dynamic + } + } + + return { + address: await s.getAddress(), + signature: await s.signMessage(subdigest).then(s => s + '02'), + type: SignaturePartType.Signature + } + }) + ) + + return encodeSignature(this.config, sigParts, [], this.options.encodingOptions) + } + + async signTransactions(ptxs: Partial[], nonce?: ethers.BigNumberish): Promise { + if (nonce === undefined) return this.signTransactions(ptxs, await this.getNonce()) + + const txs = applyTxDefaults(ptxs) + const digest = digestOf(txs, nonce) + + return this.signDigest(digest) + } + + async relayTransactions( + ptxs: Partial[], + signature: string, + nonce?: ethers.BigNumberish, + overrides: Overrides & { from?: string | Promise } = {} + ): Promise { + if (nonce === undefined) { + return this.relayTransactions(ptxs, signature, await this.getNonce(), overrides) + } + + const txs = applyTxDefaults(ptxs) + + return this.mainModule.execute(txs, nonce, signature, overrides) + } + + async sendTransactions( + ptxs: Partial[], + nonce?: ethers.BigNumberish, + overrides?: Overrides & { from?: string | Promise } + ): Promise { + if (nonce === undefined) return this.sendTransactions(ptxs, await this.getNonce(), overrides) + + const txs = applyTxDefaults(ptxs) + const signature = await this.signTransactions(txs, nonce) + + return this.relayTransactions(txs, signature, nonce, overrides) + } +} diff --git a/packages/wallet/wallet-contracts/tsconfig.json b/packages/wallet/wallet-contracts/tsconfig.json new file mode 100644 index 000000000..c6725543c --- /dev/null +++ b/packages/wallet/wallet-contracts/tsconfig.json @@ -0,0 +1,37 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "downlevelIteration": true, + "removeComments": false, + "skipLibCheck": true, + + "strictNullChecks": true, + "noImplicitUseStrict": true, + "noImplicitAny": false, + "noImplicitReturns": true, + "noImplicitThis": true, + "noUnusedParameters": false, + "noErrorTruncation": true, + "esModuleInterop": true, + + "experimentalDecorators": true, + "forceConsistentCasingInFileNames": true, + "allowJs": false, + "checkJs": false, + + "baseUrl": ".", + "outDir": "build", + "lib": ["es2020", "dom"], + + "typeRoots": ["./node_modules/@types"] + }, + + "include": ["./hardhat.config.ts", "typings", "tests", "utils", "test"], + + "exclude": ["node_modules", "dist"] +} diff --git a/packages/wallet/wallet-contracts/typings/chai-bignumber.d.ts b/packages/wallet/wallet-contracts/typings/chai-bignumber.d.ts new file mode 100644 index 000000000..8a0080c8c --- /dev/null +++ b/packages/wallet/wallet-contracts/typings/chai-bignumber.d.ts @@ -0,0 +1,16 @@ +/// + +declare module 'chai-bignumber' { + function chaiBignumber(bignumber: any): (chai: any, utils: any) => void + + namespace chaiBignumber {} + + export = chaiBignumber +} + +declare namespace Chai { + // For BDD API + interface Assertion extends LanguageChains, NumericComparison, TypeComparison { + bignumber: Assertion + } +} diff --git a/packages/wallet/wallet-contracts/typings/chai-bn.ts b/packages/wallet/wallet-contracts/typings/chai-bn.ts new file mode 100644 index 000000000..fdf499cd1 --- /dev/null +++ b/packages/wallet/wallet-contracts/typings/chai-bn.ts @@ -0,0 +1,19 @@ +/* eslint-disable */ +/// + +declare module 'chai-bn' { + function chaiBN(bignumber: any): (chai: any, utils: any) => void + + namespace chaiBN {} + + export = chaiBN +} + +declare namespace Chai { + interface Equal { + BN: any + } + interface NumberComparer { + BN: any + } +} diff --git a/packages/wallet/wallet-contracts/typings/truffle.d.ts b/packages/wallet/wallet-contracts/typings/truffle.d.ts new file mode 100644 index 000000000..360a1a7c6 --- /dev/null +++ b/packages/wallet/wallet-contracts/typings/truffle.d.ts @@ -0,0 +1,12 @@ +declare module 'truffle' { + import * as truffle from 'truffle-contract' + + interface ArtifactsGlobal { + require(name: string): truffle.TruffleContract + } + + global { + function contract(name: string, callback: (accounts: Array) => void): void + const artifacts: ArtifactsGlobal + } +} diff --git a/packages/wallet/wallet-contracts/utils/JsonBindings.sol b/packages/wallet/wallet-contracts/utils/JsonBindings.sol new file mode 100644 index 000000000..790682614 --- /dev/null +++ b/packages/wallet/wallet-contracts/utils/JsonBindings.sol @@ -0,0 +1,193 @@ +// Automatically generated by forge bind-json. + +pragma solidity >=0.6.2 <0.9.0; +pragma experimental ABIEncoderV2; + +import {MainModuleGasEstimation} from "contracts/modules/MainModuleGasEstimation.sol"; +import {IModuleCalls} from "contracts/modules/commons/interfaces/IModuleCalls.sol"; +import {ModuleCallsTest} from "foundry_test/modules/commons/ModuleCalls.t.sol"; +import {ModuleExtraAuthTest} from "foundry_test/modules/commons/ModuleExtraAuth.t.sol"; +import {SequenceChainedSigImp, SequenceChainedSigTest} from "foundry_test/modules/commons/submodules/auth/SequenceChainedSig.t.sol"; +import {L2CompressorHuffTest} from "foundry_test/modules/utils/L2CompressorHuff.t.sol"; +import {TrustTest} from "foundry_test/trust/Trust.t.sol"; + +interface Vm { + function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory); + function parseJsonType(string calldata json, string calldata typeDescription) external pure returns (bytes memory); + function parseJsonType(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory); + function serializeJsonType(string calldata typeDescription, bytes memory value) external pure returns (string memory json); + function serializeJsonType(string calldata objectKey, string calldata valueKey, string calldata typeDescription, bytes memory value) external returns (string memory json); +} + +library JsonBindings { + Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + string constant schema_Transaction = "Transaction(bool delegateCall,bool revertOnError,uint256 gasLimit,address target,uint256 value,bytes data)"; + string constant schema_SimulateResult = "SimulateResult(bool executed,bool succeeded,bytes result,uint256 gasUsed)"; + string constant schema_ToValAndData = "ToValAndData(address target,uint256 value,bytes data)"; + string constant schema_SetIh = "SetIh(bytes32 imageHash,uint256 expiration)"; + string constant schema_MockedSignature = "MockedSignature(bool exists,uint256 threshold,uint256 weight,bytes32 imageHash,bytes32 subdigest,uint256 checkpoint)"; + string constant schema_HashAndSignature = "HashAndSignature(bytes32 imageHash,uint256 threshold,uint256 weight,uint56 checkpointDelta,bytes signature)"; + string constant schema_BatchMember = "BatchMember(Transaction[] txs,uint160 space,uint96 nonce,bytes signature)Transaction(bool delegateCall,bool revertOnError,uint256 gasLimit,address target,uint256 value,bytes data)"; + string constant schema_MemoryStruct1 = "MemoryStruct1(bytes32 rawHash,bytes32 finalHash,uint8 v,bytes32 r,bytes32 s)"; + + function serialize(IModuleCalls.Transaction memory value) internal pure returns (string memory) { + return vm.serializeJsonType(schema_Transaction, abi.encode(value)); + } + + function serialize(IModuleCalls.Transaction memory value, string memory objectKey, string memory valueKey) internal returns (string memory) { + return vm.serializeJsonType(objectKey, valueKey, schema_Transaction, abi.encode(value)); + } + + function deserializeTransaction(string memory json) public pure returns (IModuleCalls.Transaction memory) { + return abi.decode(vm.parseJsonType(json, schema_Transaction), (IModuleCalls.Transaction)); + } + + function deserializeTransaction(string memory json, string memory path) public pure returns (IModuleCalls.Transaction memory) { + return abi.decode(vm.parseJsonType(json, path, schema_Transaction), (IModuleCalls.Transaction)); + } + + function deserializeTransactionArray(string memory json, string memory path) public pure returns (IModuleCalls.Transaction[] memory) { + return abi.decode(vm.parseJsonTypeArray(json, path, schema_Transaction), (IModuleCalls.Transaction[])); + } + + function serialize(MainModuleGasEstimation.SimulateResult memory value) internal pure returns (string memory) { + return vm.serializeJsonType(schema_SimulateResult, abi.encode(value)); + } + + function serialize(MainModuleGasEstimation.SimulateResult memory value, string memory objectKey, string memory valueKey) internal returns (string memory) { + return vm.serializeJsonType(objectKey, valueKey, schema_SimulateResult, abi.encode(value)); + } + + function deserializeSimulateResult(string memory json) public pure returns (MainModuleGasEstimation.SimulateResult memory) { + return abi.decode(vm.parseJsonType(json, schema_SimulateResult), (MainModuleGasEstimation.SimulateResult)); + } + + function deserializeSimulateResult(string memory json, string memory path) public pure returns (MainModuleGasEstimation.SimulateResult memory) { + return abi.decode(vm.parseJsonType(json, path, schema_SimulateResult), (MainModuleGasEstimation.SimulateResult)); + } + + function deserializeSimulateResultArray(string memory json, string memory path) public pure returns (MainModuleGasEstimation.SimulateResult[] memory) { + return abi.decode(vm.parseJsonTypeArray(json, path, schema_SimulateResult), (MainModuleGasEstimation.SimulateResult[])); + } + + function serialize(ModuleCallsTest.ToValAndData memory value) internal pure returns (string memory) { + return vm.serializeJsonType(schema_ToValAndData, abi.encode(value)); + } + + function serialize(ModuleCallsTest.ToValAndData memory value, string memory objectKey, string memory valueKey) internal returns (string memory) { + return vm.serializeJsonType(objectKey, valueKey, schema_ToValAndData, abi.encode(value)); + } + + function deserializeToValAndData(string memory json) public pure returns (ModuleCallsTest.ToValAndData memory) { + return abi.decode(vm.parseJsonType(json, schema_ToValAndData), (ModuleCallsTest.ToValAndData)); + } + + function deserializeToValAndData(string memory json, string memory path) public pure returns (ModuleCallsTest.ToValAndData memory) { + return abi.decode(vm.parseJsonType(json, path, schema_ToValAndData), (ModuleCallsTest.ToValAndData)); + } + + function deserializeToValAndDataArray(string memory json, string memory path) public pure returns (ModuleCallsTest.ToValAndData[] memory) { + return abi.decode(vm.parseJsonTypeArray(json, path, schema_ToValAndData), (ModuleCallsTest.ToValAndData[])); + } + + function serialize(ModuleExtraAuthTest.SetIh memory value) internal pure returns (string memory) { + return vm.serializeJsonType(schema_SetIh, abi.encode(value)); + } + + function serialize(ModuleExtraAuthTest.SetIh memory value, string memory objectKey, string memory valueKey) internal returns (string memory) { + return vm.serializeJsonType(objectKey, valueKey, schema_SetIh, abi.encode(value)); + } + + function deserializeSetIh(string memory json) public pure returns (ModuleExtraAuthTest.SetIh memory) { + return abi.decode(vm.parseJsonType(json, schema_SetIh), (ModuleExtraAuthTest.SetIh)); + } + + function deserializeSetIh(string memory json, string memory path) public pure returns (ModuleExtraAuthTest.SetIh memory) { + return abi.decode(vm.parseJsonType(json, path, schema_SetIh), (ModuleExtraAuthTest.SetIh)); + } + + function deserializeSetIhArray(string memory json, string memory path) public pure returns (ModuleExtraAuthTest.SetIh[] memory) { + return abi.decode(vm.parseJsonTypeArray(json, path, schema_SetIh), (ModuleExtraAuthTest.SetIh[])); + } + + function serialize(SequenceChainedSigImp.MockedSignature memory value) internal pure returns (string memory) { + return vm.serializeJsonType(schema_MockedSignature, abi.encode(value)); + } + + function serialize(SequenceChainedSigImp.MockedSignature memory value, string memory objectKey, string memory valueKey) internal returns (string memory) { + return vm.serializeJsonType(objectKey, valueKey, schema_MockedSignature, abi.encode(value)); + } + + function deserializeMockedSignature(string memory json) public pure returns (SequenceChainedSigImp.MockedSignature memory) { + return abi.decode(vm.parseJsonType(json, schema_MockedSignature), (SequenceChainedSigImp.MockedSignature)); + } + + function deserializeMockedSignature(string memory json, string memory path) public pure returns (SequenceChainedSigImp.MockedSignature memory) { + return abi.decode(vm.parseJsonType(json, path, schema_MockedSignature), (SequenceChainedSigImp.MockedSignature)); + } + + function deserializeMockedSignatureArray(string memory json, string memory path) public pure returns (SequenceChainedSigImp.MockedSignature[] memory) { + return abi.decode(vm.parseJsonTypeArray(json, path, schema_MockedSignature), (SequenceChainedSigImp.MockedSignature[])); + } + + function serialize(SequenceChainedSigTest.HashAndSignature memory value) internal pure returns (string memory) { + return vm.serializeJsonType(schema_HashAndSignature, abi.encode(value)); + } + + function serialize(SequenceChainedSigTest.HashAndSignature memory value, string memory objectKey, string memory valueKey) internal returns (string memory) { + return vm.serializeJsonType(objectKey, valueKey, schema_HashAndSignature, abi.encode(value)); + } + + function deserializeHashAndSignature(string memory json) public pure returns (SequenceChainedSigTest.HashAndSignature memory) { + return abi.decode(vm.parseJsonType(json, schema_HashAndSignature), (SequenceChainedSigTest.HashAndSignature)); + } + + function deserializeHashAndSignature(string memory json, string memory path) public pure returns (SequenceChainedSigTest.HashAndSignature memory) { + return abi.decode(vm.parseJsonType(json, path, schema_HashAndSignature), (SequenceChainedSigTest.HashAndSignature)); + } + + function deserializeHashAndSignatureArray(string memory json, string memory path) public pure returns (SequenceChainedSigTest.HashAndSignature[] memory) { + return abi.decode(vm.parseJsonTypeArray(json, path, schema_HashAndSignature), (SequenceChainedSigTest.HashAndSignature[])); + } + + function serialize(L2CompressorHuffTest.BatchMember memory value) internal pure returns (string memory) { + return vm.serializeJsonType(schema_BatchMember, abi.encode(value)); + } + + function serialize(L2CompressorHuffTest.BatchMember memory value, string memory objectKey, string memory valueKey) internal returns (string memory) { + return vm.serializeJsonType(objectKey, valueKey, schema_BatchMember, abi.encode(value)); + } + + function deserializeBatchMember(string memory json) public pure returns (L2CompressorHuffTest.BatchMember memory) { + return abi.decode(vm.parseJsonType(json, schema_BatchMember), (L2CompressorHuffTest.BatchMember)); + } + + function deserializeBatchMember(string memory json, string memory path) public pure returns (L2CompressorHuffTest.BatchMember memory) { + return abi.decode(vm.parseJsonType(json, path, schema_BatchMember), (L2CompressorHuffTest.BatchMember)); + } + + function deserializeBatchMemberArray(string memory json, string memory path) public pure returns (L2CompressorHuffTest.BatchMember[] memory) { + return abi.decode(vm.parseJsonTypeArray(json, path, schema_BatchMember), (L2CompressorHuffTest.BatchMember[])); + } + + function serialize(TrustTest.MemoryStruct1 memory value) internal pure returns (string memory) { + return vm.serializeJsonType(schema_MemoryStruct1, abi.encode(value)); + } + + function serialize(TrustTest.MemoryStruct1 memory value, string memory objectKey, string memory valueKey) internal returns (string memory) { + return vm.serializeJsonType(objectKey, valueKey, schema_MemoryStruct1, abi.encode(value)); + } + + function deserializeMemoryStruct1(string memory json) public pure returns (TrustTest.MemoryStruct1 memory) { + return abi.decode(vm.parseJsonType(json, schema_MemoryStruct1), (TrustTest.MemoryStruct1)); + } + + function deserializeMemoryStruct1(string memory json, string memory path) public pure returns (TrustTest.MemoryStruct1 memory) { + return abi.decode(vm.parseJsonType(json, path, schema_MemoryStruct1), (TrustTest.MemoryStruct1)); + } + + function deserializeMemoryStruct1Array(string memory json, string memory path) public pure returns (TrustTest.MemoryStruct1[] memory) { + return abi.decode(vm.parseJsonTypeArray(json, path, schema_MemoryStruct1), (TrustTest.MemoryStruct1[])); + } +} diff --git a/packages/wallet/wallet-contracts/utils/benchmarker.ts b/packages/wallet/wallet-contracts/utils/benchmarker.ts new file mode 100644 index 000000000..5c8b58615 --- /dev/null +++ b/packages/wallet/wallet-contracts/utils/benchmarker.ts @@ -0,0 +1,106 @@ +import { spawn, Worker, Pool } from 'threads' +import { BenchWorker } from './workers/bench-worker' + +import { task } from 'hardhat/config' +import { boolean, int } from 'hardhat/internal/core/params/argumentTypes' +import fs from 'fs' + +class BufferSort { + buffer: { i: number; val: string }[] = [] + next: number = 0 + + constructor(private onValue: (val: string) => void) {} + + feed = (i: number, val: string) => { + this.buffer.push({ i, val }) + this.buffer = this.buffer.sort((a, b) => a.i - b.i) + + while (this.buffer.length > 0 && this.buffer[0].i === this.next) { + this.onValue(this.buffer[0].val) + this.buffer.shift() + this.next++ + } + } +} + +async function main(args: { + csv: string + topology: string + notrim: boolean + runs: number + minsign: number + maxsign: number + minidle: number + maxidle: number + cpus: number +}) { + let { csv, topology, notrim, runs, minsign, maxsign, minidle, maxidle, cpus } = args + + const disableTrim = notrim == true + console.log(`Doing benchmark with params:`) + console.log(` csv: ${csv}`) + console.log(` topology: ${topology}`) + console.log(` disableTrim: ${disableTrim}`) + console.log(` runs: ${runs}`) + console.log(` minSign: ${minsign}`) + console.log(` maxSign: ${maxsign}`) + console.log(` minIdle: ${minidle}`) + console.log(` maxIdle: ${maxidle}`) + console.log(` cpus: ${cpus}`) + + if (minidle > maxidle) throw new Error('minIdle must be <= maxIdle') + if (minsign > maxsign) throw new Error('minSign must be <= maxSign') + + const pool = Pool(() => spawn(new Worker('./workers/bench-worker')), { size: cpus }) + + const file = fs.createWriteStream(csv, { flags: 'a' }) + const fileSorter = new BufferSort((val: string) => file.write(val)) + const consoleSorter = new BufferSort((val: string) => console.log(val)) + + // Create CSV writter + let batched = 0 + file.write('topology,disableTrim,signing,idle,runs,min,max,avg,cmin,cmax,cavg\n') + for (let i = minsign; i < maxsign; i++) { + for (let j = minidle; j < maxidle - 1; j++) { + const absi = (i - minsign) * maxidle + j + + if (batched > cpus * 250) { + await pool.settled() + batched = 0 + } + batched++ + + pool.queue(async worker => { + await worker.setup(i, j, runs, topology as any, disableTrim) + const r = await worker.run() + + fileSorter.feed( + absi, + `${topology},${disableTrim},${r.signing},${r.idle},${runs},${r.min},${r.max},${r.avg},${r.data.min},${r.data.max},${r.data.avg}\n` + ) + consoleSorter.feed( + absi, + `${absi}: ${topology} (notrim ${disableTrim}): ${r.signing}/${r.signing + r.idle} (${runs}): min: ${r.min} max: ${r.max} avg: ${r.avg} cmin: ${r.data.min} cmax: ${r.data.max} cavg: ${r.data.avg}` + ) + }) + } + } + + await pool.completed() + await pool.terminate() + file.close() +} + +task('benchmark', 'Runs sequence benchmarks') + .addParam('csv', 'The CSV file to write to', `benchmark-${Math.floor(Date.now())}.csv`) + .addParam('topology', 'The wallet topology to use', 'legacy') + .addParam('runs', 'The number of runs to perform', 10, int) + .addParam('minsign', 'The start of the range of signature members who are going to sign', 1, int) + .addParam('maxsign', 'The end of the range of signature members who are going to sign', 255, int) + .addParam('minidle', 'The start of the range of idle members on the config', 0, int) + .addParam('maxidle', 'The end of the range of idle members on the config', 255, int) + .addParam('cpus', 'The number of CPUs to use', 1, int) + .addParam('notrim', 'Disable trimming of redudant signature parts', false, boolean) + .setAction(async args => { + return main(args) + }) diff --git a/packages/wallet/wallet-contracts/utils/config-loader.ts b/packages/wallet/wallet-contracts/utils/config-loader.ts new file mode 100644 index 000000000..2714b430d --- /dev/null +++ b/packages/wallet/wallet-contracts/utils/config-loader.ts @@ -0,0 +1,159 @@ +import * as dotenv from 'dotenv' +import * as path from 'path' +import { HttpNetworkConfig } from 'hardhat/types' +import { ethers } from 'ethers' + +type EthereumNetworksTypes = + | 'mainnet' + | 'ropsten' + | 'kovan' + | 'goerli' + | 'polygon' + | 'polygon-zkevm' + | 'mumbai' + | 'arbitrum' + | 'arbitrum-goerli' + | 'arbitrum-nova' + | 'optimism' + | 'bnb' + | 'bnb-testnet' + | 'gnosis' + | 'avalanche' + | 'avalanche-fuji' + +export const getEnvConfig = (env: string) => { + const envFile = path.resolve(__dirname, `../config/${env}.env`) + const envLoad = dotenv.config({ path: envFile }) + + if (envLoad.error) { + return { ETH_MNEMONIC: 'client vendor advice erosion deny cute tree fatal fuel bless simple speed' } + } + + return envLoad.parsed || {} +} + +export const networkGasMultiplier = (network: EthereumNetworksTypes): number => { + switch (network) { + default: + return 1 + } +} + +export const networkRpcUrl = (network: EthereumNetworksTypes): string => { + const config = getEnvConfig('PROD') + + switch (network) { + case 'mumbai': + return 'https://endpoints.omniatech.io/v1/matic/mumbai/public' + + case 'polygon': + return 'https://nodes.sequence.app/polygon' + + case 'polygon-zkevm': + return 'https://zkevm-rpc.com' + + case 'arbitrum': + return 'https://endpoints.omniatech.io/v1/arbitrum/one/public' + + case 'arbitrum-goerli': + return 'https://goerli-rollup.arbitrum.io/rpc' + + case 'arbitrum-nova': + return 'https://nova.arbitrum.io/rpc' + + case 'optimism': + return 'https://endpoints.omniatech.io/v1/op/mainnet/public' + + case 'bnb': + return 'https://bsc-dataseed3.binance.org' + + case 'bnb-testnet': + return 'https://endpoints.omniatech.io/v1/bsc/testnet/public' + + case 'gnosis': + return 'https://gnosis-mainnet.public.blastapi.io' + + case 'avalanche': + return 'https://endpoints.omniatech.io/v1/avax/mainnet/public' + + case 'avalanche-fuji': + return 'https://endpoints.omniatech.io/v1/avax/fuji/public' + + default: + return `https://${network}.infura.io/v3/${config['INFURA_API_KEY']}` + } +} + +export const networkChainId = (network: EthereumNetworksTypes): number => { + switch (network) { + case 'mainnet': + return 1 + + case 'ropsten': + return 3 + + case 'goerli': + return 5 + + case 'kovan': + return 42 + + case 'mumbai': + return 80001 + + case 'polygon': + return 137 + + case 'polygon-zkevm': + return 1101 + + case 'arbitrum': + return 42161 + + case 'arbitrum-goerli': + return 421613 + + case 'arbitrum-nova': + return 42170 + + case 'optimism': + return 10 + + case 'bnb': + return 56 + + case 'bnb-testnet': + return 97 + + case 'gnosis': + return 100 + + case 'avalanche': + return 43114 + + case 'avalanche-fuji': + return 43113 + } +} + +export const networkConfig = (network: EthereumNetworksTypes): HttpNetworkConfig & { etherscan?: string } => { + const prodConfig = getEnvConfig('PROD') + const networkConfig = getEnvConfig(network) + return { + url: networkRpcUrl(network), + chainId: networkChainId(network), + accounts: { + mnemonic: networkConfig['ETH_MNEMONIC'] ?? prodConfig['ETH_MNEMONIC'], + initialIndex: 0, + count: 10, + path: `m/44'/60'/0'/0`, + passphrase: '' + }, + gas: 'auto', + gasPrice: 'auto', + gasMultiplier: networkGasMultiplier(network), + timeout: 20000, + httpHeaders: {}, + etherscan: networkConfig['ETHERSCAN'] ?? prodConfig['ETHERSCAN'] + } +} diff --git a/packages/wallet/wallet-contracts/utils/deploy-contracts.ts b/packages/wallet/wallet-contracts/utils/deploy-contracts.ts new file mode 100644 index 000000000..8249398cd --- /dev/null +++ b/packages/wallet/wallet-contracts/utils/deploy-contracts.ts @@ -0,0 +1,207 @@ +import { network, run, tenderly, ethers as hethers } from 'hardhat' +import ora from 'ora' + +import { + MainModule__factory, + SequenceUtils__factory, + MainModuleUpgradable__factory, + GuestModule__factory, + Factory__factory, + TrustFactory__factory +} from '../gen/typechain' + +import { ContractDeployTransaction, ContractFactory, Signer, ethers } from 'ethers' +import fs from 'fs' + +const provider = hethers.provider + +const singletonFactoryFactory = { + address: '0xce0042B868300000d44A59004Da54A005ffdcf9f', + abi: [ + { + constant: false, + inputs: [ + { + internalType: 'bytes', + type: 'bytes' + }, + { + internalType: 'bytes32', + type: 'bytes32' + } + ], + name: 'deploy', + outputs: [ + { + internalType: 'address payable', + type: 'address' + } + ], + payable: false, + stateMutability: 'nonpayable', + type: 'function' + } + ] +} +const singletonFactoryDeployTx = + '0xf9016c8085174876e8008303c4d88080b90154608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634af63f0214602d575b600080fd5b60cf60048036036040811015604157600080fd5b810190602081018135640100000000811115605b57600080fd5b820183602082011115606c57600080fd5b80359060200191846001830284011164010000000083111715608d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925060eb915050565b604080516001600160a01b039092168252519081900360200190f35b6000818351602085016000f5939250505056fea26469706673582212206b44f8a82cb6b156bfcc3dc6aadd6df4eefd204bc928a4397fd15dacf6d5320564736f6c634300060200331b83247000822470' +const singletonFactoryDeployer = '0xBb6e024b9cFFACB947A71991E386681B1Cd1477D' + +const prompt = ora() +const attempVerify = async ( + name: string, + _: new () => T, + address: string, + ...args: Parameters +) => { + try { + await run('verify:verify', { + address: address, + constructorArguments: args + }) + } catch {} + + try { + await tenderly.verify({ + name: name, + address: address + }) + } catch {} +} + +const buildNetworkJson = (...contracts: { name: string; address: string }[]) => { + return contracts.map(c => ({ + contractName: c.name, + address: c.address + })) +} + +const deploy = async ( + name: string, + contract: new (...args: [signer?: Signer]) => ContractFactory, + ...args: any[] +): Promise => { + const signer = await provider.getSigner(0) + const singletonFactory = new ethers.Contract(singletonFactoryFactory.address, singletonFactoryFactory.abi, signer) + + if (ethers.getBytes(await provider.getCode(await singletonFactory.getAddress())).length <= 2) { + // Deploy singleton deployer + const o = ora().start(`Deploying singleton factory`) + const deployerBal = 24700000000000000n + if ((await provider.getBalance(singletonFactoryDeployer)) < deployerBal) { + o.info('Funding singleton factory deployer') + const tx = await signer.sendTransaction({ + to: singletonFactoryDeployer, + value: deployerBal + }) + await tx.wait() + o.info('Funded. Deploying singleton factory') + } + const tx = await provider.broadcastTransaction(singletonFactoryDeployTx) + await tx.wait() + o.succeed(`Deployed singleton factory`) + } + + const o = ora().start(`Deploying ${name}`) + const c = new contract(signer) + const { data } = await c.getDeployTransaction(...args) + + if (!data) { + throw new Error(`no data for ${name}`) + } + + const maxGasLimit = await provider.getBlock('latest').then(b => (b!.gasLimit * 4n) / 10n) + + const address = ethers.getAddress( + ethers.dataSlice( + ethers.keccak256( + ethers.solidityPacked( + ['bytes1', 'address', 'bytes32', 'bytes32'], + ['0xff', await singletonFactory.getAddress(), ethers.ZeroHash, ethers.keccak256(data)] + ) + ), + 12 + ) + ) + + if (ethers.getBytes(await provider.getCode(address)).length > 0) { + o.succeed(`Skipping ${name} because it has been deployed at ${address}`) + return c.attach(address) + } + + await singletonFactory.deploy(data, ethers.ZeroHash, { gasLimit: maxGasLimit }).then(tx => tx.wait()) + + if (ethers.getBytes(await provider.getCode(address)).length === 0) { + throw new Error(`failed to deploy ${name}`) + } + + o.succeed(`Deployed ${name} at ${address}`) + + return c.attach(address) +} + +const main = async () => { + const signer = await provider.getSigner(0) + const address = await signer.getAddress() + prompt.info(`Network Name: ${network.name}`) + prompt.info(`Local Deployer Address: ${address}`) + prompt.info(`Local Deployer Balance: ${await provider.getBalance(address)}`) + + const walletFactory = await deploy('Factory', Factory__factory) + const mainModuleUpgradeable = await deploy('MainModuleUpgradable', MainModuleUpgradable__factory) + const mainModule = await deploy( + 'MainModule', + MainModule__factory, + await walletFactory.getAddress(), + await mainModuleUpgradeable.getAddress() + ) + const guestModule = await deploy('GuestModule', GuestModule__factory) + const sequenceUtils = await deploy('SequenceUtils', SequenceUtils__factory) + const trustFactory = await deploy('TrustFactory', TrustFactory__factory) + + prompt.start(`writing deployment information to ${network.name}.json`) + fs.writeFileSync( + `./networks/${network.name}.json`, + JSON.stringify( + buildNetworkJson( + { name: 'WalletFactory', address: await walletFactory.getAddress() }, + { name: 'MainModule', address: await mainModule.getAddress() }, + { name: 'MainModuleUpgradable', address: await mainModuleUpgradeable.getAddress() }, + { name: 'GuestModule', address: await guestModule.getAddress() }, + { name: 'SequenceUtils', address: await sequenceUtils.getAddress() }, + { name: 'TrustFactory', address: await trustFactory.getAddress() } + ), + null, + 2 + ) + ) + prompt.succeed() + + prompt.start(`verifying contracts`) + + await attempVerify('Factory', Factory__factory, await walletFactory.getAddress()) + await attempVerify('MainModuleUpgradable', MainModuleUpgradable__factory, await mainModuleUpgradeable.getAddress()) + await attempVerify( + 'MainModule', + MainModule__factory, + await mainModule.getAddress(), + await walletFactory.getAddress(), + await mainModuleUpgradeable.getAddress() + ) + await attempVerify('GuestModule', GuestModule__factory, await guestModule.getAddress()) + await attempVerify('SequenceUtils', SequenceUtils__factory, await sequenceUtils.getAddress()) + await attempVerify('TrustFactory', TrustFactory__factory, await trustFactory.getAddress()) + + prompt.succeed() +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => { + process.exit(0) + }) + .catch(error => { + console.error(error) + process.exit(1) + }) diff --git a/packages/wallet/wallet-contracts/utils/workers/bench-worker.ts b/packages/wallet/wallet-contracts/utils/workers/bench-worker.ts new file mode 100644 index 000000000..fc8bd1446 --- /dev/null +++ b/packages/wallet/wallet-contracts/utils/workers/bench-worker.ts @@ -0,0 +1,89 @@ +import { deploySequenceContext, SequenceContext } from '../../test/utils/contracts' +import { expose } from 'threads/worker' +import { SequenceWallet } from '../../test/utils/wallet' +import { ethers } from 'ethers' +import { legacyTopology, merkleTopology } from '../../test/utils/sequence' + +let context: SequenceContext +let wallet: SequenceWallet + +let d_runs: number +let d_idle: number +let d_signing: number +let d_disableTrim: boolean + +let topologyConverter: any + +let prevsnapshot: any + +function report2(values: ethers.BigNumberish[]) { + const bns = values.map(v => BigInt(v)) + + const min = bns.reduce((a, b) => (a < b ? a : b)) + const max = bns.reduce((a, b) => (a > b ? a : b)) + const avg = bns.reduce((p, n) => (p + n) / BigInt(values.length)) + + return { min, max, avg } +} + +const worker = { + async setup(signing: number, idle: number, runs: number, topology: 'legacy' | 'merkle', disableTrim: boolean) { + if (!context) { + context = await deploySequenceContext() + } + + d_runs = runs + d_idle = idle + d_signing = signing + d_disableTrim = disableTrim + + if (topology !== 'legacy' && topology !== 'merkle') throw new Error('Invalid topology') + topologyConverter = topology === 'legacy' ? legacyTopology : merkleTopology + }, + async run() { + const results: ethers.BigNumberish[] = [] + const calldatas: ethers.BigNumberish[] = [] + + for (let i = 0; i < d_runs; i++) { + wallet = SequenceWallet.basicWallet(context, { + signing: d_signing, + idle: d_idle, + topologyConverter, + encodingOptions: { disableTrim: d_disableTrim } + }) + await wallet.deploy() + + const signature = await wallet.signTransactions([{}]) + const tx = await wallet.relayTransactions([{}], signature) + const receipt = await tx.wait() + + if (!receipt) { + throw new Error('No receipt') + } + + results.push(receipt.gasUsed) + calldatas.push(ethers.getBytes(signature).length) + } + + const report = report2(results) + const reportCalldata = report2(calldatas) + + return { + min: Number(report.min), + max: Number(report.max), + avg: Number(report.avg), + data: { + min: Number(reportCalldata.min), + max: Number(reportCalldata.max), + avg: Number(reportCalldata.avg) + }, + idle: d_idle, + signing: d_signing, + runs: d_runs + } + } +} + +export type BenchWorker = typeof worker + +expose(worker) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 494683100..81a8a341e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,531 +4,599 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + 0xsequence.js.git: link:.local/share/pnpm/global/5/node_modules/https:/github.com/Dargon789/0xsequence.js.git + Rabby.git: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/Rabby.git + braces@<3.0.3: '>=3.0.3' + cookie@<0.7.0: '>=0.7.0' + diff@<4.0.4: '>=4.0.4' + diff@>=5.0.0 <5.2.2: '>=5.2.2' + esbuild@<=0.24.2: '>=0.25.0' + fast-xml-parser@>=4.3.6 <=5.3.3: '>=5.3.4' + form-data@<2.5.4: '>=2.5.4' + happy-dom@<20.0.0: '>=20.0.0' + hardhat-project.git: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/hardhat-project.git + hono@<4.11.7: '>=4.11.7' + http-proxy-middleware@<2.0.7: '>=2.0.7' + lodash@>=4.0.0 <=4.17.22: '>=4.17.23' + micromatch@<4.0.8: '>=4.0.8' + next@>=15.6.0-canary.0 <16.1.5: '>=16.1.5' + next@>=16.0.0-beta.0 <16.1.5: '>=16.1.5' + next@>=16.1.0-canary.0 <16.1.5: '>=16.1.5' + node-forge@<1.0.0: '>=1.0.0' + node-forge@<1.3.0: '>=1.3.0' + node-forge@<1.3.2: '>=1.3.2' + qs@<6.14.1: '>=6.14.1' + semver@<5.7.2: '>=5.7.2' + tar@<6.2.1: '>=6.2.1' + tar@<=7.5.2: '>=7.5.3' + thirdweb-dev.git: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/thirdweb-dev.git + tmp@<=0.2.3: '>=0.2.4' + tough-cookie@<4.1.3: '>=4.1.3' + undici@<5.29.0: '>=5.29.0' + undici@<6.23.0: '>=6.23.0' + undici@>=4.5.0 <5.28.5: '>=5.28.5' + wallet-contracts.git: link:.local/share/pnpm/global/5/node_modules/https:/github.com/Dargon789/wallet-contracts.git + webpack-dev-middleware@<=5.3.3: '>=5.3.4' + webpack-dev-server@<=5.2.0: '>=5.2.1' + ws@>=2.1.0 <5.2.4: '>=5.2.4' + ws@>=8.0.0 <8.17.1: '>=8.17.1' + xml2js@<0.5.0: '>=0.5.0' + importers: .: + dependencies: + 0xsequence: + specifier: ^2.3.39 + version: 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + 0xsequence.js.git: + specifier: link:.local/share/pnpm/global/5/node_modules/https:/github.com/Dargon789/0xsequence.js.git + version: link:.local/share/pnpm/global/5/node_modules/https:/github.com/Dargon789/0xsequence.js.git + '@0xsequence/checkout': + specifier: ~5.4.8 + version: 5.4.8(e8cb1cae3279f1548f0ca5a5ff2c9972) + '@0xsequence/connect': + specifier: 0.0.0-20251202170137 + version: 0.0.0-20251202170137(@emotion/is-prop-valid@1.4.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(bufferutil@4.1.0)(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4)(zod@3.25.76) + '@0xsequence/hooks': + specifier: ~5.4.8 + version: 5.4.8(@0xsequence/api@2.3.39)(@0xsequence/indexer@2.3.39)(@0xsequence/metadata@2.3.39)(@0xsequence/network@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@0xsequence/waas': + specifier: ^2.3.39 + version: 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': + specifier: ~2.3.39 + version: 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/wallet-contracts': + specifier: ~3.0.1 + version: 3.0.1(bufferutil@4.1.0)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10) + '@0xsequence/wallet-primitives': + specifier: 0.0.0-20250915145821 + version: 0.0.0-20250915145821(typescript@5.8.3)(zod@3.25.76) + '@0xsequence/wallet-widget': + specifier: 0.0.0-20251202170137 + version: 0.0.0-20251202170137(aa110a2449a9010174034af1ff39bdcb) + '@codesandbox/sdk': + specifier: 3.0.0-rc.1 + version: 3.0.0-rc.1(@xterm/xterm@5.5.0)(ink@6.6.0(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)) + '@coinbase/cdp-sdk': + specifier: ~1.43.1 + version: 1.43.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@okx-dex/okx-dex-sdk': + specifier: ~1.0.18 + version: 1.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(zod@3.25.76) + '@tanstack/query-async-storage-persister': + specifier: ~5.90.22 + version: 5.90.22 + '@tanstack/query-sync-storage-persister': + specifier: ~5.90.22 + version: 5.90.22 + '@tanstack/react-query': + specifier: ~5.90.20 + version: 5.90.20(react@19.2.4) + '@tanstack/react-query-devtools': + specifier: ~5.91.3 + version: 5.91.3(@tanstack/react-query@5.90.20(react@19.2.4))(react@19.2.4) + '@tanstack/react-query-persist-client': + specifier: ~5.90.22 + version: 5.90.22(@tanstack/react-query@5.90.20(react@19.2.4))(react@19.2.4) + '@vercel/analytics': + specifier: ^1.6.1 + version: 1.6.1(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) + Rabby.git: + specifier: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/Rabby.git + version: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/Rabby.git + connectkit: + specifier: ~1.9.1 + version: 1.9.1(@babel/core@7.28.5)(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4) + ethers: + specifier: ^6.16.0 + version: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + googleapis: + specifier: ~170.1.0 + version: 170.1.0 + hardhat-project.git: + specifier: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/hardhat-project.git + version: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/hardhat-project.git + next: + specifier: ~16.1.6 + version: 16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + prettier-plugin-solidity: + specifier: ^2.2.1 + version: 2.2.1(prettier@3.8.1) + react: + specifier: ~19.2.4 + version: 19.2.4 + react-dom: + specifier: ~19.2.4 + version: 19.2.4(react@19.2.4) + thirdweb-dev.git: + specifier: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/thirdweb-dev.git + version: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/thirdweb-dev.git + vercel: + specifier: ^50.11.0 + version: 50.11.0(rollup@4.45.1)(typescript@5.8.3) + viem: + specifier: ^2.45.1 + version: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: + specifier: ~3.3.4 + version: 3.3.4(bb1cf47ae47a74d724e315965d20c874) + wallet-contracts.git: + specifier: link:.local/share/pnpm/global/5/node_modules/https:/github.com/Dargon789/wallet-contracts.git + version: link:.local/share/pnpm/global/5/node_modules/https:/github.com/Dargon789/wallet-contracts.git devDependencies: '@changesets/cli': - specifier: ^2.29.4 - version: 2.29.5 + specifier: ^2.29.8 + version: 2.29.8(@types/node@20.11.0) + flag: + specifier: ^5.0.1 + version: 5.0.1(react@19.2.4) lefthook: - specifier: ^1.11.13 - version: 1.12.2 + specifier: ^1.13.6 + version: 1.13.6 prettier: - specifier: ^3.5.3 - version: 3.6.2 + specifier: ^3.8.1 + version: 3.8.1 + prisma: + specifier: ~7.3.0 + version: 7.3.0(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3) rimraf: - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.1.2 + version: 6.1.2 turbo: - specifier: ^2.5.4 - version: 2.5.5 + specifier: ^2.8.3 + version: 2.8.3 typescript: specifier: 5.8.3 version: 5.8.3 - extras/docs: - dependencies: - '@repo/ui': - specifier: workspace:* - version: link:../../repo/ui - next: - specifier: ^15.4.7 - version: 15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: - specifier: ^19.1.0 - version: 19.1.0 - react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) - devDependencies: - '@repo/eslint-config': - specifier: workspace:* - version: link:../../repo/eslint-config - '@repo/typescript-config': - specifier: workspace:* - version: link:../../repo/typescript-config - '@types/node': - specifier: ^20.17.57 - version: 20.19.9 - '@types/react': - specifier: 18.3.1 - version: 18.3.1 - '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 - typescript: - specifier: 5.5.4 - version: 5.5.4 +packages: - extras/web: - dependencies: - '@repo/ui': - specifier: workspace:* - version: link:../../repo/ui - next: - specifier: ^15.4.7 - version: 15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: - specifier: ^19.1.0 - version: 19.1.0 - react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) - devDependencies: - '@repo/eslint-config': - specifier: workspace:* - version: link:../../repo/eslint-config - '@repo/typescript-config': - specifier: workspace:* - version: link:../../repo/typescript-config - '@types/node': - specifier: ^20.17.57 - version: 20.19.9 - '@types/react': - specifier: 18.3.1 - version: 18.3.1 - '@types/react-dom': - specifier: 18.3.0 - version: 18.3.0 - typescript: - specifier: 5.5.4 - version: 5.5.4 + 0xsequence@2.3.39: + resolution: {integrity: sha512-P+Cu6gRjClOiQRBQzxp8EvX5X1aSbgKYM79f0lpZ76jTCwf8sbGT+A6ZZSPohEIZr2hTv4iOk9ERvaPAaiJ9qg==} + peerDependencies: + ethers: '>=6' - packages/services/api: - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 + '@0no-co/graphql.web@1.2.0': + resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true - packages/services/builder: - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 + '@0no-co/graphqlsp@1.15.2': + resolution: {integrity: sha512-Ys031WnS3sTQQBtRTkQsYnw372OlW72ais4sp0oh2UMPRNyxxnq85zRfU4PIdoy9kWriysPT5BYAkgIxhbonFA==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 - packages/services/guard: - dependencies: - ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 - vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) - - packages/services/identity-instrument: - dependencies: - json-canonicalize: - specifier: ^2.0.0 - version: 2.0.0 - jwt-decode: - specifier: ^4.0.0 - version: 4.0.0 - ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 - vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + '@0xsequence/abi@2.3.39': + resolution: {integrity: sha512-MQxVIwwq84IYK2lRHO/lXJQRp21oP982oGyKl5mlkp1jzUE4+GGEMYuo4B3pnokdEeVmSkOJL7j/xJGVYxzlKw==} - packages/services/indexer: - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 + '@0xsequence/account@2.3.39': + resolution: {integrity: sha512-VgsmHLm7uOdd3SuXt1kykzpnQ1E/S0gQczJskPZIQXdfwGyyA1CnE+LXqzCWy0rr48ny9VktZ+f9ZqWixDuh+Q==} + peerDependencies: + ethers: '>=6' - packages/services/marketplace: - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 + '@0xsequence/api@2.3.39': + resolution: {integrity: sha512-Gdl6TfUANFy8S+/pUR+BjfgxyXDq2pVzDFkmS7xppa/lcxmwB4lRfrlkuehOqeTLeXgAKbERBWenOOMYctJBqg==} - packages/services/metadata: - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 + '@0xsequence/auth@2.3.39': + resolution: {integrity: sha512-UaLM4NTcNPbR8A+Gf4/RxAfM4thjxjJe95OUo41ABeR/BRqDFbbWUmU79h1UU6iONspe1nlz022ZtPqwXKKKdw==} + peerDependencies: + ethers: '>=6' - packages/services/relayer: - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 + '@0xsequence/checkout@5.4.8': + resolution: {integrity: sha512-9U9KaPPaVbFF5Qoi3Q/0ksPY5iDPE8Hi/FMAL/quznyGZBsAW+mfb4jbzoFeEOvCjeD5WtBQdlfbKKoy7RZxmA==} + peerDependencies: + 0xsequence: '>= 2.3.38' + '@0xsequence/api': '>=2.3.38' + '@0xsequence/connect': 5.4.8 + '@0xsequence/hooks': 5.4.8 + '@0xsequence/indexer': '>= 2.3.38' + '@0xsequence/metadata': '>= 2.3.38' + '@0xsequence/network': '>= 2.3.38' + '@0xsequence/waas': '>= 2.3.38' + '@tanstack/react-query': '>= 5' + ethers: '>= 6.13.0' + react: '>= 17' + react-dom: '>= 17' + viem: '>= 2.28.0' + wagmi: '>= 2.15.0' + + '@0xsequence/connect@0.0.0-20251202170137': + resolution: {integrity: sha512-IX8hEWx4sKoaz/O4RZDqOroAQ3wVW9nDNvLEYUFxut92wn0YYnUqn5b3/NHqPYTaPoXdZOMANIMjtOZe/d4N7A==} + peerDependencies: + react: '>= 17' + react-dom: '>= 17' + viem: ^2.33.3 + wagmi: 2.15.0 - packages/utils/abi: - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - typescript: - specifier: ^5.8.3 - version: 5.8.3 + '@0xsequence/core@2.3.39': + resolution: {integrity: sha512-4noc1KW1b5g8telV1qac6yZbdkMD5x8gqRa5QnIvMmAVHsXC8qCYlFpy76csYKlWgFKGqxN8RWOwihnZbuyuRg==} + peerDependencies: + ethers: '>=6' - packages/wallet/core: - dependencies: - '@0xsequence/guard': - specifier: workspace:^ - version: link:../../services/guard - '@0xsequence/relayer': - specifier: workspace:^ - version: link:../../services/relayer - '@0xsequence/wallet-primitives': - specifier: workspace:^ - version: link:../primitives - mipd: - specifier: ^0.0.7 - version: 0.0.7(typescript@5.8.3) - ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) - viem: - specifier: ^2.30.6 - version: 2.33.0(typescript@5.8.3) - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) - dotenv: - specifier: ^16.5.0 - version: 16.6.1 - fake-indexeddb: - specifier: ^6.0.1 - version: 6.0.1 - typescript: - specifier: ^5.8.3 - version: 5.8.3 - vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) - - packages/wallet/dapp-client: - dependencies: - '@0xsequence/guard': - specifier: workspace:^ - version: link:../../services/guard - '@0xsequence/wallet-core': - specifier: workspace:^ - version: link:../core - '@0xsequence/wallet-primitives': - specifier: workspace:^ - version: link:../primitives - ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) - dotenv: - specifier: ^16.5.0 - version: 16.6.1 - fake-indexeddb: - specifier: ^6.0.1 - version: 6.0.1 - happy-dom: - specifier: ^17.2.2 - version: 17.6.3 - typescript: - specifier: ^5.8.3 - version: 5.8.3 - vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + '@0xsequence/dapp-client@3.0.0-beta.4': + resolution: {integrity: sha512-5aeXoQhiA306HiZSMhkplnRTmywovvxJYcAiRpAq1FGAw3mSvI/yMoL3F5V+F3DmHOIF1SAfGG012J4uI+jfbA==} - packages/wallet/primitives: - dependencies: - ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) - typescript: - specifier: ^5.8.3 - version: 5.8.3 - vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + '@0xsequence/design-system@2.1.11': + resolution: {integrity: sha512-wfuY9v2dNQxw9qAYyflwcKzuiiVqm4qqn2Jkoyw/CqxODcqQ3orUsGxjnbyvCWOwvHbH908c4LOZj/TBI6T0Fw==} + peerDependencies: + motion: '>= 12' + react: '>= 17' + react-dom: '>= 17' - packages/wallet/primitives-cli: - dependencies: - '@0xsequence/wallet-primitives': - specifier: workspace:^ - version: link:../primitives - ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) - yargs: - specifier: ^17.7.2 - version: 17.7.2 - devDependencies: - '@repo/eslint-config': - specifier: workspace:* - version: link:../../../repo/eslint-config - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - '@types/yargs': - specifier: ^17.0.33 - version: 17.0.33 - concurrently: - specifier: ^8.2.2 - version: 8.2.2 - esbuild: - specifier: ^0.25.5 - version: 0.25.8 - nodemon: - specifier: ^3.1.10 - version: 3.1.10 - typescript: - specifier: ^5.8.3 - version: 5.8.3 + '@0xsequence/ethauth@1.0.0': + resolution: {integrity: sha512-piihXzbS8Sq7P670a+GyTm3igTJL3Ts6pqjJcC0Sv86yqeK6QD0pzJP4APP+/IQa5k+0s2l1SeZwMjR7gSPtCA==} + peerDependencies: + ethers: '>=6' - packages/wallet/wdk: - dependencies: - '@0xsequence/guard': - specifier: workspace:^ - version: link:../../services/guard - '@0xsequence/identity-instrument': - specifier: workspace:^ - version: link:../../services/identity-instrument - '@0xsequence/tee-verifier': - specifier: ^0.1.2 - version: 0.1.2 - '@0xsequence/wallet-core': - specifier: workspace:^ - version: link:../core - '@0xsequence/wallet-primitives': - specifier: workspace:^ - version: link:../primitives - idb: - specifier: ^7.1.1 - version: 7.1.1 - jwt-decode: - specifier: ^4.0.0 - version: 4.0.0 - ox: - specifier: ^0.7.2 - version: 0.7.2(typescript@5.8.3) - uuid: - specifier: ^11.1.0 - version: 11.1.0 - devDependencies: - '@repo/typescript-config': - specifier: workspace:^ - version: link:../../../repo/typescript-config - '@types/node': - specifier: ^22.15.29 - version: 22.16.5 - '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3)) - dotenv: - specifier: ^16.5.0 - version: 16.6.1 - fake-indexeddb: - specifier: ^6.0.1 - version: 6.0.1 - happy-dom: - specifier: ^17.2.2 - version: 17.6.3 - typescript: - specifier: ^5.8.3 - version: 5.8.3 - vitest: - specifier: ^3.2.1 - version: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) + '@0xsequence/guard@2.3.39': + resolution: {integrity: sha512-XtM90alrUXA4A3wjFRG0CBJvmtf2X4SqAdojuJLJ84uRs2MFGriwS3X6GkHYndtwOpAuLlOFBcC80/BVnF4GNw==} + peerDependencies: + ethers: '>=6' - repo/eslint-config: - devDependencies: - '@eslint/js': - specifier: ^9.28.0 - version: 9.31.0 - '@next/eslint-plugin-next': - specifier: ^15.3.3 - version: 15.4.2 - eslint: - specifier: ^9.28.0 - version: 9.31.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.2(eslint@9.31.0) - eslint-plugin-only-warn: - specifier: ^1.1.0 - version: 1.1.0 - eslint-plugin-react: - specifier: ^7.37.5 - version: 7.37.5(eslint@9.31.0) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.31.0) - eslint-plugin-turbo: - specifier: ^2.5.4 - version: 2.5.5(eslint@9.31.0)(turbo@2.5.5) - globals: - specifier: ^15.15.0 - version: 15.15.0 - typescript: - specifier: ^5.8.3 - version: 5.8.3 - typescript-eslint: - specifier: ^8.33.1 - version: 8.38.0(eslint@9.31.0)(typescript@5.8.3) + '@0xsequence/guard@3.0.0-beta.12': + resolution: {integrity: sha512-fac2goCBmmbSXn7pzNCxauahNd1KQZ8wAlogskuG9ZZ6UYstIYEhytSvE59pitG556PHocywOhaA3RbfJ/rWhQ==} - repo/typescript-config: {} + '@0xsequence/hooks@0.0.0-20251202170137': + resolution: {integrity: sha512-Y37I6F3lGG3VmoTLd/ja0w1xXftHPonI5Fmwb/e6qOn6kh93X6s7L9o9yQybp6XS4cf6/rnNWTLNUaltgNAr8w==} + peerDependencies: + '@0xsequence/api': '>=2.3.23' + '@0xsequence/indexer': '>=2.3.23' + '@0xsequence/metadata': '>=2.3.23' + '@0xsequence/network': '>=2.3.23' + '@tanstack/react-query': '>= 5' + react: '>= 17' + react-dom: '>= 17' + viem: ^2.33.3 + + '@0xsequence/hooks@5.4.8': + resolution: {integrity: sha512-G9qHD3wj1JxPvME4WtRlE6tL8+v9U2R32vMXbPkQogmj1yVFdwmUv9mMT/zzlP6obx6ZrN6TL9dRF/siqdzSSQ==} + peerDependencies: + '@0xsequence/api': '>=2.3.38' + '@0xsequence/indexer': '>=2.3.38' + '@0xsequence/metadata': '>=2.3.38' + '@0xsequence/network': '>=2.3.38' + '@tanstack/react-query': '>= 5' + react: '>= 17' + react-dom: '>= 17' + viem: '>= 2.28.0' + + '@0xsequence/indexer@2.3.39': + resolution: {integrity: sha512-oiDcwNg84ZQkme7Xd9aV2RkHUHzybtqac45H887/AmEFaLFWOcnNBlhXPaUOxclofAnVENIYaVf6NscWrKEzng==} + + '@0xsequence/marketplace@2.3.39': + resolution: {integrity: sha512-exMJJB0YadkvFEHRfW/mBcII2hN33MTVnOR9XYX7J8Ww+TsQEfxztZwJrXrdHoCTQIF/FCjwJrL5oB1EO/Nakw==} + + '@0xsequence/metadata@2.3.39': + resolution: {integrity: sha512-E+tpckzVKctCnNsskEu1PMoOzZojRg82wpiJZ9OOJxxZdLS8yj5meeLdo+76CU0zajsICTuwi7nbgHesvSPPwg==} + + '@0xsequence/migration@2.3.39': + resolution: {integrity: sha512-5qNemWMD3ZqvXhbxlgGhyKVZDev1v8XfTfBiqoib5yycVHm9fqZnaGXr9LKRsLGm8oMf55kisZjrZ3YiG8Hlig==} + peerDependencies: + ethers: '>=6' - repo/ui: - dependencies: - react: - specifier: ^19.1.0 - version: 19.1.0 - react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) - devDependencies: - '@repo/eslint-config': - specifier: workspace:* - version: link:../eslint-config - '@repo/typescript-config': - specifier: workspace:* - version: link:../typescript-config - '@turbo/gen': - specifier: ^1.13.4 - version: 1.13.4(@types/node@20.19.9)(typescript@5.5.4) - '@types/node': - specifier: ^20.17.57 - version: 20.19.9 - '@types/react': - specifier: 18.3.0 - version: 18.3.0 - '@types/react-dom': - specifier: 18.3.1 - version: 18.3.1 - typescript: - specifier: 5.5.4 - version: 5.5.4 + '@0xsequence/network@2.3.39': + resolution: {integrity: sha512-ePVe5UfOEAhYOouZuPRd25IF6Lfe9HVCL2Dbp3Zm+hcAHv0Bl89A7TPg9+JQH9Eih0Z+N5uSNJuGfV+Xe+jAUg==} + peerDependencies: + ethers: '>=6' -packages: + '@0xsequence/provider@2.3.39': + resolution: {integrity: sha512-3YbyMqFk8oCFtyvyHaXYntgCzgYKLMNvolhq7ioUcxqEp2tzYGAB6bDhUVbVYOW2sPpVv4NuF/fpeAguQ2v8tQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/relayer@2.3.39': + resolution: {integrity: sha512-loVjpXqFLR9/Lu8mbTaTF1nf3YSQBvw4E+u+btrGz80aiTPKH8Q+BIWDLGtrXF1ian+yoAn4qdpgR3lZD3oYbg==} + peerDependencies: + ethers: '>=6' - '@0xsequence/tee-verifier@0.1.2': - resolution: {integrity: sha512-7sKr8/T4newknx6LAukjlRI3siGiGhBnZohz2Z3jX0zb0EBQdKUq0L//A7CPSckHFPxTg/QvQU2v8e9x9GfkDw==} + '@0xsequence/relayer@3.0.0-beta.12': + resolution: {integrity: sha512-wejy3qQgpd+XKss0/kIUnjv8hlyAwlebG41G8+IuiHFRUNZ0Eks0ftCd5ab2FM4xPdsCJ3n9kfg3oOnrgjbRsQ==} - '@adraffy/ens-normalize@1.11.0': - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@0xsequence/replacer@2.3.39': + resolution: {integrity: sha512-Z+FZu9iZRBPXfPo9KB2pT/lkG7mlDq5xDLNZ1D1E5GnKMHLCt7M8j4gvQMu6aWcmku9DNF98LrCMuKBlCgE7/w==} + peerDependencies: + ethers: '>=6' - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} + '@0xsequence/sessions@2.3.39': + resolution: {integrity: sha512-yALTne1Y5pYuUfxVQgXMzwmxRRq90yBQpJ13GX+Ha9w/w/HrHg0cNGCk/TpNsLxqYhusG9zP/2TsQEYEPQrdzw==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/signhub@2.3.39': + resolution: {integrity: sha512-CyFWeyafgwQUo05Heq1sGX+t8QPdxQ5Q6g8E+j2VFaNFY8wxGcQxVddiGWUHfvCseIgtkZiyEzfeUkgqJtgpew==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/utils@2.3.39': + resolution: {integrity: sha512-0pePuw890L7LjCJvC2OM0Z5NprY/gwq8y7voHPe6hvFA6AnNKeRZPSyk1ysOhM6Ty9nciRjUt9xHG+fkDkdAug==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/waas@2.3.39': + resolution: {integrity: sha512-koDCmWCskVrxolZT09XOK25Na/zBD5e7eV+JQqNPJENwXNNB9Z/iqHJpQGmV3MZx0z1Is/K6ppyqWwlcB1cCPQ==} + peerDependencies: + ethers: '>=6' + + '@0xsequence/wallet-contracts@3.0.1': + resolution: {integrity: sha512-ZvZdXPE1KOYVjl9J6UdN/eBqEmuYHvlO4EUxDxG7VqCgrSiVP9S8k+mEN4aUMzOiYGwKcYY/HIkD211mvxseZQ==} + + '@0xsequence/wallet-core@3.0.0-beta.12': + resolution: {integrity: sha512-d/CUcPO4/5WPHqkeQFV83TnZVFLJ5F5d6fJB3jdCuyLGUGOTpJIQF3u5gZjCad7vvHNizj0Zg+RKBEewZdYXuA==} + + '@0xsequence/wallet-primitives@0.0.0-20250915145821': + resolution: {integrity: sha512-EiV2ke7XmPoamppXw3eVV8gsKWJTaYFq3zhP+vltaXMncBM+0MHhKuPRLMsdbB7V88olma9aafZtuuZhlSIwhQ==} + + '@0xsequence/wallet-primitives@3.0.0-beta.12': + resolution: {integrity: sha512-Dw+PLIB0gFhRuxiZkGfI7eYT3Fu0ofiG6Ayq+MQEaKgCvCmxTb4VimSpbfhY2vez0glHPmmY2gpR93WN4JyCUg==} + + '@0xsequence/wallet-widget@0.0.0-20251202170137': + resolution: {integrity: sha512-SZKgc1KYm77Ctifm5iwMJR0Ecx1FJU/LUCgeHTFss1lIGVBNPBLGf5Ug9VsUszg9awooRD86k0ikPHK/p896Hg==} + peerDependencies: + '@0xsequence/api': '>=2.3.23' + '@0xsequence/checkout': 0.0.0-20251202170137 + '@0xsequence/connect': 0.0.0-20251202170137 + '@0xsequence/hooks': 0.0.0-20251202170137 + '@0xsequence/indexer': '>=2.3.23' + '@0xsequence/metadata': '>=2.3.23' + '@0xsequence/network': '>=2.3.23' + '@tanstack/react-query': '>= 5' + react: '>= 17' + react-dom: '>= 17' + viem: ^2.33.3 + wagmi: '>= 2.15.0' + + '@0xsequence/wallet@2.3.39': + resolution: {integrity: sha512-yBPdsw6HgD2txJXvYbknXSDGSTirtAKVD3d8QPZiVTyVVZIVbV60K1UGGLnVtF2HGph/gVOh9rd2SPVBHcP3DQ==} + peerDependencies: + ethers: '>=6' + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} + + '@alcalzone/ansi-tokenize@0.2.4': + resolution: {integrity: sha512-HTgrrTgZ9Jgeo6Z3oqbQ7lifOVvRR14vaDuBGPPUxk9Thm+vObaO4QfYYYWw4Zo5CWQDBEfsinFA6Gre+AqwNQ==} + engines: {node: '>=18'} + + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-cognito-identity-provider@3.982.0': + resolution: {integrity: sha512-ldmQyFwGCdAx0bZztFQ3pPMqcFPud0+hadOkzA/HPBVFTjQEIQu0/L3I7He6oCIN6zYG9RvPEEwmOegfQaJ6EA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/client-sso@3.982.0': + resolution: {integrity: sha512-qJrIiivmvujdGqJ0ldSUvhN3k3N7GtPesoOI1BSt0fNXovVnMz4C/JmnkhZihU7hJhDvxJaBROLYTU+lpild4w==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/core@3.973.6': + resolution: {integrity: sha512-pz4ZOw3BLG0NdF25HoB9ymSYyPbMiIjwQJ2aROXRhAzt+b+EOxStfFv8s5iZyP6Kiw7aYhyWxj5G3NhmkoOTKw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-env@3.972.4': + resolution: {integrity: sha512-/8dnc7+XNMmViEom2xsNdArQxQPSgy4Z/lm6qaFPTrMFesT1bV3PsBhb19n09nmxHdrtQskYmViddUIjUQElXg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-http@3.972.6': + resolution: {integrity: sha512-5ERWqRljiZv44AIdvIRQ3k+EAV0Sq2WeJHvXuK7gL7bovSxOf8Al7MLH7Eh3rdovH4KHFnlIty7J71mzvQBl5Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-ini@3.972.4': + resolution: {integrity: sha512-eRUg+3HaUKuXWn/lEMirdiA5HOKmEl8hEHVuszIDt2MMBUKgVX5XNGmb3XmbgU17h6DZ+RtjbxQpjhz3SbTjZg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-login@3.972.4': + resolution: {integrity: sha512-nLGjXuvWWDlQAp505xIONI7Gam0vw2p7Qu3P6on/W2q7rjJXtYjtpHbcsaOjJ/pAju3eTvEQuSuRedcRHVQIAQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-node@3.972.5': + resolution: {integrity: sha512-VWXKgSISQCI2GKN3zakTNHSiZ0+mux7v6YHmmbLQp/o3fvYUQJmKGcLZZzg2GFA+tGGBStplra9VFNf/WwxpYg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-process@3.972.4': + resolution: {integrity: sha512-TCZpWUnBQN1YPk6grvd5x419OfXjHvhj5Oj44GYb84dOVChpg/+2VoEj+YVA4F4E/6huQPNnX7UYbTtxJqgihw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-sso@3.972.4': + resolution: {integrity: sha512-wzsGwv9mKlwJ3vHLyembBvGE/5nPUIwRR2I51B1cBV4Cb4ql9nIIfpmHzm050XYTY5fqTOKJQnhLj7zj89VG8g==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.4': + resolution: {integrity: sha512-hIzw2XzrG8jzsUSEatehmpkd5rWzASg5IHUfA+m01k/RtvfAML7ZJVVohuKdhAYx+wV2AThLiQJVzqn7F0khrw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-host-header@3.972.3': + resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-logger@3.972.3': + resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.972.3': + resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/middleware-user-agent@3.972.6': + resolution: {integrity: sha512-TehLN8W/kivl0U9HcS+keryElEWORROpghDXZBLfnb40DXM7hx/i+7OOjkogXQOF3QtUraJVRkHQ07bPhrWKlw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.982.0': + resolution: {integrity: sha512-VVkaH27digrJfdVrT64rjkllvOp4oRiZuuJvrylLXAKl18ujToJR7AqpDldL/LS63RVne3QWIpkygIymxFtliQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/region-config-resolver@3.972.3': + resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/token-providers@3.982.0': + resolution: {integrity: sha512-v3M0KYp2TVHYHNBT7jHD9lLTWAdS9CaWJ2jboRKt0WAB65bA7iUEpR+k4VqKYtpQN4+8kKSc4w+K6kUNZkHKQw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.973.1': + resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-endpoints@3.982.0': + resolution: {integrity: sha512-M27u8FJP7O0Of9hMWX5dipp//8iglmV9jr7R8SR8RveU+Z50/8TqH68Tu6wUWBGMfXjzbVwn1INIAO5lZrlxXQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-locate-window@3.965.4': + resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-user-agent-browser@3.972.3': + resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} + + '@aws-sdk/util-user-agent-node@3.972.4': + resolution: {integrity: sha512-3WFCBLiM8QiHDfosQq3Py+lIMgWlFWwFQliUHUqwEiRqLnKyhgbU3AKa7AWJF7lW2Oc/2kFNY4MlAYVnVc0i8A==} + engines: {node: '>=20.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.972.4': + resolution: {integrity: sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.2.3': + resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + engines: {node: '>=18.0.0'} + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.0': + resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime-corejs3@7.28.0': - resolution: {integrity: sha512-nlIXnSqLcBij8K8TtkxbBJgfzfvi75V1pAKSM7dUXejGw12vJAqez74jZrHTsJ3Z+Aczc5Q/6JgNjKRMsVU44g==} + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@base-org/account@2.5.1': + resolution: {integrity: sha512-3VhLcpuUByIXO1elzMSl6Hhn8ac4AKZaEjtHCLppN28Wq5nqWNiWxi1L6koSO8Obtebc6gq7lVVbJkv4X63p/g==} - '@changesets/apply-release-plan@7.0.12': - resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} + '@bytecodealliance/preview2-shim@0.17.7': + resolution: {integrity: sha512-VFUQHwSScO+zO466DlsmNlNeCf6sUsHBazvisb3hmGCbiPxwAMn1rGmnwinM+6zcLJw0CqkV0h2JzL3MdudhJQ==} + + '@changesets/apply-release-plan@7.0.14': + resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} '@changesets/assemble-release-plan@6.0.9': resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} @@ -536,12 +604,12 @@ packages: '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.5': - resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} + '@changesets/cli@2.29.8': + resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} hasBin: true - '@changesets/config@3.1.1': - resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + '@changesets/config@3.1.2': + resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -549,8 +617,8 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.13': - resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} + '@changesets/get-release-plan@4.0.14': + resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -561,14 +629,14 @@ packages: '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.1': - resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + '@changesets/parse@0.4.2': + resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} '@changesets/pre@2.0.2': resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.5': - resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + '@changesets/read@0.6.6': + resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} '@changesets/should-skip-package@0.1.2': resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} @@ -582,461 +650,790 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + '@chevrotain/cst-dts-gen@10.5.0': + resolution: {integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==} - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@chevrotain/gast@10.5.0': + resolution: {integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==} - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@chevrotain/types@10.5.0': + resolution: {integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==} - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] + '@chevrotain/utils@10.5.0': + resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==} - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] + '@codesandbox/sdk@3.0.0-rc.1': + resolution: {integrity: sha512-hJ1hmtxLN04rOFQHm0/K/d2D4aBJEgQwAZgLmut8b+Pw0UkafiCMcGqn/rg4C1fwqGgiJ1vJs9vuHM9VssTGVA==} + hasBin: true - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] + '@coinbase/cdp-sdk@1.43.1': + resolution: {integrity: sha512-3eXP24p5q68agRgu8grGlF+ASidf3xYSDQtdRuDOFCMZafbqANsjl/JxLwYDmUenRodhxBBJgYJ65nOALP58tA==} - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + '@coinbase/wallet-sdk@4.3.6': + resolution: {integrity: sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==} - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@databeat/tracker@0.9.3': + resolution: {integrity: sha512-eGsiNU/CRFujcNtUUqvBiqveCs6S6SiAhalXPDodbk74d3FzvLqHDn5k6WfOEJIhrP3CbYgfMXL0nk51s/rQsg==} + + '@ecies/ciphers@0.2.5': + resolution: {integrity: sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + + '@edge-runtime/format@2.2.1': + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} + engines: {node: '>=16'} + + '@edge-runtime/node-utils@2.3.0': + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + + '@edge-runtime/ponyfill@2.4.2': + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + + '@edge-runtime/primitives@4.1.0': + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + + '@edge-runtime/vm@3.2.0': + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + + '@electric-sql/pglite-socket@0.0.20': + resolution: {integrity: sha512-J5nLGsicnD9wJHnno9r+DGxfcZWh+YJMCe0q/aCgtG6XOm9Z7fKeite8IZSNXgZeGltSigM9U/vAWZQWdgcSFg==} + hasBin: true + peerDependencies: + '@electric-sql/pglite': 0.3.15 + + '@electric-sql/pglite-tools@0.2.20': + resolution: {integrity: sha512-BK50ZnYa3IG7ztXhtgYf0Q7zijV32Iw1cYS8C+ThdQlwx12V5VZ9KRJ42y82Hyb4PkTxZQklVQA9JHyUlex33A==} + peerDependencies: + '@electric-sql/pglite': 0.3.15 + + '@electric-sql/pglite@0.3.15': + resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} + + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/stylis@0.8.5': + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} + + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/rlp@5.0.2': + resolution: {integrity: sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==} + engines: {node: '>=18'} + hasBin: true - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/react-dom@2.1.7': + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@gemini-wallet/core@0.3.2': + resolution: {integrity: sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==} + peerDependencies: + viem: '>=2.0.0' - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@gql.tada/cli-utils@1.7.2': + resolution: {integrity: sha512-Qbc7hbLvCz6IliIJpJuKJa9p05b2Jona7ov7+qofCsMRxHRZE1kpAmZMvL8JCI4c0IagpIlWNaMizXEQUe8XjQ==} + peerDependencies: + '@0no-co/graphqlsp': ^1.12.13 + '@gql.tada/svelte-support': 1.0.1 + '@gql.tada/vue-support': 1.0.1 + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 + peerDependenciesMeta: + '@gql.tada/svelte-support': + optional: true + '@gql.tada/vue-support': + optional: true - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} + '@gql.tada/internal@1.0.8': + resolution: {integrity: sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==} + peerDependencies: + graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 + typescript: ^5.0.0 - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} + '@graphql-typed-document-node/core@3.2.0': + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} + peerDependencies: + graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + '@hey-api/client-fetch@0.7.3': + resolution: {integrity: sha512-nysIXMag9nr5ENy+47G0AYsegdT7vT6S4KLfY7NVgM6HsyZ0DrhCZvz5nP70M16x9i860SrnXhjpcuHx0g5sDQ==} + deprecated: Starting with v0.73.0, this package is bundled directly inside @hey-api/openapi-ts. - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} + '@hono/node-server@1.19.9': + resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: '>=4.11.7' - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + '@iarna/toml@2.2.5': + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} - '@img/sharp-darwin-arm64@0.34.4': - resolution: {integrity: sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==} + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.4': - resolution: {integrity: sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.2.3': - resolution: {integrity: sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.2.3': - resolution: {integrity: sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.2.3': - resolution: {integrity: sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-arm@1.2.3': - resolution: {integrity: sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-ppc64@1.2.3': - resolution: {integrity: sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-s390x@1.2.3': - resolution: {integrity: sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==} + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linux-x64@1.2.3': - resolution: {integrity: sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': - resolution: {integrity: sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] - '@img/sharp-libvips-linuxmusl-x64@1.2.3': - resolution: {integrity: sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] - '@img/sharp-linux-arm64@0.34.4': - resolution: {integrity: sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@img/sharp-linux-arm@0.34.4': - resolution: {integrity: sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] - '@img/sharp-linux-ppc64@0.34.4': - resolution: {integrity: sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] - '@img/sharp-linux-s390x@0.34.4': - resolution: {integrity: sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==} + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] - '@img/sharp-linux-x64@0.34.4': - resolution: {integrity: sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] - '@img/sharp-linuxmusl-arm64@0.34.4': - resolution: {integrity: sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] - '@img/sharp-linuxmusl-x64@0.34.4': - resolution: {integrity: sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] - '@img/sharp-wasm32@0.34.4': - resolution: {integrity: sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.4': - resolution: {integrity: sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.4': - resolution: {integrity: sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==} + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.4': - resolution: {integrity: sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@inkjs/ui@2.0.0': + resolution: {integrity: sha512-5+8fJmwtF9UvikzLfph9sA+LS+l37Ij/szQltkuXLOAXwNkBX9innfzh4pLGXIB59vKEQUtc6D4qGvhD7h3pAg==} + engines: {node: '>=18'} + peerDependencies: + ink: '>=5' + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/balanced-match@4.0.1': resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} engines: {node: 20 || >=22} - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + '@isaacs/brace-expansion@5.0.1': + resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@juanelas/base64@1.1.5': + resolution: {integrity: sha512-mjAF27LzwfYobdwqnxZgeucbKT5wRRNvILg3h5OvCWK+3F7mw/A1tnjHnNiTYtLmTvT/bM1jA5AX7eQawDGs1w==} + + '@lit-labs/ssr-dom-shim@1.5.1': + resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@next/env@15.4.7': - resolution: {integrity: sha512-PrBIpO8oljZGTOe9HH0miix1w5MUiGJ/q83Jge03mHEE0E3pyqzAy2+l5G6aJDbXoobmxPJTVhbCuwlLtjSHwg==} + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + + '@metamask/abi-utils@3.0.0': + resolution: {integrity: sha512-a/l0DiSIr7+CBYVpHygUa3ztSlYLFCQMsklLna+t6qmNY9+eIO5TedNxhyIyvaJ+4cN7TLy0NQFbp9FV3X2ktg==} + engines: {node: ^18.18 || ^20.14 || >=22} + + '@metamask/eth-sig-util@8.2.0': + resolution: {integrity: sha512-LZDglIh4gYGw9Myp+2aIwKrj6lIJpMC4e0m7wKJU+BxLLBFcrTgKrjdjstXGVWvuYG3kutlh9J+uNBRPJqffWQ==} + engines: {node: ^18.18 || ^20.14 || >=22} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@2.1.0': + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + + '@metamask/rpc-errors@6.4.0': + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} + + '@metamask/rpc-errors@7.0.2': + resolution: {integrity: sha512-YYYHsVYd46XwY2QZzpGeU4PSdRhHdxnzkB8piWGvJW2xbikZ3R+epAYEL4q/K8bh9JPTucsUdwRFnACor1aOYw==} + engines: {node: ^18.20 || ^20.17 || >=22} + + '@metamask/safe-event-emitter@3.1.2': + resolution: {integrity: sha512-5yb2gMI1BDm0JybZezeoX/3XhPDOtTbcFvpTXM9kxsoZjPZFh4XciqRbpD6N86HYZqWDhEaKUDuOyR0sQHEjMA==} + engines: {node: '>=12.0.0'} + + '@metamask/sdk-analytics@0.0.5': + resolution: {integrity: sha512-fDah+keS1RjSUlC8GmYXvx6Y26s3Ax1U9hGpWb6GSY5SAdmTSIqp2CvYy6yW0WgLhnYhW+6xERuD0eVqV63QIQ==} + + '@metamask/sdk-communication-layer@0.33.1': + resolution: {integrity: sha512-0bI9hkysxcfbZ/lk0T2+aKVo1j0ynQVTuB3sJ5ssPWlz+Z3VwveCkP1O7EVu1tsVVCb0YV5WxK9zmURu2FIiaA==} + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: '*' + eventemitter2: ^6.4.9 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + + '@metamask/sdk-install-modal-web@0.32.1': + resolution: {integrity: sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw==} + + '@metamask/sdk@0.33.1': + resolution: {integrity: sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==} + + '@metamask/superstruct@3.2.1': + resolution: {integrity: sha512-fLgJnDOXFmuVlB38rUN5SmU7hAFQcCjrg3Vrxz67KTY7YHFnSNEKvX4avmEBdOI0yTCxZjwMCFEqsC8k2+Wd3g==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@11.9.0': + resolution: {integrity: sha512-wRnoSDD9jTWOge/+reFviJQANhS+uy8Y+OEwRanp5mQeGTjBFmK1r2cTOnei2UCZRV1crXHzeJVSFEoDDcgRbA==} + engines: {node: ^18.18 || ^20.14 || >=22} + + '@metamask/utils@8.5.0': + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@9.3.0': + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} + + '@motionone/animation@10.18.0': + resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} + + '@motionone/dom@10.12.0': + resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==} + + '@motionone/easing@10.18.0': + resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} + + '@motionone/generators@10.18.0': + resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} + + '@motionone/types@10.17.1': + resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} + + '@motionone/utils@10.18.0': + resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} + + '@mrleebo/prisma-ast@0.13.1': + resolution: {integrity: sha512-XyroGQXcHrZdvmrGJvsA9KNeOOgGMg1Vg9OlheUsBOSKznLMDl+YChxbkboRHvtFYJEMRYmlV3uoo/njCw05iw==} + engines: {node: '>=16'} + + '@mysten/bcs@1.9.2': + resolution: {integrity: sha512-kBk5xrxV9OWR7i+JhL/plQrgQ2/KJhB2pB5gj+w6GXhbMQwS3DPpOvi/zN0Tj84jwPvHMllpEl0QHj6ywN7/eQ==} + + '@mysten/sui@1.45.2': + resolution: {integrity: sha512-gftf7fNpFSiXyfXpbtP2afVEnhc7p2m/MEYc/SO5pov92dacGKOpQIF7etZsGDI1Wvhv+dpph+ulRNpnYSs7Bg==} + engines: {node: '>=18'} + + '@mysten/utils@0.2.0': + resolution: {integrity: sha512-CM6kJcJHX365cK6aXfFRLBiuyXc5WSBHQ43t94jqlCAIRw8umgNcTb5EnEA9n31wPAQgLDGgbG/rCUISCTJ66w==} - '@next/eslint-plugin-next@15.4.2': - resolution: {integrity: sha512-k0rjdWjXBY6tAOty1ckrMETE6Mx66d85NsgcAIdDp7/cXOsTJ93ywmbg3uUcpxX5TUHFEcCWI5mb8nPhwCe9jg==} + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} - '@next/swc-darwin-arm64@15.4.7': - resolution: {integrity: sha512-2Dkb+VUTp9kHHkSqtws4fDl2Oxms29HcZBwFIda1X7Ztudzy7M6XF9HDS2dq85TmdN47VpuhjE+i6wgnIboVzQ==} + '@next/env@16.1.6': + resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} + + '@next/swc-darwin-arm64@16.1.6': + resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.4.7': - resolution: {integrity: sha512-qaMnEozKdWezlmh1OGDVFueFv2z9lWTcLvt7e39QA3YOvZHNpN2rLs/IQLwZaUiw2jSvxW07LxMCWtOqsWFNQg==} + '@next/swc-darwin-x64@16.1.6': + resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.4.7': - resolution: {integrity: sha512-ny7lODPE7a15Qms8LZiN9wjNWIeI+iAZOFDOnv2pcHStncUr7cr9lD5XF81mdhrBXLUP9yT9RzlmSWKIazWoDw==} + '@next/swc-linux-arm64-gnu@16.1.6': + resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@next/swc-linux-arm64-musl@15.4.7': - resolution: {integrity: sha512-4SaCjlFR/2hGJqZLLWycccy1t+wBrE/vyJWnYaZJhUVHccpGLG5q0C+Xkw4iRzUIkE+/dr90MJRUym3s1+vO8A==} + '@next/swc-linux-arm64-musl@16.1.6': + resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] - '@next/swc-linux-x64-gnu@15.4.7': - resolution: {integrity: sha512-2uNXjxvONyRidg00VwvlTYDwC9EgCGNzPAPYbttIATZRxmOZ3hllk/YYESzHZb65eyZfBR5g9xgCZjRAl9YYGg==} + '@next/swc-linux-x64-gnu@16.1.6': + resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] - '@next/swc-linux-x64-musl@15.4.7': - resolution: {integrity: sha512-ceNbPjsFgLscYNGKSu4I6LYaadq2B8tcK116nVuInpHHdAWLWSwVK6CHNvCi0wVS9+TTArIFKJGsEyVD1H+4Kg==} + '@next/swc-linux-x64-musl@16.1.6': + resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] - '@next/swc-win32-arm64-msvc@15.4.7': - resolution: {integrity: sha512-pZyxmY1iHlZJ04LUL7Css8bNvsYAMYOY9JRwFA3HZgpaNKsJSowD09Vg2R9734GxAcLJc2KDQHSCR91uD6/AAw==} + '@next/swc-win32-arm64-msvc@16.1.6': + resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.4.7': - resolution: {integrity: sha512-HjuwPJ7BeRzgl3KrjKqD2iDng0eQIpIReyhpF5r4yeAHFwWRuAhfW92rWv/r3qeQHEwHsLRzFDvMqRjyM5DI6A==} + '@next/swc-win32-x64-msvc@16.1.6': + resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@noble/ciphers@1.2.1': + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} + '@noble/ciphers@1.3.0': resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.9.2': - resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==} + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} engines: {node: ^14.21.3 || >=16} '@noble/curves@1.9.4': resolution: {integrity: sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==} engines: {node: ^14.21.3 || >=16} + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/ed25519@1.7.3': + resolution: {integrity: sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==} + + '@noble/hashes@1.0.0': + resolution: {integrity: sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1049,3446 +1446,11655 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@nomicfoundation/slang@1.3.1': + resolution: {integrity: sha512-gh0+JDjazmevEYCcwVgtuyfBJcV1209gIORZNRjUxbGzbQN0MOhQO9T0ptkzHKCf854gUy27SMxPbAyAu63fvQ==} - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} - cpu: [arm] - os: [android] + '@okx-dex/okx-dex-sdk@1.0.18': + resolution: {integrity: sha512-KKsZIPqP2PZx5fg8J8SefBrJNl04cXaysJMyxtIC1XmY5CePYfisJUFxsFfnoXUjjFANSwqAic6WkLXNfq1QlA==} - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} - cpu: [arm64] - os: [android] + '@okxweb3/coin-base@1.1.6': + resolution: {integrity: sha512-Cy4oTqZ1itunysOr24b/JJwQQxp5zMrwQputrKcxOzpkmbTzRT66kbg+lQTe62Z0AYgnUG1kEShkVctuSrFYIg==} - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} - cpu: [arm64] - os: [darwin] + '@okxweb3/coin-ethereum@1.1.2': + resolution: {integrity: sha512-RsHssf1cm0xJG6F3jFzl1W0HPlgzmdpdDtO5FvMHn8TcfsQPM7P2VMlrmxvYw1AOcfB/k1Ofu3llcwb2AuCrtg==} - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} - cpu: [x64] - os: [darwin] + '@okxweb3/coin-sui@1.1.3': + resolution: {integrity: sha512-L0t+YSdTysGdtEy/fDZNJAaqxbk92llda/0cTAGKCW0e4hR/aBoly62ee5lBl7XItnc0sC1FKaXArGazIqqN7Q==} - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} - cpu: [arm64] - os: [freebsd] + '@okxweb3/crypto-lib@1.0.13': + resolution: {integrity: sha512-UUg7UVhegXPabOMX9EffxGraUODnNj9JoKDtOvus1D/Eu7UPfUu26dO4fB1PAqypb5s2kl1uhffz7AZcQzV3ew==} - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} - cpu: [x64] - os: [freebsd] + '@opentelemetry/api-logs@0.57.2': + resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} + engines: {node: '>=14'} - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} - cpu: [arm] - os: [linux] + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} - cpu: [arm] - os: [linux] + '@opentelemetry/context-async-hooks@1.30.1': + resolution: {integrity: sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} - cpu: [arm64] - os: [linux] + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} - cpu: [arm64] - os: [linux] + '@opentelemetry/instrumentation-amqplib@0.46.1': + resolution: {integrity: sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} - cpu: [loong64] - os: [linux] + '@opentelemetry/instrumentation-connect@0.43.1': + resolution: {integrity: sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} - cpu: [ppc64] - os: [linux] + '@opentelemetry/instrumentation-dataloader@0.16.1': + resolution: {integrity: sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} - cpu: [riscv64] - os: [linux] + '@opentelemetry/instrumentation-express@0.47.1': + resolution: {integrity: sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} - cpu: [riscv64] - os: [linux] + '@opentelemetry/instrumentation-fs@0.19.1': + resolution: {integrity: sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} - cpu: [s390x] - os: [linux] + '@opentelemetry/instrumentation-generic-pool@0.43.1': + resolution: {integrity: sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} - cpu: [x64] - os: [linux] + '@opentelemetry/instrumentation-graphql@0.47.1': + resolution: {integrity: sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} - cpu: [x64] - os: [linux] + '@opentelemetry/instrumentation-hapi@0.45.2': + resolution: {integrity: sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} - cpu: [arm64] - os: [win32] + '@opentelemetry/instrumentation-http@0.57.2': + resolution: {integrity: sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} - cpu: [x64] - os: [win32] + '@opentelemetry/instrumentation-ioredis@0.47.1': + resolution: {integrity: sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@scure/base@1.2.6': - resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + '@opentelemetry/instrumentation-kafkajs@0.7.1': + resolution: {integrity: sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@scure/bip32@1.7.0': - resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + '@opentelemetry/instrumentation-knex@0.44.1': + resolution: {integrity: sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@scure/bip39@1.6.0': - resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@opentelemetry/instrumentation-koa@0.47.1': + resolution: {integrity: sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@opentelemetry/instrumentation-lru-memoizer@0.44.1': + resolution: {integrity: sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + '@opentelemetry/instrumentation-mongodb@0.52.0': + resolution: {integrity: sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + '@opentelemetry/instrumentation-mongoose@0.46.1': + resolution: {integrity: sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@opentelemetry/instrumentation-mysql2@0.45.2': + resolution: {integrity: sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@opentelemetry/instrumentation-mysql@0.45.1': + resolution: {integrity: sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@opentelemetry/instrumentation-pg@0.51.1': + resolution: {integrity: sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@turbo/gen@1.13.4': - resolution: {integrity: sha512-PK38N1fHhDUyjLi0mUjv0RbX0xXGwDLQeRSGsIlLcVpP1B5fwodSIwIYXc9vJok26Yne94BX5AGjueYsUT3uUw==} - hasBin: true + '@opentelemetry/instrumentation-redis-4@0.46.1': + resolution: {integrity: sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@turbo/workspaces@1.13.4': - resolution: {integrity: sha512-3uYg2b5TWCiupetbDFMbBFMHl33xQTvp5DNg0fZSYal73Z9AlFH9yWabHWMYw6ywmwM1evkYRpTVA2n7GgqT5A==} - hasBin: true + '@opentelemetry/instrumentation-tedious@0.18.1': + resolution: {integrity: sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@opentelemetry/instrumentation-undici@0.10.1': + resolution: {integrity: sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.7.0 - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@opentelemetry/instrumentation@0.57.2': + resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@opentelemetry/redis-common@0.36.2': + resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} + engines: {node: '>=14'} - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@types/inquirer@6.5.0': - resolution: {integrity: sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==} + '@opentelemetry/sdk-trace-base@1.30.1': + resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} - '@types/minimatch@6.0.0': - resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} - deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. + '@opentelemetry/semantic-conventions@1.39.0': + resolution: {integrity: sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==} + engines: {node: '>=14'} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@opentelemetry/sql-common@0.40.1': + resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.1.0 - '@types/node@20.19.9': - resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} + '@oxc-project/types@0.110.0': + resolution: {integrity: sha512-6Ct21OIlrEnFEJk5LT4e63pk3btsI6/TusD/GStLi7wYlGJNOl1GI9qvXAnRAxQU9zqA2Oz+UwhfTOU2rPZVow==} - '@types/node@22.16.5': - resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==} + '@oxc-transform/binding-android-arm-eabi@0.111.0': + resolution: {integrity: sha512-NdFLicvorfHYu0g2ftjVJaH7+Dz27AQUNJOq8t/ofRUoWmczOodgUCHx8C1M1htCN4ZmhS/FzfSy6yd/UngJGg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + '@oxc-transform/binding-android-arm64@0.111.0': + resolution: {integrity: sha512-J2v9ajarD2FYlhHtjbgZUFsS2Kvi27pPxDWLGCy7i8tO60xBoozX9/ktSgbiE/QsxKaUhfv4zVKppKWUo71PmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@oxc-transform/binding-darwin-arm64@0.111.0': + resolution: {integrity: sha512-2UYmExxpXzmiHTldhNlosWqG9Nc4US51K0GB9RLcGlTE23WO33vVo1NVAKwxPE+KYuhffwDnRYTovTMUjzwvZA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] - '@types/react-dom@18.3.1': - resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + '@oxc-transform/binding-darwin-x64@0.111.0': + resolution: {integrity: sha512-c4YRwfLV8Pj/ToiTCbndZaHxM2BD4W3bltr/fjXZcGypEK+U2RZFDL7tIZYT/tyneAC9hCORZKDaKhLLNuzPtA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] - '@types/react@18.3.0': - resolution: {integrity: sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==} + '@oxc-transform/binding-freebsd-x64@0.111.0': + resolution: {integrity: sha512-prvf32IcEuLnLZbNVomFosBu0CaZpyj3YsZ6epbOgJy8iJjfLsXBb+PrkO/NBKzjuJoJa2+u7jFKRE0KT7gSOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] - '@types/react@18.3.1': - resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + '@oxc-transform/binding-linux-arm-gnueabihf@0.111.0': + resolution: {integrity: sha512-+se3579Wp7VOk8TnTZCpT+obTAyzOw2b/UuoM0+51LtbzCSfjKxd4A+o7zRl7GyPrPZvx57KdbMOC9rWB1xNrw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] - '@types/through@0.0.33': - resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + '@oxc-transform/binding-linux-arm-musleabihf@0.111.0': + resolution: {integrity: sha512-8faC99pStqaSDPK/vBgaagAHUeL0LcIzfeSjSiDTtvPGc3AwZIeqC1tx3CP15a6tWXjdgS/IUw4IjfD5HweBlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] - '@types/tinycolor2@1.4.6': - resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} + '@oxc-transform/binding-linux-arm64-gnu@0.111.0': + resolution: {integrity: sha512-HtfQv8j796gzI5WR/RaP6IMwFpiL0vYeDrUA1hYhlPzTHKYan/B+NlhJkKOI1v24yAl/yEnFmb0pxIxLNqBqBA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@oxc-transform/binding-linux-arm64-musl@0.111.0': + resolution: {integrity: sha512-ARyfcMCIxVLDgLf6FQ8Oo1/TFySpnquV+vuSb4SFQZfYDqgMklzwv0NYXxWD0aB6enElyMDs6pQJBzusEKCkOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + '@oxc-transform/binding-linux-ppc64-gnu@0.111.0': + resolution: {integrity: sha512-PKpVRrSvBNK3tv9vwxn7Fay+QWZmprPGlEqJcseBJllQc5mFMD4Q/w44chu5iR9ZLsDeSHzmNWrgMLo4J0sP2A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@typescript-eslint/eslint-plugin@8.38.0': - resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.38.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + '@oxc-transform/binding-linux-riscv64-gnu@0.111.0': + resolution: {integrity: sha512-9bUml6rMgk+8GF5rvNMweFspkzSiCjqpV6HduwiUyexqfGKrmjq9IZOxxvnzkE2RGdQzP507NNDoVNYIoGQYuA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] - '@typescript-eslint/parser@8.38.0': - resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + '@oxc-transform/binding-linux-riscv64-musl@0.111.0': + resolution: {integrity: sha512-tzGCohGxaeH6KRJjfYZd4mHCoGjCai6N+zZi1Oj+tSDMAAdyvs1dRzYb8PNUGnybCg3Te4M0jLPzWZaSmnKraQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] - '@typescript-eslint/project-service@8.38.0': - resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' + '@oxc-transform/binding-linux-s390x-gnu@0.111.0': + resolution: {integrity: sha512-sRG1KIfZ0ML9ToEygm5aM/5GJeBA05uHlgW3M0Rx/DNWMJhuahLmqWuB02aWSmijndLfEKXLLXIWhvWupRG8lg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] - '@typescript-eslint/scope-manager@8.38.0': - resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@oxc-transform/binding-linux-x64-gnu@0.111.0': + resolution: {integrity: sha512-T0Kmvk+OdlUdABdXlDIf3MQReMzFfC75NEI9x8jxy5pKooACEFg0k0V8gyR3gq4DzbDCfucqFQDWNvSgIopAbQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] - '@typescript-eslint/tsconfig-utils@8.38.0': - resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' + '@oxc-transform/binding-linux-x64-musl@0.111.0': + resolution: {integrity: sha512-EgoutsP3YfqzN8a9vpc9+XLr0bmBl0dA3uOMiP77+exATCPxJBkJErGmQkqk6RtTp5XqX6q6mB45qWQyKk6+pA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] - '@typescript-eslint/type-utils@8.38.0': - resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + '@oxc-transform/binding-openharmony-arm64@0.111.0': + resolution: {integrity: sha512-d8J+ejc0j5WODbVwR/QxFaI65YMwvG0W53vcVCHwa6ja1QI5lpe7sislrefG2EFYgnY47voMRzlXab5d4gEcDw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] - '@typescript-eslint/types@8.38.0': - resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@oxc-transform/binding-wasm32-wasi@0.111.0': + resolution: {integrity: sha512-HtyIZO8IwuZgXkyb56rysLz1OLbfLhEu8A3BeuyJXzUseAj96yuxgGt3cu3QYX9AXb9pfRfA3c/fvlhsDugyTQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] - '@typescript-eslint/typescript-estree@8.38.0': - resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' + '@oxc-transform/binding-win32-arm64-msvc@0.111.0': + resolution: {integrity: sha512-YeP80Riptc0MkVVBnzbmoFuHVLUq278+MbwNo9sTLALmzTIJxJqN029xRZbG+Bun7aLsoZhmRnm3J5JZ1NcP5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] - '@typescript-eslint/utils@8.38.0': - resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + '@oxc-transform/binding-win32-ia32-msvc@0.111.0': + resolution: {integrity: sha512-A6ztCXpoSHt6PbvGAFqB0MLOcGG7ZJrrPXY1iB0zfOB1atLgI8oNePGxPl03XSbwpiTsFJ1oo8rj9DXcBzgT9g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] - '@typescript-eslint/visitor-keys@8.38.0': - resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@oxc-transform/binding-win32-x64-msvc@0.111.0': + resolution: {integrity: sha512-QddKW4kBH0Wof6Y65eYCNHM4iOGmCTWLLcNYY1FGswhzmTYOUVXajNROR+iCXAOFnOF0ldtsR79SyqgyHH1Bgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} - peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 - peerDependenciesMeta: - '@vitest/browser': - optional: true + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} - peerDependencies: - msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - abitype@1.0.8: - resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + '@paulmillr/qr@0.2.1': + resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} + deprecated: 'The package is now available as "qr": npm install qr' - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + '@prisma/config@7.3.0': + resolution: {integrity: sha512-QyMV67+eXF7uMtKxTEeQqNu/Be7iH+3iDZOQZW5ttfbSwBamCSdwPszA0dum+Wx27I7anYTPLmRmMORKViSW1A==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + '@prisma/debug@7.2.0': + resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} + '@prisma/debug@7.3.0': + resolution: {integrity: sha512-yh/tHhraCzYkffsI1/3a7SHX8tpgbJu1NPnuxS4rEpJdWAUDHUH25F1EDo6PPzirpyLNkgPPZdhojQK804BGtg==} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + '@prisma/dev@0.20.0': + resolution: {integrity: sha512-ovlBYwWor0OzG+yH4J3Ot+AneD818BttLA+Ii7wjbcLHUrnC4tbUPVGyNd3c/+71KETPKZfjhkTSpdS15dmXNQ==} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + '@prisma/engines-version@7.3.0-16.9d6ad21cbbceab97458517b147a6a09ff43aa735': + resolution: {integrity: sha512-IH2va2ouUHihyiTTRW889LjKAl1CusZOvFfZxCDNpjSENt7g2ndFsK0vdIw/72v7+jCN6YgkHmdAP/BI7SDgyg==} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + '@prisma/engines@7.3.0': + resolution: {integrity: sha512-cWRQoPDXPtR6stOWuWFZf9pHdQ/o8/QNWn0m0zByxf5Kd946Q875XdEJ52pEsX88vOiXUmjuPG3euw82mwQNMg==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + '@prisma/fetch-engine@7.3.0': + resolution: {integrity: sha512-Mm0F84JMqM9Vxk70pzfNpGJ1lE4hYjOeLMu7nOOD1i83nvp8MSAcFYBnHqLvEZiA6onUR+m8iYogtOY4oPO5lQ==} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + '@prisma/get-platform@7.2.0': + resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + '@prisma/get-platform@7.3.0': + resolution: {integrity: sha512-N7c6m4/I0Q6JYmWKP2RCD/sM9eWiyCPY98g5c0uEktObNSZnugW2U/PO+pwL0UaqzxqTXt7gTsYsb0FnMnJNbg==} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + '@prisma/instrumentation@6.11.1': + resolution: {integrity: sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==} + peerDependencies: + '@opentelemetry/api': ^1.8 - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} + '@prisma/query-plan-executor@7.2.0': + resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==} - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} + '@prisma/studio-core@0.13.1': + resolution: {integrity: sha512-agdqaPEePRHcQ7CexEfkX1RvSH9uWDb6pXrZnhCRykhDFAV0/0P3d07WtfiY8hZWb7oRU4v+NkT4cGFHkQJIPg==} + peerDependencies: + '@types/react': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + '@protobuf-ts/grpcweb-transport@2.11.1': + resolution: {integrity: sha512-1W4utDdvOB+RHMFQ0soL4JdnxjXV+ddeGIUg08DvZrA8Ms6k5NN6GBFU2oHZdTOcJVpPrDJ02RJlqtaoCMNBtw==} - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + '@protobuf-ts/runtime-rpc@2.11.1': + resolution: {integrity: sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==} - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} + '@protobuf-ts/runtime@2.11.1': + resolution: {integrity: sha512-KuDaT1IfHkugM2pyz+FwiY80ejWrkH1pAtOBOZFuR6SXEFTsnb/jiQWQ1rCIrcKx2BtyxnxW6BWwsVSA/Ie+WQ==} - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - asn1js@3.0.6: - resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} - engines: {node: '>=12.0.0'} + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.8': + resolution: {integrity: sha512-5nZrJTF7gH+e0nZS7/QxFz6tJV4VimhQb1avEgtsJxvvIp5JilL+c58HICsKzPxghdwaDt48hEfPM1au4zGy+w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.3.3': + resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.12': + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.3': + resolution: {integrity: sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.16': + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-menu@2.1.16': + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.8': + resolution: {integrity: sha512-+gISHcSPUJ7ktBy9RnTqbdKW78bcGke3t6taawyZ71pio1JewwGSJizycs7rLhGTvMJYCQB1DBK4KQsxs7U8dA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.3.8': + resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.6': + resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.2.6': + resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toast@1.2.15': + resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.8': + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-visually-hidden@1.2.4': + resolution: {integrity: sha512-kaeiyGCe844dkb9AVF+rb4yTyb1LiLN/e3es3nLiRyN4dC8AduBYPMnnNlDjX2VDOcvDEiPnRNMJeWCfsX0txg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + + '@react-oauth/google@0.11.1': + resolution: {integrity: sha512-tywZisXbsdaRBVbEu0VX6dRbOSL2I6DgY97woq5NMOOOz+xtDsm418vqq+Vx10KMtra3kdHMRMf0hXLWrk2RMg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@reown/appkit-common@1.7.8': + resolution: {integrity: sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==} + + '@reown/appkit-controllers@1.7.8': + resolution: {integrity: sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==} + + '@reown/appkit-pay@1.7.8': + resolution: {integrity: sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==} + + '@reown/appkit-polyfills@1.7.8': + resolution: {integrity: sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==} + + '@reown/appkit-scaffold-ui@1.7.8': + resolution: {integrity: sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==} + + '@reown/appkit-ui@1.7.8': + resolution: {integrity: sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==} + + '@reown/appkit-utils@1.7.8': + resolution: {integrity: sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==} + peerDependencies: + valtio: 1.13.2 + + '@reown/appkit-wallet@1.7.8': + resolution: {integrity: sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==} + + '@reown/appkit@1.7.8': + resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} + + '@rolldown/binding-android-arm64@1.0.0-rc.1': + resolution: {integrity: sha512-He6ZoCfv5D7dlRbrhNBkuMVIHd0GDnjJwbICE1OWpG7G3S2gmJ+eXkcNLJjzjNDpeI2aRy56ou39AJM9AD8YFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-rc.1': + resolution: {integrity: sha512-YzJdn08kSOXnj85ghHauH2iHpOJ6eSmstdRTLyaziDcUxe9SyQJgGyx/5jDIhDvtOcNvMm2Ju7m19+S/Rm1jFg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-rc.1': + resolution: {integrity: sha512-cIvAbqM+ZVV6lBSKSBtlNqH5iCiW933t1q8j0H66B3sjbe8AxIRetVqfGgcHcJtMzBIkIALlL9fcDrElWLJQcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-rc.1': + resolution: {integrity: sha512-rVt+B1B/qmKwCl1XD02wKfgh3vQPXRXdB/TicV2w6g7RVAM1+cZcpigwhLarqiVCxDObFZ7UgXCxPC7tpDoRog==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.1': + resolution: {integrity: sha512-69YKwJJBOFprQa1GktPgbuBOfnn+EGxu8sBJ1TjPER+zhSpYeaU4N07uqmyBiksOLGXsMegymuecLobfz03h8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.1': + resolution: {integrity: sha512-9JDhHUf3WcLfnViFWm+TyorqUtnSAHaCzlSNmMOq824prVuuzDOK91K0Hl8DUcEb9M5x2O+d2/jmBMsetRIn3g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.1': + resolution: {integrity: sha512-UvApLEGholmxw/HIwmUnLq3CwdydbhaHHllvWiCTNbyGom7wTwOtz5OAQbAKZYyiEOeIXZNPkM7nA4Dtng7CLw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.1': + resolution: {integrity: sha512-uVctNgZHiGnJx5Fij7wHLhgw4uyZBVi6mykeWKOqE7bVy9Hcxn0fM/IuqdMwk6hXlaf9fFShDTFz2+YejP+x0A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-rc.1': + resolution: {integrity: sha512-T6Eg0xWwcxd/MzBcuv4Z37YVbUbJxy5cMNnbIt/Yr99wFwli30O4BPlY8hKeGyn6lWNtU0QioBS46lVzDN38bg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.1': + resolution: {integrity: sha512-PuGZVS2xNJyLADeh2F04b+Cz4NwvpglbtWACgrDOa5YDTEHKwmiTDjoD5eZ9/ptXtcpeFrMqD2H4Zn33KAh1Eg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.1': + resolution: {integrity: sha512-2mOxY562ihHlz9lEXuaGEIDCZ1vI+zyFdtsoa3M62xsEunDXQE+DVPO4S4x5MPK9tKulG/aFcA/IH5eVN257Cw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.1': + resolution: {integrity: sha512-oQVOP5cfAWZwRD0Q3nGn/cA9FW3KhMMuQ0NIndALAe6obqjLhqYVYDiGGRGrxvnjJsVbpLwR14gIUYnpIcHR1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1': + resolution: {integrity: sha512-Ydsxxx++FNOuov3wCBPaYjZrEvKOOGq3k+BF4BPridhg2pENfitSRD2TEuQ8i33bp5VptuNdC9IzxRKU031z5A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-rc.1': + resolution: {integrity: sha512-UTBjtTxVOhodhzFVp/ayITaTETRHPUPYZPXQe0WU0wOgxghMojXxYjOiPOauKIYNWJAWS2fd7gJgGQK8GU8vDA==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + cpu: [x64] + os: [win32] + + '@safe-global/safe-apps-provider@0.18.6': + resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} + + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} + + '@safe-global/safe-gateway-typescript-sdk@3.23.1': + resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} + engines: {node: '>=16'} + + '@scure/base@1.0.0': + resolution: {integrity: sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA==} + + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} + + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} + + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} + + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + + '@sentry/core@9.47.1': + resolution: {integrity: sha512-KX62+qIt4xgy8eHKHiikfhz2p5fOciXd0Cl+dNzhgPFq8klq4MGMNaf148GB3M/vBqP4nw/eFvRMAayFCgdRQw==} + engines: {node: '>=18'} + + '@sentry/node-core@9.47.1': + resolution: {integrity: sha512-7TEOiCGkyShJ8CKtsri9lbgMCbB+qNts2Xq37itiMPN2m+lIukK3OX//L8DC5nfKYZlgikrefS63/vJtm669hQ==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.0.0 + '@opentelemetry/core': ^1.30.1 || ^2.0.0 + '@opentelemetry/instrumentation': '>=0.57.1 <1' + '@opentelemetry/resources': ^1.30.1 || ^2.0.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.0.0 + '@opentelemetry/semantic-conventions': ^1.34.0 + + '@sentry/node@9.47.1': + resolution: {integrity: sha512-CDbkasBz3fnWRKSFs6mmaRepM2pa+tbZkrqhPWifFfIkJDidtVW40p6OnquTvPXyPAszCnDZRnZT14xyvNmKPQ==} + engines: {node: '>=18'} + + '@sentry/opentelemetry@9.47.1': + resolution: {integrity: sha512-STtFpjF7lwzeoedDJV+5XA6P89BfmFwFftmHSGSe3UTI8z8IoiR5yB6X2vCjSPvXlfeOs13qCNNCEZyznxM8Xw==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.0.0 + '@opentelemetry/core': ^1.30.1 || ^2.0.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.0.0 + '@opentelemetry/semantic-conventions': ^1.34.0 + + '@sinclair/typebox@0.25.24': + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + + '@smithy/abort-controller@4.2.8': + resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.6': + resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.22.1': + resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.8': + resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.9': + resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.8': + resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.8': + resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.8': + resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.4.13': + resolution: {integrity: sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.30': + resolution: {integrity: sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.9': + resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.8': + resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.8': + resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.9': + resolution: {integrity: sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.8': + resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.8': + resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.8': + resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.8': + resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.8': + resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.4.3': + resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.8': + resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.11.2': + resolution: {integrity: sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.12.0': + resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.8': + resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.29': + resolution: {integrity: sha512-nIGy3DNRmOjaYaaKcQDzmWsro9uxlaqUOhZDHQed9MW/GmkBZPtnU70Pu1+GT9IBmUXwRdDuiyaeiy9Xtpn3+Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.32': + resolution: {integrity: sha512-7dtFff6pu5fsjqrVve0YMhrnzJtccCWDacNKOkiZjJ++fmjGExmmSu341x+WU6Oc1IccL7lDuaUj7SfrHpWc5Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.8': + resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.8': + resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.8': + resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.11': + resolution: {integrity: sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@solana-program/system@0.10.0': + resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} + peerDependencies: + '@solana/kit': ^5.0 + + '@solana-program/token@0.9.0': + resolution: {integrity: sha512-vnZxndd4ED4Fc56sw93cWZ2djEeeOFxtaPS8SPf5+a+JZjKA/EnKqzbE1y04FuMhIVrLERQ8uR8H2h72eZzlsA==} + peerDependencies: + '@solana/kit': ^5.0 + + '@solana/accounts@5.5.1': + resolution: {integrity: sha512-TfOY9xixg5rizABuLVuZ9XI2x2tmWUC/OoN556xwfDlhBHBjKfszicYYOyD6nbFmwTGYarCmyGIdteXxTXIdhQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/addresses@5.5.1': + resolution: {integrity: sha512-5xoah3Q9G30HQghu/9BiHLb5pzlPKRC3zydQDmE3O9H//WfayxTFppsUDCL6FjYUHqj/wzK6CWHySglc2RkpdA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/assertions@5.5.1': + resolution: {integrity: sha512-YTCSWAlGwSlVPnWtWLm3ukz81wH4j2YaCveK+TjpvUU88hTy6fmUqxi0+hvAMAe4zKXpJyj3Az7BrLJRxbIm4Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-core@5.5.1': + resolution: {integrity: sha512-TgBt//bbKBct0t6/MpA8ElaOA3sa8eYVvR7LGslCZ84WiAwwjCY0lW/lOYsFHJQzwREMdUyuEyy5YWBKtdh8Rw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-data-structures@5.5.1': + resolution: {integrity: sha512-97bJWGyUY9WvBz3mX1UV3YPWGDTez6btCfD0ip3UVEXJbItVuUiOkzcO5iFDUtQT5riKT6xC+Mzl+0nO76gd0w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@5.5.1': + resolution: {integrity: sha512-rllMIZAHqmtvC0HO/dc/21wDuWaD0B8Ryv8o+YtsICQBuiL/0U4AGwH7Pi5GNFySYk0/crSuwfIqQFtmxNSPFw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-strings@5.5.1': + resolution: {integrity: sha512-7klX4AhfHYA+uKKC/nxRGP2MntbYQCR3N6+v7bk1W/rSxYuhNmt+FN8aoThSZtWIKwN6BEyR1167ka8Co1+E7A==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ^5.0.0 + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + + '@solana/codecs@5.5.1': + resolution: {integrity: sha512-Vea29nJub/bXjfzEV7ZZQ/PWr1pYLZo3z0qW0LQL37uKKVzVFRQlwetd7INk3YtTD3xm9WUYr7bCvYUk3uKy2g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@5.5.1': + resolution: {integrity: sha512-vFO3p+S7HoyyrcAectnXbdsMfwUzY2zYFUc2DEe5BwpiE9J1IAxPBGjOWO6hL1bbYdBrlmjNx8DXCslqS+Kcmg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fast-stable-stringify@5.5.1': + resolution: {integrity: sha512-Ni7s2FN33zTzhTFgRjEbOVFO+UAmK8qi3Iu0/GRFYK4jN696OjKHnboSQH/EacQ+yGqS54bfxf409wU5dsLLCw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@5.5.1': + resolution: {integrity: sha512-tTHoJcEQq3gQx5qsdsDJ0LEJeFzwNpXD80xApW9o/PPoCNimI3SALkZl+zNW8VnxRrV3l3yYvfHWBKe/X3WG3w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@5.5.1': + resolution: {integrity: sha512-7z3CB7YMcFKuVvgcnNY8bY6IsZ8LG61Iytbz7HpNVGX2u1RthOs1tRW8luTzSG1MPL0Ox7afyAVMYeFqSPHnaQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@5.5.1': + resolution: {integrity: sha512-h0G1CG6S+gUUSt0eo6rOtsaXRBwCq1+Js2a+Ps9Bzk9q7YHNFA75/X0NWugWLgC92waRp66hrjMTiYYnLBoWOQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@5.5.1': + resolution: {integrity: sha512-KRD61cL7CRL+b4r/eB9dEoVxIf/2EJ1Pm1DmRYhtSUAJD2dJ5Xw8QFuehobOGm9URqQ7gaQl+Fkc1qvDlsWqKg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@5.5.1': + resolution: {integrity: sha512-irKUGiV2yRoyf+4eGQ/ZeCRxa43yjFEL1DUI5B0DkcfZw3cr0VJtVJnrG8OtVF01vT0OUfYOcUn6zJW5TROHvQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@5.5.1': + resolution: {integrity: sha512-I1ImR+kfrLFxN5z22UDiTWLdRZeKtU0J/pkWkO8qm/8WxveiwdIv4hooi8pb6JnlR4mSrWhq0pCIOxDYrL9GIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@5.5.1': + resolution: {integrity: sha512-g+xHH95prTU+KujtbOzj8wn+C7ZNoiLhf3hj6nYq3MTyxOXtBEysguc97jJveUZG0K97aIKG6xVUlMutg5yxhw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@5.5.1': + resolution: {integrity: sha512-eo971c9iLNLmk+yOFyo7yKIJzJ/zou6uKpy6mBuyb/thKtS/haiKIc3VLhyTXty3OH2PW8yOlORJnv4DexJB8A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@5.5.1': + resolution: {integrity: sha512-VUZl30lDQFJeiSyNfzU1EjYt2QZvoBFKEwjn1lilUJw7KgqD5z7mbV7diJhT+dLFs36i0OsjXvq5kSygn8YJ3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@5.5.1': + resolution: {integrity: sha512-7U9kn0Jsx1NuBLn5HRTFYh78MV4XN145Yc3WP/q5BlqAVNlMoU9coG5IUTJIG847TUqC1lRto3Dnpwm6T4YRpA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@5.5.1': + resolution: {integrity: sha512-T9lfuUYkGykJmppEcssNiCf6yiYQxJkhiLPP+pyAc2z84/7r3UVIb2tNJk4A9sucS66pzJnVHZKcZVGUUp6wzA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@5.5.1': + resolution: {integrity: sha512-XWOQQPhKl06Vj0xi3RYHAc6oEQd8B82okYJ04K7N0Vvy3J4PN2cxeK7klwkjgavdcN9EVkYCChm2ADAtnztKnA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@5.5.1': + resolution: {integrity: sha512-HEi3G2nZqGEsa3vX6U0FrXLaqnUCg4SKIUrOe8CezD+cSFbRTOn3rCLrUmJrhVyXlHoQVaRO9mmeovk31jWxJg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec-types@5.5.1': + resolution: {integrity: sha512-6OFKtRpIEJQs8Jb2C4OO8KyP2h2Hy1MFhatMAoXA+0Ik8S3H+CicIuMZvGZ91mIu/tXicuOOsNNLu3HAkrakrw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec@5.5.1': + resolution: {integrity: sha512-m3LX2bChm3E3by4mQrH4YwCAFY57QBzuUSWqlUw7ChuZ+oLLOq7b2czi4i6L4Vna67j3eCmB3e+4tqy1j5wy7Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-api@5.5.1': + resolution: {integrity: sha512-5Oi7k+GdeS8xR2ly1iuSFkAv6CZqwG0Z6b1QZKbEgxadE1XGSDrhM2cn59l+bqCozUWCqh4c/A2znU/qQjROlw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-channel-websocket@5.5.1': + resolution: {integrity: sha512-7tGfBBrYY8TrngOyxSHoCU5shy86iA9SRMRrPSyBhEaZRAk6dnbdpmUTez7gtdVo0BCvh9nzQtUycKWSS7PnFQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-spec@5.5.1': + resolution: {integrity: sha512-iq+rGq5fMKP3/mKHPNB6MC8IbVW41KGZg83Us/+LE3AWOTWV1WT20KT2iH1F1ik9roi42COv/TpoZZvhKj45XQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions@5.5.1': + resolution: {integrity: sha512-CTMy5bt/6mDh4tc6vUJms9EcuZj3xvK0/xq8IQ90rhkpYvate91RjBP+egvjgSayUg9yucU9vNuUpEjz4spM7w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transformers@5.5.1': + resolution: {integrity: sha512-OsWqLCQdcrRJKvHiMmwFhp9noNZ4FARuMkHT5us3ustDLXaxOjF0gfqZLnMkulSLcKt7TGXqMhBV+HCo7z5M8Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transport-http@5.5.1': + resolution: {integrity: sha512-yv8GoVSHqEV0kUJEIhkdOVkR2SvJ6yoWC51cJn2rSV7plr6huLGe0JgujCmB7uZhhaLbcbP3zxXxu9sOjsi7Fg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-types@5.5.1': + resolution: {integrity: sha512-bibTFQ7PbHJJjGJPmfYC2I+/5CRFS4O2p9WwbFraX1Keeel+nRrt/NBXIy8veP5AEn2sVJIyJPpWBRpCx1oATA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc@5.5.1': + resolution: {integrity: sha512-ku8zTUMrkCWci66PRIBC+1mXepEnZH/q1f3ck0kJZ95a06bOTl5KU7HeXWtskkyefzARJ5zvCs54AD5nxjQJ+A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/signers@5.5.1': + resolution: {integrity: sha512-FY0IVaBT2kCAze55vEieR6hag4coqcuJ31Aw3hqRH7mv6sV8oqwuJmUrx+uFwOp1gwd5OEAzlv6N4hOOple4sQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/subscribable@5.5.1': + resolution: {integrity: sha512-9K0PsynFq0CsmK1CDi5Y2vUIJpCqkgSS5yfDN0eKPgHqEptLEaia09Kaxc90cSZDZU5mKY/zv1NBmB6Aro9zQQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/sysvars@5.5.1': + resolution: {integrity: sha512-k3Quq87Mm+geGUu1GWv6knPk0ALsfY6EKSJGw9xUJDHzY/RkYSBnh0RiOrUhtFm2TDNjOailg8/m0VHmi3reFA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-confirmation@5.5.1': + resolution: {integrity: sha512-j4mKlYPHEyu+OD7MBt3jRoX4ScFgkhZC6H65on4Fux6LMScgivPJlwnKoZMnsgxFgWds0pl+BYzSiALDsXlYtw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-messages@5.5.1': + resolution: {integrity: sha512-aXyhMCEaAp3M/4fP0akwBBQkFPr4pfwoC5CLDq999r/FUwDax2RE/h4Ic7h2Xk+JdcUwsb+rLq85Y52hq84XvQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transactions@5.5.1': + resolution: {integrity: sha512-8hHtDxtqalZ157pnx6p8k10D7J/KY/biLzfgh9R09VNLLY3Fqi7kJvJCr7M2ik3oRll56pxhraAGCC9yIT6eOA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + + '@solidity-parser/parser@0.20.2': + resolution: {integrity: sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + + '@tailwindcss/cli@4.1.18': + resolution: {integrity: sha512-sMZ+lZbDyxwjD2E0L7oRUjJ01Ffjtme5OtjvvnC+cV4CEDcbqzbp25TCpxHj6kWLU9+DlqJOiNgSOgctC2aZmg==} + hasBin: true + + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tanstack/query-async-storage-persister@5.90.22': + resolution: {integrity: sha512-I8Dbi79aoM2S2VqfuxTG13TkqmiDSiZ95Bi1YRXvwGVMsOnaJ99Ou1dIw53kHY3y10Vgwv3YYThw4TN/FM/N3A==} + + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} + + '@tanstack/query-devtools@5.93.0': + resolution: {integrity: sha512-+kpsx1NQnOFTZsw6HAFCW3HkKg0+2cepGtAWXjiiSOJJ1CtQpt72EE2nyZb+AjAbLRPoeRmPJ8MtQd8r8gsPdg==} + + '@tanstack/query-persist-client-core@5.91.19': + resolution: {integrity: sha512-whrASqbVq8261Ue+/ZzpHsrLDYVfRaENs4HTdLuYKxawkGWzdMfV7BmOdWl8ZF0mEBEbrQR8V6oE3R635JF2Fw==} + + '@tanstack/query-sync-storage-persister@5.90.22': + resolution: {integrity: sha512-QoOHewbI9a/7hezbVXlZOOCkF4oTnOpAGNMYiObUZm+jpEoLF5YqGMg0iDv3laSEymz81Zw8HJ8UFxP7mwEmqw==} + + '@tanstack/react-query-devtools@5.91.3': + resolution: {integrity: sha512-nlahjMtd/J1h7IzOOfqeyDh5LNfG0eULwlltPEonYy0QL+nqrBB+nyzJfULV+moL7sZyxc2sHdNJki+vLA9BSA==} + peerDependencies: + '@tanstack/react-query': ^5.90.20 + react: ^18 || ^19 + + '@tanstack/react-query-persist-client@5.90.22': + resolution: {integrity: sha512-BrD3Y/SsrSIDl+t/gpYvjvGHXd7m7oF+GIqktKE8LmTgt7bS1lYHd/CLkVxMPixTU53gHHVFfPNGmY7Hv4L/7g==} + peerDependencies: + '@tanstack/react-query': ^5.90.20 + react: ^18 || ^19 + + '@tanstack/react-query@5.90.20': + resolution: {integrity: sha512-vXBxa+qeyveVO7OA0jX1z+DeyCA4JKnThKv411jd5SORpBKgkcVnYKCiBgECvADvniBX7tobwBmg01qq9JmMJw==} + peerDependencies: + react: ^18 || ^19 + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@ts-morph/common@0.11.1': + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + + '@tsconfig/node10@1.0.12': + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@typechain/ethers-v6@0.5.1': + resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} + peerDependencies: + ethers: 6.x + typechain: ^8.3.2 + typescript: '>=4.7.0' + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + + '@types/bs58@5.0.0': + resolution: {integrity: sha512-cAw/jKBzo98m6Xz1X5ETqymWfIMbXbu6nK15W4LQYjeHJkVqSmM5PO8Bd9KVHQJ/F4rHcSso9LcjtgCW6TGu2w==} + deprecated: This is a stub types definition. bs58 provides its own type definitions, so you do not need this installed. + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash@4.17.23': + resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/mysql@2.15.26': + resolution: {integrity: sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.11.0': + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/node@25.2.0': + resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.6.1': + resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@18.3.27': + resolution: {integrity: sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==} + + '@types/react@19.2.10': + resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} + + '@types/secp256k1@4.0.7': + resolution: {integrity: sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw==} + + '@types/shimmer@1.2.0': + resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@types/ws@8.5.3': + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + + '@vercel/analytics@1.6.1': + resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} + peerDependencies: + '@remix-run/react': ^2 + '@sveltejs/kit': ^1 || ^2 + next: '>=16.1.5' + react: ^18 || ^19 || ^19.0.0-rc + svelte: '>= 4' + vue: ^3 + vue-router: ^4 + peerDependenciesMeta: + '@remix-run/react': + optional: true + '@sveltejs/kit': + optional: true + next: + optional: true + react: + optional: true + svelte: + optional: true + vue: + optional: true + vue-router: + optional: true + + '@vercel/backends@0.0.27': + resolution: {integrity: sha512-HYzV4pATfBNDPobZk2S+QhM/yf7o8fdziMAZPS5UQxRhSBtW1TP61W9V9ePQrQ9f+ikZ6v4Y2jtWwB7CCYOuUA==} + peerDependencies: + typescript: ^4.0.0 || ^5.0.0 + + '@vercel/blob@1.0.2': + resolution: {integrity: sha512-Im/KeFH4oPx7UsM+QiteimnE07bIUD7JK6CBafI9Z0jRFogaialTBMiZj8EKk/30ctUYsrpIIyP9iIY1YxWnUQ==} + engines: {node: '>=16.14'} + + '@vercel/build-utils@13.3.0': + resolution: {integrity: sha512-xU43eZIARY9lvGkg14UGnmHrqKo3gQKjTs9x5ADj7jAzllgBaPI8ty/qUh1e6my3xPoOgRJlEA4bml2MknKUXQ==} + + '@vercel/cervel@0.0.14': + resolution: {integrity: sha512-9lvOKJDlgmVsF4svY/otlITvFAFdN9iQtZaG0PTcDt7UUCNZc5K3JJCLiV87lMwLS1/U9nFoNOHOtP++s1aeCA==} + hasBin: true + peerDependencies: + typescript: ^4.0.0 || ^5.0.0 + + '@vercel/detect-agent@1.1.0': + resolution: {integrity: sha512-Zfq6FbIcYl9gaAmVu6ROsqUiCNwpEj3Ljz/tMX5fl12Z95OFOxzf7vlO03WE5JBU/ri1tBDFHnW41dihMINOPQ==} + engines: {node: '>=14'} + + '@vercel/elysia@0.1.29': + resolution: {integrity: sha512-jSn9UOhgwqjm6hDKii152FAy4U2CtImVsXjM+9Pu4StHRc7J3w8/GwCnO6kGJUc9X1tzFhTpIZNO5LfZUniNuQ==} + + '@vercel/error-utils@2.0.3': + resolution: {integrity: sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==} + + '@vercel/express@0.1.38': + resolution: {integrity: sha512-onS+jwDO9j+lxGQM8J6N60TUHfM8/y0nQPSCI8/kXN0j+VVrHVPw5lVCerj7TCZULEdMGIV1fpeR9fvEtiu9Dg==} + + '@vercel/fastify@0.1.32': + resolution: {integrity: sha512-2OBmGlSl5Ugzg+/fX3KOZqPSbhHItSF1upn6ZTJLBG7hJyfGQyN22heUFsXhwsohLs1rQJKc79baclTEl/aIbA==} + + '@vercel/fun@1.2.1': + resolution: {integrity: sha512-p0IuyxKAnaV9P7xApKBDYXdPheErVyoi68tt2l8i2g20n26FgZ7IQoDsFfmTg/ClllxhdOnaArNAFu2XBmfCxw==} + engines: {node: '>= 18'} + + '@vercel/gatsby-plugin-vercel-analytics@1.0.11': + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + + '@vercel/gatsby-plugin-vercel-builder@2.0.129': + resolution: {integrity: sha512-GiV/JPOMTVNJQFV2RQ4htfdD04bcahbUgTI/oFTOTTrZgOAydg4tipWgZKG11SIwZV6NDVe0X3nKu2389KqB7Q==} + + '@vercel/go@3.3.4': + resolution: {integrity: sha512-PAa7XYZk+ZuE3pWuPJU32fdDl3YH9+f9iYkd/yFhhRgHsd0PqCB5HQ+EHUKsso+BHlYo145GV6cPLh+HE+UI1A==} + + '@vercel/h3@0.1.38': + resolution: {integrity: sha512-bbAYTVLIxCSWw5gPIdyxSO3MDRKmbMO8nSnajwQByTTXTH0riH/BU/TS3v1AIy3QBBF8myXKNNo+u5Ja4XoK9w==} + + '@vercel/hono@0.2.32': + resolution: {integrity: sha512-lE+pmKpL7Embb5kECr29V5vNZAwypSmBNCeLJ0NHe0Feh/Fx2C/w6/sSJTzUjq6bfqvU4p3ceSLEHXfmp1HsiA==} + + '@vercel/hydrogen@1.3.5': + resolution: {integrity: sha512-7EE6yVKcCnjMb1io9y069GkLyGyIzRbW3Krm3Q7EEfJ3P46h9xe9v/O5UhBoPrwtqDUHxmDngZp9YyfgY8IITA==} + + '@vercel/koa@0.1.12': + resolution: {integrity: sha512-J8eYeQlyPI0r/7gDVjDMa2EJ0BUCAHyAlLZwuLjm26CqSwAzeshafquQYgqXu6irRzq3m5L9yYx5Fi3dn+KN0A==} + + '@vercel/nestjs@0.2.33': + resolution: {integrity: sha512-T6YWyTgSaibh8WikVY4LKGToP8Fcx4d5I4dFgTO1Tuhm3Pk84is69oapg9rluN1V+TV0pBWXO+Cnb5X3RQ7JYQ==} + + '@vercel/next@4.15.22': + resolution: {integrity: sha512-QYYOMvvBFMrJgOwZL5HNP+pu1CbX2uQVR0Czb+RIYngx+PRMaikfcD7C8z3uff9iPKvfhOZvF7PppID17C6ETA==} + + '@vercel/nft@1.1.1': + resolution: {integrity: sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==} + engines: {node: '>=20'} + hasBin: true + + '@vercel/nft@1.3.0': + resolution: {integrity: sha512-i4EYGkCsIjzu4vorDUbqglZc5eFtQI2syHb++9ZUDm6TU4edVywGpVnYDein35x9sevONOn9/UabfQXuNXtuzQ==} + engines: {node: '>=20'} + hasBin: true + + '@vercel/node@5.5.30': + resolution: {integrity: sha512-ofkVDx8CzWefwFH+wK36r7K2dPZqbW1k9eoVZhJkXgfLaPhb5BRd2QEHMNSlsDsTqDB9WK3CZ8J82Vp24VbPEw==} + + '@vercel/python@6.6.0': + resolution: {integrity: sha512-5ZTlrkGpPRhkSSo5piDFkBiLKq2qfbiqmppiNwzLs6Skp82VY0sfQaMuHtJDfUQ+Uol6LhKzI0BE3hJNvSHt9w==} + + '@vercel/redwood@2.4.9': + resolution: {integrity: sha512-U7bYIuWfMEFMIcKKbX7lTT8pFNjig9Q3vLeCYRYQUrKVP8xLoUBXSEfW3ijtWJBUV8GmbZCDI30A16uUfNhN+g==} + + '@vercel/remix-builder@5.5.10': + resolution: {integrity: sha512-E4fqjBaztj/5JG8HCbvqO/JZyP3b+hpse+aAMb9twvgyIRfkkl+146liFF2I8/M/cc1PWkSfaqa8LF0+5x4egA==} + + '@vercel/ruby@2.2.5': + resolution: {integrity: sha512-DeSHZDEU1BvxzomHeBDsFyZ9VL2U/rUC15Ce4Asaw6LadYPyQ9HEvREJC7Vz4f2iHHD0iamJG9znaC3/UgvQDg==} + + '@vercel/rust@1.0.5': + resolution: {integrity: sha512-Y03g59nv1uT6Da+PvB/50WqJSHlaFZ9MSkG00R82dUcTySslMbQdOeaXymZtabrmU8zQYhWDb1/CwBki8sWnaQ==} + + '@vercel/static-build@2.8.31': + resolution: {integrity: sha512-eRvJJK3JTwUihqsEIuSyXnRDVTEGPgTAW4MAOIewTs8VZd1m3vuSX3BTuDtCN+/XrLaPMafopA2FLGqCJ4e3Qg==} + + '@vercel/static-config@3.1.2': + resolution: {integrity: sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==} + + '@wagmi/connectors@7.1.3': + resolution: {integrity: sha512-gU7gWRArUQ0YOEPALJx5Ruap8ZzPShWLIyTMzm9+UdgrUDYil2gXQ66qHAvS8iBFy6ANGG1fcueakfDdYFKJJg==} + peerDependencies: + '@base-org/account': ^2.5.1 + '@coinbase/wallet-sdk': ^4.3.6 + '@gemini-wallet/core': ~0.3.1 + '@metamask/sdk': ~0.33.1 + '@safe-global/safe-apps-provider': ~0.18.6 + '@safe-global/safe-apps-sdk': ^9.1.0 + '@wagmi/core': 3.2.3 + '@walletconnect/ethereum-provider': ^2.21.1 + porto: ~0.2.35 + typescript: '>=5.7.3' + viem: 2.x + peerDependenciesMeta: + '@base-org/account': + optional: true + '@coinbase/wallet-sdk': + optional: true + '@gemini-wallet/core': + optional: true + '@metamask/sdk': + optional: true + '@safe-global/safe-apps-provider': + optional: true + '@safe-global/safe-apps-sdk': + optional: true + '@walletconnect/ethereum-provider': + optional: true + porto: + optional: true + typescript: + optional: true + + '@wagmi/core@3.2.3': + resolution: {integrity: sha512-5PpalEdyHA2DkIl/ultwZ8GqRj6wpkZK80i3q6ve+auJQZmLokK3oysKxVuqMvgEGRBHorrnfMszPkx6j0xHng==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + ox: '>=0.11.1' + typescript: '>=5.7.3' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + ox: + optional: true + typescript: + optional: true + + '@walletconnect/core@2.21.0': + resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} + engines: {node: '>=18'} + + '@walletconnect/core@2.21.1': + resolution: {integrity: sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==} + engines: {node: '>=18'} + + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} + + '@walletconnect/ethereum-provider@2.21.1': + resolution: {integrity: sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} + + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} + + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} + + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} + + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} + + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} + + '@walletconnect/jsonrpc-ws-connection@1.0.16': + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} + + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + peerDependencies: + '@react-native-async-storage/async-storage': 1.x + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} + + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} + + '@walletconnect/relay-auth@1.1.0': + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} + + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + + '@walletconnect/sign-client@2.21.0': + resolution: {integrity: sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/sign-client@2.21.1': + resolution: {integrity: sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.21.0': + resolution: {integrity: sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==} + + '@walletconnect/types@2.21.1': + resolution: {integrity: sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==} + + '@walletconnect/universal-provider@2.21.0': + resolution: {integrity: sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/universal-provider@2.21.1': + resolution: {integrity: sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/utils@2.21.0': + resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} + + '@walletconnect/utils@2.21.1': + resolution: {integrity: sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + + '@xterm/addon-serialize@0.13.0': + resolution: {integrity: sha512-kGs8o6LWAmN1l2NpMp01/YkpxbmO4UrfWybeGu79Khw5K9+Krp7XhXbBTOTc3GJRRhd6EmILjpR8k5+odY39YQ==} + peerDependencies: + '@xterm/xterm': ^5.0.0 + + '@xterm/headless@5.5.0': + resolution: {integrity: sha512-5xXB7kdQlFBP82ViMJTwwEc3gKCLGKR/eoxQm4zge7GPBl86tCdI0IdPJjoKd8mUSFXz5V7i/25sfsEkP4j46g==} + + '@xterm/xterm@5.5.0': + resolution: {integrity: sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abitype@0.7.1: + resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} + peerDependencies: + typescript: '>=4.9.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + + ansi-escapes@7.2.0: + resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + engines: {node: '>=18'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansi-term@0.0.2: + resolution: {integrity: sha512-jLnGE+n8uAjksTJxiWZf/kcUmXq+cRWSl550B9NmQ8YiqaTM+lILcSe5dHdp8QkJPhaOghDjnMKwyYSMjosgAA==} + + ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asmcrypto.js@2.3.2: + resolution: {integrity: sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA==} + + async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + + async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + + async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + + async-ref@0.1.6: + resolution: {integrity: sha512-gIvfC7ahv452pM+nwnxZJd/vhUh8UFMrd1DCvIvWjoy9WrRmYroXTTDxwg91oiD+4CqQKrg+11uCxZrzat4UvQ==} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + auto-bind@5.0.1: + resolution: {integrity: sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-ssl-profiles@1.1.2: + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} + engines: {node: '>= 6.0.0'} + + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + + axios@1.13.4: + resolution: {integrity: sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==} + + babel-plugin-styled-components@2.1.4: + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + hasBin: true + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + + bigint-conversion@2.4.3: + resolution: {integrity: sha512-eM76IXlhXQD6HAoE6A7QLQ3jdC04EJdjH3zrlU1Jtt4/jj+O/pMGjGR5FY8/55FOIBsK25kly0RoG4GA4iKdvg==} + + bigint-crypto-utils@3.3.0: + resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} + engines: {node: '>=14.0.0'} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + blessed-contrib@4.11.0: + resolution: {integrity: sha512-P00Xji3xPp53+FdU9f74WpvnOAn/SS0CKLy4vLAf5Ps7FGDOTY711ruJPZb3/7dpFuP+4i7f4a/ZTZdLlKG9WA==} + + blessed@0.1.81: + resolution: {integrity: sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==} + engines: {node: '>= 0.8.0'} + hasBin: true + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@4.12.2: + resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + bowser@2.13.1: + resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bresenham@0.0.3: + resolution: {integrity: sha512-wbMxoJJM1p3+6G7xEFXYNCJ30h2qkwmVxebkbwIl4OcnWtno5R3UT9VuYLfStlVNAQCmRjkGwjPFdfaPd4iNXw==} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + brotli-wasm@3.0.1: + resolution: {integrity: sha512-U3K72/JAi3jITpdhZBqzSUq+DUY697tLxOuFXB+FpAE/Ug+5C3VZrv4uA674EUZHxNAuQ9wETXNqQkxZD6oL4A==} + engines: {node: '>=v18.0.0'} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} + engines: {node: '>=6.14.2'} + + bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + + c12@3.1.0: + resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==} + peerDependencies: + magicast: ^0.3.5 + peerDependenciesMeta: + magicast: + optional: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001767: + resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} + + cardinal@2.1.1: + resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} + hasBin: true + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + charm@0.1.2: + resolution: {integrity: sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==} + + chevrotain@10.5.0: + resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==} + + chokidar@4.0.0: + resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} + engines: {node: '>= 14.16.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cipher-base@1.0.7: + resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} + engines: {node: '>= 0.10'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + citty@0.2.0: + resolution: {integrity: sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cli-truncate@5.1.1: + resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + engines: {node: '>=20'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + + code-excerpt@4.0.0: + resolution: {integrity: sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + connectkit@1.9.1: + resolution: {integrity: sha512-ac9Ki3+HdS3l5NCa6H86y7R+0PqwJ8yzsBQVtWk4/jkFo+JJioetO43A/Q0O7VtxLbfuLLfwDGZ09taePLNzfQ==} + engines: {node: '>=12.4'} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: 17.x || 18.x + react-dom: 17.x || 18.x + viem: 2.x + wagmi: 2.x + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + + convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + convert-to-spaces@2.0.1: + resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cookie-es@1.2.2: + resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} + + cookie-es@2.0.0: + resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + derive-valtio@0.1.0: + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + engines: {node: '>=0.3.1'} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + drawille-blessed-contrib@1.0.0: + resolution: {integrity: sha512-WnHMgf5en/hVOsFhxLI8ZX0qTJmerOsVjIMQmn4cR1eI8nLGu+L7w5ENbul+lZ6w827A3JakCuernES5xbHLzQ==} + + drawille-canvas-blessed-contrib@0.1.3: + resolution: {integrity: sha512-bdDvVJOxlrEoPLifGDPaxIzFh3cD7QH05ePoQ4fwnqfi08ZSxzEhOUpI5Z0/SQMlWgcCQOEtuw0zrwezacXglw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + eciesjs@0.4.17: + resolution: {integrity: sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + + edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + + effect@3.18.4: + resolution: {integrity: sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==} + + electron-to-chromium@1.5.286: + resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} + + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + + end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + engine.io-client@6.6.4: + resolution: {integrity: sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} + + es-toolkit@1.44.0: + resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + + eth-sig-util@3.0.1: + resolution: {integrity: sha512-0Us50HiGGvZgjtWTyAI/+qTzYPMLy5Q451D0Xy68bxq1QMWdoOddDwGvsqcFT27uohKgalM9z/yxplyt+mY2iQ==} + deprecated: Deprecated in favor of '@metamask/eth-sig-util' + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ethereum-cryptography@3.1.0: + resolution: {integrity: sha512-ZqHd92eOIH9RExpBUOgzpAgflyFv9/+Ca39G8V+oCjJPGjJUihQcG/Gl67I/Xn2HGS87dgnrCG3kb1jNClLi6g==} + engines: {node: ^14.21.3 || >=16, npm: '>=9'} + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. + + ethereumjs-util@5.2.1: + resolution: {integrity: sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==} + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + + ethers@6.16.0: + resolution: {integrity: sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==} + engines: {node: '>=14.0.0'} + + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + + event-stream@0.9.8: + resolution: {integrity: sha512-o5h0Mp1bkoR6B0i7pTCAzRy+VzdsRWH997KQD4Psb0EOPoKEIiaRx/EsOdUl7p1Ktjw7aIWvweI/OY1R9XrlUg==} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + family@0.1.6: + resolution: {integrity: sha512-ulHRThfhz+glfmVfSPcU16N1hZ/uj0Y1D79vl0PeJ3yFfgXlkiBbVwXRJhDQuP8oizxBCl16KT2PrMleiYwrPw==} + peerDependencies: + react: 17.x || 18.x || 19.x + react-dom: 17.x || 18.x || 19.x + viem: 2.x + wagmi: 2.x + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + viem: + optional: true + wagmi: + optional: true + + fast-check@3.23.2: + resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} + engines: {node: '>=8.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} + hasBin: true + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flag@5.0.1: + resolution: {integrity: sha512-4P/rvPGKcFBneboyYHMOKbKaJL5ZhNjScbY7bGToas7FgBvrTWbh76yxRaoSoFe3HSjWc6IJ0EajUwSadcP6Lg==} + peerDependencies: + react: ^18 + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + + framer-motion@12.31.0: + resolution: {integrity: sha512-Tnd0FU05zGRFI3JJmBegXonF1rfuzYeuXd1QSdQ99Ysnppk0yWBWSW2wUsqzRpS5nv0zPNx+y0wtDj4kf0q5RQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + framer-motion@6.5.1: + resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} + peerDependencies: + react: '>=16.8 || ^17.0.0 || ^18.0.0' + react-dom: '>=16.8 || ^17.0.0 || ^18.0.0' + + framesync@6.0.1: + resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} + + fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + fuse.js@7.1.0: + resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} + engines: {node: '>=10'} + + gaxios@7.1.3: + resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} + engines: {node: '>=18'} + + gcp-metadata@8.1.2: + resolution: {integrity: sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==} + engines: {node: '>=18'} + + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-port-please@3.2.0: + resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-tsconfig@4.13.1: + resolution: {integrity: sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==} + + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + + gl-matrix@2.8.1: + resolution: {integrity: sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@13.0.1: + resolution: {integrity: sha512-B7U/vJpE3DkJ5WXTgTpTRN63uV42DseiXXKMwG14LQBXmsdeIoHAPbU/MEo6II0k5ED74uc2ZGTC6MwHFQhF6w==} + engines: {node: 20 || >=22} + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + google-auth-library@10.5.0: + resolution: {integrity: sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==} + engines: {node: '>=18'} + + google-logging-utils@1.1.3: + resolution: {integrity: sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==} + engines: {node: '>=14'} + + googleapis-common@8.0.1: + resolution: {integrity: sha512-eCzNACUXPb1PW5l0ULTzMHaL/ltPRADoPgjBlT8jWsTbxkCp6siv+qKJ/1ldaybCthGwsYFYallF7u9AkU4L+A==} + engines: {node: '>=18.0.0'} + + googleapis@170.1.0: + resolution: {integrity: sha512-RLbc7yG6qzZqvAmGcgjvNIoZ7wpcCFxtc+HN+46etxDrlO4a8l5Cb7NxNQGhV91oRmL7mt56VoRoypAtEQEIKg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + gql.tada@1.9.0: + resolution: {integrity: sha512-1LMiA46dRs5oF7Qev6vMU32gmiNvM3+3nHoQZA9K9j2xQzH8xOAWnnJrLSbZOFHTSdFxqn86TL6beo1/7ja/aA==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grammex@3.1.12: + resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==} + + graphmatch@1.1.0: + resolution: {integrity: sha512-0E62MaTW5rPZVRLyIJZG/YejmdA/Xr1QydHEw3Vt+qOKkMIOE8WDLc9ZX2bmAjtJFZcId4lEdrdmASsEy7D1QA==} + + graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + gtoken@8.0.0: + resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} + engines: {node: '>=18'} + + h3@1.15.5: + resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.1.2: + resolution: {integrity: sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg==} + engines: {node: '>= 0.8'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + here@0.0.2: + resolution: {integrity: sha512-U7VYImCTcPoY27TSmzoiFsmWLEqQFaYNdpsPb9K0dXJhE6kufUqycaz51oR09CW85dDU9iWyy7At8M+p7hb3NQ==} + + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hono@4.11.7: + resolution: {integrity: sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==} + engines: {node: '>=16.9.0'} + + http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + + http-status-codes@2.3.0: + resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + hasBin: true + + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + + idb-keyval@6.2.2: + resolution: {integrity: sha512-yjD9nARJ/jb1g+CvD0tlhUHOrJ9Sy0P8T9MF3YaLlHnSRpwPfpTX0XIvpmw3gAJUmEu3FiICLBDPXVwyEvrleg==} + + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-in-the-middle@1.15.0: + resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ink@6.6.0: + resolution: {integrity: sha512-QDt6FgJxgmSxAelcOvOHUvFxbIUjVpCH5bx+Slvc5m7IEcpGt3dYwbz/L+oRnqEGeRvwy1tineKK4ect3nW1vQ==} + engines: {node: '>=20'} + peerDependencies: + '@types/react': '>=19.0.0' + react: '>=19.0.0' + react-devtools-core: ^6.1.2 + peerDependenciesMeta: + '@types/react': + optional: true + react-devtools-core: + optional: true + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-in-ci@2.0.0: + resolution: {integrity: sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==} + engines: {node: '>=20'} + hasBin: true + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '>=5.2.4' + + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '>=5.2.4' + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '>=5.2.4' + + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '>=5.2.4' + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jayson@4.3.0: + resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} + engines: {node: '>=8'} + hasBin: true + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + + jose@6.1.3: + resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-canonicalize@1.2.0: + resolution: {integrity: sha512-TTdjBvqrqJKSADlEsY5rWbx8/1tOrVlTR/aSLU8N2VSInCTffP0p+byYB8Es+OmL4ZOeEftjUdvV+eJeSzJC/Q==} + + json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + jwt-decode@4.0.0: + resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} + engines: {node: '>=18'} + + keccak256@1.0.6: + resolution: {integrity: sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + + lefthook-darwin-arm64@1.13.6: + resolution: {integrity: sha512-m6Lb77VGc84/Qo21Lhq576pEvcgFCnvloEiP02HbAHcIXD0RTLy9u2yAInrixqZeaz13HYtdDaI7OBYAAdVt8A==} + cpu: [arm64] + os: [darwin] + + lefthook-darwin-x64@1.13.6: + resolution: {integrity: sha512-CoRpdzanu9RK3oXR1vbEJA5LN7iB+c7hP+sONeQJzoOXuq4PNKVtEaN84Gl1BrVtCNLHWFAvCQaZPPiiXSy8qg==} + cpu: [x64] + os: [darwin] + + lefthook-freebsd-arm64@1.13.6: + resolution: {integrity: sha512-X4A7yfvAJ68CoHTqP+XvQzdKbyd935sYy0bQT6Ajz7FL1g7hFiro8dqHSdPdkwei9hs8hXeV7feyTXbYmfjKQQ==} + cpu: [arm64] + os: [freebsd] + + lefthook-freebsd-x64@1.13.6: + resolution: {integrity: sha512-ai2m+Sj2kGdY46USfBrCqLKe9GYhzeq01nuyDYCrdGISePeZ6udOlD1k3lQKJGQCHb0bRz4St0r5nKDSh1x/2A==} + cpu: [x64] + os: [freebsd] + + lefthook-linux-arm64@1.13.6: + resolution: {integrity: sha512-cbo4Wtdq81GTABvikLORJsAWPKAJXE8Q5RXsICFUVznh5PHigS9dFW/4NXywo0+jfFPCT6SYds2zz4tCx6DA0Q==} + cpu: [arm64] + os: [linux] + + lefthook-linux-x64@1.13.6: + resolution: {integrity: sha512-uJl9vjCIIBTBvMZkemxCE+3zrZHlRO7Oc+nZJ+o9Oea3fu+W82jwX7a7clw8jqNfaeBS+8+ZEQgiMHWCloTsGw==} + cpu: [x64] + os: [linux] + + lefthook-openbsd-arm64@1.13.6: + resolution: {integrity: sha512-7r153dxrNRQ9ytRs2PmGKKkYdvZYFPre7My7XToSTiRu5jNCq++++eAKVkoyWPduk97dGIA+YWiEr5Noe0TK2A==} + cpu: [arm64] + os: [openbsd] + + lefthook-openbsd-x64@1.13.6: + resolution: {integrity: sha512-Z+UhLlcg1xrXOidK3aLLpgH7KrwNyWYE3yb7ITYnzJSEV8qXnePtVu8lvMBHs/myzemjBzeIr/U/+ipjclR06g==} + cpu: [x64] + os: [openbsd] + + lefthook-windows-arm64@1.13.6: + resolution: {integrity: sha512-Uxef6qoDxCmUNQwk8eBvddYJKSBFglfwAY9Y9+NnnmiHpWTjjYiObE9gT2mvGVpEgZRJVAatBXc+Ha5oDD/OgQ==} + cpu: [arm64] + os: [win32] + + lefthook-windows-x64@1.13.6: + resolution: {integrity: sha512-mOZoM3FQh3o08M8PQ/b3IYuL5oo36D9ehczIw1dAgp1Ly+Tr4fJ96A+4SEJrQuYeRD4mex9bR7Ps56I73sBSZA==} + cpu: [x64] + os: [win32] + + lefthook@1.13.6: + resolution: {integrity: sha512-ojj4/4IJ29Xn4drd5emqVgilegAPN3Kf0FQM2p/9+lwSTpU+SZ1v4Ig++NF+9MOa99UKY8bElmVrLhnUUNFh5g==} + hasBin: true + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.2: + resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + + lit@3.3.0: + resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + long@5.2.4: + resolution: {integrity: sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru.min@1.1.4: + resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-canvas@0.1.5: + resolution: {integrity: sha512-f7M3sOuL9+up0NCOZbb1rQpWDLZwR/ftCiNbyscjl9LUUEwrRaoumH4sz6swgs58lF21DQ0hsYOCw5C6Zz7hbg==} + + marked-terminal@5.2.0: + resolution: {integrity: sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==} + engines: {node: '>=14.13.1 || >=16.0.0'} + peerDependencies: + marked: ^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + memory-streams@0.1.3: + resolution: {integrity: sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micro-observables@1.7.2: + resolution: {integrity: sha512-NLXMvBpeXO/QAJ9r2SoxAE9qJXvECMRnKXkQrjZ5TNy0bUKawrgyUafHbJpFnP3j+DTehjPxJU6VXnNMjvicNA==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16.8.0' + + micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@10.1.2: + resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + + motion-dom@12.30.1: + resolution: {integrity: sha512-QXB+iFJRzZTqL+Am4a1CRoHdH+0Nq12wLdqQQZZsfHlp9AMt6PA098L/61oVZsDA+Ep3QSGudzpViyRrhYhGcQ==} + + motion-utils@12.29.2: + resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} + + motion@12.31.0: + resolution: {integrity: sha512-KpZQik3LLFdsiaLdFXQGnty84KcDvvdvBCHSvA9aH+RjQTP6jkJGyngRPSngau13ARUI6TbPphf/Vv/QxwxRJQ==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + + mysql2@3.15.3: + resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} + engines: {node: '>= 8.0'} + + named-placeholders@1.1.6: + resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} + engines: {node: '>=8.0.0'} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + next@16.1.6: + resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + engines: {node: '>=20.9.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + nopt@2.1.2: + resolution: {integrity: sha512-x8vXm7BZ2jE1Txrxh/hO74HTuYZQEbo8edoRcANgdZ4+PCV+pbjd/xdummkmjjC7LU5EjPzlu8zEq/oxWylnKA==} + hasBin: true + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nypm@0.6.4: + resolution: {integrity: sha512-1TvCKjZyyklN+JJj2TS3P4uSQEInrM/HkkuSXsEzm1ApPgBffOn8gFguNnZf07r/1X6vlryfIqMUkJKQMzlZiw==} + engines: {node: '>=18'} + hasBin: true + + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + + once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + openapi-fetch@0.13.8: + resolution: {integrity: sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ==} + + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} + + optimist@0.2.8: + resolution: {integrity: sha512-Wy7E3cQDpqsTIFyW7m22hSevyTLxw850ahYv7FWsw4G6MIKVTZ8NSA95KBrQ95a4SMsMr1UGUUnwEFKhVaSzIg==} + + optimist@0.3.7: + resolution: {integrity: sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==} + + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + + os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + ox@0.11.3: + resolution: {integrity: sha512-1bWYGk/xZel3xro3l8WGg6eq4YEKlaqvyMtVhfMFpbJzK2F6rj4EDRtqDCWVEJMkzcmEi9uW2QxsqELokOlarw==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.7: + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.7.2: + resolution: {integrity: sha512-JJHxdef3KqwQ8xW9H+UVLWaQiCUh/DeFN/Ii65XwbHTvSuXZveihTV2gs9hhLw5XEWPBrcH7sQBM0rqG7/QurQ==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + oxc-transform@0.111.0: + resolution: {integrity: sha512-oa5KKSDNLHZGaiqIGAbCWXeN9IJUAz9MElWcQX90epDxdKc9Hrt/BsLj3K4gDqfAYa5dwdH+ZCFJG9hR74fiGg==} + engines: {node: ^20.19.0 || >=22.12.0} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + patch-console@2.0.0: + resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} + + path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pbkdf2@3.1.5: + resolution: {integrity: sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ==} + engines: {node: '>= 0.10'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.11.0: + resolution: {integrity: sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + picture-tuber@1.0.2: + resolution: {integrity: sha512-49/xq+wzbwDeI32aPvwQJldM8pr7dKDRuR76IjztrkmiCkAQDaWFJzkmfVqCHmt/iFoPFhHmI9L0oKhthrTOQw==} + engines: {node: '>=0.4.0'} + hasBin: true + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + hasBin: true + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + png-js@0.1.1: + resolution: {integrity: sha512-NTtk2SyfjBm+xYl2/VZJBhFnTQ4kU5qWC7VC4/iGbrgiU4FuB4xC+74erxADYJIqZICOR1HCvRA7EBHkpjTg9g==} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + popmotion@11.0.3: + resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} + + porto@0.2.35: + resolution: {integrity: sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==} + hasBin: true + peerDependencies: + '@tanstack/react-query': '>=5.59.0' + '@wagmi/core': '>=2.16.3' + expo-auth-session: '>=7.0.8' + expo-crypto: '>=15.0.7' + expo-web-browser: '>=15.0.8' + react: '>=18' + react-native: '>=0.81.4' + typescript: '>=5.4.0' + viem: '>=2.37.0' + wagmi: '>=2.0.0' + peerDependenciesMeta: + '@tanstack/react-query': + optional: true + expo-auth-session: + optional: true + expo-crypto: + optional: true + expo-web-browser: + optional: true + react: + optional: true + react-native: + optional: true + typescript: + optional: true + wagmi: + optional: true + + poseidon-lite@0.2.1: + resolution: {integrity: sha512-xIr+G6HeYfOhCuswdqcFpSX47SPhm0EpisWJ6h7fHlWwaVIvH3dLnejpatrtw6Xc6HaLrpq05y7VRfvDmDGIog==} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.1: + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres@3.4.7: + resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} + engines: {node: '>=12'} + + preact@10.24.2: + resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} + + prettier-plugin-solidity@2.2.1: + resolution: {integrity: sha512-LOHfxECJ/gHsY7qi4D7vanz8cVsCf6yFotBapJ5O0qaX0ZR1sGUzbWfMd4JeQYOItFl+wXW9IcjZOdfr6bmSvQ==} + engines: {node: '>=20'} + peerDependencies: + prettier: '>=3.0.0' + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + prisma@7.3.0: + resolution: {integrity: sha512-ApYSOLHfMN8WftJA+vL6XwAPOh/aZ0BgUyyKPwUFgjARmG6EBI9LzDPf6SWULQMSAxydV9qn5gLj037nPNlg2w==} + engines: {node: ^20.19 || ^22.12 || >=24.0} + hasBin: true + peerDependencies: + better-sqlite3: '>=9.0.0' + typescript: '>=5.4.0' + peerDependenciesMeta: + better-sqlite3: + optional: true + typescript: + optional: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + + proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + qrcode.react@4.2.0: + resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + react-apple-signin-auth@1.1.2: + resolution: {integrity: sha512-E5bPu4LtNR3IDsd08A/f1Y0HyuHfjqQpRNRCtQQ3JSVby2JK50FoixyK8EwUh6cbu8N4qrJStL77dEb51Ny5uA==} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + + react-hook-form@7.71.1: + resolution: {integrity: sha512-9SUJKCGKo8HUSsCO+y0CtqkqI5nNuaDqTxyqPsZPqIwudpj4rCrAz/jZV+jn57bx5gtZKOh3neQu94DXMc+w5w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 || ^19 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-reconciler@0.33.0: + resolution: {integrity: sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^19.2.0 + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-transition-state@1.1.5: + resolution: {integrity: sha512-ITY2mZqc2dWG2eitJkYNdcSFW8aKeOlkL2A/vowRrLL8GH3J6Re/SpD/BLvQzrVOTqjsP0b5S9N10vgNNzwMUQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + react-use-measure@2.1.7: + resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + peerDependenciesMeta: + react-dom: + optional: true + + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + readline@1.3.0: + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + redeyed@2.1.1: + resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} + + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + + regexp-to-ast@0.5.0: + resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + + remeda@2.33.4: + resolution: {integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rimraf@6.1.2: + resolution: {integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g==} + engines: {node: 20 || >=22} + hasBin: true + + ripemd160@2.0.3: + resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} + engines: {node: '>= 0.8'} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + rolldown@1.0.0-rc.1: + resolution: {integrity: sha512-M3AeZjYE6UclblEf531Hch0WfVC/NOL43Cc+WdF3J50kk5/fvouHhDumSGTh0oRjbZ8C4faaVr5r6Nx1xMqDGg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rpc-websockets@9.3.3: + resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.4: + resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} + engines: {node: '>=18.0.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.5: + resolution: {integrity: sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==} + engines: {node: '>=10.0.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + sparkline@0.1.2: + resolution: {integrity: sha512-t//aVOiWt9fi/e22ea1vXVWBDX+gp18y+Ch9sKqmHl828bRfvP2VtfTJVEcgWFBQHd0yDPNQRiHdqzCvbcYSDA==} + engines: {node: '>= 0.8.0'} + hasBin: true + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + srvx@0.8.9: + resolution: {integrity: sha512-wYc3VLZHRzwYrWJhkEqkhLb31TI0SOkfYZDkUhXdp3NoCnNS0FqajiQszZZjfow/VYEuc6Q5sZh9nM6kPy2NBQ==} + engines: {node: '>=20.16.0'} + hasBin: true + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + + stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} + engines: {node: '>=20'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + + style-value-types@5.0.0: + resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} + + styled-components@5.3.11: + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} + engines: {node: '>=18'} + + term-canvas@0.0.5: + resolution: {integrity: sha512-eZ3rIWi5yLnKiUcsW8P79fKyooaLmyLWAGqBhFspqMxRNUiB4GmHHk5AzQ4LxvFbJILaXqQZLwbbATLOhCFwkw==} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} - bytestreamjs@2.0.1: - resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} - engines: {node: '>=6.0.0'} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} + toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true - camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true - caniuse-lite@1.0.30001743: - resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' - cbor2@1.12.0: - resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==} - engines: {node: '>=18.7'} + ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} - engines: {node: '>=18'} + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + turbo-darwin-64@2.8.3: + resolution: {integrity: sha512-4kXRLfcygLOeNcP6JquqRLmGB/ATjjfehiojL2dJkL7GFm3SPSXbq7oNj8UbD8XriYQ5hPaSuz59iF1ijPHkTw==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@2.8.3: + resolution: {integrity: sha512-xF7uCeC0UY0Hrv/tqax0BMbFlVP1J/aRyeGQPZT4NjvIPj8gSPDgFhfkfz06DhUwDg5NgMo04uiSkAWE8WB/QQ==} + cpu: [arm64] + os: [darwin] - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + turbo-linux-64@2.8.3: + resolution: {integrity: sha512-vxMDXwaOjweW/4etY7BxrXCSkvtwh0PbwVafyfT1Ww659SedUxd5rM3V2ZCmbwG8NiCfY7d6VtxyHx3Wh1GoZA==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@2.8.3: + resolution: {integrity: sha512-mQX7uYBZFkuPLLlKaNe9IjR1JIef4YvY8f21xFocvttXvdPebnq3PK1Zjzl9A1zun2BEuWNUwQIL8lgvN9Pm3Q==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@2.8.3: + resolution: {integrity: sha512-YLGEfppGxZj3VWcNOVa08h6ISsVKiG85aCAWosOKNUjb6yErWEuydv6/qImRJUI+tDLvDvW7BxopAkujRnWCrw==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@2.8.3: + resolution: {integrity: sha512-afTUGKBRmOJU1smQSBnFGcbq0iabAPwh1uXu2BVk7BREg30/1gMnJh9DFEQTah+UD3n3ru8V55J83RQNFfqoyw==} + cpu: [arm64] + os: [win32] + + turbo@2.8.3: + resolution: {integrity: sha512-8Osxz5Tu/Dw2kb31EAY+nhq/YZ3wzmQSmYa1nIArqxgCAldxv9TPlrAiaBUDVnKA4aiPn0OFBD1ACcpc5VFOAQ==} + hasBin: true + + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typechain@8.3.2: + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typeforce@1.18.0: + resolution: {integrity: sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici-types@7.20.0: + resolution: {integrity: sha512-PZDAAlMkNw5ZzN/ebfyrwzrMWfIf7Jbn9iM/I6SF456OKrb2wnfqVowaxEY/cMAM8MjFu1zhdpJyA0L+rTYwNw==} + + undici@7.20.0: + resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} + engines: {node: '>=20.18.1'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unstorage@1.17.4: + resolution: {integrity: sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - change-case@3.1.0: - resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + utf-8-validate@6.0.6: + resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} + engines: {node: '>=6.14.2'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + valibot@1.2.0: + resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + valtio@1.13.2: + resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + vercel@50.11.0: + resolution: {integrity: sha512-7NYySLuRChEAidSGOIJ60/qcEXVz12EInqD5OHUyszPx3oOXLrqqfJIiN+SO90jLRGlZXoF0YG9dZ6NaKCbWQw==} + engines: {node: '>= 18'} + hasBin: true + + viem@2.23.2: + resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.45.1: + resolution: {integrity: sha512-LN6Pp7vSfv50LgwhkfSbIXftAM5J89lP9x8TeDa8QM7o41IxlHrDh0F9X+FfnCWtsz11pEVV5sn+yBUoOHNqYA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + wagmi@3.3.4: + resolution: {integrity: sha512-3lJh4oJpmQm0av+syQ7w3ZjTddlIPQv1irQr643y+fpwOjgHUeU85uSchGGg9WBg8nahU6EBYOuRdBSjtyIc+Q==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.7.3' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-vitals@0.2.4: + resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + + web3-core@4.7.1: + resolution: {integrity: sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-errors@1.3.1: + resolution: {integrity: sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-abi@4.4.1: + resolution: {integrity: sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-accounts@4.3.1: + resolution: {integrity: sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-contract@4.7.2: + resolution: {integrity: sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-ens@4.4.0: + resolution: {integrity: sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-iban@4.0.7: + resolution: {integrity: sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth-personal@4.1.0: + resolution: {integrity: sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-eth@4.11.1: + resolution: {integrity: sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-net@4.1.0: + resolution: {integrity: sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-providers-http@4.2.0: + resolution: {integrity: sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-providers-ipc@4.0.7: + resolution: {integrity: sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-providers-ws@4.0.8: + resolution: {integrity: sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-rpc-methods@1.3.0: + resolution: {integrity: sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-rpc-providers@1.0.0-rc.4: + resolution: {integrity: sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-types@1.10.0: + resolution: {integrity: sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-utils@4.3.3: + resolution: {integrity: sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3-validator@2.0.6: + resolution: {integrity: sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==} + engines: {node: '>=14', npm: '>=6.12.0'} + + web3@4.16.0: + resolution: {integrity: sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==} + engines: {node: '>=14.0.0', npm: '>=6.12.0'} + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + wif@2.0.6: + resolution: {integrity: sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==} + + wordwrap@0.0.3: + resolution: {integrity: sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==} + engines: {node: '>=0.4.0'} + + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + x256@0.0.2: + resolution: {integrity: sha512-ZsIH+sheoF8YG9YG+QKEEIdtqpHRA9FYuD7MqhfyB1kayXU43RUNBFSxBEnF8ywSUxdg+8no4+bPr5qLbyxKgA==} + engines: {node: '>=0.4.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} - concurrently@8.2.2: - resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} - engines: {node: ^14.13.0 || >=16.0.0} - hasBin: true + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} - constant-case@2.0.0: - resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} - core-js-pure@3.44.0: - resolution: {integrity: sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} - date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} engines: {node: '>=6'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + yoga-layout@3.2.1: + resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + zeptomatch@2.1.0: + resolution: {integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - del@5.1.0: - resolution: {integrity: sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==} - engines: {node: '>=8'} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} + zustand@5.0.0: + resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true - detect-libc@2.1.0: - resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} - engines: {node: '>=8'} + zustand@5.0.11: + resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} +snapshots: - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + 0xsequence@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/account': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/api': 2.3.39 + '@0xsequence/auth': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/guard': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/indexer': 2.3.39 + '@0xsequence/metadata': 2.3.39 + '@0xsequence/migration': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/provider': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/sessions': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/signhub': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@0no-co/graphql.web@1.2.0(graphql@16.12.0)': + optionalDependencies: + graphql: 16.12.0 - dot-case@2.1.1: - resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + '@0no-co/graphqlsp@1.15.2(graphql@16.12.0)(typescript@5.8.3)': + dependencies: + '@gql.tada/internal': 1.0.8(graphql@16.12.0)(typescript@5.8.3) + graphql: 16.12.0 + typescript: 5.8.3 - dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} + '@0xsequence/abi@2.3.39': {} + + '@0xsequence/account@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/migration': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/sessions': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@0xsequence/api@2.3.39': {} + + '@0xsequence/auth@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/account': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/api': 2.3.39 + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/ethauth': 1.0.0(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/indexer': 2.3.39 + '@0xsequence/metadata': 2.3.39 + '@0xsequence/migration': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/sessions': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/signhub': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@0xsequence/checkout@5.4.8(e8cb1cae3279f1548f0ca5a5ff2c9972)': + dependencies: + 0xsequence: 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/api': 2.3.39 + '@0xsequence/connect': 0.0.0-20251202170137(@emotion/is-prop-valid@1.4.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(bufferutil@4.1.0)(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4)(zod@3.25.76) + '@0xsequence/design-system': 2.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(motion@12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@0xsequence/hooks': 5.4.8(@0xsequence/api@2.3.39)(@0xsequence/indexer@2.3.39)(@0xsequence/metadata@2.3.39)(@0xsequence/network@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@0xsequence/indexer': 2.3.39 + '@0xsequence/marketplace': 2.3.39 + '@0xsequence/metadata': 2.3.39 + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/waas': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@tanstack/react-query': 5.90.20(react@19.2.4) + date-fns: 4.1.0 + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + fuse.js: 7.1.0 + motion: 12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + pako: 2.1.0 + qrcode.react: 4.2.0(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 3.3.4(bb1cf47ae47a74d724e315965d20c874) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@types/react' + - '@types/react-dom' + + '@0xsequence/connect@0.0.0-20251202170137(@emotion/is-prop-valid@1.4.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(bufferutil@4.1.0)(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4)(zod@3.25.76)': + dependencies: + 0xsequence: 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/api': 2.3.39 + '@0xsequence/auth': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/dapp-client': 3.0.0-beta.4(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@0xsequence/design-system': 2.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(motion@12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@0xsequence/ethauth': 1.0.0(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/hooks': 0.0.0-20251202170137(@0xsequence/api@2.3.39)(@0xsequence/indexer@2.3.39)(@0xsequence/metadata@2.3.39)(@0xsequence/network@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@0xsequence/indexer': 2.3.39 + '@0xsequence/metadata': 2.3.39 + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/provider': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/waas': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@databeat/tracker': 0.9.3 + '@react-oauth/google': 0.11.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tailwindcss/cli': 4.1.18 + '@tanstack/react-query': 5.90.20(react@19.2.4) + clsx: 2.1.1 + fuse.js: 7.1.0 + motion: 12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-apple-signin-auth: 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-dom: 19.2.4(react@19.2.4) + tailwindcss: 4.1.18 + uuid: 10.0.0 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 3.3.4(bb1cf47ae47a74d724e315965d20c874) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@types/react' + - '@types/react-dom' + - aws-crt + - bufferutil + - ethers + - typescript + - utf-8-validate + - zod - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} + '@0xsequence/core@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + '@0xsequence/dapp-client@3.0.0-beta.4(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@0xsequence/guard': 3.0.0-beta.12(typescript@5.8.3)(zod@3.25.76) + '@0xsequence/relayer': 3.0.0-beta.12(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@0xsequence/wallet-core': 3.0.0-beta.12(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@0xsequence/wallet-primitives': 3.0.0-beta.12(typescript@5.8.3)(zod@3.25.76) + ox: 0.9.17(typescript@5.8.3)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + '@0xsequence/design-system@2.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(motion@12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-aspect-ratio': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-progress': 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + class-variance-authority: 0.7.1 + clsx: 2.1.1 + motion: 12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-hook-form: 7.71.1(react@19.2.4) + tailwind-merge: 3.4.0 + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + '@0xsequence/ethauth@1.0.0(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + js-base64: 3.7.8 - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + '@0xsequence/guard@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/account': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/signhub': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + '@0xsequence/guard@3.0.0-beta.12(typescript@5.8.3)(zod@3.25.76)': + dependencies: + ox: 0.9.17(typescript@5.8.3)(zod@3.25.76) + transitivePeerDependencies: + - typescript + - zod - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} + '@0xsequence/hooks@0.0.0-20251202170137(@0xsequence/api@2.3.39)(@0xsequence/indexer@2.3.39)(@0xsequence/metadata@2.3.39)(@0xsequence/network@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@0xsequence/api': 2.3.39 + '@0xsequence/indexer': 2.3.39 + '@0xsequence/metadata': 2.3.39 + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@tanstack/react-query': 5.90.20(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + + '@0xsequence/hooks@5.4.8(@0xsequence/api@2.3.39)(@0xsequence/indexer@2.3.39)(@0xsequence/metadata@2.3.39)(@0xsequence/network@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@0xsequence/api': 2.3.39 + '@0xsequence/indexer': 2.3.39 + '@0xsequence/metadata': 2.3.39 + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@tanstack/react-query': 5.90.20(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + + '@0xsequence/indexer@2.3.39': {} + + '@0xsequence/marketplace@2.3.39': {} + + '@0xsequence/metadata@2.3.39': {} + + '@0xsequence/migration@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@0xsequence/network@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/indexer': 2.3.39 + '@0xsequence/relayer': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@0xsequence/provider@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/account': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/auth': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/migration': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/wallet': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@databeat/tracker': 0.9.3 + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + eventemitter2: 6.4.9 + webextension-polyfill: 0.10.0 + + '@0xsequence/relayer@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + + '@0xsequence/relayer@3.0.0-beta.12(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@0xsequence/wallet-primitives': 3.0.0-beta.12(typescript@5.8.3)(zod@3.25.76) + mipd: 0.0.7(typescript@5.8.3) + ox: 0.9.17(typescript@5.8.3)(zod@3.25.76) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} + '@0xsequence/replacer@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + '@0xsequence/sessions@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/migration': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/replacer': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + idb: 7.1.1 - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} + '@0xsequence/signhub@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + '@0xsequence/utils@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + js-base64: 3.7.8 - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + '@0xsequence/waas@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@aws-sdk/client-cognito-identity-provider': 3.982.0 + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + idb: 7.1.1 + json-canonicalize: 1.2.0 + jwt-decode: 4.0.0 + transitivePeerDependencies: + - aws-crt - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} + '@0xsequence/wallet-contracts@3.0.1(bufferutil@4.1.0)(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@typechain/ethers-v6': 0.5.1(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + keccak256: 1.0.6 + transitivePeerDependencies: + - bufferutil + - typechain + - typescript + - utf-8-validate - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} + '@0xsequence/wallet-core@3.0.0-beta.12(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@0xsequence/guard': 3.0.0-beta.12(typescript@5.8.3)(zod@3.25.76) + '@0xsequence/relayer': 3.0.0-beta.12(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@0xsequence/wallet-primitives': 3.0.0-beta.12(typescript@5.8.3)(zod@3.25.76) + mipd: 0.0.7(typescript@5.8.3) + ox: 0.9.17(typescript@5.8.3)(zod@3.25.76) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} + '@0xsequence/wallet-primitives@0.0.0-20250915145821(typescript@5.8.3)(zod@3.25.76)': + dependencies: + ox: 0.7.2(typescript@5.8.3)(zod@3.25.76) + transitivePeerDependencies: + - typescript + - zod - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} - engines: {node: '>=18'} - hasBin: true + '@0xsequence/wallet-primitives@3.0.0-beta.12(typescript@5.8.3)(zod@3.25.76)': + dependencies: + ox: 0.9.17(typescript@5.8.3)(zod@3.25.76) + transitivePeerDependencies: + - typescript + - zod - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + '@0xsequence/wallet-widget@0.0.0-20251202170137(aa110a2449a9010174034af1ff39bdcb)': + dependencies: + '@0xsequence/api': 2.3.39 + '@0xsequence/checkout': 5.4.8(e8cb1cae3279f1548f0ca5a5ff2c9972) + '@0xsequence/connect': 0.0.0-20251202170137(@emotion/is-prop-valid@1.4.0)(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(bufferutil@4.1.0)(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4)(zod@3.25.76) + '@0xsequence/design-system': 2.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(motion@12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@0xsequence/hooks': 5.4.8(@0xsequence/api@2.3.39)(@0xsequence/indexer@2.3.39)(@0xsequence/metadata@2.3.39)(@0xsequence/network@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)))(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@0xsequence/indexer': 2.3.39 + '@0xsequence/metadata': 2.3.39 + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@tanstack/react-query': 5.90.20(react@19.2.4) + dayjs: 1.11.19 + fuse.js: 7.1.0 + micro-observables: 1.7.2(react@19.2.4) + motion: 12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + qrcode.react: 4.2.0(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 3.3.4(bb1cf47ae47a74d724e315965d20c874) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@types/react' + - '@types/react-dom' - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + '@0xsequence/wallet@2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@0xsequence/abi': 2.3.39 + '@0xsequence/core': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/network': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/relayer': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/signhub': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@0xsequence/utils': 2.3.39(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + '@adraffy/ens-normalize@1.10.1': {} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true + '@adraffy/ens-normalize@1.11.1': {} - eslint-config-prettier@9.1.2: - resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + '@alcalzone/ansi-tokenize@0.2.4': + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 - eslint-plugin-only-warn@1.1.0: - resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} - engines: {node: '>=6'} + '@aws-crypto/sha256-browser@5.2.0': + dependencies: + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.973.1 + tslib: 2.8.1 - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + '@aws-crypto/supports-web-crypto@5.2.0': + dependencies: + tslib: 2.8.1 - eslint-plugin-turbo@2.5.5: - resolution: {integrity: sha512-IlN65X6W7rgK88u5xl1xC+7FIGKA7eyaca0yxZQ9CBNV6keAaqtjZQLw8ZfXdv7T+MzTLYkYOeOHAv8yCRUx4Q==} - peerDependencies: - eslint: '>6.6.0' - turbo: '>2.0.0' + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@aws-sdk/client-cognito-identity-provider@3.982.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/credential-provider-node': 3.972.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.6 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.982.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.4 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/client-sso@3.982.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.6 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.982.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.4 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.973.6': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/xml-builder': 3.972.4 + '@smithy/core': 3.22.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@aws-sdk/credential-provider-env@3.972.4': + dependencies: + '@aws-sdk/core': 3.973.6 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@aws-sdk/credential-provider-http@3.972.6': + dependencies: + '@aws-sdk/core': 3.973.6 + '@aws-sdk/types': 3.973.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.9 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.11 + tslib: 2.8.1 - eslint@9.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true + '@aws-sdk/credential-provider-ini@3.972.4': + dependencies: + '@aws-sdk/core': 3.973.6 + '@aws-sdk/credential-provider-env': 3.972.4 + '@aws-sdk/credential-provider-http': 3.972.6 + '@aws-sdk/credential-provider-login': 3.972.4 + '@aws-sdk/credential-provider-process': 3.972.4 + '@aws-sdk/credential-provider-sso': 3.972.4 + '@aws-sdk/credential-provider-web-identity': 3.972.4 + '@aws-sdk/nested-clients': 3.982.0 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@aws-sdk/credential-provider-login@3.972.4': + dependencies: + '@aws-sdk/core': 3.973.6 + '@aws-sdk/nested-clients': 3.982.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.972.5': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.4 + '@aws-sdk/credential-provider-http': 3.972.6 + '@aws-sdk/credential-provider-ini': 3.972.4 + '@aws-sdk/credential-provider-process': 3.972.4 + '@aws-sdk/credential-provider-sso': 3.972.4 + '@aws-sdk/credential-provider-web-identity': 3.972.4 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + '@aws-sdk/credential-provider-process@3.972.4': + dependencies: + '@aws-sdk/core': 3.973.6 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + '@aws-sdk/credential-provider-sso@3.972.4': + dependencies: + '@aws-sdk/client-sso': 3.982.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/token-providers': 3.982.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + '@aws-sdk/credential-provider-web-identity@3.972.4': + dependencies: + '@aws-sdk/core': 3.973.6 + '@aws-sdk/nested-clients': 3.982.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + '@aws-sdk/middleware-host-header@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + '@aws-sdk/middleware-logger@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + '@aws-sdk/middleware-recursion-detection@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + '@aws-sdk/middleware-user-agent@3.972.6': + dependencies: + '@aws-sdk/core': 3.973.6 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.982.0 + '@smithy/core': 3.22.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + '@aws-sdk/nested-clients@3.982.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.973.6 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.6 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.982.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.4 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-retry': 4.4.30 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.29 + '@smithy/util-defaults-mode-node': 4.2.32 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} - engines: {node: '>=12.0.0'} + '@aws-sdk/region-config-resolver@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/config-resolver': 4.4.6 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + '@aws-sdk/token-providers@3.982.0': + dependencies: + '@aws-sdk/core': 3.973.6 + '@aws-sdk/nested-clients': 3.982.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + '@aws-sdk/types@3.973.1': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - fake-indexeddb@6.0.1: - resolution: {integrity: sha512-He2AjQGHe46svIFq5+L2Nx/eHDTI1oKgoevBP+TthnjymXiKkeJQ3+ITeWey99Y5+2OaPFbI1qEsx/5RsGtWnQ==} - engines: {node: '>=18'} + '@aws-sdk/util-endpoints@3.982.0': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 + tslib: 2.8.1 - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + '@aws-sdk/util-locate-window@3.965.4': + dependencies: + tslib: 2.8.1 - fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} + '@aws-sdk/util-user-agent-browser@3.972.3': + dependencies: + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + bowser: 2.13.1 + tslib: 2.8.1 - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + '@aws-sdk/util-user-agent-node@3.972.4': + dependencies: + '@aws-sdk/middleware-user-agent': 3.972.6 + '@aws-sdk/types': 3.973.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + '@aws-sdk/xml-builder@3.972.4': + dependencies: + '@smithy/types': 4.12.0 + fast-xml-parser: 5.3.4 + tslib: 2.8.1 - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + '@aws/lambda-invoke-store@0.2.3': {} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true + '@babel/compat-data@7.29.0': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0(supports-color@5.5.0) + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + '@babel/generator@7.29.0': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.29.0 - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + '@babel/helper-compilation-targets@7.28.6': + dependencies: + '@babel/compat-data': 7.29.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.1 + lru-cache: 5.1.1 + semver: 6.3.1 - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + '@babel/helper-globals@7.28.0': {} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + '@babel/helper-module-imports@7.28.6(supports-color@5.5.0)': + dependencies: + '@babel/traverse': 7.29.0(supports-color@5.5.0) + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.28.6(supports-color@5.5.0) + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + '@babel/helper-plugin-utils@7.28.6': {} - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} + '@babel/helper-string-parser@7.27.1': {} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + '@babel/helper-validator-identifier@7.28.5': {} - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + '@babel/helper-validator-option@7.27.1': {} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + '@babel/helpers@7.28.6': + dependencies: + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] + '@babel/runtime@7.28.6': {} - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} + '@babel/traverse@7.29.0(supports-color@5.5.0)': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + '@base-org/account@2.5.1(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@coinbase/cdp-sdk': 1.43.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + brotli-wasm: 3.0.1 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + optional: true - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} + '@bytecodealliance/preview2-shim@0.17.7': {} - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} + '@changesets/apply-release-plan@7.0.14': + dependencies: + '@changesets/config': 3.1.2 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.3 - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.3 - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} + '@changesets/cli@2.29.8(@types/node@20.11.0)': + dependencies: + '@changesets/apply-release-plan': 7.0.14 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.2 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.14 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.6 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@20.11.0) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + '@changesets/config@3.1.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.3 - glob@11.0.3: - resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} - engines: {node: 20 || >=22} - hasBin: true + '@changesets/get-release-plan@4.0.14': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.2 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.6 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + '@changesets/get-version-range-type@0.4.0': {} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 - globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + '@changesets/parse@0.4.2': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.1.1 - globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + '@changesets/read@0.6.6': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.2 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + '@changesets/types@4.1.0': {} - gradient-string@2.0.2: - resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} - engines: {node: '>=10'} + '@changesets/types@6.1.0': {} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.3 + prettier: 2.8.8 - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + '@chevrotain/cst-dts-gen@10.5.0': + dependencies: + '@chevrotain/gast': 10.5.0 + '@chevrotain/types': 10.5.0 + lodash: 4.17.23 - happy-dom@17.6.3: - resolution: {integrity: sha512-UVIHeVhxmxedbWPCfgS55Jg2rDfwf2BCKeylcPSqazLz5w3Kri7Q4xdBJubsr/+VUzFLh0VjIvh13RaDA2/Xug==} - engines: {node: '>=20.0.0'} + '@chevrotain/gast@10.5.0': + dependencies: + '@chevrotain/types': 10.5.0 + lodash: 4.17.23 - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} + '@chevrotain/types@10.5.0': {} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + '@chevrotain/utils@10.5.0': {} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + '@codesandbox/sdk@3.0.0-rc.1(@xterm/xterm@5.5.0)(ink@6.6.0(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))': + dependencies: + '@hey-api/client-fetch': 0.7.3 + '@inkjs/ui': 2.0.0(ink@6.6.0(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10)) + '@opentelemetry/api': 1.9.0 + '@xterm/addon-serialize': 0.13.0(@xterm/xterm@5.5.0) + '@xterm/headless': 5.5.0 + blessed: 0.1.81 + blessed-contrib: 4.11.0 + chalk: 5.6.2 + cli-table3: 0.6.5 + date-fns: 4.1.0 + fflate: 0.8.2 + isbinaryfile: 5.0.7 + ora: 8.2.0 + path: 0.12.7 + readline: 1.3.0 + util: 0.12.5 + yargs: 17.7.2 + optionalDependencies: + '@sentry/node': 9.47.1 + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + transitivePeerDependencies: + - '@xterm/xterm' + - ink + - supports-color - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + '@coinbase/cdp-sdk@1.43.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + abitype: 1.0.6(typescript@5.8.3)(zod@3.25.76) + axios: 1.13.4 + axios-retry: 4.5.0(axios@1.13.4) + jose: 6.1.3 + md5: 2.3.0 + uncrypto: 0.1.3 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} + '@coinbase/wallet-sdk@4.3.6(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.8.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + optional: true - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + '@colors/colors@1.5.0': + optional: true - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + '@databeat/tracker@0.9.3': + dependencies: + '@noble/hashes': 1.8.0 - header-case@1.0.1: - resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} + '@ecies/ciphers@0.2.5(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + optional: true - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + '@edge-runtime/format@2.2.1': {} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + '@edge-runtime/node-utils@2.3.0': {} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} + '@edge-runtime/ponyfill@2.4.2': {} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} - hasBin: true + '@edge-runtime/primitives@4.1.0': {} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + '@edge-runtime/vm@3.2.0': + dependencies: + '@edge-runtime/primitives': 4.1.0 - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + '@electric-sql/pglite-socket@0.0.20(@electric-sql/pglite@0.3.15)': + dependencies: + '@electric-sql/pglite': 0.3.15 - idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + '@electric-sql/pglite-tools@0.2.20(@electric-sql/pglite@0.3.15)': + dependencies: + '@electric-sql/pglite': 0.3.15 - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + '@electric-sql/pglite@0.3.15': {} - ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + '@emnapi/core@1.8.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + '@emotion/is-prop-valid@0.8.8': + dependencies: + '@emotion/memoize': 0.7.4 + optional: true - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + '@emotion/memoize@0.7.4': + optional: true - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + '@emotion/memoize@0.9.0': {} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + '@emotion/stylis@0.8.5': {} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + '@emotion/unitless@0.7.5': {} - inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} + '@esbuild/aix-ppc64@0.27.0': + optional: true - inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} + '@esbuild/android-arm64@0.27.0': + optional: true - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} + '@esbuild/android-arm@0.27.0': + optional: true - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + '@esbuild/android-x64@0.27.0': + optional: true - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} + '@esbuild/darwin-arm64@0.27.0': + optional: true - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} + '@esbuild/darwin-x64@0.27.0': + optional: true - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} + '@esbuild/freebsd-arm64@0.27.0': + optional: true - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + '@esbuild/freebsd-x64@0.27.0': + optional: true - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} + '@esbuild/linux-arm64@0.27.0': + optional: true - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + '@esbuild/linux-arm@0.27.0': + optional: true - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} + '@esbuild/linux-ia32@0.27.0': + optional: true - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} + '@esbuild/linux-loong64@0.27.0': + optional: true - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} + '@esbuild/linux-mips64el@0.27.0': + optional: true - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + '@esbuild/linux-ppc64@0.27.0': + optional: true - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} + '@esbuild/linux-riscv64@0.27.0': + optional: true - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + '@esbuild/linux-s390x@0.27.0': + optional: true - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} + '@esbuild/linux-x64@0.27.0': + optional: true - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + '@esbuild/netbsd-arm64@0.27.0': + optional: true - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + '@esbuild/netbsd-x64@0.27.0': + optional: true - is-lower-case@1.1.3: - resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} + '@esbuild/openbsd-arm64@0.27.0': + optional: true - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + '@esbuild/openbsd-x64@0.27.0': + optional: true - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + '@esbuild/openharmony-arm64@0.27.0': + optional: true - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} + '@esbuild/sunos-x64@0.27.0': + optional: true - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + '@esbuild/win32-arm64@0.27.0': + optional: true - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} + '@esbuild/win32-ia32@0.27.0': + optional: true - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + '@esbuild/win32-x64@0.27.0': + optional: true - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} + '@ethereumjs/common@3.2.0': + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + '@ethereumjs/rlp@4.0.1': {} - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} + '@ethereumjs/rlp@5.0.2': {} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + '@ethereumjs/tx@4.2.0': + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.2.1 - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + '@floating-ui/core@1.7.4': + dependencies: + '@floating-ui/utils': 0.2.10 - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} + '@floating-ui/dom@1.7.5': + dependencies: + '@floating-ui/core': 1.7.4 + '@floating-ui/utils': 0.2.10 - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} + '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/dom': 1.7.5 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + '@floating-ui/utils@0.2.10': {} - is-upper-case@1.1.2: - resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + '@gemini-wallet/core@0.3.2(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - supports-color + optional: true - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + '@gql.tada/cli-utils@1.7.2(@0no-co/graphqlsp@1.15.2(graphql@16.12.0)(typescript@5.8.3))(graphql@16.12.0)(typescript@5.8.3)': + dependencies: + '@0no-co/graphqlsp': 1.15.2(graphql@16.12.0)(typescript@5.8.3) + '@gql.tada/internal': 1.0.8(graphql@16.12.0)(typescript@5.8.3) + graphql: 16.12.0 + typescript: 5.8.3 - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} + '@gql.tada/internal@1.0.8(graphql@16.12.0)(typescript@5.8.3)': + dependencies: + '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) + graphql: 16.12.0 + typescript: 5.8.3 - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} + '@graphql-typed-document-node/core@3.2.0(graphql@16.12.0)': + dependencies: + graphql: 16.12.0 - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + '@hey-api/client-fetch@0.7.3': {} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + '@hono/node-server@1.19.9(hono@4.11.7)': + dependencies: + hono: 4.11.7 - isbinaryfile@4.0.10: - resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} - engines: {node: '>= 8.0.0'} + '@iarna/toml@2.2.5': {} - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + '@img/colour@1.0.0': + optional: true - isows@1.0.7: - resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} - peerDependencies: - ws: '*' + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true - istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true - js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true - json-canonicalize@2.0.0: - resolution: {integrity: sha512-yyrnK/mEm6Na3ChbJUWueXdapueW0p380RUyTW87XGb1ww8l8hU0pRrGC3vSWHe9CxrbPHX2fGUOZpNiHR0IIg==} + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true - jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + '@img/sharp-win32-arm64@0.34.5': + optional: true - lefthook-darwin-arm64@1.12.2: - resolution: {integrity: sha512-fTxeI9tEskrHjc3QyEO+AG7impBXY2Ed8V5aiRc3fw9POfYtVh9b5jRx90fjk2+ld5hf+Z1DsyyLq/vOHDFskQ==} - cpu: [arm64] - os: [darwin] + '@img/sharp-win32-ia32@0.34.5': + optional: true - lefthook-darwin-x64@1.12.2: - resolution: {integrity: sha512-T1dCDKAAfdHgYZ8qtrS02SJSHoR52RFcrGArFNll9Mu4ZSV19Sp8BO+kTwDUOcLYdcPGNaqOp9PkRBQGZWQC7g==} - cpu: [x64] - os: [darwin] + '@img/sharp-win32-x64@0.34.5': + optional: true - lefthook-freebsd-arm64@1.12.2: - resolution: {integrity: sha512-2n9z7Q4BKeMBoB9cuEdv0UBQH82Z4GgBQpCrfjCtyzpDnYQwrH8Tkrlnlko4qPh9MM6nLLGIYMKsA5nltzo8Cg==} - cpu: [arm64] - os: [freebsd] + '@inkjs/ui@2.0.0(ink@6.6.0(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))': + dependencies: + chalk: 5.6.2 + cli-spinners: 3.4.0 + deepmerge: 4.3.1 + figures: 6.1.0 + ink: 6.6.0(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) - lefthook-freebsd-x64@1.12.2: - resolution: {integrity: sha512-1hNY/irY+/3kjRzKoJYxG+m3BYI8QxopJUK1PQnknGo1Wy5u302SdX+tR7pnpz6JM5chrNw4ozSbKKOvdZ5VEw==} - cpu: [x64] - os: [freebsd] + '@inquirer/external-editor@1.0.3(@types/node@20.11.0)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 20.11.0 - lefthook-linux-arm64@1.12.2: - resolution: {integrity: sha512-1W4swYIVRkxq/LFTuuK4oVpd6NtTKY4E3VY2Uq2JDkIOJV46+8qGBF+C/QA9K3O9chLffgN7c+i+NhIuGiZ/Vw==} - cpu: [arm64] - os: [linux] + '@isaacs/balanced-match@4.0.1': {} - lefthook-linux-x64@1.12.2: - resolution: {integrity: sha512-J6VGuMfhq5iCsg1Pv7xULbuXC63gP5LaikT0PhkyBNMi3HQneZFDJ8k/sp0Ue9HkQv6QfWIo3/FgB9gz38MCFw==} - cpu: [x64] - os: [linux] + '@isaacs/brace-expansion@5.0.1': + dependencies: + '@isaacs/balanced-match': 4.0.1 - lefthook-openbsd-arm64@1.12.2: - resolution: {integrity: sha512-wncDRW3ml24DaOyH22KINumjvCohswbQqbxyH2GORRCykSnE859cTjOrRIchTKBIARF7PSeGPUtS7EK0+oDbaw==} - cpu: [arm64] - os: [openbsd] + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - lefthook-openbsd-x64@1.12.2: - resolution: {integrity: sha512-2jDOkCHNnc/oK/vR62hAf3vZb1EQ6Md2GjIlgZ/V7A3ztOsM8QZ5IxwYN3D1UOIR5ZnwMBy7PtmTJC/HJrig5w==} - cpu: [x64] - os: [openbsd] + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 - lefthook-windows-arm64@1.12.2: - resolution: {integrity: sha512-ZMH/q6UNSidhHEG/1QoqIl1n4yPTBWuVmKx5bONtKHicoz4QCQ+QEiNjKsG5OO4C62nfyHGThmweCzZVUQECJw==} - cpu: [arm64] - os: [win32] + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - lefthook-windows-x64@1.12.2: - resolution: {integrity: sha512-TqT2jIPcTQ9uwaw+v+DTmvnUHM/p7bbsSrPoPX+fRXSGLzFjyiY+12C9dObSwfCQq6rT70xqQJ9AmftJQsa5/Q==} - cpu: [x64] - os: [win32] + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - lefthook@1.12.2: - resolution: {integrity: sha512-2CeTu5NcmoT9YnqsHTq/TF36MlqlzHzhivGx3DrXHwcff4TdvrkIwUTA56huM3Nlo5ODAF/0hlPzaKLmNHCBnQ==} - hasBin: true + '@jridgewell/resolve-uri@3.1.2': {} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + '@jridgewell/sourcemap-codec@1.5.5': {} - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + '@juanelas/base64@1.1.5': {} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + '@lit-labs/ssr-dom-shim@1.5.1': + optional: true - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + optional: true - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.6 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 - log-symbols@3.0.0: - resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} - engines: {node: '>=8'} + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.6 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.3 + tar: 7.5.7 + transitivePeerDependencies: + - encoding + - supports-color - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + '@metamask/abi-utils@3.0.0': + dependencies: + '@metamask/superstruct': 3.2.1 + '@metamask/utils': 11.9.0 + transitivePeerDependencies: + - supports-color - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + '@metamask/eth-sig-util@8.2.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + '@metamask/abi-utils': 3.0.0 + '@metamask/utils': 11.9.0 + '@scure/base': 1.1.9 + ethereum-cryptography: 2.2.1 + tweetnacl: 1.0.3 + transitivePeerDependencies: + - supports-color - lower-case-first@1.0.2: - resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} + '@metamask/json-rpc-engine@8.0.2': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + optional: true - lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + '@metamask/json-rpc-middleware-stream@7.0.2': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + optional: true - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + '@metamask/object-multiplex@2.1.0': + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + optional: true - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} + '@metamask/onboarding@1.0.1': + dependencies: + bowser: 2.13.1 + optional: true - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} + '@metamask/providers@16.1.0': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.2 + '@metamask/utils': 8.5.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + optional: true - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + '@metamask/rpc-errors@6.4.0': + dependencies: + '@metamask/utils': 9.3.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + optional: true - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + '@metamask/rpc-errors@7.0.2': + dependencies: + '@metamask/utils': 11.9.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + optional: true - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + '@metamask/safe-event-emitter@3.1.2': + optional: true - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + '@metamask/sdk-analytics@0.0.5': + dependencies: + openapi-fetch: 0.13.8 + optional: true - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + '@metamask/sdk-communication-layer@0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.17)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@metamask/sdk-analytics': 0.0.5 + bufferutil: 4.1.0 + cross-fetch: 4.1.0 + date-fns: 2.30.0 + debug: 4.3.4 + eciesjs: 0.4.17 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + optional: true - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + '@metamask/sdk-install-modal-web@0.32.1': + dependencies: + '@paulmillr/qr': 0.2.1 + optional: true - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + '@metamask/sdk@0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.28.6 + '@metamask/onboarding': 1.0.1 + '@metamask/providers': 16.1.0 + '@metamask/sdk-analytics': 0.0.5 + '@metamask/sdk-communication-layer': 0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.17)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.32.1 + '@paulmillr/qr': 0.2.1 + bowser: 2.13.1 + cross-fetch: 4.1.0 + debug: 4.3.4 + eciesjs: 0.4.17 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + obj-multiplex: 1.0.0 + pump: 3.0.3 + readable-stream: 3.6.2 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tslib: 2.8.1 + util: 0.12.5 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + optional: true - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + '@metamask/superstruct@3.2.1': {} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + '@metamask/utils@11.9.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.1.9 + '@types/debug': 4.1.12 + '@types/lodash': 4.17.23 + debug: 4.4.3(supports-color@5.5.0) + lodash: 4.17.23 + pony-cause: 2.1.11 + semver: 7.7.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} + '@metamask/utils@8.5.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.12 + debug: 4.4.3(supports-color@5.5.0) + pony-cause: 2.1.11 + semver: 7.7.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + optional: true - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + '@metamask/utils@9.3.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.2.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.12 + debug: 4.4.3(supports-color@5.5.0) + pony-cause: 2.1.11 + semver: 7.7.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + optional: true - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + '@motionone/animation@10.18.0': + dependencies: + '@motionone/easing': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + '@motionone/dom@10.12.0': + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/generators': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + hey-listen: 1.0.8 + tslib: 2.8.1 - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + '@motionone/easing@10.18.0': + dependencies: + '@motionone/utils': 10.18.0 + tslib: 2.8.1 - mipd@0.0.7: - resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + '@motionone/generators@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + '@motionone/types@10.17.1': {} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + '@motionone/utils@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.8.1 - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + '@mrleebo/prisma-ast@0.13.1': + dependencies: + chevrotain: 10.5.0 + lilconfig: 2.1.0 - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + '@mysten/bcs@1.9.2': + dependencies: + '@mysten/utils': 0.2.0 + '@scure/base': 1.2.6 - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + '@mysten/sui@1.45.2(typescript@5.8.3)': + dependencies: + '@graphql-typed-document-node/core': 3.2.0(graphql@16.12.0) + '@mysten/bcs': 1.9.2 + '@mysten/utils': 0.2.0 + '@noble/curves': 1.9.4 + '@noble/hashes': 1.8.0 + '@protobuf-ts/grpcweb-transport': 2.11.1 + '@protobuf-ts/runtime': 2.11.1 + '@protobuf-ts/runtime-rpc': 2.11.1 + '@scure/base': 1.2.6 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + gql.tada: 1.9.0(graphql@16.12.0)(typescript@5.8.3) + graphql: 16.12.0 + poseidon-lite: 0.2.1 + valibot: 1.2.0(typescript@5.8.3) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - typescript - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + '@mysten/utils@0.2.0': + dependencies: + '@scure/base': 1.2.6 - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + '@napi-rs/wasm-runtime@1.1.1': + dependencies: + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 + '@tybys/wasm-util': 0.10.1 + optional: true - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} + '@next/env@16.1.6': {} - next@15.4.7: - resolution: {integrity: sha512-OcqRugwF7n7mC8OSYjvsZhhG1AYSvulor1EIUsIkbbEbf1qoE5EbH36Swj8WhF4cHqmDgkiam3z1c1W0J1Wifg==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true + '@next/swc-darwin-arm64@16.1.6': + optional: true - no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + '@next/swc-darwin-x64@16.1.6': + optional: true - node-plop@0.26.3: - resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} - engines: {node: '>=8.9.4'} + '@next/swc-linux-arm64-gnu@16.1.6': + optional: true - nodemon@3.1.10: - resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} - engines: {node: '>=10'} - hasBin: true + '@next/swc-linux-arm64-musl@16.1.6': + optional: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + '@next/swc-linux-x64-gnu@16.1.6': + optional: true - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + '@next/swc-linux-x64-musl@16.1.6': + optional: true - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + '@next/swc-win32-arm64-msvc@16.1.6': + optional: true - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} + '@next/swc-win32-x64-msvc@16.1.6': + optional: true - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + '@noble/ciphers@1.2.1': {} - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} + '@noble/ciphers@1.3.0': {} - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} + '@noble/curves@1.8.0': + dependencies: + '@noble/hashes': 1.7.0 + optional: true - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + '@noble/curves@1.8.1': + dependencies: + '@noble/hashes': 1.7.1 - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + '@noble/curves@1.9.4': + dependencies: + '@noble/hashes': 1.8.0 - ora@4.1.1: - resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} - engines: {node: '>=8'} + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + '@noble/ed25519@1.7.3': {} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + '@noble/hashes@1.0.0': {} - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + '@noble/hashes@1.3.2': {} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + '@noble/hashes@1.4.0': {} - ox@0.7.2: - resolution: {integrity: sha512-JJHxdef3KqwQ8xW9H+UVLWaQiCUh/DeFN/Ii65XwbHTvSuXZveihTV2gs9hhLw5XEWPBrcH7sQBM0rqG7/QurQ==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true + '@noble/hashes@1.7.0': + optional: true - ox@0.8.1: - resolution: {integrity: sha512-e+z5epnzV+Zuz91YYujecW8cF01mzmrUtWotJ0oEPym/G82uccs7q0WDHTYL3eiONbTUEvcZrptAKLgTBD3u2A==} - peerDependencies: - typescript: '>=5.4.0' - peerDependenciesMeta: - typescript: - optional: true + '@noble/hashes@1.7.1': {} - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + '@noble/hashes@1.8.0': {} - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + '@noble/secp256k1@1.7.1': {} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + '@nodelib/fs.stat@2.0.5': {} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@nomicfoundation/slang@1.3.1': + dependencies: + '@bytecodealliance/preview2-shim': 0.17.7 + + '@okx-dex/okx-dex-sdk@1.0.18(bufferutil@4.1.0)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@mysten/sui': 1.45.2(typescript@5.8.3) + '@okxweb3/coin-ethereum': 1.1.2 + '@okxweb3/coin-sui': 1.1.3 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@types/bn.js': 5.2.0 + '@types/bs58': 5.0.0 + axios: 1.13.4 + bn.js: 5.2.2 + bs58: 6.0.0 + crypto-js: 4.2.0 + dotenv: 16.6.1 + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + typescript: 5.8.3 + valibot: 1.2.0(typescript@5.8.3) + web3: 4.16.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - bufferutil + - debug + - encoding + - supports-color + - utf-8-validate + - zod - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} + '@okxweb3/coin-base@1.1.6': + dependencies: + '@okxweb3/crypto-lib': 1.0.13 - p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + '@okxweb3/coin-ethereum@1.1.2': + dependencies: + '@metamask/eth-sig-util': 8.2.0 + '@okxweb3/coin-base': 1.1.6 + '@okxweb3/crypto-lib': 1.0.13 + eth-sig-util: 3.0.1 + ethereum-cryptography: 3.1.0 + superstruct: 1.0.4 + transitivePeerDependencies: + - supports-color - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + '@okxweb3/coin-sui@1.1.3': + dependencies: + '@okxweb3/coin-base': 1.1.6 + '@okxweb3/crypto-lib': 1.0.13 + superstruct: 1.0.4 + + '@okxweb3/crypto-lib@1.0.13': + dependencies: + '@noble/ed25519': 1.7.3 + '@noble/hashes': 1.0.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.0.0 + asmcrypto.js: 2.3.2 + bigint-conversion: 2.4.3 + bigint-crypto-utils: 3.3.0 + bignumber.js: 9.1.2 + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + long: 5.2.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + protobufjs: 7.4.0 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + typeforce: 1.18.0 + wif: 2.0.6 - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} + '@opentelemetry/api-logs@0.57.2': + dependencies: + '@opentelemetry/api': 1.9.0 + optional: true - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} + '@opentelemetry/api@1.9.0': {} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + '@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + optional: true - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + optional: true - param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + '@opentelemetry/instrumentation-amqplib@0.46.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + '@opentelemetry/instrumentation-connect@0.43.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + optional: true - pascal-case@2.0.1: - resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} + '@opentelemetry/instrumentation-dataloader@0.16.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true - path-case@2.1.1: - resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + '@opentelemetry/instrumentation-express@0.47.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + '@opentelemetry/instrumentation-fs@0.19.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + '@opentelemetry/instrumentation-generic-pool@0.43.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + '@opentelemetry/instrumentation-graphql@0.47.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + '@opentelemetry/instrumentation-hapi@0.45.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + '@opentelemetry/instrumentation-http@0.57.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + forwarded-parse: 2.1.2 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + optional: true - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} + '@opentelemetry/instrumentation-ioredis@0.47.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + '@opentelemetry/instrumentation-kafkajs@0.7.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + '@opentelemetry/instrumentation-knex@0.44.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} + '@opentelemetry/instrumentation-koa@0.47.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + '@opentelemetry/instrumentation-lru-memoizer@0.44.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + '@opentelemetry/instrumentation-mongodb@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} + '@opentelemetry/instrumentation-mongoose@0.46.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + '@opentelemetry/instrumentation-mysql2@0.45.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true - pkijs@3.2.5: - resolution: {integrity: sha512-WX0la7n7CbnguuaIQoT4Fc0IJckPDOUldzOwlZ0nwpOcySS+Six/tXBdc0RX17J5o1To0SAr3xDJjDLsOfDFQA==} - engines: {node: '>=12.0.0'} + '@opentelemetry/instrumentation-mysql@0.45.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@types/mysql': 2.15.26 + transitivePeerDependencies: + - supports-color + optional: true - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} + '@opentelemetry/instrumentation-pg@0.51.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + '@types/pg': 8.6.1 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + optional: true - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + '@opentelemetry/instrumentation-redis-4@0.46.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.39.0 + transitivePeerDependencies: + - supports-color + optional: true - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + '@opentelemetry/instrumentation-tedious@0.18.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + optional: true - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + '@opentelemetry/instrumentation-undici@0.10.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true + '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.57.2 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.15.0 + require-in-the-middle: 7.5.2 + semver: 7.7.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + optional: true - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} - hasBin: true + '@opentelemetry/redis-common@0.36.2': + optional: true - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + optional: true - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + optional: true - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + '@opentelemetry/semantic-conventions@1.28.0': + optional: true - pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + '@opentelemetry/semantic-conventions@1.39.0': + optional: true - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + optional: true - pvtsutils@1.3.6: - resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + '@oxc-project/types@0.110.0': {} - pvutils@1.1.3: - resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} - engines: {node: '>=6.0.0'} + '@oxc-transform/binding-android-arm-eabi@0.111.0': + optional: true - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + '@oxc-transform/binding-android-arm64@0.111.0': + optional: true - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + '@oxc-transform/binding-darwin-arm64@0.111.0': + optional: true - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + '@oxc-transform/binding-darwin-x64@0.111.0': + optional: true - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} - peerDependencies: - react: ^19.1.0 + '@oxc-transform/binding-freebsd-x64@0.111.0': + optional: true - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + '@oxc-transform/binding-linux-arm-gnueabihf@0.111.0': + optional: true - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} - engines: {node: '>=0.10.0'} + '@oxc-transform/binding-linux-arm-musleabihf@0.111.0': + optional: true - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + '@oxc-transform/binding-linux-arm64-gnu@0.111.0': + optional: true - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + '@oxc-transform/binding-linux-arm64-musl@0.111.0': + optional: true - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + '@oxc-transform/binding-linux-ppc64-gnu@0.111.0': + optional: true - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} + '@oxc-transform/binding-linux-riscv64-gnu@0.111.0': + optional: true - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} + '@oxc-transform/binding-linux-riscv64-musl@0.111.0': + optional: true - registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + '@oxc-transform/binding-linux-s390x-gnu@0.111.0': + optional: true - registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} + '@oxc-transform/binding-linux-x64-gnu@0.111.0': + optional: true - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + '@oxc-transform/binding-linux-x64-musl@0.111.0': + optional: true - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + '@oxc-transform/binding-openharmony-arm64@0.111.0': + optional: true - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + '@oxc-transform/binding-wasm32-wasi@0.111.0': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true + '@oxc-transform/binding-win32-arm64-msvc@0.111.0': + optional: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + '@oxc-transform/binding-win32-ia32-msvc@0.111.0': + optional: true - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + '@oxc-transform/binding-win32-x64-msvc@0.111.0': + optional: true - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + '@parcel/watcher-android-arm64@2.5.6': + optional: true - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} - hasBin: true + '@parcel/watcher-darwin-x64@2.5.6': + optional: true - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} + '@parcel/watcher-win32-arm64@2.5.6': + optional: true - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} + '@parcel/watcher-win32-ia32@2.5.6': + optional: true - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + '@parcel/watcher-win32-x64@2.5.6': + optional: true - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.3 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + + '@paulmillr/qr@0.2.1': + optional: true - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + '@pkgjs/parseargs@0.11.0': + optional: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true + '@prisma/config@7.3.0': + dependencies: + c12: 3.1.0 + deepmerge-ts: 7.1.5 + effect: 3.18.4 + empathic: 2.0.0 + transitivePeerDependencies: + - magicast - sentence-case@2.1.1: - resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + '@prisma/debug@7.2.0': {} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + '@prisma/debug@7.3.0': {} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + '@prisma/dev@0.20.0(typescript@5.8.3)': + dependencies: + '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite-socket': 0.0.20(@electric-sql/pglite@0.3.15) + '@electric-sql/pglite-tools': 0.2.20(@electric-sql/pglite@0.3.15) + '@hono/node-server': 1.19.9(hono@4.11.7) + '@mrleebo/prisma-ast': 0.13.1 + '@prisma/get-platform': 7.2.0 + '@prisma/query-plan-executor': 7.2.0 + foreground-child: 3.3.1 + get-port-please: 3.2.0 + hono: 4.11.7 + http-status-codes: 2.3.0 + pathe: 2.0.3 + proper-lockfile: 4.1.2 + remeda: 2.33.4 + std-env: 3.10.0 + valibot: 1.2.0(typescript@5.8.3) + zeptomatch: 2.1.0 + transitivePeerDependencies: + - typescript - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} + '@prisma/engines-version@7.3.0-16.9d6ad21cbbceab97458517b147a6a09ff43aa735': {} - sharp@0.34.4: - resolution: {integrity: sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + '@prisma/engines@7.3.0': + dependencies: + '@prisma/debug': 7.3.0 + '@prisma/engines-version': 7.3.0-16.9d6ad21cbbceab97458517b147a6a09ff43aa735 + '@prisma/fetch-engine': 7.3.0 + '@prisma/get-platform': 7.3.0 - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + '@prisma/fetch-engine@7.3.0': + dependencies: + '@prisma/debug': 7.3.0 + '@prisma/engines-version': 7.3.0-16.9d6ad21cbbceab97458517b147a6a09ff43aa735 + '@prisma/get-platform': 7.3.0 - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + '@prisma/get-platform@7.2.0': + dependencies: + '@prisma/debug': 7.2.0 - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} + '@prisma/get-platform@7.3.0': + dependencies: + '@prisma/debug': 7.3.0 - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} + '@prisma/instrumentation@6.11.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} + '@prisma/query-plan-executor@7.2.0': {} - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} + '@prisma/studio-core@0.13.1(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@types/react': 19.2.10 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} + '@protobuf-ts/grpcweb-transport@2.11.1': + dependencies: + '@protobuf-ts/runtime': 2.11.1 + '@protobuf-ts/runtime-rpc': 2.11.1 - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + '@protobuf-ts/runtime-rpc@2.11.1': + dependencies: + '@protobuf-ts/runtime': 2.11.1 - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + '@protobuf-ts/runtime@2.11.1': {} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + '@protobufjs/aspromise@1.1.2': {} - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} + '@protobufjs/base64@1.1.2': {} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + '@protobufjs/codegen@2.0.4': {} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + '@protobufjs/eventemitter@1.1.0': {} - snake-case@2.1.0: - resolution: {integrity: sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==} + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} + '@protobufjs/float@1.0.2': {} - socks@2.8.6: - resolution: {integrity: sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + '@protobufjs/inquire@1.1.0': {} - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + '@protobufjs/path@1.1.2': {} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + '@protobufjs/pool@1.1.0': {} - spawn-command@0.0.2: - resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + '@protobufjs/utf8@1.1.0': {} - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + '@radix-ui/number@1.1.1': {} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + '@radix-ui/primitive@1.1.3': {} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + '@radix-ui/react-aspect-ratio@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + '@radix-ui/react-context@1.1.2(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + '@radix-ui/react-context@1.1.3(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} + '@radix-ui/react-direction@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + '@radix-ui/react-id@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-progress@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-context': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + aria-hidden: 1.2.6 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-remove-scroll: 2.7.2(@types/react@19.2.10)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + '@radix-ui/react-slot@1.2.3(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + '@radix-ui/react-slot@1.2.4(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 + + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) + + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.10)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - swap-case@1.1.2: - resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.10)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.10)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.10 - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} + '@radix-ui/react-visually-hidden@1.2.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.10))(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + '@types/react-dom': 19.2.3(@types/react@19.2.10) - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + '@radix-ui/rect@1.1.1': {} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + '@react-oauth/google@0.11.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + optional: true - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + optional: true - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} + '@reown/appkit-controllers@1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - tinygradient@1.1.5: - resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} + '@reown/appkit-pay@1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + lit: 3.3.0 + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} + '@reown/appkit-polyfills@1.7.8': + dependencies: + buffer: 6.0.3 + optional: true - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} + '@reown/appkit-scaffold-ui@1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + optional: true - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} - engines: {node: '>=14.0.0'} + '@reown/appkit-ui@1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - title-case@2.1.1: - resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + '@reown/appkit-utils@1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + '@reown/appkit-wallet@1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.8 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + optional: true - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + '@reown/appkit@1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0(@vercel/blob@1.0.2) + '@walletconnect/universal-provider': 2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - touch@3.1.1: - resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} - hasBin: true + '@rolldown/binding-android-arm64@1.0.0-rc.1': + optional: true - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true + '@rolldown/binding-darwin-arm64@1.0.0-rc.1': + optional: true - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' + '@rolldown/binding-darwin-x64@1.0.0-rc.1': + optional: true - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + '@rolldown/binding-freebsd-x64@1.0.0-rc.1': + optional: true - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.1': + optional: true - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.1': + optional: true - turbo-darwin-64@2.5.5: - resolution: {integrity: sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ==} - cpu: [x64] - os: [darwin] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.1': + optional: true - turbo-darwin-arm64@2.5.5: - resolution: {integrity: sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw==} - cpu: [arm64] - os: [darwin] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.1': + optional: true - turbo-linux-64@2.5.5: - resolution: {integrity: sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w==} - cpu: [x64] - os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.1': + optional: true - turbo-linux-arm64@2.5.5: - resolution: {integrity: sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw==} - cpu: [arm64] - os: [linux] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.1': + optional: true - turbo-windows-64@2.5.5: - resolution: {integrity: sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ==} - cpu: [x64] - os: [win32] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.1': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 + optional: true - turbo-windows-arm64@2.5.5: - resolution: {integrity: sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q==} - cpu: [arm64] - os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.1': + optional: true - turbo@2.5.5: - resolution: {integrity: sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==} - hasBin: true + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.1': + optional: true - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + '@rolldown/pluginutils@1.0.0-rc.1': {} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + '@rollup/pluginutils@5.3.0(rollup@4.45.1)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.45.1 - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} + '@rollup/rollup-android-arm-eabi@4.45.1': + optional: true - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} + '@rollup/rollup-android-arm64@4.45.1': + optional: true - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} + '@rollup/rollup-darwin-arm64@4.45.1': + optional: true - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + '@rollup/rollup-darwin-x64@4.45.1': + optional: true - typescript-eslint@8.38.0: - resolution: {integrity: sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + '@rollup/rollup-freebsd-arm64@4.45.1': + optional: true - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true + '@rollup/rollup-freebsd-x64@4.45.1': + optional: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + optional: true - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + optional: true - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} + '@rollup/rollup-linux-arm64-gnu@4.45.1': + optional: true - undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + '@rollup/rollup-linux-arm64-musl@4.45.1': + optional: true - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + optional: true - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + optional: true - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + optional: true - update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} + '@rollup/rollup-linux-riscv64-musl@4.45.1': + optional: true - upper-case-first@1.1.2: - resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==} + '@rollup/rollup-linux-s390x-gnu@4.45.1': + optional: true - upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + '@rollup/rollup-linux-x64-gnu@4.45.1': + optional: true - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + '@rollup/rollup-linux-x64-musl@4.45.1': + optional: true - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + '@rollup/rollup-win32-arm64-msvc@4.45.1': + optional: true - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true + '@rollup/rollup-win32-ia32-msvc@4.45.1': + optional: true - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + '@rollup/rollup-win32-x64-msvc@4.45.1': + optional: true - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + optional: true - viem@2.33.0: - resolution: {integrity: sha512-SxBM3CmeU+LWLlBclV9MPdbuFV8mQEl0NeRc9iyYU4a7Xb5sr5oku3s/bRGTPpEP+1hCAHYpM09/ui3/dQ6EsA==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + optional: true - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true + '@safe-global/safe-gateway-typescript-sdk@3.23.1': + optional: true - vite@7.0.5: - resolution: {integrity: sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true + '@scure/base@1.0.0': {} - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/debug': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + '@scure/base@1.1.9': {} - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + '@scure/base@1.2.6': {} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + '@scure/bip32@1.6.2': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + '@scure/bip39@1.5.4': + dependencies: + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@sentry/core@9.47.1': + optional: true - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true + '@sentry/node-core@9.47.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.39.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@sentry/core': 9.47.1 + '@sentry/opentelemetry': 9.47.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.39.0) + import-in-the-middle: 1.15.0 + optional: true - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + '@sentry/node@9.47.1': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.46.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.43.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.16.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.47.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.19.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.43.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.47.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.45.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.57.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.47.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.7.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.44.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.47.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.44.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.46.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.45.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.45.2(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.51.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis-4': 0.46.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.18.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.10.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@prisma/instrumentation': 6.11.1(@opentelemetry/api@1.9.0) + '@sentry/core': 9.47.1 + '@sentry/node-core': 9.47.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.39.0) + '@sentry/opentelemetry': 9.47.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.39.0) + import-in-the-middle: 1.15.0 + minimatch: 9.0.5 + transitivePeerDependencies: + - supports-color + optional: true - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + '@sentry/opentelemetry@9.47.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.39.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.39.0 + '@sentry/core': 9.47.1 + optional: true - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + '@sinclair/typebox@0.25.24': {} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + '@smithy/abort-controller@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + '@smithy/config-resolver@4.4.6': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + '@smithy/core@3.22.1': + dependencies: + '@smithy/middleware-serde': 4.2.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.11 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + '@smithy/credential-provider-imds@4.2.8': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + tslib: 2.8.1 - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + '@smithy/fetch-http-handler@5.3.9': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + '@smithy/hash-node@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + '@smithy/invalid-dependency@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 -snapshots: + '@smithy/middleware-content-length@4.2.8': + dependencies: + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@0xsequence/tee-verifier@0.1.2': + '@smithy/middleware-endpoint@4.4.13': dependencies: - cbor2: 1.12.0 - pkijs: 3.2.5 + '@smithy/core': 3.22.1 + '@smithy/middleware-serde': 4.2.9 + '@smithy/node-config-provider': 4.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 - '@adraffy/ens-normalize@1.11.0': {} + '@smithy/middleware-retry@4.4.30': + dependencies: + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/service-error-classification': 4.2.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 - '@ampproject/remapping@2.3.0': + '@smithy/middleware-serde@4.2.9': dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@babel/helper-string-parser@7.27.1': {} + '@smithy/middleware-stack@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@babel/helper-validator-identifier@7.27.1': {} + '@smithy/node-config-provider@4.3.8': + dependencies: + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@babel/parser@7.28.0': + '@smithy/node-http-handler@4.4.9': dependencies: - '@babel/types': 7.28.1 + '@smithy/abort-controller': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@babel/runtime-corejs3@7.28.0': + '@smithy/property-provider@4.2.8': dependencies: - core-js-pure: 3.44.0 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@babel/runtime@7.27.6': {} + '@smithy/protocol-http@5.3.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@babel/types@7.28.1': + '@smithy/querystring-builder@4.2.8': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@smithy/types': 4.12.0 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 - '@bcoe/v8-coverage@1.0.2': {} + '@smithy/querystring-parser@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@changesets/apply-release-plan@7.0.12': + '@smithy/service-error-classification@4.2.8': dependencies: - '@changesets/config': 3.1.1 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.7.2 + '@smithy/types': 4.12.0 - '@changesets/assemble-release-plan@6.0.9': + '@smithy/shared-ini-file-loader@4.4.3': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@changesets/changelog-git@0.2.1': + '@smithy/signature-v4@5.3.8': dependencies: - '@changesets/types': 6.1.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@changesets/cli@2.29.5': + '@smithy/smithy-client@4.11.2': dependencies: - '@changesets/apply-release-plan': 7.0.12 - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.1 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.13 - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.11 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.7.2 - spawndamnit: 3.0.1 - term-size: 2.2.1 + '@smithy/core': 3.22.1 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-stack': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.11 + tslib: 2.8.1 - '@changesets/config@3.1.1': + '@smithy/types@4.12.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 + tslib: 2.8.1 - '@changesets/errors@0.2.0': + '@smithy/url-parser@4.2.8': dependencies: - extendable-error: 0.1.7 + '@smithy/querystring-parser': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@changesets/get-dependents-graph@2.1.3': + '@smithy/util-base64@4.3.0': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.2 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@changesets/get-release-plan@4.0.13': + '@smithy/util-body-length-browser@4.2.0': dependencies: - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + tslib: 2.8.1 - '@changesets/get-version-range-type@0.4.0': {} + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 - '@changesets/git@3.0.4': + '@smithy/util-buffer-from@2.2.0': dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 - '@changesets/logger@0.1.1': + '@smithy/util-buffer-from@4.2.0': dependencies: - picocolors: 1.1.1 + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 - '@changesets/parse@0.4.1': + '@smithy/util-config-provider@4.2.0': dependencies: - '@changesets/types': 6.1.0 - js-yaml: 3.14.1 + tslib: 2.8.1 - '@changesets/pre@2.0.2': + '@smithy/util-defaults-mode-browser@4.3.29': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@changesets/read@0.6.5': + '@smithy/util-defaults-mode-node@4.2.32': dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 + '@smithy/config-resolver': 4.4.6 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.2 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@changesets/should-skip-package@0.1.2': + '@smithy/util-endpoints@3.2.8': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@changesets/types@4.1.0': {} + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 - '@changesets/types@6.1.0': {} + '@smithy/util-middleware@4.2.8': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@changesets/write@0.4.0': + '@smithy/util-retry@4.2.8': dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.1 - prettier: 2.8.8 + '@smithy/service-error-classification': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 - '@cspotcode/source-map-support@0.8.1': + '@smithy/util-stream@4.5.11': dependencies: - '@jridgewell/trace-mapping': 0.3.9 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.9 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 - '@emnapi/runtime@1.5.0': + '@smithy/util-uri-escape@4.2.0': dependencies: tslib: 2.8.1 - optional: true - '@esbuild/aix-ppc64@0.25.8': - optional: true + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 - '@esbuild/android-arm64@0.25.8': - optional: true + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 - '@esbuild/android-arm@0.25.8': - optional: true + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 - '@esbuild/android-x64@0.25.8': + '@socket.io/component-emitter@3.1.2': optional: true - '@esbuild/darwin-arm64@0.25.8': - optional: true + '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@esbuild/darwin-x64@0.25.8': - optional: true + '@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@esbuild/freebsd-arm64@0.25.8': - optional: true + '@solana/accounts@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@esbuild/freebsd-x64@0.25.8': - optional: true + '@solana/addresses@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/assertions': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/nominal-types': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@esbuild/linux-arm64@0.25.8': - optional: true + '@solana/assertions@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@esbuild/linux-arm@0.25.8': - optional: true + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 - '@esbuild/linux-ia32@0.25.8': - optional: true + '@solana/codecs-core@2.3.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.8.3) + typescript: 5.8.3 - '@esbuild/linux-loong64@0.25.8': - optional: true + '@solana/codecs-core@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@esbuild/linux-mips64el@0.25.8': - optional: true + '@solana/codecs-data-structures@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@esbuild/linux-ppc64@0.25.8': - optional: true + '@solana/codecs-numbers@2.3.0(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.8.3) + '@solana/errors': 2.3.0(typescript@5.8.3) + typescript: 5.8.3 - '@esbuild/linux-riscv64@0.25.8': - optional: true + '@solana/codecs-numbers@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@esbuild/linux-s390x@0.25.8': - optional: true + '@solana/codecs-strings@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@esbuild/linux-x64@0.25.8': - optional: true + '@solana/codecs@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.8.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/options': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@esbuild/netbsd-arm64@0.25.8': - optional: true + '@solana/errors@2.3.0(typescript@5.8.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.3 + typescript: 5.8.3 - '@esbuild/netbsd-x64@0.25.8': - optional: true + '@solana/errors@5.5.1(typescript@5.8.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.2 + optionalDependencies: + typescript: 5.8.3 - '@esbuild/openbsd-arm64@0.25.8': - optional: true + '@solana/fast-stable-stringify@5.5.1(typescript@5.8.3)': + optionalDependencies: + typescript: 5.8.3 - '@esbuild/openbsd-x64@0.25.8': - optional: true + '@solana/functional@5.5.1(typescript@5.8.3)': + optionalDependencies: + typescript: 5.8.3 - '@esbuild/openharmony-arm64@0.25.8': - optional: true + '@solana/instruction-plans@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/instructions': 5.5.1(typescript@5.8.3) + '@solana/keys': 5.5.1(typescript@5.8.3) + '@solana/promises': 5.5.1(typescript@5.8.3) + '@solana/transaction-messages': 5.5.1(typescript@5.8.3) + '@solana/transactions': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@esbuild/sunos-x64@0.25.8': - optional: true + '@solana/instructions@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@esbuild/win32-arm64@0.25.8': - optional: true + '@solana/keys@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/assertions': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/nominal-types': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/accounts': 5.5.1(typescript@5.8.3) + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/functional': 5.5.1(typescript@5.8.3) + '@solana/instruction-plans': 5.5.1(typescript@5.8.3) + '@solana/instructions': 5.5.1(typescript@5.8.3) + '@solana/keys': 5.5.1(typescript@5.8.3) + '@solana/offchain-messages': 5.5.1(typescript@5.8.3) + '@solana/plugin-core': 5.5.1(typescript@5.8.3) + '@solana/programs': 5.5.1(typescript@5.8.3) + '@solana/rpc': 5.5.1(typescript@5.8.3) + '@solana/rpc-api': 5.5.1(typescript@5.8.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + '@solana/signers': 5.5.1(typescript@5.8.3) + '@solana/sysvars': 5.5.1(typescript@5.8.3) + '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/transaction-messages': 5.5.1(typescript@5.8.3) + '@solana/transactions': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate - '@esbuild/win32-ia32@0.25.8': - optional: true + '@solana/nominal-types@5.5.1(typescript@5.8.3)': + optionalDependencies: + typescript: 5.8.3 - '@esbuild/win32-x64@0.25.8': - optional: true + '@solana/offchain-messages@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.8.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/keys': 5.5.1(typescript@5.8.3) + '@solana/nominal-types': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': + '@solana/options@5.5.1(typescript@5.8.3)': dependencies: - eslint: 9.31.0 - eslint-visitor-keys: 3.4.3 + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.8.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@eslint-community/regexpp@4.12.1': {} + '@solana/plugin-core@5.5.1(typescript@5.8.3)': + optionalDependencies: + typescript: 5.8.3 - '@eslint/config-array@0.21.0': + '@solana/programs@5.5.1(typescript@5.8.3)': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@5.5.0) - minimatch: 3.1.2 + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 transitivePeerDependencies: - - supports-color + - fastestsmallesttextencoderdecoder + + '@solana/promises@5.5.1(typescript@5.8.3)': + optionalDependencies: + typescript: 5.8.3 + + '@solana/rpc-api@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/keys': 5.5.1(typescript@5.8.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec': 5.5.1(typescript@5.8.3) + '@solana/rpc-transformers': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + '@solana/transaction-messages': 5.5.1(typescript@5.8.3) + '@solana/transactions': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@5.5.1(typescript@5.8.3)': + optionalDependencies: + typescript: 5.8.3 - '@eslint/config-helpers@0.3.0': {} + '@solana/rpc-spec-types@5.5.1(typescript@5.8.3)': + optionalDependencies: + typescript: 5.8.3 - '@eslint/core@0.15.1': + '@solana/rpc-spec@5.5.1(typescript@5.8.3)': dependencies: - '@types/json-schema': 7.0.15 + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@eslint/eslintrc@3.3.1': + '@solana/rpc-subscriptions-api@5.5.1(typescript@5.8.3)': dependencies: - ajv: 6.12.6 - debug: 4.4.1(supports-color@5.5.0) - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/keys': 5.5.1(typescript@5.8.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.8.3) + '@solana/rpc-transformers': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + '@solana/transaction-messages': 5.5.1(typescript@5.8.3) + '@solana/transactions': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 transitivePeerDependencies: - - supports-color - - '@eslint/js@9.31.0': {} + - fastestsmallesttextencoderdecoder - '@eslint/object-schema@2.1.6': {} + '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/functional': 5.5.1(typescript@5.8.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.8.3) + '@solana/subscribable': 5.5.1(typescript@5.8.3) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - '@eslint/plugin-kit@0.3.4': + '@solana/rpc-subscriptions-spec@5.5.1(typescript@5.8.3)': dependencies: - '@eslint/core': 0.15.1 - levn: 0.4.1 + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/promises': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.8.3) + '@solana/subscribable': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@humanfs/core@0.19.1': {} + '@solana/rpc-subscriptions@5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@5.8.3) + '@solana/functional': 5.5.1(typescript@5.8.3) + '@solana/promises': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-subscriptions-api': 5.5.1(typescript@5.8.3) + '@solana/rpc-subscriptions-channel-websocket': 5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.8.3) + '@solana/rpc-transformers': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + '@solana/subscribable': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate - '@humanfs/node@0.16.6': + '@solana/rpc-transformers@5.5.1(typescript@5.8.3)': dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 - - '@humanwhocodes/module-importer@1.0.1': {} + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/functional': 5.5.1(typescript@5.8.3) + '@solana/nominal-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@humanwhocodes/retry@0.3.1': {} + '@solana/rpc-transport-http@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.8.3) + undici-types: 7.20.0 + optionalDependencies: + typescript: 5.8.3 - '@humanwhocodes/retry@0.4.3': {} + '@solana/rpc-types@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/nominal-types': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@5.8.3) + '@solana/functional': 5.5.1(typescript@5.8.3) + '@solana/rpc-api': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec': 5.5.1(typescript@5.8.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-transformers': 5.5.1(typescript@5.8.3) + '@solana/rpc-transport-http': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/instructions': 5.5.1(typescript@5.8.3) + '@solana/keys': 5.5.1(typescript@5.8.3) + '@solana/nominal-types': 5.5.1(typescript@5.8.3) + '@solana/offchain-messages': 5.5.1(typescript@5.8.3) + '@solana/transaction-messages': 5.5.1(typescript@5.8.3) + '@solana/transactions': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@img/colour@1.0.0': - optional: true + '@solana/subscribable@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 - '@img/sharp-darwin-arm64@0.34.4': + '@solana/sysvars@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/accounts': 5.5.1(typescript@5.8.3) + '@solana/codecs': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.2.3 - optional: true + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/keys': 5.5.1(typescript@5.8.3) + '@solana/promises': 5.5.1(typescript@5.8.3) + '@solana/rpc': 5.5.1(typescript@5.8.3) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + '@solana/transaction-messages': 5.5.1(typescript@5.8.3) + '@solana/transactions': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate - '@img/sharp-darwin-x64@0.34.4': + '@solana/transaction-messages@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.8.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/functional': 5.5.1(typescript@5.8.3) + '@solana/instructions': 5.5.1(typescript@5.8.3) + '@solana/nominal-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.2.3 - optional: true + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@5.5.1(typescript@5.8.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.8.3) + '@solana/codecs-core': 5.5.1(typescript@5.8.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.8.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.8.3) + '@solana/codecs-strings': 5.5.1(typescript@5.8.3) + '@solana/errors': 5.5.1(typescript@5.8.3) + '@solana/functional': 5.5.1(typescript@5.8.3) + '@solana/instructions': 5.5.1(typescript@5.8.3) + '@solana/keys': 5.5.1(typescript@5.8.3) + '@solana/nominal-types': 5.5.1(typescript@5.8.3) + '@solana/rpc-types': 5.5.1(typescript@5.8.3) + '@solana/transaction-messages': 5.5.1(typescript@5.8.3) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@img/sharp-libvips-darwin-arm64@1.2.3': - optional: true + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.28.6 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@5.8.3) + agentkeepalive: 4.6.0 + bn.js: 5.2.2 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.3.3 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate - '@img/sharp-libvips-darwin-x64@1.2.3': - optional: true + '@solidity-parser/parser@0.20.2': {} - '@img/sharp-libvips-linux-arm64@1.2.3': - optional: true + '@standard-schema/spec@1.1.0': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@swc/helpers@0.5.18': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/cli@4.1.18': + dependencies: + '@parcel/watcher': 2.5.6 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + enhanced-resolve: 5.19.0 + mri: 1.2.0 + picocolors: 1.1.1 + tailwindcss: 4.1.18 + + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.19.0 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 - '@img/sharp-libvips-linux-arm@1.2.3': + '@tailwindcss/oxide-android-arm64@4.1.18': optional: true - '@img/sharp-libvips-linux-ppc64@1.2.3': + '@tailwindcss/oxide-darwin-arm64@4.1.18': optional: true - '@img/sharp-libvips-linux-s390x@1.2.3': + '@tailwindcss/oxide-darwin-x64@4.1.18': optional: true - '@img/sharp-libvips-linux-x64@1.2.3': + '@tailwindcss/oxide-freebsd-x64@4.1.18': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.2.3': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.2.3': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': optional: true - '@img/sharp-linux-arm64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.2.3 + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': optional: true - '@img/sharp-linux-arm@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.2.3 + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': optional: true - '@img/sharp-linux-ppc64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-ppc64': 1.2.3 + '@tailwindcss/oxide-linux-x64-musl@4.1.18': optional: true - '@img/sharp-linux-s390x@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.2.3 + '@tailwindcss/oxide-wasm32-wasi@4.1.18': optional: true - '@img/sharp-linux-x64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.2.3 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': optional: true - '@img/sharp-linuxmusl-arm64@0.34.4': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': optional: true - '@img/sharp-linuxmusl-x64@0.34.4': + '@tailwindcss/oxide@4.1.18': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - optional: true + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@img/sharp-wasm32@0.34.4': + '@tanstack/query-async-storage-persister@5.90.22': dependencies: - '@emnapi/runtime': 1.5.0 - optional: true + '@tanstack/query-core': 5.90.20 + '@tanstack/query-persist-client-core': 5.91.19 - '@img/sharp-win32-arm64@0.34.4': - optional: true + '@tanstack/query-core@5.90.20': {} - '@img/sharp-win32-ia32@0.34.4': - optional: true + '@tanstack/query-devtools@5.93.0': {} - '@img/sharp-win32-x64@0.34.4': - optional: true + '@tanstack/query-persist-client-core@5.91.19': + dependencies: + '@tanstack/query-core': 5.90.20 - '@isaacs/balanced-match@4.0.1': {} + '@tanstack/query-sync-storage-persister@5.90.22': + dependencies: + '@tanstack/query-core': 5.90.20 + '@tanstack/query-persist-client-core': 5.91.19 - '@isaacs/brace-expansion@5.0.0': + '@tanstack/react-query-devtools@5.91.3(@tanstack/react-query@5.90.20(react@19.2.4))(react@19.2.4)': dependencies: - '@isaacs/balanced-match': 4.0.1 + '@tanstack/query-devtools': 5.93.0 + '@tanstack/react-query': 5.90.20(react@19.2.4) + react: 19.2.4 - '@isaacs/cliui@8.0.2': + '@tanstack/react-query-persist-client@5.90.22(@tanstack/react-query@5.90.20(react@19.2.4))(react@19.2.4)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@tanstack/query-persist-client-core': 5.91.19 + '@tanstack/react-query': 5.90.20(react@19.2.4) + react: 19.2.4 + + '@tanstack/react-query@5.90.20(react@19.2.4)': + dependencies: + '@tanstack/query-core': 5.90.20 + react: 19.2.4 - '@istanbuljs/schema@0.1.3': {} + '@tootallnate/once@2.0.0': {} - '@jridgewell/gen-mapping@0.3.12': + '@ts-morph/common@0.11.1': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 + fast-glob: 3.3.3 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 - '@jridgewell/resolve-uri@3.1.2': {} + '@tsconfig/node10@1.0.12': {} - '@jridgewell/sourcemap-codec@1.5.4': {} + '@tsconfig/node12@1.0.11': {} - '@jridgewell/trace-mapping@0.3.29': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@tsconfig/node14@1.0.3': {} - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + '@tsconfig/node16@1.0.4': {} - '@manypkg/find-root@1.1.0': + '@tybys/wasm-util@0.10.1': dependencies: - '@babel/runtime': 7.27.6 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 + tslib: 2.8.1 + optional: true - '@manypkg/get-packages@1.1.3': - dependencies: - '@babel/runtime': 7.27.6 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 + '@typechain/ethers-v6@0.5.1(ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.8.3))(typescript@5.8.3)': + dependencies: + ethers: 6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + lodash: 4.17.23 + ts-essentials: 7.0.3(typescript@5.8.3) + typechain: 8.3.2(typescript@5.8.3) + typescript: 5.8.3 - '@next/env@15.4.7': {} + '@types/bn.js@4.11.6': + dependencies: + '@types/node': 25.2.0 - '@next/eslint-plugin-next@15.4.2': + '@types/bn.js@5.2.0': dependencies: - fast-glob: 3.3.1 + '@types/node': 25.2.0 - '@next/swc-darwin-arm64@15.4.7': - optional: true + '@types/bs58@5.0.0': + dependencies: + bs58: 6.0.0 - '@next/swc-darwin-x64@15.4.7': - optional: true + '@types/connect@3.4.38': + dependencies: + '@types/node': 25.2.0 - '@next/swc-linux-arm64-gnu@15.4.7': - optional: true + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 - '@next/swc-linux-arm64-musl@15.4.7': - optional: true + '@types/estree@1.0.8': {} - '@next/swc-linux-x64-gnu@15.4.7': - optional: true + '@types/json-schema@7.0.15': {} - '@next/swc-linux-x64-musl@15.4.7': - optional: true + '@types/lodash@4.17.23': {} - '@next/swc-win32-arm64-msvc@15.4.7': - optional: true + '@types/ms@2.1.0': {} - '@next/swc-win32-x64-msvc@15.4.7': + '@types/mysql@2.15.26': + dependencies: + '@types/node': 25.2.0 optional: true - '@noble/ciphers@1.3.0': {} + '@types/node@12.20.55': {} - '@noble/curves@1.9.2': + '@types/node@20.11.0': dependencies: - '@noble/hashes': 1.8.0 + undici-types: 5.26.5 - '@noble/curves@1.9.4': + '@types/node@22.7.5': dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} + undici-types: 6.19.8 - '@nodelib/fs.scandir@2.1.5': + '@types/node@25.2.0': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} + undici-types: 7.16.0 - '@nodelib/fs.walk@1.2.8': + '@types/pbkdf2@3.1.2': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + '@types/node': 25.2.0 - '@pkgjs/parseargs@0.11.0': + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.6.1 optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': + '@types/pg@8.6.1': + dependencies: + '@types/node': 25.2.0 + pg-protocol: 1.11.0 + pg-types: 2.2.0 optional: true - '@rollup/rollup-android-arm64@4.45.1': - optional: true + '@types/prettier@2.7.3': {} - '@rollup/rollup-darwin-arm64@4.45.1': - optional: true + '@types/prop-types@15.7.15': {} - '@rollup/rollup-darwin-x64@4.45.1': + '@types/react-dom@19.2.3(@types/react@19.2.10)': + dependencies: + '@types/react': 19.2.10 optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': - optional: true + '@types/react@18.3.27': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 - '@rollup/rollup-freebsd-x64@4.45.1': - optional: true + '@types/react@19.2.10': + dependencies: + csstype: 3.2.3 - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - optional: true + '@types/secp256k1@4.0.7': + dependencies: + '@types/node': 25.2.0 - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@types/shimmer@1.2.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@types/tedious@4.0.14': + dependencies: + '@types/node': 25.2.0 optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@types/trusted-types@2.0.7': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - optional: true + '@types/uuid@8.3.4': {} - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - optional: true + '@types/ws@7.4.7': + dependencies: + '@types/node': 12.20.55 - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - optional: true + '@types/ws@8.18.1': + dependencies: + '@types/node': 25.2.0 - '@rollup/rollup-linux-riscv64-musl@4.45.1': - optional: true + '@types/ws@8.5.3': + dependencies: + '@types/node': 25.2.0 - '@rollup/rollup-linux-s390x-gnu@4.45.1': - optional: true + '@vercel/analytics@1.6.1(next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)': + optionalDependencies: + next: 16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.4 + + '@vercel/backends@0.0.27(rollup@4.45.1)(typescript@5.8.3)': + dependencies: + '@vercel/build-utils': 13.3.0 + '@vercel/nft': 1.3.0(rollup@4.45.1) + execa: 3.2.0 + fs-extra: 11.1.0 + oxc-transform: 0.111.0 + path-to-regexp: 8.3.0 + resolve.exports: 2.0.3 + rolldown: 1.0.0-rc.1 + srvx: 0.8.9 + tsx: 4.21.0 + typescript: 5.8.3 + zod: 3.22.4 + transitivePeerDependencies: + - encoding + - rollup + - supports-color - '@rollup/rollup-linux-x64-gnu@4.45.1': - optional: true + '@vercel/blob@1.0.2': + dependencies: + async-retry: 1.3.3 + is-buffer: 2.0.5 + is-node-process: 1.2.0 + throttleit: 2.1.0 + undici: 7.20.0 - '@rollup/rollup-linux-x64-musl@4.45.1': - optional: true + '@vercel/build-utils@13.3.0': {} - '@rollup/rollup-win32-arm64-msvc@4.45.1': - optional: true + '@vercel/cervel@0.0.14(rollup@4.45.1)(typescript@5.8.3)': + dependencies: + '@vercel/backends': 0.0.27(rollup@4.45.1)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - encoding + - rollup + - supports-color - '@rollup/rollup-win32-ia32-msvc@4.45.1': - optional: true + '@vercel/detect-agent@1.1.0': {} - '@rollup/rollup-win32-x64-msvc@4.45.1': - optional: true + '@vercel/elysia@0.1.29(rollup@4.45.1)': + dependencies: + '@vercel/node': 5.5.30(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color - '@scure/base@1.2.6': {} + '@vercel/error-utils@2.0.3': {} - '@scure/bip32@1.7.0': + '@vercel/express@0.1.38(rollup@4.45.1)(typescript@5.8.3)': dependencies: - '@noble/curves': 1.9.4 - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 + '@vercel/cervel': 0.0.14(rollup@4.45.1)(typescript@5.8.3) + '@vercel/nft': 1.1.1(rollup@4.45.1) + '@vercel/node': 5.5.30(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + fs-extra: 11.1.0 + path-to-regexp: 8.3.0 + ts-morph: 12.0.0 + zod: 3.22.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color + - typescript - '@scure/bip39@1.6.0': + '@vercel/fastify@0.1.32(rollup@4.45.1)': dependencies: - '@noble/hashes': 1.8.0 - '@scure/base': 1.2.6 + '@vercel/node': 5.5.30(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color - '@swc/helpers@0.5.15': + '@vercel/fun@1.2.1': + dependencies: + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.3.4 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-to-regexp: 8.2.0 + promisepipe: 3.0.0 + semver: 7.5.4 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 7.5.7 + tinyexec: 0.3.2 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color + + '@vercel/gatsby-plugin-vercel-analytics@1.0.11': dependencies: - tslib: 2.8.1 + web-vitals: 0.2.4 - '@tootallnate/quickjs-emscripten@0.23.0': {} + '@vercel/gatsby-plugin-vercel-builder@2.0.129': + dependencies: + '@sinclair/typebox': 0.25.24 + '@vercel/build-utils': 13.3.0 + esbuild: 0.27.0 + etag: 1.8.1 + fs-extra: 11.1.0 - '@tsconfig/node10@1.0.11': {} + '@vercel/go@3.3.4': {} - '@tsconfig/node12@1.0.11': {} + '@vercel/h3@0.1.38(rollup@4.45.1)': + dependencies: + '@vercel/node': 5.5.30(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color - '@tsconfig/node14@1.0.3': {} + '@vercel/hono@0.2.32(rollup@4.45.1)': + dependencies: + '@vercel/nft': 1.1.1(rollup@4.45.1) + '@vercel/node': 5.5.30(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + fs-extra: 11.1.0 + path-to-regexp: 8.3.0 + ts-morph: 12.0.0 + zod: 3.22.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color - '@tsconfig/node16@1.0.4': {} + '@vercel/hydrogen@1.3.5': + dependencies: + '@vercel/static-config': 3.1.2 + ts-morph: 12.0.0 - '@turbo/gen@1.13.4(@types/node@20.19.9)(typescript@5.5.4)': + '@vercel/koa@0.1.12(rollup@4.45.1)': dependencies: - '@turbo/workspaces': 1.13.4 - chalk: 2.4.2 - commander: 10.0.1 - fs-extra: 10.1.0 - inquirer: 8.2.6 - minimatch: 9.0.5 - node-plop: 0.26.3 - proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@20.19.9)(typescript@5.5.4) - update-check: 1.5.4 - validate-npm-package-name: 5.0.1 + '@vercel/node': 5.5.30(rollup@4.45.1) + '@vercel/static-config': 3.1.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - - '@types/node' + - encoding + - rollup - supports-color - - typescript - '@turbo/workspaces@1.13.4': + '@vercel/nestjs@0.2.33(rollup@4.45.1)': dependencies: - chalk: 2.4.2 - commander: 10.0.1 - execa: 5.1.1 - fast-glob: 3.3.3 - fs-extra: 10.1.0 - gradient-string: 2.0.2 - inquirer: 8.2.6 - js-yaml: 4.1.0 - ora: 4.1.1 - rimraf: 3.0.2 - semver: 7.7.2 - update-check: 1.5.4 + '@vercel/node': 5.5.30(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color - '@types/chai@5.2.2': + '@vercel/next@4.15.22(rollup@4.45.1)': dependencies: - '@types/deep-eql': 4.0.2 + '@vercel/nft': 1.1.1(rollup@4.45.1) + transitivePeerDependencies: + - encoding + - rollup + - supports-color - '@types/deep-eql@4.0.2': {} + '@vercel/nft@1.1.1(rollup@4.45.1)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0(rollup@4.45.1) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.1 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color - '@types/estree@1.0.8': {} + '@vercel/nft@1.3.0(rollup@4.45.1)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0(rollup@4.45.1) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.1 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color - '@types/glob@7.2.0': + '@vercel/node@5.5.30(rollup@4.45.1)': + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 20.11.0 + '@vercel/build-utils': 13.3.0 + '@vercel/error-utils': 2.0.3 + '@vercel/nft': 1.1.1(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.27.0 + etag: 1.8.1 + mime-types: 2.1.35 + node-fetch: 2.6.9 + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@20.11.0)(typescript@4.9.5) + typescript: 4.9.5 + typescript5: typescript@5.9.3 + undici: 7.20.0 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color + + '@vercel/python@6.6.0': {} + + '@vercel/redwood@2.4.9(rollup@4.45.1)': dependencies: - '@types/minimatch': 6.0.0 - '@types/node': 20.19.9 + '@vercel/nft': 1.1.1(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + semver: 6.3.1 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color - '@types/inquirer@6.5.0': + '@vercel/remix-builder@5.5.10(rollup@4.45.1)': dependencies: - '@types/through': 0.0.33 - rxjs: 6.6.7 + '@vercel/error-utils': 2.0.3 + '@vercel/nft': 1.1.1(rollup@4.45.1) + '@vercel/static-config': 3.1.2 + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color - '@types/json-schema@7.0.15': {} + '@vercel/ruby@2.2.5': {} - '@types/minimatch@6.0.0': + '@vercel/rust@1.0.5': dependencies: - minimatch: 9.0.5 - - '@types/node@12.20.55': {} + '@iarna/toml': 2.2.5 + execa: 5.1.1 - '@types/node@20.19.9': + '@vercel/static-build@2.8.31': dependencies: - undici-types: 6.21.0 + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.129 + '@vercel/static-config': 3.1.2 + ts-morph: 12.0.0 - '@types/node@22.16.5': + '@vercel/static-config@3.1.2': dependencies: - undici-types: 6.21.0 + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 - '@types/prop-types@15.7.15': {} + '@wagmi/connectors@7.1.3(93e4d54496c4dd568a20c5ac1fa1dd1c)': + dependencies: + '@wagmi/core': 3.2.3(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(ox@0.11.3(typescript@5.8.3)(zod@3.25.76))(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + '@base-org/account': 2.5.1(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(utf-8-validate@5.0.10)(zod@3.25.76) + '@gemini-wallet/core': 0.3.2(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + porto: 0.2.35(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@3.2.3(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(ox@0.11.3(typescript@5.8.3)(zod@3.25.76))(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4) + typescript: 5.8.3 - '@types/react-dom@18.3.0': + '@wagmi/core@3.2.3(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(ox@0.11.3(typescript@5.8.3)(zod@3.25.76))(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: - '@types/react': 18.3.1 + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.8.3) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + optionalDependencies: + '@tanstack/query-core': 5.90.20 + ox: 0.11.3(typescript@5.8.3)(zod@3.25.76) + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@walletconnect/core@2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0(@vercel/blob@1.0.2) + '@walletconnect/utils': 2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true + + '@walletconnect/core@2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/logger': 2.1.2 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1(@vercel/blob@1.0.2) + '@walletconnect/utils': 2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - '@types/react-dom@18.3.1': + '@walletconnect/environment@1.0.1': dependencies: - '@types/react': 18.3.1 + tslib: 1.14.1 + optional: true + + '@walletconnect/ethereum-provider@2.21.1(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.8(@types/react@19.2.10)(@vercel/blob@1.0.2)(bufferutil@4.1.0)(react@19.2.4)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/sign-client': 2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1(@vercel/blob@1.0.2) + '@walletconnect/universal-provider': 2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - '@types/react@18.3.0': + '@walletconnect/events@1.0.1': dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + optional: true - '@types/react@18.3.1': + '@walletconnect/heartbeat@1.2.2': dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.1.3 + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + optional: true - '@types/through@0.0.33': + '@walletconnect/jsonrpc-http-connection@1.0.8': dependencies: - '@types/node': 20.19.9 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + optional: true - '@types/tinycolor2@1.4.6': {} + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + optional: true - '@types/yargs-parser@21.0.3': {} + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + optional: true - '@types/yargs@17.0.33': + '@walletconnect/jsonrpc-utils@1.0.8': dependencies: - '@types/yargs-parser': 21.0.3 + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + optional: true - '@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3)': + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/type-utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 - eslint: 9.31.0 - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - - supports-color + - bufferutil + - utf-8-validate + optional: true - '@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3)': + '@walletconnect/keyvaluestorage@1.1.1(@vercel/blob@1.0.2)': dependencies: - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) - eslint: 9.31.0 - typescript: 5.8.3 + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.2.2 + unstorage: 1.17.4(@vercel/blob@1.0.2)(idb-keyval@6.2.2) transitivePeerDependencies: - - supports-color + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + optional: true - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + '@walletconnect/logger@2.1.2': dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) - typescript: 5.8.3 + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + optional: true + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + optional: true + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.0 + optional: true + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + optional: true + + '@walletconnect/sign-client@2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0(@vercel/blob@1.0.2) + '@walletconnect/utils': 2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 transitivePeerDependencies: - - supports-color + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true + + '@walletconnect/sign-client@2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1(@vercel/blob@1.0.2) + '@walletconnect/utils': 2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + optional: true - '@typescript-eslint/scope-manager@8.38.0': + '@walletconnect/types@2.21.0(@vercel/blob@1.0.2)': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + optional: true - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + '@walletconnect/types@2.21.1(@vercel/blob@1.0.2)': dependencies: - typescript: 5.8.3 + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/logger': 2.1.2 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + optional: true - '@typescript-eslint/type-utils@8.38.0(eslint@9.31.0)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - debug: 4.4.1(supports-color@5.5.0) - eslint: 9.31.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@walletconnect/universal-provider@2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.0(@vercel/blob@1.0.2) + '@walletconnect/utils': 2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 transitivePeerDependencies: - - supports-color + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - '@typescript-eslint/types@8.38.0': {} + '@walletconnect/universal-provider@2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/jsonrpc-http-connection': 1.0.8 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/logger': 2.1.2 + '@walletconnect/sign-client': 2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1(@vercel/blob@1.0.2) + '@walletconnect/utils': 2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1(supports-color@5.5.0) - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + '@walletconnect/utils@2.21.0(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0(@vercel/blob@1.0.2) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - - supports-color + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - '@typescript-eslint/utils@8.38.0(eslint@9.31.0)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - eslint: 9.31.0 - typescript: 5.8.3 + '@walletconnect/utils@2.21.1(@vercel/blob@1.0.2)(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1(@vercel/blob@1.0.2) + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1(@vercel/blob@1.0.2) + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - - supports-color + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + optional: true - '@typescript-eslint/visitor-keys@8.38.0': + '@walletconnect/window-getters@1.0.1': dependencies: - '@typescript-eslint/types': 8.38.0 - eslint-visitor-keys: 4.2.1 + tslib: 1.14.1 + optional: true - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3))': + '@walletconnect/window-metadata@1.0.1': dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1(supports-color@5.5.0) - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.5)(happy-dom@17.6.3) - transitivePeerDependencies: - - supports-color + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 + optional: true - '@vitest/expect@3.2.4': + '@xterm/addon-serialize@0.13.0(@xterm/xterm@5.5.0)': dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - tinyrainbow: 2.0.0 + '@xterm/xterm': 5.5.0 - '@vitest/mocker@3.2.4(vite@7.0.5(@types/node@22.16.5))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - vite: 7.0.5(@types/node@22.16.5) + '@xterm/headless@5.5.0': {} - '@vitest/pretty-format@3.2.4': - dependencies: - tinyrainbow: 2.0.0 + '@xterm/xterm@5.5.0': {} - '@vitest/runner@3.2.4': - dependencies: - '@vitest/utils': 3.2.4 - pathe: 2.0.3 - strip-literal: 3.0.0 + abbrev@1.1.1: {} - '@vitest/snapshot@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 - pathe: 2.0.3 + abbrev@3.0.1: {} - '@vitest/spy@3.2.4': + abitype@0.7.1(typescript@5.8.3)(zod@3.25.76): dependencies: - tinyspy: 4.0.3 + typescript: 5.8.3 + optionalDependencies: + zod: 3.25.76 - '@vitest/utils@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 - tinyrainbow: 2.0.0 + abitype@1.0.6(typescript@5.8.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.8.3 + zod: 3.25.76 + + abitype@1.0.8(typescript@5.8.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.8.3 + zod: 3.25.76 + optional: true + + abitype@1.2.3(typescript@5.8.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.8.3 + zod: 3.22.4 + optional: true + + abitype@1.2.3(typescript@5.8.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.8.3 + zod: 3.25.76 - abitype@1.0.8(typescript@5.8.3): + abitype@1.2.3(typescript@5.8.3)(zod@4.3.6): optionalDependencies: typescript: 5.8.3 + zod: 4.3.6 + optional: true - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -4498,29 +13104,36 @@ snapshots: acorn@8.15.0: {} + aes-js@4.0.0-beta.5: {} + agent-base@7.1.4: {} - aggregate-error@3.1.0: + agentkeepalive@4.6.0: dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 + humanize-ms: 1.2.1 - ajv@6.12.6: + ajv@8.6.3: dependencies: fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 uri-js: 4.4.1 ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: + ansi-escapes@6.2.1: {} + + ansi-escapes@7.2.0: dependencies: - type-fest: 0.21.3 + environment: 1.1.0 + + ansi-regex@2.1.1: {} ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} + + ansi-styles@2.2.1: {} ansi-styles@3.2.1: dependencies: @@ -4530,12 +13143,23 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} + + ansi-term@0.0.2: + dependencies: + x256: 0.0.2 + + ansicolors@0.3.2: {} + + any-promise@1.3.0: {} anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + optional: true + + arg@4.1.0: {} arg@4.1.3: {} @@ -4545,106 +13169,137 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.2: + aria-hidden@1.2.6: dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 + tslib: 2.8.1 - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 + array-back@3.1.0: {} + + array-back@4.0.2: {} array-union@2.1.0: {} - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 + asmcrypto.js@2.3.2: {} - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 + async-listen@1.2.0: {} - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-shim-unscopables: 1.1.0 + async-listen@3.0.0: {} - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 + async-listen@3.0.1: {} - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 + async-ref@0.1.6: {} - asn1js@3.0.6: + async-retry@1.3.3: dependencies: - pvtsutils: 1.3.6 - pvutils: 1.1.3 - tslib: 2.8.1 + retry: 0.13.1 - assertion-error@2.0.1: {} + async-sema@3.1.1: {} - ast-types@0.13.4: - dependencies: - tslib: 2.8.1 + asynckit@0.4.0: {} - ast-v8-to-istanbul@0.3.3: - dependencies: - '@jridgewell/trace-mapping': 0.3.29 - estree-walker: 3.0.3 - js-tokens: 9.0.1 + atomic-sleep@1.0.0: + optional: true - async-function@1.0.0: {} + auto-bind@5.0.1: {} available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 + aws-ssl-profiles@1.1.2: {} + + axios-retry@4.5.0(axios@1.13.4): + dependencies: + axios: 1.13.4 + is-retry-allowed: 2.2.0 + + axios@1.13.4: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-styled-components@2.1.4(@babel/core@7.28.5)(styled-components@5.3.11(@babel/core@7.28.5)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4))(supports-color@5.5.0): + dependencies: + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.28.6(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.5) + lodash: 4.17.23 + picomatch: 2.3.1 + styled-components: 5.3.11(@babel/core@7.28.5)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4) + transitivePeerDependencies: + - '@babel/core' + - supports-color + balanced-match@1.0.2: {} + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + base-x@5.0.1: {} + base64-js@1.5.1: {} - basic-ftp@5.0.5: {} + baseline-browser-mapping@2.9.19: {} better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - binary-extensions@2.3.0: {} + big.js@6.2.2: + optional: true - bl@4.1.0: + bigint-conversion@2.4.3: dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + '@juanelas/base64': 1.1.5 + + bigint-crypto-utils@3.3.0: {} + + bignumber.js@9.1.2: {} + + bignumber.js@9.3.1: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + blakejs@1.2.1: {} + + blessed-contrib@4.11.0: + dependencies: + ansi-term: 0.0.2 + chalk: 1.1.3 + drawille-canvas-blessed-contrib: 0.1.3 + lodash: 4.17.23 + map-canvas: 0.1.5 + marked: 4.3.0 + marked-terminal: 5.2.0(marked@4.3.0) + memory-streams: 0.1.3 + memorystream: 0.3.1 + picture-tuber: 1.0.2 + sparkline: 0.1.2 + strip-ansi: 3.0.1 + term-canvas: 0.0.5 + x256: 0.0.2 + + blessed@0.1.81: {} + + bn.js@4.12.0: {} + + bn.js@4.12.2: {} + + bn.js@5.2.2: {} + + borsh@0.7.0: + dependencies: + bn.js: 5.2.2 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + + bowser@2.13.1: {} brace-expansion@1.1.12: dependencies: @@ -4659,14 +13314,78 @@ snapshots: dependencies: fill-range: 7.1.1 - buffer@5.7.1: + bresenham@0.0.3: {} + + brorand@1.1.0: {} + + brotli-wasm@3.0.1: + optional: true + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.7 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001767 + electron-to-chromium: 1.5.286 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + + bs58@6.0.0: + dependencies: + base-x: 5.0.1 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + buffer-crc32@0.2.13: {} + + buffer-equal-constant-time@1.0.1: {} + + buffer-xor@1.0.3: {} + + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - bytestreamjs@2.0.1: {} + buffers@0.1.1: {} + + bufferutil@4.1.0: + dependencies: + node-gyp-build: 4.8.4 + optional: true - cac@6.7.14: {} + bytes@3.1.0: {} + + c12@3.1.0: + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 16.6.1 + exsolve: 1.0.8 + giget: 2.0.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.3.0 + rc9: 2.1.2 call-bind-apply-helpers@1.0.2: dependencies: @@ -4685,24 +13404,24 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - callsites@3.1.0: {} + camelcase@5.3.1: {} - camel-case@3.0.0: - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 + camelize@1.0.1: {} - caniuse-lite@1.0.30001743: {} + caniuse-lite@1.0.30001767: {} - cbor2@1.12.0: {} + cardinal@2.1.1: + dependencies: + ansicolors: 0.3.2 + redeyed: 2.1.1 - chai@5.2.1: + chalk@1.1.3: dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.1 + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 chalk@2.4.2: dependencies: @@ -4710,74 +13429,115 @@ snapshots: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@3.0.0: + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@4.1.2: + chalk@5.6.2: {} + + chardet@2.1.1: {} + + charenc@0.0.2: {} + + charm@0.1.2: {} + + chevrotain@10.5.0: dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + '@chevrotain/cst-dts-gen': 10.5.0 + '@chevrotain/gast': 10.5.0 + '@chevrotain/types': 10.5.0 + '@chevrotain/utils': 10.5.0 + lodash: 4.17.23 + regexp-to-ast: 0.5.0 - change-case@3.1.0: - dependencies: - camel-case: 3.0.0 - constant-case: 2.0.0 - dot-case: 2.1.1 - header-case: 1.0.1 - is-lower-case: 1.1.3 - is-upper-case: 1.1.2 - lower-case: 1.1.4 - lower-case-first: 1.0.2 - no-case: 2.3.2 - param-case: 2.1.1 - pascal-case: 2.0.1 - path-case: 2.1.1 - sentence-case: 2.1.1 - snake-case: 2.1.0 - swap-case: 1.1.2 - title-case: 2.1.1 - upper-case: 1.1.3 - upper-case-first: 1.1.2 - - chardet@0.7.0: {} - - check-error@2.1.1: {} - - chokidar@3.6.0: + chokidar@4.0.0: dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 + readdirp: 4.1.2 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + optional: true + + chownr@3.0.0: {} ci-info@3.9.0: {} - clean-stack@2.2.0: {} + cipher-base@1.0.7: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + citty@0.1.6: + dependencies: + consola: 3.4.2 + + citty@0.2.0: {} + + cjs-module-lexer@1.2.3: {} - cli-cursor@3.1.0: + cjs-module-lexer@1.4.3: + optional: true + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + cli-boxes@3.0.0: {} + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-cursor@5.0.0: dependencies: - restore-cursor: 3.1.0 + restore-cursor: 5.1.0 cli-spinners@2.9.2: {} - cli-width@3.0.0: {} + cli-spinners@3.4.0: {} + + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-truncate@5.1.1: + dependencies: + slice-ansi: 7.1.2 + string-width: 8.1.1 client-only@0.0.1: {} + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone@1.0.4: {} + clsx@1.2.1: + optional: true + + clsx@2.1.1: {} + + code-block-writer@10.1.1: {} + + code-excerpt@4.0.0: + dependencies: + convert-to-spaces: 2.0.1 color-convert@1.9.3: dependencies: @@ -4791,30 +13551,104 @@ snapshots: color-name@1.1.4: {} - commander@10.0.1: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@6.1.3: + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + + commander@14.0.2: {} + + commander@14.0.3: {} + + commander@2.20.3: {} concat-map@0.0.1: {} - concurrently@8.2.2: + confbox@0.2.2: {} + + connectkit@1.9.1(@babel/core@7.28.5)(@tanstack/react-query@5.90.20(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4): + dependencies: + '@tanstack/react-query': 5.90.20(react@19.2.4) + buffer: 6.0.3 + detect-browser: 5.3.0 + family: 0.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4) + framer-motion: 6.5.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + qrcode: 1.5.4 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-transition-state: 1.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react-use-measure: 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + resize-observer-polyfill: 1.5.1 + styled-components: 5.3.11(@babel/core@7.28.5)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 3.3.4(bb1cf47ae47a74d724e315965d20c874) + transitivePeerDependencies: + - '@babel/core' + - react-is + + consola@3.4.2: {} + + content-type@1.0.4: {} + + convert-hrtime@3.0.0: {} + + convert-source-map@2.0.0: {} + + convert-to-spaces@2.0.1: {} + + cookie-es@1.2.2: + optional: true + + cookie-es@2.0.0: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + create-hash@1.2.0: dependencies: - chalk: 4.1.2 - date-fns: 2.30.0 - lodash: 4.17.21 - rxjs: 7.8.2 - shell-quote: 1.8.3 - spawn-command: 0.0.2 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 + cipher-base: 1.0.7 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.3 + sha.js: 2.4.12 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.7 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + + create-require@1.1.1: {} - constant-case@2.0.0: + cross-fetch@3.2.0: dependencies: - snake-case: 2.1.0 - upper-case: 1.1.3 - - core-js-pure@3.44.0: {} + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + optional: true - create-require@1.1.1: {} + cross-fetch@4.1.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding cross-spawn@7.0.6: dependencies: @@ -4822,47 +13656,59 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - csstype@3.1.3: {} + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + optional: true - data-uri-to-buffer@6.0.2: {} + crypt@0.0.2: {} - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 + crypto-js@4.2.0: {} - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 + css-color-keywords@1.0.0: {} - data-view-byte-offset@1.0.1: + css-to-react-native@3.2.0: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + csstype@3.2.3: {} + + data-uri-to-buffer@4.0.1: {} date-fns@2.30.0: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.6 + optional: true + + date-fns@4.1.0: {} + + dayjs@1.11.13: + optional: true + + dayjs@1.11.19: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 - debug@4.4.1(supports-color@5.5.0): + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - deep-eql@5.0.2: {} + decamelize@1.2.0: {} + + decode-uri-component@0.2.2: + optional: true deep-extend@0.6.0: {} - deep-is@0.1.4: {} + deepmerge-ts@7.1.5: {} - defaults@1.0.4: - dependencies: - clone: 1.0.4 + deepmerge@4.3.1: {} define-data-property@1.1.4: dependencies: @@ -4870,51 +13716,50 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 + defu@6.1.4: {} - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 + delay@5.0.0: {} + + delayed-stream@1.0.0: {} + + denque@2.1.0: {} + + depd@1.1.2: {} - del@5.1.0: + derive-valtio@0.1.0(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4)): dependencies: - globby: 10.0.2 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 3.0.0 - rimraf: 3.0.2 - slash: 3.0.0 + valtio: 1.13.2(@types/react@19.2.10)(react@19.2.4) + optional: true + + destr@2.0.5: {} + + detect-browser@5.3.0: {} detect-indent@6.1.0: {} - detect-libc@2.1.0: - optional: true + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} - diff@4.0.2: {} + diff@8.0.3: {} + + dijkstrajs@1.0.3: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - dot-case@2.1.1: - dependencies: - no-case: 2.3.2 + dotenv@16.6.1: {} - dotenv@16.0.3: {} + drawille-blessed-contrib@1.0.0: {} - dotenv@16.6.1: {} + drawille-canvas-blessed-contrib@0.1.3: + dependencies: + ansi-term: 0.0.2 + bresenham: 0.0.3 + drawille-blessed-contrib: 1.0.0 + gl-matrix: 2.8.1 + x256: 0.0.2 dunder-proto@1.0.1: dependencies: @@ -4922,98 +13767,109 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + optional: true + eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + eciesjs@0.4.17: + dependencies: + '@ecies/ciphers': 0.2.5(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + optional: true + + edge-runtime@2.5.9: + dependencies: + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 + async-listen: 3.0.1 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + + effect@3.18.4: + dependencies: + '@standard-schema/spec': 1.1.0 + fast-check: 3.23.2 + + electron-to-chromium@1.5.286: {} + + elliptic@6.6.1: + dependencies: + bn.js: 4.12.2 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@10.6.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + empathic@2.0.0: {} + + encode-utf8@1.0.3: + optional: true + + end-of-stream@1.1.0: + dependencies: + once: 1.3.3 + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + engine.io-client@6.6.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@5.5.0) + engine.io-parser: 5.2.3 + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + optional: true + + engine.io-parser@5.2.3: + optional: true + + enhanced-resolve@5.19.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 + environment@1.1.0: {} es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-module-lexer@1.7.0: {} + es-module-lexer@1.4.1: {} es-object-atoms@1.1.1: dependencies: @@ -5026,171 +13882,178 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 + es-toolkit@1.33.0: + optional: true + + es-toolkit@1.44.0: {} - es-to-primitive@1.3.0: + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - esbuild@0.25.8: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 + es6-promise: 4.2.8 + + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 escalade@3.2.0: {} escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} + escape-string-regexp@2.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 + esprima@4.0.1: {} - eslint-config-prettier@9.1.2(eslint@9.31.0): - dependencies: - eslint: 9.31.0 + estree-walker@2.0.2: {} - eslint-plugin-only-warn@1.1.0: {} + etag@1.8.1: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.31.0): + eth-rpc-errors@4.0.3: dependencies: - eslint: 9.31.0 + fast-safe-stringify: 2.1.1 + optional: true - eslint-plugin-react@7.37.5(eslint@9.31.0): + eth-sig-util@3.0.1: + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 5.2.1 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + + ethereum-cryptography@0.1.3: + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.7 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.5 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.4 + setimmediate: 1.0.5 + + ethereum-cryptography@2.2.1: dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 9.31.0 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 - eslint-plugin-turbo@2.5.5(eslint@9.31.0)(turbo@2.5.5): + ethereum-cryptography@3.1.0: dependencies: - dotenv: 16.0.3 - eslint: 9.31.0 - turbo: 2.5.5 + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 - eslint-scope@8.4.0: + ethereumjs-abi@0.6.8: dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 + bn.js: 4.12.2 + ethereumjs-util: 6.2.1 - eslint-visitor-keys@3.4.3: {} + ethereumjs-util@5.2.1: + dependencies: + bn.js: 4.12.2 + create-hash: 1.2.0 + elliptic: 6.6.1 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + safe-buffer: 5.2.1 - eslint-visitor-keys@4.2.1: {} + ethereumjs-util@6.2.1: + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.2 + create-hash: 1.2.0 + elliptic: 6.6.1 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + + ethers@6.16.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate - eslint@9.31.0: + ethjs-util@0.1.6: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.15.1 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.31.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@5.5.0) - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 - espree@10.4.0: + event-stream@0.9.8: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 + optimist: 0.2.8 - esprima@4.0.1: {} + eventemitter2@6.4.9: {} - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 + eventemitter3@5.0.1: {} - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 + eventemitter3@5.0.4: {} - estraverse@5.3.0: {} + events-intercept@2.0.0: {} - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.8 + events@3.3.0: + optional: true - esutils@2.0.3: {} + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 - eventemitter3@5.0.1: {} + execa@3.2.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 execa@5.1.1: dependencies: @@ -5204,27 +14067,32 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - expect-type@1.2.2: {} + exsolve@1.0.8: {} + + extend@3.0.2: {} extendable-error@0.1.7: {} - external-editor@3.1.0: + extension-port-stream@3.0.0: dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + optional: true - fake-indexeddb@6.0.1: {} + eyes@0.1.8: {} - fast-deep-equal@3.1.3: {} + family@0.1.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4): + optionalDependencies: + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 3.3.4(bb1cf47ae47a74d724e315965d20c874) - fast-glob@3.3.1: + fast-check@3.23.2: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + pure-rand: 6.1.0 + + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: dependencies: @@ -5234,46 +14102,62 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} + fast-redact@3.5.0: + optional: true + + fast-safe-stringify@2.1.1: + optional: true + + fast-stable-stringify@1.0.0: {} - fast-levenshtein@2.0.6: {} + fast-xml-parser@5.3.4: + dependencies: + strnum: 2.1.2 - fastq@1.19.1: + fastq@1.20.1: dependencies: reusify: 1.1.0 - fdir@6.4.6(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 - figures@3.2.0: + fetch-blob@3.2.0: dependencies: - escape-string-regexp: 1.0.5 + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fflate@0.8.2: {} - file-entry-cache@8.0.0: + figures@6.1.0: dependencies: - flat-cache: 4.0.1 + is-unicode-supported: 2.1.0 + + file-uri-to-path@1.0.0: {} fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - find-up@4.1.0: + filter-obj@1.1.0: + optional: true + + find-replace@3.0.0: dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 + array-back: 3.1.0 - find-up@5.0.0: + find-up@4.1.0: dependencies: - locate-path: 6.0.0 + locate-path: 5.0.0 path-exists: 4.0.0 - flat-cache@4.0.1: + flag@5.0.1(react@19.2.4): dependencies: - flatted: 3.3.3 - keyv: 4.5.4 + '@types/react': 18.3.27 + async-ref: 0.1.6 + react: 19.2.4 - flatted@3.3.3: {} + follow-redirects@1.15.11: {} for-each@0.3.5: dependencies: @@ -5284,10 +14168,52 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fs-extra@10.1.0: + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded-parse@2.1.2: + optional: true + + framer-motion@12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + motion-dom: 12.30.1 + motion-utils: 12.29.2 + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 1.4.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + + framer-motion@6.5.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + '@motionone/dom': 10.12.0 + framesync: 6.0.1 + hey-listen: 1.0.8 + popmotion: 11.0.3 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + style-value-types: 5.0.0 + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 + + framesync@6.0.1: + dependencies: + tslib: 2.8.1 + + fs-extra@11.1.0: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@7.0.1: @@ -5309,19 +14235,39 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: + fuse.js@7.1.0: {} + + gaxios@7.1.3: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 + extend: 3.0.2 + https-proxy-agent: 7.0.6 + node-fetch: 3.3.2 + rimraf: 5.0.10 + transitivePeerDependencies: + - supports-color + + gcp-metadata@8.1.2: + dependencies: + gaxios: 7.1.3 + google-logging-utils: 1.1.3 + json-bigint: 1.0.0 + transitivePeerDependencies: + - supports-color + + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + + generator-function@2.0.1: {} - functions-have-names@1.2.3: {} + generic-pool@3.4.2: {} + + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} + get-east-asian-width@1.4.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5335,36 +14281,41 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + + get-port-please@3.2.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@6.0.1: {} - - get-symbol-description@1.1.0: + get-stream@5.2.0: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 + pump: 3.0.3 - get-uri@6.0.5: - dependencies: - basic-ftp: 5.0.5 - data-uri-to-buffer: 6.0.2 - debug: 4.4.1(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + get-stream@6.0.1: {} + + get-tsconfig@4.13.1: + dependencies: + resolve-pkg-maps: 1.0.0 - glob-parent@5.1.2: + giget@2.0.0: dependencies: - is-glob: 4.0.3 + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.7 + nypm: 0.6.4 + pathe: 2.0.3 - glob-parent@6.0.2: + gl-matrix@2.8.1: {} + + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - glob@10.4.5: + glob@10.5.0: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 @@ -5373,16 +14324,13 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.0.3: + glob@13.0.1: dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.0.3 + minimatch: 10.1.2 minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 + path-scurry: 2.0.1 - glob@7.2.3: + glob@7.1.7: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5391,61 +14339,91 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@14.0.0: {} - - globals@15.15.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - - globby@10.0.2: + globby@11.1.0: dependencies: - '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.3 - glob: 7.2.3 ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - globby@11.1.0: + google-auth-library@10.5.0: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 7.1.3 + gcp-metadata: 8.1.2 + google-logging-utils: 1.1.3 + gtoken: 8.0.0 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color - gopd@1.2.0: {} + google-logging-utils@1.1.3: {} - graceful-fs@4.2.11: {} + googleapis-common@8.0.1: + dependencies: + extend: 3.0.2 + gaxios: 7.1.3 + google-auth-library: 10.5.0 + qs: 6.14.1 + url-template: 2.0.8 + transitivePeerDependencies: + - supports-color - gradient-string@2.0.2: + googleapis@170.1.0: dependencies: - chalk: 4.1.2 - tinygradient: 1.1.5 + google-auth-library: 10.5.0 + googleapis-common: 8.0.1 + transitivePeerDependencies: + - supports-color - graphemer@1.4.0: {} + gopd@1.2.0: {} - handlebars@4.7.8: + gql.tada@1.9.0(graphql@16.12.0)(typescript@5.8.3): dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 + '@0no-co/graphql.web': 1.2.0(graphql@16.12.0) + '@0no-co/graphqlsp': 1.15.2(graphql@16.12.0)(typescript@5.8.3) + '@gql.tada/cli-utils': 1.7.2(@0no-co/graphqlsp@1.15.2(graphql@16.12.0)(typescript@5.8.3))(graphql@16.12.0)(typescript@5.8.3) + '@gql.tada/internal': 1.0.8(graphql@16.12.0)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - '@gql.tada/svelte-support' + - '@gql.tada/vue-support' + - graphql + + graceful-fs@4.2.11: {} + + grammex@3.1.12: {} + + graphmatch@1.1.0: {} - happy-dom@17.6.3: + graphql@16.12.0: {} + + gtoken@8.0.0: dependencies: - webidl-conversions: 7.0.0 - whatwg-mimetype: 3.0.0 + gaxios: 7.1.3 + jws: 4.0.1 + transitivePeerDependencies: + - supports-color + + h3@1.15.5: + dependencies: + cookie-es: 1.2.2 + crossws: 0.3.5 + defu: 6.1.4 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.3 + uncrypto: 0.1.3 + optional: true - has-bigints@1.1.0: {} + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 has-flag@3.0.0: {} @@ -5455,177 +14433,173 @@ snapshots: dependencies: es-define-property: 1.0.1 - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 + hash-base@3.1.2: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 - header-case@1.0.1: + here@0.0.2: {} + + hey-listen@1.0.8: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hoist-non-react-statics@3.3.2: dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 + react-is: 16.13.1 - html-escaper@2.0.2: {} + hono@4.11.7: {} - http-proxy-agent@7.0.2: + http-errors@1.7.3: dependencies: - agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + + http-status-codes@2.3.0: {} https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - human-id@4.1.1: {} + human-id@4.1.3: {} + + human-signals@1.1.1: {} human-signals@2.1.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + idb-keyval@6.2.1: + optional: true + + idb-keyval@6.2.2: + optional: true + idb@7.1.1: {} ieee754@1.2.1: {} - ignore-by-default@1.0.1: {} - ignore@5.3.2: {} - ignore@7.0.5: {} - - import-fresh@3.3.1: + import-in-the-middle@1.15.0: dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + optional: true - indent-string@4.0.0: {} + indent-string@5.0.0: {} inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - inherits@2.0.4: {} - - ini@1.3.8: {} - - inquirer@7.3.3: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - - inquirer@8.2.6: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 6.2.0 + inherits@2.0.3: {} - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 + inherits@2.0.4: {} - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 + ink@6.6.0(@types/react@19.2.10)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10): + dependencies: + '@alcalzone/ansi-tokenize': 0.2.4 + ansi-escapes: 7.2.0 + ansi-styles: 6.2.3 + auto-bind: 5.0.1 + chalk: 5.6.2 + cli-boxes: 3.0.0 + cli-cursor: 4.0.0 + cli-truncate: 5.1.1 + code-excerpt: 4.0.0 + es-toolkit: 1.44.0 + indent-string: 5.0.0 + is-in-ci: 2.0.0 + patch-console: 2.0.0 + react: 19.2.4 + react-reconciler: 0.33.0(react@19.2.4) + signal-exit: 3.0.7 + slice-ansi: 7.1.2 + stack-utils: 2.0.6 + string-width: 8.1.1 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + yoga-layout: 3.2.1 + optionalDependencies: + '@types/react': 19.2.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + iron-webcrypto@1.2.1: + optional: true - is-async-function@2.1.1: + is-arguments@1.2.0: dependencies: - async-function: 1.0.0 call-bound: 1.0.4 - get-proto: 1.0.1 has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 + is-buffer@1.1.6: {} - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + is-buffer@2.0.5: {} is-callable@1.2.7: {} is-core-module@2.16.1: dependencies: hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + optional: true is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.4.0 + + is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 + generator-function: 2.0.1 get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 @@ -5634,26 +14608,17 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} - - is-lower-case@1.1.3: - dependencies: - lower-case: 1.1.4 + is-hex-prefixed@1.0.0: {} - is-map@2.0.3: {} + is-in-ci@2.0.0: {} - is-negative-zero@2.0.3: {} + is-interactive@2.0.0: {} - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 + is-node-process@1.2.0: {} is-number@7.0.0: {} - is-path-cwd@2.2.0: {} - - is-path-inside@3.0.3: {} + is-property@1.0.2: {} is-regex@1.2.1: dependencies: @@ -5662,91 +14627,50 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 + is-retry-allowed@2.2.0: {} is-stream@2.0.1: {} - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 - is-unicode-supported@0.1.0: {} + is-unicode-supported@1.3.0: {} - is-upper-case@1.1.2: - dependencies: - upper-case: 1.1.3 - - is-weakmap@2.0.2: {} + is-unicode-supported@2.1.0: {} - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 + is-windows@1.0.2: {} - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 + isarray@0.0.1: {} - is-windows@1.0.2: {} + isarray@1.0.0: {} isarray@2.0.5: {} - isbinaryfile@4.0.10: {} + isbinaryfile@5.0.7: {} isexe@2.0.0: {} - isows@1.0.7(ws@8.18.2): - dependencies: - ws: 8.18.2 - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-report@3.0.1: + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) - istanbul-lib-source-maps@5.0.6: + isomorphic-ws@5.0.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - '@jridgewell/trace-mapping': 0.3.29 - debug: 4.4.1(supports-color@5.5.0) - istanbul-lib-coverage: 3.2.2 - transitivePeerDependencies: - - supports-color + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - istanbul-reports@3.1.7: + isows@1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optional: true - iterator.prototype@1.1.5: + isows@1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) jackspeak@3.4.3: dependencies: @@ -5754,179 +14678,330 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.1.1: + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: - '@isaacs/cliui': 8.0.2 + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate - js-tokens@4.0.0: {} + jiti@2.6.1: {} + + jose@5.9.6: {} - js-tokens@9.0.1: {} + jose@6.1.3: {} + + js-base64@3.7.8: {} + + js-sha3@0.8.0: {} + + js-tokens@4.0.0: {} - js-yaml@3.14.1: + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} + jsesc@3.1.0: {} - json-buffer@3.0.1: {} + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + + json-canonicalize@1.2.0: {} + + json-schema-to-ts@1.6.4: + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 - json-canonicalize@2.0.0: {} + json-schema-traverse@1.0.0: {} - json-schema-traverse@0.4.1: {} + json-stringify-safe@5.0.1: {} - json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - jsx-ast-utils@3.3.5: + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 + jwa: 2.0.1 + safe-buffer: 5.2.1 jwt-decode@4.0.0: {} - keyv@4.5.4: + keccak256@1.0.6: + dependencies: + bn.js: 5.2.2 + buffer: 6.0.3 + keccak: 3.0.4 + + keccak@3.0.4: dependencies: - json-buffer: 3.0.1 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 - lefthook-darwin-arm64@1.12.2: + keyvaluestorage-interface@1.0.0: optional: true - lefthook-darwin-x64@1.12.2: + lefthook-darwin-arm64@1.13.6: optional: true - lefthook-freebsd-arm64@1.12.2: + lefthook-darwin-x64@1.13.6: optional: true - lefthook-freebsd-x64@1.12.2: + lefthook-freebsd-arm64@1.13.6: optional: true - lefthook-linux-arm64@1.12.2: + lefthook-freebsd-x64@1.13.6: optional: true - lefthook-linux-x64@1.12.2: + lefthook-linux-arm64@1.13.6: optional: true - lefthook-openbsd-arm64@1.12.2: + lefthook-linux-x64@1.13.6: optional: true - lefthook-openbsd-x64@1.12.2: + lefthook-openbsd-arm64@1.13.6: optional: true - lefthook-windows-arm64@1.12.2: + lefthook-openbsd-x64@1.13.6: optional: true - lefthook-windows-x64@1.12.2: + lefthook-windows-arm64@1.13.6: optional: true - lefthook@1.12.2: + lefthook-windows-x64@1.13.6: + optional: true + + lefthook@1.13.6: optionalDependencies: - lefthook-darwin-arm64: 1.12.2 - lefthook-darwin-x64: 1.12.2 - lefthook-freebsd-arm64: 1.12.2 - lefthook-freebsd-x64: 1.12.2 - lefthook-linux-arm64: 1.12.2 - lefthook-linux-x64: 1.12.2 - lefthook-openbsd-arm64: 1.12.2 - lefthook-openbsd-x64: 1.12.2 - lefthook-windows-arm64: 1.12.2 - lefthook-windows-x64: 1.12.2 + lefthook-darwin-arm64: 1.13.6 + lefthook-darwin-x64: 1.13.6 + lefthook-freebsd-arm64: 1.13.6 + lefthook-freebsd-x64: 1.13.6 + lefthook-linux-arm64: 1.13.6 + lefthook-linux-x64: 1.13.6 + lefthook-openbsd-arm64: 1.13.6 + lefthook-openbsd-x64: 1.13.6 + lefthook-windows-arm64: 1.13.6 + lefthook-windows-x64: 1.13.6 + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true - levn@0.4.1: + lightningcss@1.30.2: dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + lilconfig@2.1.0: {} + + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.2 + optional: true - locate-path@5.0.0: + lit-html@3.3.2: dependencies: - p-locate: 4.1.0 + '@types/trusted-types': 2.0.7 + optional: true - locate-path@6.0.0: + lit@3.3.0: dependencies: - p-locate: 5.0.0 + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + optional: true - lodash.get@4.4.2: {} + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 - lodash.merge@4.6.2: {} + lodash.camelcase@4.3.0: {} lodash.startcase@4.4.0: {} - lodash@4.17.21: {} + lodash@4.17.23: {} - log-symbols@3.0.0: + log-symbols@6.0.0: dependencies: - chalk: 2.4.2 + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + + long@5.2.4: {} + + long@5.3.2: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.5: {} - log-symbols@4.1.0: + lru-cache@5.1.1: dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 + yallist: 3.1.1 - loose-envify@1.4.0: + lru-cache@6.0.0: dependencies: - js-tokens: 4.0.0 + yallist: 4.0.0 - loupe@3.1.4: {} + lru.min@1.1.4: {} - lower-case-first@1.0.2: + magic-string@0.30.21: dependencies: - lower-case: 1.1.4 + '@jridgewell/sourcemap-codec': 1.5.5 - lower-case@1.1.4: {} + make-error@1.3.6: {} - lru-cache@10.4.3: {} + map-canvas@0.1.5: + dependencies: + drawille-canvas-blessed-contrib: 0.1.3 + xml2js: 0.6.2 + + marked-terminal@5.2.0(marked@4.3.0): + dependencies: + ansi-escapes: 6.2.1 + cardinal: 2.1.1 + chalk: 5.6.2 + cli-table3: 0.6.5 + marked: 4.3.0 + node-emoji: 1.11.0 + supports-hyperlinks: 2.3.0 - lru-cache@11.1.0: {} + marked@4.3.0: {} - lru-cache@7.18.3: {} + math-intrinsics@1.1.0: {} - magic-string@0.30.17: + md5.js@1.3.5: dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 + hash-base: 3.1.2 + inherits: 2.0.4 + safe-buffer: 5.2.1 - magicast@0.3.5: + md5@2.3.0: dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 - source-map-js: 1.2.1 + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 - make-dir@4.0.0: + memory-streams@0.1.3: dependencies: - semver: 7.7.2 - - make-error@1.3.6: {} + readable-stream: 1.0.34 - math-intrinsics@1.1.0: {} + memorystream@0.3.1: {} merge-stream@2.0.0: {} merge2@1.4.1: {} + micro-ftch@0.3.1: {} + + micro-observables@1.7.2(react@19.2.4): + dependencies: + hoist-non-react-statics: 3.3.2 + react: 19.2.4 + + micro@9.3.5-canary.3: + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mimic-fn@2.1.0: {} - minimatch@10.0.3: + mimic-function@5.0.1: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@10.1.2: dependencies: - '@isaacs/brace-expansion': 5.0.0 + '@isaacs/brace-expansion': 5.0.1 minimatch@3.1.2: dependencies: @@ -5936,127 +15011,174 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimist@1.2.8: {} - minipass@7.1.2: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mipd@0.0.7(typescript@5.8.3): optionalDependencies: typescript: 5.8.3 - mkdirp@0.5.6: + mkdirp@1.0.4: {} + + module-details-from-path@1.0.4: + optional: true + + motion-dom@12.30.1: + dependencies: + motion-utils: 12.29.2 + + motion-utils@12.29.2: {} + + motion@12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - minimist: 1.2.8 + framer-motion: 12.31.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 1.4.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) mri@1.2.0: {} - ms@2.1.3: {} + ms@2.1.1: {} - mute-stream@0.0.8: {} + ms@2.1.2: {} - nanoid@3.3.11: {} + ms@2.1.3: {} + + multiformats@9.9.0: + optional: true - natural-compare@1.4.0: {} + mysql2@3.15.3: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.7.2 + long: 5.3.2 + lru.min: 1.1.4 + named-placeholders: 1.1.6 + seq-queue: 0.0.5 + sqlstring: 2.3.3 - neo-async@2.6.2: {} + named-placeholders@1.1.6: + dependencies: + lru.min: 1.1.4 - netmask@2.0.2: {} + nanoid@3.3.11: {} - next@15.4.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@16.1.6(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - '@next/env': 15.4.7 + '@next/env': 16.1.6 '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001743 + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001767 postcss: 8.4.31 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(react@19.1.0) - optionalDependencies: - '@next/swc-darwin-arm64': 15.4.7 - '@next/swc-darwin-x64': 15.4.7 - '@next/swc-linux-arm64-gnu': 15.4.7 - '@next/swc-linux-arm64-musl': 15.4.7 - '@next/swc-linux-x64-gnu': 15.4.7 - '@next/swc-linux-x64-musl': 15.4.7 - '@next/swc-win32-arm64-msvc': 15.4.7 - '@next/swc-win32-x64-msvc': 15.4.7 - sharp: 0.34.4 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.4) + optionalDependencies: + '@next/swc-darwin-arm64': 16.1.6 + '@next/swc-darwin-x64': 16.1.6 + '@next/swc-linux-arm64-gnu': 16.1.6 + '@next/swc-linux-arm64-musl': 16.1.6 + '@next/swc-linux-x64-gnu': 16.1.6 + '@next/swc-linux-x64-musl': 16.1.6 + '@next/swc-win32-arm64-msvc': 16.1.6 + '@next/swc-win32-x64-msvc': 16.1.6 + '@opentelemetry/api': 1.9.0 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - no-case@2.3.2: + node-addon-api@2.0.2: {} + + node-addon-api@5.1.0: {} + + node-addon-api@7.1.1: {} + + node-domexception@1.0.0: {} + + node-emoji@1.11.0: dependencies: - lower-case: 1.1.4 + lodash: 4.17.23 - node-plop@0.26.3: + node-fetch-native@1.6.7: {} + + node-fetch@2.6.7: dependencies: - '@babel/runtime-corejs3': 7.28.0 - '@types/inquirer': 6.5.0 - change-case: 3.1.0 - del: 5.1.0 - globby: 10.0.2 - handlebars: 4.7.8 - inquirer: 7.3.3 - isbinaryfile: 4.0.10 - lodash.get: 4.4.2 - mkdirp: 0.5.6 - resolve: 1.22.10 + whatwg-url: 5.0.0 - nodemon@3.1.10: + node-fetch@2.6.9: dependencies: - chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 7.7.2 - simple-update-notifier: 2.0.0 - supports-color: 5.5.0 - touch: 3.1.1 - undefsafe: 2.0.5 + whatwg-url: 5.0.0 - normalize-path@3.0.0: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 - npm-run-path@4.0.1: + node-fetch@3.3.2: dependencies: - path-key: 3.1.1 + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 - object-assign@4.1.1: {} + node-gyp-build@4.8.4: {} - object-inspect@1.13.4: {} + node-mock-http@1.0.4: + optional: true - object-keys@1.1.1: {} + node-releases@2.0.27: {} - object.assign@4.1.7: + nopt@2.1.2: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 + abbrev: 1.1.1 - object.entries@1.1.9: + nopt@8.1.0: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + abbrev: 3.0.1 + + normalize-path@3.0.0: + optional: true - object.fromentries@2.0.8: + npm-run-path@4.0.1: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 + path-key: 3.1.1 - object.values@1.2.1: + nypm@0.6.4: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + citty: 0.2.0 + pathe: 2.0.3 + tinyexec: 1.0.2 + + obj-multiplex@1.0.0: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + readable-stream: 2.3.8 + optional: true + + object-inspect@1.13.4: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.3 + optional: true + + ohash@2.0.11: {} + + on-exit-leak-free@0.2.0: + optional: true + + once@1.3.3: + dependencies: + wrappy: 1.0.2 once@1.4.0: dependencies: @@ -6066,339 +15188,707 @@ snapshots: dependencies: mimic-fn: 2.1.0 - optionator@0.9.4: + onetime@7.0.0: dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 + mimic-function: 5.0.1 - ora@4.1.1: + openapi-fetch@0.13.8: dependencies: - chalk: 3.0.0 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - log-symbols: 3.0.0 - mute-stream: 0.0.8 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 + openapi-typescript-helpers: 0.0.15 + optional: true - ora@5.4.1: + openapi-typescript-helpers@0.0.15: + optional: true + + optimist@0.2.8: dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 + wordwrap: 0.0.3 + + optimist@0.3.7: + dependencies: + wordwrap: 0.0.3 + + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 - os-tmpdir@1.0.2: {} + os-paths@4.4.0: {} outdent@0.5.0: {} - own-keys@1.0.1: + ox@0.11.3(typescript@5.8.3)(zod@3.22.4): dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.8.3)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + optional: true - ox@0.7.2(typescript@5.8.3): + ox@0.11.3(typescript@5.8.3)(zod@3.25.76): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.4 + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.8.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + + ox@0.6.7(typescript@5.8.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.8.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + optional: true + + ox@0.6.9(typescript@5.8.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.8.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + optional: true + + ox@0.7.2(typescript@5.8.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.8.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - zod + + ox@0.9.17(typescript@5.8.3)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) + abitype: 1.2.3(typescript@5.8.3)(zod@3.25.76) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - zod - ox@0.8.1(typescript@5.8.3): + ox@0.9.17(typescript@5.8.3)(zod@4.3.6): dependencies: - '@adraffy/ens-normalize': 1.11.0 + '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) + abitype: 1.2.3(typescript@5.8.3)(zod@4.3.6) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - zod + optional: true + + oxc-transform@0.111.0: + optionalDependencies: + '@oxc-transform/binding-android-arm-eabi': 0.111.0 + '@oxc-transform/binding-android-arm64': 0.111.0 + '@oxc-transform/binding-darwin-arm64': 0.111.0 + '@oxc-transform/binding-darwin-x64': 0.111.0 + '@oxc-transform/binding-freebsd-x64': 0.111.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.111.0 + '@oxc-transform/binding-linux-arm-musleabihf': 0.111.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.111.0 + '@oxc-transform/binding-linux-arm64-musl': 0.111.0 + '@oxc-transform/binding-linux-ppc64-gnu': 0.111.0 + '@oxc-transform/binding-linux-riscv64-gnu': 0.111.0 + '@oxc-transform/binding-linux-riscv64-musl': 0.111.0 + '@oxc-transform/binding-linux-s390x-gnu': 0.111.0 + '@oxc-transform/binding-linux-x64-gnu': 0.111.0 + '@oxc-transform/binding-linux-x64-musl': 0.111.0 + '@oxc-transform/binding-openharmony-arm64': 0.111.0 + '@oxc-transform/binding-wasm32-wasi': 0.111.0 + '@oxc-transform/binding-win32-arm64-msvc': 0.111.0 + '@oxc-transform/binding-win32-ia32-msvc': 0.111.0 + '@oxc-transform/binding-win32-x64-msvc': 0.111.0 p-filter@2.1.0: dependencies: p-map: 2.1.0 + p-finally@2.0.1: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@0.2.11: dependencies: - p-limit: 3.1.0 + quansync: 0.2.11 - p-map@2.1.0: {} + pako@2.1.0: {} + + parse-ms@2.1.0: {} + + patch-console@2.0.0: {} + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: + optional: true - p-map@3.0.0: + path-scurry@1.11.1: dependencies: - aggregate-error: 3.1.0 + lru-cache: 10.4.3 + minipass: 7.1.2 - p-try@2.2.0: {} + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.5 + minipass: 7.1.2 - pac-proxy-agent@7.2.0: + path-to-regexp@6.1.0: {} + + path-to-regexp@6.3.0: {} + + path-to-regexp@8.2.0: {} + + path-to-regexp@8.3.0: {} + + path-type@4.0.0: {} + + path@0.12.7: dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 + process: 0.11.10 + util: 0.10.4 + + pathe@2.0.3: {} + + pbkdf2@3.1.5: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.3 + safe-buffer: 5.2.1 + sha.js: 2.4.12 + to-buffer: 1.2.2 + + pend@1.2.0: {} + + perfect-debounce@1.0.0: {} + + pg-int8@1.0.1: + optional: true + + pg-protocol@1.11.0: + optional: true + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.1 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + optional: true + + picocolors@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + picture-tuber@1.0.2: + dependencies: + buffers: 0.1.1 + charm: 0.1.2 + event-stream: 0.9.8 + optimist: 0.3.7 + png-js: 0.1.1 + x256: 0.0.2 + + pify@4.0.1: {} + + pino-abstract-transport@0.5.0: + dependencies: + duplexify: 4.1.3 + split2: 4.2.0 + optional: true + + pino-std-serializers@4.0.0: + optional: true + + pino@7.11.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 0.2.0 + pino-abstract-transport: 0.5.0 + pino-std-serializers: 4.0.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.1.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 2.8.0 + thread-stream: 0.15.2 + optional: true + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + + png-js@0.1.1: {} + + pngjs@5.0.0: {} + + pony-cause@2.1.11: {} + + popmotion@11.0.3: + dependencies: + framesync: 6.0.1 + hey-listen: 1.0.8 + style-value-types: 5.0.0 + tslib: 2.8.1 + + porto@0.2.35(@tanstack/react-query@5.90.20(react@19.2.4))(@types/react@19.2.10)(@wagmi/core@3.2.3(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(ox@0.11.3(typescript@5.8.3)(zod@3.25.76))(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@3.3.4): + dependencies: + '@wagmi/core': 3.2.3(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(ox@0.11.3(typescript@5.8.3)(zod@3.25.76))(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + hono: 4.11.7 + idb-keyval: 6.2.2 + mipd: 0.0.7(typescript@5.8.3) + ox: 0.9.17(typescript@5.8.3)(zod@4.3.6) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 4.3.6 + zustand: 5.0.11(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)) + optionalDependencies: + '@tanstack/react-query': 5.90.20(react@19.2.4) + react: 19.2.4 + typescript: 5.8.3 + wagmi: 3.3.4(bb1cf47ae47a74d724e315965d20c874) transitivePeerDependencies: - - supports-color + - '@types/react' + - immer + - use-sync-external-store + optional: true + + poseidon-lite@0.2.1: {} - pac-resolver@7.0.1: + possible-typed-array-names@1.1.0: {} + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 - package-json-from-dist@1.0.1: {} + postgres-array@2.0.0: + optional: true - package-manager-detector@0.2.11: + postgres-bytea@1.0.1: + optional: true + + postgres-date@1.0.7: + optional: true + + postgres-interval@1.2.0: dependencies: - quansync: 0.2.10 + xtend: 4.0.2 + optional: true + + postgres@3.4.7: {} - param-case@2.1.1: + preact@10.24.2: + optional: true + + prettier-plugin-solidity@2.2.1(prettier@3.8.1): dependencies: - no-case: 2.3.2 + '@nomicfoundation/slang': 1.3.1 + '@solidity-parser/parser': 0.20.2 + prettier: 3.8.1 + semver: 7.7.3 + + prettier@2.8.8: {} - parent-module@1.0.1: + prettier@3.8.1: {} + + pretty-ms@7.0.1: dependencies: - callsites: 3.1.0 + parse-ms: 2.1.0 - pascal-case@2.0.1: + prisma@7.3.0(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.8.3): dependencies: - camel-case: 3.0.0 - upper-case-first: 1.1.2 + '@prisma/config': 7.3.0 + '@prisma/dev': 0.20.0(typescript@5.8.3) + '@prisma/engines': 7.3.0 + '@prisma/studio-core': 0.13.1(@types/react@19.2.10)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + mysql2: 3.15.3 + postgres: 3.4.7 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/react' + - magicast + - react + - react-dom - path-case@2.1.1: + process-nextick-args@2.0.1: {} + + process-warning@1.0.0: + optional: true + + process@0.11.10: {} + + promisepipe@3.0.0: {} + + proper-lockfile@4.1.2: dependencies: - no-case: 2.3.2 + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 25.2.0 + long: 5.2.4 + + proxy-compare@2.6.0: + optional: true - path-exists@4.0.0: {} + proxy-from-env@1.1.0: {} - path-is-absolute@1.0.1: {} + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 - path-key@3.1.1: {} + punycode@2.3.1: {} - path-parse@1.0.7: {} + pure-rand@6.1.0: {} - path-scurry@1.11.1: + qrcode.react@4.2.0(react@19.2.4): dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 + react: 19.2.4 - path-scurry@2.0.0: + qrcode@1.5.3: dependencies: - lru-cache: 11.1.0 - minipass: 7.1.2 + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + optional: true - path-type@4.0.0: {} + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 - pathe@2.0.3: {} + qs@6.14.1: + dependencies: + side-channel: 1.1.0 - pathval@2.0.1: {} + quansync@0.2.11: {} - picocolors@1.1.1: {} + query-string@7.1.3: + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + optional: true - picomatch@2.3.1: {} + queue-microtask@1.2.3: {} - picomatch@4.0.3: {} + quick-format-unescaped@4.0.4: + optional: true - pify@4.0.1: {} + radix3@1.1.2: + optional: true - pkijs@3.2.5: + randombytes@2.1.0: dependencies: - '@noble/hashes': 1.8.0 - asn1js: 3.0.6 - bytestreamjs: 2.0.1 - pvtsutils: 1.3.6 - pvutils: 1.1.3 - tslib: 2.8.1 - - possible-typed-array-names@1.1.0: {} + safe-buffer: 5.2.1 - postcss@8.4.31: + raw-body@2.4.1: dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 - postcss@8.5.6: + rc9@2.1.2: dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 + defu: 6.1.4 + destr: 2.0.5 - prelude-ls@1.2.1: {} - - prettier@2.8.8: {} - - prettier@3.6.2: {} - - prop-types@15.8.1: + react-apple-signin-auth@1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - proxy-agent@6.5.0: + react-dom@19.2.4(react@19.2.4): dependencies: - agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color + react: 19.2.4 + scheduler: 0.27.0 - proxy-from-env@1.1.0: {} + react-hook-form@7.71.1(react@19.2.4): + dependencies: + react: 19.2.4 - pstree.remy@1.1.8: {} + react-is@16.13.1: {} - punycode@2.3.1: {} + react-reconciler@0.33.0(react@19.2.4): + dependencies: + react: 19.2.4 + scheduler: 0.27.0 - pvtsutils@1.3.6: + react-remove-scroll-bar@2.3.8(@types/react@19.2.10)(react@19.2.4): dependencies: + react: 19.2.4 + react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.4) tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.10 - pvutils@1.1.3: {} - - quansync@0.2.10: {} - - queue-microtask@1.2.3: {} + react-remove-scroll@2.7.2(@types/react@19.2.10)(react@19.2.4): + dependencies: + react: 19.2.4 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.10)(react@19.2.4) + react-style-singleton: 2.2.3(@types/react@19.2.10)(react@19.2.4) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.10)(react@19.2.4) + use-sidecar: 1.1.3(@types/react@19.2.10)(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 - rc@1.2.8: + react-style-singleton@2.2.3(@types/react@19.2.10)(react@19.2.4): dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 + get-nonce: 1.0.1 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.10 - react-dom@19.1.0(react@19.1.0): + react-transition-state@1.1.5(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - react: 19.1.0 - scheduler: 0.26.0 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) - react-is@16.13.1: {} + react-use-measure@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + dependencies: + react: 19.2.4 + optionalDependencies: + react-dom: 19.2.4(react@19.2.4) - react@19.1.0: {} + react@19.2.4: {} read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.14.2 pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@1.0.34: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 + readdirp@4.1.2: {} - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 + readdirp@5.0.0: + optional: true - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 + readline@1.3.0: {} - registry-auth-token@3.3.2: - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 + real-require@0.1.0: + optional: true - registry-url@3.1.0: + redeyed@2.1.1: dependencies: - rc: 1.2.8 + esprima: 4.0.1 + + reduce-flatten@2.0.0: {} + + regexp-to-ast@0.5.0: {} + + remeda@2.33.4: {} require-directory@2.1.1: {} - resolve-from@4.0.0: {} + require-from-string@2.0.2: {} + + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + module-details-from-path: 1.0.4 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + optional: true + + require-main-filename@2.0.0: {} + + resize-observer-polyfill@1.5.1: {} resolve-from@5.0.0: {} - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.3: {} - resolve@2.0.0-next.5: + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + optional: true - restore-cursor@3.1.0: + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + retry@0.12.0: {} + + retry@0.13.1: {} + reusify@1.1.0: {} - rimraf@3.0.2: + rimraf@5.0.10: dependencies: - glob: 7.2.3 + glob: 10.5.0 - rimraf@6.0.1: + rimraf@6.1.2: dependencies: - glob: 11.0.3 + glob: 13.0.1 package-json-from-dist: 1.0.1 + ripemd160@2.0.3: + dependencies: + hash-base: 3.1.2 + inherits: 2.0.4 + + rlp@2.2.7: + dependencies: + bn.js: 5.2.2 + + rolldown@1.0.0-rc.1: + dependencies: + '@oxc-project/types': 0.110.0 + '@rolldown/pluginutils': 1.0.0-rc.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-rc.1 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.1 + '@rolldown/binding-darwin-x64': 1.0.0-rc.1 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.1 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.1 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.1 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.1 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.1 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.1 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.1 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.1 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.1 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.1 + rollup@4.45.1: dependencies: '@types/estree': 1.0.8 @@ -6424,54 +15914,63 @@ snapshots: '@rollup/rollup-win32-ia32-msvc': 4.45.1 '@rollup/rollup-win32-x64-msvc': 4.45.1 fsevents: 2.3.3 + optional: true - run-async@2.4.1: {} + rpc-websockets@9.3.3: + dependencies: + '@swc/helpers': 0.5.18 + '@types/uuid': 8.3.4 + '@types/ws': 8.18.1 + buffer: 6.0.3 + eventemitter3: 5.0.4 + uuid: 8.3.2 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - rxjs@6.6.7: - dependencies: - tslib: 1.14.1 - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 + safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: + optional: true + safer-buffer@2.1.2: {} - scheduler@0.26.0: {} + sax@1.4.4: {} - semver@6.3.1: {} + scheduler@0.27.0: {} - semver@7.7.2: {} + scrypt-js@3.0.1: {} - sentence-case@2.1.1: + secp256k1@4.0.4: dependencies: - no-case: 2.3.2 - upper-case-first: 1.1.2 + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.7.3: {} + + seq-queue@0.0.5: {} + + set-blocking@2.0.0: {} set-function-length@1.2.2: dependencies: @@ -6482,47 +15981,48 @@ snapshots: gopd: 1.2.0 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 + setimmediate@1.0.5: {} + + setprototypeof@1.1.1: {} - set-proto@1.0.0: + sha.js@2.4.12: dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 + + shallowequal@1.1.0: {} - sharp@0.34.4: + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 - detect-libc: 2.1.0 - semver: 7.7.2 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.4 - '@img/sharp-darwin-x64': 0.34.4 - '@img/sharp-libvips-darwin-arm64': 1.2.3 - '@img/sharp-libvips-darwin-x64': 1.2.3 - '@img/sharp-libvips-linux-arm': 1.2.3 - '@img/sharp-libvips-linux-arm64': 1.2.3 - '@img/sharp-libvips-linux-ppc64': 1.2.3 - '@img/sharp-libvips-linux-s390x': 1.2.3 - '@img/sharp-libvips-linux-x64': 1.2.3 - '@img/sharp-libvips-linuxmusl-arm64': 1.2.3 - '@img/sharp-libvips-linuxmusl-x64': 1.2.3 - '@img/sharp-linux-arm': 0.34.4 - '@img/sharp-linux-arm64': 0.34.4 - '@img/sharp-linux-ppc64': 0.34.4 - '@img/sharp-linux-s390x': 0.34.4 - '@img/sharp-linux-x64': 0.34.4 - '@img/sharp-linuxmusl-arm64': 0.34.4 - '@img/sharp-linuxmusl-x64': 0.34.4 - '@img/sharp-wasm32': 0.34.4 - '@img/sharp-win32-arm64': 0.34.4 - '@img/sharp-win32-ia32': 0.34.4 - '@img/sharp-win32-x64': 0.34.4 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 optional: true shebang-command@2.0.0: @@ -6531,7 +16031,8 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} + shimmer@1.2.1: + optional: true side-channel-list@1.0.0: dependencies: @@ -6561,60 +16062,105 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} + signal-exit@4.0.2: {} - simple-update-notifier@2.0.0: - dependencies: - semver: 7.7.2 + signal-exit@4.1.0: {} slash@3.0.0: {} - smart-buffer@4.2.0: {} + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 - snake-case@2.1.0: + socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: - no-case: 2.3.2 + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@5.5.0) + engine.io-client: 6.6.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + optional: true - socks-proxy-agent@8.0.5: + socket.io-parser@4.2.5: dependencies: - agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) - socks: 2.8.6 + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color + optional: true - socks@2.8.6: + sonic-boom@2.8.0: dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 + atomic-sleep: 1.0.0 + optional: true source-map-js@1.2.1: {} - source-map@0.6.1: {} - - spawn-command@0.0.2: {} + sparkline@0.1.2: + dependencies: + here: 0.0.2 + nopt: 2.1.2 spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 + split-on-first@1.1.0: + optional: true + + split2@4.2.0: + optional: true + sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} + sqlstring@2.3.3: {} + + srvx@0.8.9: + dependencies: + cookie-es: 2.0.0 + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stat-mode@0.3.0: {} - stackback@0.0.2: {} + statuses@1.5.0: {} - std-env@3.9.0: {} + std-env@3.10.0: {} - stop-iteration-iterator@1.1.0: + stdin-discarder@0.2.2: {} + + stream-chain@2.2.5: {} + + stream-json@1.9.1: dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 + stream-chain: 2.2.5 + + stream-shift@1.0.3: + optional: true + + stream-to-array@2.3.0: + dependencies: + any-promise: 1.3.0 + + stream-to-promise@2.2.0: + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 + + strict-uri-encode@2.0.0: + optional: true + + string-format@2.0.0: {} string-width@4.2.3: dependencies: @@ -6626,80 +16172,86 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 + strip-ansi: 7.1.2 - string.prototype.repeat@1.0.0: + string-width@7.2.0: dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 - string.prototype.trim@1.2.10: + string-width@8.1.1: dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + string_decoder@0.10.31: {} - string.prototype.trimstart@1.0.8: + string_decoder@1.1.1: dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 + safe-buffer: 5.1.2 string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} strip-final-newline@2.0.0: {} - strip-json-comments@2.0.1: {} + strip-hex-prefix@1.0.0: + dependencies: + is-hex-prefixed: 1.0.0 - strip-json-comments@3.1.1: {} + strnum@2.1.2: {} - strip-literal@3.0.0: + style-value-types@5.0.0: dependencies: - js-tokens: 9.0.1 + hey-listen: 1.0.8 + tslib: 2.8.1 + + styled-components@5.3.11(@babel/core@7.28.5)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4): + dependencies: + '@babel/helper-module-imports': 7.28.6(supports-color@5.5.0) + '@babel/traverse': 7.29.0(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.4.0 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.28.5)(styled-components@5.3.11(@babel/core@7.28.5)(react-dom@19.2.4(react@19.2.4))(react-is@16.13.1)(react@19.2.4))(supports-color@5.5.0) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + react-is: 16.13.1 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' - styled-jsx@5.1.6(react@19.1.0): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.4): dependencies: client-only: 0.0.1 - react: 19.1.0 + react: 19.2.4 + optionalDependencies: + '@babel/core': 7.28.5 + + superstruct@1.0.4: {} + + superstruct@2.0.2: {} + + supports-color@2.0.0: {} supports-color@5.5.0: dependencies: @@ -6709,124 +16261,170 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: + supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 + supports-color: 7.2.0 - supports-preserve-symlinks-flag@1.0.0: {} + supports-preserve-symlinks-flag@1.0.0: + optional: true - swap-case@1.1.2: + table-layout@1.0.2: dependencies: - lower-case: 1.1.4 - upper-case: 1.1.3 + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 - term-size@2.2.1: {} + tailwind-merge@3.4.0: {} - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 + tailwindcss@4.1.18: {} - through@2.3.8: {} + tapable@2.3.0: {} - tinybench@2.9.0: {} + tar@7.5.7: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 - tinycolor2@1.6.0: {} + term-canvas@0.0.5: {} - tinyexec@0.3.2: {} + term-size@2.2.1: {} - tinyglobby@0.2.14: - dependencies: - fdir: 6.4.6(picomatch@4.0.3) - picomatch: 4.0.3 + text-encoding-utf-8@1.0.2: {} - tinygradient@1.1.5: + thread-stream@0.15.2: dependencies: - '@types/tinycolor2': 1.4.6 - tinycolor2: 1.6.0 + real-require: 0.1.0 + optional: true - tinypool@1.1.1: {} + throttleit@2.1.0: {} - tinyrainbow@2.0.0: {} + time-span@4.0.0: + dependencies: + convert-hrtime: 3.0.0 - tinyspy@4.0.3: {} + tinyexec@0.3.2: {} - title-case@2.1.1: - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 + tinyexec@1.0.2: {} - tmp@0.0.33: + to-buffer@1.2.2: dependencies: - os-tmpdir: 1.0.2 + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - touch@3.1.1: {} + toidentifier@1.0.0: {} + + tr46@0.0.3: {} tree-kill@1.2.2: {} - ts-api-utils@2.1.0(typescript@5.8.3): + ts-command-line-args@2.5.1: + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + string-format: 2.0.0 + + ts-essentials@7.0.3(typescript@5.8.3): dependencies: typescript: 5.8.3 - ts-node@10.9.2(@types/node@20.19.9)(typescript@5.5.4): + ts-morph@12.0.0: + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + + ts-node@10.9.1(@types/node@20.11.0)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 + '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.9 + '@types/node': 20.11.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 - diff: 4.0.2 + diff: 8.0.3 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tslib@1.14.1: {} + ts-toolbelt@6.15.5: {} + + tslib@1.14.1: + optional: true + + tslib@2.7.0: {} tslib@2.8.1: {} - turbo-darwin-64@2.5.5: + tsx@4.21.0: + dependencies: + esbuild: 0.27.0 + get-tsconfig: 4.13.1 + optionalDependencies: + fsevents: 2.3.3 + + turbo-darwin-64@2.8.3: optional: true - turbo-darwin-arm64@2.5.5: + turbo-darwin-arm64@2.8.3: optional: true - turbo-linux-64@2.5.5: + turbo-linux-64@2.8.3: optional: true - turbo-linux-arm64@2.5.5: + turbo-linux-arm64@2.8.3: optional: true - turbo-windows-64@2.5.5: + turbo-windows-64@2.8.3: optional: true - turbo-windows-arm64@2.5.5: + turbo-windows-arm64@2.8.3: optional: true - turbo@2.5.5: + turbo@2.8.3: optionalDependencies: - turbo-darwin-64: 2.5.5 - turbo-darwin-arm64: 2.5.5 - turbo-linux-64: 2.5.5 - turbo-linux-arm64: 2.5.5 - turbo-windows-64: 2.5.5 - turbo-windows-arm64: 2.5.5 + turbo-darwin-64: 2.8.3 + turbo-darwin-arm64: 2.8.3 + turbo-linux-64: 2.8.3 + turbo-linux-arm64: 2.8.3 + turbo-windows-64: 2.8.3 + turbo-windows-arm64: 2.8.3 - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 + tweetnacl-util@0.15.1: {} + + tweetnacl@1.0.3: {} - type-fest@0.21.3: {} + type-fest@4.41.0: {} + + typechain@8.3.2(typescript@5.8.3): + dependencies: + '@types/prettier': 2.7.3 + debug: 4.4.3(supports-color@5.5.0) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.23 + mkdirp: 1.0.4 + prettier: 2.8.8 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color typed-array-buffer@1.0.3: dependencies: @@ -6834,221 +16432,497 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.15 - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 + typeforce@1.18.0: {} - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 + typescript@4.9.5: {} - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 + typescript@5.8.3: {} - typescript-eslint@8.38.0(eslint@9.31.0)(typescript@5.8.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.31.0)(typescript@5.8.3))(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.38.0(eslint@9.31.0)(typescript@5.8.3) - eslint: 9.31.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color + typescript@5.9.3: {} - typescript@5.5.4: {} + typical@4.0.0: {} - typescript@5.8.3: {} + typical@5.2.0: {} - uglify-js@3.19.3: + ufo@1.6.3: optional: true - unbox-primitive@1.1.0: + uid-promise@1.0.0: {} + + uint8arrays@3.1.0: dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 + multiformats: 9.9.0 + optional: true - undefsafe@2.0.5: {} + uncrypto@0.1.3: {} - undici-types@6.21.0: {} + undici-types@5.26.5: {} + + undici-types@6.19.8: {} + + undici-types@7.16.0: {} + + undici-types@7.20.0: {} + + undici@7.20.0: {} universalify@0.1.2: {} universalify@2.0.1: {} - update-check@1.5.4: - dependencies: - registry-auth-token: 3.3.2 - registry-url: 3.1.0 + unpipe@1.0.0: {} - upper-case-first@1.1.2: + unstorage@1.17.4(@vercel/blob@1.0.2)(idb-keyval@6.2.2): dependencies: - upper-case: 1.1.3 + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.5 + lru-cache: 11.2.5 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.3 + optionalDependencies: + '@vercel/blob': 1.0.2 + idb-keyval: 6.2.2 + optional: true - upper-case@1.1.3: {} + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: punycode: 2.3.1 + url-template@2.0.8: {} + + use-callback-ref@1.3.3(@types/react@19.2.10)(react@19.2.4): + dependencies: + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.10 + + use-sidecar@1.1.3(@types/react@19.2.10)(react@19.2.4): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.4 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.10 + + use-sync-external-store@1.2.0(react@19.2.4): + dependencies: + react: 19.2.4 + optional: true + + use-sync-external-store@1.4.0(react@19.2.4): + dependencies: + react: 19.2.4 + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + optional: true + + utf-8-validate@6.0.6: + dependencies: + node-gyp-build: 4.8.4 + optional: true + util-deprecate@1.0.2: {} - uuid@11.1.0: {} + util@0.10.4: + dependencies: + inherits: 2.0.3 + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.20 + + uuid@10.0.0: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} v8-compile-cache-lib@3.0.1: {} - validate-npm-package-name@5.0.1: {} + valibot@1.2.0(typescript@5.8.3): + optionalDependencies: + typescript: 5.8.3 + + valtio@1.13.2(@types/react@19.2.10)(react@19.2.4): + dependencies: + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@19.2.10)(react@19.2.4)) + proxy-compare: 2.6.0 + use-sync-external-store: 1.2.0(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + optional: true + + vercel@50.11.0(rollup@4.45.1)(typescript@5.8.3): + dependencies: + '@vercel/backends': 0.0.27(rollup@4.45.1)(typescript@5.8.3) + '@vercel/blob': 1.0.2 + '@vercel/build-utils': 13.3.0 + '@vercel/detect-agent': 1.1.0 + '@vercel/elysia': 0.1.29(rollup@4.45.1) + '@vercel/express': 0.1.38(rollup@4.45.1)(typescript@5.8.3) + '@vercel/fastify': 0.1.32(rollup@4.45.1) + '@vercel/fun': 1.2.1 + '@vercel/go': 3.3.4 + '@vercel/h3': 0.1.38(rollup@4.45.1) + '@vercel/hono': 0.2.32(rollup@4.45.1) + '@vercel/hydrogen': 1.3.5 + '@vercel/koa': 0.1.12(rollup@4.45.1) + '@vercel/nestjs': 0.2.33(rollup@4.45.1) + '@vercel/next': 4.15.22(rollup@4.45.1) + '@vercel/node': 5.5.30(rollup@4.45.1) + '@vercel/python': 6.6.0 + '@vercel/redwood': 2.4.9(rollup@4.45.1) + '@vercel/remix-builder': 5.5.10(rollup@4.45.1) + '@vercel/ruby': 2.2.5 + '@vercel/rust': 1.0.5 + '@vercel/static-build': 2.8.31 + chokidar: 4.0.0 + esbuild: 0.27.0 + form-data: 4.0.5 + jose: 5.9.6 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - rollup + - supports-color + - typescript + + viem@2.23.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.8.3)(zod@3.25.76) + isows: 1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.6.7(typescript@5.8.3)(zod@3.25.76) + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + optional: true - viem@2.33.0(typescript@5.8.3): + viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: - '@noble/curves': 1.9.2 + '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.0.8(typescript@5.8.3) - isows: 1.0.7(ws@8.18.2) - ox: 0.8.1(typescript@5.8.3) - ws: 8.18.2 + abitype: 1.2.3(typescript@5.8.3)(zod@3.22.4) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.11.3(typescript@5.8.3)(zod@3.22.4) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod + optional: true - vite-node@3.2.4(@types/node@22.16.5): + viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: - cac: 6.7.14 - debug: 4.4.1(supports-color@5.5.0) - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.0.5(@types/node@22.16.5) + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.8.3)(zod@3.25.76) + isows: 1.0.7(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.11.3(typescript@5.8.3)(zod@3.25.76) + ws: 8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.8.3 transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml + - bufferutil + - utf-8-validate + - zod - vite@7.0.5(@types/node@22.16.5): + wagmi@3.3.4(bb1cf47ae47a74d724e315965d20c874): dependencies: - esbuild: 0.25.8 - fdir: 6.4.6(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.45.1 - tinyglobby: 0.2.14 + '@tanstack/react-query': 5.90.20(react@19.2.4) + '@wagmi/connectors': 7.1.3(93e4d54496c4dd568a20c5ac1fa1dd1c) + '@wagmi/core': 3.2.3(@tanstack/query-core@5.90.20)(@types/react@19.2.10)(ox@0.11.3(typescript@5.8.3)(zod@3.25.76))(react@19.2.4)(typescript@5.8.3)(use-sync-external-store@1.4.0(react@19.2.4))(viem@2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + viem: 2.45.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: - '@types/node': 22.16.5 - fsevents: 2.3.3 + typescript: 5.8.3 + transitivePeerDependencies: + - '@base-org/account' + - '@coinbase/wallet-sdk' + - '@gemini-wallet/core' + - '@metamask/sdk' + - '@safe-global/safe-apps-provider' + - '@safe-global/safe-apps-sdk' + - '@tanstack/query-core' + - '@types/react' + - '@walletconnect/ethereum-provider' + - immer + - ox + - porto + + web-streams-polyfill@3.3.3: {} + + web-vitals@0.2.4: {} + + web3-core@4.7.1(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + web3-errors: 1.3.1 + web3-eth-accounts: 4.3.1 + web3-eth-iban: 4.0.7 + web3-providers-http: 4.2.0 + web3-providers-ws: 4.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + optionalDependencies: + web3-providers-ipc: 4.0.7 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate - vitest@3.2.4(@types/node@22.16.5)(happy-dom@17.6.3): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.5(@types/node@22.16.5)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - debug: 4.4.1(supports-color@5.5.0) - expect-type: 1.2.2 - magic-string: 0.30.17 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.9.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.0.5(@types/node@22.16.5) - vite-node: 3.2.4(@types/node@22.16.5) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.16.5 - happy-dom: 17.6.3 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml + web3-errors@1.3.1: + dependencies: + web3-types: 1.10.0 - wcwidth@1.0.1: + web3-eth-abi@4.4.1(typescript@5.8.3)(zod@3.25.76): dependencies: - defaults: 1.0.4 + abitype: 0.7.1(typescript@5.8.3)(zod@3.25.76) + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - typescript + - zod - webidl-conversions@7.0.0: {} + web3-eth-accounts@4.3.1: + dependencies: + '@ethereumjs/rlp': 4.0.1 + crc-32: 1.2.2 + ethereum-cryptography: 2.2.1 + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + + web3-eth-contract@4.7.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@ethereumjs/rlp': 5.0.2 + web3-core: 4.7.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-errors: 1.3.1 + web3-eth: 4.11.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.76) + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod - whatwg-mimetype@3.0.0: {} + web3-eth-ens@4.4.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@adraffy/ens-normalize': 1.11.1 + web3-core: 4.7.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-errors: 1.3.1 + web3-eth: 4.11.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + web3-eth-contract: 4.7.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + web3-net: 4.1.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod - which-boxed-primitive@1.1.1: + web3-eth-iban@4.0.7: dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 - which-builtin-type@1.2.1: + web3-eth-personal@4.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 + web3-core: 4.7.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-eth: 4.11.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + web3-rpc-methods: 1.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + web3-eth@4.11.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + setimmediate: 1.0.5 + web3-core: 4.7.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-errors: 1.3.1 + web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.76) + web3-eth-accounts: 4.3.1 + web3-net: 4.1.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-providers-ws: 4.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-rpc-methods: 1.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + web3-net@4.1.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + web3-core: 4.7.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-rpc-methods: 1.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-types: 1.10.0 + web3-utils: 4.3.3 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + web3-providers-http@4.2.0: + dependencies: + cross-fetch: 4.1.0 + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + transitivePeerDependencies: + - encoding + + web3-providers-ipc@4.0.7: + dependencies: + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + optional: true + + web3-providers-ws@4.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@types/ws': 8.5.3 + isomorphic-ws: 5.0.0(ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-utils: 4.3.3 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + web3-rpc-methods@1.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + web3-core: 4.7.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-types: 1.10.0 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + web3-rpc-providers@1.0.0-rc.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + web3-errors: 1.3.1 + web3-providers-http: 4.2.0 + web3-providers-ws: 4.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + web3-types@1.10.0: {} + + web3-utils@4.3.3: + dependencies: + ethereum-cryptography: 2.2.1 + eventemitter3: 5.0.4 + web3-errors: 1.3.1 + web3-types: 1.10.0 + web3-validator: 2.0.6 + + web3-validator@2.0.6: + dependencies: + ethereum-cryptography: 2.2.1 + util: 0.12.5 + web3-errors: 1.3.1 + web3-types: 1.10.0 + zod: 3.25.76 + + web3@4.16.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + web3-core: 4.7.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-errors: 1.3.1 + web3-eth: 4.11.1(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + web3-eth-abi: 4.4.1(typescript@5.8.3)(zod@3.25.76) + web3-eth-accounts: 4.3.1 + web3-eth-contract: 4.7.2(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + web3-eth-ens: 4.4.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + web3-eth-iban: 4.0.7 + web3-eth-personal: 4.1.0(bufferutil@4.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + web3-net: 4.1.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-providers-http: 4.2.0 + web3-providers-ws: 4.0.8(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-rpc-methods: 1.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-rpc-providers: 1.0.0-rc.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + web3-types: 1.10.0 + web3-utils: 4.3.3 + web3-validator: 2.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + + webextension-polyfill@0.10.0: {} + + webidl-conversions@3.0.1: {} - which-collection@1.0.2: + whatwg-url@5.0.0: dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 + tr46: 0.0.3 + webidl-conversions: 3.0.1 - which-typed-array@1.1.19: + which-module@2.0.1: {} + + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -7062,14 +16936,20 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.3.0: + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + wif@2.0.6: dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 + bs58check: 2.1.2 - word-wrap@1.2.5: {} + wordwrap@0.0.3: {} - wordwrap@1.0.0: {} + wordwrapjs@4.0.1: + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 wrap-ansi@6.2.0: dependencies: @@ -7085,18 +16965,98 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} - ws@8.18.2: {} + ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.17.1(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + optional: true + + ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 + + x256@0.0.2: {} + + xdg-app-paths@5.1.0: + dependencies: + xdg-portable: 7.3.0 + + xdg-portable@7.3.0: + dependencies: + os-paths: 4.4.0 + + xml2js@0.6.2: + dependencies: + sax: 1.4.4 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + xmlhttprequest-ssl@2.1.2: + optional: true + + xtend@4.0.2: + optional: true + + y18n@4.0.3: {} y18n@5.0.8: {} + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -7107,6 +17067,52 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yauzl-clone@1.0.4: + dependencies: + events-intercept: 2.0.0 + + yauzl-promise@2.1.3: + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + yn@3.1.1: {} - yocto-queue@0.1.0: {} + yoga-layout@3.2.1: {} + + zeptomatch@2.1.0: + dependencies: + grammex: 3.1.12 + graphmatch: 1.1.0 + + zod@3.22.4: {} + + zod@3.25.76: {} + + zod@4.3.6: + optional: true + + zustand@5.0.0(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + + zustand@5.0.11(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + optional: true + + zustand@5.0.3(@types/react@19.2.10)(react@19.2.4)(use-sync-external-store@1.4.0(react@19.2.4)): + optionalDependencies: + '@types/react': 19.2.10 + react: 19.2.4 + use-sync-external-store: 1.4.0(react@19.2.4) + optional: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 59a78ba9a..f761c6831 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,5 +7,61 @@ packages: - repo/* - test/* +onlyBuiltDependencies: + - '@parcel/watcher' + - '@prisma/engines' + - '@tailwindcss/oxide' + - bufferutil + - core-js-pure + - esbuild + - keccak + - lefthook + - prisma + - protobufjs + - secp256k1 + - sharp + - utf-8-validate + - web3 + - web3-bzz + +overrides: + 0xsequence.js.git: link:.local/share/pnpm/global/5/node_modules/https:/github.com/Dargon789/0xsequence.js.git + Rabby.git: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/Rabby.git + braces@<3.0.3: '>=3.0.3' + cookie@<0.7.0: '>=0.7.0' + diff@<4.0.4: '>=4.0.4' + diff@>=5.0.0 <5.2.2: '>=5.2.2' + esbuild@<=0.24.2: '>=0.25.0' + fast-xml-parser@>=4.3.6 <=5.3.3: '>=5.3.4' + form-data@<2.5.4: '>=2.5.4' + happy-dom@<20.0.0: '>=20.0.0' + hardhat-project.git: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/hardhat-project.git + hono@<4.11.7: '>=4.11.7' + http-proxy-middleware@<2.0.7: '>=2.0.7' + lodash@>=4.0.0 <=4.17.22: '>=4.17.23' + micromatch@<4.0.8: '>=4.0.8' + next@>=15.6.0-canary.0 <16.1.5: '>=16.1.5' + next@>=16.0.0-beta.0 <16.1.5: '>=16.1.5' + next@>=16.1.0-canary.0 <16.1.5: '>=16.1.5' + node-forge@<1.0.0: '>=1.0.0' + node-forge@<1.3.0: '>=1.3.0' + node-forge@<1.3.2: '>=1.3.2' + qs@<6.14.1: '>=6.14.1' + semver@<5.7.2: '>=5.7.2' + tar@<6.2.1: '>=6.2.1' + tar@<=7.5.2: '>=7.5.3' + thirdweb-dev.git: link:.local/share/pnpm/global/5/node_modules/git@github.com:Dargon789/thirdweb-dev.git + tmp@<=0.2.3: '>=0.2.4' + tough-cookie@<4.1.3: '>=4.1.3' + undici@<5.29.0: '>=5.29.0' + undici@<6.23.0: '>=6.23.0' + undici@>=4.5.0 <5.28.5: '>=5.28.5' + wallet-contracts.git: link:.local/share/pnpm/global/5/node_modules/https:/github.com/Dargon789/wallet-contracts.git + webpack-dev-middleware@<=5.3.3: '>=5.3.4' + webpack-dev-server@<=5.2.0: '>=5.2.1' + ws@>=2.1.0 <5.2.4: '>=5.2.4' + ws@>=8.0.0 <8.17.1: '>=8.17.1' + xml2js@<0.5.0: '>=0.5.0' + publicHoistPattern: -- "eslint" + - eslint diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 000000000..75f1f18e5 --- /dev/null +++ b/remappings.txt @@ -0,0 +1,6 @@ +@openzeppelin-contracts-5.0.2/=dependencies/@openzeppelin-contracts-5.0.2/ +forge-std-1.10.0/=dependencies/forge-std-1.10.0/ +forge-std-1.11.0/=dependencies/forge-std-1.11.0/ +forge-std-1.12.0/=dependencies/forge-std-1.12.0/ +forge-std-1.14.0/=dependencies/forge-std-1.14.0/ +forge-std-1.9.2/=dependencies/forge-std-1.9.2/ diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..9e44f9549 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "es2021", + "module": "esnext", + "moduleResolution": "node", + "declaration": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "allowJs": true, + "strictNullChecks": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "isolatedModules": true, + "typeRoots": [ + "node_modules/@types" + ], + "types": [ + "node" + ] + }, + "include": ["./packages/**/src/**/*.ts"] +} diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 000000000..0c7b3c1e4 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "declaration": true, + "sourceMap": true, + "allowSyntheticDefaultImports": true, + "strictNullChecks": false, + "esModuleInterop": true, + "lib": ["dom.iterable", "dom", "es2020"], + "types": ["node", "mocha", "puppeteer"] + }, + "include": [ + "./src/**/*", + "./tests/**/*" + ] +}

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≠`HIKXV7DJgU-o=11c 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 The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\"))","params":{"_data":"Arbitrary length data signed on the behalf of address(this)","_signatures":"Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)"},"returns":{"_0":"magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise"}},"isValidSignature(bytes32,bytes)":{"details":"MUST return the correct magic value if the signature provided is valid for the provided hash > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))","params":{"_hash":"keccak256 hash that was signed","_signatures":"Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)"},"returns":{"_0":"magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise"}},"nonce()":{"details":"The default nonce space is 0x00","returns":{"_0":"The next nonce"}},"readNonce(uint256)":{"params":{"_space":"Nonce space, each space keeps an independent nonce count"},"returns":{"_0":"The next nonce"}},"selfExecute((bool,bool,uint256,address,uint256,bytes)[])":{"params":{"_txs":"Transactions to process"}},"signatureRecovery(bytes32,bytes)":{"details":"The signature must be prefixed with a type byte, which is used to determine the recovery method.","params":{"_digest":"Digest of the signed data.","_signature":"A Sequence signature."},"returns":{"checkpoint":"A nonce that is incremented every time a new configuration is set.","imageHash":"The imageHash of the configuration that signed the message.","subdigest":"A modified version of the original digest, unique for each wallet/network.","threshold":"The required number of signatures needed to consider the signature valid.","weight":"The actual number of signatures collected in the signature."}},"supportsInterface(bytes4)":{"params":{"_interfaceID":"The interface identifier, as specified in ERC-165"},"returns":{"_0":"`true` if the contract implements `_interfaceID`"}},"updateImageHash(bytes32)":{"params":{"_imageHash":"New required image hash of the signature"}}},"version":1},"userdoc":{"kind":"user","methods":{"createContract(bytes)":{"notice":"Creates a contract forwarding eth value"},"execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)":{"notice":"Allow any caller to execute an action"},"isValidSignature(bytes,bytes)":{"notice":"Verifies whether the provided signature is valid with respect to the provided data"},"isValidSignature(bytes32,bytes)":{"notice":"Verifies whether the provided signature is valid with respect to the provided hash"},"nonce()":{"notice":"Returns the next nonce of the default nonce space"},"readNonce(uint256)":{"notice":"Returns the next nonce of the given nonce space"},"selfExecute((bool,bool,uint256,address,uint256,bytes)[])":{"notice":"Allow any caller to execute an action"},"signatureRecovery(bytes32,bytes)":{"notice":"Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature."},"supportsInterface(bytes4)":{"notice":"Query if a contract implements an interface"},"updateImageHash(bytes32)":{"notice":"Updates the signers configuration of the wallet"}},"notice":"GuestModule implements a Sequence wallet without signatures, nonce or replay protection. executing transactions using this wallet is not an authenticated process, and can be done by any address.This contract is completely public with no security, designed to execute pre-signed transactions and use Sequence tools without using the wallets.","version":1}},"settings":{"compilationTarget":{"contracts/modules/GuestModule.sol":"GuestModule"},"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":500000},"remappings":[]},"sources":{"contracts/interfaces/IERC1271Wallet.sol":{"keccak256":"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c","license":"Apache-2.0","urls":["bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1","dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK"]},"contracts/modules/GuestModule.sol":{"keccak256":"0x14c92b44eac100edbfea10d0d02728752a6be277c267c3776dc563ff963271b1","license":"Apache-2.0","urls":["bzz-raw://e440eb91039118ce26bb66fd549d5e6b59863983efbe6c2617b92e2c4f0aab66","dweb:/ipfs/QmeTd2xBKEv4S4Rp9S4TSY4WwUUDjtA7xiJYiJqkVUio7d"]},"contracts/modules/commons/ModuleAuth.sol":{"keccak256":"0x58c028f02e3517de6c39584bcf1cedd4e7b23f575c24b363cbad4960a74f8a0b","license":"Apache-2.0","urls":["bzz-raw://f9652fead22c9fe8510de8427e2db354ed145ff30f49f85d1c717e293e5df665","dweb:/ipfs/QmSJPFQxRE5n17DNB5Bu2jwRo17yLS7igMQGt3bvKkdLAP"]},"contracts/modules/commons/ModuleCalls.sol":{"keccak256":"0x80c0151dbd444f96c2f935e70a6d3cc57e307588fa21d7eace67e568dd3d35c1","license":"Apache-2.0","urls":["bzz-raw://39a856555a5eb900e67d351e667135f245ccebd304d692b35fc8bdc83aec1b53","dweb:/ipfs/QmUdWfa7GcTGM5gk7qYbNCHtsxF4o8dXHzr6HbdFng5sQm"]},"contracts/modules/commons/ModuleCreator.sol":{"keccak256":"0x16b1400988f6b7bd4d32bdcb36ee2fbd644fb2c8ca571becc0c32e03602bd303","license":"Apache-2.0","urls":["bzz-raw://8bd4681fb4cff10f4e98e45618fbc52ed0a4c7d4fcf614f34a587ad20cd16855","dweb:/ipfs/QmbA2LYBH1x8WX8CaeiFYMU5rjyLGgNCF32r9fQbXuoqwJ"]},"contracts/modules/commons/ModuleERC165.sol":{"keccak256":"0xd4ae13a3d20fd7ab52ad16af6a06e7244daea450b796251e911091cac104d05f","license":"Apache-2.0","urls":["bzz-raw://8de37ec20a6b649e9fe3fb42276e4660ff546bca8b467f72beb35396ab5e62d6","dweb:/ipfs/QmXT2SxBZKitkbKLbGbbNLhUbw2ataRpQ2DHafvhG953RE"]},"contracts/modules/commons/ModuleNonce.sol":{"keccak256":"0x3b5388842f763a5347d632a0e0e8499a54b6f0b0a6eb7f7d3d848319defa042d","license":"Apache-2.0","urls":["bzz-raw://b36fa5a88a4e174967f850bf2bb78c787d8016ef7b5eee3e2f883fbfe9b87a7d","dweb:/ipfs/QmTDZiPiQGe1fmTKKzdwzBE1xjkh8apTotW1SQRUCFXf4q"]},"contracts/modules/commons/ModuleOnlyDelegatecall.sol":{"keccak256":"0x32bdb1d343eee2e32fd9d0f1d6dc0e265411d0821bd908881822f0f26f0887f8","license":"Apache-2.0","urls":["bzz-raw://1537c4f60a609751013bdc69eb1c6e6218982d91013115bc4e28cb84f816cd91","dweb:/ipfs/QmSjkSTrrB4vuxECcm5cRG7YmraF53QWRgftxS827KcQLW"]},"contracts/modules/commons/ModuleSelfAuth.sol":{"keccak256":"0x91545de5c77cfac86c5686c4e1f338a18ee7adb689ac0234848d7a7fc8a560db","license":"Apache-2.0","urls":["bzz-raw://dc89d05d8099ba4c3c2cf85737796d439899b5a04e6b87b1ea43f687ae08848a","dweb:/ipfs/QmatU8gRvFkK3Yn1MYAekzi48Waw3cDLtXJpduvju9HFUu"]},"contracts/modules/commons/ModuleStorage.sol":{"keccak256":"0x876c6a40cba975df4f7dfe24e02d153b2ee758975b6d1eda494ecd4b7244aa8e","license":"Apache-2.0","urls":["bzz-raw://b9be3f7930476d528ce10a121701421f0fb251b7d6b7cd579917375e6b283bb4","dweb:/ipfs/QmSbvbYQvTk8KYJZ7QqSKB9Y4M1X3UDhS6k765Zr1BAwK8"]},"contracts/modules/commons/interfaces/IModuleAuth.sol":{"keccak256":"0x24c6b05c32cb344b3b0aebd01fbd8bfc69f8c8e29fca340b262d9612c34d51e2","license":"Apache-2.0","urls":["bzz-raw://5f6c004946f0cbc4b3e52d45248337146bc82569da894ecff3cbdc5a0dca95c3","dweb:/ipfs/QmNSgDMQ7SHL6AJuzTSRbY2kgciHF1SKWfH6MaPH1N3TpR"]},"contracts/modules/commons/interfaces/IModuleCalls.sol":{"keccak256":"0xde065c15e38eb009c3dc8f99dfefdd1d6d244dd12a889a8b57edd90d32fb4395","license":"Apache-2.0","urls":["bzz-raw://23608955786060457f79267795a61eb89b3910b683fc136c749548369425088f","dweb:/ipfs/QmXNorcQBF1Qk21y3aEJRiiHVtwm61zP4ttA1ZzmRjyHnz"]},"contracts/modules/commons/interfaces/IModuleCreator.sol":{"keccak256":"0xa206dd3d424b8cd1c4f1400aa344cbc974480fea02f0fb371b872558e5ff4e6d","license":"Apache-2.0","urls":["bzz-raw://ea14c75f43a0008c582dcbae3ba3c900e446e28039dfdbb059d326ec5cc6a2d2","dweb:/ipfs/QmRfF6BmUWiFkCgzVFbLcHsUCNz5q2XkkcwXPX57ViTK4D"]},"contracts/modules/commons/submodules/auth/SequenceBaseSig.sol":{"keccak256":"0xe0565e24e94204d4b254ace42d124d3279256090921a4818cbbf9747cbb14e04","license":"Apache-2.0","urls":["bzz-raw://4293a4762b0816738511f697efd04a0e881d4c409bd15ac1c4e7261fe5e482a2","dweb:/ipfs/QmcHbEBne4fvpcD7RTJHCL6q9czoLa7KHneaCeYfXuWiGu"]},"contracts/modules/commons/submodules/auth/SequenceChainedSig.sol":{"keccak256":"0x755fbf6c106fe1c3c375c41c95c38269873717d8e683678b5fdbf6c8d3426306","license":"Apache-2.0","urls":["bzz-raw://7c7c92e72dd94f16b5c004d38c2d92eb2b760fd29a939945ed275633b0f93fa5","dweb:/ipfs/QmVdCG7Aw7aVV67z5mUKZa4VqhXHdLqy3SKxPfxaxq54p2"]},"contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol":{"keccak256":"0x6de353f8c7f44c4294914a4917458ce90ae2f7ecd2d84074fe12d4a4f1485ee5","license":"Apache-2.0","urls":["bzz-raw://369f979b79a3d3fd0336ab14b3accadb63e4784324afc34f8db11d1988526afd","dweb:/ipfs/QmavmBZ354wTaXQ6ixBd8GrC9HwtRqn4MoNhCVJcx11off"]},"contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol":{"keccak256":"0xa3ac8b8d31f20a8732bb4ebad53b42b334ec29041de0224bd494913ef0b2ad07","license":"Apache-2.0","urls":["bzz-raw://5a81d4eb3f47b09a8835b2fd53e0baa2e23cb604db3b10dae82543a5bcc52fa4","dweb:/ipfs/QmQ9XSSgbaagWArmZJJ366bdJ7HfxUxn9jdnWwN6SxUSeY"]},"contracts/modules/commons/submodules/nonce/SubModuleNonce.sol":{"keccak256":"0x98520e740b0822ec053d21f376b8be8a58e93228f3758f9228a7d00e1f60950f","license":"Apache-2.0","urls":["bzz-raw://31226706c004f1a4315d6b8d37621b46f4d5807c16e1ce72675c1431ed9006a2","dweb:/ipfs/QmdSSyCuPex2E2VTd6UMYy9WAq9eJNZ6vHSUomntNknzXE"]},"contracts/utils/LibBytes.sol":{"keccak256":"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805","license":"Apache-2.0","urls":["bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98","dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i"]},"contracts/utils/LibBytesPointer.sol":{"keccak256":"0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15","license":"Apache-2.0","urls":["bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25","dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y"]},"contracts/utils/LibOptim.sol":{"keccak256":"0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af","license":"Apache-2.0","urls":["bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335","dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM"]},"contracts/utils/SignatureValidator.sol":{"keccak256":"0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba","license":"Apache-2.0","urls":["bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353","dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv"]}},"version":1} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/interfaces/IERC1271Wallet.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/interfaces/IERC1271Wallet.sol new file mode 100644 index 000000000..5572aaea4 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/interfaces/IERC1271Wallet.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +interface IERC1271Wallet { + + /** + * @notice Verifies whether the provided signature is valid with respect to the provided data + * @dev MUST return the correct magic value if the signature provided is valid for the provided data + * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") + * > This function MAY modify Ethereum's state + * @param _data Arbitrary length data signed on the behalf of address(this) + * @param _signature Signature byte array associated with _data + * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise + */ + function isValidSignature( + bytes calldata _data, + bytes calldata _signature) + external + view + returns (bytes4 magicValue); + + /** + * @notice Verifies whether the provided signature is valid with respect to the provided hash + * @dev MUST return the correct magic value if the signature provided is valid for the provided hash + * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") + * > This function MAY modify Ethereum's state + * @param _hash keccak256 hash that was signed + * @param _signature Signature byte array associated with _data + * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise + */ + function isValidSignature( + bytes32 _hash, + bytes calldata _signature) + external + view + returns (bytes4 magicValue); +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/GuestModule.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/GuestModule.sol new file mode 100644 index 000000000..54cb770a8 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/GuestModule.sol @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../utils/LibOptim.sol"; + +import "./commons/submodules/auth/SequenceBaseSig.sol"; + +import "./commons/ModuleAuth.sol"; +import "./commons/ModuleCalls.sol"; +import "./commons/ModuleCreator.sol"; + + +/** + * GuestModule implements a Sequence wallet without signatures, nonce or replay protection. + * executing transactions using this wallet is not an authenticated process, and can be done by any address. + * + * @notice This contract is completely public with no security, designed to execute pre-signed transactions + * and use Sequence tools without using the wallets. + */ +contract GuestModule is + ModuleAuth, + ModuleCalls, + ModuleCreator +{ + error DelegateCallNotAllowed(uint256 _index); + error NotSupported(); + + /** + * @notice Allow any caller to execute an action + * @param _txs Transactions to process + */ + function execute( + Transaction[] calldata _txs, + uint256, + bytes calldata + ) public override { + // Hash transaction bundle + bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode('guest:', _txs))); + + // Execute the transactions + _executeGuest(txHash, _txs); + } + + /** + * @notice Allow any caller to execute an action + * @param _txs Transactions to process + */ + function selfExecute( + Transaction[] calldata _txs + ) public override { + // Hash transaction bundle + bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode('self:', _txs))); + + // Execute the transactions + _executeGuest(txHash, _txs); + } + + /** + * @notice Executes a list of transactions + * @param _txHash Hash of the batch of transactions + * @param _txs Transactions to execute + */ + function _executeGuest( + bytes32 _txHash, + Transaction[] calldata _txs + ) private { + // Execute transaction + uint256 size = _txs.length; + for (uint256 i = 0; i < size; i++) { + Transaction calldata transaction = _txs[i]; + + if (transaction.delegateCall) revert DelegateCallNotAllowed(i); + + uint256 gasLimit = transaction.gasLimit; + if (gasleft() < gasLimit) revert NotEnoughGas(i, gasLimit, gasleft()); + + bool success = LibOptim.call( + transaction.target, + transaction.value, + gasLimit == 0 ? gasleft() : gasLimit, + transaction.data + ); + + if (success) { + emit TxExecuted(_txHash, i); + } else { + _revertBytes( + transaction.revertOnError, + _txHash, + i, + LibOptim.returnData() + ); + } + } + } + + /** + * @notice Validates any signature image, because the wallet is public and has no owner. + * @return true, all signatures are valid. + */ + function _isValidImage(bytes32) internal override pure returns (bool) { + return true; + } + + /** + * Not supported. + */ + function _updateImageHash(bytes32) internal override virtual { + revert NotSupported(); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface( + bytes4 _interfaceID + ) public override ( + ModuleAuth, + ModuleCalls, + ModuleCreator + ) pure returns (bool) { + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/GuestModule.json b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/GuestModule.json new file mode 100644 index 000000000..a1977cfea --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/GuestModule.json @@ -0,0 +1,14655 @@ +{ + "deploy": { + "VM:-": { + "linkReferences": {}, + "autoDeployLib": true + }, + "main:1": { + "linkReferences": {}, + "autoDeployLib": true + }, + "ropsten:3": { + "linkReferences": {}, + "autoDeployLib": true + }, + "rinkeby:4": { + "linkReferences": {}, + "autoDeployLib": true + }, + "kovan:42": { + "linkReferences": {}, + "autoDeployLib": true + }, + "goerli:5": { + "linkReferences": {}, + "autoDeployLib": true + }, + "Custom": { + "linkReferences": {}, + "autoDeployLib": true + } + }, + "data": { + "bytecode": { + "functionDebugData": { + "@_1068": { + "entryPoint": null, + "id": 1068, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "60a060405234801561001057600080fd5b50306080526080516121de61002d600039600050506121de6000f3fe6080604052600436106100bc5760003560e01c806361c2926c116100745780638c3f55631161004e5780638c3f55631461025357806390042baf14610273578063affed0e0146102ab57600080fd5b806361c2926c146101cb5780637a9a1628146101eb578063853c50681461020b57600080fd5b806320c13b0b116100a557806320c13b0b14610147578063295614261461016757806357c56d6b1461018957600080fd5b806301ffc9a7146100c15780631626ba7e146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc366004611880565b6102c0565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b506101166101113660046118e6565b6102d1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ed565b34801561015357600080fd5b50610116610162366004611932565b61031e565b34801561017357600080fd5b5061018761018236600461199e565b610383565b005b34801561019557600080fd5b506101bd7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b6040519081526020016100ed565b3480156101d757600080fd5b506101876101e63660046119fc565b6103d5565b3480156101f757600080fd5b50610187610206366004611a3e565b61041a565b34801561021757600080fd5b5061022b6102263660046118e6565b610447565b604080519586526020860194909452928401919091526060830152608082015260a0016100ed565b34801561025f57600080fd5b506101bd61026e36600461199e565b61060f565b610286610281366004611ae7565b61063b565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b3480156102b757600080fd5b506101bd610725565b60006102cb82610736565b92915050565b6000806102df858585610792565b509050801561031157507f1626ba7e000000000000000000000000000000000000000000000000000000009050610317565b50600090505b9392505050565b6000806103438686604051610334929190611bb6565b60405180910390208585610792565b509050801561037557507f20c13b0b00000000000000000000000000000000000000000000000000000000905061037b565b50600090505b949350505050565b3330146103c9576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b6103d2816107ca565b50565b600061040883836040516020016103ed929190611d97565b604051602081830303815290604052805190602001206107fc565b9050610415818484610881565b505050565b600061043286866040516020016103ed929190611ddf565b905061043f818787610881565b505050505050565b6000806000806000808787600081811061046357610463611e27565b909101357fff000000000000000000000000000000000000000000000000000000000000001691508190506104b95761049b896107fc565b92506104a8838989610a0e565b929850909650945091506106049050565b7fff00000000000000000000000000000000000000000000000000000000000000818116016104f8576104eb896107fc565b92506104a8838989610a5f565b7ffe000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082160161054a576104eb89610a8b565b7ffd000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216016105ae5761059e898989610af8565b9550955095509550955050610604565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff00000000000000000000000000000000000000000000000000000000000000821660048201526024016103c0565b939792965093509350565b60006102cb7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610c75565b600033301461067e576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016103c0565b81516020830134f0905073ffffffffffffffffffffffffffffffffffffffff81166106d757816040517f0d2571910000000000000000000000000000000000000000000000000000000081526004016103c09190611eba565b60405173ffffffffffffffffffffffffffffffffffffffff821681527fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b6000610731600061060f565b905090565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161078957506001919050565b6102cb82610cd3565b60008060008060006107a5888888610447565b509650919450925090508282108015906107bd575060015b9450505050935093915050565b6040517fa038794000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b81811015610a0757368484838181106108a0576108a0611e27565b90506020028101906108b29190611ecd565b90506108c16020820182611f0b565b156108fb576040517f230d1ccc000000000000000000000000000000000000000000000000000000008152600481018390526024016103c0565b6040810135805a101561094e5782815a6040517f2bb3e3ba0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016103c0565b60006109886109636080850160608601611f26565b608085013584156109745784610976565b5a5b61098360a0880188611f41565b610d2f565b905080156109cf57877f5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7856040516109c291815260200190565b60405180910390a26109f1565b6109f16109e26040850160208601611f0b565b89866109ec610d4c565b610d6b565b50505080806109ff90611fd5565b915050610885565b5050505050565b6000808080610a2987610a24876006818b61200d565b610db9565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080610a7a87610a75876001818b61200d565b610a0e565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601610864565b6000808080806004600188013560e81c82610b138383612037565b9050610b258b61022683868d8f61200d565b939b5091995097509550935087871015610b7d57610b4581848b8d61200d565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c0949392919061204a565b8092505b88831015610c675760038301928a013560e81c9150610ba08383612037565b90506000610bc2610bb08861124f565b8c8c879086926102269392919061200d565b939c50919a5098509091505088881015610c1a57610be282858c8e61200d565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c0949392919061204a565b848110610c5d576040517f37daf62b00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016103c0565b9350915081610b81565b505050939792965093509350565b6000808383604051602001610c94929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610d2657506001919050565b6102cb82611283565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b8315610d7957805160208201fd5b827fab46c69f7f32e1bf09b0725853da82a211e5402a0600296ab499a2fb5ea3b4198383604051610dab929190612071565b60405180910390a250505050565b60008060005b8381101561124657600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101610e6057601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff000000000000000000000000000000000000000016811785610e465780610e55565b60008681526020829052604090205b955050505050610dbf565b80610ef65760018201918681013560f81c906043016000610e8c8a610e8784888c8e61200d565b61136d565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161786610edb5780610eea565b60008781526020829052604090205b96505050505050610dbf565b6002810361101e576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff169150809650819250505060008186019050610f6f8b848c8c8a908692610f6a9392919061200d565b611630565b610fb7578a83610f8183898d8f61200d565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016103c0949392919061208a565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617876110025780611011565b60008881526020829052604090205b9750505050505050610dbf565b60038103611051576020820191860135836110395780611048565b60008481526020829052604090205b93505050610dbf565b6004810361109d576003808301928781013560e81c919082010160008061107e8b610a2485898d8f61200d565b60009889526020526040909720969097019650909350610dbf92505050565b600681036111a55760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff16915080965081925050506000818601905060008061110b8d8d8d8b908792610a249392919061200d565b9398508893909250905084821061112157988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a90528351808403909101815260989092019092528051910120896111875780611196565b60008a81526020829052604090205b99505050505050505050610dbf565b600581036112115760208201918601358781036111e0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b60006111eb82611817565b9050846111f85780611207565b60008581526020829052604090205b9450505050610dbf565b6040517fb2505f7c000000000000000000000000000000000000000000000000000000008152600481018290526024016103c0565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d160009081526020829052604081206102cb565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e00000000000000000000000000000000000000000000000000000000148061131657507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b1561132357506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102cb565b6000604282146113ad5782826040517f2ee17a3d0000000000000000000000000000000000000000000000000000000081526004016103c09291906120ca565b60006113c66113bd6001856120de565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561143a578686826040517fad4aac760000000000000000000000000000000000000000000000000000000081526004016103c0939291906120f1565b8260ff16601b1415801561145257508260ff16601c14155b1561148f578686846040517fe578897e0000000000000000000000000000000000000000000000000000000081526004016103c093929190612115565b600184036114fc576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa1580156114eb573d6000803e3d6000fd5b5050506020604051035194506115d4565b60028403611599576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a0016114c9565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c0949392919061213c565b73ffffffffffffffffffffffffffffffffffffffff85166116255786866040517f6c1719d20000000000000000000000000000000000000000000000000000000081526004016103c09291906120ca565b505050509392505050565b600081810361166b576040517fac241e1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838361167a6001826120de565b81811061168957611689611e27565b919091013560f81c91505060018114806116a35750600281145b156116e8578473ffffffffffffffffffffffffffffffffffffffff166116ca87868661136d565b73ffffffffffffffffffffffffffffffffffffffff1614915061180e565b600381036117d35773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e878660008761171c6001826120de565b926117299392919061200d565b6040518463ffffffff1660e01b815260040161174793929190612168565b602060405180830381865afa158015611764573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611788919061218b565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014915061180e565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c0949392919061213c565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801610864565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146103d257600080fd5b60006020828403121561189257600080fd5b813561031781611852565b60008083601f8401126118af57600080fd5b50813567ffffffffffffffff8111156118c757600080fd5b6020830191508360208285010111156118df57600080fd5b9250929050565b6000806000604084860312156118fb57600080fd5b83359250602084013567ffffffffffffffff81111561191957600080fd5b6119258682870161189d565b9497909650939450505050565b6000806000806040858703121561194857600080fd5b843567ffffffffffffffff8082111561196057600080fd5b61196c8883890161189d565b9096509450602087013591508082111561198557600080fd5b506119928782880161189d565b95989497509550505050565b6000602082840312156119b057600080fd5b5035919050565b60008083601f8401126119c957600080fd5b50813567ffffffffffffffff8111156119e157600080fd5b6020830191508360208260051b85010111156118df57600080fd5b60008060208385031215611a0f57600080fd5b823567ffffffffffffffff811115611a2657600080fd5b611a32858286016119b7565b90969095509350505050565b600080600080600060608688031215611a5657600080fd5b853567ffffffffffffffff80821115611a6e57600080fd5b611a7a89838a016119b7565b9097509550602088013594506040880135915080821115611a9a57600080fd5b50611aa78882890161189d565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611af957600080fd5b813567ffffffffffffffff80821115611b1157600080fd5b818401915084601f830112611b2557600080fd5b813581811115611b3757611b37611ab8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b7d57611b7d611ab8565b81604052828152876020848701011115611b9657600080fd5b826020860160208301376000928101602001929092525095945050505050565b8183823760009101908152919050565b80358015158114611bd657600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bd657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b87811015611d8a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41883603018112611ca157600080fd5b870160c0611cae82611bc6565b15158652611cbd878301611bc6565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff611cef828501611bdb565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611d3557600080fd5b90920187810192903567ffffffffffffffff811115611d5357600080fd5b803603841315611d6257600080fd5b8282890152611d748389018286611bff565b9c89019c97505050928601925050600101611c62565b5091979650505050505050565b60408152600560408201527f73656c663a000000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611c48565b60408152600660408201527f67756573743a0000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611c48565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b81811015611e7c57602081850181015186830182015201611e60565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006103176020830184611e56565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112611f0157600080fd5b9190910192915050565b600060208284031215611f1d57600080fd5b61031782611bc6565b600060208284031215611f3857600080fd5b61031782611bdb565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f7657600080fd5b83018035915067ffffffffffffffff821115611f9157600080fd5b6020019150368190038213156118df57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361200657612006611fa6565b5060010190565b6000808585111561201d57600080fd5b8386111561202a57600080fd5b5050820193919092039150565b808201808211156102cb576102cb611fa6565b60608152600061205e606083018688611bff565b6020830194909452506040015292915050565b82815260406020820152600061037b6040830184611e56565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006120c0606083018486611bff565b9695505050505050565b60208152600061037b602083018486611bff565b818103818111156102cb576102cb611fa6565b604081526000612105604083018587611bff565b9050826020830152949350505050565b604081526000612129604083018587611bff565b905060ff83166020830152949350505050565b606081526000612150606083018688611bff565b60208301949094525090151560409091015292915050565b838152604060208201526000612182604083018486611bff565b95945050505050565b60006020828403121561219d57600080fd5b81516103178161185256fea26469706673582212209bb95d18e97f278aa47e0c04c20d5a6af9bdb6d473c6d4051192cd96fc17866864736f6c63430008120033", + "opcodes": "PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP ADDRESS PUSH1 0x80 MSTORE PUSH1 0x80 MLOAD PUSH2 0x21DE PUSH2 0x2D PUSH1 0x0 CODECOPY PUSH1 0x0 POP POP PUSH2 0x21DE PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xBC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x61C2926C GT PUSH2 0x74 JUMPI DUP1 PUSH4 0x8C3F5563 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x8C3F5563 EQ PUSH2 0x253 JUMPI DUP1 PUSH4 0x90042BAF EQ PUSH2 0x273 JUMPI DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x61C2926C EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x7A9A1628 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0x853C5068 EQ PUSH2 0x20B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x20C13B0B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x20C13B0B EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0x29561426 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x57C56D6B EQ PUSH2 0x189 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xC1 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0xF6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE1 PUSH2 0xDC CALLDATASIZE PUSH1 0x4 PUSH2 0x1880 JUMP JUMPDEST PUSH2 0x2C0 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x116 PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x18E6 JUMP JUMPDEST PUSH2 0x2D1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x116 PUSH2 0x162 CALLDATASIZE PUSH1 0x4 PUSH2 0x1932 JUMP JUMPDEST PUSH2 0x31E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x182 CALLDATASIZE PUSH1 0x4 PUSH2 0x199E JUMP JUMPDEST PUSH2 0x383 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH32 0x8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x19FC JUMP JUMPDEST PUSH2 0x3D5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x206 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A3E JUMP JUMPDEST PUSH2 0x41A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH2 0x226 CALLDATASIZE PUSH1 0x4 PUSH2 0x18E6 JUMP JUMPDEST PUSH2 0x447 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH2 0x26E CALLDATASIZE PUSH1 0x4 PUSH2 0x199E JUMP JUMPDEST PUSH2 0x60F JUMP JUMPDEST PUSH2 0x286 PUSH2 0x281 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AE7 JUMP JUMPDEST PUSH2 0x63B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH2 0x725 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB DUP3 PUSH2 0x736 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2DF DUP6 DUP6 DUP6 PUSH2 0x792 JUMP JUMPDEST POP SWAP1 POP DUP1 ISZERO PUSH2 0x311 JUMPI POP PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0x317 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x343 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH2 0x334 SWAP3 SWAP2 SWAP1 PUSH2 0x1BB6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP6 DUP6 PUSH2 0x792 JUMP JUMPDEST POP SWAP1 POP DUP1 ISZERO PUSH2 0x375 JUMPI POP PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0x37B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x3C9 JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3D2 DUP2 PUSH2 0x7CA JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x408 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3ED SWAP3 SWAP2 SWAP1 PUSH2 0x1D97 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x7FC JUMP JUMPDEST SWAP1 POP PUSH2 0x415 DUP2 DUP5 DUP5 PUSH2 0x881 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x432 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3ED SWAP3 SWAP2 SWAP1 PUSH2 0x1DDF JUMP JUMPDEST SWAP1 POP PUSH2 0x43F DUP2 DUP8 DUP8 PUSH2 0x881 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP8 DUP8 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0x463 JUMPI PUSH2 0x463 PUSH2 0x1E27 JUMP JUMPDEST SWAP1 SWAP2 ADD CALLDATALOAD PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 AND SWAP2 POP DUP2 SWAP1 POP PUSH2 0x4B9 JUMPI PUSH2 0x49B DUP10 PUSH2 0x7FC JUMP JUMPDEST SWAP3 POP PUSH2 0x4A8 DUP4 DUP10 DUP10 PUSH2 0xA0E JUMP JUMPDEST SWAP3 SWAP9 POP SWAP1 SWAP7 POP SWAP5 POP SWAP2 POP PUSH2 0x604 SWAP1 POP JUMP JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP2 DUP2 AND ADD PUSH2 0x4F8 JUMPI PUSH2 0x4EB DUP10 PUSH2 0x7FC JUMP JUMPDEST SWAP3 POP PUSH2 0x4A8 DUP4 DUP10 DUP10 PUSH2 0xA5F JUMP JUMPDEST PUSH32 0xFE00000000000000000000000000000000000000000000000000000000000000 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x54A JUMPI PUSH2 0x4EB DUP10 PUSH2 0xA8B JUMP JUMPDEST PUSH32 0xFD00000000000000000000000000000000000000000000000000000000000000 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x5AE JUMPI PUSH2 0x59E DUP10 DUP10 DUP10 PUSH2 0xAF8 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP POP PUSH2 0x604 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6085CD8200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST SWAP4 SWAP8 SWAP3 SWAP7 POP SWAP4 POP SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB PUSH32 0x8D0BF1FD623D628C741362C1289948E57B3E2905218C676D3E69ABEE36D6AE2E DUP4 PUSH2 0xC75 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x67E JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x3C0 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD CALLVALUE CREATE SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x6D7 JUMPI DUP2 PUSH1 0x40 MLOAD PUSH32 0xD25719100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP2 SWAP1 PUSH2 0x1EBA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0xA506AD4E7F05ECEBA62A023C3219E5BD98A615F4FA87E2AFB08A2DA5CF62BF0C SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x731 PUSH1 0x0 PUSH2 0x60F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x6FFBD45100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0x789 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CB DUP3 PUSH2 0xCD3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x7A5 DUP9 DUP9 DUP9 PUSH2 0x447 JUMP JUMPDEST POP SWAP7 POP SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP DUP3 DUP3 LT DUP1 ISZERO SWAP1 PUSH2 0x7BD JUMPI POP PUSH1 0x1 JUMPDEST SWAP5 POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA038794000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE CHAINID PUSH1 0x22 DUP3 ADD MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 ADDRESS PUSH1 0x60 SHL AND PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x56 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x76 ADD JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA07 JUMPI CALLDATASIZE DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x8A0 JUMPI PUSH2 0x8A0 PUSH2 0x1E27 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x8B2 SWAP2 SWAP1 PUSH2 0x1ECD JUMP JUMPDEST SWAP1 POP PUSH2 0x8C1 PUSH1 0x20 DUP3 ADD DUP3 PUSH2 0x1F0B JUMP JUMPDEST ISZERO PUSH2 0x8FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x230D1CCC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP1 GAS LT ISZERO PUSH2 0x94E JUMPI DUP3 DUP2 GAS PUSH1 0x40 MLOAD PUSH32 0x2BB3E3BA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x988 PUSH2 0x963 PUSH1 0x80 DUP6 ADD PUSH1 0x60 DUP7 ADD PUSH2 0x1F26 JUMP JUMPDEST PUSH1 0x80 DUP6 ADD CALLDATALOAD DUP5 ISZERO PUSH2 0x974 JUMPI DUP5 PUSH2 0x976 JUMP JUMPDEST GAS JUMPDEST PUSH2 0x983 PUSH1 0xA0 DUP9 ADD DUP9 PUSH2 0x1F41 JUMP JUMPDEST PUSH2 0xD2F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x9CF JUMPI DUP8 PUSH32 0x5C4EEB02DABF8976016AB414D617F9A162936DCACE3CDEF8C69EF6E262AD5AE7 DUP6 PUSH1 0x40 MLOAD PUSH2 0x9C2 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x9F1 JUMP JUMPDEST PUSH2 0x9F1 PUSH2 0x9E2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F0B JUMP JUMPDEST DUP10 DUP7 PUSH2 0x9EC PUSH2 0xD4C JUMP JUMPDEST PUSH2 0xD6B JUMP JUMPDEST POP POP POP DUP1 DUP1 PUSH2 0x9FF SWAP1 PUSH2 0x1FD5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x885 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xA29 DUP8 PUSH2 0xA24 DUP8 PUSH1 0x6 DUP2 DUP12 PUSH2 0x200D JUMP JUMPDEST PUSH2 0xDB9 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE DUP8 CALLDATALOAD PUSH1 0xF0 SHR PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP5 MSTORE PUSH1 0x2 SWAP1 SWAP11 ADD CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 SWAP1 MSTORE SWAP9 SWAP1 SWAP2 KECCAK256 SWAP1 SWAP10 SWAP2 SWAP9 POP SWAP7 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xA7A DUP8 PUSH2 0xA75 DUP8 PUSH1 0x1 DUP2 DUP12 PUSH2 0x200D JUMP JUMPDEST PUSH2 0xA0E JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x22 DUP3 ADD DUP2 SWAP1 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 ADDRESS PUSH1 0x60 SHL AND PUSH1 0x42 DUP4 ADD MSTORE PUSH1 0x56 DUP3 ADD DUP4 SWAP1 MSTORE SWAP1 PUSH1 0x76 ADD PUSH2 0x864 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH1 0x4 PUSH1 0x1 DUP9 ADD CALLDATALOAD PUSH1 0xE8 SHR DUP3 PUSH2 0xB13 DUP4 DUP4 PUSH2 0x2037 JUMP JUMPDEST SWAP1 POP PUSH2 0xB25 DUP12 PUSH2 0x226 DUP4 DUP7 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP12 POP SWAP2 SWAP10 POP SWAP8 POP SWAP6 POP SWAP4 POP DUP8 DUP8 LT ISZERO PUSH2 0xB7D JUMPI PUSH2 0xB45 DUP2 DUP5 DUP12 DUP14 PUSH2 0x200D JUMP JUMPDEST DUP10 DUP10 PUSH1 0x40 MLOAD PUSH32 0xB006ABA000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x204A JUMP JUMPDEST DUP1 SWAP3 POP JUMPDEST DUP9 DUP4 LT ISZERO PUSH2 0xC67 JUMPI PUSH1 0x3 DUP4 ADD SWAP3 DUP11 ADD CALLDATALOAD PUSH1 0xE8 SHR SWAP2 POP PUSH2 0xBA0 DUP4 DUP4 PUSH2 0x2037 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xBC2 PUSH2 0xBB0 DUP9 PUSH2 0x124F JUMP JUMPDEST DUP13 DUP13 DUP8 SWAP1 DUP7 SWAP3 PUSH2 0x226 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP1 SWAP2 POP POP DUP9 DUP9 LT ISZERO PUSH2 0xC1A JUMPI PUSH2 0xBE2 DUP3 DUP6 DUP13 DUP15 PUSH2 0x200D JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD PUSH32 0xB006ABA000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x204A JUMP JUMPDEST DUP5 DUP2 LT PUSH2 0xC5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x37DAF62B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x3C0 JUMP JUMPDEST SWAP4 POP SWAP2 POP DUP2 PUSH2 0xB81 JUMP JUMPDEST POP POP POP SWAP4 SWAP8 SWAP3 SWAP7 POP SWAP4 POP SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xC94 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xE4A77BBC00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0xD26 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CB DUP3 PUSH2 0x1283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP3 DUP5 DUP3 CALLDATACOPY PUSH1 0x0 DUP1 DUP5 DUP4 DUP10 DUP12 DUP11 CALL SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 RETURNDATASIZE PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x20 DUP3 ADD DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP4 MSTORE DUP2 PUSH1 0x0 DUP3 RETURNDATACOPY POP POP SWAP1 JUMP JUMPDEST DUP4 ISZERO PUSH2 0xD79 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP3 PUSH32 0xAB46C69F7F32E1BF09B0725853DA82A211E5402A0600296AB499A2FB5EA3B419 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0xDAB SWAP3 SWAP2 SWAP1 PUSH2 0x2071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1246 JUMPI PUSH1 0x1 DUP2 ADD SWAP1 DUP6 ADD CALLDATALOAD PUSH1 0xF8 SHR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD PUSH2 0xE60 JUMPI PUSH1 0x15 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD PUSH1 0xF8 DUP2 SWAP1 SHR SWAP1 PUSH1 0x58 SHR PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 PUSH21 0xFF0000000000000000000000000000000000000000 AND DUP2 OR DUP6 PUSH2 0xE46 JUMPI DUP1 PUSH2 0xE55 JUMP JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP6 POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST DUP1 PUSH2 0xEF6 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 DUP7 DUP2 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP1 PUSH1 0x43 ADD PUSH1 0x0 PUSH2 0xE8C DUP11 PUSH2 0xE87 DUP5 DUP9 DUP13 DUP15 PUSH2 0x200D JUMP JUMPDEST PUSH2 0x136D JUMP JUMPDEST PUSH1 0xFF DUP5 AND SWAP8 SWAP1 SWAP8 ADD SWAP7 SWAP2 SWAP5 POP DUP5 SWAP2 SWAP1 POP PUSH1 0xA0 DUP4 SWAP1 SHL PUSH21 0xFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND OR DUP7 PUSH2 0xEDB JUMPI DUP1 PUSH2 0xEEA JUMP JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP7 POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x2 DUP2 SUB PUSH2 0x101E JUMPI PUSH1 0x0 DUP1 DUP8 DUP5 ADD CALLDATALOAD PUSH1 0xF8 DUP2 SWAP1 SHR SWAP1 PUSH1 0x58 SHR PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x15 DUP7 ADD SWAP6 POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP9 DUP6 ADD CALLDATALOAD PUSH1 0xE8 SHR PUSH1 0x3 DUP7 ADD DUP2 PUSH3 0xFFFFFF AND SWAP2 POP DUP1 SWAP7 POP DUP2 SWAP3 POP POP POP PUSH1 0x0 DUP2 DUP7 ADD SWAP1 POP PUSH2 0xF6F DUP12 DUP5 DUP13 DUP13 DUP11 SWAP1 DUP7 SWAP3 PUSH2 0xF6A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST PUSH2 0x1630 JUMP JUMPDEST PUSH2 0xFB7 JUMPI DUP11 DUP4 PUSH2 0xF81 DUP4 DUP10 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9A94623200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x208A JUMP JUMPDEST PUSH1 0xFF DUP5 AND SWAP8 SWAP1 SWAP8 ADD SWAP7 SWAP5 POP DUP5 PUSH1 0xA0 DUP5 SWAP1 SHL PUSH21 0xFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND OR DUP8 PUSH2 0x1002 JUMPI DUP1 PUSH2 0x1011 JUMP JUMPDEST PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP8 POP POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x3 DUP2 SUB PUSH2 0x1051 JUMPI PUSH1 0x20 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD DUP4 PUSH2 0x1039 JUMPI DUP1 PUSH2 0x1048 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP4 POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x4 DUP2 SUB PUSH2 0x109D JUMPI PUSH1 0x3 DUP1 DUP4 ADD SWAP3 DUP8 DUP2 ADD CALLDATALOAD PUSH1 0xE8 SHR SWAP2 SWAP1 DUP3 ADD ADD PUSH1 0x0 DUP1 PUSH2 0x107E DUP12 PUSH2 0xA24 DUP6 DUP10 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x0 SWAP9 DUP10 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP8 KECCAK256 SWAP7 SWAP1 SWAP8 ADD SWAP7 POP SWAP1 SWAP4 POP PUSH2 0xDBF SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 DUP2 SUB PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP3 DUP8 ADD CALLDATALOAD PUSH1 0xF8 SHR PUSH1 0x1 DUP5 ADD SWAP4 POP PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP8 DUP5 ADD CALLDATALOAD PUSH1 0xF0 SHR PUSH1 0x2 DUP6 ADD SWAP5 POP PUSH2 0xFFFF AND SWAP1 POP PUSH1 0x0 DUP9 DUP6 ADD CALLDATALOAD PUSH1 0xE8 SHR PUSH1 0x3 DUP7 ADD DUP2 PUSH3 0xFFFFFF AND SWAP2 POP DUP1 SWAP7 POP DUP2 SWAP3 POP POP POP PUSH1 0x0 DUP2 DUP7 ADD SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x110B DUP14 DUP14 DUP14 DUP12 SWAP1 DUP8 SWAP3 PUSH2 0xA24 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP9 POP DUP9 SWAP4 SWAP1 SWAP3 POP SWAP1 POP DUP5 DUP3 LT PUSH2 0x1121 JUMPI SWAP9 DUP6 ADD SWAP9 JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x53657175656E6365206E657374656420636F6E6669673A0A0000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x38 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x58 DUP3 ADD DUP9 SWAP1 MSTORE PUSH1 0x78 DUP1 DUP4 ADD DUP11 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x98 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 DUP10 PUSH2 0x1187 JUMPI DUP1 PUSH2 0x1196 JUMP JUMPDEST PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP10 POP POP POP POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x5 DUP2 SUB PUSH2 0x1211 JUMPI PUSH1 0x20 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD DUP8 DUP2 SUB PUSH2 0x11E0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 POP JUMPDEST PUSH1 0x0 PUSH2 0x11EB DUP3 PUSH2 0x1817 JUMP JUMPDEST SWAP1 POP DUP5 PUSH2 0x11F8 JUMPI DUP1 PUSH2 0x1207 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP5 POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB2505F7C00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2CB JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0xAC6A444E00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x1316 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x36E7817500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x1323 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND EQ PUSH2 0x2CB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x42 DUP3 EQ PUSH2 0x13AD JUMPI DUP3 DUP3 PUSH1 0x40 MLOAD PUSH32 0x2EE17A3D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP3 SWAP2 SWAP1 PUSH2 0x20CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13C6 PUSH2 0x13BD PUSH1 0x1 DUP6 PUSH2 0x20DE JUMP JUMPDEST DUP6 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH1 0xF8 SHR DUP5 CALLDATALOAD PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP2 GT ISZERO PUSH2 0x143A JUMPI DUP7 DUP7 DUP3 PUSH1 0x40 MLOAD PUSH32 0xAD4AAC7600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x20F1 JUMP JUMPDEST DUP3 PUSH1 0xFF AND PUSH1 0x1B EQ ISZERO DUP1 ISZERO PUSH2 0x1452 JUMPI POP DUP3 PUSH1 0xFF AND PUSH1 0x1C EQ ISZERO JUMPDEST ISZERO PUSH2 0x148F JUMPI DUP7 DUP7 DUP5 PUSH1 0x40 MLOAD PUSH32 0xE578897E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2115 JUMP JUMPDEST PUSH1 0x1 DUP5 SUB PUSH2 0x14FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 DUP4 MSTORE DUP11 SWAP1 MSTORE PUSH1 0xFF DUP6 AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x14EB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP5 POP PUSH2 0x15D4 JUMP JUMPDEST PUSH1 0x2 DUP5 SUB PUSH2 0x1599 JUMPI PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP10 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x0 DUP5 MSTORE SWAP1 DUP4 ADD DUP1 DUP4 MSTORE MSTORE PUSH1 0xFF DUP7 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH2 0x14C9 JUMP JUMPDEST DUP7 DUP7 DUP6 PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x9DFBA85200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x213C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x1625 JUMPI DUP7 DUP7 PUSH1 0x40 MLOAD PUSH32 0x6C1719D200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP3 SWAP2 SWAP1 PUSH2 0x20CA JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 SUB PUSH2 0x166B JUMPI PUSH1 0x40 MLOAD PUSH32 0xAC241E1100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP4 PUSH2 0x167A PUSH1 0x1 DUP3 PUSH2 0x20DE JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x1689 JUMPI PUSH2 0x1689 PUSH2 0x1E27 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP2 POP POP PUSH1 0x1 DUP2 EQ DUP1 PUSH2 0x16A3 JUMPI POP PUSH1 0x2 DUP2 EQ JUMPDEST ISZERO PUSH2 0x16E8 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x16CA DUP8 DUP7 DUP7 PUSH2 0x136D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP2 POP PUSH2 0x180E JUMP JUMPDEST PUSH1 0x3 DUP2 SUB PUSH2 0x17D3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH4 0x1626BA7E DUP8 DUP7 PUSH1 0x0 DUP8 PUSH2 0x171C PUSH1 0x1 DUP3 PUSH2 0x20DE JUMP JUMPDEST SWAP3 PUSH2 0x1729 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1747 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2168 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1764 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1788 SWAP2 SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 EQ SWAP2 POP PUSH2 0x180E JUMP JUMPDEST DUP4 DUP4 DUP3 PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0x9DFBA85200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x213C JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x53657175656E636520737461746963206469676573743A0A0000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x38 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x58 ADD PUSH2 0x864 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1892 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x317 DUP2 PUSH2 0x1852 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x18AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x18C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x18FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1919 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1925 DUP7 DUP3 DUP8 ADD PUSH2 0x189D JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1948 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1960 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x196C DUP9 DUP4 DUP10 ADD PUSH2 0x189D JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1992 DUP8 DUP3 DUP9 ADD PUSH2 0x189D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x19C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A32 DUP6 DUP3 DUP7 ADD PUSH2 0x19B7 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1A56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1A6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A7A DUP10 DUP4 DUP11 ADD PUSH2 0x19B7 JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AA7 DUP9 DUP3 DUP10 ADD PUSH2 0x189D JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1AF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1B37 JUMPI PUSH2 0x1B37 PUSH2 0x1AB8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1B7D JUMPI PUSH2 0x1B7D PUSH2 0x1AB8 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1B96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x0 PUSH1 0x20 DUP1 DUP6 ADD DUP1 DUP2 SWAP7 POP DUP6 PUSH1 0x5 SHL DUP2 ADD SWAP2 POP DUP5 PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x1D8A JUMPI DUP3 DUP5 SUB DUP10 MSTORE DUP2 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 DUP9 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1CA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 ADD PUSH1 0xC0 PUSH2 0x1CAE DUP3 PUSH2 0x1BC6 JUMP JUMPDEST ISZERO ISZERO DUP7 MSTORE PUSH2 0x1CBD DUP8 DUP4 ADD PUSH2 0x1BC6 JUMP JUMPDEST ISZERO ISZERO DUP7 DUP9 ADD MSTORE PUSH1 0x40 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1CEF DUP3 DUP6 ADD PUSH2 0x1BDB JUMP JUMPDEST AND SWAP1 DUP8 ADD MSTORE PUSH1 0x80 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP8 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD CALLDATALOAD CALLDATASIZE DUP5 SWAP1 SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 ADD DUP2 SLT PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 ADD DUP8 DUP2 ADD SWAP3 SWAP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP5 SGT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP3 DUP10 ADD MSTORE PUSH2 0x1D74 DUP4 DUP10 ADD DUP3 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP13 DUP10 ADD SWAP13 SWAP8 POP POP POP SWAP3 DUP7 ADD SWAP3 POP POP PUSH1 0x1 ADD PUSH2 0x1C62 JUMP JUMPDEST POP SWAP2 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x5 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x73656C663A000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x1C48 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x6 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x67756573743A0000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x1C48 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1E7C JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1E60 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x317 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E56 JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1F01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x317 DUP3 PUSH2 0x1BC6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x317 DUP3 PUSH2 0x1BDB JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1F76 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1F91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2006 JUMPI PUSH2 0x2006 PUSH2 0x1FA6 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x201D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x202A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x2CB JUMPI PUSH2 0x2CB PUSH2 0x1FA6 JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x205E PUSH1 0x60 DUP4 ADD DUP7 DUP9 PUSH2 0x1BFF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x40 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1E56 JUMP JUMPDEST DUP5 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x20C0 PUSH1 0x60 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x2CB JUMPI PUSH2 0x2CB PUSH2 0x1FA6 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2105 PUSH1 0x40 DUP4 ADD DUP6 DUP8 PUSH2 0x1BFF JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2129 PUSH1 0x40 DUP4 ADD DUP6 DUP8 PUSH2 0x1BFF JUMP JUMPDEST SWAP1 POP PUSH1 0xFF DUP4 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2150 PUSH1 0x60 DUP4 ADD DUP7 DUP9 PUSH2 0x1BFF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP SWAP1 ISZERO ISZERO PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x2182 PUSH1 0x40 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x219D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x317 DUP2 PUSH2 0x1852 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP12 0xB9 0x5D XOR 0xE9 PUSH32 0x278AA47E0C04C20D5A6AF9BDB6D473C6D4051192CD96FC17866864736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "640:2693:1:-:0;;;;;;;;;;;;-1:-1:-1;200:4:7;185:20;;640:2693:1;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@SET_IMAGE_HASH_TYPE_HASH_2042": { + "entryPoint": null, + "id": 2042, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_executeGuest_199": { + "entryPoint": 2177, + "id": 199, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@_hashSetImageHashStruct_2071": { + "entryPoint": 4687, + "id": 2071, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_isValidImage_211": { + "entryPoint": null, + "id": 211, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_leafForAddressAndWeight_1424": { + "entryPoint": null, + "id": 1424, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_leafForHardcodedSubdigest_1441": { + "entryPoint": 6167, + "id": 1441, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_leafForNested_1464": { + "entryPoint": null, + "id": 1464, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@_revertBytes_807": { + "entryPoint": 3435, + "id": 807, + "parameterSlots": 4, + "returnSlots": 0 + }, + "@_signatureValidation_457": { + "entryPoint": 1938, + "id": 457, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@_updateImageHash_222": { + "entryPoint": 1994, + "id": 222, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@call_2515": { + "entryPoint": 3375, + "id": 2515, + "parameterSlots": 5, + "returnSlots": 1 + }, + "@chainedRecover_2217": { + "entryPoint": 2808, + "id": 2217, + "parameterSlots": 3, + "returnSlots": 5 + }, + "@createContract_876": { + "entryPoint": 1595, + "id": 876, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@execute_74": { + "entryPoint": 1050, + "id": 74, + "parameterSlots": 5, + "returnSlots": 0 + }, + "@fkeccak256_2491": { + "entryPoint": null, + "id": 2491, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@isValidSignature_2797": { + "entryPoint": 5680, + "id": 2797, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@isValidSignature_488": { + "entryPoint": 798, + "id": 488, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@isValidSignature_517": { + "entryPoint": 721, + "id": 517, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@nonce_955": { + "entryPoint": 1829, + "id": 955, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@readBytes32Map_1178": { + "entryPoint": 3189, + "id": 1178, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@readBytes32_2339": { + "entryPoint": null, + "id": 2339, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@readBytes32_2475": { + "entryPoint": null, + "id": 2475, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@readFirstUint16_2361": { + "entryPoint": null, + "id": 2361, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@readNonce_976": { + "entryPoint": 1551, + "id": 976, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@readUint16_2433": { + "entryPoint": null, + "id": 2433, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@readUint24_2447": { + "entryPoint": null, + "id": 2447, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@readUint32_2373": { + "entryPoint": null, + "id": 2373, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@readUint8Address_2419": { + "entryPoint": null, + "id": 2419, + "parameterSlots": 3, + "returnSlots": 3 + }, + "@readUint8_2351": { + "entryPoint": null, + "id": 2351, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@readUint8_2403": { + "entryPoint": null, + "id": 2403, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@recoverBranch_1954": { + "entryPoint": 3513, + "id": 1954, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@recoverSigner_2715": { + "entryPoint": 4973, + "id": 2715, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@recover_2020": { + "entryPoint": 2574, + "id": 2020, + "parameterSlots": 3, + "returnSlots": 4 + }, + "@recover_2246": { + "entryPoint": 2655, + "id": 2246, + "parameterSlots": 3, + "returnSlots": 4 + }, + "@returnData_2499": { + "entryPoint": 3404, + "id": 2499, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@selfExecute_102": { + "entryPoint": 981, + "id": 102, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@signatureRecovery_413": { + "entryPoint": 1095, + "id": 413, + "parameterSlots": 3, + "returnSlots": 5 + }, + "@subdigest_1394": { + "entryPoint": 2044, + "id": 1394, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@subdigest_2274": { + "entryPoint": 2699, + "id": 2274, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_240": { + "entryPoint": 704, + "id": 240, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_549": { + "entryPoint": 4739, + "id": 549, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_832": { + "entryPoint": 3283, + "id": 832, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_901": { + "entryPoint": 1846, + "id": 901, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_919": { + "entryPoint": null, + "id": 919, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@updateImageHash_563": { + "entryPoint": 899, + "id": 563, + "parameterSlots": 1, + "returnSlots": 0 + }, + "abi_decode_address": { + "entryPoint": 7131, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_array_struct_Transaction_calldata_dyn_calldata": { + "entryPoint": 6583, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_bool": { + "entryPoint": 7110, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_bytes_calldata": { + "entryPoint": 6301, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_address": { + "entryPoint": 7974, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr": { + "entryPoint": 6652, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptrt_uint256t_bytes_calldata_ptr": { + "entryPoint": 6718, + "id": null, + "parameterSlots": 2, + "returnSlots": 5 + }, + "abi_decode_tuple_t_bool": { + "entryPoint": 7947, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes32": { + "entryPoint": 6558, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes32t_bytes_calldata_ptr": { + "entryPoint": 6374, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_bytes4": { + "entryPoint": 6272, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes4_fromMemory": { + "entryPoint": 8587, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr": { + "entryPoint": 6450, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_bytes_memory_ptr": { + "entryPoint": 6887, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_array_struct_Transaction_calldata_dyn_calldata": { + "entryPoint": 7240, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_bytes": { + "entryPoint": 7766, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bytes_calldata": { + "entryPoint": 7167, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed": { + "entryPoint": 7094, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_uint256_t_address_t_bytes32__to_t_string_memory_ptr_t_uint256_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_583557e68bca91e5400591dbc9ae31043113c95e3cd985463ae532f51d706f8c_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_58d1832f15932b40f8da147bd99ac98efab990f25a786a2229b05ee5f5be41a7_t_bytes32_t_uint256_t_uint256__to_t_string_memory_ptr_t_bytes32_t_uint256_t_uint256__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes1__to_t_bytes1__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_address_t_bytes_calldata_ptr_slice__to_t_bytes32_t_address_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 8330, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes_calldata_ptr_slice__to_t_bytes32_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 8552, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 8394, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr_slice_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 8266, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr_t_bytes32__to_t_bytes_memory_ptr_t_bytes32__fromStack_reversed": { + "entryPoint": 8433, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr_t_uint256_t_bool__to_t_bytes_memory_ptr_t_uint256_t_bool__fromStack_reversed": { + "entryPoint": 8508, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr_t_uint8__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed": { + "entryPoint": 8469, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 7866, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_4dfa0bed92fb5c2df0b47ce555e6e6b89f746e856aa9783c634a4987edcbf682_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed": { + "entryPoint": 7647, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed": { + "entryPoint": 7575, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 8305, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__to_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 6, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256_t_uint256__to_t_uint256_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "access_calldata_tail_t_bytes_calldata_ptr": { + "entryPoint": 8001, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "access_calldata_tail_t_struct$_Transaction_$1292_calldata_ptr": { + "entryPoint": 7885, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_array_index_range_access_t_bytes_calldata_ptr": { + "entryPoint": 8205, + "id": null, + "parameterSlots": 4, + "returnSlots": 2 + }, + "checked_add_t_uint256": { + "entryPoint": 8247, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_sub_t_uint256": { + "entryPoint": 8414, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "increment_t_uint256": { + "entryPoint": 8149, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 8102, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x32": { + "entryPoint": 7719, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 6840, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_bytes4": { + "entryPoint": 6226, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:20962:22", + "statements": [ + { + "nodeType": "YulBlock", + "src": "6:3:22", + "statements": [] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "58:133:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "169:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "178:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "181:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "171:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "171:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "171:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "81:5:22" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "92:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "99:66:22", + "type": "", + "value": "0xffffffff00000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "88:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "88:78:22" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "78:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "78:89:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "71:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "71:97:22" + }, + "nodeType": "YulIf", + "src": "68:117:22" + } + ] + }, + "name": "validator_revert_bytes4", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "47:5:22", + "type": "" + } + ], + "src": "14:177:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "265:176:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "311:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "323:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "313:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "313:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "313:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "286:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "295:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "282:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "282:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "307:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "278:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "278:32:22" + }, + "nodeType": "YulIf", + "src": "275:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "336:36:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "362:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "349:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "349:23:22" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "340:5:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "405:5:22" + } + ], + "functionName": { + "name": "validator_revert_bytes4", + "nodeType": "YulIdentifier", + "src": "381:23:22" + }, + "nodeType": "YulFunctionCall", + "src": "381:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "381:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "420:15:22", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "430:5:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "420:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes4", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "231:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "242:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "254:6:22", + "type": "" + } + ], + "src": "196:245:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "541:92:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "551:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "563:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "574:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "559:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "559:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "551:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "593:9:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "618:6:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "611:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "611:14:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "604:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "604:22:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "586:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "586:41:22" + }, + "nodeType": "YulExpressionStatement", + "src": "586:41:22" + } + ] + }, + "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "510:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "521:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "532:4:22", + "type": "" + } + ], + "src": "446:187:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "710:275:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "759:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "768:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "771:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "761:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "761:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "761:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "738:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "746:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "734:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "734:17:22" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "753:3:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "730:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "730:27:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "723:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "723:35:22" + }, + "nodeType": "YulIf", + "src": "720:55:22" + }, + { + "nodeType": "YulAssignment", + "src": "784:30:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "807:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "794:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "794:20:22" + }, + "variableNames": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "784:6:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "857:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "866:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "869:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "859:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "859:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "859:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "829:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "837:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "826:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "826:30:22" + }, + "nodeType": "YulIf", + "src": "823:50:22" + }, + { + "nodeType": "YulAssignment", + "src": "882:29:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "898:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "906:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "894:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "894:17:22" + }, + "variableNames": [ + { + "name": "arrayPos", + "nodeType": "YulIdentifier", + "src": "882:8:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "963:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "972:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "975:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "965:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "965:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "965:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "934:6:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "942:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "930:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "930:19:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "951:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "926:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "926:30:22" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "958:3:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "923:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "923:39:22" + }, + "nodeType": "YulIf", + "src": "920:59:22" + } + ] + }, + "name": "abi_decode_bytes_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "673:6:22", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "681:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "arrayPos", + "nodeType": "YulTypedName", + "src": "689:8:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "699:6:22", + "type": "" + } + ], + "src": "638:347:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1096:371:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1142:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1151:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1154:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1144:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1144:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1144:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1117:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1126:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1113:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1113:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1138:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1109:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1109:32:22" + }, + "nodeType": "YulIf", + "src": "1106:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "1167:33:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1190:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1177:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "1177:23:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1167:6:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1209:46:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1240:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1251:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1236:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1236:18:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1223:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "1223:32:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1213:6:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1298:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1307:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1310:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1300:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1300:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1300:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1270:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1278:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1267:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "1267:30:22" + }, + "nodeType": "YulIf", + "src": "1264:50:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1323:84:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1379:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1390:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1375:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1375:22:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1399:7:22" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "1349:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "1349:58:22" + }, + "variables": [ + { + "name": "value1_1", + "nodeType": "YulTypedName", + "src": "1327:8:22", + "type": "" + }, + { + "name": "value2_1", + "nodeType": "YulTypedName", + "src": "1337:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1416:18:22", + "value": { + "name": "value1_1", + "nodeType": "YulIdentifier", + "src": "1426:8:22" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1416:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1443:18:22", + "value": { + "name": "value2_1", + "nodeType": "YulIdentifier", + "src": "1453:8:22" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "1443:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1046:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1057:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1069:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "1077:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "1085:6:22", + "type": "" + } + ], + "src": "990:477:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1571:149:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1581:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1593:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1604:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1589:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1589:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1581:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1623:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1638:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1646:66:22", + "type": "", + "value": "0xffffffff00000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "1634:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1634:79:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1616:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1616:98:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1616:98:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1540:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1551:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1562:4:22", + "type": "" + } + ], + "src": "1472:248:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1850:592:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1896:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1905:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1908:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1898:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1898:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1898:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1871:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1880:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1867:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1867:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1892:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1863:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1863:32:22" + }, + "nodeType": "YulIf", + "src": "1860:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1921:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1948:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1935:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "1935:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1925:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1967:28:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1977:18:22", + "type": "", + "value": "0xffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "1971:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2022:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2031:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2034:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2024:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2024:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2024:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2010:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2018:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "2007:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "2007:14:22" + }, + "nodeType": "YulIf", + "src": "2004:34:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2047:84:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2103:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2114:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2099:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2099:22:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2123:7:22" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "2073:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "2073:58:22" + }, + "variables": [ + { + "name": "value0_1", + "nodeType": "YulTypedName", + "src": "2051:8:22", + "type": "" + }, + { + "name": "value1_1", + "nodeType": "YulTypedName", + "src": "2061:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2140:18:22", + "value": { + "name": "value0_1", + "nodeType": "YulIdentifier", + "src": "2150:8:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2140:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2167:18:22", + "value": { + "name": "value1_1", + "nodeType": "YulIdentifier", + "src": "2177:8:22" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "2167:6:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2194:48:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2227:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2238:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2223:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2223:18:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2210:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "2210:32:22" + }, + "variables": [ + { + "name": "offset_1", + "nodeType": "YulTypedName", + "src": "2198:8:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2271:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2280:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2283:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2273:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2273:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2273:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_1", + "nodeType": "YulIdentifier", + "src": "2257:8:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2267:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "2254:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "2254:16:22" + }, + "nodeType": "YulIf", + "src": "2251:36:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2296:86:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2352:9:22" + }, + { + "name": "offset_1", + "nodeType": "YulIdentifier", + "src": "2363:8:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2348:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2348:24:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2374:7:22" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "2322:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "2322:60:22" + }, + "variables": [ + { + "name": "value2_1", + "nodeType": "YulTypedName", + "src": "2300:8:22", + "type": "" + }, + { + "name": "value3_1", + "nodeType": "YulTypedName", + "src": "2310:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2391:18:22", + "value": { + "name": "value2_1", + "nodeType": "YulIdentifier", + "src": "2401:8:22" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "2391:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2418:18:22", + "value": { + "name": "value3_1", + "nodeType": "YulIdentifier", + "src": "2428:8:22" + }, + "variableNames": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "2418:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1792:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1803:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1815:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "1823:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "1831:6:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "1839:6:22", + "type": "" + } + ], + "src": "1725:717:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2517:110:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "2563:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2572:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2575:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2565:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2565:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2565:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2538:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2547:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2534:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2534:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2559:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "2530:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2530:32:22" + }, + "nodeType": "YulIf", + "src": "2527:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "2588:33:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2611:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2598:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "2598:23:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2588:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2483:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "2494:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "2506:6:22", + "type": "" + } + ], + "src": "2447:180:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2733:76:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2743:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2755:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2766:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2751:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2751:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2743:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2785:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2796:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2778:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2778:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2778:25:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2702:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "2713:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2724:4:22", + "type": "" + } + ], + "src": "2632:177:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2918:283:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "2967:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2976:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2979:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2969:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2969:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2969:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2946:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2954:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2942:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2942:17:22" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "2961:3:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "2938:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2938:27:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "2931:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2931:35:22" + }, + "nodeType": "YulIf", + "src": "2928:55:22" + }, + { + "nodeType": "YulAssignment", + "src": "2992:30:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3015:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3002:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "3002:20:22" + }, + "variableNames": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "2992:6:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3065:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3074:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3077:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3067:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3067:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3067:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "3037:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3045:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "3034:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "3034:30:22" + }, + "nodeType": "YulIf", + "src": "3031:50:22" + }, + { + "nodeType": "YulAssignment", + "src": "3090:29:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3106:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3114:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3102:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3102:17:22" + }, + "variableNames": [ + { + "name": "arrayPos", + "nodeType": "YulIdentifier", + "src": "3090:8:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3179:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3188:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3191:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3181:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3181:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3181:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3142:6:22" + }, + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3154:1:22", + "type": "", + "value": "5" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "3157:6:22" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "3150:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3150:14:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3138:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3138:27:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3167:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3134:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3134:38:22" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "3174:3:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "3131:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "3131:47:22" + }, + "nodeType": "YulIf", + "src": "3128:67:22" + } + ] + }, + "name": "abi_decode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "2881:6:22", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "2889:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "arrayPos", + "nodeType": "YulTypedName", + "src": "2897:8:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "2907:6:22", + "type": "" + } + ], + "src": "2814:387:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3342:352:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "3388:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3397:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3400:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3390:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3390:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3390:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "3363:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3372:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3359:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3359:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3384:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "3355:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3355:32:22" + }, + "nodeType": "YulIf", + "src": "3352:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "3413:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3440:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3427:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "3427:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "3417:6:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3493:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3502:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3505:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3495:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3495:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3495:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3465:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3473:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "3462:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "3462:30:22" + }, + "nodeType": "YulIf", + "src": "3459:50:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "3518:116:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3606:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3617:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3602:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3602:22:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "3626:7:22" + } + ], + "functionName": { + "name": "abi_decode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulIdentifier", + "src": "3544:57:22" + }, + "nodeType": "YulFunctionCall", + "src": "3544:90:22" + }, + "variables": [ + { + "name": "value0_1", + "nodeType": "YulTypedName", + "src": "3522:8:22", + "type": "" + }, + { + "name": "value1_1", + "nodeType": "YulTypedName", + "src": "3532:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3643:18:22", + "value": { + "name": "value0_1", + "nodeType": "YulIdentifier", + "src": "3653:8:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3643:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3670:18:22", + "value": { + "name": "value1_1", + "nodeType": "YulIdentifier", + "src": "3680:8:22" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "3670:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3300:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "3311:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3323:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3331:6:22", + "type": "" + } + ], + "src": "3206:488:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3888:675:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "3934:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3943:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3946:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3936:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3936:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3936:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "3909:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3918:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3905:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3905:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3930:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "3901:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3901:32:22" + }, + "nodeType": "YulIf", + "src": "3898:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "3959:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3986:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3973:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "3973:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "3963:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4005:28:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4015:18:22", + "type": "", + "value": "0xffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "4009:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4060:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4069:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4072:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4062:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4062:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4062:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4048:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "4056:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "4045:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "4045:14:22" + }, + "nodeType": "YulIf", + "src": "4042:34:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4085:116:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4173:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4184:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4169:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4169:22:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "4193:7:22" + } + ], + "functionName": { + "name": "abi_decode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulIdentifier", + "src": "4111:57:22" + }, + "nodeType": "YulFunctionCall", + "src": "4111:90:22" + }, + "variables": [ + { + "name": "value0_1", + "nodeType": "YulTypedName", + "src": "4089:8:22", + "type": "" + }, + { + "name": "value1_1", + "nodeType": "YulTypedName", + "src": "4099:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4210:18:22", + "value": { + "name": "value0_1", + "nodeType": "YulIdentifier", + "src": "4220:8:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "4210:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4237:18:22", + "value": { + "name": "value1_1", + "nodeType": "YulIdentifier", + "src": "4247:8:22" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "4237:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4264:42:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4291:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4302:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4287:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4287:18:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4274:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "4274:32:22" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "4264:6:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4315:48:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4348:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4359:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4344:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4344:18:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4331:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "4331:32:22" + }, + "variables": [ + { + "name": "offset_1", + "nodeType": "YulTypedName", + "src": "4319:8:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4392:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4401:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4404:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4394:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4394:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4394:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_1", + "nodeType": "YulIdentifier", + "src": "4378:8:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "4388:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "4375:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "4375:16:22" + }, + "nodeType": "YulIf", + "src": "4372:36:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4417:86:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4473:9:22" + }, + { + "name": "offset_1", + "nodeType": "YulIdentifier", + "src": "4484:8:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4469:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4469:24:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "4495:7:22" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "4443:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "4443:60:22" + }, + "variables": [ + { + "name": "value3_1", + "nodeType": "YulTypedName", + "src": "4421:8:22", + "type": "" + }, + { + "name": "value4_1", + "nodeType": "YulTypedName", + "src": "4431:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4512:18:22", + "value": { + "name": "value3_1", + "nodeType": "YulIdentifier", + "src": "4522:8:22" + }, + "variableNames": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "4512:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4539:18:22", + "value": { + "name": "value4_1", + "nodeType": "YulIdentifier", + "src": "4549:8:22" + }, + "variableNames": [ + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "4539:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptrt_uint256t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3822:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "3833:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3845:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3853:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "3861:6:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "3869:6:22", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "3877:6:22", + "type": "" + } + ], + "src": "3699:864:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4781:250:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "4791:27:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4803:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4814:3:22", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4799:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4799:19:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "4791:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4834:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "4845:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4827:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4827:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4827:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4872:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4883:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4868:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4868:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "4888:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4861:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4861:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4861:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4915:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4926:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4911:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4911:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "4931:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4904:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4904:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4904:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4958:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4969:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4954:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4954:18:22" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "4974:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4947:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4947:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4947:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5001:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5012:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4997:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4997:19:22" + }, + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "5018:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4990:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4990:35:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4990:35:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__to_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "4718:9:22", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "4729:6:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "4737:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "4745:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "4753:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "4761:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "4772:4:22", + "type": "" + } + ], + "src": "4568:463:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5106:110:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "5152:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5161:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5164:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5154:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5154:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5154:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5127:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5136:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "5123:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5123:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5148:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "5119:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5119:32:22" + }, + "nodeType": "YulIf", + "src": "5116:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "5177:33:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5200:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5187:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "5187:23:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "5177:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "5072:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "5083:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "5095:6:22", + "type": "" + } + ], + "src": "5036:180:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5322:76:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "5332:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5344:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5355:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5340:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5340:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "5332:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5374:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "5385:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "5367:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5367:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5367:25:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "5291:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "5302:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "5313:4:22", + "type": "" + } + ], + "src": "5221:177:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5435:152:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5452:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5455:77:22", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "5445:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5445:88:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5445:88:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5549:1:22", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5552:4:22", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "5542:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5542:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5542:15:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5573:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5576:4:22", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5566:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5566:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5566:15:22" + } + ] + }, + "name": "panic_error_0x41", + "nodeType": "YulFunctionDefinition", + "src": "5403:184:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5671:901:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "5717:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5726:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5729:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5719:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5719:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5719:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5692:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5701:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "5688:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5688:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5713:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "5684:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5684:32:22" + }, + "nodeType": "YulIf", + "src": "5681:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5742:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5769:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5756:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "5756:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "5746:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5788:28:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5798:18:22", + "type": "", + "value": "0xffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "5792:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5843:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5852:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5855:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5845:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5845:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5845:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "5831:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "5839:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "5828:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "5828:14:22" + }, + "nodeType": "YulIf", + "src": "5825:34:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5868:32:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5882:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "5893:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5878:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5878:22:22" + }, + "variables": [ + { + "name": "_2", + "nodeType": "YulTypedName", + "src": "5872:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5948:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5957:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5960:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5950:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5950:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5950:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "5927:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5931:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5923:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5923:13:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5938:7:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "5919:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5919:27:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "5912:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5912:35:22" + }, + "nodeType": "YulIf", + "src": "5909:55:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5973:26:22", + "value": { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "5996:2:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5983:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "5983:16:22" + }, + "variables": [ + { + "name": "_3", + "nodeType": "YulTypedName", + "src": "5977:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6022:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nodeType": "YulIdentifier", + "src": "6024:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "6024:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6024:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6014:2:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "6018:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "6011:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6011:10:22" + }, + "nodeType": "YulIf", + "src": "6008:36:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6053:76:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6063:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + }, + "variables": [ + { + "name": "_4", + "nodeType": "YulTypedName", + "src": "6057:2:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6138:23:22", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6158:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "6152:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "6152:9:22" + }, + "variables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "6142:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6170:71:22", + "value": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6192:6:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6216:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6220:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6212:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6212:13:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "6227:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "6208:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6208:22:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6232:2:22", + "type": "", + "value": "63" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6204:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6204:31:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "6237:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "6200:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6200:40:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6188:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6188:53:22" + }, + "variables": [ + { + "name": "newFreePtr", + "nodeType": "YulTypedName", + "src": "6174:10:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6300:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nodeType": "YulIdentifier", + "src": "6302:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "6302:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6302:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "6259:10:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "6271:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "6256:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6256:18:22" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "6279:10:22" + }, + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6291:6:22" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "6276:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6276:22:22" + } + ], + "functionName": { + "name": "or", + "nodeType": "YulIdentifier", + "src": "6253:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6253:46:22" + }, + "nodeType": "YulIf", + "src": "6250:72:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6338:2:22", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "6342:10:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6331:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6331:22:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6331:22:22" + }, + { + "expression": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6369:6:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6377:2:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6362:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6362:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6362:18:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6426:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6435:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6438:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "6428:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6428:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6428:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "6403:2:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6407:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6399:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6399:11:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6412:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6395:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6395:20:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "6417:7:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "6392:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6392:33:22" + }, + "nodeType": "YulIf", + "src": "6389:53:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6468:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6476:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6464:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6464:15:22" + }, + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "6485:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6489:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6481:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6481:11:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6494:2:22" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "6451:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "6451:46:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6451:46:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6521:6:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6529:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6517:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6517:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6534:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6513:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6513:24:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6539:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6506:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6506:35:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6506:35:22" + }, + { + "nodeType": "YulAssignment", + "src": "6550:16:22", + "value": { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6560:6:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "6550:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes_memory_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "5637:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "5648:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "5660:6:22", + "type": "" + } + ], + "src": "5592:980:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6678:125:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "6688:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6700:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6711:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6696:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6696:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "6688:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6730:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "6745:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6753:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "6741:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6741:55:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6723:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6723:74:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6723:74:22" + } + ] + }, + "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "6647:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "6658:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "6669:4:22", + "type": "" + } + ], + "src": "6577:226:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6955:124:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "6978:3:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "6983:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "6991:6:22" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "6965:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "6965:33:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6965:33:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7007:26:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7021:3:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "7026:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7017:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7017:16:22" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "7011:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7049:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7053:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7042:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7042:13:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7042:13:22" + }, + { + "nodeType": "YulAssignment", + "src": "7064:9:22", + "value": { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7071:2:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "7064:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "6923:3:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "6928:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "6936:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "6947:3:22", + "type": "" + } + ], + "src": "6808:271:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7213:198:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "7223:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7235:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7246:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7231:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7231:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "7223:4:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7258:52:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7268:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "7262:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7326:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "7341:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7349:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "7337:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7337:15:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7319:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7319:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7319:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7373:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7384:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7369:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7369:18:22" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "7393:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7401:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "7389:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7389:15:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7362:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7362:43:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7362:43:22" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "7174:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "7185:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "7193:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "7204:4:22", + "type": "" + } + ], + "src": "7084:327:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7462:114:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "7472:29:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "7494:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7481:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "7481:20:22" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7472:5:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7554:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7563:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7566:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "7556:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7556:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7556:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7523:5:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7544:5:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7537:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7537:13:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7530:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7530:21:22" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "7520:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "7520:32:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7513:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7513:40:22" + }, + "nodeType": "YulIf", + "src": "7510:60:22" + } + ] + }, + "name": "abi_decode_bool", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "7441:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "7452:5:22", + "type": "" + } + ], + "src": "7416:160:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7630:147:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "7640:29:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "7662:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7649:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "7649:20:22" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7640:5:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7755:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7764:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7767:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "7757:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7757:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7757:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7691:5:22" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7702:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7709:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "7698:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7698:54:22" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "7688:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "7688:65:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7681:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7681:73:22" + }, + "nodeType": "YulIf", + "src": "7678:93:22" + } + ] + }, + "name": "abi_decode_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "7609:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "7620:5:22", + "type": "" + } + ], + "src": "7581:196:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7848:259:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7865:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "7870:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7858:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7858:19:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7858:19:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7903:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7908:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7899:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7899:14:22" + }, + { + "name": "start", + "nodeType": "YulIdentifier", + "src": "7915:5:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "7922:6:22" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "7886:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "7886:43:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7886:43:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7953:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "7958:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7949:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7949:16:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7967:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7945:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7945:27:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7974:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7938:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7938:38:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7938:38:22" + }, + { + "nodeType": "YulAssignment", + "src": "7985:116:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8000:3:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "8013:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8021:2:22", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8009:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8009:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8026:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "8005:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8005:88:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7996:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7996:98:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8096:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7992:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7992:109:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "7985:3:22" + } + ] + } + ] + }, + "name": "abi_encode_bytes_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "start", + "nodeType": "YulTypedName", + "src": "7817:5:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "7824:6:22", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "7832:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "7840:3:22", + "type": "" + } + ], + "src": "7782:325:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8210:1930:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8227:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "8232:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8220:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8220:19:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8220:19:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8248:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8258:4:22", + "type": "", + "value": "0x20" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "8252:2:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8271:31:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8294:3:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "8299:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8290:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8290:12:22" + }, + "variables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "8275:11:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8311:24:22", + "value": { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "8324:11:22" + }, + "variables": [ + { + "name": "pos_1", + "nodeType": "YulTypedName", + "src": "8315:5:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "8344:18:22", + "value": { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "8351:11:22" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8344:3:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8371:38:22", + "value": { + "arguments": [ + { + "name": "pos_1", + "nodeType": "YulIdentifier", + "src": "8387:5:22" + }, + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8398:1:22", + "type": "", + "value": "5" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "8401:6:22" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "8394:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8394:14:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8383:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8383:26:22" + }, + "variables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "8375:4:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8418:19:22", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8432:5:22" + }, + "variables": [ + { + "name": "srcPtr", + "nodeType": "YulTypedName", + "src": "8422:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8446:10:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8455:1:22", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nodeType": "YulTypedName", + "src": "8450:1:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8514:1600:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8535:3:22" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "8544:4:22" + }, + { + "name": "pos_1", + "nodeType": "YulIdentifier", + "src": "8550:5:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "8540:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8540:16:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8528:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8528:29:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8528:29:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8570:46:22", + "value": { + "arguments": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "8609:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "8596:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "8596:20:22" + }, + "variables": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulTypedName", + "src": "8574:18:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8765:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8774:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8777:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "8767:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8767:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8767:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "8643:18:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "8671:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "8671:14:22" + }, + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8687:5:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "8667:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8667:26:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8695:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8663:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8663:99:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "8639:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8639:124:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8632:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8632:132:22" + }, + "nodeType": "YulIf", + "src": "8629:152:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8794:45:22", + "value": { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "8813:18:22" + }, + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8833:5:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8809:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8809:30:22" + }, + "variables": [ + { + "name": "value_1", + "nodeType": "YulTypedName", + "src": "8798:7:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8852:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8862:4:22", + "type": "", + "value": "0xc0" + }, + "variables": [ + { + "name": "_2", + "nodeType": "YulTypedName", + "src": "8856:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "8886:4:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "8922:7:22" + } + ], + "functionName": { + "name": "abi_decode_bool", + "nodeType": "YulIdentifier", + "src": "8906:15:22" + }, + "nodeType": "YulFunctionCall", + "src": "8906:24:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8899:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8899:32:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8892:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8892:40:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8879:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8879:54:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8879:54:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "8957:4:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "8963:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8953:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8953:13:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9002:7:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "9011:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8998:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8998:16:22" + } + ], + "functionName": { + "name": "abi_decode_bool", + "nodeType": "YulIdentifier", + "src": "8982:15:22" + }, + "nodeType": "YulFunctionCall", + "src": "8982:33:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8975:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8975:41:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8968:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8968:49:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8946:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8946:72:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8946:72:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9031:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9041:4:22", + "type": "", + "value": "0x40" + }, + "variables": [ + { + "name": "_3", + "nodeType": "YulTypedName", + "src": "9035:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9069:4:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "9075:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9065:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9065:13:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9097:7:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "9106:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9093:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9093:16:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "9080:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9080:30:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9058:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9058:53:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9058:53:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9124:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9134:4:22", + "type": "", + "value": "0x60" + }, + "variables": [ + { + "name": "_4", + "nodeType": "YulTypedName", + "src": "9128:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9162:4:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "9168:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9158:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9158:13:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9200:7:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "9209:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9196:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9196:16:22" + } + ], + "functionName": { + "name": "abi_decode_address", + "nodeType": "YulIdentifier", + "src": "9177:18:22" + }, + "nodeType": "YulFunctionCall", + "src": "9177:36:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9215:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "9173:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9173:85:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9151:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9151:108:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9151:108:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9272:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9282:4:22", + "type": "", + "value": "0x80" + }, + "variables": [ + { + "name": "_5", + "nodeType": "YulTypedName", + "src": "9276:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9310:4:22" + }, + { + "name": "_5", + "nodeType": "YulIdentifier", + "src": "9316:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9306:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9306:13:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9338:7:22" + }, + { + "name": "_5", + "nodeType": "YulIdentifier", + "src": "9347:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9334:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9334:16:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "9321:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9321:30:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9299:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9299:53:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9299:53:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9365:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9375:4:22", + "type": "", + "value": "0xa0" + }, + "variables": [ + { + "name": "_6", + "nodeType": "YulTypedName", + "src": "9369:2:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9392:58:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9437:7:22" + }, + { + "name": "_6", + "nodeType": "YulIdentifier", + "src": "9446:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9433:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9433:16:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "9420:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9420:30:22" + }, + "variables": [ + { + "name": "rel_offset_of_tail_1", + "nodeType": "YulTypedName", + "src": "9396:20:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9603:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9612:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9615:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9605:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9605:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9605:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail_1", + "nodeType": "YulIdentifier", + "src": "9477:20:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "9507:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9507:14:22" + }, + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9523:7:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "9503:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9503:28:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9533:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9499:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9499:101:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "9473:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9473:128:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "9466:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9466:136:22" + }, + "nodeType": "YulIf", + "src": "9463:156:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9632:49:22", + "value": { + "arguments": [ + { + "name": "rel_offset_of_tail_1", + "nodeType": "YulIdentifier", + "src": "9651:20:22" + }, + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9673:7:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9647:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9647:34:22" + }, + "variables": [ + { + "name": "value_2", + "nodeType": "YulTypedName", + "src": "9636:7:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9694:37:22", + "value": { + "arguments": [ + { + "name": "value_2", + "nodeType": "YulIdentifier", + "src": "9723:7:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "9710:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9710:21:22" + }, + "variables": [ + { + "name": "length_1", + "nodeType": "YulTypedName", + "src": "9698:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9744:31:22", + "value": { + "arguments": [ + { + "name": "value_2", + "nodeType": "YulIdentifier", + "src": "9763:7:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "9772:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9759:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9759:16:22" + }, + "variables": [ + { + "name": "value_3", + "nodeType": "YulTypedName", + "src": "9748:7:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9824:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9833:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9836:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9826:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9826:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9826:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length_1", + "nodeType": "YulIdentifier", + "src": "9794:8:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9804:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "9791:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "9791:32:22" + }, + "nodeType": "YulIf", + "src": "9788:52:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9900:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9909:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9912:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9902:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9902:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9902:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "value_3", + "nodeType": "YulIdentifier", + "src": "9860:7:22" + }, + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "9873:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9873:14:22" + }, + { + "name": "length_1", + "nodeType": "YulIdentifier", + "src": "9889:8:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "9869:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9869:29:22" + } + ], + "functionName": { + "name": "sgt", + "nodeType": "YulIdentifier", + "src": "9856:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9856:43:22" + }, + "nodeType": "YulIf", + "src": "9853:63:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9940:4:22" + }, + { + "name": "_6", + "nodeType": "YulIdentifier", + "src": "9946:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9936:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9936:13:22" + }, + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "9951:2:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9929:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9929:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9929:25:22" + }, + { + "nodeType": "YulAssignment", + "src": "9967:67:22", + "value": { + "arguments": [ + { + "name": "value_3", + "nodeType": "YulIdentifier", + "src": "10001:7:22" + }, + { + "name": "length_1", + "nodeType": "YulIdentifier", + "src": "10010:8:22" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "10024:4:22" + }, + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "10030:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10020:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10020:13:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "9975:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "9975:59:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9967:4:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "10047:25:22", + "value": { + "arguments": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "10061:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "10069:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10057:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10057:15:22" + }, + "variableNames": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "10047:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "10085:19:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "10096:3:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "10101:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10092:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10092:12:22" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "10085:3:22" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "8476:1:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "8479:6:22" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "8473:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "8473:13:22" + }, + "nodeType": "YulForLoop", + "post": { + "nodeType": "YulBlock", + "src": "8487:18:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "8489:14:22", + "value": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "8498:1:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8501:1:22", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8494:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8494:9:22" + }, + "variableNames": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "8489:1:22" + } + ] + } + ] + }, + "pre": { + "nodeType": "YulBlock", + "src": "8469:3:22", + "statements": [] + }, + "src": "8465:1649:22" + }, + { + "nodeType": "YulAssignment", + "src": "10123:11:22", + "value": { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "10130:4:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "10123:3:22" + } + ] + } + ] + }, + "name": "abi_encode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "8179:5:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "8186:6:22", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "8194:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "8202:3:22", + "type": "" + } + ], + "src": "8112:2028:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "10467:272:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10484:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10495:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10477:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "10477:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "10477:21:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10518:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10529:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10514:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10514:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10534:1:22", + "type": "", + "value": "5" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10507:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "10507:29:22" + }, + "nodeType": "YulExpressionStatement", + "src": "10507:29:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10556:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10567:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10552:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10552:18:22" + }, + { + "hexValue": "73656c663a", + "kind": "string", + "nodeType": "YulLiteral", + "src": "10572:7:22", + "type": "", + "value": "self:" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10545:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "10545:35:22" + }, + "nodeType": "YulExpressionStatement", + "src": "10545:35:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10600:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10611:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10596:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10596:20:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10618:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10589:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "10589:33:22" + }, + "nodeType": "YulExpressionStatement", + "src": "10589:33:22" + }, + { + "nodeType": "YulAssignment", + "src": "10631:102:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "10697:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "10705:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10717:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10728:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10713:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10713:19:22" + } + ], + "functionName": { + "name": "abi_encode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulIdentifier", + "src": "10639:57:22" + }, + "nodeType": "YulFunctionCall", + "src": "10639:94:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "10631:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "10428:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "10439:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "10447:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "10458:4:22", + "type": "" + } + ], + "src": "10145:594:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11066:273:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11083:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11094:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11076:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11076:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11076:21:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11117:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11128:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11113:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11113:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11133:1:22", + "type": "", + "value": "6" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11106:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11106:29:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11106:29:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11155:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11166:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11151:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11151:18:22" + }, + { + "hexValue": "67756573743a", + "kind": "string", + "nodeType": "YulLiteral", + "src": "11171:8:22", + "type": "", + "value": "guest:" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11144:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11144:36:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11144:36:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11200:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11211:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11196:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11196:20:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11218:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11189:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11189:33:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11189:33:22" + }, + { + "nodeType": "YulAssignment", + "src": "11231:102:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "11297:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "11305:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11317:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11328:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11313:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11313:19:22" + } + ], + "functionName": { + "name": "abi_encode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulIdentifier", + "src": "11239:57:22" + }, + "nodeType": "YulFunctionCall", + "src": "11239:94:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "11231:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_4dfa0bed92fb5c2df0b47ce555e6e6b89f746e856aa9783c634a4987edcbf682_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "11027:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "11038:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "11046:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "11057:4:22", + "type": "" + } + ], + "src": "10744:595:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11376:152:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11393:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11396:77:22", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11386:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11386:88:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11386:88:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11490:1:22", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11493:4:22", + "type": "", + "value": "0x32" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11483:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11483:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11483:15:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11514:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11517:4:22", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "11507:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11507:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11507:15:22" + } + ] + }, + "name": "panic_error_0x32", + "nodeType": "YulFunctionDefinition", + "src": "11344:184:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11632:149:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "11642:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11654:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11665:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11650:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11650:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "11642:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11684:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "11699:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11707:66:22", + "type": "", + "value": "0xff00000000000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "11695:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11695:79:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11677:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11677:98:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11677:98:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes1__to_t_bytes1__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "11601:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "11612:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "11623:4:22", + "type": "" + } + ], + "src": "11533:248:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11835:432:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "11845:26:22", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "11865:5:22" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "11859:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "11859:12:22" + }, + "variables": [ + { + "name": "length", + "nodeType": "YulTypedName", + "src": "11849:6:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "11887:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "11892:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11880:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11880:19:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11880:19:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "11908:10:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11917:1:22", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nodeType": "YulTypedName", + "src": "11912:1:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11979:110:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "11993:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12003:4:22", + "type": "", + "value": "0x20" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "11997:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12035:3:22" + }, + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "12040:1:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12031:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12031:11:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "12044:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12027:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12027:20:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "12063:5:22" + }, + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "12070:1:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12059:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12059:13:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "12074:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12055:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12055:22:22" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "12049:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "12049:29:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12020:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12020:59:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12020:59:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "11938:1:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "11941:6:22" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "11935:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "11935:13:22" + }, + "nodeType": "YulForLoop", + "post": { + "nodeType": "YulBlock", + "src": "11949:21:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "11951:17:22", + "value": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "11960:1:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11963:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11956:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11956:12:22" + }, + "variableNames": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "11951:1:22" + } + ] + } + ] + }, + "pre": { + "nodeType": "YulBlock", + "src": "11931:3:22", + "statements": [] + }, + "src": "11927:162:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12113:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "12118:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12109:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12109:16:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12127:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12105:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12105:27:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12134:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12098:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12098:38:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12098:38:22" + }, + { + "nodeType": "YulAssignment", + "src": "12145:116:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12160:3:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "12173:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12181:2:22", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12169:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12169:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12186:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "12165:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12165:88:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12156:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12156:98:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12256:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12152:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12152:109:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "12145:3:22" + } + ] + } + ] + }, + "name": "abi_encode_bytes", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "11812:5:22", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "11819:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "11827:3:22", + "type": "" + } + ], + "src": "11786:481:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "12391:98:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12408:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12419:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12401:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12401:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12401:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "12431:52:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "12456:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12468:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12479:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12464:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12464:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes", + "nodeType": "YulIdentifier", + "src": "12439:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "12439:44:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "12431:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "12360:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "12371:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "12382:4:22", + "type": "" + } + ], + "src": "12272:217:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "12770:315:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12787:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12792:66:22", + "type": "", + "value": "0x1901000000000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12780:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12780:79:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12780:79:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12879:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12884:1:22", + "type": "", + "value": "2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12875:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12875:11:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "12888:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12868:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12868:27:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12868:27:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12915:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12920:2:22", + "type": "", + "value": "34" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12911:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12911:12:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12933:2:22", + "type": "", + "value": "96" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "12937:6:22" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "12929:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12929:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12946:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "12925:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12925:88:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12904:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12904:110:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12904:110:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "13034:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13039:2:22", + "type": "", + "value": "54" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13030:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13030:12:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "13044:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13023:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13023:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13023:28:22" + }, + { + "nodeType": "YulAssignment", + "src": "13060:19:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "13071:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13076:2:22", + "type": "", + "value": "86" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13067:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13067:12:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "13060:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_uint256_t_address_t_bytes32__to_t_string_memory_ptr_t_uint256_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "12730:3:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "12735:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "12743:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "12751:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "12762:3:22", + "type": "" + } + ], + "src": "12494:591:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13196:281:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "13206:51:22", + "value": { + "arguments": [ + { + "name": "ptr_to_tail", + "nodeType": "YulIdentifier", + "src": "13245:11:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "13232:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "13232:25:22" + }, + "variables": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulTypedName", + "src": "13210:18:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13405:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13414:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13417:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "13407:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13407:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13407:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "13280:18:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "13308:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "13308:14:22" + }, + { + "name": "base_ref", + "nodeType": "YulIdentifier", + "src": "13324:8:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "13304:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13304:29:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13335:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13300:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13300:102:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "13276:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13276:127:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "13269:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13269:135:22" + }, + "nodeType": "YulIf", + "src": "13266:155:22" + }, + { + "nodeType": "YulAssignment", + "src": "13430:41:22", + "value": { + "arguments": [ + { + "name": "base_ref", + "nodeType": "YulIdentifier", + "src": "13442:8:22" + }, + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "13452:18:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13438:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13438:33:22" + }, + "variableNames": [ + { + "name": "addr", + "nodeType": "YulIdentifier", + "src": "13430:4:22" + } + ] + } + ] + }, + "name": "access_calldata_tail_t_struct$_Transaction_$1292_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "base_ref", + "nodeType": "YulTypedName", + "src": "13161:8:22", + "type": "" + }, + { + "name": "ptr_to_tail", + "nodeType": "YulTypedName", + "src": "13171:11:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "addr", + "nodeType": "YulTypedName", + "src": "13187:4:22", + "type": "" + } + ], + "src": "13090:387:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13549:113:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "13595:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13604:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13607:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "13597:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13597:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13597:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "13570:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13579:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "13566:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13566:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13591:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "13562:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13562:32:22" + }, + "nodeType": "YulIf", + "src": "13559:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "13620:36:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13646:9:22" + } + ], + "functionName": { + "name": "abi_decode_bool", + "nodeType": "YulIdentifier", + "src": "13630:15:22" + }, + "nodeType": "YulFunctionCall", + "src": "13630:26:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "13620:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bool", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "13515:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "13526:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "13538:6:22", + "type": "" + } + ], + "src": "13482:180:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13824:162:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "13834:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13846:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13857:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13842:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13842:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "13834:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13876:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "13887:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13869:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13869:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13869:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13914:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13925:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13910:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13910:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "13930:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13903:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13903:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13903:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13957:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13968:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13953:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13953:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "13973:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13946:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13946:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13946:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256_t_uint256__to_t_uint256_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "13777:9:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "13788:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "13796:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "13804:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "13815:4:22", + "type": "" + } + ], + "src": "13667:319:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14061:116:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "14107:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14116:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14119:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14109:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14109:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14109:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "14082:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "14091:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "14078:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14078:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14103:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "14074:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14074:32:22" + }, + "nodeType": "YulIf", + "src": "14071:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "14132:39:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "14161:9:22" + } + ], + "functionName": { + "name": "abi_decode_address", + "nodeType": "YulIdentifier", + "src": "14142:18:22" + }, + "nodeType": "YulFunctionCall", + "src": "14142:29:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "14132:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "14027:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "14038:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "14050:6:22", + "type": "" + } + ], + "src": "13991:186:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14276:486:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "14286:51:22", + "value": { + "arguments": [ + { + "name": "ptr_to_tail", + "nodeType": "YulIdentifier", + "src": "14325:11:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "14312:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "14312:25:22" + }, + "variables": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulTypedName", + "src": "14290:18:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14485:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14494:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14497:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14487:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14487:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14487:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "14360:18:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "14388:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "14388:14:22" + }, + { + "name": "base_ref", + "nodeType": "YulIdentifier", + "src": "14404:8:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "14384:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14384:29:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14415:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14380:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14380:102:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "14356:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14356:127:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "14349:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14349:135:22" + }, + "nodeType": "YulIf", + "src": "14346:155:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "14510:47:22", + "value": { + "arguments": [ + { + "name": "base_ref", + "nodeType": "YulIdentifier", + "src": "14528:8:22" + }, + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "14538:18:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14524:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14524:33:22" + }, + "variables": [ + { + "name": "addr_1", + "nodeType": "YulTypedName", + "src": "14514:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "14566:30:22", + "value": { + "arguments": [ + { + "name": "addr_1", + "nodeType": "YulIdentifier", + "src": "14589:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "14576:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "14576:20:22" + }, + "variableNames": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "14566:6:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14639:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14648:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14651:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14641:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14641:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14641:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "14611:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14619:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "14608:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "14608:30:22" + }, + "nodeType": "YulIf", + "src": "14605:50:22" + }, + { + "nodeType": "YulAssignment", + "src": "14664:25:22", + "value": { + "arguments": [ + { + "name": "addr_1", + "nodeType": "YulIdentifier", + "src": "14676:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14684:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14672:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14672:17:22" + }, + "variableNames": [ + { + "name": "addr", + "nodeType": "YulIdentifier", + "src": "14664:4:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14740:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14749:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14752:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14742:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14742:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14742:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "addr", + "nodeType": "YulIdentifier", + "src": "14705:4:22" + }, + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "14715:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "14715:14:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "14731:6:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "14711:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14711:27:22" + } + ], + "functionName": { + "name": "sgt", + "nodeType": "YulIdentifier", + "src": "14701:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14701:38:22" + }, + "nodeType": "YulIf", + "src": "14698:58:22" + } + ] + }, + "name": "access_calldata_tail_t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "base_ref", + "nodeType": "YulTypedName", + "src": "14233:8:22", + "type": "" + }, + { + "name": "ptr_to_tail", + "nodeType": "YulTypedName", + "src": "14243:11:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "addr", + "nodeType": "YulTypedName", + "src": "14259:4:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "14265:6:22", + "type": "" + } + ], + "src": "14182:580:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14799:152:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14816:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14819:77:22", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "14809:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14809:88:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14809:88:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14913:1:22", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14916:4:22", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "14906:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14906:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14906:15:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14937:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14940:4:22", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14930:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14930:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14930:15:22" + } + ] + }, + "name": "panic_error_0x11", + "nodeType": "YulFunctionDefinition", + "src": "14767:184:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15003:148:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "15094:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "15096:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "15096:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15096:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "15019:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15026:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "15016:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "15016:77:22" + }, + "nodeType": "YulIf", + "src": "15013:103:22" + }, + { + "nodeType": "YulAssignment", + "src": "15125:20:22", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "15136:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15143:1:22", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15132:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15132:13:22" + }, + "variableNames": [ + { + "name": "ret", + "nodeType": "YulIdentifier", + "src": "15125:3:22" + } + ] + } + ] + }, + "name": "increment_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "14985:5:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "ret", + "nodeType": "YulTypedName", + "src": "14995:3:22", + "type": "" + } + ], + "src": "14956:195:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15286:201:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "15324:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15333:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15336:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "15326:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15326:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15326:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "startIndex", + "nodeType": "YulIdentifier", + "src": "15302:10:22" + }, + { + "name": "endIndex", + "nodeType": "YulIdentifier", + "src": "15314:8:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "15299:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "15299:24:22" + }, + "nodeType": "YulIf", + "src": "15296:44:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15373:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15382:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15385:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "15375:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15375:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15375:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "endIndex", + "nodeType": "YulIdentifier", + "src": "15355:8:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "15365:6:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "15352:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "15352:20:22" + }, + "nodeType": "YulIf", + "src": "15349:40:22" + }, + { + "nodeType": "YulAssignment", + "src": "15398:36:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "15415:6:22" + }, + { + "name": "startIndex", + "nodeType": "YulIdentifier", + "src": "15423:10:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15411:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15411:23:22" + }, + "variableNames": [ + { + "name": "offsetOut", + "nodeType": "YulIdentifier", + "src": "15398:9:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "15443:38:22", + "value": { + "arguments": [ + { + "name": "endIndex", + "nodeType": "YulIdentifier", + "src": "15460:8:22" + }, + { + "name": "startIndex", + "nodeType": "YulIdentifier", + "src": "15470:10:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "15456:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15456:25:22" + }, + "variableNames": [ + { + "name": "lengthOut", + "nodeType": "YulIdentifier", + "src": "15443:9:22" + } + ] + } + ] + }, + "name": "calldata_array_index_range_access_t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "15220:6:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "15228:6:22", + "type": "" + }, + { + "name": "startIndex", + "nodeType": "YulTypedName", + "src": "15236:10:22", + "type": "" + }, + { + "name": "endIndex", + "nodeType": "YulTypedName", + "src": "15248:8:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "offsetOut", + "nodeType": "YulTypedName", + "src": "15261:9:22", + "type": "" + }, + { + "name": "lengthOut", + "nodeType": "YulTypedName", + "src": "15272:9:22", + "type": "" + } + ], + "src": "15156:331:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15540:77:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "15550:16:22", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "15561:1:22" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "15564:1:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15557:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15557:9:22" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "15550:3:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15589:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "15591:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "15591:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15591:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "15581:1:22" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "15584:3:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "15578:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "15578:10:22" + }, + "nodeType": "YulIf", + "src": "15575:36:22" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "15523:1:22", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "15526:1:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "15532:3:22", + "type": "" + } + ], + "src": "15492:125:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15813:201:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "15830:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15841:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "15823:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15823:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15823:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "15853:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "15887:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "15895:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "15907:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15918:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15903:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15903:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "15861:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "15861:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "15853:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "15942:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15953:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15938:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15938:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "15958:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "15931:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15931:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15931:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "15985:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15996:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15981:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15981:18:22" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "16001:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "15974:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15974:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15974:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr_slice_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "15758:9:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "15769:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "15777:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "15785:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "15793:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "15804:4:22", + "type": "" + } + ], + "src": "15622:392:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "16148:119:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "16158:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16170:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16181:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16166:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16166:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "16158:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16200:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "16211:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16193:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16193:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16193:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16238:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16249:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16234:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16234:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "16254:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16227:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16227:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16227:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "16109:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "16120:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "16128:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "16139:4:22", + "type": "" + } + ], + "src": "16019:248:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "16401:119:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "16411:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16423:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16434:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16419:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16419:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "16411:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16453:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "16464:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16446:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16446:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16446:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16491:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16502:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16487:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16487:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "16507:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16480:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16480:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16480:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "16362:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "16373:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "16381:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "16392:4:22", + "type": "" + } + ], + "src": "16272:248:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "16672:141:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16689:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "16700:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16682:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16682:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16682:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16727:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16738:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16723:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16723:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16743:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16716:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16716:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16716:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "16755:52:22", + "value": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "16780:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16792:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16803:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16788:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16788:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes", + "nodeType": "YulIdentifier", + "src": "16763:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "16763:44:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "16755:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "16633:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "16644:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "16652:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "16663:4:22", + "type": "" + } + ], + "src": "16525:288:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17009:250:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17026:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "17037:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17019:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17019:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17019:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17064:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17075:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17060:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17060:18:22" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "17084:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17092:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "17080:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17080:55:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17053:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17053:83:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17053:83:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17156:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17167:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17152:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17152:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17172:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17145:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17145:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17145:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "17184:69:22", + "value": { + "arguments": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "17218:6:22" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "17226:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17238:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17249:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17234:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17234:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "17192:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "17192:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "17184:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_address_t_bytes_calldata_ptr_slice__to_t_bytes32_t_address_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "16954:9:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "16965:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "16973:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "16981:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "16989:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "17000:4:22", + "type": "" + } + ], + "src": "16818:441:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17393:115:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17410:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17421:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17403:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17403:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17403:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "17433:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "17467:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "17475:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17487:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17498:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17483:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17483:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "17441:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "17441:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "17433:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "17354:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "17365:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "17373:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "17384:4:22", + "type": "" + } + ], + "src": "17264:244:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17562:79:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "17572:17:22", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "17584:1:22" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "17587:1:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "17580:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17580:9:22" + }, + "variableNames": [ + { + "name": "diff", + "nodeType": "YulIdentifier", + "src": "17572:4:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17613:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "17615:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "17615:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17615:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "diff", + "nodeType": "YulIdentifier", + "src": "17604:4:22" + }, + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "17610:1:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "17601:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "17601:11:22" + }, + "nodeType": "YulIf", + "src": "17598:37:22" + } + ] + }, + "name": "checked_sub_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "17544:1:22", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "17547:1:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "diff", + "nodeType": "YulTypedName", + "src": "17553:4:22", + "type": "" + } + ], + "src": "17513:128:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17803:158:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17820:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17831:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17813:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17813:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17813:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "17843:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "17877:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "17885:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17897:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17908:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17893:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17893:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "17851:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "17851:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "17843:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17932:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17943:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17928:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17928:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "17948:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17921:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17921:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17921:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr_t_bytes32__to_t_bytes_memory_ptr_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "17756:9:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "17767:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "17775:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "17783:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "17794:4:22", + "type": "" + } + ], + "src": "17646:315:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "18121:169:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18138:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18149:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18131:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18131:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18131:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "18161:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "18195:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "18203:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18215:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18226:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18211:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18211:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "18169:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "18169:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "18161:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18250:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18261:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18246:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18246:18:22" + }, + { + "arguments": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "18270:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18278:4:22", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "18266:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18266:17:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18239:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18239:45:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18239:45:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr_t_uint8__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "18074:9:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "18085:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "18093:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "18101:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "18112:4:22", + "type": "" + } + ], + "src": "17966:324:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "18476:217:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "18486:27:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18498:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18509:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18494:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18494:19:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "18486:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18529:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "18540:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18522:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18522:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18522:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18567:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18578:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18563:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18563:18:22" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "18587:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18595:4:22", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "18583:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18583:17:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18556:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18556:45:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18556:45:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18621:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18632:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18617:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18617:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "18637:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18610:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18610:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18610:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18664:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18675:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18660:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18660:18:22" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "18680:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18653:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18653:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18653:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "18421:9:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "18432:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "18440:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "18448:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "18456:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "18467:4:22", + "type": "" + } + ], + "src": "18295:398:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "18918:160:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "18935:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18940:66:22", + "type": "", + "value": "0x19457468657265756d205369676e6564204d6573736167653a0a333200000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18928:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18928:79:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18928:79:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "19027:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19032:2:22", + "type": "", + "value": "28" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19023:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19023:12:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "19037:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19016:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19016:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19016:28:22" + }, + { + "nodeType": "YulAssignment", + "src": "19053:19:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "19064:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19069:2:22", + "type": "", + "value": "60" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19060:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19060:12:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "19053:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "18894:3:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "18899:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "18910:3:22", + "type": "" + } + ], + "src": "18698:380:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "19262:217:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19279:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19290:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19272:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19272:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19272:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "19302:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "19336:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "19344:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19356:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19367:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19352:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19352:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "19310:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "19310:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "19302:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19391:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19402:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19387:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19387:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "19407:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19380:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19380:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19380:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19434:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19445:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19430:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19430:18:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "19464:6:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "19457:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19457:14:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "19450:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19450:22:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19423:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19423:50:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19423:50:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr_t_uint256_t_bool__to_t_bytes_memory_ptr_t_uint256_t_bool__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "19207:9:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "19218:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "19226:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "19234:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "19242:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "19253:4:22", + "type": "" + } + ], + "src": "19083:396:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "19647:158:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19664:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "19675:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19657:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19657:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19657:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19702:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19713:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19698:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19698:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19718:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19691:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19691:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19691:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "19730:69:22", + "value": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "19764:6:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "19772:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19784:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19795:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19780:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19780:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "19738:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "19738:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "19730:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes_calldata_ptr_slice__to_t_bytes32_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "19600:9:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "19611:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "19619:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "19627:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "19638:4:22", + "type": "" + } + ], + "src": "19484:321:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "19890:169:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "19936:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19945:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19948:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "19938:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19938:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19938:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "19911:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19920:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "19907:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19907:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19932:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "19903:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19903:32:22" + }, + "nodeType": "YulIf", + "src": "19900:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "19961:29:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19980:9:22" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "19974:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "19974:16:22" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "19965:5:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "20023:5:22" + } + ], + "functionName": { + "name": "validator_revert_bytes4", + "nodeType": "YulIdentifier", + "src": "19999:23:22" + }, + "nodeType": "YulFunctionCall", + "src": "19999:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19999:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "20038:15:22", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "20048:5:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "20038:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes4_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "19856:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "19867:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "19879:6:22", + "type": "" + } + ], + "src": "19810:249:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "20340:235:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20357:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20362:66:22", + "type": "", + "value": "0x53657175656e6365206e657374656420636f6e6669673a0a0000000000000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20350:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20350:79:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20350:79:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20449:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20454:2:22", + "type": "", + "value": "24" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20445:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20445:12:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "20459:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20438:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20438:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20438:28:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20486:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20491:2:22", + "type": "", + "value": "56" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20482:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20482:12:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "20496:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20475:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20475:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20475:28:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20523:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20528:2:22", + "type": "", + "value": "88" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20519:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20519:12:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "20533:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20512:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20512:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20512:28:22" + }, + { + "nodeType": "YulAssignment", + "src": "20549:20:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20560:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20565:3:22", + "type": "", + "value": "120" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20556:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20556:13:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "20549:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_58d1832f15932b40f8da147bd99ac98efab990f25a786a2229b05ee5f5be41a7_t_bytes32_t_uint256_t_uint256__to_t_string_memory_ptr_t_bytes32_t_uint256_t_uint256__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "20300:3:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "20305:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "20313:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "20321:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "20332:3:22", + "type": "" + } + ], + "src": "20064:511:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "20800:160:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20817:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20822:66:22", + "type": "", + "value": "0x53657175656e636520737461746963206469676573743a0a0000000000000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20810:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20810:79:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20810:79:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20909:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20914:2:22", + "type": "", + "value": "24" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20905:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20905:12:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "20919:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20898:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20898:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20898:28:22" + }, + { + "nodeType": "YulAssignment", + "src": "20935:19:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20946:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20951:2:22", + "type": "", + "value": "56" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20942:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20942:12:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "20935:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_583557e68bca91e5400591dbc9ae31043113c95e3cd985463ae532f51d706f8c_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "20776:3:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "20781:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "20792:3:22", + "type": "" + } + ], + "src": "20580:380:22" + } + ] + }, + "contents": "{\n { }\n function validator_revert_bytes4(value)\n {\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_bytes4(value)\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes32t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value1_1, value2_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value1 := value1_1\n value2 := value2_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_bytes32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_array_struct_Transaction_calldata_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_Transaction_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n }\n function abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptrt_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_Transaction_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n value2 := calldataload(add(headStart, 32))\n let offset_1 := calldataload(add(headStart, 64))\n if gt(offset_1, _1) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__to_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_bytes_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 32), add(_2, 32), _3)\n mstore(add(add(memPtr, _3), 32), 0)\n value0 := memPtr\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n calldatacopy(pos, value0, value1)\n let _1 := add(pos, value1)\n mstore(_1, 0)\n end := _1\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n function abi_decode_bool(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_encode_bytes_calldata(start, length, pos) -> end\n {\n mstore(pos, length)\n calldatacopy(add(pos, 0x20), start, length)\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_array_struct_Transaction_calldata_dyn_calldata(value, length, pos) -> end\n {\n mstore(pos, length)\n let _1 := 0x20\n let updated_pos := add(pos, _1)\n let pos_1 := updated_pos\n pos := updated_pos\n let tail := add(pos_1, shl(5, length))\n let srcPtr := value\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, sub(tail, pos_1))\n let rel_offset_of_tail := calldataload(srcPtr)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), value), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41))) { revert(0, 0) }\n let value_1 := add(rel_offset_of_tail, value)\n let _2 := 0xc0\n mstore(tail, iszero(iszero(abi_decode_bool(value_1))))\n mstore(add(tail, _1), iszero(iszero(abi_decode_bool(add(value_1, _1)))))\n let _3 := 0x40\n mstore(add(tail, _3), calldataload(add(value_1, _3)))\n let _4 := 0x60\n mstore(add(tail, _4), and(abi_decode_address(add(value_1, _4)), 0xffffffffffffffffffffffffffffffffffffffff))\n let _5 := 0x80\n mstore(add(tail, _5), calldataload(add(value_1, _5)))\n let _6 := 0xa0\n let rel_offset_of_tail_1 := calldataload(add(value_1, _6))\n if iszero(slt(rel_offset_of_tail_1, add(sub(calldatasize(), value_1), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let value_2 := add(rel_offset_of_tail_1, value_1)\n let length_1 := calldataload(value_2)\n let value_3 := add(value_2, _1)\n if gt(length_1, 0xffffffffffffffff) { revert(0, 0) }\n if sgt(value_3, sub(calldatasize(), length_1)) { revert(0, 0) }\n mstore(add(tail, _6), _2)\n tail := abi_encode_bytes_calldata(value_3, length_1, add(tail, _2))\n srcPtr := add(srcPtr, _1)\n pos := add(pos, _1)\n }\n end := tail\n }\n function abi_encode_tuple_t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n mstore(add(headStart, 64), 5)\n mstore(add(headStart, 96), \"self:\")\n mstore(add(headStart, 0x20), 128)\n tail := abi_encode_array_struct_Transaction_calldata_dyn_calldata(value0, value1, add(headStart, 128))\n }\n function abi_encode_tuple_t_stringliteral_4dfa0bed92fb5c2df0b47ce555e6e6b89f746e856aa9783c634a4987edcbf682_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n mstore(add(headStart, 64), 6)\n mstore(add(headStart, 96), \"guest:\")\n mstore(add(headStart, 0x20), 128)\n tail := abi_encode_array_struct_Transaction_calldata_dyn_calldata(value0, value1, add(headStart, 128))\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_bytes1__to_t_bytes1__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff00000000000000000000000000000000000000000000000000000000000000))\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n let _1 := 0x20\n mstore(add(add(pos, i), _1), mload(add(add(value, i), _1)))\n }\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n function abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_uint256_t_address_t_bytes32__to_t_string_memory_ptr_t_uint256_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value2, value1, value0) -> end\n {\n mstore(pos, 0x1901000000000000000000000000000000000000000000000000000000000000)\n mstore(add(pos, 2), value0)\n mstore(add(pos, 34), and(shl(96, value1), 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000))\n mstore(add(pos, 54), value2)\n end := add(pos, 86)\n }\n function access_calldata_tail_t_struct$_Transaction_$1292_calldata_ptr(base_ref, ptr_to_tail) -> addr\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41))) { revert(0, 0) }\n addr := add(base_ref, rel_offset_of_tail)\n }\n function abi_decode_tuple_t_bool(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_bool(headStart)\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_uint256__to_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n sum := add(x, y)\n if gt(x, sum) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_slice_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 96)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 96))\n mstore(add(headStart, 32), value2)\n mstore(add(headStart, 64), value3)\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes(value1, add(headStart, 64))\n }\n function abi_encode_tuple_t_bytes32_t_address_t_bytes_calldata_ptr_slice__to_t_bytes32_t_address_t_bytes_memory_ptr__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 64), 96)\n tail := abi_encode_bytes_calldata(value2, value3, add(headStart, 96))\n }\n function abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 32))\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n diff := sub(x, y)\n if gt(diff, x) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_t_bytes32__to_t_bytes_memory_ptr_t_bytes32__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 64))\n mstore(add(headStart, 32), value2)\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_t_uint8__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 64))\n mstore(add(headStart, 32), and(value2, 0xff))\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_t_uint256_t_bool__to_t_bytes_memory_ptr_t_uint256_t_bool__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 96)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 96))\n mstore(add(headStart, 32), value2)\n mstore(add(headStart, 64), iszero(iszero(value3)))\n }\n function abi_encode_tuple_t_bytes32_t_bytes_calldata_ptr_slice__to_t_bytes32_t_bytes_memory_ptr__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes_calldata(value1, value2, add(headStart, 64))\n }\n function abi_decode_tuple_t_bytes4_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_bytes4(value)\n value0 := value\n }\n function abi_encode_tuple_packed_t_stringliteral_58d1832f15932b40f8da147bd99ac98efab990f25a786a2229b05ee5f5be41a7_t_bytes32_t_uint256_t_uint256__to_t_string_memory_ptr_t_bytes32_t_uint256_t_uint256__nonPadded_inplace_fromStack_reversed(pos, value2, value1, value0) -> end\n {\n mstore(pos, 0x53657175656e6365206e657374656420636f6e6669673a0a0000000000000000)\n mstore(add(pos, 24), value0)\n mstore(add(pos, 56), value1)\n mstore(add(pos, 88), value2)\n end := add(pos, 120)\n }\n function abi_encode_tuple_packed_t_stringliteral_583557e68bca91e5400591dbc9ae31043113c95e3cd985463ae532f51d706f8c_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x53657175656e636520737461746963206469676573743a0a0000000000000000)\n mstore(add(pos, 24), value0)\n end := add(pos, 56)\n }\n}", + "id": 22, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600436106100bc5760003560e01c806361c2926c116100745780638c3f55631161004e5780638c3f55631461025357806390042baf14610273578063affed0e0146102ab57600080fd5b806361c2926c146101cb5780637a9a1628146101eb578063853c50681461020b57600080fd5b806320c13b0b116100a557806320c13b0b14610147578063295614261461016757806357c56d6b1461018957600080fd5b806301ffc9a7146100c15780631626ba7e146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc366004611880565b6102c0565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b506101166101113660046118e6565b6102d1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ed565b34801561015357600080fd5b50610116610162366004611932565b61031e565b34801561017357600080fd5b5061018761018236600461199e565b610383565b005b34801561019557600080fd5b506101bd7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b6040519081526020016100ed565b3480156101d757600080fd5b506101876101e63660046119fc565b6103d5565b3480156101f757600080fd5b50610187610206366004611a3e565b61041a565b34801561021757600080fd5b5061022b6102263660046118e6565b610447565b604080519586526020860194909452928401919091526060830152608082015260a0016100ed565b34801561025f57600080fd5b506101bd61026e36600461199e565b61060f565b610286610281366004611ae7565b61063b565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b3480156102b757600080fd5b506101bd610725565b60006102cb82610736565b92915050565b6000806102df858585610792565b509050801561031157507f1626ba7e000000000000000000000000000000000000000000000000000000009050610317565b50600090505b9392505050565b6000806103438686604051610334929190611bb6565b60405180910390208585610792565b509050801561037557507f20c13b0b00000000000000000000000000000000000000000000000000000000905061037b565b50600090505b949350505050565b3330146103c9576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b6103d2816107ca565b50565b600061040883836040516020016103ed929190611d97565b604051602081830303815290604052805190602001206107fc565b9050610415818484610881565b505050565b600061043286866040516020016103ed929190611ddf565b905061043f818787610881565b505050505050565b6000806000806000808787600081811061046357610463611e27565b909101357fff000000000000000000000000000000000000000000000000000000000000001691508190506104b95761049b896107fc565b92506104a8838989610a0e565b929850909650945091506106049050565b7fff00000000000000000000000000000000000000000000000000000000000000818116016104f8576104eb896107fc565b92506104a8838989610a5f565b7ffe000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082160161054a576104eb89610a8b565b7ffd000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216016105ae5761059e898989610af8565b9550955095509550955050610604565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff00000000000000000000000000000000000000000000000000000000000000821660048201526024016103c0565b939792965093509350565b60006102cb7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610c75565b600033301461067e576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016103c0565b81516020830134f0905073ffffffffffffffffffffffffffffffffffffffff81166106d757816040517f0d2571910000000000000000000000000000000000000000000000000000000081526004016103c09190611eba565b60405173ffffffffffffffffffffffffffffffffffffffff821681527fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b6000610731600061060f565b905090565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161078957506001919050565b6102cb82610cd3565b60008060008060006107a5888888610447565b509650919450925090508282108015906107bd575060015b9450505050935093915050565b6040517fa038794000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b81811015610a0757368484838181106108a0576108a0611e27565b90506020028101906108b29190611ecd565b90506108c16020820182611f0b565b156108fb576040517f230d1ccc000000000000000000000000000000000000000000000000000000008152600481018390526024016103c0565b6040810135805a101561094e5782815a6040517f2bb3e3ba0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016103c0565b60006109886109636080850160608601611f26565b608085013584156109745784610976565b5a5b61098360a0880188611f41565b610d2f565b905080156109cf57877f5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7856040516109c291815260200190565b60405180910390a26109f1565b6109f16109e26040850160208601611f0b565b89866109ec610d4c565b610d6b565b50505080806109ff90611fd5565b915050610885565b5050505050565b6000808080610a2987610a24876006818b61200d565b610db9565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080610a7a87610a75876001818b61200d565b610a0e565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601610864565b6000808080806004600188013560e81c82610b138383612037565b9050610b258b61022683868d8f61200d565b939b5091995097509550935087871015610b7d57610b4581848b8d61200d565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c0949392919061204a565b8092505b88831015610c675760038301928a013560e81c9150610ba08383612037565b90506000610bc2610bb08861124f565b8c8c879086926102269392919061200d565b939c50919a5098509091505088881015610c1a57610be282858c8e61200d565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c0949392919061204a565b848110610c5d576040517f37daf62b00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016103c0565b9350915081610b81565b505050939792965093509350565b6000808383604051602001610c94929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610d2657506001919050565b6102cb82611283565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b8315610d7957805160208201fd5b827fab46c69f7f32e1bf09b0725853da82a211e5402a0600296ab499a2fb5ea3b4198383604051610dab929190612071565b60405180910390a250505050565b60008060005b8381101561124657600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101610e6057601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff000000000000000000000000000000000000000016811785610e465780610e55565b60008681526020829052604090205b955050505050610dbf565b80610ef65760018201918681013560f81c906043016000610e8c8a610e8784888c8e61200d565b61136d565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161786610edb5780610eea565b60008781526020829052604090205b96505050505050610dbf565b6002810361101e576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff169150809650819250505060008186019050610f6f8b848c8c8a908692610f6a9392919061200d565b611630565b610fb7578a83610f8183898d8f61200d565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016103c0949392919061208a565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617876110025780611011565b60008881526020829052604090205b9750505050505050610dbf565b60038103611051576020820191860135836110395780611048565b60008481526020829052604090205b93505050610dbf565b6004810361109d576003808301928781013560e81c919082010160008061107e8b610a2485898d8f61200d565b60009889526020526040909720969097019650909350610dbf92505050565b600681036111a55760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff16915080965081925050506000818601905060008061110b8d8d8d8b908792610a249392919061200d565b9398508893909250905084821061112157988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a90528351808403909101815260989092019092528051910120896111875780611196565b60008a81526020829052604090205b99505050505050505050610dbf565b600581036112115760208201918601358781036111e0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b60006111eb82611817565b9050846111f85780611207565b60008581526020829052604090205b9450505050610dbf565b6040517fb2505f7c000000000000000000000000000000000000000000000000000000008152600481018290526024016103c0565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d160009081526020829052604081206102cb565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e00000000000000000000000000000000000000000000000000000000148061131657507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b1561132357506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102cb565b6000604282146113ad5782826040517f2ee17a3d0000000000000000000000000000000000000000000000000000000081526004016103c09291906120ca565b60006113c66113bd6001856120de565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561143a578686826040517fad4aac760000000000000000000000000000000000000000000000000000000081526004016103c0939291906120f1565b8260ff16601b1415801561145257508260ff16601c14155b1561148f578686846040517fe578897e0000000000000000000000000000000000000000000000000000000081526004016103c093929190612115565b600184036114fc576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa1580156114eb573d6000803e3d6000fd5b5050506020604051035194506115d4565b60028403611599576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a0016114c9565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c0949392919061213c565b73ffffffffffffffffffffffffffffffffffffffff85166116255786866040517f6c1719d20000000000000000000000000000000000000000000000000000000081526004016103c09291906120ca565b505050509392505050565b600081810361166b576040517fac241e1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838361167a6001826120de565b81811061168957611689611e27565b919091013560f81c91505060018114806116a35750600281145b156116e8578473ffffffffffffffffffffffffffffffffffffffff166116ca87868661136d565b73ffffffffffffffffffffffffffffffffffffffff1614915061180e565b600381036117d35773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e878660008761171c6001826120de565b926117299392919061200d565b6040518463ffffffff1660e01b815260040161174793929190612168565b602060405180830381865afa158015611764573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611788919061218b565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014915061180e565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c0949392919061213c565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801610864565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146103d257600080fd5b60006020828403121561189257600080fd5b813561031781611852565b60008083601f8401126118af57600080fd5b50813567ffffffffffffffff8111156118c757600080fd5b6020830191508360208285010111156118df57600080fd5b9250929050565b6000806000604084860312156118fb57600080fd5b83359250602084013567ffffffffffffffff81111561191957600080fd5b6119258682870161189d565b9497909650939450505050565b6000806000806040858703121561194857600080fd5b843567ffffffffffffffff8082111561196057600080fd5b61196c8883890161189d565b9096509450602087013591508082111561198557600080fd5b506119928782880161189d565b95989497509550505050565b6000602082840312156119b057600080fd5b5035919050565b60008083601f8401126119c957600080fd5b50813567ffffffffffffffff8111156119e157600080fd5b6020830191508360208260051b85010111156118df57600080fd5b60008060208385031215611a0f57600080fd5b823567ffffffffffffffff811115611a2657600080fd5b611a32858286016119b7565b90969095509350505050565b600080600080600060608688031215611a5657600080fd5b853567ffffffffffffffff80821115611a6e57600080fd5b611a7a89838a016119b7565b9097509550602088013594506040880135915080821115611a9a57600080fd5b50611aa78882890161189d565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611af957600080fd5b813567ffffffffffffffff80821115611b1157600080fd5b818401915084601f830112611b2557600080fd5b813581811115611b3757611b37611ab8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b7d57611b7d611ab8565b81604052828152876020848701011115611b9657600080fd5b826020860160208301376000928101602001929092525095945050505050565b8183823760009101908152919050565b80358015158114611bd657600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bd657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b87811015611d8a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41883603018112611ca157600080fd5b870160c0611cae82611bc6565b15158652611cbd878301611bc6565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff611cef828501611bdb565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611d3557600080fd5b90920187810192903567ffffffffffffffff811115611d5357600080fd5b803603841315611d6257600080fd5b8282890152611d748389018286611bff565b9c89019c97505050928601925050600101611c62565b5091979650505050505050565b60408152600560408201527f73656c663a000000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611c48565b60408152600660408201527f67756573743a0000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611c48565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b81811015611e7c57602081850181015186830182015201611e60565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006103176020830184611e56565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112611f0157600080fd5b9190910192915050565b600060208284031215611f1d57600080fd5b61031782611bc6565b600060208284031215611f3857600080fd5b61031782611bdb565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f7657600080fd5b83018035915067ffffffffffffffff821115611f9157600080fd5b6020019150368190038213156118df57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361200657612006611fa6565b5060010190565b6000808585111561201d57600080fd5b8386111561202a57600080fd5b5050820193919092039150565b808201808211156102cb576102cb611fa6565b60608152600061205e606083018688611bff565b6020830194909452506040015292915050565b82815260406020820152600061037b6040830184611e56565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006120c0606083018486611bff565b9695505050505050565b60208152600061037b602083018486611bff565b818103818111156102cb576102cb611fa6565b604081526000612105604083018587611bff565b9050826020830152949350505050565b604081526000612129604083018587611bff565b905060ff83166020830152949350505050565b606081526000612150606083018688611bff565b60208301949094525090151560409091015292915050565b838152604060208201526000612182604083018486611bff565b95945050505050565b60006020828403121561219d57600080fd5b81516103178161185256fea26469706673582212209bb95d18e97f278aa47e0c04c20d5a6af9bdb6d473c6d4051192cd96fc17866864736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xBC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x61C2926C GT PUSH2 0x74 JUMPI DUP1 PUSH4 0x8C3F5563 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x8C3F5563 EQ PUSH2 0x253 JUMPI DUP1 PUSH4 0x90042BAF EQ PUSH2 0x273 JUMPI DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x61C2926C EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x7A9A1628 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0x853C5068 EQ PUSH2 0x20B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x20C13B0B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x20C13B0B EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0x29561426 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x57C56D6B EQ PUSH2 0x189 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xC1 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0xF6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE1 PUSH2 0xDC CALLDATASIZE PUSH1 0x4 PUSH2 0x1880 JUMP JUMPDEST PUSH2 0x2C0 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x116 PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x18E6 JUMP JUMPDEST PUSH2 0x2D1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x116 PUSH2 0x162 CALLDATASIZE PUSH1 0x4 PUSH2 0x1932 JUMP JUMPDEST PUSH2 0x31E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x182 CALLDATASIZE PUSH1 0x4 PUSH2 0x199E JUMP JUMPDEST PUSH2 0x383 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH32 0x8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x19FC JUMP JUMPDEST PUSH2 0x3D5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x206 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A3E JUMP JUMPDEST PUSH2 0x41A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH2 0x226 CALLDATASIZE PUSH1 0x4 PUSH2 0x18E6 JUMP JUMPDEST PUSH2 0x447 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH2 0x26E CALLDATASIZE PUSH1 0x4 PUSH2 0x199E JUMP JUMPDEST PUSH2 0x60F JUMP JUMPDEST PUSH2 0x286 PUSH2 0x281 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AE7 JUMP JUMPDEST PUSH2 0x63B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH2 0x725 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB DUP3 PUSH2 0x736 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2DF DUP6 DUP6 DUP6 PUSH2 0x792 JUMP JUMPDEST POP SWAP1 POP DUP1 ISZERO PUSH2 0x311 JUMPI POP PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0x317 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x343 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH2 0x334 SWAP3 SWAP2 SWAP1 PUSH2 0x1BB6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP6 DUP6 PUSH2 0x792 JUMP JUMPDEST POP SWAP1 POP DUP1 ISZERO PUSH2 0x375 JUMPI POP PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0x37B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x3C9 JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3D2 DUP2 PUSH2 0x7CA JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x408 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3ED SWAP3 SWAP2 SWAP1 PUSH2 0x1D97 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x7FC JUMP JUMPDEST SWAP1 POP PUSH2 0x415 DUP2 DUP5 DUP5 PUSH2 0x881 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x432 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3ED SWAP3 SWAP2 SWAP1 PUSH2 0x1DDF JUMP JUMPDEST SWAP1 POP PUSH2 0x43F DUP2 DUP8 DUP8 PUSH2 0x881 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP8 DUP8 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0x463 JUMPI PUSH2 0x463 PUSH2 0x1E27 JUMP JUMPDEST SWAP1 SWAP2 ADD CALLDATALOAD PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 AND SWAP2 POP DUP2 SWAP1 POP PUSH2 0x4B9 JUMPI PUSH2 0x49B DUP10 PUSH2 0x7FC JUMP JUMPDEST SWAP3 POP PUSH2 0x4A8 DUP4 DUP10 DUP10 PUSH2 0xA0E JUMP JUMPDEST SWAP3 SWAP9 POP SWAP1 SWAP7 POP SWAP5 POP SWAP2 POP PUSH2 0x604 SWAP1 POP JUMP JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP2 DUP2 AND ADD PUSH2 0x4F8 JUMPI PUSH2 0x4EB DUP10 PUSH2 0x7FC JUMP JUMPDEST SWAP3 POP PUSH2 0x4A8 DUP4 DUP10 DUP10 PUSH2 0xA5F JUMP JUMPDEST PUSH32 0xFE00000000000000000000000000000000000000000000000000000000000000 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x54A JUMPI PUSH2 0x4EB DUP10 PUSH2 0xA8B JUMP JUMPDEST PUSH32 0xFD00000000000000000000000000000000000000000000000000000000000000 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x5AE JUMPI PUSH2 0x59E DUP10 DUP10 DUP10 PUSH2 0xAF8 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP POP PUSH2 0x604 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6085CD8200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST SWAP4 SWAP8 SWAP3 SWAP7 POP SWAP4 POP SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB PUSH32 0x8D0BF1FD623D628C741362C1289948E57B3E2905218C676D3E69ABEE36D6AE2E DUP4 PUSH2 0xC75 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x67E JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x3C0 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD CALLVALUE CREATE SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x6D7 JUMPI DUP2 PUSH1 0x40 MLOAD PUSH32 0xD25719100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP2 SWAP1 PUSH2 0x1EBA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0xA506AD4E7F05ECEBA62A023C3219E5BD98A615F4FA87E2AFB08A2DA5CF62BF0C SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x731 PUSH1 0x0 PUSH2 0x60F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x6FFBD45100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0x789 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CB DUP3 PUSH2 0xCD3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x7A5 DUP9 DUP9 DUP9 PUSH2 0x447 JUMP JUMPDEST POP SWAP7 POP SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP DUP3 DUP3 LT DUP1 ISZERO SWAP1 PUSH2 0x7BD JUMPI POP PUSH1 0x1 JUMPDEST SWAP5 POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA038794000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE CHAINID PUSH1 0x22 DUP3 ADD MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 ADDRESS PUSH1 0x60 SHL AND PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x56 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x76 ADD JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA07 JUMPI CALLDATASIZE DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x8A0 JUMPI PUSH2 0x8A0 PUSH2 0x1E27 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x8B2 SWAP2 SWAP1 PUSH2 0x1ECD JUMP JUMPDEST SWAP1 POP PUSH2 0x8C1 PUSH1 0x20 DUP3 ADD DUP3 PUSH2 0x1F0B JUMP JUMPDEST ISZERO PUSH2 0x8FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x230D1CCC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP1 GAS LT ISZERO PUSH2 0x94E JUMPI DUP3 DUP2 GAS PUSH1 0x40 MLOAD PUSH32 0x2BB3E3BA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x988 PUSH2 0x963 PUSH1 0x80 DUP6 ADD PUSH1 0x60 DUP7 ADD PUSH2 0x1F26 JUMP JUMPDEST PUSH1 0x80 DUP6 ADD CALLDATALOAD DUP5 ISZERO PUSH2 0x974 JUMPI DUP5 PUSH2 0x976 JUMP JUMPDEST GAS JUMPDEST PUSH2 0x983 PUSH1 0xA0 DUP9 ADD DUP9 PUSH2 0x1F41 JUMP JUMPDEST PUSH2 0xD2F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x9CF JUMPI DUP8 PUSH32 0x5C4EEB02DABF8976016AB414D617F9A162936DCACE3CDEF8C69EF6E262AD5AE7 DUP6 PUSH1 0x40 MLOAD PUSH2 0x9C2 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x9F1 JUMP JUMPDEST PUSH2 0x9F1 PUSH2 0x9E2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F0B JUMP JUMPDEST DUP10 DUP7 PUSH2 0x9EC PUSH2 0xD4C JUMP JUMPDEST PUSH2 0xD6B JUMP JUMPDEST POP POP POP DUP1 DUP1 PUSH2 0x9FF SWAP1 PUSH2 0x1FD5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x885 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xA29 DUP8 PUSH2 0xA24 DUP8 PUSH1 0x6 DUP2 DUP12 PUSH2 0x200D JUMP JUMPDEST PUSH2 0xDB9 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE DUP8 CALLDATALOAD PUSH1 0xF0 SHR PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP5 MSTORE PUSH1 0x2 SWAP1 SWAP11 ADD CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 SWAP1 MSTORE SWAP9 SWAP1 SWAP2 KECCAK256 SWAP1 SWAP10 SWAP2 SWAP9 POP SWAP7 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xA7A DUP8 PUSH2 0xA75 DUP8 PUSH1 0x1 DUP2 DUP12 PUSH2 0x200D JUMP JUMPDEST PUSH2 0xA0E JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x22 DUP3 ADD DUP2 SWAP1 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 ADDRESS PUSH1 0x60 SHL AND PUSH1 0x42 DUP4 ADD MSTORE PUSH1 0x56 DUP3 ADD DUP4 SWAP1 MSTORE SWAP1 PUSH1 0x76 ADD PUSH2 0x864 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH1 0x4 PUSH1 0x1 DUP9 ADD CALLDATALOAD PUSH1 0xE8 SHR DUP3 PUSH2 0xB13 DUP4 DUP4 PUSH2 0x2037 JUMP JUMPDEST SWAP1 POP PUSH2 0xB25 DUP12 PUSH2 0x226 DUP4 DUP7 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP12 POP SWAP2 SWAP10 POP SWAP8 POP SWAP6 POP SWAP4 POP DUP8 DUP8 LT ISZERO PUSH2 0xB7D JUMPI PUSH2 0xB45 DUP2 DUP5 DUP12 DUP14 PUSH2 0x200D JUMP JUMPDEST DUP10 DUP10 PUSH1 0x40 MLOAD PUSH32 0xB006ABA000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x204A JUMP JUMPDEST DUP1 SWAP3 POP JUMPDEST DUP9 DUP4 LT ISZERO PUSH2 0xC67 JUMPI PUSH1 0x3 DUP4 ADD SWAP3 DUP11 ADD CALLDATALOAD PUSH1 0xE8 SHR SWAP2 POP PUSH2 0xBA0 DUP4 DUP4 PUSH2 0x2037 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xBC2 PUSH2 0xBB0 DUP9 PUSH2 0x124F JUMP JUMPDEST DUP13 DUP13 DUP8 SWAP1 DUP7 SWAP3 PUSH2 0x226 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP1 SWAP2 POP POP DUP9 DUP9 LT ISZERO PUSH2 0xC1A JUMPI PUSH2 0xBE2 DUP3 DUP6 DUP13 DUP15 PUSH2 0x200D JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD PUSH32 0xB006ABA000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x204A JUMP JUMPDEST DUP5 DUP2 LT PUSH2 0xC5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x37DAF62B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x3C0 JUMP JUMPDEST SWAP4 POP SWAP2 POP DUP2 PUSH2 0xB81 JUMP JUMPDEST POP POP POP SWAP4 SWAP8 SWAP3 SWAP7 POP SWAP4 POP SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xC94 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xE4A77BBC00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0xD26 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CB DUP3 PUSH2 0x1283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP3 DUP5 DUP3 CALLDATACOPY PUSH1 0x0 DUP1 DUP5 DUP4 DUP10 DUP12 DUP11 CALL SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 RETURNDATASIZE PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x20 DUP3 ADD DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP4 MSTORE DUP2 PUSH1 0x0 DUP3 RETURNDATACOPY POP POP SWAP1 JUMP JUMPDEST DUP4 ISZERO PUSH2 0xD79 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP3 PUSH32 0xAB46C69F7F32E1BF09B0725853DA82A211E5402A0600296AB499A2FB5EA3B419 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0xDAB SWAP3 SWAP2 SWAP1 PUSH2 0x2071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1246 JUMPI PUSH1 0x1 DUP2 ADD SWAP1 DUP6 ADD CALLDATALOAD PUSH1 0xF8 SHR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD PUSH2 0xE60 JUMPI PUSH1 0x15 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD PUSH1 0xF8 DUP2 SWAP1 SHR SWAP1 PUSH1 0x58 SHR PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 PUSH21 0xFF0000000000000000000000000000000000000000 AND DUP2 OR DUP6 PUSH2 0xE46 JUMPI DUP1 PUSH2 0xE55 JUMP JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP6 POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST DUP1 PUSH2 0xEF6 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 DUP7 DUP2 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP1 PUSH1 0x43 ADD PUSH1 0x0 PUSH2 0xE8C DUP11 PUSH2 0xE87 DUP5 DUP9 DUP13 DUP15 PUSH2 0x200D JUMP JUMPDEST PUSH2 0x136D JUMP JUMPDEST PUSH1 0xFF DUP5 AND SWAP8 SWAP1 SWAP8 ADD SWAP7 SWAP2 SWAP5 POP DUP5 SWAP2 SWAP1 POP PUSH1 0xA0 DUP4 SWAP1 SHL PUSH21 0xFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND OR DUP7 PUSH2 0xEDB JUMPI DUP1 PUSH2 0xEEA JUMP JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP7 POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x2 DUP2 SUB PUSH2 0x101E JUMPI PUSH1 0x0 DUP1 DUP8 DUP5 ADD CALLDATALOAD PUSH1 0xF8 DUP2 SWAP1 SHR SWAP1 PUSH1 0x58 SHR PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x15 DUP7 ADD SWAP6 POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP9 DUP6 ADD CALLDATALOAD PUSH1 0xE8 SHR PUSH1 0x3 DUP7 ADD DUP2 PUSH3 0xFFFFFF AND SWAP2 POP DUP1 SWAP7 POP DUP2 SWAP3 POP POP POP PUSH1 0x0 DUP2 DUP7 ADD SWAP1 POP PUSH2 0xF6F DUP12 DUP5 DUP13 DUP13 DUP11 SWAP1 DUP7 SWAP3 PUSH2 0xF6A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST PUSH2 0x1630 JUMP JUMPDEST PUSH2 0xFB7 JUMPI DUP11 DUP4 PUSH2 0xF81 DUP4 DUP10 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9A94623200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x208A JUMP JUMPDEST PUSH1 0xFF DUP5 AND SWAP8 SWAP1 SWAP8 ADD SWAP7 SWAP5 POP DUP5 PUSH1 0xA0 DUP5 SWAP1 SHL PUSH21 0xFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND OR DUP8 PUSH2 0x1002 JUMPI DUP1 PUSH2 0x1011 JUMP JUMPDEST PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP8 POP POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x3 DUP2 SUB PUSH2 0x1051 JUMPI PUSH1 0x20 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD DUP4 PUSH2 0x1039 JUMPI DUP1 PUSH2 0x1048 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP4 POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x4 DUP2 SUB PUSH2 0x109D JUMPI PUSH1 0x3 DUP1 DUP4 ADD SWAP3 DUP8 DUP2 ADD CALLDATALOAD PUSH1 0xE8 SHR SWAP2 SWAP1 DUP3 ADD ADD PUSH1 0x0 DUP1 PUSH2 0x107E DUP12 PUSH2 0xA24 DUP6 DUP10 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x0 SWAP9 DUP10 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP8 KECCAK256 SWAP7 SWAP1 SWAP8 ADD SWAP7 POP SWAP1 SWAP4 POP PUSH2 0xDBF SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 DUP2 SUB PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP3 DUP8 ADD CALLDATALOAD PUSH1 0xF8 SHR PUSH1 0x1 DUP5 ADD SWAP4 POP PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP8 DUP5 ADD CALLDATALOAD PUSH1 0xF0 SHR PUSH1 0x2 DUP6 ADD SWAP5 POP PUSH2 0xFFFF AND SWAP1 POP PUSH1 0x0 DUP9 DUP6 ADD CALLDATALOAD PUSH1 0xE8 SHR PUSH1 0x3 DUP7 ADD DUP2 PUSH3 0xFFFFFF AND SWAP2 POP DUP1 SWAP7 POP DUP2 SWAP3 POP POP POP PUSH1 0x0 DUP2 DUP7 ADD SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x110B DUP14 DUP14 DUP14 DUP12 SWAP1 DUP8 SWAP3 PUSH2 0xA24 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP9 POP DUP9 SWAP4 SWAP1 SWAP3 POP SWAP1 POP DUP5 DUP3 LT PUSH2 0x1121 JUMPI SWAP9 DUP6 ADD SWAP9 JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x53657175656E6365206E657374656420636F6E6669673A0A0000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x38 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x58 DUP3 ADD DUP9 SWAP1 MSTORE PUSH1 0x78 DUP1 DUP4 ADD DUP11 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x98 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 DUP10 PUSH2 0x1187 JUMPI DUP1 PUSH2 0x1196 JUMP JUMPDEST PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP10 POP POP POP POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x5 DUP2 SUB PUSH2 0x1211 JUMPI PUSH1 0x20 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD DUP8 DUP2 SUB PUSH2 0x11E0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 POP JUMPDEST PUSH1 0x0 PUSH2 0x11EB DUP3 PUSH2 0x1817 JUMP JUMPDEST SWAP1 POP DUP5 PUSH2 0x11F8 JUMPI DUP1 PUSH2 0x1207 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP5 POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB2505F7C00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2CB JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0xAC6A444E00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x1316 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x36E7817500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x1323 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND EQ PUSH2 0x2CB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x42 DUP3 EQ PUSH2 0x13AD JUMPI DUP3 DUP3 PUSH1 0x40 MLOAD PUSH32 0x2EE17A3D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP3 SWAP2 SWAP1 PUSH2 0x20CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13C6 PUSH2 0x13BD PUSH1 0x1 DUP6 PUSH2 0x20DE JUMP JUMPDEST DUP6 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH1 0xF8 SHR DUP5 CALLDATALOAD PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP2 GT ISZERO PUSH2 0x143A JUMPI DUP7 DUP7 DUP3 PUSH1 0x40 MLOAD PUSH32 0xAD4AAC7600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x20F1 JUMP JUMPDEST DUP3 PUSH1 0xFF AND PUSH1 0x1B EQ ISZERO DUP1 ISZERO PUSH2 0x1452 JUMPI POP DUP3 PUSH1 0xFF AND PUSH1 0x1C EQ ISZERO JUMPDEST ISZERO PUSH2 0x148F JUMPI DUP7 DUP7 DUP5 PUSH1 0x40 MLOAD PUSH32 0xE578897E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2115 JUMP JUMPDEST PUSH1 0x1 DUP5 SUB PUSH2 0x14FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 DUP4 MSTORE DUP11 SWAP1 MSTORE PUSH1 0xFF DUP6 AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x14EB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP5 POP PUSH2 0x15D4 JUMP JUMPDEST PUSH1 0x2 DUP5 SUB PUSH2 0x1599 JUMPI PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP10 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x0 DUP5 MSTORE SWAP1 DUP4 ADD DUP1 DUP4 MSTORE MSTORE PUSH1 0xFF DUP7 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH2 0x14C9 JUMP JUMPDEST DUP7 DUP7 DUP6 PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x9DFBA85200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x213C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x1625 JUMPI DUP7 DUP7 PUSH1 0x40 MLOAD PUSH32 0x6C1719D200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP3 SWAP2 SWAP1 PUSH2 0x20CA JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 SUB PUSH2 0x166B JUMPI PUSH1 0x40 MLOAD PUSH32 0xAC241E1100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP4 PUSH2 0x167A PUSH1 0x1 DUP3 PUSH2 0x20DE JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x1689 JUMPI PUSH2 0x1689 PUSH2 0x1E27 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP2 POP POP PUSH1 0x1 DUP2 EQ DUP1 PUSH2 0x16A3 JUMPI POP PUSH1 0x2 DUP2 EQ JUMPDEST ISZERO PUSH2 0x16E8 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x16CA DUP8 DUP7 DUP7 PUSH2 0x136D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP2 POP PUSH2 0x180E JUMP JUMPDEST PUSH1 0x3 DUP2 SUB PUSH2 0x17D3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH4 0x1626BA7E DUP8 DUP7 PUSH1 0x0 DUP8 PUSH2 0x171C PUSH1 0x1 DUP3 PUSH2 0x20DE JUMP JUMPDEST SWAP3 PUSH2 0x1729 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1747 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2168 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1764 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1788 SWAP2 SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 EQ SWAP2 POP PUSH2 0x180E JUMP JUMPDEST DUP4 DUP4 DUP3 PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0x9DFBA85200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x213C JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x53657175656E636520737461746963206469676573743A0A0000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x38 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x58 ADD PUSH2 0x864 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1892 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x317 DUP2 PUSH2 0x1852 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x18AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x18C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x18FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1919 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1925 DUP7 DUP3 DUP8 ADD PUSH2 0x189D JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1948 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1960 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x196C DUP9 DUP4 DUP10 ADD PUSH2 0x189D JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1992 DUP8 DUP3 DUP9 ADD PUSH2 0x189D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x19C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A32 DUP6 DUP3 DUP7 ADD PUSH2 0x19B7 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1A56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1A6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A7A DUP10 DUP4 DUP11 ADD PUSH2 0x19B7 JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AA7 DUP9 DUP3 DUP10 ADD PUSH2 0x189D JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1AF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1B37 JUMPI PUSH2 0x1B37 PUSH2 0x1AB8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1B7D JUMPI PUSH2 0x1B7D PUSH2 0x1AB8 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1B96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x0 PUSH1 0x20 DUP1 DUP6 ADD DUP1 DUP2 SWAP7 POP DUP6 PUSH1 0x5 SHL DUP2 ADD SWAP2 POP DUP5 PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x1D8A JUMPI DUP3 DUP5 SUB DUP10 MSTORE DUP2 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 DUP9 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1CA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 ADD PUSH1 0xC0 PUSH2 0x1CAE DUP3 PUSH2 0x1BC6 JUMP JUMPDEST ISZERO ISZERO DUP7 MSTORE PUSH2 0x1CBD DUP8 DUP4 ADD PUSH2 0x1BC6 JUMP JUMPDEST ISZERO ISZERO DUP7 DUP9 ADD MSTORE PUSH1 0x40 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1CEF DUP3 DUP6 ADD PUSH2 0x1BDB JUMP JUMPDEST AND SWAP1 DUP8 ADD MSTORE PUSH1 0x80 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP8 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD CALLDATALOAD CALLDATASIZE DUP5 SWAP1 SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 ADD DUP2 SLT PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 ADD DUP8 DUP2 ADD SWAP3 SWAP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP5 SGT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP3 DUP10 ADD MSTORE PUSH2 0x1D74 DUP4 DUP10 ADD DUP3 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP13 DUP10 ADD SWAP13 SWAP8 POP POP POP SWAP3 DUP7 ADD SWAP3 POP POP PUSH1 0x1 ADD PUSH2 0x1C62 JUMP JUMPDEST POP SWAP2 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x5 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x73656C663A000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x1C48 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x6 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x67756573743A0000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x1C48 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1E7C JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1E60 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x317 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E56 JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1F01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x317 DUP3 PUSH2 0x1BC6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x317 DUP3 PUSH2 0x1BDB JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1F76 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1F91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2006 JUMPI PUSH2 0x2006 PUSH2 0x1FA6 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x201D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x202A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x2CB JUMPI PUSH2 0x2CB PUSH2 0x1FA6 JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x205E PUSH1 0x60 DUP4 ADD DUP7 DUP9 PUSH2 0x1BFF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x40 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1E56 JUMP JUMPDEST DUP5 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x20C0 PUSH1 0x60 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x2CB JUMPI PUSH2 0x2CB PUSH2 0x1FA6 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2105 PUSH1 0x40 DUP4 ADD DUP6 DUP8 PUSH2 0x1BFF JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2129 PUSH1 0x40 DUP4 ADD DUP6 DUP8 PUSH2 0x1BFF JUMP JUMPDEST SWAP1 POP PUSH1 0xFF DUP4 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2150 PUSH1 0x60 DUP4 ADD DUP7 DUP9 PUSH2 0x1BFF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP SWAP1 ISZERO ISZERO PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x2182 PUSH1 0x40 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x219D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x317 DUP2 PUSH2 0x1852 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP12 0xB9 0x5D XOR 0xE9 PUSH32 0x278AA47E0C04C20D5A6AF9BDB6D473C6D4051192CD96FC17866864736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "640:2693:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3127:204;;;;;;;;;;-1:-1:-1;3127:204:1;;;;;:::i;:::-;;:::i;:::-;;;611:14:22;;604:22;586:41;;574:2;559:18;3127:204:1;;;;;;;;5489:316:2;;;;;;;;;;-1:-1:-1;5489:316:2;;;;;:::i;:::-;;:::i;:::-;;;1646:66:22;1634:79;;;1616:98;;1604:2;1589:18;5489:316:2;1472:248:22;4525:332:2;;;;;;;;;;-1:-1:-1;4525:332:2;;;;;:::i;:::-;;:::i;6456:119::-;;;;;;;;;;-1:-1:-1;6456:119:2;;;;;:::i;:::-;;:::i;:::-;;811:95:14;;;;;;;;;;;;862:44;811:95;;;;;2778:25:22;;;2766:2;2751:18;811:95:14;2632:177:22;1290:262:1;;;;;;;;;;-1:-1:-1;1290:262:1;;;;;:::i;:::-;;:::i;890:292::-;;;;;;;;;;-1:-1:-1;890:292:1;;;;;:::i;:::-;;:::i;1675:1486:2:-;;;;;;;;;;-1:-1:-1;1675:1486:2;;;;;:::i;:::-;;:::i;:::-;;;;4827:25:22;;;4883:2;4868:18;;4861:34;;;;4911:18;;;4904:34;;;;4969:2;4954:18;;4947:34;5012:3;4997:19;;4990:35;4814:3;4799:19;1675:1486:2;4568:463:22;938:156:6;;;;;;;;;;-1:-1:-1;938:156:6;;;;;:::i;:::-;;:::i;456:276:4:-;;;;;;:::i;:::-;;:::i;:::-;;;6753:42:22;6741:55;;;6723:74;;6711:2;6696:18;456:276:4;6577:226:22;670:87:6;;;;;;;;;;;;;:::i;3127:204:1:-;3270:4;3289:37;3313:12;3289:23;:37::i;:::-;3282:44;3127:204;-1:-1:-1;;3127:204:1:o;5489:316:2:-;5608:6;5650:12;5667:40;5688:5;5695:11;;5667:20;:40::i;:::-;5649:58;;;5717:7;5713:65;;;-1:-1:-1;5741:30:2;;-1:-1:-1;5734:37:2;;5713:65;-1:-1:-1;5798:1:2;;-1:-1:-1;5489:316:2;;;;;;:::o;4525:332::-;4651:6;4693:12;4710:51;4741:5;;4731:16;;;;;;;:::i;:::-;;;;;;;;4749:11;;4710:20;:51::i;:::-;4692:69;;;4771:7;4767:63;;;-1:-1:-1;4795:28:2;;-1:-1:-1;4788:35:2;;4767:63;-1:-1:-1;4850:1:2;;-1:-1:-1;4525:332:2;;;;;;;:::o;6456:119::-;178:10:8;200:4;178:27;174:94;;222:39;;;;;235:10;222:39;;;7319:34:22;255:4:8;7369:18:22;;;7362:43;7231:18;;222:39:8;;;;;;;;174:94;6542:28:2::1;6559:10;6542:16;:28::i;:::-;6456:119:::0;:::o;1290:262:1:-;1401:14;1418:63;1474:4;;1454:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1444:36;;;;;;1418:25;:63::i;:::-;1401:80;;1520:27;1534:6;1542:4;;1520:13;:27::i;:::-;1364:188;1290:262;;:::o;890:292::-;1030:14;1047:64;1104:4;;1083:26;;;;;;;;;:::i;1047:64::-;1030:81;;1150:27;1164:6;1172:4;;1150:13;:27::i;:::-;993:189;890:292;;;;;:::o;1675:1486:2:-;1801:17;1824:14;1844:17;1867;1890:18;1919:20;1942:10;;1953:1;1942:13;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;1942:13:2;;-1:-1:-1;1962:303:2;;2057:34;2083:7;2057:25;:34::i;:::-;2045:46;;2144;2168:9;2179:10;;2144:23;:46::i;:::-;2099:91;;-1:-1:-1;2099:91:2;;-1:-1:-1;2099:91:2;-1:-1:-1;2099:91:2;-1:-1:-1;2198:60:2;;-1:-1:-1;2198:60:2;1962:303;2275:29;;;;;2271:310;;2370:34;2396:7;2370:25;:34::i;:::-;2358:46;;2457:49;2484:9;2495:10;;2457:26;:49::i;2271:310::-;2591:33;;;;;2587:319;;2690:39;2721:7;2690:30;:39::i;2587:319::-;2916:29;;;;;2912:196;;3066:35;3081:7;3090:10;;3066:14;:35::i;:::-;3059:42;;;;;;;;;;;;;2912:196;3121:35;;;;;11707:66:22;11695:79;;3121:35:2;;;11677:98:22;11650:18;;3121:35:2;11533:248:22;1675:1486:2;;;;;;;;;;:::o;938:156:6:-;1002:7;1032:56;453:66;1080:6;1032:28;:56::i;456:276:4:-;550:12;178:10:8;200:4;178:27;174:94;;222:39;;;;;235:10;222:39;;;7319:34:22;255:4:8;7369:18:22;;;7362:43;7231:18;;222:39:8;7084:327:22;174:94:8;631:5:4::1;625:12;620:2;613:5;609:14;596:11;589:49;581:57:::0;-1:-1:-1;649:18:4::1;::::0;::::1;645:50;;689:5;676:19;;;;;;;;;;;:::i;645:50::-;706:21;::::0;6753:42:22;6741:55;;6723:74;;706:21:4::1;::::0;6711:2:22;6696:18;706:21:4::1;;;;;;;456:276:::0;;;:::o;670:87:6:-;718:7;740:12;750:1;740:9;:12::i;:::-;733:19;;670:87;:::o;942:233:4:-;1028:4;1044:48;;;;;1040:80;;-1:-1:-1;1109:4:4;;942:233;-1:-1:-1;942:233:4:o;1040:80::-;1133:37;1157:12;1133:23;:37::i;3480:386:2:-;3611:12;3629:17;3657;3676:14;3692:17;3760:38;3778:7;3787:10;;3760:17;:38::i;:::-;-1:-1:-1;3715:83:2;-1:-1:-1;3715:83:2;;-1:-1:-1;3715:83:2;-1:-1:-1;3715:83:2;-1:-1:-1;3814:19:2;;;;;;:47;;-1:-1:-1;2779:4:1;3837:24:2;3804:57;;3651:215;;;3480:386;;;;;;:::o;2824:93:1:-;2898:14;;;;;;;;;;;;;;1173:224:13;1279:107;;12792:66:22;1279:107:13;;;12780:79:22;1325:13:13;12875:11:22;;;12868:27;12946:66;1356:4:13;12933:2:22;12929:15;12925:88;12911:12;;;12904:110;13030:12;;;13023:28;;;1240:7:13;;13067:12:22;;1279:107:13;;;;;;;;;;;;;1262:130;;;;;;1255:137;;1173:224;;;:::o;1710:834:1:-;1847:4;1832:12;1864:676;1888:4;1884:1;:8;1864:676;;;1907:32;1942:4;;1947:1;1942:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;1907:42;-1:-1:-1;1962:24:1;;;;1907:42;1962:24;:::i;:::-;1958:62;;;1995:25;;;;;;;;2778::22;;;2751:18;;1995:25:1;2632:177:22;1958:62:1;2048:20;;;;;2080:9;:20;2076:69;;;2122:1;2125:8;2135:9;2109:36;;;;;;;;13869:25:22;;;;13910:18;;;13903:34;;;;13953:18;;;13946:34;13842:18;;2109:36:1;13667:319:22;2076:69:1;2154:12;2169:148;2192:18;;;;;;;;:::i;:::-;2220:17;;;;2247:13;;:36;;2275:8;2247:36;;;2263:9;2247:36;2293:16;;;;:11;:16;:::i;:::-;2169:13;:148::i;:::-;2154:163;;2330:7;2326:208;;;2365:7;2354:22;2374:1;2354:22;;;;2778:25:22;;2766:2;2751:18;;2632:177;2354:22:1;;;;;;;;2326:208;;;2401:124;2425:25;;;;;;;;:::i;:::-;2462:7;2481:1;2494:21;:19;:21::i;:::-;2401:12;:124::i;:::-;1899:641;;;1894:3;;;;;:::i;:::-;;;;1864:676;;;;1799:745;1710:834;;;:::o;8892:642:13:-;8996:17;;;;9131:41;9145:10;9157:14;:10;9168:1;9157:10;;:14;:::i;:::-;9131:13;:41::i;:::-;622:9:20;656:13;;;1585:25:18;;1626:3;1622:14;683:2:20;676:14;;;715:2;702:16;;;656:13;;9379:1:13;2034:23:18;;;2021:37;2074:3;2070:14;676::20;;;;702:16;;;;1622:14:18;;9109:63:13;;-1:-1:-1;702:16:20;2070:14:18;-1:-1:-1;8892:642:13;-1:-1:-1;;;;8892:642:13:o;648:262:15:-;752:17;;;;854:51;878:10;890:14;:10;901:1;890:10;;:14;:::i;:::-;854:23;:51::i;:::-;847:58;;;;;;;;648:262;;;;;;;:::o;404:213:16:-;502:104;;12792:66:22;502:104:16;;;12780:79:22;463:7:16;12875:11:22;;;12868:27;;;12946:66;576:4:16;12933:2:22;12929:15;12925:88;12911:12;;;12904:110;13030:12;;;13023:28;;;463:7:16;13067:12:22;;502:104:16;12494:591:22;2320:2059:14;2428:17;;;;;3378:14:19;2563:1:14;3290:25:19;;3277:39;3336:3;3332:14;2428:17:14;2768:16;3378:14:19;3332;2768:16:14;:::i;:::-;2750:34;-1:-1:-1;2883:72:14;2908:7;2923:26;2750:34;2934:6;2923:10;;:26;:::i;2883:72::-;2791:164;;-1:-1:-1;2791:164:14;;-1:-1:-1;2791:164:14;-1:-1:-1;2791:164:14;-1:-1:-1;2791:164:14;-1:-1:-1;2966:18:14;;;2962:118;;;3027:26;3045:7;3038:6;3027:10;;:26;:::i;:::-;3055:9;3066:6;3001:72;;;;;;;;;;;;;;:::i;2962:118::-;3095:7;3086:16;;3283:1092;3290:26;;;3283:1092;;;3390:1:19;3378:14;;;3290:25;;3277:39;3336:3;3332:14;;-1:-1:-1;3444:16:14;3378:14:19;3332;3444:16:14;:::i;:::-;3434:26;;3469:22;3687:105;3714:34;3738:9;3714:23;:34::i;:::-;3758:10;;3769:6;3758:26;3776:7;3758:26;;;;;;;:::i;3687:105::-;3500:292;;-1:-1:-1;3500:292:14;;-1:-1:-1;3500:292:14;-1:-1:-1;3500:292:14;;-1:-1:-1;;3833:18:14;;;3829:122;;;3896:26;3914:7;3907:6;3896:10;;:26;:::i;:::-;3924:9;3935:6;3870:72;;;;;;;;;;;;;;:::i;3829:122::-;4216:10;4198:14;:28;4194:115;;4245:55;;;;;;;;16193:25:22;;;16234:18;;;16227:34;;;16166:18;;4245:55:14;16019:248:22;4194:115:14;4330:14;-1:-1:-1;4361:7:14;-1:-1:-1;4361:7:14;3283:1092;;;2540:1839;;;2320:2059;;;;;;;;;:::o;490:187:9:-;568:11;587;622:4;628:7;611:25;;;;;;;;16193::22;;;16249:2;16234:18;;16227:34;16181:2;16166:18;;16019:248;611:25:9;;;;;;;;;;;;;;601:36;;611:25;601:36;;;;661:10;;490:187;-1:-1:-1;;;;490:187:9:o;4140:231:3:-;4226:4;4242:46;;;;;4238:78;;-1:-1:-1;4305:4:3;;4140:231;-1:-1:-1;4140:231:3:o;4238:78::-;4329:37;4353:12;4329:23;:37::i;1525:353:20:-;1640:6;1688:4;1682:11;1732:12;1718;1713:3;1700:45;1859:1;1848;1826:12;1813:3;1799:4;1786:3;1772:4;1758:110;1753:115;1525:353;-1:-1:-1;;;;;;;1525:353:20:o;852:271::-;897:14;948:16;982:4;976:11;971:16;;1014:2;1011:1;1007:10;1048:4;1041:5;1037:16;1031:4;1024:30;1071:4;1068:1;1061:15;1108:4;1105:1;1098:5;1083:30;;;852:271;:::o;3644:286:3:-;3781:14;3777:149;;;3849:7;3843:14;3836:4;3827:7;3823:18;3816:42;3777:149;3894:7;3885:34;3903:6;3911:7;3885:34;;;;;;;:::i;:::-;;;;;;;;3644:286;;;;:::o;3525:4708:13:-;3635:14;3655:12;3696:14;3765:4458;3772:26;;;3765:4458;;;1475:1:19;1463:14;;;1390:25;;1377:39;1432:3;1428:14;3923:20:13;;;3919:402;;2205:2:19;2193:15;;;2046:25;;2033:39;2088:3;2084:14;;;;2118:2;2114:13;2129:42;2110:62;;;1873:23:13;;:49;;4231:4;:59;;4286:4;4231:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;4252:31:13;4224:66;;4302:8;;;;;;3919:402;4335:4;4331:679;;1475:1:19;1463:14;;;1390:25;;;1377:39;1432:3;1428:14;;4560:11:13;;4396:16;4598:72;4631:10;4643:26;4560:11;1463:14:19;4643:10:13;1390:25:19;4643:26:13;:::i;:::-;4598:32;:72::i;:::-;4764:20;;;;;;;;4691:7;;-1:-1:-1;4691:7:13;;4764:20;-1:-1:-1;1893:3:13;1873:23;;;;;1899;;;1873:49;4920:4;:59;;4975:4;4920:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;4941:31:13;4913:66;;4991:8;;;;;;;4331:679;625:1;5024:4;:30;5020:932;;5104:16;;2046:25:19;;;2033:39;2088:3;2084:14;;;;2118:2;2114:13;2129:42;2110:62;2205:2;2193:15;;5146:64:13;-1:-1:-1;5146:64:13;;-1:-1:-1;5146:64:13;-1:-1:-1;5256:12:13;3290:25:19;;;3277:39;3336:3;3332:14;3390:1;3378:14;;5280:46:13;;;;;;;;;;;;;5380:15;5407:4;5398:6;:13;5380:31;;5428:81;5464:10;5476:4;5482:10;;5493:6;5482:26;5500:7;5482:26;;;;;;;:::i;:::-;5428:35;:81::i;:::-;5423:190;;5555:10;5567:4;5573:26;5591:7;5584:6;5573:10;;:26;:::i;:::-;5532:68;;;;;;;;;;;;;;:::i;5423:190::-;5706:20;;;;;;;;;-1:-1:-1;5706:20:13;1893:3;1873:23;;;;;1899;;;1873:49;5862:4;:59;;5917:4;5862:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;5883:31:13;5855:66;;5933:8;;;;;;;;5020:932;667:1;5966:4;:17;5962:243;;4550:2:19;4536:17;;;4487:27;;4474:41;6115:4:13;:59;;6170:4;6115:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;6136:31:13;6108:66;;6186:8;;;;5962:243;711:1;6219:4;:19;6215:472;;3390:1:19;3378:14;;;;3290:25;;;3277:39;3336:3;3332:14;;6409:13:13;;;;6309:12;;6494:53;6508:10;6520:26;6409:13;3378:14:19;6520:10:13;3290:25:19;6520:26:13;:::i;6494:53::-;622:9:20;656:13;;;683:2;676:14;715:2;702:16;;;6560:17:13;;;;;-1:-1:-1;6649:7:13;;-1:-1:-1;6668:8:13;;-1:-1:-1;;;6668:8:13;6215:472;802:1;6701:4;:19;6697:979;;6864:22;1390:25:19;;;1377:39;1432:3;1428:14;1475:1;1463:14;;6898:55:13;-1:-1:-1;6898:55:13;;;-1:-1:-1;6966:25:13;2699::19;;;2686:39;2745:3;2741:14;2797:1;2785:14;;7003:59:13;-1:-1:-1;7003:59:13;;;-1:-1:-1;7075:12:13;3290:25:19;;;3277:39;3336:3;3332:14;3390:1;3378:14;;7099:46:13;;;;;;;;;;;;;7157:15;7184:4;7175:6;:13;7157:31;;7201:22;7225:20;7290:53;7304:10;7316;;7327:6;7316:26;7334:7;7316:26;;;;;;;:::i;7290:53::-;7364:7;;-1:-1:-1;7364:7:13;;7257:86;;-1:-1:-1;7257:86:13;-1:-1:-1;7388:35:13;;;7384:92;;7439:24;;;;7384:92;2976:73;;;20362:66:22;2976:73:13;;;;20350:79:22;;;;20445:12;;;20438:28;;;20482:12;;;20475:28;;;20519:12;;;;20512:28;;;2976:73:13;;;;;;;;;;20556:13:22;;;;2976:73:13;;;2966:84;;;;;7585:4;:59;;7640:4;7585:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;7606:31:13;7578:66;;7657:8;;;;;;;;;;6697:979;758:1;7690:4;:22;7686:485;;4550:2:19;4536:17;;;4487:27;;4474:41;7920:23:13;;;7916:82;;7968:17;7959:26;;7916:82;8010:12;8025:37;8052:9;8025:26;:37::i;:::-;8010:52;-1:-1:-1;8081:4:13;:59;;8136:4;8081:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;8102:31:13;8074:66;;8152:8;;;;;7686:485;8188:26;;;;;;;;2778:25:22;;;2751:18;;8188:26:13;2632:177:22;3765:4458:13;3678:4551;3525:4708;;;;;;:::o;1296:160:14:-;862:44;1372:7;656:13:20;;;683:2;676:14;;;715:2;702:16;;1394:57:14;543:185:20;6015:300:2;6101:4;6124:45;;;6140:29;6124:45;;:103;;-1:-1:-1;6179:48:2;;;6195:32;6179:48;6124:103;6113:147;;;-1:-1:-1;6249:4:2;;6015:300;-1:-1:-1;6015:300:2:o;6113:147::-;725:31:5;709:47;;;;6273:37:2;613:148:5;1767:2316:21;1867:14;1914:2;1893:23;;1889:70;;1948:10;;1925:34;;;;;;;;;;;;:::i;1889:70::-;1965:21;1989:43;2010:21;2030:1;2010:10;:21;:::i;:::-;1226:23:18;;1213:37;1266:3;1262:14;;1071:215;1989:43:21;1965:67;;;-1:-1:-1;2115:2:21;1226:23:18;;1213:37;1266:3;1262:14;795:37;;2202:2:21;808:23:18;;795:37;3209:66:21;3196:79;;3192:135;;;3306:10;;3318:1;3292:28;;;;;;;;;;;;;:::i;3192:135::-;3337:1;:7;;3342:2;3337:7;;:18;;;;;3348:1;:7;;3353:2;3348:7;;3337:18;3333:74;;;3386:10;;3398:1;3372:28;;;;;;;;;;;;;:::i;3333:74::-;1253:1;3447:13;:32;3443:509;;3498:25;;;;;;;;;;;;18522::22;;;18595:4;18583:17;;18563:18;;;18556:45;;;;18617:18;;;18610:34;;;18660:18;;;18653:34;;;3498:25:21;;18494:19:22;;3498:25:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3489:34;;3443:509;;;1303:1;3608:13;:34;3604:348;;3690:59;;18940:66:22;3690:59:21;;;18928:79:22;19023:12;;;19016:28;;;3661:130:21;;19060:12:22;;3690:59:21;;;;;;;;;;;;;3680:70;;3690:59;3680:70;;;;3661:130;;;;;;;;;18522:25:22;18595:4;18583:17;;18563:18;;;18556:45;18617:18;;;18610:34;;;18660:18;;;18653:34;;;18494:19;;3661:130:21;18295:398:22;3604:348:21;3913:10;;3925:13;3940:4;3888:57;;;;;;;;;;;;;;:::i;3604:348::-;3999:22;;;3995:63;;4047:10;;4030:28;;;;;;;;;;;;:::i;3995:63::-;4065:13;;;;1767:2316;;;;;:::o;4411:951::-;4535:10;4557:22;;;4553:66;;4596:16;;;;;;;;;;;;;;4553:66;4625:21;4655:10;;4666:21;4686:1;4655:10;4666:21;:::i;:::-;4655:33;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;1253:1:21;4699:32;;;:70;;;1303:1;4735:13;:34;4699:70;4695:663;;;4873:7;4837:43;;:32;4851:5;4858:10;;4837:13;:32::i;:::-;:43;;;4829:51;;4695:663;;;1359:1;4898:13;:40;4894:464;;5060:40;;;;5101:5;5108:10;5119:1;5108:10;5121:21;5141:1;5108:10;5121:21;:::i;:::-;5108:35;;;;;;;:::i;:::-;5060:84;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5030:114;;:26;:114;;-1:-1:-1;4894:464:21;;;5318:10;;5330:13;5345:5;5293:58;;;;;;;;;;;;;;:::i;4894:464::-;4547:815;4411:951;;;;;;:::o;2227:182:13:-;2346:57;;20822:66:22;2346:57:13;;;20810:79:22;20905:12;;;20898:28;;;2314:7:13;;20942:12:22;;2346:57:13;20580:380:22;14:177;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:347::-;689:8;699:6;753:3;746:4;738:6;734:17;730:27;720:55;;771:1;768;761:12;720:55;-1:-1:-1;794:20:22;;837:18;826:30;;823:50;;;869:1;866;859:12;823:50;906:4;898:6;894:17;882:29;;958:3;951:4;942:6;934;930:19;926:30;923:39;920:59;;;975:1;972;965:12;920:59;638:347;;;;;:::o;990:477::-;1069:6;1077;1085;1138:2;1126:9;1117:7;1113:23;1109:32;1106:52;;;1154:1;1151;1144:12;1106:52;1190:9;1177:23;1167:33;;1251:2;1240:9;1236:18;1223:32;1278:18;1270:6;1267:30;1264:50;;;1310:1;1307;1300:12;1264:50;1349:58;1399:7;1390:6;1379:9;1375:22;1349:58;:::i;:::-;990:477;;1426:8;;-1:-1:-1;1323:84:22;;-1:-1:-1;;;;990:477:22:o;1725:717::-;1815:6;1823;1831;1839;1892:2;1880:9;1871:7;1867:23;1863:32;1860:52;;;1908:1;1905;1898:12;1860:52;1948:9;1935:23;1977:18;2018:2;2010:6;2007:14;2004:34;;;2034:1;2031;2024:12;2004:34;2073:58;2123:7;2114:6;2103:9;2099:22;2073:58;:::i;:::-;2150:8;;-1:-1:-1;2047:84:22;-1:-1:-1;2238:2:22;2223:18;;2210:32;;-1:-1:-1;2254:16:22;;;2251:36;;;2283:1;2280;2273:12;2251:36;;2322:60;2374:7;2363:8;2352:9;2348:24;2322:60;:::i;:::-;1725:717;;;;-1:-1:-1;2401:8:22;-1:-1:-1;;;;1725:717:22:o;2447:180::-;2506:6;2559:2;2547:9;2538:7;2534:23;2530:32;2527:52;;;2575:1;2572;2565:12;2527:52;-1:-1:-1;2598:23:22;;2447:180;-1:-1:-1;2447:180:22:o;2814:387::-;2897:8;2907:6;2961:3;2954:4;2946:6;2942:17;2938:27;2928:55;;2979:1;2976;2969:12;2928:55;-1:-1:-1;3002:20:22;;3045:18;3034:30;;3031:50;;;3077:1;3074;3067:12;3031:50;3114:4;3106:6;3102:17;3090:29;;3174:3;3167:4;3157:6;3154:1;3150:14;3142:6;3138:27;3134:38;3131:47;3128:67;;;3191:1;3188;3181:12;3206:488;3323:6;3331;3384:2;3372:9;3363:7;3359:23;3355:32;3352:52;;;3400:1;3397;3390:12;3352:52;3440:9;3427:23;3473:18;3465:6;3462:30;3459:50;;;3505:1;3502;3495:12;3459:50;3544:90;3626:7;3617:6;3606:9;3602:22;3544:90;:::i;:::-;3653:8;;3518:116;;-1:-1:-1;3206:488:22;-1:-1:-1;;;;3206:488:22:o;3699:864::-;3845:6;3853;3861;3869;3877;3930:2;3918:9;3909:7;3905:23;3901:32;3898:52;;;3946:1;3943;3936:12;3898:52;3986:9;3973:23;4015:18;4056:2;4048:6;4045:14;4042:34;;;4072:1;4069;4062:12;4042:34;4111:90;4193:7;4184:6;4173:9;4169:22;4111:90;:::i;:::-;4220:8;;-1:-1:-1;4085:116:22;-1:-1:-1;4302:2:22;4287:18;;4274:32;;-1:-1:-1;4359:2:22;4344:18;;4331:32;;-1:-1:-1;4375:16:22;;;4372:36;;;4404:1;4401;4394:12;4372:36;;4443:60;4495:7;4484:8;4473:9;4469:24;4443:60;:::i;:::-;3699:864;;;;-1:-1:-1;3699:864:22;;-1:-1:-1;4522:8:22;;4417:86;3699:864;-1:-1:-1;;;3699:864:22:o;5403:184::-;5455:77;5452:1;5445:88;5552:4;5549:1;5542:15;5576:4;5573:1;5566:15;5592:980;5660:6;5713:2;5701:9;5692:7;5688:23;5684:32;5681:52;;;5729:1;5726;5719:12;5681:52;5769:9;5756:23;5798:18;5839:2;5831:6;5828:14;5825:34;;;5855:1;5852;5845:12;5825:34;5893:6;5882:9;5878:22;5868:32;;5938:7;5931:4;5927:2;5923:13;5919:27;5909:55;;5960:1;5957;5950:12;5909:55;5996:2;5983:16;6018:2;6014;6011:10;6008:36;;;6024:18;;:::i;:::-;6158:2;6152:9;6220:4;6212:13;;6063:66;6208:22;;;6232:2;6204:31;6200:40;6188:53;;;6256:18;;;6276:22;;;6253:46;6250:72;;;6302:18;;:::i;:::-;6342:10;6338:2;6331:22;6377:2;6369:6;6362:18;6417:7;6412:2;6407;6403;6399:11;6395:20;6392:33;6389:53;;;6438:1;6435;6428:12;6389:53;6494:2;6489;6485;6481:11;6476:2;6468:6;6464:15;6451:46;6539:1;6517:15;;;6534:2;6513:24;6506:35;;;;-1:-1:-1;6521:6:22;5592:980;-1:-1:-1;;;;;5592:980:22:o;6808:271::-;6991:6;6983;6978:3;6965:33;6947:3;7017:16;;7042:13;;;7017:16;6808:271;-1:-1:-1;6808:271:22:o;7416:160::-;7481:20;;7537:13;;7530:21;7520:32;;7510:60;;7566:1;7563;7556:12;7510:60;7416:160;;;:::o;7581:196::-;7649:20;;7709:42;7698:54;;7688:65;;7678:93;;7767:1;7764;7757:12;7782:325;7870:6;7865:3;7858:19;7922:6;7915:5;7908:4;7903:3;7899:14;7886:43;;7974:1;7967:4;7958:6;7953:3;7949:16;7945:27;7938:38;7840:3;8096:4;8026:66;8021:2;8013:6;8009:15;8005:88;8000:3;7996:98;7992:109;7985:116;;7782:325;;;;:::o;8112:2028::-;8232:6;8227:3;8220:19;8202:3;8258:4;8299:2;8294:3;8290:12;8324:11;8351;8344:18;;8401:6;8398:1;8394:14;8387:5;8383:26;8371:38;;8432:5;8455:1;8465:1649;8479:6;8476:1;8473:13;8465:1649;;;8550:5;8544:4;8540:16;8535:3;8528:29;8609:6;8596:20;8695:66;8687:5;8671:14;8667:26;8663:99;8643:18;8639:124;8629:152;;8777:1;8774;8767:12;8629:152;8809:30;;8862:4;8906:24;8809:30;8906:24;:::i;:::-;8899:32;8892:40;8886:4;8879:54;8982:33;9011:2;9002:7;8998:16;8982:33;:::i;:::-;8975:41;8968:49;8953:13;;;8946:72;9041:4;9093:16;;;9080:30;9065:13;;;9058:53;9134:4;9215:42;9177:36;9196:16;;;9177:36;:::i;:::-;9173:85;9158:13;;;9151:108;9282:4;9334:16;;;9321:30;9306:13;;;9299:53;9375:4;9433:16;;;9420:30;9507:14;9503:28;;;9533:66;9499:101;9473:128;;9463:156;;9615:1;9612;9605:12;9463:156;9647:34;;;9759:16;;;;-1:-1:-1;9710:21:22;9804:18;9791:32;;9788:52;;;9836:1;9833;9826:12;9788:52;9889:8;9873:14;9869:29;9860:7;9856:43;9853:63;;;9912:1;9909;9902:12;9853:63;9951:2;9946;9940:4;9936:13;9929:25;9975:59;10030:2;10024:4;10020:13;10010:8;10001:7;9975:59;:::i;:::-;10092:12;;;;9967:67;-1:-1:-1;;;10057:15:22;;;;-1:-1:-1;;8501:1:22;8494:9;8465:1649;;;-1:-1:-1;10130:4:22;;8112:2028;-1:-1:-1;;;;;;;8112:2028:22:o;10145:594::-;10495:2;10484:9;10477:21;10534:1;10529:2;10518:9;10514:18;10507:29;10572:7;10567:2;10556:9;10552:18;10545:35;10618:3;10611:4;10600:9;10596:20;10589:33;10458:4;10639:94;10728:3;10717:9;10713:19;10705:6;10697;10639:94;:::i;10744:595::-;11094:2;11083:9;11076:21;11133:1;11128:2;11117:9;11113:18;11106:29;11171:8;11166:2;11155:9;11151:18;11144:36;11218:3;11211:4;11200:9;11196:20;11189:33;11057:4;11239:94;11328:3;11317:9;11313:19;11305:6;11297;11239:94;:::i;11344:184::-;11396:77;11393:1;11386:88;11493:4;11490:1;11483:15;11517:4;11514:1;11507:15;11786:481;11827:3;11865:5;11859:12;11892:6;11887:3;11880:19;11917:1;11927:162;11941:6;11938:1;11935:13;11927:162;;;12003:4;12059:13;;;12055:22;;12049:29;12031:11;;;12027:20;;12020:59;11956:12;11927:162;;;11931:3;12134:1;12127:4;12118:6;12113:3;12109:16;12105:27;12098:38;12256:4;12186:66;12181:2;12173:6;12169:15;12165:88;12160:3;12156:98;12152:109;12145:116;;;11786:481;;;;:::o;12272:217::-;12419:2;12408:9;12401:21;12382:4;12439:44;12479:2;12468:9;12464:18;12456:6;12439:44;:::i;13090:387::-;13187:4;13245:11;13232:25;13335:66;13324:8;13308:14;13304:29;13300:102;13280:18;13276:127;13266:155;;13417:1;13414;13407:12;13266:155;13438:33;;;;;13090:387;-1:-1:-1;;13090:387:22:o;13482:180::-;13538:6;13591:2;13579:9;13570:7;13566:23;13562:32;13559:52;;;13607:1;13604;13597:12;13559:52;13630:26;13646:9;13630:26;:::i;13991:186::-;14050:6;14103:2;14091:9;14082:7;14078:23;14074:32;14071:52;;;14119:1;14116;14109:12;14071:52;14142:29;14161:9;14142:29;:::i;14182:580::-;14259:4;14265:6;14325:11;14312:25;14415:66;14404:8;14388:14;14384:29;14380:102;14360:18;14356:127;14346:155;;14497:1;14494;14487:12;14346:155;14524:33;;14576:20;;;-1:-1:-1;14619:18:22;14608:30;;14605:50;;;14651:1;14648;14641:12;14605:50;14684:4;14672:17;;-1:-1:-1;14715:14:22;14711:27;;;14701:38;;14698:58;;;14752:1;14749;14742:12;14767:184;14819:77;14816:1;14809:88;14916:4;14913:1;14906:15;14940:4;14937:1;14930:15;14956:195;14995:3;15026:66;15019:5;15016:77;15013:103;;15096:18;;:::i;:::-;-1:-1:-1;15143:1:22;15132:13;;14956:195::o;15156:331::-;15261:9;15272;15314:8;15302:10;15299:24;15296:44;;;15336:1;15333;15326:12;15296:44;15365:6;15355:8;15352:20;15349:40;;;15385:1;15382;15375:12;15349:40;-1:-1:-1;;15411:23:22;;;15456:25;;;;;-1:-1:-1;15156:331:22:o;15492:125::-;15557:9;;;15578:10;;;15575:36;;;15591:18;;:::i;15622:392::-;15841:2;15830:9;15823:21;15804:4;15861:61;15918:2;15907:9;15903:18;15895:6;15887;15861:61;:::i;:::-;15953:2;15938:18;;15931:34;;;;-1:-1:-1;15996:2:22;15981:18;15974:34;15853:69;15622:392;-1:-1:-1;;15622:392:22:o;16525:288::-;16700:6;16689:9;16682:25;16743:2;16738;16727:9;16723:18;16716:30;16663:4;16763:44;16803:2;16792:9;16788:18;16780:6;16763:44;:::i;16818:441::-;17037:6;17026:9;17019:25;17092:42;17084:6;17080:55;17075:2;17064:9;17060:18;17053:83;17172:2;17167;17156:9;17152:18;17145:30;17000:4;17192:61;17249:2;17238:9;17234:18;17226:6;17218;17192:61;:::i;:::-;17184:69;16818:441;-1:-1:-1;;;;;;16818:441:22:o;17264:244::-;17421:2;17410:9;17403:21;17384:4;17441:61;17498:2;17487:9;17483:18;17475:6;17467;17441:61;:::i;17513:128::-;17580:9;;;17601:11;;;17598:37;;;17615:18;;:::i;17646:315::-;17831:2;17820:9;17813:21;17794:4;17851:61;17908:2;17897:9;17893:18;17885:6;17877;17851:61;:::i;:::-;17843:69;;17948:6;17943:2;17932:9;17928:18;17921:34;17646:315;;;;;;:::o;17966:324::-;18149:2;18138:9;18131:21;18112:4;18169:61;18226:2;18215:9;18211:18;18203:6;18195;18169:61;:::i;:::-;18161:69;;18278:4;18270:6;18266:17;18261:2;18250:9;18246:18;18239:45;17966:324;;;;;;:::o;19083:396::-;19290:2;19279:9;19272:21;19253:4;19310:61;19367:2;19356:9;19352:18;19344:6;19336;19310:61;:::i;:::-;19402:2;19387:18;;19380:34;;;;-1:-1:-1;19457:14:22;;19450:22;19445:2;19430:18;;;19423:50;19302:69;19083:396;-1:-1:-1;;19083:396:22:o;19484:321::-;19675:6;19664:9;19657:25;19718:2;19713;19702:9;19698:18;19691:30;19638:4;19738:61;19795:2;19784:9;19780:18;19772:6;19764;19738:61;:::i;:::-;19730:69;19484:321;-1:-1:-1;;;;;19484:321:22:o;19810:249::-;19879:6;19932:2;19920:9;19911:7;19907:23;19903:32;19900:52;;;19948:1;19945;19938:12;19900:52;19980:9;19974:16;19999:30;20023:5;19999:30;:::i" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "1734000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "SET_IMAGE_HASH_TYPE_HASH()": "262", + "createContract(bytes)": "infinite", + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": "infinite", + "isValidSignature(bytes,bytes)": "infinite", + "isValidSignature(bytes32,bytes)": "infinite", + "nonce()": "2645", + "readNonce(uint256)": "2640", + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": "infinite", + "signatureRecovery(bytes32,bytes)": "infinite", + "supportsInterface(bytes4)": "infinite", + "updateImageHash(bytes32)": "357" + }, + "internal": { + "_executeGuest(bytes32,struct IModuleCalls.Transaction calldata[] calldata)": "infinite", + "_isValidImage(bytes32)": "infinite", + "_updateImageHash(bytes32)": "infinite" + } + }, + "methodIdentifiers": { + "SET_IMAGE_HASH_TYPE_HASH()": "57c56d6b", + "createContract(bytes)": "90042baf", + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": "7a9a1628", + "isValidSignature(bytes,bytes)": "20c13b0b", + "isValidSignature(bytes32,bytes)": "1626ba7e", + "nonce()": "affed0e0", + "readNonce(uint256)": "8c3f5563", + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": "61c2926c", + "signatureRecovery(bytes32,bytes)": "853c5068", + "supportsInterface(bytes4)": "01ffc9a7", + "updateImageHash(bytes32)": "29561426" + } + }, + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "CreateFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "DelegateCallNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "EmptySignature", + "type": "error" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidNestedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "InvalidSValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_v", + "type": "uint256" + } + ], + "name": "InvalidVValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_requested", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_available", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [], + "name": "NotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyDelegatecall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_self", + "type": "address" + } + ], + "name": "OnlySelfAuth", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "SignerIsAddress0", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_recoverMode", + "type": "bool" + } + ], + "name": "UnsupportedSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_prev", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "name": "CreatedContract", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "TxExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_reason", + "type": "bytes" + } + ], + "name": "TxFailed", + "type": "event" + }, + { + "inputs": [], + "name": "SET_IMAGE_HASH_TYPE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "createContract", + "outputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signatures", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signatures", + "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": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "signatureRecovery", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subdigest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/GuestModule_metadata.json b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/GuestModule_metadata.json new file mode 100644 index 000000000..4298c56c9 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/GuestModule_metadata.json @@ -0,0 +1,985 @@ +{ + "compiler": { + "version": "0.8.18+commit.87f61d96" + }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "CreateFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "DelegateCallNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "EmptySignature", + "type": "error" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidNestedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "InvalidSValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_v", + "type": "uint256" + } + ], + "name": "InvalidVValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_requested", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_available", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [], + "name": "NotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyDelegatecall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_self", + "type": "address" + } + ], + "name": "OnlySelfAuth", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "SignerIsAddress0", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_recoverMode", + "type": "bool" + } + ], + "name": "UnsupportedSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_prev", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "name": "CreatedContract", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "TxExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_reason", + "type": "bytes" + } + ], + "name": "TxFailed", + "type": "event" + }, + { + "inputs": [], + "name": "SET_IMAGE_HASH_TYPE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "createContract", + "outputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signatures", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signatures", + "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": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "signatureRecovery", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subdigest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "createContract(bytes)": { + "params": { + "_code": "Creation code of the contract" + }, + "returns": { + "addr": "The address of the created contract" + } + }, + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": { + "params": { + "_txs": "Transactions to process" + } + }, + "isValidSignature(bytes,bytes)": { + "details": "MUST return the correct magic value if the signature provided is valid for the provided data > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\"))", + "params": { + "_data": "Arbitrary length data signed on the behalf of address(this)", + "_signatures": "Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)" + }, + "returns": { + "_0": "magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise" + } + }, + "isValidSignature(bytes32,bytes)": { + "details": "MUST return the correct magic value if the signature provided is valid for the provided hash > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))", + "params": { + "_hash": "keccak256 hash that was signed", + "_signatures": "Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)" + }, + "returns": { + "_0": "magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise" + } + }, + "nonce()": { + "details": "The default nonce space is 0x00", + "returns": { + "_0": "The next nonce" + } + }, + "readNonce(uint256)": { + "params": { + "_space": "Nonce space, each space keeps an independent nonce count" + }, + "returns": { + "_0": "The next nonce" + } + }, + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": { + "params": { + "_txs": "Transactions to process" + } + }, + "signatureRecovery(bytes32,bytes)": { + "details": "The signature must be prefixed with a type byte, which is used to determine the recovery method.", + "params": { + "_digest": "Digest of the signed data.", + "_signature": "A Sequence signature." + }, + "returns": { + "checkpoint": "A nonce that is incremented every time a new configuration is set.", + "imageHash": "The imageHash of the configuration that signed the message.", + "subdigest": "A modified version of the original digest, unique for each wallet/network.", + "threshold": "The required number of signatures needed to consider the signature valid.", + "weight": "The actual number of signatures collected in the signature." + } + }, + "supportsInterface(bytes4)": { + "params": { + "_interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `_interfaceID`" + } + }, + "updateImageHash(bytes32)": { + "params": { + "_imageHash": "New required image hash of the signature" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "createContract(bytes)": { + "notice": "Creates a contract forwarding eth value" + }, + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": { + "notice": "Allow any caller to execute an action" + }, + "isValidSignature(bytes,bytes)": { + "notice": "Verifies whether the provided signature is valid with respect to the provided data" + }, + "isValidSignature(bytes32,bytes)": { + "notice": "Verifies whether the provided signature is valid with respect to the provided hash" + }, + "nonce()": { + "notice": "Returns the next nonce of the default nonce space" + }, + "readNonce(uint256)": { + "notice": "Returns the next nonce of the given nonce space" + }, + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": { + "notice": "Allow any caller to execute an action" + }, + "signatureRecovery(bytes32,bytes)": { + "notice": "Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature." + }, + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + }, + "updateImageHash(bytes32)": { + "notice": "Updates the signers configuration of the wallet" + } + }, + "notice": "GuestModule implements a Sequence wallet without signatures, nonce or replay protection. executing transactions using this wallet is not an authenticated process, and can be done by any address.This contract is completely public with no security, designed to execute pre-signed transactions and use Sequence tools without using the wallets.", + "version": 1 + } + }, + "settings": { + "compilationTarget": { + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol": "GuestModule" + }, + "evmVersion": "paris", + "libraries": {}, + "metadata": { + "bytecodeHash": "ipfs" + }, + "optimizer": { + "enabled": true, + "runs": 500000 + }, + "remappings": [ + ":@0xsequence/contracts-library/=src/", + ":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/", + ":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/", + ":@openzeppelin/=lib/openzeppelin/", + ":ds-test/=lib/forge-std/lib/ds-test/src/", + ":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/", + ":erc721a/=lib/chiru-labs/erc721a/", + ":forge-std/=lib/forge-std/src/", + ":murky/=lib/murky/src/", + ":solady/=lib/solady/src/" + ] + }, + "sources": { + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol": { + "keccak256": "0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1", + "dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol": { + "keccak256": "0x14c92b44eac100edbfea10d0d02728752a6be277c267c3776dc563ff963271b1", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://e440eb91039118ce26bb66fd549d5e6b59863983efbe6c2617b92e2c4f0aab66", + "dweb:/ipfs/QmeTd2xBKEv4S4Rp9S4TSY4WwUUDjtA7xiJYiJqkVUio7d" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol": { + "keccak256": "0x58c028f02e3517de6c39584bcf1cedd4e7b23f575c24b363cbad4960a74f8a0b", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://f9652fead22c9fe8510de8427e2db354ed145ff30f49f85d1c717e293e5df665", + "dweb:/ipfs/QmSJPFQxRE5n17DNB5Bu2jwRo17yLS7igMQGt3bvKkdLAP" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol": { + "keccak256": "0x80c0151dbd444f96c2f935e70a6d3cc57e307588fa21d7eace67e568dd3d35c1", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://39a856555a5eb900e67d351e667135f245ccebd304d692b35fc8bdc83aec1b53", + "dweb:/ipfs/QmUdWfa7GcTGM5gk7qYbNCHtsxF4o8dXHzr6HbdFng5sQm" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol": { + "keccak256": "0x16b1400988f6b7bd4d32bdcb36ee2fbd644fb2c8ca571becc0c32e03602bd303", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://8bd4681fb4cff10f4e98e45618fbc52ed0a4c7d4fcf614f34a587ad20cd16855", + "dweb:/ipfs/QmbA2LYBH1x8WX8CaeiFYMU5rjyLGgNCF32r9fQbXuoqwJ" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol": { + "keccak256": "0xd4ae13a3d20fd7ab52ad16af6a06e7244daea450b796251e911091cac104d05f", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://8de37ec20a6b649e9fe3fb42276e4660ff546bca8b467f72beb35396ab5e62d6", + "dweb:/ipfs/QmXT2SxBZKitkbKLbGbbNLhUbw2ataRpQ2DHafvhG953RE" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol": { + "keccak256": "0x3b5388842f763a5347d632a0e0e8499a54b6f0b0a6eb7f7d3d848319defa042d", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://b36fa5a88a4e174967f850bf2bb78c787d8016ef7b5eee3e2f883fbfe9b87a7d", + "dweb:/ipfs/QmTDZiPiQGe1fmTKKzdwzBE1xjkh8apTotW1SQRUCFXf4q" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol": { + "keccak256": "0x32bdb1d343eee2e32fd9d0f1d6dc0e265411d0821bd908881822f0f26f0887f8", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://1537c4f60a609751013bdc69eb1c6e6218982d91013115bc4e28cb84f816cd91", + "dweb:/ipfs/QmSjkSTrrB4vuxECcm5cRG7YmraF53QWRgftxS827KcQLW" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol": { + "keccak256": "0x91545de5c77cfac86c5686c4e1f338a18ee7adb689ac0234848d7a7fc8a560db", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://dc89d05d8099ba4c3c2cf85737796d439899b5a04e6b87b1ea43f687ae08848a", + "dweb:/ipfs/QmatU8gRvFkK3Yn1MYAekzi48Waw3cDLtXJpduvju9HFUu" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol": { + "keccak256": "0x876c6a40cba975df4f7dfe24e02d153b2ee758975b6d1eda494ecd4b7244aa8e", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://b9be3f7930476d528ce10a121701421f0fb251b7d6b7cd579917375e6b283bb4", + "dweb:/ipfs/QmSbvbYQvTk8KYJZ7QqSKB9Y4M1X3UDhS6k765Zr1BAwK8" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol": { + "keccak256": "0x24c6b05c32cb344b3b0aebd01fbd8bfc69f8c8e29fca340b262d9612c34d51e2", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://5f6c004946f0cbc4b3e52d45248337146bc82569da894ecff3cbdc5a0dca95c3", + "dweb:/ipfs/QmNSgDMQ7SHL6AJuzTSRbY2kgciHF1SKWfH6MaPH1N3TpR" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol": { + "keccak256": "0xde065c15e38eb009c3dc8f99dfefdd1d6d244dd12a889a8b57edd90d32fb4395", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://23608955786060457f79267795a61eb89b3910b683fc136c749548369425088f", + "dweb:/ipfs/QmXNorcQBF1Qk21y3aEJRiiHVtwm61zP4ttA1ZzmRjyHnz" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol": { + "keccak256": "0xa206dd3d424b8cd1c4f1400aa344cbc974480fea02f0fb371b872558e5ff4e6d", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://ea14c75f43a0008c582dcbae3ba3c900e446e28039dfdbb059d326ec5cc6a2d2", + "dweb:/ipfs/QmRfF6BmUWiFkCgzVFbLcHsUCNz5q2XkkcwXPX57ViTK4D" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol": { + "keccak256": "0xe0565e24e94204d4b254ace42d124d3279256090921a4818cbbf9747cbb14e04", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://4293a4762b0816738511f697efd04a0e881d4c409bd15ac1c4e7261fe5e482a2", + "dweb:/ipfs/QmcHbEBne4fvpcD7RTJHCL6q9czoLa7KHneaCeYfXuWiGu" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol": { + "keccak256": "0x755fbf6c106fe1c3c375c41c95c38269873717d8e683678b5fdbf6c8d3426306", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://7c7c92e72dd94f16b5c004d38c2d92eb2b760fd29a939945ed275633b0f93fa5", + "dweb:/ipfs/QmVdCG7Aw7aVV67z5mUKZa4VqhXHdLqy3SKxPfxaxq54p2" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol": { + "keccak256": "0x6de353f8c7f44c4294914a4917458ce90ae2f7ecd2d84074fe12d4a4f1485ee5", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://369f979b79a3d3fd0336ab14b3accadb63e4784324afc34f8db11d1988526afd", + "dweb:/ipfs/QmavmBZ354wTaXQ6ixBd8GrC9HwtRqn4MoNhCVJcx11off" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol": { + "keccak256": "0xa3ac8b8d31f20a8732bb4ebad53b42b334ec29041de0224bd494913ef0b2ad07", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://5a81d4eb3f47b09a8835b2fd53e0baa2e23cb604db3b10dae82543a5bcc52fa4", + "dweb:/ipfs/QmQ9XSSgbaagWArmZJJ366bdJ7HfxUxn9jdnWwN6SxUSeY" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol": { + "keccak256": "0x98520e740b0822ec053d21f376b8be8a58e93228f3758f9228a7d00e1f60950f", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://31226706c004f1a4315d6b8d37621b46f4d5807c16e1ce72675c1431ed9006a2", + "dweb:/ipfs/QmdSSyCuPex2E2VTd6UMYy9WAq9eJNZ6vHSUomntNknzXE" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol": { + "keccak256": "0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98", + "dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol": { + "keccak256": "0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25", + "dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol": { + "keccak256": "0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335", + "dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM" + ] + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol": { + "keccak256": "0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba", + "license": "Apache-2.0", + "urls": [ + "bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353", + "dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv" + ] + } + }, + "version": 1 +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/build-info/c563de663c25f57de739af959840b24e.json b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/build-info/c563de663c25f57de739af959840b24e.json new file mode 100644 index 000000000..2dc39dd26 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/artifacts/build-info/c563de663c25f57de739af959840b24e.json @@ -0,0 +1,96556 @@ +{ + "id": "c563de663c25f57de739af959840b24e", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.18", + "solcLongVersion": "0.8.18+commit.87f61d96", + "input": { + "language": "Solidity", + "sources": { + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"../utils/LibOptim.sol\";\n\nimport \"./commons/submodules/auth/SequenceBaseSig.sol\";\n\nimport \"./commons/ModuleAuth.sol\";\nimport \"./commons/ModuleCalls.sol\";\nimport \"./commons/ModuleCreator.sol\";\n\n\n/**\n * GuestModule implements a Sequence wallet without signatures, nonce or replay protection.\n * executing transactions using this wallet is not an authenticated process, and can be done by any address.\n *\n * @notice This contract is completely public with no security, designed to execute pre-signed transactions\n * and use Sequence tools without using the wallets.\n */\ncontract GuestModule is\n ModuleAuth,\n ModuleCalls,\n ModuleCreator\n{\n error DelegateCallNotAllowed(uint256 _index);\n error NotSupported();\n\n /**\n * @notice Allow any caller to execute an action\n * @param _txs Transactions to process\n */\n function execute(\n Transaction[] calldata _txs,\n uint256,\n bytes calldata\n ) public override {\n // Hash transaction bundle\n bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode('guest:', _txs)));\n\n // Execute the transactions\n _executeGuest(txHash, _txs);\n }\n\n /**\n * @notice Allow any caller to execute an action\n * @param _txs Transactions to process\n */\n function selfExecute(\n Transaction[] calldata _txs\n ) public override {\n // Hash transaction bundle\n bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode('self:', _txs)));\n\n // Execute the transactions\n _executeGuest(txHash, _txs);\n }\n\n /**\n * @notice Executes a list of transactions\n * @param _txHash Hash of the batch of transactions\n * @param _txs Transactions to execute\n */\n function _executeGuest(\n bytes32 _txHash,\n Transaction[] calldata _txs\n ) private {\n // Execute transaction\n uint256 size = _txs.length;\n for (uint256 i = 0; i < size; i++) {\n Transaction calldata transaction = _txs[i];\n\n if (transaction.delegateCall) revert DelegateCallNotAllowed(i);\n\n uint256 gasLimit = transaction.gasLimit;\n if (gasleft() < gasLimit) revert NotEnoughGas(i, gasLimit, gasleft());\n\n bool success = LibOptim.call(\n transaction.target,\n transaction.value,\n gasLimit == 0 ? gasleft() : gasLimit,\n transaction.data\n );\n\n if (success) {\n emit TxExecuted(_txHash, i);\n } else {\n _revertBytes(\n transaction.revertOnError,\n _txHash,\n i,\n LibOptim.returnData()\n );\n }\n }\n }\n\n /**\n * @notice Validates any signature image, because the wallet is public and has no owner.\n * @return true, all signatures are valid.\n */\n function _isValidImage(bytes32) internal override pure returns (bool) {\n return true;\n }\n\n /**\n * Not supported.\n */\n function _updateImageHash(bytes32) internal override virtual {\n revert NotSupported();\n }\n\n /**\n * @notice Query if a contract implements an interface\n * @param _interfaceID The interface identifier, as specified in ERC-165\n * @return `true` if the contract implements `_interfaceID`\n */\n function supportsInterface(\n bytes4 _interfaceID\n ) public override (\n ModuleAuth,\n ModuleCalls,\n ModuleCreator\n ) pure returns (bool) {\n return super.supportsInterface(_interfaceID);\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"./interfaces/IModuleCreator.sol\";\n\nimport \"./ModuleSelfAuth.sol\";\nimport \"./ModuleERC165.sol\";\n\n\ncontract ModuleCreator is IModuleCreator, ModuleERC165, ModuleSelfAuth {\n event CreatedContract(address _contract);\n\n /**\n * @notice Creates a contract forwarding eth value\n * @param _code Creation code of the contract\n * @return addr The address of the created contract\n */\n function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {\n assembly { addr := create(callvalue(), add(_code, 32), mload(_code)) }\n if (addr == address(0)) revert CreateFailed(_code);\n emit CreatedContract(addr);\n }\n\n /**\n * @notice Query if a contract implements an interface\n * @param _interfaceID The interface identifier, as specified in ERC-165\n * @return `true` if the contract implements `_interfaceID`\n */\n function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {\n if (_interfaceID == type(IModuleCreator).interfaceId) {\n return true;\n }\n\n return super.supportsInterface(_interfaceID);\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"./ModuleSelfAuth.sol\";\nimport \"./ModuleStorage.sol\";\nimport \"./ModuleERC165.sol\";\nimport \"./ModuleNonce.sol\";\nimport \"./ModuleOnlyDelegatecall.sol\";\n\nimport \"./interfaces/IModuleCalls.sol\";\nimport \"./interfaces/IModuleAuth.sol\";\n\nimport \"./submodules/nonce/SubModuleNonce.sol\";\nimport \"./submodules/auth/SequenceBaseSig.sol\";\n\nimport \"../../utils/LibOptim.sol\";\n\n\nabstract contract ModuleCalls is IModuleCalls, IModuleAuth, ModuleERC165, ModuleOnlyDelegatecall, ModuleSelfAuth, ModuleNonce {\n /**\n * @notice Allow wallet owner to execute an action\n * @dev Relayers must ensure that the gasLimit specified for each transaction\n * is acceptable to them. A user could specify large enough that it could\n * consume all the gas available.\n * @param _txs Transactions to process\n * @param _nonce Signature nonce (may contain an encoded space)\n * @param _signature Encoded signature\n */\n function execute(\n Transaction[] calldata _txs,\n uint256 _nonce,\n bytes calldata _signature\n ) external override virtual onlyDelegatecall {\n // Validate and update nonce\n _validateNonce(_nonce);\n\n // Hash and verify transaction bundle\n (bool isValid, bytes32 txHash) = _signatureValidation(\n keccak256(\n abi.encode(\n _nonce,\n _txs\n )\n ),\n _signature\n );\n\n if (!isValid) {\n revert InvalidSignature(txHash, _signature);\n }\n\n // Execute the transactions\n _execute(txHash, _txs);\n }\n\n /**\n * @notice Allow wallet to execute an action\n * without signing the message\n * @param _txs Transactions to execute\n */\n function selfExecute(\n Transaction[] calldata _txs\n ) external override virtual onlySelf {\n // Hash transaction bundle\n bytes32 txHash = SequenceBaseSig.subdigest(\n keccak256(\n abi.encode('self:', _txs)\n )\n );\n\n // Execute the transactions\n _execute(txHash, _txs);\n }\n\n /**\n * @notice Executes a list of transactions\n * @param _txHash Hash of the batch of transactions\n * @param _txs Transactions to execute\n */\n function _execute(\n bytes32 _txHash,\n Transaction[] calldata _txs\n ) private {\n unchecked {\n // Execute transaction\n uint256 size = _txs.length;\n for (uint256 i = 0; i < size; i++) {\n Transaction calldata transaction = _txs[i];\n uint256 gasLimit = transaction.gasLimit;\n\n if (gasleft() < gasLimit) revert NotEnoughGas(i, gasLimit, gasleft());\n\n bool success;\n if (transaction.delegateCall) {\n success = LibOptim.delegatecall(\n transaction.target,\n gasLimit == 0 ? gasleft() : gasLimit,\n transaction.data\n );\n } else {\n success = LibOptim.call(\n transaction.target,\n transaction.value,\n gasLimit == 0 ? gasleft() : gasLimit,\n transaction.data\n );\n }\n\n if (success) {\n emit TxExecuted(_txHash, i);\n } else {\n // Avoid copy of return data until neccesary\n _revertBytes(\n transaction.revertOnError,\n _txHash,\n i,\n LibOptim.returnData()\n );\n }\n }\n }\n }\n\n /**\n * @notice Logs a failed transaction, reverts if the transaction is not optional\n * @param _revertOnError Signals if it should revert or just log\n * @param _txHash Hash of the transaction\n * @param _index Index of the transaction in the batch\n * @param _reason Encoded revert message\n */\n function _revertBytes(\n bool _revertOnError,\n bytes32 _txHash,\n uint256 _index,\n bytes memory _reason\n ) internal {\n if (_revertOnError) {\n assembly { revert(add(_reason, 0x20), mload(_reason)) }\n } else {\n emit TxFailed(_txHash, _index, _reason);\n }\n }\n\n /**\n * @notice Query if a contract implements an interface\n * @param _interfaceID The interface identifier, as specified in ERC-165\n * @return `true` if the contract implements `_interfaceID`\n */\n function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {\n if (_interfaceID == type(IModuleCalls).interfaceId) {\n return true;\n }\n\n return super.supportsInterface(_interfaceID);\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"../../utils/LibBytes.sol\";\nimport \"../../interfaces/IERC1271Wallet.sol\";\n\nimport \"./interfaces/IModuleAuth.sol\";\n\nimport \"./ModuleERC165.sol\";\n\nimport \"./submodules/auth/SequenceBaseSig.sol\";\nimport \"./submodules/auth/SequenceDynamicSig.sol\";\nimport \"./submodules/auth/SequenceNoChainIdSig.sol\";\nimport \"./submodules/auth/SequenceChainedSig.sol\";\n\n\nabstract contract ModuleAuth is\n IModuleAuth,\n ModuleERC165,\n IERC1271Wallet,\n SequenceChainedSig\n{\n using LibBytes for bytes;\n\n bytes1 internal constant LEGACY_TYPE = hex\"00\";\n bytes1 internal constant DYNAMIC_TYPE = hex\"01\";\n bytes1 internal constant NO_CHAIN_ID_TYPE = hex\"02\";\n bytes1 internal constant CHAINED_TYPE = hex\"03\";\n\n bytes4 internal constant SELECTOR_ERC1271_BYTES_BYTES = 0x20c13b0b;\n bytes4 internal constant SELECTOR_ERC1271_BYTES32_BYTES = 0x1626ba7e;\n\n /**\n * @notice Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature.\n * @dev The signature must be prefixed with a type byte, which is used to determine the recovery method.\n *\n * @param _digest Digest of the signed data.\n * @param _signature A Sequence signature.\n *\n * @return threshold The required number of signatures needed to consider the signature valid.\n * @return weight The actual number of signatures collected in the signature.\n * @return imageHash The imageHash of the configuration that signed the message.\n * @return subdigest A modified version of the original digest, unique for each wallet/network.\n * @return checkpoint A nonce that is incremented every time a new configuration is set.\n */\n function signatureRecovery(\n bytes32 _digest,\n bytes calldata _signature\n ) public override virtual view returns (\n uint256 threshold,\n uint256 weight,\n bytes32 imageHash,\n bytes32 subdigest,\n uint256 checkpoint\n ) {\n bytes1 signatureType = _signature[0];\n\n if (signatureType == LEGACY_TYPE) {\n // networkId digest + base recover\n subdigest = SequenceBaseSig.subdigest(_digest);\n (threshold, weight, imageHash, checkpoint) = SequenceBaseSig.recover(subdigest, _signature);\n return (threshold, weight, imageHash, subdigest, checkpoint);\n }\n\n if (signatureType == DYNAMIC_TYPE) {\n // networkId digest + dynamic recover\n subdigest = SequenceBaseSig.subdigest(_digest);\n (threshold, weight, imageHash, checkpoint) = SequenceDynamicSig.recover(subdigest, _signature);\n return (threshold, weight, imageHash, subdigest, checkpoint);\n }\n\n if (signatureType == NO_CHAIN_ID_TYPE) {\n // noChainId digest + dynamic recover\n subdigest = SequenceNoChainIdSig.subdigest(_digest);\n (threshold, weight, imageHash, checkpoint) = SequenceDynamicSig.recover(subdigest, _signature);\n return (threshold, weight, imageHash, subdigest, checkpoint);\n }\n\n if (signatureType == CHAINED_TYPE) {\n // original digest + chained recover\n // (subdigest will be computed in the chained recover)\n return chainedRecover(_digest, _signature);\n }\n\n revert InvalidSignatureType(signatureType);\n }\n\n /**\n * @dev Validates a signature.\n *\n * @param _digest Digest of the signed data.\n * @param _signature A Sequence signature.\n *\n * @return isValid Indicates whether the signature is valid or not.\n * @return subdigest A modified version of the original digest, unique for each wallet/network.\n */\n function _signatureValidation(\n bytes32 _digest,\n bytes calldata _signature\n ) internal override virtual view returns (\n bool isValid,\n bytes32 subdigest\n ) {\n uint256 threshold; uint256 weight; bytes32 imageHash;\n (threshold, weight, imageHash, subdigest,) = signatureRecovery(_digest, _signature);\n isValid = weight >= threshold && _isValidImage(imageHash);\n }\n\n /**\n * @notice Verifies whether the provided signature is valid with respect to the provided data\n * @dev MUST return the correct magic value if the signature provided is valid for the provided data\n * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\"))\n * @param _data Arbitrary length data signed on the behalf of address(this)\n * @param _signatures Signature byte array associated with _data.\n * Encoded as abi.encode(Signature[], Configs)\n * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise\n */\n function isValidSignature(\n bytes calldata _data,\n bytes calldata _signatures\n ) public override virtual view returns (bytes4) {\n // Validate signatures\n (bool isValid,) = _signatureValidation(keccak256(_data), _signatures);\n if (isValid) {\n return SELECTOR_ERC1271_BYTES_BYTES;\n }\n\n return bytes4(0);\n }\n\n /**\n * @notice Verifies whether the provided signature is valid with respect to the provided hash\n * @dev MUST return the correct magic value if the signature provided is valid for the provided hash\n * > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))\n * @param _hash keccak256 hash that was signed\n * @param _signatures Signature byte array associated with _data.\n * Encoded as abi.encode(Signature[], Configs)\n * @return magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise\n */\n function isValidSignature(\n bytes32 _hash,\n bytes calldata _signatures\n ) public override virtual view returns (bytes4) {\n // Validate signatures\n (bool isValid,) = _signatureValidation(_hash, _signatures);\n if (isValid) {\n return SELECTOR_ERC1271_BYTES32_BYTES;\n }\n\n return bytes4(0);\n }\n\n /**\n * @notice Query if a contract implements an interface\n * @param _interfaceID The interface identifier, as specified in ERC-165\n * @return `true` if the contract implements `_interfaceID`\n */\n function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {\n if (\n _interfaceID == type(IModuleAuth).interfaceId ||\n _interfaceID == type(IERC1271Wallet).interfaceId\n ) {\n return true;\n }\n\n return super.supportsInterface(_interfaceID);\n }\n\n /**\n * @notice Updates the signers configuration of the wallet\n * @param _imageHash New required image hash of the signature\n */\n function updateImageHash(bytes32 _imageHash) external override virtual onlySelf {\n _updateImageHash(_imageHash);\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"../../../../utils/SignatureValidator.sol\";\nimport \"../../../../utils/LibBytesPointer.sol\";\nimport \"../../../../utils/LibBytes.sol\";\nimport \"../../../../utils/LibOptim.sol\";\n\n\n/**\n * @title SequenceBaseSig Library\n * @author Agustin Aguilar (aa@horizon.io)\n * @notice A Solidity implementation for handling signatures in the Sequence protocol.\n */\nlibrary SequenceBaseSig {\n using LibBytesPointer for bytes;\n\n uint256 private constant FLAG_SIGNATURE = 0;\n uint256 private constant FLAG_ADDRESS = 1;\n uint256 private constant FLAG_DYNAMIC_SIGNATURE = 2;\n uint256 private constant FLAG_NODE = 3;\n uint256 private constant FLAG_BRANCH = 4;\n uint256 private constant FLAG_SUBDIGEST = 5;\n uint256 private constant FLAG_NESTED = 6;\n\n error InvalidNestedSignature(bytes32 _hash, address _addr, bytes _signature);\n error InvalidSignatureFlag(uint256 _flag);\n\n /**\n * @notice Generates a subdigest for the input digest (unique for this wallet and network).\n * @param _digest The input digest to generate the subdigest from.\n * @return bytes32 The subdigest generated from the input digest.\n */\n function subdigest(\n bytes32 _digest\n ) internal view returns (bytes32) {\n return keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n block.chainid,\n address(this),\n _digest\n )\n );\n }\n\n /**\n * @notice Generates the leaf for an address and weight.\n * @dev The leaf is generated by concatenating the address and weight.\n *\n * @param _addr The address to generate the leaf for.\n * @param _weight The weight to generate the leaf for.\n * @return bytes32 The leaf generated from the address and weight.\n */\n function _leafForAddressAndWeight(\n address _addr,\n uint96 _weight\n ) internal pure returns (bytes32) {\n unchecked {\n return bytes32(uint256(_weight) << 160 | uint256(uint160(_addr)));\n }\n }\n\n /**\n * @notice Generates the leaf for a hardcoded subdigest.\n * @dev The leaf is generated by hashing 'Sequence static digest:\\n' and the subdigest.\n * @param _subdigest The subdigest to generate the leaf for.\n * @return bytes32 The leaf generated from the hardcoded subdigest.\n */\n function _leafForHardcodedSubdigest(\n bytes32 _subdigest\n ) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked('Sequence static digest:\\n', _subdigest));\n }\n\n /**\n * @notice Generates the leaf for a nested tree node.\n * @dev The leaf is generated by hashing 'Sequence nested config:\\n', the node, the threshold and the weight.\n *\n * @param _node The root of the node to generate the leaf for.\n * @param _threshold The internal threshold of the tree.\n * @param _weight The external weight of the tree.\n * @return bytes32 The leaf generated from the nested tree.\n */\n function _leafForNested(\n bytes32 _node,\n uint256 _threshold,\n uint256 _weight\n ) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked('Sequence nested config:\\n', _node, _threshold, _weight));\n }\n\n /**\n * @notice Returns the weight and root of a signature branch.\n * @dev If the signature contains a hardcoded subdigest, and it matches the input digest, then the weight is set to 2 ** 256 - 1.\n *\n * @param _subdigest The digest to verify the signature against.\n * @param _signature The signature branch to recover.\n * @return weight The total weight of the recovered signatures.\n * @return root The root hash of the recovered configuration.\n */\n function recoverBranch(\n bytes32 _subdigest,\n bytes calldata _signature\n ) internal view returns (\n uint256 weight,\n bytes32 root\n ) {\n unchecked {\n uint256 rindex;\n\n // Iterate until the image is completed\n while (rindex < _signature.length) {\n // Read next item type\n uint256 flag;\n (flag, rindex) = _signature.readUint8(rindex);\n\n if (flag == FLAG_ADDRESS) {\n // Read plain address\n uint8 addrWeight; address addr;\n (addrWeight, addr, rindex) = _signature.readUint8Address(rindex);\n\n // Write weight and address to image\n bytes32 node = _leafForAddressAndWeight(addr, addrWeight);\n root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node;\n continue;\n }\n\n if (flag == FLAG_SIGNATURE) {\n // Read weight\n uint8 addrWeight;\n (addrWeight, rindex) = _signature.readUint8(rindex);\n\n // Read single signature and recover signer\n uint256 nrindex = rindex + 66;\n address addr = SignatureValidator.recoverSigner(_subdigest, _signature[rindex:nrindex]);\n rindex = nrindex;\n\n // Acumulate total weight of the signature\n weight += addrWeight;\n\n // Write weight and address to image\n bytes32 node = _leafForAddressAndWeight(addr, addrWeight);\n root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node;\n continue;\n }\n\n if (flag == FLAG_DYNAMIC_SIGNATURE) {\n // Read signer and weight\n uint8 addrWeight; address addr;\n (addrWeight, addr, rindex) = _signature.readUint8Address(rindex);\n\n // Read signature size\n uint256 size;\n (size, rindex) = _signature.readUint24(rindex);\n\n // Read dynamic size signature\n uint256 nrindex = rindex + size;\n if (!SignatureValidator.isValidSignature(_subdigest, addr, _signature[rindex:nrindex])) {\n revert InvalidNestedSignature(_subdigest, addr, _signature[rindex:nrindex]);\n }\n rindex = nrindex;\n\n // Acumulate total weight of the signature\n weight += addrWeight;\n\n // Write weight and address to image\n bytes32 node = _leafForAddressAndWeight(addr, addrWeight);\n root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node;\n continue;\n }\n\n if (flag == FLAG_NODE) {\n // Read node hash\n bytes32 node;\n (node, rindex) = _signature.readBytes32(rindex);\n root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node;\n continue;\n }\n\n if (flag == FLAG_BRANCH) {\n // Enter a branch of the signature merkle tree\n uint256 size;\n (size, rindex) = _signature.readUint24(rindex);\n uint256 nrindex = rindex + size;\n\n uint256 nweight; bytes32 node;\n (nweight, node) = recoverBranch(_subdigest, _signature[rindex:nrindex]);\n\n weight += nweight;\n root = LibOptim.fkeccak256(root, node);\n\n rindex = nrindex;\n continue;\n }\n\n if (flag == FLAG_NESTED) {\n // Enter a branch of the signature merkle tree\n // but with an internal threshold and an external fixed weight\n uint256 externalWeight;\n (externalWeight, rindex) = _signature.readUint8(rindex);\n\n uint256 internalThreshold;\n (internalThreshold, rindex) = _signature.readUint16(rindex);\n\n uint256 size;\n (size, rindex) = _signature.readUint24(rindex);\n uint256 nrindex = rindex + size;\n\n uint256 internalWeight; bytes32 internalRoot;\n (internalWeight, internalRoot) = recoverBranch(_subdigest, _signature[rindex:nrindex]);\n rindex = nrindex;\n\n if (internalWeight >= internalThreshold) {\n weight += externalWeight;\n }\n\n bytes32 node = _leafForNested(internalRoot, internalThreshold, externalWeight);\n root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node;\n\n continue;\n }\n\n if (flag == FLAG_SUBDIGEST) {\n // A hardcoded always accepted digest\n // it pushes the weight to the maximum\n bytes32 hardcoded;\n (hardcoded, rindex) = _signature.readBytes32(rindex);\n if (hardcoded == _subdigest) {\n weight = type(uint256).max;\n }\n\n bytes32 node = _leafForHardcodedSubdigest(hardcoded);\n root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node;\n continue;\n }\n\n revert InvalidSignatureFlag(flag);\n }\n }\n }\n\n /**\n * @notice Returns the threshold, weight, root, and checkpoint of a signature.\n * @dev To verify the signature, the weight must be greater than or equal to the threshold, and the root\n * must match the expected `imageHash` of the wallet.\n *\n * @param _subdigest The digest to verify the signature against.\n * @param _signature The signature to recover.\n * @return threshold The minimum weight required for the signature to be valid.\n * @return weight The total weight of the recovered signatures.\n * @return imageHash The root hash of the recovered configuration\n * @return checkpoint The checkpoint of the signature.\n */\n function recover(\n bytes32 _subdigest,\n bytes calldata _signature\n ) internal view returns (\n uint256 threshold,\n uint256 weight,\n bytes32 imageHash,\n uint256 checkpoint\n ) {\n unchecked {\n (weight, imageHash) = recoverBranch(_subdigest, _signature[6:]);\n\n // Threshold & checkpoint are the top nodes\n // (but they are first on the signature)\n threshold = LibBytes.readFirstUint16(_signature);\n checkpoint = LibBytes.readUint32(_signature, 2);\n\n imageHash = LibOptim.fkeccak256(imageHash, bytes32(threshold));\n imageHash = LibOptim.fkeccak256(imageHash, bytes32(checkpoint));\n }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n/**\n * @title Library for optimized EVM operations\n * @author Agustin Aguilar (aa@horizon.io)\n * @notice This library contains functions for optimizing certain EVM operations.\n */\nlibrary LibOptim {\n\n /**\n * @notice Computes the keccak256 hash of two 32-byte inputs.\n * @dev It uses only scratch memory space.\n * @param _a The first 32 bytes of the hash.\n * @param _b The second 32 bytes of the hash.\n * @return c The keccak256 hash of the two 32-byte inputs.\n */\n function fkeccak256(\n bytes32 _a,\n bytes32 _b\n ) internal pure returns (bytes32 c) {\n assembly {\n mstore(0, _a)\n mstore(32, _b)\n c := keccak256(0, 64)\n }\n }\n\n /**\n * @notice Returns the return data from the last call.\n * @return r The return data from the last call.\n */\n function returnData() internal pure returns (bytes memory r) {\n assembly {\n let size := returndatasize()\n r := mload(0x40)\n let start := add(r, 32)\n mstore(0x40, add(start, size))\n mstore(r, size)\n returndatacopy(start, 0, size)\n }\n }\n\n /**\n * @notice Calls another contract with the given parameters.\n * @dev This method doesn't increase the memory pointer.\n * @param _to The address of the contract to call.\n * @param _val The value to send to the contract.\n * @param _gas The amount of gas to provide for the call.\n * @param _data The data to send to the contract.\n * @return r The success status of the call.\n */\n function call(\n address _to,\n uint256 _val,\n uint256 _gas,\n bytes calldata _data\n ) internal returns (bool r) {\n assembly {\n let tmp := mload(0x40)\n calldatacopy(tmp, _data.offset, _data.length)\n\n r := call(\n _gas,\n _to,\n _val,\n tmp,\n _data.length,\n 0,\n 0\n )\n }\n }\n\n /**\n * @notice Calls another contract with the given parameters, using delegatecall.\n * @dev This method doesn't increase the memory pointer.\n * @param _to The address of the contract to call.\n * @param _gas The amount of gas to provide for the call.\n * @param _data The data to send to the contract.\n * @return r The success status of the call.\n */\n function delegatecall(\n address _to,\n uint256 _gas,\n bytes calldata _data\n ) internal returns (bool r) {\n assembly {\n let tmp := mload(0x40)\n calldatacopy(tmp, _data.offset, _data.length)\n\n r := delegatecall(\n _gas,\n _to,\n tmp,\n _data.length,\n 0,\n 0\n )\n }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\n/**\n * @title Library for reading data from bytes arrays\n * @author Agustin Aguilar (aa@horizon.io)\n * @notice This library contains functions for reading data from bytes arrays.\n *\n * @dev These functions do not check if the input index is within the bounds of the data array.\n * Reading out of bounds may return dirty values.\n */\nlibrary LibBytes {\n\n /**\n * @notice Returns the bytes32 value at the given index in the input data.\n * @param data The input data.\n * @param index The index of the value to retrieve.\n * @return a The bytes32 value at the given index.\n */\n function readBytes32(\n bytes calldata data,\n uint256 index\n ) internal pure returns (\n bytes32 a\n ) {\n assembly {\n a := calldataload(add(data.offset, index))\n }\n }\n\n /**\n * @notice Returns the uint8 value at the given index in the input data.\n * @param data The input data.\n * @param index The index of the value to retrieve.\n * @return a The uint8 value at the given index.\n */\n function readUint8(\n bytes calldata data,\n uint256 index\n ) internal pure returns (\n uint8 a\n ) {\n assembly {\n let word := calldataload(add(index, data.offset))\n a := shr(248, word)\n }\n }\n\n /**\n * @notice Returns the first uint16 value in the input data.\n * @param data The input data.\n * @return a The first uint16 value in the input data.\n */\n function readFirstUint16(\n bytes calldata data\n ) internal pure returns (\n uint16 a\n ) {\n assembly {\n let word := calldataload(data.offset)\n a := shr(240, word)\n }\n }\n\n /**\n * @notice Returns the uint32 value at the given index in the input data.\n * @param data The input data.\n * @param index The index of the value to retrieve.\n * @return a The uint32 value at the given index.\n */\n function readUint32(\n bytes calldata data,\n uint256 index\n ) internal pure returns (\n uint32 a\n ) {\n assembly {\n let word := calldataload(add(index, data.offset))\n a := shr(224, word)\n }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\n/**\n * @title Library for reading data from bytes arrays with a pointer\n * @author Agustin Aguilar (aa@horizon.io)\n * @notice This library contains functions for reading data from bytes arrays with a pointer.\n *\n * @dev These functions do not check if the input index is within the bounds of the data array.\n * Reading out of bounds may return dirty values.\n */\nlibrary LibBytesPointer {\n\n /**\n * @dev Returns the first uint16 value in the input data and updates the pointer.\n * @param _data The input data.\n * @return a The first uint16 value.\n * @return newPointer The new pointer.\n */\n function readFirstUint16(\n bytes calldata _data\n ) internal pure returns (\n uint16 a,\n uint256 newPointer\n ) {\n assembly {\n let word := calldataload(_data.offset)\n a := shr(240, word)\n newPointer := 2\n }\n }\n\n /**\n * @notice Returns the uint8 value at the given index in the input data and updates the pointer.\n * @param _data The input data.\n * @param _index The index of the value to retrieve.\n * @return a The uint8 value at the given index.\n * @return newPointer The new pointer.\n */\n function readUint8(\n bytes calldata _data,\n uint256 _index\n ) internal pure returns (\n uint8 a,\n uint256 newPointer\n ) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := shr(248, word)\n newPointer := add(_index, 1)\n }\n }\n\n /**\n * @notice Returns the uint8 value and the address at the given index in the input data and updates the pointer.\n * @param _data The input data.\n * @param _index The index of the value to retrieve.\n * @return a The uint8 value at the given index.\n * @return b The following address value.\n * @return newPointer The new pointer.\n */\n function readUint8Address(\n bytes calldata _data,\n uint256 _index\n ) internal pure returns (\n uint8 a,\n address b,\n uint256 newPointer\n ) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := shr(248, word)\n b := and(shr(88, word), 0xffffffffffffffffffffffffffffffffffffffff)\n newPointer := add(_index, 21)\n }\n }\n\n /**\n * @notice Returns the uint16 value at the given index in the input data and updates the pointer.\n * @param _data The input data.\n * @param _index The index of the value to retrieve.\n * @return a The uint16 value at the given index.\n * @return newPointer The new pointer.\n */\n function readUint16(\n bytes calldata _data,\n uint256 _index\n ) internal pure returns (\n uint16 a,\n uint256 newPointer\n ) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := and(shr(240, word), 0xffff)\n newPointer := add(_index, 2)\n }\n }\n\n /**\n * @notice Returns the uint24 value at the given index in the input data and updates the pointer.\n * @param _data The input data.\n * @param _index The index of the value to retrieve.\n * @return a The uint24 value at the given index.\n * @return newPointer The new pointer.\n */\n function readUint24(\n bytes calldata _data,\n uint256 _index\n ) internal pure returns (\n uint24 a,\n uint256 newPointer\n ) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := and(shr(232, word), 0xffffff)\n newPointer := add(_index, 3)\n }\n }\n\n /**\n * @notice Returns the uint64 value at the given index in the input data and updates the pointer.\n * @param _data The input data.\n * @param _index The index of the value to retrieve.\n * @return a The uint64 value at the given index.\n * @return newPointer The new pointer.\n */\n function readUint64(\n bytes calldata _data,\n uint256 _index\n ) internal pure returns (\n uint64 a,\n uint256 newPointer\n ) {\n assembly {\n let word := calldataload(add(_index, _data.offset))\n a := and(shr(192, word), 0xffffffffffffffff)\n newPointer := add(_index, 8)\n }\n }\n\n /**\n * @notice Returns the bytes32 value at the given index in the input data and updates the pointer.\n * @param _data The input data.\n * @param _pointer The index of the value to retrieve.\n * @return a The bytes32 value at the given index.\n * @return newPointer The new pointer.\n */\n function readBytes32(\n bytes calldata _data,\n uint256 _pointer\n ) internal pure returns (\n bytes32 a,\n uint256 newPointer\n ) {\n assembly {\n a := calldataload(add(_pointer, _data.offset))\n newPointer := add(_pointer, 32)\n }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"../interfaces/IERC1271Wallet.sol\";\n\nimport \"./LibBytes.sol\";\n\n/**\n * @dev Contains logic for signature validation.\n * Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md)\n * Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/\n */\nlibrary SignatureValidator {\n // Errors\n error InvalidSignatureLength(bytes _signature);\n error EmptySignature();\n error InvalidSValue(bytes _signature, bytes32 _s);\n error InvalidVValue(bytes _signature, uint256 _v);\n error UnsupportedSignatureType(bytes _signature, uint256 _type, bool _recoverMode);\n error SignerIsAddress0(bytes _signature);\n\n using LibBytes for bytes;\n\n /***********************************|\n | Variables |\n |__________________________________*/\n\n // bytes4(keccak256(\"isValidSignature(bytes,bytes)\"))\n bytes4 constant internal ERC1271_MAGICVALUE = 0x20c13b0b;\n\n // bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))\n bytes4 constant internal ERC1271_MAGICVALUE_BYTES32 = 0x1626ba7e;\n\n // Allowed signature types.\n uint256 private constant SIG_TYPE_EIP712 = 1;\n uint256 private constant SIG_TYPE_ETH_SIGN = 2;\n uint256 private constant SIG_TYPE_WALLET_BYTES32 = 3;\n\n /***********************************|\n | Signature Functions |\n |__________________________________*/\n\n /**\n * @notice Recover the signer of hash, assuming it's an EOA account\n * @dev Only for SignatureType.EIP712 and SignatureType.EthSign signatures\n * @param _hash Hash that was signed\n * encoded as (bytes32 r, bytes32 s, uint8 v, ... , SignatureType sigType)\n */\n function recoverSigner(\n bytes32 _hash,\n bytes calldata _signature\n ) internal pure returns (address signer) {\n if (_signature.length != 66) revert InvalidSignatureLength(_signature);\n uint256 signatureType = _signature.readUint8(_signature.length - 1);\n\n // Variables are not scoped in Solidity.\n uint8 v = _signature.readUint8(64);\n bytes32 r = _signature.readBytes32(0);\n bytes32 s = _signature.readBytes32(32);\n\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n //\n // Source OpenZeppelin\n // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol\n\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n revert InvalidSValue(_signature, s);\n }\n\n if (v != 27 && v != 28) {\n revert InvalidVValue(_signature, v);\n }\n\n // Signature using EIP712\n if (signatureType == SIG_TYPE_EIP712) {\n signer = ecrecover(_hash, v, r, s);\n\n // Signed using web3.eth_sign() or Ethers wallet.signMessage()\n } else if (signatureType == SIG_TYPE_ETH_SIGN) {\n signer = ecrecover(\n keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", _hash)),\n v,\n r,\n s\n );\n\n } else {\n // We cannot recover the signer for any other signature type.\n revert UnsupportedSignatureType(_signature, signatureType, true);\n }\n\n // Prevent signer from being 0x0\n if (signer == address(0x0)) revert SignerIsAddress0(_signature);\n\n return signer;\n }\n\n /**\n * @notice Returns true if the provided signature is valid for the given signer.\n * @dev Supports SignatureType.EIP712, SignatureType.EthSign, and ERC1271 signatures\n * @param _hash Hash that was signed\n * @param _signer Address of the signer candidate\n * @param _signature Signature byte array\n */\n function isValidSignature(\n bytes32 _hash,\n address _signer,\n bytes calldata _signature\n ) internal view returns (bool valid) {\n if (_signature.length == 0) {\n revert EmptySignature();\n }\n\n uint256 signatureType = uint8(_signature[_signature.length - 1]);\n if (signatureType == SIG_TYPE_EIP712 || signatureType == SIG_TYPE_ETH_SIGN) {\n // Recover signer and compare with provided\n valid = recoverSigner(_hash, _signature) == _signer;\n\n } else if (signatureType == SIG_TYPE_WALLET_BYTES32) {\n // Remove signature type before calling ERC1271, restore after call\n valid = ERC1271_MAGICVALUE_BYTES32 == IERC1271Wallet(_signer).isValidSignature(_hash, _signature[0:_signature.length - 1]);\n\n } else {\n // We cannot validate any other signature type.\n // We revert because we can say nothing about its validity.\n revert UnsupportedSignatureType(_signature, signatureType, false);\n }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\nabstract contract ModuleERC165 {\n /**\n * @notice Query if a contract implements an interface\n * @param _interfaceID The interface identifier, as specified in ERC-165\n * @dev Adding new hooks will not lead to them being reported by this function\n * without upgrading the wallet. In addition, developers must ensure that\n * all inherited contracts by the main module don't conflict and are accounted\n * to be supported by the supportsInterface method.\n * @return `true` if the contract implements `_interfaceID`\n */\n function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) {\n return _interfaceID == this.supportsInterface.selector;\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\ncontract ModuleSelfAuth {\n error OnlySelfAuth(address _sender, address _self);\n\n modifier onlySelf() {\n if (msg.sender != address(this)) {\n revert OnlySelfAuth(msg.sender, address(this));\n }\n _;\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\ninterface IModuleCreator {\n error CreateFailed(bytes _code);\n\n /**\n * @notice Creates a contract forwarding eth value\n * @param _code Creation code of the contract\n * @return addr The address of the created contract\n */\n function createContract(bytes calldata _code) external payable returns (address addr);\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\nlibrary SubModuleNonce {\n // Nonce schema\n //\n // - space[160]:nonce[96]\n //\n uint256 internal constant NONCE_BITS = 96;\n bytes32 internal constant NONCE_MASK = bytes32(uint256(type(uint96).max));\n\n /**\n * @notice Decodes a raw nonce\n * @dev Schema: space[160]:type[96]\n * @param _rawNonce Nonce to be decoded\n * @return _space The nonce space of the raw nonce\n * @return _nonce The nonce of the raw nonce\n */\n function decodeNonce(uint256 _rawNonce) internal pure returns (\n uint256 _space,\n uint256 _nonce\n ) {\n unchecked {\n // Decode nonce\n _space = _rawNonce >> NONCE_BITS;\n _nonce = uint256(bytes32(_rawNonce) & NONCE_MASK);\n }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\nabstract contract IModuleAuth {\n // IMAGE_HASH_KEY = keccak256(\"org.arcadeum.module.auth.upgradable.image.hash\");\n bytes32 internal constant IMAGE_HASH_KEY = bytes32(0xea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8);\n\n event ImageHashUpdated(bytes32 newImageHash);\n\n // Errors\n error ImageHashIsZero();\n error InvalidSignatureType(bytes1 _type);\n\n function _signatureValidation(\n bytes32 _digest,\n bytes calldata _signature\n ) internal virtual view returns (\n bool isValid,\n bytes32 subdigest\n );\n\n function signatureRecovery(\n bytes32 _digest,\n bytes calldata _signature\n ) public virtual view returns (\n uint256 threshold,\n uint256 weight,\n bytes32 imageHash,\n bytes32 subdigest,\n uint256 checkpoint\n );\n\n /**\n * @notice Validates the signature image\n * @return true if the signature image is valid\n */\n function _isValidImage(bytes32) internal virtual view returns (bool) {\n return false;\n }\n\n /**\n * @notice Updates the signers configuration of the wallet\n * @param _imageHash New required image hash of the signature\n */\n function updateImageHash(bytes32 _imageHash) external virtual;\n\n /**\n * @notice Updates the signers configuration of the wallet\n * @param _imageHash New required image hash of the signature\n */\n function _updateImageHash(bytes32 _imageHash) internal virtual;\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\ninterface IModuleCalls {\n // Events\n event TxFailed(bytes32 indexed _tx, uint256 _index, bytes _reason);\n event TxExecuted(bytes32 indexed _tx, uint256 _index);\n\n // Errors\n error NotEnoughGas(uint256 _index, uint256 _requested, uint256 _available);\n error InvalidSignature(bytes32 _hash, bytes _signature);\n\n // Transaction structure\n struct Transaction {\n bool delegateCall; // Performs delegatecall\n bool revertOnError; // Reverts transaction bundle if tx fails\n uint256 gasLimit; // Maximum gas to be forwarded\n address target; // Address of the contract to call\n uint256 value; // Amount of ETH to pass with the call\n bytes data; // calldata to pass\n }\n\n /**\n * @notice Allow wallet owner to execute an action\n * @param _txs Transactions to process\n * @param _nonce Signature nonce (may contain an encoded space)\n * @param _signature Encoded signature\n */\n function execute(\n Transaction[] calldata _txs,\n uint256 _nonce,\n bytes calldata _signature\n ) external;\n\n /**\n * @notice Allow wallet to execute an action\n * without signing the message\n * @param _txs Transactions to execute\n */\n function selfExecute(\n Transaction[] calldata _txs\n ) external;\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\ncontract ModuleOnlyDelegatecall {\n address private immutable self;\n\n error OnlyDelegatecall();\n\n constructor() {\n self = address(this);\n }\n\n /**\n * @notice Modifier that only allows functions to be called via delegatecall.\n */\n modifier onlyDelegatecall() {\n if (address(this) == self) {\n revert OnlyDelegatecall();\n }\n _;\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"./ModuleStorage.sol\";\n\nimport \"./submodules/nonce/SubModuleNonce.sol\";\n\n\ncontract ModuleNonce {\n // Events\n event NonceChange(uint256 _space, uint256 _newNonce);\n\n // Errors\n error BadNonce(uint256 _space, uint256 _provided, uint256 _current);\n\n // NONCE_KEY = keccak256(\"org.arcadeum.module.calls.nonce\");\n bytes32 private constant NONCE_KEY = bytes32(0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e);\n\n /**\n * @notice Returns the next nonce of the default nonce space\n * @dev The default nonce space is 0x00\n * @return The next nonce\n */\n function nonce() external virtual view returns (uint256) {\n return readNonce(0);\n }\n\n /**\n * @notice Returns the next nonce of the given nonce space\n * @param _space Nonce space, each space keeps an independent nonce count\n * @return The next nonce\n */\n function readNonce(uint256 _space) public virtual view returns (uint256) {\n return uint256(ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space)));\n }\n\n /**\n * @notice Changes the next nonce of the given nonce space\n * @param _space Nonce space, each space keeps an independent nonce count\n * @param _nonce Nonce to write on the space\n */\n function _writeNonce(uint256 _space, uint256 _nonce) internal {\n ModuleStorage.writeBytes32Map(NONCE_KEY, bytes32(_space), bytes32(_nonce));\n }\n\n /**\n * @notice Verify if a nonce is valid\n * @param _rawNonce Nonce to validate (may contain an encoded space)\n */\n function _validateNonce(uint256 _rawNonce) internal virtual {\n // Retrieve current nonce for this wallet\n (uint256 space, uint256 providedNonce) = SubModuleNonce.decodeNonce(_rawNonce);\n\n uint256 currentNonce = readNonce(space);\n if (currentNonce != providedNonce) {\n revert BadNonce(space, providedNonce, currentNonce);\n }\n\n unchecked {\n uint256 newNonce = providedNonce + 1;\n\n _writeNonce(space, newNonce);\n emit NonceChange(space, newNonce);\n return;\n }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\nlibrary ModuleStorage {\n function writeBytes32(bytes32 _key, bytes32 _val) internal {\n assembly { sstore(_key, _val) }\n }\n\n function readBytes32(bytes32 _key) internal view returns (bytes32 val) {\n assembly { val := sload(_key) }\n }\n\n function writeBytes32Map(bytes32 _key, bytes32 _subKey, bytes32 _val) internal {\n bytes32 key = keccak256(abi.encode(_key, _subKey));\n assembly { sstore(key, _val) }\n }\n\n function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val) {\n bytes32 key = keccak256(abi.encode(_key, _subKey));\n assembly { val := sload(key) }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"./SequenceBaseSig.sol\";\n\nimport \"../../interfaces/IModuleAuth.sol\";\n\nimport \"../../ModuleSelfAuth.sol\";\nimport \"../../ModuleStorage.sol\";\n\nimport \"../../../../utils/LibBytesPointer.sol\";\nimport \"../../../../utils/LibOptim.sol\";\n\n/**\n * @title Sequence chained auth recovery submodule\n * @author Agustin Aguilar (aa@horizon.io)\n * @notice Defines Sequence signatures that work by delegating control to new configurations.\n * @dev The delegations can be chained together, the first signature is the one that is used to validate\n * the message, the last signature must match the current on-chain configuration of the wallet.\n */\nabstract contract SequenceChainedSig is IModuleAuth, ModuleSelfAuth {\n using LibBytesPointer for bytes;\n\n bytes32 public constant SET_IMAGE_HASH_TYPE_HASH = keccak256(\"SetImageHash(bytes32 imageHash)\");\n\n error LowWeightChainedSignature(bytes _signature, uint256 threshold, uint256 _weight);\n error WrongChainedCheckpointOrder(uint256 _current, uint256 _prev);\n\n /**\n * @notice Defined the special token that must be signed to delegate control to a new configuration.\n * @param _imageHash The hash of the new configuration.\n * @return bytes32 The message hash to be signed.\n */\n function _hashSetImageHashStruct(bytes32 _imageHash) internal pure returns (bytes32) {\n return LibOptim.fkeccak256(SET_IMAGE_HASH_TYPE_HASH, _imageHash);\n }\n\n /**\n * @notice Returns the threshold, weight, root, and checkpoint of a (chained) signature.\n * \n * @dev This method return the `threshold`, `weight` and `imageHash` of the last signature in the chain.\n * Intermediate signatures are validated directly in this method. The `subdigest` is the one of the\n * first signature in the chain (since that's the one that is used to validate the message).\n *\n * @param _digest The digest to recover the signature from.\n * @param _signature The signature to recover.\n * @return threshold The threshold of the (last) signature.\n * @return weight The weight of the (last) signature.\n * @return imageHash The image hash of the (last) signature.\n * @return subdigest The subdigest of the (first) signature in the chain.\n * @return checkpoint The checkpoint of the (last) signature.\n */\n function chainedRecover(\n bytes32 _digest,\n bytes calldata _signature\n ) internal view returns (\n uint256 threshold,\n uint256 weight,\n bytes32 imageHash,\n bytes32 subdigest,\n uint256 checkpoint\n ) {\n uint256 rindex = 1;\n uint256 sigSize;\n\n //\n // First signature out of the loop\n //\n\n // First uint24 is the size of the signature\n (sigSize, rindex) = _signature.readUint24(rindex);\n uint256 nrindex = sigSize + rindex;\n\n (\n threshold,\n weight,\n imageHash,\n subdigest,\n checkpoint\n ) = signatureRecovery(\n _digest,\n _signature[rindex:nrindex]\n );\n\n if (weight < threshold) {\n revert LowWeightChainedSignature(_signature[rindex:nrindex], threshold, weight);\n }\n\n rindex = nrindex;\n\n // The following signatures are handled by this loop.\n // This is done this way because the first signature does not have a\n // checkpoint to be validated against.\n while (rindex < _signature.length) {\n // First uint24 is the size of the signature\n (sigSize, rindex) = _signature.readUint24(rindex);\n nrindex = sigSize + rindex;\n\n uint256 nextCheckpoint;\n\n (\n threshold,\n weight,\n imageHash,,\n // Do not change the subdigest;\n // it should remain that of the first signature.\n nextCheckpoint\n ) = signatureRecovery(\n _hashSetImageHashStruct(imageHash),\n _signature[rindex:nrindex]\n );\n\n // Validate signature\n if (weight < threshold) {\n revert LowWeightChainedSignature(_signature[rindex:nrindex], threshold, weight);\n }\n\n // Checkpoints must be provided in descending order\n // since the first signature is the one that is used to validate the message\n // and the last signature is the one that is used to validate the current configuration\n if (nextCheckpoint >= checkpoint) {\n revert WrongChainedCheckpointOrder(nextCheckpoint, checkpoint);\n }\n\n checkpoint = nextCheckpoint;\n rindex = nrindex;\n }\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\nlibrary SequenceNoChainIdSig {\n\n /**\n * @notice Computes a subdigest for a Sequence signature that works on all chains.\n * @dev The subdigest is computed by removing the chain ID from the digest (using 0 instead).\n * @param _digest The digest of the chain of signatures.\n * @return bytes32 The subdigest with no chain ID.\n */\n function subdigest(bytes32 _digest) internal view returns (bytes32) {\n return keccak256(\n abi.encodePacked(\n \"\\x19\\x01\",\n uint256(0),\n address(this),\n _digest\n )\n );\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\nimport \"./SequenceBaseSig.sol\";\n\n\nlibrary SequenceDynamicSig {\n\n /**\n * @notice Recover a \"dynamically encoded\" Sequence signature.\n * @dev The Signature is stripped of the first byte, which is the encoding flag.\n *\n * @param _subdigest The digest of the signature.\n * @param _signature The Sequence signature.\n * @return threshold The threshold weight required to validate the signature.\n * @return weight The weight of the signature.\n * @return imageHash The hash of the recovered configuration.\n * @return checkpoint The checkpoint of the configuration.\n */\n function recover(\n bytes32 _subdigest,\n bytes calldata _signature\n ) internal view returns (\n uint256 threshold,\n uint256 weight,\n bytes32 imageHash,\n uint256 checkpoint\n ) {\n return SequenceBaseSig.recover(_subdigest, _signature[1:]);\n }\n}\n" + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol": { + "content": "// SPDX-License-Identifier: Apache-2.0\npragma solidity 0.8.18;\n\n\ninterface IERC1271Wallet {\n\n /**\n * @notice Verifies whether the provided signature is valid with respect to the provided data\n * @dev MUST return the correct magic value if the signature provided is valid for the provided data\n * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\")\n * > This function MAY modify Ethereum's state\n * @param _data Arbitrary length data signed on the behalf of address(this)\n * @param _signature Signature byte array associated with _data\n * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise\n */\n function isValidSignature(\n bytes calldata _data,\n bytes calldata _signature)\n external\n view\n returns (bytes4 magicValue);\n\n /**\n * @notice Verifies whether the provided signature is valid with respect to the provided hash\n * @dev MUST return the correct magic value if the signature provided is valid for the provided hash\n * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\")\n * > This function MAY modify Ethereum's state\n * @param _hash keccak256 hash that was signed\n * @param _signature Signature byte array associated with _data\n * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise\n */\n function isValidSignature(\n bytes32 _hash,\n bytes calldata _signature)\n external\n view\n returns (bytes4 magicValue);\n}" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 500000 + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.legacyAssembly", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "evm.gasEstimates", + "evm.assembly" + ] + } + }, + "remappings": [ + "@0xsequence/contracts-library/=src/", + "ds-test/=lib/forge-std/lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "murky/=lib/murky/src/", + "@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/", + "@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/", + "erc721a/=lib/chiru-labs/erc721a/", + "erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/", + "@openzeppelin/=lib/openzeppelin/", + "solady/=lib/solady/src/" + ] + } + }, + "output": { + "contracts": { + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol": { + "IERC1271Wallet": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "magicValue", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "magicValue", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "isValidSignature(bytes,bytes)": { + "details": "MUST return the correct magic value if the signature provided is valid for the provided data > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\") > This function MAY modify Ethereum's state", + "params": { + "_data": "Arbitrary length data signed on the behalf of address(this)", + "_signature": "Signature byte array associated with _data" + }, + "returns": { + "magicValue": "Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise" + } + }, + "isValidSignature(bytes32,bytes)": { + "details": "MUST return the correct magic value if the signature provided is valid for the provided hash > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\") > This function MAY modify Ethereum's state", + "params": { + "_hash": "keccak256 hash that was signed", + "_signature": "Signature byte array associated with _data" + }, + "returns": { + "magicValue": "Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": "", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "isValidSignature(bytes,bytes)": "20c13b0b", + "isValidSignature(bytes32,bytes)": "1626ba7e" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"magicValue\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isValidSignature(bytes,bytes)\":{\"details\":\"MUST return the correct magic value if the signature provided is valid for the provided data > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\") > This function MAY modify Ethereum's state\",\"params\":{\"_data\":\"Arbitrary length data signed on the behalf of address(this)\",\"_signature\":\"Signature byte array associated with _data\"},\"returns\":{\"magicValue\":\"Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise\"}},\"isValidSignature(bytes32,bytes)\":{\"details\":\"MUST return the correct magic value if the signature provided is valid for the provided hash > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\") > This function MAY modify Ethereum's state\",\"params\":{\"_hash\":\"keccak256 hash that was signed\",\"_signature\":\"Signature byte array associated with _data\"},\"returns\":{\"magicValue\":\"Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isValidSignature(bytes,bytes)\":{\"notice\":\"Verifies whether the provided signature is valid with respect to the provided data\"},\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Verifies whether the provided signature is valid with respect to the provided hash\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":\"IERC1271Wallet\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":{\"keccak256\":\"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1\",\"dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "isValidSignature(bytes,bytes)": { + "notice": "Verifies whether the provided signature is valid with respect to the provided data" + }, + "isValidSignature(bytes32,bytes)": { + "notice": "Verifies whether the provided signature is valid with respect to the provided hash" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol": { + "GuestModule": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "CreateFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "DelegateCallNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "EmptySignature", + "type": "error" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidNestedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "InvalidSValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_v", + "type": "uint256" + } + ], + "name": "InvalidVValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_requested", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_available", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [], + "name": "NotSupported", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyDelegatecall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_self", + "type": "address" + } + ], + "name": "OnlySelfAuth", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "SignerIsAddress0", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_recoverMode", + "type": "bool" + } + ], + "name": "UnsupportedSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_prev", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "name": "CreatedContract", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "TxExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_reason", + "type": "bytes" + } + ], + "name": "TxFailed", + "type": "event" + }, + { + "inputs": [], + "name": "SET_IMAGE_HASH_TYPE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "createContract", + "outputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signatures", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signatures", + "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": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "signatureRecovery", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subdigest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "createContract(bytes)": { + "params": { + "_code": "Creation code of the contract" + }, + "returns": { + "addr": "The address of the created contract" + } + }, + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": { + "params": { + "_txs": "Transactions to process" + } + }, + "isValidSignature(bytes,bytes)": { + "details": "MUST return the correct magic value if the signature provided is valid for the provided data > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\"))", + "params": { + "_data": "Arbitrary length data signed on the behalf of address(this)", + "_signatures": "Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)" + }, + "returns": { + "_0": "magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise" + } + }, + "isValidSignature(bytes32,bytes)": { + "details": "MUST return the correct magic value if the signature provided is valid for the provided hash > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))", + "params": { + "_hash": "keccak256 hash that was signed", + "_signatures": "Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)" + }, + "returns": { + "_0": "magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise" + } + }, + "nonce()": { + "details": "The default nonce space is 0x00", + "returns": { + "_0": "The next nonce" + } + }, + "readNonce(uint256)": { + "params": { + "_space": "Nonce space, each space keeps an independent nonce count" + }, + "returns": { + "_0": "The next nonce" + } + }, + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": { + "params": { + "_txs": "Transactions to process" + } + }, + "signatureRecovery(bytes32,bytes)": { + "details": "The signature must be prefixed with a type byte, which is used to determine the recovery method.", + "params": { + "_digest": "Digest of the signed data.", + "_signature": "A Sequence signature." + }, + "returns": { + "checkpoint": "A nonce that is incremented every time a new configuration is set.", + "imageHash": "The imageHash of the configuration that signed the message.", + "subdigest": "A modified version of the original digest, unique for each wallet/network.", + "threshold": "The required number of signatures needed to consider the signature valid.", + "weight": "The actual number of signatures collected in the signature." + } + }, + "supportsInterface(bytes4)": { + "params": { + "_interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `_interfaceID`" + } + }, + "updateImageHash(bytes32)": { + "params": { + "_imageHash": "New required image hash of the signature" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":640:3333 contract GuestModule is... */\n mstore(0x40, 0xa0)\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\ntag_1:\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":200:204 this */\n address\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":185:205 self = address(this) */\n 0x80\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":640:3333 contract GuestModule is... */\n mload(0x80)\n codecopy(0x00, dataOffset(sub_0), dataSize(sub_0))\n 0x00\n assignImmutable(\"0x4ffc9d227228e624d76834105f24ceb5cb9c5a8675150ad2031c88a10259e303\")\n return(0x00, dataSize(sub_0))\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":640:3333 contract GuestModule is... */\n mstore(0x40, 0x80)\n jumpi(tag_1, lt(calldatasize, 0x04))\n shr(0xe0, calldataload(0x00))\n dup1\n 0x61c2926c\n gt\n tag_13\n jumpi\n dup1\n 0x8c3f5563\n gt\n tag_14\n jumpi\n dup1\n 0x8c3f5563\n eq\n tag_10\n jumpi\n dup1\n 0x90042baf\n eq\n tag_11\n jumpi\n dup1\n 0xaffed0e0\n eq\n tag_12\n jumpi\n 0x00\n dup1\n revert\n tag_14:\n dup1\n 0x61c2926c\n eq\n tag_7\n jumpi\n dup1\n 0x7a9a1628\n eq\n tag_8\n jumpi\n dup1\n 0x853c5068\n eq\n tag_9\n jumpi\n 0x00\n dup1\n revert\n tag_13:\n dup1\n 0x20c13b0b\n gt\n tag_15\n jumpi\n dup1\n 0x20c13b0b\n eq\n tag_4\n jumpi\n dup1\n 0x29561426\n eq\n tag_5\n jumpi\n dup1\n 0x57c56d6b\n eq\n tag_6\n jumpi\n 0x00\n dup1\n revert\n tag_15:\n dup1\n 0x01ffc9a7\n eq\n tag_2\n jumpi\n dup1\n 0x1626ba7e\n eq\n tag_3\n jumpi\n tag_1:\n 0x00\n dup1\n revert\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3127:3331 function supportsInterface(... */\n tag_2:\n callvalue\n dup1\n iszero\n tag_16\n jumpi\n 0x00\n dup1\n revert\n tag_16:\n pop\n tag_17\n tag_18\n calldatasize\n 0x04\n tag_19\n jump\t// in\n tag_18:\n tag_20\n jump\t// in\n tag_17:\n mload(0x40)\n /* \"#utility.yul\":611:625 */\n swap1\n iszero\n /* \"#utility.yul\":604:626 */\n iszero\n /* \"#utility.yul\":586:627 */\n dup2\n mstore\n /* \"#utility.yul\":574:576 */\n 0x20\n /* \"#utility.yul\":559:577 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3127:3331 function supportsInterface(... */\n tag_21:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5489:5805 function isValidSignature(... */\n tag_3:\n callvalue\n dup1\n iszero\n tag_23\n jumpi\n 0x00\n dup1\n revert\n tag_23:\n pop\n tag_24\n tag_25\n calldatasize\n 0x04\n tag_26\n jump\t// in\n tag_25:\n tag_27\n jump\t// in\n tag_24:\n mload(0x40)\n /* \"#utility.yul\":1646:1712 */\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":1634:1713 */\n swap1\n swap2\n and\n /* \"#utility.yul\":1616:1714 */\n dup2\n mstore\n /* \"#utility.yul\":1604:1606 */\n 0x20\n /* \"#utility.yul\":1589:1607 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5489:5805 function isValidSignature(... */\n tag_21\n /* \"#utility.yul\":1472:1720 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4525:4857 function isValidSignature(... */\n tag_4:\n callvalue\n dup1\n iszero\n tag_30\n jumpi\n 0x00\n dup1\n revert\n tag_30:\n pop\n tag_24\n tag_32\n calldatasize\n 0x04\n tag_33\n jump\t// in\n tag_32:\n tag_34\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6456:6575 function updateImageHash(bytes32 _imageHash) external override virtual onlySelf {... */\n tag_5:\n callvalue\n dup1\n iszero\n tag_36\n jumpi\n 0x00\n dup1\n revert\n tag_36:\n pop\n tag_37\n tag_38\n calldatasize\n 0x04\n tag_39\n jump\t// in\n tag_38:\n tag_40\n jump\t// in\n tag_37:\n stop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":811:906 bytes32 public constant SET_IMAGE_HASH_TYPE_HASH = keccak256(\"SetImageHash(bytes32 imageHash)\") */\n tag_6:\n callvalue\n dup1\n iszero\n tag_41\n jumpi\n 0x00\n dup1\n revert\n tag_41:\n pop\n tag_42\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":862:906 keccak256(\"SetImageHash(bytes32 imageHash)\") */\n 0x8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":811:906 bytes32 public constant SET_IMAGE_HASH_TYPE_HASH = keccak256(\"SetImageHash(bytes32 imageHash)\") */\n dup2\n jump\n tag_42:\n mload(0x40)\n /* \"#utility.yul\":2778:2803 */\n swap1\n dup2\n mstore\n /* \"#utility.yul\":2766:2768 */\n 0x20\n /* \"#utility.yul\":2751:2769 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":811:906 bytes32 public constant SET_IMAGE_HASH_TYPE_HASH = keccak256(\"SetImageHash(bytes32 imageHash)\") */\n tag_21\n /* \"#utility.yul\":2632:2809 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1290:1552 function selfExecute(... */\n tag_7:\n callvalue\n dup1\n iszero\n tag_46\n jumpi\n 0x00\n dup1\n revert\n tag_46:\n pop\n tag_37\n tag_48\n calldatasize\n 0x04\n tag_49\n jump\t// in\n tag_48:\n tag_50\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":890:1182 function execute(... */\n tag_8:\n callvalue\n dup1\n iszero\n tag_51\n jumpi\n 0x00\n dup1\n revert\n tag_51:\n pop\n tag_37\n tag_53\n calldatasize\n 0x04\n tag_54\n jump\t// in\n tag_53:\n tag_55\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1675:3161 function signatureRecovery(... */\n tag_9:\n callvalue\n dup1\n iszero\n tag_56\n jumpi\n 0x00\n dup1\n revert\n tag_56:\n pop\n tag_57\n tag_58\n calldatasize\n 0x04\n tag_26\n jump\t// in\n tag_58:\n tag_59\n jump\t// in\n tag_57:\n 0x40\n dup1\n mload\n /* \"#utility.yul\":4827:4852 */\n swap6\n dup7\n mstore\n /* \"#utility.yul\":4883:4885 */\n 0x20\n /* \"#utility.yul\":4868:4886 */\n dup7\n add\n /* \"#utility.yul\":4861:4895 */\n swap5\n swap1\n swap5\n mstore\n /* \"#utility.yul\":4911:4929 */\n swap3\n dup5\n add\n /* \"#utility.yul\":4904:4938 */\n swap2\n swap1\n swap2\n mstore\n /* \"#utility.yul\":4969:4971 */\n 0x60\n /* \"#utility.yul\":4954:4972 */\n dup4\n add\n /* \"#utility.yul\":4947:4981 */\n mstore\n /* \"#utility.yul\":5012:5015 */\n 0x80\n /* \"#utility.yul\":4997:5016 */\n dup3\n add\n /* \"#utility.yul\":4990:5025 */\n mstore\n /* \"#utility.yul\":4814:4817 */\n 0xa0\n /* \"#utility.yul\":4799:4818 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1675:3161 function signatureRecovery(... */\n tag_21\n /* \"#utility.yul\":4568:5031 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":938:1094 function readNonce(uint256 _space) public virtual view returns (uint256) {... */\n tag_10:\n callvalue\n dup1\n iszero\n tag_62\n jumpi\n 0x00\n dup1\n revert\n tag_62:\n pop\n tag_42\n tag_64\n calldatasize\n 0x04\n tag_39\n jump\t// in\n tag_64:\n tag_66\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":456:732 function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {... */\n tag_11:\n tag_69\n tag_70\n calldatasize\n 0x04\n tag_71\n jump\t// in\n tag_70:\n tag_72\n jump\t// in\n tag_69:\n mload(0x40)\n /* \"#utility.yul\":6753:6795 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":6741:6796 */\n swap1\n swap2\n and\n /* \"#utility.yul\":6723:6797 */\n dup2\n mstore\n /* \"#utility.yul\":6711:6713 */\n 0x20\n /* \"#utility.yul\":6696:6714 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":456:732 function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {... */\n tag_21\n /* \"#utility.yul\":6577:6803 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":670:757 function nonce() external virtual view returns (uint256) {... */\n tag_12:\n callvalue\n dup1\n iszero\n tag_75\n jumpi\n 0x00\n dup1\n revert\n tag_75:\n pop\n tag_42\n tag_77\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3127:3331 function supportsInterface(... */\n tag_20:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3270:3274 bool */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3289:3326 super.supportsInterface(_interfaceID) */\n tag_80\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3313:3325 _interfaceID */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3289:3312 super.supportsInterface */\n tag_81\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3289:3326 super.supportsInterface(_interfaceID) */\n jump\t// in\n tag_80:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3282:3326 return super.supportsInterface(_interfaceID) */\n swap3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":3127:3331 function supportsInterface(... */\n swap2\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5489:5805 function isValidSignature(... */\n tag_27:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5608:5614 bytes4 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5650:5662 bool isValid */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5667:5707 _signatureValidation(_hash, _signatures) */\n tag_83\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5688:5693 _hash */\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5695:5706 _signatures */\n dup6\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5667:5687 _signatureValidation */\n tag_84\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5667:5707 _signatureValidation(_hash, _signatures) */\n jump\t// in\n tag_83:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5649:5707 (bool isValid,) = _signatureValidation(_hash, _signatures) */\n pop\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5717:5724 isValid */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5713:5778 if (isValid) {... */\n iszero\n tag_85\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5741:5771 SELECTOR_ERC1271_BYTES32_BYTES */\n 0x1626ba7e00000000000000000000000000000000000000000000000000000000\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5734:5771 return SELECTOR_ERC1271_BYTES32_BYTES */\n jump(tag_82)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5713:5778 if (isValid) {... */\n tag_85:\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5798:5799 0 */\n 0x00\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":5489:5805 function isValidSignature(... */\n tag_82:\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4525:4857 function isValidSignature(... */\n tag_34:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4651:4657 bytes4 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4693:4705 bool isValid */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4710:4761 _signatureValidation(keccak256(_data), _signatures) */\n tag_87\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4741:4746 _data */\n dup7\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4731:4747 keccak256(_data) */\n mload(0x40)\n tag_88\n swap3\n swap2\n swap1\n tag_89\n jump\t// in\n tag_88:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4749:4760 _signatures */\n dup6\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4710:4730 _signatureValidation */\n tag_84\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4710:4761 _signatureValidation(keccak256(_data), _signatures) */\n jump\t// in\n tag_87:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4692:4761 (bool isValid,) = _signatureValidation(keccak256(_data), _signatures) */\n pop\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4771:4778 isValid */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4767:4830 if (isValid) {... */\n iszero\n tag_90\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4795:4823 SELECTOR_ERC1271_BYTES_BYTES */\n 0x20c13b0b00000000000000000000000000000000000000000000000000000000\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4788:4823 return SELECTOR_ERC1271_BYTES_BYTES */\n jump(tag_86)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4767:4830 if (isValid) {... */\n tag_90:\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4850:4851 0 */\n 0x00\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":4525:4857 function isValidSignature(... */\n tag_86:\n swap5\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6456:6575 function updateImageHash(bytes32 _imageHash) external override virtual onlySelf {... */\n tag_40:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":178:188 msg.sender */\n caller\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":200:204 this */\n address\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":178:205 msg.sender != address(this) */\n eq\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":174:268 if (msg.sender != address(this)) {... */\n tag_92\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n mload(0x40)\n 0xe125889400000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":235:245 msg.sender */\n caller\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n 0x04\n dup3\n add\n /* \"#utility.yul\":7319:7353 */\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":255:259 this */\n address\n /* \"#utility.yul\":7369:7387 */\n 0x24\n dup3\n add\n /* \"#utility.yul\":7362:7405 */\n mstore\n /* \"#utility.yul\":7231:7249 */\n 0x44\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n tag_93:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n revert\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":174:268 if (msg.sender != address(this)) {... */\n tag_92:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6542:6570 _updateImageHash(_imageHash) */\n tag_96\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6559:6569 _imageHash */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6542:6558 _updateImageHash */\n tag_97\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6542:6570 _updateImageHash(_imageHash) */\n jump\t// in\n tag_96:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6456:6575 function updateImageHash(bytes32 _imageHash) external override virtual onlySelf {... */\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1290:1552 function selfExecute(... */\n tag_50:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1401:1415 bytes32 txHash */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1418:1481 SequenceBaseSig.subdigest(keccak256(abi.encode('self:', _txs))) */\n tag_99\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1474:1478 _txs */\n dup4\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1454:1479 abi.encode('self:', _txs) */\n add(0x20, mload(0x40))\n tag_100\n swap3\n swap2\n swap1\n tag_101\n jump\t// in\n tag_100:\n mload(0x40)\n 0x20\n dup2\n dup4\n sub\n sub\n dup2\n mstore\n swap1\n 0x40\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1444:1480 keccak256(abi.encode('self:', _txs)) */\n dup1\n mload\n swap1\n 0x20\n add\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1418:1443 SequenceBaseSig.subdigest */\n tag_102\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1418:1481 SequenceBaseSig.subdigest(keccak256(abi.encode('self:', _txs))) */\n jump\t// in\n tag_99:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1401:1481 bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode('self:', _txs))) */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1520:1547 _executeGuest(txHash, _txs) */\n tag_103\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1534:1540 txHash */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1542:1546 _txs */\n dup5\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1520:1533 _executeGuest */\n tag_104\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1520:1547 _executeGuest(txHash, _txs) */\n jump\t// in\n tag_103:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1364:1552 {... */\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1290:1552 function selfExecute(... */\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":890:1182 function execute(... */\n tag_55:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1030:1044 bytes32 txHash */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1047:1111 SequenceBaseSig.subdigest(keccak256(abi.encode('guest:', _txs))) */\n tag_106\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1104:1108 _txs */\n dup7\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1083:1109 abi.encode('guest:', _txs) */\n add(0x20, mload(0x40))\n tag_100\n swap3\n swap2\n swap1\n tag_108\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1047:1111 SequenceBaseSig.subdigest(keccak256(abi.encode('guest:', _txs))) */\n tag_106:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1030:1111 bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode('guest:', _txs))) */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1150:1177 _executeGuest(txHash, _txs) */\n tag_109\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1164:1170 txHash */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1172:1176 _txs */\n dup8\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1150:1163 _executeGuest */\n tag_104\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1150:1177 _executeGuest(txHash, _txs) */\n jump\t// in\n tag_109:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":993:1182 {... */\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":890:1182 function execute(... */\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1675:3161 function signatureRecovery(... */\n tag_59:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1801:1818 uint256 threshold */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1824:1838 uint256 weight */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1844:1861 bytes32 imageHash */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1867:1884 bytes32 subdigest */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1890:1908 uint256 checkpoint */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1919:1939 bytes1 signatureType */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1942:1952 _signature */\n dup8\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1953:1954 0 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1942:1955 _signature[0] */\n dup2\n dup2\n lt\n tag_112\n jumpi\n tag_112\n tag_113\n jump\t// in\n tag_112:\n swap1\n swap2\n add\n calldataload\n 0xff00000000000000000000000000000000000000000000000000000000000000\n and\n swap2\n pop\n dup2\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1962:2265 if (signatureType == LEGACY_TYPE) {... */\n tag_114\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2057:2091 SequenceBaseSig.subdigest(_digest) */\n tag_115\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2083:2090 _digest */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2057:2082 SequenceBaseSig.subdigest */\n tag_102\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2057:2091 SequenceBaseSig.subdigest(_digest) */\n jump\t// in\n tag_115:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2045:2091 subdigest = SequenceBaseSig.subdigest(_digest) */\n swap3\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2144:2190 SequenceBaseSig.recover(subdigest, _signature) */\n tag_116\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2168:2177 subdigest */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2179:2189 _signature */\n dup10\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2144:2167 SequenceBaseSig.recover */\n tag_117\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2144:2190 SequenceBaseSig.recover(subdigest, _signature) */\n jump\t// in\n tag_116:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2099:2190 (threshold, weight, imageHash, checkpoint) = SequenceBaseSig.recover(subdigest, _signature) */\n swap3\n swap9\n pop\n swap1\n swap7\n pop\n swap5\n pop\n swap2\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2198:2258 return (threshold, weight, imageHash, subdigest, checkpoint) */\n tag_110\n swap1\n pop\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1962:2265 if (signatureType == LEGACY_TYPE) {... */\n tag_114:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2275:2304 signatureType == DYNAMIC_TYPE */\n 0xff00000000000000000000000000000000000000000000000000000000000000\n dup2\n dup2\n and\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2271:2581 if (signatureType == DYNAMIC_TYPE) {... */\n tag_118\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2370:2404 SequenceBaseSig.subdigest(_digest) */\n tag_119\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2396:2403 _digest */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2370:2395 SequenceBaseSig.subdigest */\n tag_102\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2370:2404 SequenceBaseSig.subdigest(_digest) */\n jump\t// in\n tag_119:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2358:2404 subdigest = SequenceBaseSig.subdigest(_digest) */\n swap3\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2457:2506 SequenceDynamicSig.recover(subdigest, _signature) */\n tag_116\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2484:2493 subdigest */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2495:2505 _signature */\n dup10\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2457:2483 SequenceDynamicSig.recover */\n tag_121\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2457:2506 SequenceDynamicSig.recover(subdigest, _signature) */\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2271:2581 if (signatureType == DYNAMIC_TYPE) {... */\n tag_118:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2591:2624 signatureType == NO_CHAIN_ID_TYPE */\n 0xfe00000000000000000000000000000000000000000000000000000000000000\n 0xff00000000000000000000000000000000000000000000000000000000000000\n dup3\n and\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2587:2906 if (signatureType == NO_CHAIN_ID_TYPE) {... */\n tag_122\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2690:2729 SequenceNoChainIdSig.subdigest(_digest) */\n tag_119\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2721:2728 _digest */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2690:2720 SequenceNoChainIdSig.subdigest */\n tag_124\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2690:2729 SequenceNoChainIdSig.subdigest(_digest) */\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2587:2906 if (signatureType == NO_CHAIN_ID_TYPE) {... */\n tag_122:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2916:2945 signatureType == CHAINED_TYPE */\n 0xfd00000000000000000000000000000000000000000000000000000000000000\n 0xff00000000000000000000000000000000000000000000000000000000000000\n dup3\n and\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2912:3108 if (signatureType == CHAINED_TYPE) {... */\n tag_126\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3066:3101 chainedRecover(_digest, _signature) */\n tag_127\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3081:3088 _digest */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3090:3100 _signature */\n dup10\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3066:3080 chainedRecover */\n tag_128\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3066:3101 chainedRecover(_digest, _signature) */\n jump\t// in\n tag_127:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3059:3101 return chainedRecover(_digest, _signature) */\n swap6\n pop\n swap6\n pop\n swap6\n pop\n swap6\n pop\n swap6\n pop\n pop\n jump(tag_110)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":2912:3108 if (signatureType == CHAINED_TYPE) {... */\n tag_126:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3121:3156 InvalidSignatureType(signatureType) */\n mload(0x40)\n 0x6085cd8200000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n /* \"#utility.yul\":11707:11773 */\n 0xff00000000000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":11695:11774 */\n dup3\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3121:3156 InvalidSignatureType(signatureType) */\n 0x04\n dup3\n add\n /* \"#utility.yul\":11677:11775 */\n mstore\n /* \"#utility.yul\":11650:11668 */\n 0x24\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3121:3156 InvalidSignatureType(signatureType) */\n tag_93\n /* \"#utility.yul\":11533:11781 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":1675:3161 function signatureRecovery(... */\n tag_110:\n swap4\n swap8\n swap3\n swap7\n pop\n swap4\n pop\n swap4\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":938:1094 function readNonce(uint256 _space) public virtual view returns (uint256) {... */\n tag_66:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1002:1009 uint256 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1032:1088 ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space)) */\n tag_80\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":453:519 0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e */\n 0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1080:1086 _space */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1032:1060 ModuleStorage.readBytes32Map */\n tag_133\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1032:1088 ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space)) */\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":456:732 function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {... */\n tag_72:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":550:562 address addr */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":178:188 msg.sender */\n caller\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":200:204 this */\n address\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":178:205 msg.sender != address(this) */\n eq\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":174:268 if (msg.sender != address(this)) {... */\n tag_135\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n mload(0x40)\n 0xe125889400000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":235:245 msg.sender */\n caller\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n 0x04\n dup3\n add\n /* \"#utility.yul\":7319:7353 */\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":255:259 this */\n address\n /* \"#utility.yul\":7369:7387 */\n 0x24\n dup3\n add\n /* \"#utility.yul\":7362:7405 */\n mstore\n /* \"#utility.yul\":7231:7249 */\n 0x44\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n tag_93\n /* \"#utility.yul\":7084:7411 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":174:268 if (msg.sender != address(this)) {... */\n tag_135:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":631:636 _code */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":625:637 mload(_code) */\n mload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":620:622 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":613:618 _code */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":609:623 add(_code, 32) */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":596:607 callvalue() */\n callvalue\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":589:638 create(callvalue(), add(_code, 32), mload(_code)) */\n create\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":581:638 addr := create(callvalue(), add(_code, 32), mload(_code)) */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":649:667 addr == address(0) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":645:695 if (addr == address(0)) revert CreateFailed(_code) */\n tag_138\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":689:694 _code */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":676:695 CreateFailed(_code) */\n mload(0x40)\n 0x0d25719100000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap2\n swap1\n tag_140\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":645:695 if (addr == address(0)) revert CreateFailed(_code) */\n tag_138:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":706:727 CreatedContract(addr) */\n mload(0x40)\n /* \"#utility.yul\":6753:6795 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":6741:6796 */\n dup3\n and\n /* \"#utility.yul\":6723:6797 */\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":706:727 CreatedContract(addr) */\n 0xa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c\n swap1\n /* \"#utility.yul\":6711:6713 */\n 0x20\n /* \"#utility.yul\":6696:6714 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":706:727 CreatedContract(addr) */\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":456:732 function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {... */\n swap2\n swap1\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":670:757 function nonce() external virtual view returns (uint256) {... */\n tag_77:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":718:725 uint256 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":740:752 readNonce(0) */\n tag_143\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":750:751 0 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":740:749 readNonce */\n tag_66\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":740:752 readNonce(0) */\n jump\t// in\n tag_143:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":733:752 return readNonce(0) */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":670:757 function nonce() external virtual view returns (uint256) {... */\n swap1\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":942:1175 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n tag_81:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1028:1032 bool */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1044:1092 _interfaceID == type(IModuleCreator).interfaceId */\n 0x6ffbd45100000000000000000000000000000000000000000000000000000000\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n dup4\n and\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1040:1120 if (_interfaceID == type(IModuleCreator).interfaceId) {... */\n tag_145\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1109:1113 true */\n 0x01\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":942:1175 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n swap1\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1040:1120 if (_interfaceID == type(IModuleCreator).interfaceId) {... */\n tag_145:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1133:1170 super.supportsInterface(_interfaceID) */\n tag_80\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1157:1169 _interfaceID */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1133:1156 super.supportsInterface */\n tag_147\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1133:1170 super.supportsInterface(_interfaceID) */\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3480:3866 function _signatureValidation(... */\n tag_84:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3611:3623 bool isValid */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3629:3646 bytes32 subdigest */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3657:3674 uint256 threshold */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3676:3690 uint256 weight */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3692:3709 bytes32 imageHash */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3760:3798 signatureRecovery(_digest, _signature) */\n tag_149\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3778:3785 _digest */\n dup9\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3787:3797 _signature */\n dup9\n dup9\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3760:3777 signatureRecovery */\n tag_59\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3760:3798 signatureRecovery(_digest, _signature) */\n jump\t// in\n tag_149:\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3715:3798 (threshold, weight, imageHash, subdigest,) = signatureRecovery(_digest, _signature) */\n swap7\n pop\n swap2\n swap5\n pop\n swap3\n pop\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3814:3833 weight >= threshold */\n dup3\n dup3\n lt\n dup1\n iszero\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3814:3861 weight >= threshold && _isValidImage(imageHash) */\n tag_151\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2779:2783 true */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3837:3861 _isValidImage(imageHash) */\n tag_151:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3804:3861 isValid = weight >= threshold && _isValidImage(imageHash) */\n swap5\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3651:3866 {... */\n pop\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":3480:3866 function _signatureValidation(... */\n swap4\n pop\n swap4\n swap2\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2824:2917 function _updateImageHash(bytes32) internal override virtual {... */\n tag_97:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2898:2912 NotSupported() */\n mload(0x40)\n 0xa038794000000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n revert\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1173:1397 function subdigest(... */\n tag_102:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1279:1386 abi.encodePacked(... */\n mload(0x40)\n /* \"#utility.yul\":12792:12858 */\n 0x1901000000000000000000000000000000000000000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1279:1386 abi.encodePacked(... */\n 0x20\n dup3\n add\n /* \"#utility.yul\":12780:12859 */\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1325:1338 block.chainid */\n chainid\n /* \"#utility.yul\":12875:12886 */\n 0x22\n dup3\n add\n /* \"#utility.yul\":12868:12895 */\n mstore\n /* \"#utility.yul\":12946:13012 */\n 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1356:1360 this */\n address\n /* \"#utility.yul\":12933:12935 */\n 0x60\n /* \"#utility.yul\":12929:12944 */\n shl\n /* \"#utility.yul\":12925:13013 */\n and\n /* \"#utility.yul\":12911:12923 */\n 0x42\n dup3\n add\n /* \"#utility.yul\":12904:13014 */\n mstore\n /* \"#utility.yul\":13030:13042 */\n 0x56\n dup2\n add\n /* \"#utility.yul\":13023:13051 */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1240:1247 bytes32 */\n 0x00\n swap1\n /* \"#utility.yul\":13067:13079 */\n 0x76\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1279:1386 abi.encodePacked(... */\n tag_155:\n mload(0x40)\n 0x20\n dup2\n dup4\n sub\n sub\n dup2\n mstore\n swap1\n 0x40\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1262:1392 keccak256(... */\n dup1\n mload\n swap1\n 0x20\n add\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1255:1392 return keccak256(... */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1173:1397 function subdigest(... */\n swap2\n swap1\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1710:2544 function _executeGuest(... */\n tag_104:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1847:1851 _txs */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1832:1844 uint256 size */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1864:2540 for (uint256 i = 0; i < size; i++) {... */\n tag_158:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1888:1892 size */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1884:1885 i */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1884:1892 i < size */\n lt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1864:2540 for (uint256 i = 0; i < size; i++) {... */\n iszero\n tag_159\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1907:1939 Transaction calldata transaction */\n calldatasize\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1942:1946 _txs */\n dup5\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1947:1948 i */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1942:1949 _txs[i] */\n dup2\n dup2\n lt\n tag_162\n jumpi\n tag_162\n tag_113\n jump\t// in\n tag_162:\n swap1\n pop\n 0x20\n mul\n dup2\n add\n swap1\n tag_163\n swap2\n swap1\n tag_164\n jump\t// in\n tag_163:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1907:1949 Transaction calldata transaction = _txs[i] */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1962:1986 transaction.delegateCall */\n tag_165\n 0x20\n dup3\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1907:1949 Transaction calldata transaction = _txs[i] */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1962:1986 transaction.delegateCall */\n tag_166\n jump\t// in\n tag_165:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1958:2020 if (transaction.delegateCall) revert DelegateCallNotAllowed(i) */\n iszero\n tag_167\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1995:2020 DelegateCallNotAllowed(i) */\n mload(0x40)\n 0x230d1ccc00000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n dup2\n add\n /* \"#utility.yul\":2778:2803 */\n dup4\n swap1\n mstore\n /* \"#utility.yul\":2751:2769 */\n 0x24\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1995:2020 DelegateCallNotAllowed(i) */\n tag_93\n /* \"#utility.yul\":2632:2809 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1958:2020 if (transaction.delegateCall) revert DelegateCallNotAllowed(i) */\n tag_167:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2048:2068 transaction.gasLimit */\n 0x40\n dup2\n add\n calldataload\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2080:2089 gasleft() */\n gas\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2080:2100 gasleft() < gasLimit */\n lt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2076:2145 if (gasleft() < gasLimit) revert NotEnoughGas(i, gasLimit, gasleft()) */\n iszero\n tag_169\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2122:2123 i */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2125:2133 gasLimit */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2135:2144 gasleft() */\n gas\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2109:2145 NotEnoughGas(i, gasLimit, gasleft()) */\n mload(0x40)\n 0x2bb3e3ba00000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n dup2\n add\n /* \"#utility.yul\":13869:13894 */\n swap4\n swap1\n swap4\n mstore\n /* \"#utility.yul\":13910:13928 */\n 0x24\n dup4\n add\n /* \"#utility.yul\":13903:13937 */\n swap2\n swap1\n swap2\n mstore\n /* \"#utility.yul\":13953:13971 */\n 0x44\n dup3\n add\n /* \"#utility.yul\":13946:13980 */\n mstore\n /* \"#utility.yul\":13842:13860 */\n 0x64\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2109:2145 NotEnoughGas(i, gasLimit, gasleft()) */\n tag_93\n /* \"#utility.yul\":13667:13986 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2076:2145 if (gasleft() < gasLimit) revert NotEnoughGas(i, gasLimit, gasleft()) */\n tag_169:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2154:2166 bool success */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2169:2317 LibOptim.call(... */\n tag_172\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2192:2210 transaction.target */\n tag_173\n 0x80\n dup6\n add\n 0x60\n dup7\n add\n tag_174\n jump\t// in\n tag_173:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2220:2237 transaction.value */\n 0x80\n dup6\n add\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2247:2260 gasLimit == 0 */\n dup5\n iszero\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2247:2283 gasLimit == 0 ? gasleft() : gasLimit */\n tag_175\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2275:2283 gasLimit */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2247:2283 gasLimit == 0 ? gasleft() : gasLimit */\n jump(tag_176)\n tag_175:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2263:2272 gasleft() */\n gas\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2247:2283 gasLimit == 0 ? gasleft() : gasLimit */\n tag_176:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2293:2309 transaction.data */\n tag_177\n 0xa0\n dup9\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2293:2304 transaction */\n dup9\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2293:2309 transaction.data */\n tag_178\n jump\t// in\n tag_177:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2169:2182 LibOptim.call */\n tag_179\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2169:2317 LibOptim.call(... */\n jump\t// in\n tag_172:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2154:2317 bool success = LibOptim.call(... */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2330:2337 success */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2326:2534 if (success) {... */\n iszero\n tag_180\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2365:2372 _txHash */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2354:2376 TxExecuted(_txHash, i) */\n 0x5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2374:2375 i */\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2354:2376 TxExecuted(_txHash, i) */\n mload(0x40)\n tag_181\n swap2\n /* \"#utility.yul\":2778:2803 */\n dup2\n mstore\n /* \"#utility.yul\":2766:2768 */\n 0x20\n /* \"#utility.yul\":2751:2769 */\n add\n swap1\n /* \"#utility.yul\":2632:2809 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2354:2376 TxExecuted(_txHash, i) */\n tag_181:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2326:2534 if (success) {... */\n jump(tag_183)\n tag_180:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2401:2525 _revertBytes(... */\n tag_183\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2425:2450 transaction.revertOnError */\n tag_184\n 0x40\n dup6\n add\n 0x20\n dup7\n add\n tag_166\n jump\t// in\n tag_184:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2462:2469 _txHash */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2481:2482 i */\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2494:2515 LibOptim.returnData() */\n tag_185\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2494:2513 LibOptim.returnData */\n tag_186\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2494:2515 LibOptim.returnData() */\n jump\t// in\n tag_185:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2401:2413 _revertBytes */\n tag_187\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":2401:2525 _revertBytes(... */\n jump\t// in\n tag_183:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1899:2540 {... */\n pop\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1894:1897 i++ */\n dup1\n dup1\n tag_188\n swap1\n tag_189\n jump\t// in\n tag_188:\n swap2\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1864:2540 for (uint256 i = 0; i < size; i++) {... */\n jump(tag_158)\n tag_159:\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1799:2544 {... */\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":1710:2544 function _executeGuest(... */\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8892:9534 function recover(... */\n tag_117:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8996:9013 uint256 threshold */\n 0x00\n dup1\n dup1\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9131:9172 recoverBranch(_subdigest, _signature[6:]) */\n tag_191\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9145:9155 _subdigest */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9157:9171 _signature[6:] */\n tag_192\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9157:9167 _signature */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9168:9169 6 */\n 0x06\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9157:9167 _signature */\n dup2\n dup12\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9157:9171 _signature[6:] */\n tag_193\n jump\t// in\n tag_192:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9131:9144 recoverBranch */\n tag_194\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9131:9172 recoverBranch(_subdigest, _signature[6:]) */\n jump\t// in\n tag_191:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":622:631 bytes32 c */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n swap1\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1585:1610 calldataload(data.offset) */\n dup8\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1626:1629 240 */\n 0xf0\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1622:1636 shr(240, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n dup2\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n dup1\n dup5\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n dup5\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9379:9380 2 */\n 0x02\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":2034:2057 add(index, data.offset) */\n swap1\n swap11\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":2021:2058 calldataload(add(index, data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":2074:2077 224 */\n 0xe0\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":2070:2084 shr(224, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n swap1\n dup2\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap9\n swap1\n swap2\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1622:1636 shr(240, word) */\n swap1\n swap10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":9109:9172 (weight, imageHash) = recoverBranch(_subdigest, _signature[6:]) */\n swap2\n swap9\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":2070:2084 shr(224, word) */\n swap6\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8892:9534 function recover(... */\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":648:910 function recover(... */\n tag_121:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":752:769 uint256 threshold */\n 0x00\n dup1\n dup1\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":854:905 SequenceBaseSig.recover(_subdigest, _signature[1:]) */\n tag_203\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":878:888 _subdigest */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":890:904 _signature[1:] */\n tag_204\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":890:900 _signature */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":901:902 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":890:900 _signature */\n dup2\n dup12\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":890:904 _signature[1:] */\n tag_193\n jump\t// in\n tag_204:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":854:877 SequenceBaseSig.recover */\n tag_117\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":854:905 SequenceBaseSig.recover(_subdigest, _signature[1:]) */\n jump\t// in\n tag_203:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":847:905 return SequenceBaseSig.recover(_subdigest, _signature[1:]) */\n swap4\n pop\n swap4\n pop\n swap4\n pop\n swap4\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":648:910 function recover(... */\n swap4\n pop\n swap4\n pop\n swap4\n pop\n swap4\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":404:617 function subdigest(bytes32 _digest) internal view returns (bytes32) {... */\n tag_124:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":502:606 abi.encodePacked(... */\n mload(0x40)\n /* \"#utility.yul\":12792:12858 */\n 0x1901000000000000000000000000000000000000000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":502:606 abi.encodePacked(... */\n 0x20\n dup3\n add\n /* \"#utility.yul\":12780:12859 */\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":463:470 bytes32 */\n 0x00\n /* \"#utility.yul\":12875:12886 */\n 0x22\n dup3\n add\n /* \"#utility.yul\":12868:12895 */\n dup2\n swap1\n mstore\n /* \"#utility.yul\":12946:13012 */\n 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":576:580 this */\n address\n /* \"#utility.yul\":12933:12935 */\n 0x60\n /* \"#utility.yul\":12929:12944 */\n shl\n /* \"#utility.yul\":12925:13013 */\n and\n /* \"#utility.yul\":12911:12923 */\n 0x42\n dup4\n add\n /* \"#utility.yul\":12904:13014 */\n mstore\n /* \"#utility.yul\":13030:13042 */\n 0x56\n dup3\n add\n /* \"#utility.yul\":13023:13051 */\n dup4\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":463:470 bytes32 */\n swap1\n /* \"#utility.yul\":13067:13079 */\n 0x76\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":502:606 abi.encodePacked(... */\n tag_155\n /* \"#utility.yul\":12494:13085 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2320:4379 function chainedRecover(... */\n tag_128:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2428:2445 uint256 threshold */\n 0x00\n dup1\n dup1\n dup1\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3378:3392 add(_index, 3) */\n 0x04\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2563:2564 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3290:3315 add(_index, _data.offset) */\n dup9\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3277:3316 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3336:3339 232 */\n 0xe8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3332:3346 shr(232, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2428:2445 uint256 threshold */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2768:2784 sigSize + rindex */\n tag_210\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3378:3392 add(_index, 3) */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3332:3346 shr(232, word) */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2768:2784 sigSize + rindex */\n tag_211\n jump\t// in\n tag_210:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2750:2784 uint256 nrindex = sigSize + rindex */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2883:2955 signatureRecovery(... */\n tag_212\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2908:2915 _digest */\n dup12\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2923:2949 _signature[rindex:nrindex] */\n tag_58\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2750:2784 uint256 nrindex = sigSize + rindex */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2934:2940 rindex */\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2923:2933 _signature */\n dup14\n dup16\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2923:2949 _signature[rindex:nrindex] */\n tag_193\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2883:2955 signatureRecovery(... */\n tag_212:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2791:2955 (... */\n swap4\n swap12\n pop\n swap2\n swap10\n pop\n swap8\n pop\n swap6\n pop\n swap4\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2966:2984 weight < threshold */\n dup8\n dup8\n lt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2962:3080 if (weight < threshold) {... */\n iszero\n tag_214\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3027:3053 _signature[rindex:nrindex] */\n tag_215\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3045:3052 nrindex */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3038:3044 rindex */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3027:3037 _signature */\n dup12\n dup14\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3027:3053 _signature[rindex:nrindex] */\n tag_193\n jump\t// in\n tag_215:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3055:3064 threshold */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3066:3072 weight */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3001:3073 LowWeightChainedSignature(_signature[rindex:nrindex], threshold, weight) */\n mload(0x40)\n 0xb006aba000000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_217\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2962:3080 if (weight < threshold) {... */\n tag_214:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3095:3102 nrindex */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3086:3102 rindex = nrindex */\n swap3\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3283:4375 while (rindex < _signature.length) {... */\n tag_218:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3290:3316 rindex < _signature.length */\n dup9\n dup4\n lt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3283:4375 while (rindex < _signature.length) {... */\n iszero\n tag_219\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3390:3391 3 */\n 0x03\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3378:3392 add(_index, 3) */\n dup4\n add\n swap3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3290:3315 add(_index, _data.offset) */\n dup11\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3277:3316 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3336:3339 232 */\n 0xe8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3332:3346 shr(232, word) */\n shr\n swap2\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3444:3460 sigSize + rindex */\n tag_221\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3378:3392 add(_index, 3) */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3332:3346 shr(232, word) */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3444:3460 sigSize + rindex */\n tag_211\n jump\t// in\n tag_221:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3434:3460 nrindex = sigSize + rindex */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3469:3491 uint256 nextCheckpoint */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3687:3792 signatureRecovery(... */\n tag_222\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3714:3748 _hashSetImageHashStruct(imageHash) */\n tag_223\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3738:3747 imageHash */\n dup9\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3714:3737 _hashSetImageHashStruct */\n tag_224\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3714:3748 _hashSetImageHashStruct(imageHash) */\n jump\t// in\n tag_223:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3758:3768 _signature */\n dup13\n dup13\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3769:3775 rindex */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3758:3784 _signature[rindex:nrindex] */\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3776:3783 nrindex */\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3758:3784 _signature[rindex:nrindex] */\n swap3\n tag_58\n swap4\n swap3\n swap2\n swap1\n tag_193\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3687:3792 signatureRecovery(... */\n tag_222:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3500:3792 (... */\n swap4\n swap13\n pop\n swap2\n swap11\n pop\n swap9\n pop\n swap1\n swap2\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3833:3851 weight < threshold */\n dup9\n dup9\n lt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3829:3951 if (weight < threshold) {... */\n iszero\n tag_226\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3896:3922 _signature[rindex:nrindex] */\n tag_227\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3914:3921 nrindex */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3907:3913 rindex */\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3896:3906 _signature */\n dup13\n dup15\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3896:3922 _signature[rindex:nrindex] */\n tag_193\n jump\t// in\n tag_227:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3924:3933 threshold */\n dup11\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3935:3941 weight */\n dup11\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3870:3942 LowWeightChainedSignature(_signature[rindex:nrindex], threshold, weight) */\n mload(0x40)\n 0xb006aba000000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_217\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3829:3951 if (weight < threshold) {... */\n tag_226:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4216:4226 checkpoint */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4198:4212 nextCheckpoint */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4198:4226 nextCheckpoint >= checkpoint */\n lt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4194:4309 if (nextCheckpoint >= checkpoint) {... */\n tag_229\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4245:4300 WrongChainedCheckpointOrder(nextCheckpoint, checkpoint) */\n mload(0x40)\n 0x37daf62b00000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n dup2\n add\n /* \"#utility.yul\":16193:16218 */\n dup3\n swap1\n mstore\n /* \"#utility.yul\":16234:16252 */\n 0x24\n dup2\n add\n /* \"#utility.yul\":16227:16261 */\n dup7\n swap1\n mstore\n /* \"#utility.yul\":16166:16184 */\n 0x44\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4245:4300 WrongChainedCheckpointOrder(nextCheckpoint, checkpoint) */\n tag_93\n /* \"#utility.yul\":16019:16267 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4194:4309 if (nextCheckpoint >= checkpoint) {... */\n tag_229:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4330:4344 nextCheckpoint */\n swap4\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":4361:4368 nrindex */\n swap2\n pop\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":3283:4375 while (rindex < _signature.length) {... */\n jump(tag_218)\n tag_219:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2540:4379 {... */\n pop\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":2320:4379 function chainedRecover(... */\n swap4\n swap8\n swap3\n swap7\n pop\n swap4\n pop\n swap4\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":490:677 function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val) {... */\n tag_133:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":568:579 bytes32 val */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":587:598 bytes32 key */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":622:626 _key */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":628:635 _subKey */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":611:636 abi.encode(_key, _subKey) */\n add(0x20, mload(0x40))\n tag_233\n swap3\n swap2\n swap1\n /* \"#utility.yul\":16193:16218 */\n swap2\n dup3\n mstore\n /* \"#utility.yul\":16249:16251 */\n 0x20\n /* \"#utility.yul\":16234:16252 */\n dup3\n add\n /* \"#utility.yul\":16227:16261 */\n mstore\n /* \"#utility.yul\":16181:16183 */\n 0x40\n /* \"#utility.yul\":16166:16184 */\n add\n swap1\n /* \"#utility.yul\":16019:16267 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":611:636 abi.encode(_key, _subKey) */\n tag_233:\n 0x40\n dup1\n mload\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n dup2\n dup5\n sub\n add\n dup2\n mstore\n swap2\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":601:637 keccak256(abi.encode(_key, _subKey)) */\n dup1\n mload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":611:636 abi.encode(_key, _subKey) */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":601:637 keccak256(abi.encode(_key, _subKey)) */\n swap1\n swap2\n add\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":661:671 sload(key) */\n sload\n swap5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":490:677 function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val) {... */\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4140:4371 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n tag_147:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4226:4230 bool */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4242:4288 _interfaceID == type(IModuleCalls).interfaceId */\n 0xe4a77bbc00000000000000000000000000000000000000000000000000000000\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n dup4\n and\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4238:4316 if (_interfaceID == type(IModuleCalls).interfaceId) {... */\n tag_236\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4305:4309 true */\n 0x01\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4140:4371 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n swap1\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4238:4316 if (_interfaceID == type(IModuleCalls).interfaceId) {... */\n tag_236:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4329:4366 super.supportsInterface(_interfaceID) */\n tag_80\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4353:4365 _interfaceID */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4329:4352 super.supportsInterface */\n tag_238\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":4329:4366 super.supportsInterface(_interfaceID) */\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1525:1878 function call(... */\n tag_179:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1640:1646 bool r */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1688:1692 0x40 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1682:1693 mload(0x40) */\n mload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1732:1744 _data.length */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1718:1730 _data.offset */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1713:1716 tmp */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1700:1745 calldatacopy(tmp, _data.offset, _data.length) */\n calldatacopy\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1859:1860 0 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1848:1849 0 */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1826:1838 _data.length */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1813:1816 tmp */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1799:1803 _val */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1786:1789 _to */\n dup12\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1772:1776 _gas */\n dup11\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1758:1868 call(... */\n call\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1753:1868 r := call(... */\n swap8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1525:1878 function call(... */\n swap7\n pop\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":852:1123 function returnData() internal pure returns (bytes memory r) {... */\n tag_186:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":897:911 bytes memory r */\n 0x60\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":948:964 returndatasize() */\n returndatasize\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":982:986 0x40 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":976:987 mload(0x40) */\n mload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":971:987 r := mload(0x40) */\n swap2\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1014:1016 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1011:1012 r */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1007:1017 add(r, 32) */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1048:1052 size */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1041:1046 start */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1037:1053 add(start, size) */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1031:1035 0x40 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1024:1054 mstore(0x40, add(start, size)) */\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1071:1075 size */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1068:1069 r */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1061:1076 mstore(r, size) */\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1108:1112 size */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1105:1106 0 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1098:1103 start */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":1083:1113 returndatacopy(start, 0, size) */\n returndatacopy\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":852:1123 function returnData() internal pure returns (bytes memory r) {... */\n swap1\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3644:3930 function _revertBytes(... */\n tag_187:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3781:3795 _revertOnError */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3777:3926 if (_revertOnError) {... */\n iszero\n tag_243\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3849:3856 _reason */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3843:3857 mload(_reason) */\n mload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3836:3840 0x20 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3827:3834 _reason */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3823:3841 add(_reason, 0x20) */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3816:3858 revert(add(_reason, 0x20), mload(_reason)) */\n revert\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3777:3926 if (_revertOnError) {... */\n tag_243:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3894:3901 _txHash */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3885:3919 TxFailed(_txHash, _index, _reason) */\n 0xab46c69f7f32e1bf09b0725853da82a211e5402a0600296ab499a2fb5ea3b419\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3903:3909 _index */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3911:3918 _reason */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3885:3919 TxFailed(_txHash, _index, _reason) */\n mload(0x40)\n tag_245\n swap3\n swap2\n swap1\n tag_246\n jump\t// in\n tag_245:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":3644:3930 function _revertBytes(... */\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3525:8233 function recoverBranch(... */\n tag_194:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3635:3649 uint256 weight */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3655:3667 bytes32 root */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3696:3710 uint256 rindex */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3765:8223 while (rindex < _signature.length) {... */\n tag_248:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3772:3798 rindex < _signature.length */\n dup4\n dup2\n lt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3765:8223 while (rindex < _signature.length) {... */\n iszero\n tag_249\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1475:1476 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1463:1477 add(_index, 1) */\n dup2\n add\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1390:1415 add(_index, _data.offset) */\n dup6\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1377:1416 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1432:1435 248 */\n 0xf8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1428:1442 shr(248, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3923:3943 flag == FLAG_ADDRESS */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n dup2\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3919:4321 if (flag == FLAG_ADDRESS) {... */\n tag_252\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2205:2207 21 */\n 0x15\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2193:2208 add(_index, 21) */\n dup3\n add\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2046:2071 add(_index, _data.offset) */\n dup7\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2033:2072 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2088:2091 248 */\n 0xf8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2084:2098 shr(248, word) */\n dup2\n swap1\n shr\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2118:2120 88 */\n 0x58\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2114:2127 shr(88, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2129:2171 0xffffffffffffffffffffffffffffffffffffffff */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2110:2172 and(shr(88, word), 0xffffffffffffffffffffffffffffffffffffffff) */\n dup2\n and\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1873:1896 uint256(_weight) << 160 */\n 0xff0000000000000000000000000000000000000000\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1873:1922 uint256(_weight) << 160 | uint256(uint160(_addr)) */\n dup2\n or\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4231:4235 root */\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4231:4290 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n tag_257\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4286:4290 node */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4231:4290 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n jump(tag_259)\n tag_257:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":622:631 bytes32 c */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n dup7\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap1\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4252:4283 LibOptim.fkeccak256(root, node) */\n tag_259:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4224:4290 root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n swap6\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4302:4310 continue */\n pop\n pop\n pop\n pop\n jump(tag_248)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3919:4321 if (flag == FLAG_ADDRESS) {... */\n tag_252:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4335:4339 flag */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4331:5010 if (flag == FLAG_SIGNATURE) {... */\n tag_260\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1475:1476 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1463:1477 add(_index, 1) */\n dup3\n add\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1390:1415 add(_index, _data.offset) */\n dup7\n dup2\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1377:1416 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1432:1435 248 */\n 0xf8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1428:1442 shr(248, word) */\n shr\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4560:4571 rindex + 66 */\n 0x43\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4396:4412 uint8 addrWeight */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4598:4670 SignatureValidator.recoverSigner(_subdigest, _signature[rindex:nrindex]) */\n tag_262\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4631:4641 _subdigest */\n dup11\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4643:4669 _signature[rindex:nrindex] */\n tag_263\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4560:4571 rindex + 66 */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1463:1477 add(_index, 1) */\n dup9\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4643:4653 _signature */\n dup13\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1390:1415 add(_index, _data.offset) */\n dup15\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4643:4669 _signature[rindex:nrindex] */\n tag_193\n jump\t// in\n tag_263:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4598:4630 SignatureValidator.recoverSigner */\n tag_264\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4598:4670 SignatureValidator.recoverSigner(_subdigest, _signature[rindex:nrindex]) */\n jump\t// in\n tag_262:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4764:4784 weight += addrWeight */\n 0xff\n dup5\n and\n swap8\n swap1\n swap8\n add\n swap7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4691:4698 nrindex */\n swap2\n swap5\n pop\n dup5\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4764:4784 weight += addrWeight */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1893:1896 160 */\n 0xa0\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1873:1896 uint256(_weight) << 160 */\n dup4\n swap1\n shl\n 0xff0000000000000000000000000000000000000000\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1899:1922 uint256(uint160(_addr)) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup3\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1873:1922 uint256(_weight) << 160 | uint256(uint160(_addr)) */\n or\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4920:4924 root */\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4920:4979 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n tag_266\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4975:4979 node */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4920:4979 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n jump(tag_268)\n tag_266:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":622:631 bytes32 c */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n dup8\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap1\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4941:4972 LibOptim.fkeccak256(root, node) */\n tag_268:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4913:4979 root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n swap7\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4991:4999 continue */\n pop\n pop\n pop\n pop\n pop\n jump(tag_248)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":4331:5010 if (flag == FLAG_SIGNATURE) {... */\n tag_260:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":625:626 2 */\n 0x02\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5024:5028 flag */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5024:5054 flag == FLAG_DYNAMIC_SIGNATURE */\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5020:5952 if (flag == FLAG_DYNAMIC_SIGNATURE) {... */\n tag_269\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5104:5120 uint8 addrWeight */\n 0x00\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2046:2071 add(_index, _data.offset) */\n dup8\n dup5\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2033:2072 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2088:2091 248 */\n 0xf8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2084:2098 shr(248, word) */\n dup2\n swap1\n shr\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2118:2120 88 */\n 0x58\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2114:2127 shr(88, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2129:2171 0xffffffffffffffffffffffffffffffffffffffff */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2110:2172 and(shr(88, word), 0xffffffffffffffffffffffffffffffffffffffff) */\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2205:2207 21 */\n 0x15\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2193:2208 add(_index, 21) */\n dup7\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5146:5210 (addrWeight, addr, rindex) = _signature.readUint8Address(rindex) */\n swap6\n pop\n swap1\n swap3\n pop\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5256:5268 uint256 size */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3290:3315 add(_index, _data.offset) */\n dup9\n dup6\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3277:3316 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3336:3339 232 */\n 0xe8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3332:3346 shr(232, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3390:3391 3 */\n 0x03\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3378:3392 add(_index, 3) */\n dup7\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5280:5326 (size, rindex) = _signature.readUint24(rindex) */\n dup2\n 0xffffff\n and\n swap2\n pop\n dup1\n swap7\n pop\n dup2\n swap3\n pop\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5380:5395 uint256 nrindex */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5407:5411 size */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5398:5404 rindex */\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5398:5411 rindex + size */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5380:5411 uint256 nrindex = rindex + size */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5428:5509 SignatureValidator.isValidSignature(_subdigest, addr, _signature[rindex:nrindex]) */\n tag_272\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5464:5474 _subdigest */\n dup12\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5476:5480 addr */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5482:5492 _signature */\n dup13\n dup13\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5493:5499 rindex */\n dup11\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5482:5508 _signature[rindex:nrindex] */\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5500:5507 nrindex */\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5482:5508 _signature[rindex:nrindex] */\n swap3\n tag_273\n swap4\n swap3\n swap2\n swap1\n tag_193\n jump\t// in\n tag_273:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5428:5463 SignatureValidator.isValidSignature */\n tag_274\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5428:5509 SignatureValidator.isValidSignature(_subdigest, addr, _signature[rindex:nrindex]) */\n jump\t// in\n tag_272:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5423:5613 if (!SignatureValidator.isValidSignature(_subdigest, addr, _signature[rindex:nrindex])) {... */\n tag_275\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5555:5565 _subdigest */\n dup11\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5567:5571 addr */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5573:5599 _signature[rindex:nrindex] */\n tag_276\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5591:5598 nrindex */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5584:5590 rindex */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5573:5583 _signature */\n dup14\n dup16\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5573:5599 _signature[rindex:nrindex] */\n tag_193\n jump\t// in\n tag_276:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5532:5600 InvalidNestedSignature(_subdigest, addr, _signature[rindex:nrindex]) */\n mload(0x40)\n 0x9a94623200000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_278\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5423:5613 if (!SignatureValidator.isValidSignature(_subdigest, addr, _signature[rindex:nrindex])) {... */\n tag_275:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5706:5726 weight += addrWeight */\n 0xff\n dup5\n and\n swap8\n swap1\n swap8\n add\n swap7\n swap5\n pop\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1893:1896 160 */\n 0xa0\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1873:1896 uint256(_weight) << 160 */\n dup5\n swap1\n shl\n 0xff0000000000000000000000000000000000000000\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1899:1922 uint256(uint160(_addr)) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup5\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":1873:1922 uint256(_weight) << 160 | uint256(uint160(_addr)) */\n or\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5862:5866 root */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5862:5921 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n tag_280\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5917:5921 node */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5862:5921 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n jump(tag_282)\n tag_280:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":622:631 bytes32 c */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n dup9\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap1\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5883:5914 LibOptim.fkeccak256(root, node) */\n tag_282:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5855:5921 root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n swap8\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5933:5941 continue */\n pop\n pop\n pop\n pop\n pop\n pop\n jump(tag_248)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5020:5952 if (flag == FLAG_DYNAMIC_SIGNATURE) {... */\n tag_269:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":667:668 3 */\n 0x03\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5966:5970 flag */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5966:5983 flag == FLAG_NODE */\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5962:6205 if (flag == FLAG_NODE) {... */\n tag_283\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":4550:4552 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":4536:4553 add(_pointer, 32) */\n dup3\n add\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":4487:4514 add(_pointer, _data.offset) */\n dup7\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":4474:4515 calldataload(add(_pointer, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6115:6119 root */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6115:6174 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n tag_286\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6170:6174 node */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6115:6174 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n jump(tag_288)\n tag_286:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":622:631 bytes32 c */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n dup5\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap1\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6136:6167 LibOptim.fkeccak256(root, node) */\n tag_288:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6108:6174 root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n swap4\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6186:6194 continue */\n pop\n pop\n jump(tag_248)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":5962:6205 if (flag == FLAG_NODE) {... */\n tag_283:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":711:712 4 */\n 0x04\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6219:6223 flag */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6219:6238 flag == FLAG_BRANCH */\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6215:6687 if (flag == FLAG_BRANCH) {... */\n tag_289\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3390:3391 3 */\n 0x03\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3378:3392 add(_index, 3) */\n dup1\n dup4\n add\n swap3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3290:3315 add(_index, _data.offset) */\n dup8\n dup2\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3277:3316 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3336:3339 232 */\n 0xe8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3332:3346 shr(232, word) */\n shr\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6409:6422 rindex + size */\n swap1\n dup3\n add\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6309:6321 uint256 size */\n 0x00\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6494:6547 recoverBranch(_subdigest, _signature[rindex:nrindex]) */\n tag_291\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6508:6518 _subdigest */\n dup12\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6520:6546 _signature[rindex:nrindex] */\n tag_192\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6409:6422 rindex + size */\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3378:3392 add(_index, 3) */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6520:6530 _signature */\n dup14\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3290:3315 add(_index, _data.offset) */\n dup16\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6520:6546 _signature[rindex:nrindex] */\n tag_193\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6494:6547 recoverBranch(_subdigest, _signature[rindex:nrindex]) */\n tag_291:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":622:631 bytes32 c */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n swap9\n dup10\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap1\n swap8\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6560:6577 weight += nweight */\n swap7\n swap1\n swap8\n add\n swap7\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6649:6656 nrindex */\n swap1\n swap4\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6668:6676 continue */\n tag_248\n swap3\n pop\n pop\n pop\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6215:6687 if (flag == FLAG_BRANCH) {... */\n tag_289:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":802:803 6 */\n 0x06\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6701:6705 flag */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6701:6720 flag == FLAG_NESTED */\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6697:7676 if (flag == FLAG_NESTED) {... */\n tag_294\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6864:6886 uint256 externalWeight */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1390:1415 add(_index, _data.offset) */\n dup3\n dup8\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1377:1416 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1432:1435 248 */\n 0xf8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1428:1442 shr(248, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1475:1476 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":1463:1477 add(_index, 1) */\n dup5\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6898:6953 (externalWeight, rindex) = _signature.readUint8(rindex) */\n swap4\n pop\n 0xff\n and\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6966:6991 uint256 internalThreshold */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2699:2724 add(_index, _data.offset) */\n dup8\n dup5\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2686:2725 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2745:2748 240 */\n 0xf0\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2741:2755 shr(240, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2797:2798 2 */\n 0x02\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":2785:2799 add(_index, 2) */\n dup6\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7003:7062 (internalThreshold, rindex) = _signature.readUint16(rindex) */\n swap5\n pop\n 0xffff\n and\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7075:7087 uint256 size */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3290:3315 add(_index, _data.offset) */\n dup9\n dup6\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3277:3316 calldataload(add(_index, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3336:3339 232 */\n 0xe8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3332:3346 shr(232, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3390:3391 3 */\n 0x03\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":3378:3392 add(_index, 3) */\n dup7\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7099:7145 (size, rindex) = _signature.readUint24(rindex) */\n dup2\n 0xffffff\n and\n swap2\n pop\n dup1\n swap7\n pop\n dup2\n swap3\n pop\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7157:7172 uint256 nrindex */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7184:7188 size */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7175:7181 rindex */\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7175:7188 rindex + size */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7157:7188 uint256 nrindex = rindex + size */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7201:7223 uint256 internalWeight */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7225:7245 bytes32 internalRoot */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7290:7343 recoverBranch(_subdigest, _signature[rindex:nrindex]) */\n tag_299\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7304:7314 _subdigest */\n dup14\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7316:7326 _signature */\n dup14\n dup14\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7327:7333 rindex */\n dup12\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7316:7342 _signature[rindex:nrindex] */\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7334:7341 nrindex */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7316:7342 _signature[rindex:nrindex] */\n swap3\n tag_192\n swap4\n swap3\n swap2\n swap1\n tag_193\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7290:7343 recoverBranch(_subdigest, _signature[rindex:nrindex]) */\n tag_299:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7364:7371 nrindex */\n swap4\n swap9\n pop\n dup9\n swap4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7257:7343 (internalWeight, internalRoot) = recoverBranch(_subdigest, _signature[rindex:nrindex]) */\n swap1\n swap3\n pop\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7388:7423 internalWeight >= internalThreshold */\n dup5\n dup3\n lt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7384:7476 if (internalWeight >= internalThreshold) {... */\n tag_301\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7439:7463 weight += externalWeight */\n swap9\n dup6\n add\n swap9\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7384:7476 if (internalWeight >= internalThreshold) {... */\n tag_301:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2976:3049 abi.encodePacked('Sequence nested config:\\n', _node, _threshold, _weight) */\n 0x40\n dup1\n mload\n /* \"#utility.yul\":20362:20428 */\n 0x53657175656e6365206e657374656420636f6e6669673a0a0000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2976:3049 abi.encodePacked('Sequence nested config:\\n', _node, _threshold, _weight) */\n 0x20\n dup1\n dup4\n add\n /* \"#utility.yul\":20350:20429 */\n swap2\n swap1\n swap2\n mstore\n /* \"#utility.yul\":20445:20457 */\n 0x38\n dup3\n add\n /* \"#utility.yul\":20438:20466 */\n dup5\n swap1\n mstore\n /* \"#utility.yul\":20482:20494 */\n 0x58\n dup3\n add\n /* \"#utility.yul\":20475:20503 */\n dup9\n swap1\n mstore\n /* \"#utility.yul\":20519:20531 */\n 0x78\n dup1\n dup4\n add\n /* \"#utility.yul\":20512:20540 */\n dup11\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2976:3049 abi.encodePacked('Sequence nested config:\\n', _node, _threshold, _weight) */\n dup4\n mload\n dup1\n dup5\n sub\n swap1\n swap2\n add\n dup2\n mstore\n /* \"#utility.yul\":20556:20569 */\n 0x98\n swap1\n swap3\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2976:3049 abi.encodePacked('Sequence nested config:\\n', _node, _threshold, _weight) */\n swap1\n swap3\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2966:3050 keccak256(abi.encodePacked('Sequence nested config:\\n', _node, _threshold, _weight)) */\n dup1\n mload\n swap2\n add\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7585:7589 root */\n dup10\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7585:7644 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n tag_304\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7640:7644 node */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7585:7644 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n jump(tag_306)\n tag_304:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":622:631 bytes32 c */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n dup11\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap1\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7606:7637 LibOptim.fkeccak256(root, node) */\n tag_306:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7578:7644 root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n swap10\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7657:7665 continue */\n pop\n pop\n pop\n pop\n pop\n pop\n pop\n pop\n jump(tag_248)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":6697:7676 if (flag == FLAG_NESTED) {... */\n tag_294:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":758:759 5 */\n 0x05\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7690:7694 flag */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7690:7712 flag == FLAG_SUBDIGEST */\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7686:8171 if (flag == FLAG_SUBDIGEST) {... */\n tag_307\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":4550:4552 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":4536:4553 add(_pointer, 32) */\n dup3\n add\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":4487:4514 add(_pointer, _data.offset) */\n dup7\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":4474:4515 calldataload(add(_pointer, _data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7920:7943 hardcoded == _subdigest */\n dup8\n dup2\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7916:7998 if (hardcoded == _subdigest) {... */\n tag_309\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7968:7985 type(uint256).max */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7959:7985 weight = type(uint256).max */\n swap5\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7916:7998 if (hardcoded == _subdigest) {... */\n tag_309:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8010:8022 bytes32 node */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8025:8062 _leafForHardcodedSubdigest(hardcoded) */\n tag_310\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8052:8061 hardcoded */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8025:8051 _leafForHardcodedSubdigest */\n tag_311\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8025:8062 _leafForHardcodedSubdigest(hardcoded) */\n jump\t// in\n tag_310:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8010:8062 bytes32 node = _leafForHardcodedSubdigest(hardcoded) */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8081:8085 root */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8081:8140 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n tag_312\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8136:8140 node */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8081:8140 root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n jump(tag_314)\n tag_312:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":622:631 bytes32 c */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n dup6\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n swap1\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8102:8133 LibOptim.fkeccak256(root, node) */\n tag_314:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8074:8140 root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node */\n swap5\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8152:8160 continue */\n pop\n pop\n pop\n jump(tag_248)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":7686:8171 if (flag == FLAG_SUBDIGEST) {... */\n tag_307:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8188:8214 InvalidSignatureFlag(flag) */\n mload(0x40)\n 0xb2505f7c00000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n dup2\n add\n /* \"#utility.yul\":2778:2803 */\n dup3\n swap1\n mstore\n /* \"#utility.yul\":2751:2769 */\n 0x24\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":8188:8214 InvalidSignatureFlag(flag) */\n tag_93\n /* \"#utility.yul\":2632:2809 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3765:8223 while (rindex < _signature.length) {... */\n tag_249:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3678:8229 unchecked {... */\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":3525:8233 function recoverBranch(... */\n swap4\n pop\n swap4\n swap2\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":1296:1456 function _hashSetImageHashStruct(bytes32 _imageHash) internal pure returns (bytes32) {... */\n tag_224:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":862:906 keccak256(\"SetImageHash(bytes32 imageHash)\") */\n 0x8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":1372:1379 bytes32 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":656:669 mstore(0, _a) */\n swap1\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":683:685 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":676:690 mstore(32, _b) */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":715:717 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":702:718 keccak256(0, 64) */\n dup2\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":1394:1451 LibOptim.fkeccak256(SET_IMAGE_HASH_TYPE_HASH, _imageHash) */\n tag_80\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":543:728 function fkeccak256(... */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6015:6315 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n tag_238:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6101:6105 bool */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6124:6169 _interfaceID == type(IModuleAuth).interfaceId */\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n dup3\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6140:6169 type(IModuleAuth).interfaceId */\n 0xac6a444e00000000000000000000000000000000000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6124:6169 _interfaceID == type(IModuleAuth).interfaceId */\n eq\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6124:6227 _interfaceID == type(IModuleAuth).interfaceId ||... */\n tag_323\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6179:6227 _interfaceID == type(IERC1271Wallet).interfaceId */\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n dup3\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6195:6227 type(IERC1271Wallet).interfaceId */\n 0x36e7817500000000000000000000000000000000000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6179:6227 _interfaceID == type(IERC1271Wallet).interfaceId */\n eq\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6124:6227 _interfaceID == type(IModuleAuth).interfaceId ||... */\n tag_323:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6113:6260 if (... */\n iszero\n tag_324\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6249:6253 true */\n 0x01\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6015:6315 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n swap1\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6113:6260 if (... */\n tag_324:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":725:756 this.supportsInterface.selector */\n 0x01ffc9a700000000000000000000000000000000000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":709:756 _interfaceID == this.supportsInterface.selector */\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n dup4\n and\n eq\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":6273:6310 super.supportsInterface(_interfaceID) */\n tag_80\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":613:761 function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) {... */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1767:4083 function recoverSigner(... */\n tag_264:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1867:1881 address signer */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1914:1916 66 */\n 0x42\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1893:1916 _signature.length != 66 */\n dup3\n eq\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1889:1959 if (_signature.length != 66) revert InvalidSignatureLength(_signature) */\n tag_331\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1948:1958 _signature */\n dup3\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1925:1959 InvalidSignatureLength(_signature) */\n mload(0x40)\n 0x2ee17a3d00000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap3\n swap2\n swap1\n tag_333\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1889:1959 if (_signature.length != 66) revert InvalidSignatureLength(_signature) */\n tag_331:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1965:1986 uint256 signatureType */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1989:2032 _signature.readUint8(_signature.length - 1) */\n tag_334\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":2010:2031 _signature.length - 1 */\n tag_335\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":2030:2031 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":2010:2020 _signature */\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":2010:2031 _signature.length - 1 */\n tag_336\n jump\t// in\n tag_335:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1226:1249 add(index, data.offset) */\n dup6\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1213:1250 calldataload(add(index, data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1266:1269 248 */\n 0xf8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1262:1276 shr(248, word) */\n shr\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1071:1286 function readUint8(... */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1989:2032 _signature.readUint8(_signature.length - 1) */\n tag_334:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1965:2032 uint256 signatureType = _signature.readUint8(_signature.length - 1) */\n 0xff\n and\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":2115:2117 64 */\n 0x40\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1226:1249 add(index, data.offset) */\n dup5\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1213:1250 calldataload(add(index, data.offset)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1266:1269 248 */\n 0xf8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":1262:1276 shr(248, word) */\n shr\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":795:832 calldataload(add(data.offset, index)) */\n dup5\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":2202:2204 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":808:831 add(data.offset, index) */\n dup7\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":795:832 calldataload(add(data.offset, index)) */\n calldataload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3209:3275 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 */\n 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3196:3275 uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 */\n dup2\n gt\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3192:3327 if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {... */\n iszero\n tag_342\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3306:3316 _signature */\n dup7\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3318:3319 s */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3292:3320 InvalidSValue(_signature, s) */\n mload(0x40)\n 0xad4aac7600000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap4\n swap3\n swap2\n swap1\n tag_344\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3192:3327 if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {... */\n tag_342:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3337:3338 v */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3337:3344 v != 27 */\n 0xff\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3342:3344 27 */\n 0x1b\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3337:3344 v != 27 */\n eq\n iszero\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3337:3355 v != 27 && v != 28 */\n dup1\n iszero\n tag_345\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3348:3349 v */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3348:3355 v != 28 */\n 0xff\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3353:3355 28 */\n 0x1c\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3348:3355 v != 28 */\n eq\n iszero\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3337:3355 v != 27 && v != 28 */\n tag_345:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3333:3407 if (v != 27 && v != 28) {... */\n iszero\n tag_346\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3386:3396 _signature */\n dup7\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3398:3399 v */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3372:3400 InvalidVValue(_signature, v) */\n mload(0x40)\n 0xe578897e00000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap4\n swap3\n swap2\n swap1\n tag_348\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3333:3407 if (v != 27 && v != 28) {... */\n tag_346:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1253:1254 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3447:3460 signatureType */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3447:3479 signatureType == SIG_TYPE_EIP712 */\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3443:3952 if (signatureType == SIG_TYPE_EIP712) {... */\n tag_349\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3498:3523 ecrecover(_hash, v, r, s) */\n 0x40\n dup1\n mload\n 0x00\n dup2\n mstore\n 0x20\n dup2\n add\n dup1\n dup4\n mstore\n /* \"#utility.yul\":18522:18547 */\n dup11\n swap1\n mstore\n /* \"#utility.yul\":18595:18599 */\n 0xff\n /* \"#utility.yul\":18583:18600 */\n dup6\n and\n /* \"#utility.yul\":18563:18581 */\n swap2\n dup2\n add\n /* \"#utility.yul\":18556:18601 */\n swap2\n swap1\n swap2\n mstore\n /* \"#utility.yul\":18617:18635 */\n 0x60\n dup2\n add\n /* \"#utility.yul\":18610:18644 */\n dup4\n swap1\n mstore\n /* \"#utility.yul\":18660:18678 */\n 0x80\n dup2\n add\n /* \"#utility.yul\":18653:18687 */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3498:3523 ecrecover(_hash, v, r, s) */\n 0x01\n swap1\n /* \"#utility.yul\":18494:18513 */\n 0xa0\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3498:3523 ecrecover(_hash, v, r, s) */\n tag_350:\n 0x20\n mload(0x40)\n 0x20\n dup2\n sub\n swap1\n dup1\n dup5\n sub\n swap1\n dup6\n gas\n staticcall\n iszero\n dup1\n iszero\n tag_353\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_353:\n pop\n pop\n pop\n mload(sub(mload(0x40), 0x20))\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3489:3523 signer = ecrecover(_hash, v, r, s) */\n swap5\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3443:3952 if (signatureType == SIG_TYPE_EIP712) {... */\n jump(tag_361)\n tag_349:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1303:1304 2 */\n 0x02\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3608:3621 signatureType */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3608:3642 signatureType == SIG_TYPE_ETH_SIGN */\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3604:3952 if (signatureType == SIG_TYPE_ETH_SIGN) {... */\n tag_355\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3690:3749 abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", _hash) */\n mload(0x40)\n /* \"#utility.yul\":18940:19006 */\n 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3690:3749 abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", _hash) */\n 0x20\n dup3\n add\n /* \"#utility.yul\":18928:19007 */\n mstore\n /* \"#utility.yul\":19023:19035 */\n 0x3c\n dup2\n add\n /* \"#utility.yul\":19016:19044 */\n dup10\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3661:3791 ecrecover(... */\n 0x01\n swap1\n /* \"#utility.yul\":19060:19072 */\n 0x5c\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3690:3749 abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", _hash) */\n 0x40\n dup1\n mload\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n dup2\n dup5\n sub\n add\n dup2\n mstore\n dup3\n dup3\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3680:3750 keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", _hash)) */\n dup1\n mload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3690:3749 abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", _hash) */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3680:3750 keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", _hash)) */\n swap2\n dup3\n add\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3661:3791 ecrecover(... */\n 0x00\n dup5\n mstore\n swap1\n dup4\n add\n dup1\n dup4\n mstore\n /* \"#utility.yul\":18522:18547 */\n mstore\n /* \"#utility.yul\":18595:18599 */\n 0xff\n /* \"#utility.yul\":18583:18600 */\n dup7\n and\n /* \"#utility.yul\":18563:18581 */\n swap1\n dup3\n add\n /* \"#utility.yul\":18556:18601 */\n mstore\n /* \"#utility.yul\":18617:18635 */\n 0x60\n dup2\n add\n /* \"#utility.yul\":18610:18644 */\n dup5\n swap1\n mstore\n /* \"#utility.yul\":18660:18678 */\n 0x80\n dup2\n add\n /* \"#utility.yul\":18653:18687 */\n dup4\n swap1\n mstore\n /* \"#utility.yul\":18494:18513 */\n 0xa0\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3661:3791 ecrecover(... */\n tag_350\n /* \"#utility.yul\":18295:18693 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3604:3952 if (signatureType == SIG_TYPE_ETH_SIGN) {... */\n tag_355:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3913:3923 _signature */\n dup7\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3925:3938 signatureType */\n dup6\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3940:3944 true */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3888:3945 UnsupportedSignatureType(_signature, signatureType, true) */\n mload(0x40)\n 0x9dfba85200000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_363\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3604:3952 if (signatureType == SIG_TYPE_ETH_SIGN) {... */\n tag_361:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3999:4021 signer == address(0x0) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup6\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3995:4058 if (signer == address(0x0)) revert SignerIsAddress0(_signature) */\n tag_364\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4047:4057 _signature */\n dup7\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4030:4058 SignerIsAddress0(_signature) */\n mload(0x40)\n 0x6c1719d200000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap3\n swap2\n swap1\n tag_333\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":3995:4058 if (signer == address(0x0)) revert SignerIsAddress0(_signature) */\n tag_364:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4065:4078 return signer */\n pop\n pop\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1767:4083 function recoverSigner(... */\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4411:5362 function isValidSignature(... */\n tag_274:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4535:4545 bool valid */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4557:4579 _signature.length == 0 */\n dup2\n dup2\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4553:4619 if (_signature.length == 0) {... */\n tag_367\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4596:4612 EmptySignature() */\n mload(0x40)\n 0xac241e1100000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n revert\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4553:4619 if (_signature.length == 0) {... */\n tag_367:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4625:4646 uint256 signatureType */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4655:4665 _signature */\n dup4\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4666:4687 _signature.length - 1 */\n tag_368\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4686:4687 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4655:4665 _signature */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4666:4687 _signature.length - 1 */\n tag_336\n jump\t// in\n tag_368:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4655:4688 _signature[_signature.length - 1] */\n dup2\n dup2\n lt\n tag_370\n jumpi\n tag_370\n tag_113\n jump\t// in\n tag_370:\n swap2\n swap1\n swap2\n add\n calldataload\n 0xf8\n shr\n swap2\n pop\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1253:1254 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4699:4731 signatureType == SIG_TYPE_EIP712 */\n dup2\n eq\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4699:4769 signatureType == SIG_TYPE_EIP712 || signatureType == SIG_TYPE_ETH_SIGN */\n tag_371\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1303:1304 2 */\n 0x02\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4735:4748 signatureType */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4735:4769 signatureType == SIG_TYPE_ETH_SIGN */\n eq\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4699:4769 signatureType == SIG_TYPE_EIP712 || signatureType == SIG_TYPE_ETH_SIGN */\n tag_371:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4695:5358 if (signatureType == SIG_TYPE_EIP712 || signatureType == SIG_TYPE_ETH_SIGN) {... */\n iszero\n tag_372\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4873:4880 _signer */\n dup5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4837:4880 recoverSigner(_hash, _signature) == _signer */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4837:4869 recoverSigner(_hash, _signature) */\n tag_373\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4851:4856 _hash */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4858:4868 _signature */\n dup7\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4837:4850 recoverSigner */\n tag_264\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4837:4869 recoverSigner(_hash, _signature) */\n jump\t// in\n tag_373:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4837:4880 recoverSigner(_hash, _signature) == _signer */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n eq\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4829:4880 valid = recoverSigner(_hash, _signature) == _signer */\n swap2\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4695:5358 if (signatureType == SIG_TYPE_EIP712 || signatureType == SIG_TYPE_ETH_SIGN) {... */\n jump(tag_384)\n tag_372:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":1359:1360 3 */\n 0x03\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4898:4911 signatureType */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4898:4938 signatureType == SIG_TYPE_WALLET_BYTES32 */\n sub\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4894:5358 if (signatureType == SIG_TYPE_WALLET_BYTES32) {... */\n tag_375\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5060:5100 IERC1271Wallet(_signer).isValidSignature */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup6\n and\n 0x1626ba7e\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5101:5106 _hash */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5108:5118 _signature */\n dup7\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5119:5120 0 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5108:5118 _signature */\n dup8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5121:5142 _signature.length - 1 */\n tag_376\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5141:5142 1 */\n 0x01\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5108:5118 _signature */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5121:5142 _signature.length - 1 */\n tag_336\n jump\t// in\n tag_376:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5108:5143 _signature[0:_signature.length - 1] */\n swap3\n tag_377\n swap4\n swap3\n swap2\n swap1\n tag_193\n jump\t// in\n tag_377:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5060:5144 IERC1271Wallet(_signer).isValidSignature(_hash, _signature[0:_signature.length - 1]) */\n mload(0x40)\n dup5\n 0xffffffff\n and\n 0xe0\n shl\n dup2\n mstore\n 0x04\n add\n tag_378\n swap4\n swap3\n swap2\n swap1\n tag_379\n jump\t// in\n tag_378:\n 0x20\n mload(0x40)\n dup1\n dup4\n sub\n dup2\n dup7\n gas\n staticcall\n iszero\n dup1\n iszero\n tag_381\n jumpi\n returndatasize\n 0x00\n dup1\n returndatacopy\n revert(0x00, returndatasize)\n tag_381:\n pop\n pop\n pop\n pop\n mload(0x40)\n returndatasize\n not(0x1f)\n 0x1f\n dup3\n add\n and\n dup3\n add\n dup1\n 0x40\n mstore\n pop\n dup2\n add\n swap1\n tag_382\n swap2\n swap1\n tag_383\n jump\t// in\n tag_382:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5030:5144 ERC1271_MAGICVALUE_BYTES32 == IERC1271Wallet(_signer).isValidSignature(_hash, _signature[0:_signature.length - 1]) */\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5030:5056 ERC1271_MAGICVALUE_BYTES32 */\n 0x1626ba7e00000000000000000000000000000000000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5030:5144 ERC1271_MAGICVALUE_BYTES32 == IERC1271Wallet(_signer).isValidSignature(_hash, _signature[0:_signature.length - 1]) */\n eq\n swap2\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4894:5358 if (signatureType == SIG_TYPE_WALLET_BYTES32) {... */\n jump(tag_384)\n tag_375:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5318:5328 _signature */\n dup4\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5330:5343 signatureType */\n dup3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5345:5350 false */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":5293:5351 UnsupportedSignatureType(_signature, signatureType, false) */\n mload(0x40)\n 0x9dfba85200000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_93\n swap5\n swap4\n swap3\n swap2\n swap1\n tag_363\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4894:5358 if (signatureType == SIG_TYPE_WALLET_BYTES32) {... */\n tag_384:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4547:5362 {... */\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":4411:5362 function isValidSignature(... */\n swap5\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2227:2409 function _leafForHardcodedSubdigest(... */\n tag_311:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2346:2403 abi.encodePacked('Sequence static digest:\\n', _subdigest) */\n mload(0x40)\n /* \"#utility.yul\":20822:20888 */\n 0x53657175656e636520737461746963206469676573743a0a0000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2346:2403 abi.encodePacked('Sequence static digest:\\n', _subdigest) */\n 0x20\n dup3\n add\n /* \"#utility.yul\":20810:20889 */\n mstore\n /* \"#utility.yul\":20905:20917 */\n 0x38\n dup2\n add\n /* \"#utility.yul\":20898:20926 */\n dup3\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2314:2321 bytes32 */\n 0x00\n swap1\n /* \"#utility.yul\":20942:20954 */\n 0x58\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":2346:2403 abi.encodePacked('Sequence static digest:\\n', _subdigest) */\n tag_155\n /* \"#utility.yul\":20580:20960 */\n jump\n /* \"#utility.yul\":14:191 */\n tag_397:\n /* \"#utility.yul\":99:165 */\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":92:97 */\n dup2\n /* \"#utility.yul\":88:166 */\n and\n /* \"#utility.yul\":81:86 */\n dup2\n /* \"#utility.yul\":78:167 */\n eq\n /* \"#utility.yul\":68:185 */\n tag_96\n jumpi\n /* \"#utility.yul\":181:182 */\n 0x00\n /* \"#utility.yul\":178:179 */\n dup1\n /* \"#utility.yul\":171:183 */\n revert\n /* \"#utility.yul\":196:441 */\n tag_19:\n /* \"#utility.yul\":254:260 */\n 0x00\n /* \"#utility.yul\":307:309 */\n 0x20\n /* \"#utility.yul\":295:304 */\n dup3\n /* \"#utility.yul\":286:293 */\n dup5\n /* \"#utility.yul\":282:305 */\n sub\n /* \"#utility.yul\":278:310 */\n slt\n /* \"#utility.yul\":275:327 */\n iszero\n tag_411\n jumpi\n /* \"#utility.yul\":323:324 */\n 0x00\n /* \"#utility.yul\":320:321 */\n dup1\n /* \"#utility.yul\":313:325 */\n revert\n /* \"#utility.yul\":275:327 */\n tag_411:\n /* \"#utility.yul\":362:371 */\n dup2\n /* \"#utility.yul\":349:372 */\n calldataload\n /* \"#utility.yul\":381:411 */\n tag_82\n /* \"#utility.yul\":405:410 */\n dup2\n /* \"#utility.yul\":381:411 */\n tag_397\n jump\t// in\n /* \"#utility.yul\":638:985 */\n tag_398:\n /* \"#utility.yul\":689:697 */\n 0x00\n /* \"#utility.yul\":699:705 */\n dup1\n /* \"#utility.yul\":753:756 */\n dup4\n /* \"#utility.yul\":746:750 */\n 0x1f\n /* \"#utility.yul\":738:744 */\n dup5\n /* \"#utility.yul\":734:751 */\n add\n /* \"#utility.yul\":730:757 */\n slt\n /* \"#utility.yul\":720:775 */\n tag_415\n jumpi\n /* \"#utility.yul\":771:772 */\n 0x00\n /* \"#utility.yul\":768:769 */\n dup1\n /* \"#utility.yul\":761:773 */\n revert\n /* \"#utility.yul\":720:775 */\n tag_415:\n pop\n /* \"#utility.yul\":794:814 */\n dup2\n calldataload\n /* \"#utility.yul\":837:855 */\n 0xffffffffffffffff\n /* \"#utility.yul\":826:856 */\n dup2\n gt\n /* \"#utility.yul\":823:873 */\n iszero\n tag_416\n jumpi\n /* \"#utility.yul\":869:870 */\n 0x00\n /* \"#utility.yul\":866:867 */\n dup1\n /* \"#utility.yul\":859:871 */\n revert\n /* \"#utility.yul\":823:873 */\n tag_416:\n /* \"#utility.yul\":906:910 */\n 0x20\n /* \"#utility.yul\":898:904 */\n dup4\n /* \"#utility.yul\":894:911 */\n add\n /* \"#utility.yul\":882:911 */\n swap2\n pop\n /* \"#utility.yul\":958:961 */\n dup4\n /* \"#utility.yul\":951:955 */\n 0x20\n /* \"#utility.yul\":942:948 */\n dup3\n /* \"#utility.yul\":934:940 */\n dup6\n /* \"#utility.yul\":930:949 */\n add\n /* \"#utility.yul\":926:956 */\n add\n /* \"#utility.yul\":923:962 */\n gt\n /* \"#utility.yul\":920:979 */\n iszero\n tag_417\n jumpi\n /* \"#utility.yul\":975:976 */\n 0x00\n /* \"#utility.yul\":972:973 */\n dup1\n /* \"#utility.yul\":965:977 */\n revert\n /* \"#utility.yul\":920:979 */\n tag_417:\n /* \"#utility.yul\":638:985 */\n swap3\n pop\n swap3\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":990:1467 */\n tag_26:\n /* \"#utility.yul\":1069:1075 */\n 0x00\n /* \"#utility.yul\":1077:1083 */\n dup1\n /* \"#utility.yul\":1085:1091 */\n 0x00\n /* \"#utility.yul\":1138:1140 */\n 0x40\n /* \"#utility.yul\":1126:1135 */\n dup5\n /* \"#utility.yul\":1117:1124 */\n dup7\n /* \"#utility.yul\":1113:1136 */\n sub\n /* \"#utility.yul\":1109:1141 */\n slt\n /* \"#utility.yul\":1106:1158 */\n iszero\n tag_419\n jumpi\n /* \"#utility.yul\":1154:1155 */\n 0x00\n /* \"#utility.yul\":1151:1152 */\n dup1\n /* \"#utility.yul\":1144:1156 */\n revert\n /* \"#utility.yul\":1106:1158 */\n tag_419:\n /* \"#utility.yul\":1190:1199 */\n dup4\n /* \"#utility.yul\":1177:1200 */\n calldataload\n /* \"#utility.yul\":1167:1200 */\n swap3\n pop\n /* \"#utility.yul\":1251:1253 */\n 0x20\n /* \"#utility.yul\":1240:1249 */\n dup5\n /* \"#utility.yul\":1236:1254 */\n add\n /* \"#utility.yul\":1223:1255 */\n calldataload\n /* \"#utility.yul\":1278:1296 */\n 0xffffffffffffffff\n /* \"#utility.yul\":1270:1276 */\n dup2\n /* \"#utility.yul\":1267:1297 */\n gt\n /* \"#utility.yul\":1264:1314 */\n iszero\n tag_420\n jumpi\n /* \"#utility.yul\":1310:1311 */\n 0x00\n /* \"#utility.yul\":1307:1308 */\n dup1\n /* \"#utility.yul\":1300:1312 */\n revert\n /* \"#utility.yul\":1264:1314 */\n tag_420:\n /* \"#utility.yul\":1349:1407 */\n tag_421\n /* \"#utility.yul\":1399:1406 */\n dup7\n /* \"#utility.yul\":1390:1396 */\n dup3\n /* \"#utility.yul\":1379:1388 */\n dup8\n /* \"#utility.yul\":1375:1397 */\n add\n /* \"#utility.yul\":1349:1407 */\n tag_398\n jump\t// in\n tag_421:\n /* \"#utility.yul\":990:1467 */\n swap5\n swap8\n /* \"#utility.yul\":1426:1434 */\n swap1\n swap7\n pop\n /* \"#utility.yul\":1323:1407 */\n swap4\n swap5\n pop\n pop\n pop\n pop\n /* \"#utility.yul\":990:1467 */\n jump\t// out\n /* \"#utility.yul\":1725:2442 */\n tag_33:\n /* \"#utility.yul\":1815:1821 */\n 0x00\n /* \"#utility.yul\":1823:1829 */\n dup1\n /* \"#utility.yul\":1831:1837 */\n 0x00\n /* \"#utility.yul\":1839:1845 */\n dup1\n /* \"#utility.yul\":1892:1894 */\n 0x40\n /* \"#utility.yul\":1880:1889 */\n dup6\n /* \"#utility.yul\":1871:1878 */\n dup8\n /* \"#utility.yul\":1867:1890 */\n sub\n /* \"#utility.yul\":1863:1895 */\n slt\n /* \"#utility.yul\":1860:1912 */\n iszero\n tag_424\n jumpi\n /* \"#utility.yul\":1908:1909 */\n 0x00\n /* \"#utility.yul\":1905:1906 */\n dup1\n /* \"#utility.yul\":1898:1910 */\n revert\n /* \"#utility.yul\":1860:1912 */\n tag_424:\n /* \"#utility.yul\":1948:1957 */\n dup5\n /* \"#utility.yul\":1935:1958 */\n calldataload\n /* \"#utility.yul\":1977:1995 */\n 0xffffffffffffffff\n /* \"#utility.yul\":2018:2020 */\n dup1\n /* \"#utility.yul\":2010:2016 */\n dup3\n /* \"#utility.yul\":2007:2021 */\n gt\n /* \"#utility.yul\":2004:2038 */\n iszero\n tag_425\n jumpi\n /* \"#utility.yul\":2034:2035 */\n 0x00\n /* \"#utility.yul\":2031:2032 */\n dup1\n /* \"#utility.yul\":2024:2036 */\n revert\n /* \"#utility.yul\":2004:2038 */\n tag_425:\n /* \"#utility.yul\":2073:2131 */\n tag_426\n /* \"#utility.yul\":2123:2130 */\n dup9\n /* \"#utility.yul\":2114:2120 */\n dup4\n /* \"#utility.yul\":2103:2112 */\n dup10\n /* \"#utility.yul\":2099:2121 */\n add\n /* \"#utility.yul\":2073:2131 */\n tag_398\n jump\t// in\n tag_426:\n /* \"#utility.yul\":2150:2158 */\n swap1\n swap7\n pop\n /* \"#utility.yul\":2047:2131 */\n swap5\n pop\n /* \"#utility.yul\":2238:2240 */\n 0x20\n /* \"#utility.yul\":2223:2241 */\n dup8\n add\n /* \"#utility.yul\":2210:2242 */\n calldataload\n swap2\n pop\n /* \"#utility.yul\":2254:2270 */\n dup1\n dup3\n gt\n /* \"#utility.yul\":2251:2287 */\n iszero\n tag_427\n jumpi\n /* \"#utility.yul\":2283:2284 */\n 0x00\n /* \"#utility.yul\":2280:2281 */\n dup1\n /* \"#utility.yul\":2273:2285 */\n revert\n /* \"#utility.yul\":2251:2287 */\n tag_427:\n pop\n /* \"#utility.yul\":2322:2382 */\n tag_428\n /* \"#utility.yul\":2374:2381 */\n dup8\n /* \"#utility.yul\":2363:2371 */\n dup3\n /* \"#utility.yul\":2352:2361 */\n dup9\n /* \"#utility.yul\":2348:2372 */\n add\n /* \"#utility.yul\":2322:2382 */\n tag_398\n jump\t// in\n tag_428:\n /* \"#utility.yul\":1725:2442 */\n swap6\n swap9\n swap5\n swap8\n pop\n /* \"#utility.yul\":2401:2409 */\n swap6\n pop\n pop\n pop\n pop\n /* \"#utility.yul\":1725:2442 */\n jump\t// out\n /* \"#utility.yul\":2447:2627 */\n tag_39:\n /* \"#utility.yul\":2506:2512 */\n 0x00\n /* \"#utility.yul\":2559:2561 */\n 0x20\n /* \"#utility.yul\":2547:2556 */\n dup3\n /* \"#utility.yul\":2538:2545 */\n dup5\n /* \"#utility.yul\":2534:2557 */\n sub\n /* \"#utility.yul\":2530:2562 */\n slt\n /* \"#utility.yul\":2527:2579 */\n iszero\n tag_430\n jumpi\n /* \"#utility.yul\":2575:2576 */\n 0x00\n /* \"#utility.yul\":2572:2573 */\n dup1\n /* \"#utility.yul\":2565:2577 */\n revert\n /* \"#utility.yul\":2527:2579 */\n tag_430:\n pop\n /* \"#utility.yul\":2598:2621 */\n calldataload\n swap2\n /* \"#utility.yul\":2447:2627 */\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":2814:3201 */\n tag_399:\n /* \"#utility.yul\":2897:2905 */\n 0x00\n /* \"#utility.yul\":2907:2913 */\n dup1\n /* \"#utility.yul\":2961:2964 */\n dup4\n /* \"#utility.yul\":2954:2958 */\n 0x1f\n /* \"#utility.yul\":2946:2952 */\n dup5\n /* \"#utility.yul\":2942:2959 */\n add\n /* \"#utility.yul\":2938:2965 */\n slt\n /* \"#utility.yul\":2928:2983 */\n tag_433\n jumpi\n /* \"#utility.yul\":2979:2980 */\n 0x00\n /* \"#utility.yul\":2976:2977 */\n dup1\n /* \"#utility.yul\":2969:2981 */\n revert\n /* \"#utility.yul\":2928:2983 */\n tag_433:\n pop\n /* \"#utility.yul\":3002:3022 */\n dup2\n calldataload\n /* \"#utility.yul\":3045:3063 */\n 0xffffffffffffffff\n /* \"#utility.yul\":3034:3064 */\n dup2\n gt\n /* \"#utility.yul\":3031:3081 */\n iszero\n tag_434\n jumpi\n /* \"#utility.yul\":3077:3078 */\n 0x00\n /* \"#utility.yul\":3074:3075 */\n dup1\n /* \"#utility.yul\":3067:3079 */\n revert\n /* \"#utility.yul\":3031:3081 */\n tag_434:\n /* \"#utility.yul\":3114:3118 */\n 0x20\n /* \"#utility.yul\":3106:3112 */\n dup4\n /* \"#utility.yul\":3102:3119 */\n add\n /* \"#utility.yul\":3090:3119 */\n swap2\n pop\n /* \"#utility.yul\":3174:3177 */\n dup4\n /* \"#utility.yul\":3167:3171 */\n 0x20\n /* \"#utility.yul\":3157:3163 */\n dup3\n /* \"#utility.yul\":3154:3155 */\n 0x05\n /* \"#utility.yul\":3150:3164 */\n shl\n /* \"#utility.yul\":3142:3148 */\n dup6\n /* \"#utility.yul\":3138:3165 */\n add\n /* \"#utility.yul\":3134:3172 */\n add\n /* \"#utility.yul\":3131:3178 */\n gt\n /* \"#utility.yul\":3128:3195 */\n iszero\n tag_417\n jumpi\n /* \"#utility.yul\":3191:3192 */\n 0x00\n /* \"#utility.yul\":3188:3189 */\n dup1\n /* \"#utility.yul\":3181:3193 */\n revert\n /* \"#utility.yul\":3206:3694 */\n tag_49:\n /* \"#utility.yul\":3323:3329 */\n 0x00\n /* \"#utility.yul\":3331:3337 */\n dup1\n /* \"#utility.yul\":3384:3386 */\n 0x20\n /* \"#utility.yul\":3372:3381 */\n dup4\n /* \"#utility.yul\":3363:3370 */\n dup6\n /* \"#utility.yul\":3359:3382 */\n sub\n /* \"#utility.yul\":3355:3387 */\n slt\n /* \"#utility.yul\":3352:3404 */\n iszero\n tag_437\n jumpi\n /* \"#utility.yul\":3400:3401 */\n 0x00\n /* \"#utility.yul\":3397:3398 */\n dup1\n /* \"#utility.yul\":3390:3402 */\n revert\n /* \"#utility.yul\":3352:3404 */\n tag_437:\n /* \"#utility.yul\":3440:3449 */\n dup3\n /* \"#utility.yul\":3427:3450 */\n calldataload\n /* \"#utility.yul\":3473:3491 */\n 0xffffffffffffffff\n /* \"#utility.yul\":3465:3471 */\n dup2\n /* \"#utility.yul\":3462:3492 */\n gt\n /* \"#utility.yul\":3459:3509 */\n iszero\n tag_438\n jumpi\n /* \"#utility.yul\":3505:3506 */\n 0x00\n /* \"#utility.yul\":3502:3503 */\n dup1\n /* \"#utility.yul\":3495:3507 */\n revert\n /* \"#utility.yul\":3459:3509 */\n tag_438:\n /* \"#utility.yul\":3544:3634 */\n tag_439\n /* \"#utility.yul\":3626:3633 */\n dup6\n /* \"#utility.yul\":3617:3623 */\n dup3\n /* \"#utility.yul\":3606:3615 */\n dup7\n /* \"#utility.yul\":3602:3624 */\n add\n /* \"#utility.yul\":3544:3634 */\n tag_399\n jump\t// in\n tag_439:\n /* \"#utility.yul\":3653:3661 */\n swap1\n swap7\n /* \"#utility.yul\":3518:3634 */\n swap1\n swap6\n pop\n /* \"#utility.yul\":3206:3694 */\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":3699:4563 */\n tag_54:\n /* \"#utility.yul\":3845:3851 */\n 0x00\n /* \"#utility.yul\":3853:3859 */\n dup1\n /* \"#utility.yul\":3861:3867 */\n 0x00\n /* \"#utility.yul\":3869:3875 */\n dup1\n /* \"#utility.yul\":3877:3883 */\n 0x00\n /* \"#utility.yul\":3930:3932 */\n 0x60\n /* \"#utility.yul\":3918:3927 */\n dup7\n /* \"#utility.yul\":3909:3916 */\n dup9\n /* \"#utility.yul\":3905:3928 */\n sub\n /* \"#utility.yul\":3901:3933 */\n slt\n /* \"#utility.yul\":3898:3950 */\n iszero\n tag_441\n jumpi\n /* \"#utility.yul\":3946:3947 */\n 0x00\n /* \"#utility.yul\":3943:3944 */\n dup1\n /* \"#utility.yul\":3936:3948 */\n revert\n /* \"#utility.yul\":3898:3950 */\n tag_441:\n /* \"#utility.yul\":3986:3995 */\n dup6\n /* \"#utility.yul\":3973:3996 */\n calldataload\n /* \"#utility.yul\":4015:4033 */\n 0xffffffffffffffff\n /* \"#utility.yul\":4056:4058 */\n dup1\n /* \"#utility.yul\":4048:4054 */\n dup3\n /* \"#utility.yul\":4045:4059 */\n gt\n /* \"#utility.yul\":4042:4076 */\n iszero\n tag_442\n jumpi\n /* \"#utility.yul\":4072:4073 */\n 0x00\n /* \"#utility.yul\":4069:4070 */\n dup1\n /* \"#utility.yul\":4062:4074 */\n revert\n /* \"#utility.yul\":4042:4076 */\n tag_442:\n /* \"#utility.yul\":4111:4201 */\n tag_443\n /* \"#utility.yul\":4193:4200 */\n dup10\n /* \"#utility.yul\":4184:4190 */\n dup4\n /* \"#utility.yul\":4173:4182 */\n dup11\n /* \"#utility.yul\":4169:4191 */\n add\n /* \"#utility.yul\":4111:4201 */\n tag_399\n jump\t// in\n tag_443:\n /* \"#utility.yul\":4220:4228 */\n swap1\n swap8\n pop\n /* \"#utility.yul\":4085:4201 */\n swap6\n pop\n /* \"#utility.yul\":4302:4304 */\n 0x20\n /* \"#utility.yul\":4287:4305 */\n dup9\n add\n /* \"#utility.yul\":4274:4306 */\n calldataload\n swap5\n pop\n /* \"#utility.yul\":4359:4361 */\n 0x40\n /* \"#utility.yul\":4344:4362 */\n dup9\n add\n /* \"#utility.yul\":4331:4363 */\n calldataload\n swap2\n pop\n /* \"#utility.yul\":4375:4391 */\n dup1\n dup3\n gt\n /* \"#utility.yul\":4372:4408 */\n iszero\n tag_444\n jumpi\n /* \"#utility.yul\":4404:4405 */\n 0x00\n /* \"#utility.yul\":4401:4402 */\n dup1\n /* \"#utility.yul\":4394:4406 */\n revert\n /* \"#utility.yul\":4372:4408 */\n tag_444:\n pop\n /* \"#utility.yul\":4443:4503 */\n tag_445\n /* \"#utility.yul\":4495:4502 */\n dup9\n /* \"#utility.yul\":4484:4492 */\n dup3\n /* \"#utility.yul\":4473:4482 */\n dup10\n /* \"#utility.yul\":4469:4493 */\n add\n /* \"#utility.yul\":4443:4503 */\n tag_398\n jump\t// in\n tag_445:\n /* \"#utility.yul\":3699:4563 */\n swap7\n swap10\n swap6\n swap9\n pop\n swap4\n swap7\n pop\n /* \"#utility.yul\":4522:4530 */\n swap3\n swap5\n /* \"#utility.yul\":4417:4503 */\n swap4\n /* \"#utility.yul\":3699:4563 */\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":5403:5587 */\n tag_400:\n /* \"#utility.yul\":5455:5532 */\n 0x4e487b7100000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":5452:5453 */\n 0x00\n /* \"#utility.yul\":5445:5533 */\n mstore\n /* \"#utility.yul\":5552:5556 */\n 0x41\n /* \"#utility.yul\":5549:5550 */\n 0x04\n /* \"#utility.yul\":5542:5557 */\n mstore\n /* \"#utility.yul\":5576:5580 */\n 0x24\n /* \"#utility.yul\":5573:5574 */\n 0x00\n /* \"#utility.yul\":5566:5581 */\n revert\n /* \"#utility.yul\":5592:6572 */\n tag_71:\n /* \"#utility.yul\":5660:5666 */\n 0x00\n /* \"#utility.yul\":5713:5715 */\n 0x20\n /* \"#utility.yul\":5701:5710 */\n dup3\n /* \"#utility.yul\":5692:5699 */\n dup5\n /* \"#utility.yul\":5688:5711 */\n sub\n /* \"#utility.yul\":5684:5716 */\n slt\n /* \"#utility.yul\":5681:5733 */\n iszero\n tag_452\n jumpi\n /* \"#utility.yul\":5729:5730 */\n 0x00\n /* \"#utility.yul\":5726:5727 */\n dup1\n /* \"#utility.yul\":5719:5731 */\n revert\n /* \"#utility.yul\":5681:5733 */\n tag_452:\n /* \"#utility.yul\":5769:5778 */\n dup2\n /* \"#utility.yul\":5756:5779 */\n calldataload\n /* \"#utility.yul\":5798:5816 */\n 0xffffffffffffffff\n /* \"#utility.yul\":5839:5841 */\n dup1\n /* \"#utility.yul\":5831:5837 */\n dup3\n /* \"#utility.yul\":5828:5842 */\n gt\n /* \"#utility.yul\":5825:5859 */\n iszero\n tag_453\n jumpi\n /* \"#utility.yul\":5855:5856 */\n 0x00\n /* \"#utility.yul\":5852:5853 */\n dup1\n /* \"#utility.yul\":5845:5857 */\n revert\n /* \"#utility.yul\":5825:5859 */\n tag_453:\n /* \"#utility.yul\":5893:5899 */\n dup2\n /* \"#utility.yul\":5882:5891 */\n dup5\n /* \"#utility.yul\":5878:5900 */\n add\n /* \"#utility.yul\":5868:5900 */\n swap2\n pop\n /* \"#utility.yul\":5938:5945 */\n dup5\n /* \"#utility.yul\":5931:5935 */\n 0x1f\n /* \"#utility.yul\":5927:5929 */\n dup4\n /* \"#utility.yul\":5923:5936 */\n add\n /* \"#utility.yul\":5919:5946 */\n slt\n /* \"#utility.yul\":5909:5964 */\n tag_454\n jumpi\n /* \"#utility.yul\":5960:5961 */\n 0x00\n /* \"#utility.yul\":5957:5958 */\n dup1\n /* \"#utility.yul\":5950:5962 */\n revert\n /* \"#utility.yul\":5909:5964 */\n tag_454:\n /* \"#utility.yul\":5996:5998 */\n dup2\n /* \"#utility.yul\":5983:5999 */\n calldataload\n /* \"#utility.yul\":6018:6020 */\n dup2\n /* \"#utility.yul\":6014:6016 */\n dup2\n /* \"#utility.yul\":6011:6021 */\n gt\n /* \"#utility.yul\":6008:6044 */\n iszero\n tag_456\n jumpi\n /* \"#utility.yul\":6024:6042 */\n tag_456\n tag_400\n jump\t// in\n tag_456:\n /* \"#utility.yul\":6158:6160 */\n 0x40\n /* \"#utility.yul\":6152:6161 */\n mload\n /* \"#utility.yul\":6220:6224 */\n 0x1f\n /* \"#utility.yul\":6212:6225 */\n dup3\n add\n /* \"#utility.yul\":6063:6129 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n /* \"#utility.yul\":6208:6230 */\n swap1\n dup2\n and\n /* \"#utility.yul\":6232:6234 */\n 0x3f\n /* \"#utility.yul\":6204:6235 */\n add\n /* \"#utility.yul\":6200:6240 */\n and\n /* \"#utility.yul\":6188:6241 */\n dup2\n add\n swap1\n /* \"#utility.yul\":6256:6274 */\n dup4\n dup3\n gt\n /* \"#utility.yul\":6276:6298 */\n dup2\n dup4\n lt\n /* \"#utility.yul\":6253:6299 */\n or\n /* \"#utility.yul\":6250:6322 */\n iszero\n tag_458\n jumpi\n /* \"#utility.yul\":6302:6320 */\n tag_458\n tag_400\n jump\t// in\n tag_458:\n /* \"#utility.yul\":6342:6352 */\n dup2\n /* \"#utility.yul\":6338:6340 */\n 0x40\n /* \"#utility.yul\":6331:6353 */\n mstore\n /* \"#utility.yul\":6377:6379 */\n dup3\n /* \"#utility.yul\":6369:6375 */\n dup2\n /* \"#utility.yul\":6362:6380 */\n mstore\n /* \"#utility.yul\":6417:6424 */\n dup8\n /* \"#utility.yul\":6412:6414 */\n 0x20\n /* \"#utility.yul\":6407:6409 */\n dup5\n /* \"#utility.yul\":6403:6405 */\n dup8\n /* \"#utility.yul\":6399:6410 */\n add\n /* \"#utility.yul\":6395:6415 */\n add\n /* \"#utility.yul\":6392:6425 */\n gt\n /* \"#utility.yul\":6389:6442 */\n iszero\n tag_459\n jumpi\n /* \"#utility.yul\":6438:6439 */\n 0x00\n /* \"#utility.yul\":6435:6436 */\n dup1\n /* \"#utility.yul\":6428:6440 */\n revert\n /* \"#utility.yul\":6389:6442 */\n tag_459:\n /* \"#utility.yul\":6494:6496 */\n dup3\n /* \"#utility.yul\":6489:6491 */\n 0x20\n /* \"#utility.yul\":6485:6487 */\n dup7\n /* \"#utility.yul\":6481:6492 */\n add\n /* \"#utility.yul\":6476:6478 */\n 0x20\n /* \"#utility.yul\":6468:6474 */\n dup4\n /* \"#utility.yul\":6464:6479 */\n add\n /* \"#utility.yul\":6451:6497 */\n calldatacopy\n /* \"#utility.yul\":6539:6540 */\n 0x00\n /* \"#utility.yul\":6517:6532 */\n swap3\n dup2\n add\n /* \"#utility.yul\":6534:6536 */\n 0x20\n /* \"#utility.yul\":6513:6537 */\n add\n /* \"#utility.yul\":6506:6541 */\n swap3\n swap1\n swap3\n mstore\n pop\n /* \"#utility.yul\":6521:6527 */\n swap6\n /* \"#utility.yul\":5592:6572 */\n swap5\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":6808:7079 */\n tag_89:\n /* \"#utility.yul\":6991:6997 */\n dup2\n /* \"#utility.yul\":6983:6989 */\n dup4\n /* \"#utility.yul\":6978:6981 */\n dup3\n /* \"#utility.yul\":6965:6998 */\n calldatacopy\n /* \"#utility.yul\":6947:6950 */\n 0x00\n /* \"#utility.yul\":7017:7033 */\n swap2\n add\n /* \"#utility.yul\":7042:7055 */\n swap1\n dup2\n mstore\n /* \"#utility.yul\":7017:7033 */\n swap2\n /* \"#utility.yul\":6808:7079 */\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":7416:7576 */\n tag_401:\n /* \"#utility.yul\":7481:7501 */\n dup1\n calldataload\n /* \"#utility.yul\":7537:7550 */\n dup1\n iszero\n /* \"#utility.yul\":7530:7551 */\n iszero\n /* \"#utility.yul\":7520:7552 */\n dup2\n eq\n /* \"#utility.yul\":7510:7570 */\n tag_464\n jumpi\n /* \"#utility.yul\":7566:7567 */\n 0x00\n /* \"#utility.yul\":7563:7564 */\n dup1\n /* \"#utility.yul\":7556:7568 */\n revert\n /* \"#utility.yul\":7510:7570 */\n tag_464:\n /* \"#utility.yul\":7416:7576 */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":7581:7777 */\n tag_402:\n /* \"#utility.yul\":7649:7669 */\n dup1\n calldataload\n /* \"#utility.yul\":7709:7751 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":7698:7752 */\n dup2\n and\n /* \"#utility.yul\":7688:7753 */\n dup2\n eq\n /* \"#utility.yul\":7678:7771 */\n tag_464\n jumpi\n /* \"#utility.yul\":7767:7768 */\n 0x00\n /* \"#utility.yul\":7764:7765 */\n dup1\n /* \"#utility.yul\":7757:7769 */\n revert\n /* \"#utility.yul\":7782:8107 */\n tag_403:\n /* \"#utility.yul\":7870:7876 */\n dup2\n /* \"#utility.yul\":7865:7868 */\n dup4\n /* \"#utility.yul\":7858:7877 */\n mstore\n /* \"#utility.yul\":7922:7928 */\n dup2\n /* \"#utility.yul\":7915:7920 */\n dup2\n /* \"#utility.yul\":7908:7912 */\n 0x20\n /* \"#utility.yul\":7903:7906 */\n dup6\n /* \"#utility.yul\":7899:7913 */\n add\n /* \"#utility.yul\":7886:7929 */\n calldatacopy\n pop\n /* \"#utility.yul\":7974:7975 */\n 0x00\n /* \"#utility.yul\":7967:7971 */\n 0x20\n /* \"#utility.yul\":7958:7964 */\n dup3\n /* \"#utility.yul\":7953:7956 */\n dup5\n /* \"#utility.yul\":7949:7965 */\n add\n /* \"#utility.yul\":7945:7972 */\n add\n /* \"#utility.yul\":7938:7976 */\n mstore\n /* \"#utility.yul\":7840:7843 */\n 0x00\n /* \"#utility.yul\":8096:8100 */\n 0x20\n /* \"#utility.yul\":8026:8092 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n /* \"#utility.yul\":8021:8023 */\n 0x1f\n /* \"#utility.yul\":8013:8019 */\n dup5\n /* \"#utility.yul\":8009:8024 */\n add\n /* \"#utility.yul\":8005:8093 */\n and\n /* \"#utility.yul\":8000:8003 */\n dup5\n /* \"#utility.yul\":7996:8094 */\n add\n /* \"#utility.yul\":7992:8101 */\n add\n /* \"#utility.yul\":7985:8101 */\n swap1\n pop\n /* \"#utility.yul\":7782:8107 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":8112:10140 */\n tag_404:\n /* \"#utility.yul\":8232:8238 */\n dup2\n /* \"#utility.yul\":8227:8230 */\n dup4\n /* \"#utility.yul\":8220:8239 */\n mstore\n /* \"#utility.yul\":8202:8205 */\n 0x00\n /* \"#utility.yul\":8258:8262 */\n 0x20\n /* \"#utility.yul\":8299:8301 */\n dup1\n /* \"#utility.yul\":8294:8297 */\n dup6\n /* \"#utility.yul\":8290:8302 */\n add\n /* \"#utility.yul\":8324:8335 */\n dup1\n /* \"#utility.yul\":8351:8362 */\n dup2\n /* \"#utility.yul\":8344:8362 */\n swap7\n pop\n /* \"#utility.yul\":8401:8407 */\n dup6\n /* \"#utility.yul\":8398:8399 */\n 0x05\n /* \"#utility.yul\":8394:8408 */\n shl\n /* \"#utility.yul\":8387:8392 */\n dup2\n /* \"#utility.yul\":8383:8409 */\n add\n /* \"#utility.yul\":8371:8409 */\n swap2\n pop\n /* \"#utility.yul\":8432:8437 */\n dup5\n /* \"#utility.yul\":8455:8456 */\n 0x00\n /* \"#utility.yul\":8465:10114 */\n tag_469:\n /* \"#utility.yul\":8479:8485 */\n dup8\n /* \"#utility.yul\":8476:8477 */\n dup2\n /* \"#utility.yul\":8473:8486 */\n lt\n /* \"#utility.yul\":8465:10114 */\n iszero\n tag_471\n jumpi\n /* \"#utility.yul\":8550:8555 */\n dup3\n /* \"#utility.yul\":8544:8548 */\n dup5\n /* \"#utility.yul\":8540:8556 */\n sub\n /* \"#utility.yul\":8535:8538 */\n dup10\n /* \"#utility.yul\":8528:8557 */\n mstore\n /* \"#utility.yul\":8609:8615 */\n dup2\n /* \"#utility.yul\":8596:8616 */\n calldataload\n /* \"#utility.yul\":8695:8761 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41\n /* \"#utility.yul\":8687:8692 */\n dup9\n /* \"#utility.yul\":8671:8685 */\n calldatasize\n /* \"#utility.yul\":8667:8693 */\n sub\n /* \"#utility.yul\":8663:8762 */\n add\n /* \"#utility.yul\":8643:8661 */\n dup2\n /* \"#utility.yul\":8639:8763 */\n slt\n /* \"#utility.yul\":8629:8781 */\n tag_472\n jumpi\n /* \"#utility.yul\":8777:8778 */\n 0x00\n /* \"#utility.yul\":8774:8775 */\n dup1\n /* \"#utility.yul\":8767:8779 */\n revert\n /* \"#utility.yul\":8629:8781 */\n tag_472:\n /* \"#utility.yul\":8809:8839 */\n dup8\n add\n /* \"#utility.yul\":8862:8866 */\n 0xc0\n /* \"#utility.yul\":8906:8930 */\n tag_473\n /* \"#utility.yul\":8809:8839 */\n dup3\n /* \"#utility.yul\":8906:8930 */\n tag_401\n jump\t// in\n tag_473:\n /* \"#utility.yul\":8899:8931 */\n iszero\n /* \"#utility.yul\":8892:8932 */\n iszero\n /* \"#utility.yul\":8886:8890 */\n dup7\n /* \"#utility.yul\":8879:8933 */\n mstore\n /* \"#utility.yul\":8982:9015 */\n tag_474\n /* \"#utility.yul\":9011:9013 */\n dup8\n /* \"#utility.yul\":9002:9009 */\n dup4\n /* \"#utility.yul\":8998:9014 */\n add\n /* \"#utility.yul\":8982:9015 */\n tag_401\n jump\t// in\n tag_474:\n /* \"#utility.yul\":8975:9016 */\n iszero\n /* \"#utility.yul\":8968:9017 */\n iszero\n /* \"#utility.yul\":8953:8966 */\n dup7\n dup9\n add\n /* \"#utility.yul\":8946:9018 */\n mstore\n /* \"#utility.yul\":9041:9045 */\n 0x40\n /* \"#utility.yul\":9093:9109 */\n dup3\n dup2\n add\n /* \"#utility.yul\":9080:9110 */\n calldataload\n /* \"#utility.yul\":9065:9078 */\n swap1\n dup8\n add\n /* \"#utility.yul\":9058:9111 */\n mstore\n /* \"#utility.yul\":9134:9138 */\n 0x60\n /* \"#utility.yul\":9215:9257 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":9177:9213 */\n tag_475\n /* \"#utility.yul\":9196:9212 */\n dup3\n dup6\n add\n /* \"#utility.yul\":9177:9213 */\n tag_402\n jump\t// in\n tag_475:\n /* \"#utility.yul\":9173:9258 */\n and\n /* \"#utility.yul\":9158:9171 */\n swap1\n dup8\n add\n /* \"#utility.yul\":9151:9259 */\n mstore\n /* \"#utility.yul\":9282:9286 */\n 0x80\n /* \"#utility.yul\":9334:9350 */\n dup3\n dup2\n add\n /* \"#utility.yul\":9321:9351 */\n calldataload\n /* \"#utility.yul\":9306:9319 */\n swap1\n dup8\n add\n /* \"#utility.yul\":9299:9352 */\n mstore\n /* \"#utility.yul\":9375:9379 */\n 0xa0\n /* \"#utility.yul\":9433:9449 */\n dup1\n dup4\n add\n /* \"#utility.yul\":9420:9450 */\n calldataload\n /* \"#utility.yul\":9507:9521 */\n calldatasize\n /* \"#utility.yul\":9503:9531 */\n dup5\n swap1\n sub\n /* \"#utility.yul\":9533:9599 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1\n /* \"#utility.yul\":9499:9600 */\n add\n /* \"#utility.yul\":9473:9601 */\n dup2\n slt\n /* \"#utility.yul\":9463:9619 */\n tag_476\n jumpi\n /* \"#utility.yul\":9615:9616 */\n 0x00\n /* \"#utility.yul\":9612:9613 */\n dup1\n /* \"#utility.yul\":9605:9617 */\n revert\n /* \"#utility.yul\":9463:9619 */\n tag_476:\n /* \"#utility.yul\":9647:9681 */\n swap1\n swap3\n add\n /* \"#utility.yul\":9759:9775 */\n dup8\n dup2\n add\n swap3\n swap1\n /* \"#utility.yul\":9710:9731 */\n calldataload\n /* \"#utility.yul\":9804:9822 */\n 0xffffffffffffffff\n /* \"#utility.yul\":9791:9823 */\n dup2\n gt\n /* \"#utility.yul\":9788:9840 */\n iszero\n tag_477\n jumpi\n /* \"#utility.yul\":9836:9837 */\n 0x00\n /* \"#utility.yul\":9833:9834 */\n dup1\n /* \"#utility.yul\":9826:9838 */\n revert\n /* \"#utility.yul\":9788:9840 */\n tag_477:\n /* \"#utility.yul\":9889:9897 */\n dup1\n /* \"#utility.yul\":9873:9887 */\n calldatasize\n /* \"#utility.yul\":9869:9898 */\n sub\n /* \"#utility.yul\":9860:9867 */\n dup5\n /* \"#utility.yul\":9856:9899 */\n sgt\n /* \"#utility.yul\":9853:9916 */\n iszero\n tag_478\n jumpi\n /* \"#utility.yul\":9912:9913 */\n 0x00\n /* \"#utility.yul\":9909:9910 */\n dup1\n /* \"#utility.yul\":9902:9914 */\n revert\n /* \"#utility.yul\":9853:9916 */\n tag_478:\n /* \"#utility.yul\":9951:9953 */\n dup3\n /* \"#utility.yul\":9946:9948 */\n dup3\n /* \"#utility.yul\":9940:9944 */\n dup10\n /* \"#utility.yul\":9936:9949 */\n add\n /* \"#utility.yul\":9929:9954 */\n mstore\n /* \"#utility.yul\":9975:10034 */\n tag_479\n /* \"#utility.yul\":10030:10032 */\n dup4\n /* \"#utility.yul\":10024:10028 */\n dup10\n /* \"#utility.yul\":10020:10033 */\n add\n /* \"#utility.yul\":10010:10018 */\n dup3\n /* \"#utility.yul\":10001:10008 */\n dup7\n /* \"#utility.yul\":9975:10034 */\n tag_403\n jump\t// in\n tag_479:\n /* \"#utility.yul\":10092:10104 */\n swap13\n dup10\n add\n swap13\n /* \"#utility.yul\":9967:10034 */\n swap8\n pop\n pop\n pop\n /* \"#utility.yul\":10057:10072 */\n swap3\n dup7\n add\n swap3\n pop\n pop\n /* \"#utility.yul\":8501:8502 */\n 0x01\n /* \"#utility.yul\":8494:8503 */\n add\n /* \"#utility.yul\":8465:10114 */\n jump(tag_469)\n tag_471:\n pop\n /* \"#utility.yul\":10130:10134 */\n swap2\n swap8\n /* \"#utility.yul\":8112:10140 */\n swap7\n pop\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":10145:10739 */\n tag_101:\n /* \"#utility.yul\":10495:10497 */\n 0x40\n /* \"#utility.yul\":10484:10493 */\n dup2\n /* \"#utility.yul\":10477:10498 */\n mstore\n /* \"#utility.yul\":10534:10535 */\n 0x05\n /* \"#utility.yul\":10529:10531 */\n 0x40\n /* \"#utility.yul\":10518:10527 */\n dup3\n /* \"#utility.yul\":10514:10532 */\n add\n /* \"#utility.yul\":10507:10536 */\n mstore\n /* \"#utility.yul\":10572:10579 */\n 0x73656c663a000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":10567:10569 */\n 0x60\n /* \"#utility.yul\":10556:10565 */\n dup3\n /* \"#utility.yul\":10552:10570 */\n add\n /* \"#utility.yul\":10545:10580 */\n mstore\n /* \"#utility.yul\":10618:10621 */\n 0x80\n /* \"#utility.yul\":10611:10615 */\n 0x20\n /* \"#utility.yul\":10600:10609 */\n dup3\n /* \"#utility.yul\":10596:10616 */\n add\n /* \"#utility.yul\":10589:10622 */\n mstore\n /* \"#utility.yul\":10458:10462 */\n 0x00\n /* \"#utility.yul\":10639:10733 */\n tag_86\n /* \"#utility.yul\":10728:10731 */\n 0x80\n /* \"#utility.yul\":10717:10726 */\n dup4\n /* \"#utility.yul\":10713:10732 */\n add\n /* \"#utility.yul\":10705:10711 */\n dup5\n /* \"#utility.yul\":10697:10703 */\n dup7\n /* \"#utility.yul\":10639:10733 */\n tag_404\n jump\t// in\n /* \"#utility.yul\":10744:11339 */\n tag_108:\n /* \"#utility.yul\":11094:11096 */\n 0x40\n /* \"#utility.yul\":11083:11092 */\n dup2\n /* \"#utility.yul\":11076:11097 */\n mstore\n /* \"#utility.yul\":11133:11134 */\n 0x06\n /* \"#utility.yul\":11128:11130 */\n 0x40\n /* \"#utility.yul\":11117:11126 */\n dup3\n /* \"#utility.yul\":11113:11131 */\n add\n /* \"#utility.yul\":11106:11135 */\n mstore\n /* \"#utility.yul\":11171:11179 */\n 0x67756573743a0000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":11166:11168 */\n 0x60\n /* \"#utility.yul\":11155:11164 */\n dup3\n /* \"#utility.yul\":11151:11169 */\n add\n /* \"#utility.yul\":11144:11180 */\n mstore\n /* \"#utility.yul\":11218:11221 */\n 0x80\n /* \"#utility.yul\":11211:11215 */\n 0x20\n /* \"#utility.yul\":11200:11209 */\n dup3\n /* \"#utility.yul\":11196:11216 */\n add\n /* \"#utility.yul\":11189:11222 */\n mstore\n /* \"#utility.yul\":11057:11061 */\n 0x00\n /* \"#utility.yul\":11239:11333 */\n tag_86\n /* \"#utility.yul\":11328:11331 */\n 0x80\n /* \"#utility.yul\":11317:11326 */\n dup4\n /* \"#utility.yul\":11313:11332 */\n add\n /* \"#utility.yul\":11305:11311 */\n dup5\n /* \"#utility.yul\":11297:11303 */\n dup7\n /* \"#utility.yul\":11239:11333 */\n tag_404\n jump\t// in\n /* \"#utility.yul\":11344:11528 */\n tag_113:\n /* \"#utility.yul\":11396:11473 */\n 0x4e487b7100000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":11393:11394 */\n 0x00\n /* \"#utility.yul\":11386:11474 */\n mstore\n /* \"#utility.yul\":11493:11497 */\n 0x32\n /* \"#utility.yul\":11490:11491 */\n 0x04\n /* \"#utility.yul\":11483:11498 */\n mstore\n /* \"#utility.yul\":11517:11521 */\n 0x24\n /* \"#utility.yul\":11514:11515 */\n 0x00\n /* \"#utility.yul\":11507:11522 */\n revert\n /* \"#utility.yul\":11786:12267 */\n tag_405:\n /* \"#utility.yul\":11827:11830 */\n 0x00\n /* \"#utility.yul\":11865:11870 */\n dup2\n /* \"#utility.yul\":11859:11871 */\n mload\n /* \"#utility.yul\":11892:11898 */\n dup1\n /* \"#utility.yul\":11887:11890 */\n dup5\n /* \"#utility.yul\":11880:11899 */\n mstore\n /* \"#utility.yul\":11917:11918 */\n 0x00\n /* \"#utility.yul\":11927:12089 */\n tag_487:\n /* \"#utility.yul\":11941:11947 */\n dup2\n /* \"#utility.yul\":11938:11939 */\n dup2\n /* \"#utility.yul\":11935:11948 */\n lt\n /* \"#utility.yul\":11927:12089 */\n iszero\n tag_489\n jumpi\n /* \"#utility.yul\":12003:12007 */\n 0x20\n /* \"#utility.yul\":12059:12072 */\n dup2\n dup6\n add\n /* \"#utility.yul\":12055:12077 */\n dup2\n add\n /* \"#utility.yul\":12049:12078 */\n mload\n /* \"#utility.yul\":12031:12042 */\n dup7\n dup4\n add\n /* \"#utility.yul\":12027:12047 */\n dup3\n add\n /* \"#utility.yul\":12020:12079 */\n mstore\n /* \"#utility.yul\":11956:11968 */\n add\n /* \"#utility.yul\":11927:12089 */\n jump(tag_487)\n tag_489:\n /* \"#utility.yul\":11931:11934 */\n pop\n /* \"#utility.yul\":12134:12135 */\n 0x00\n /* \"#utility.yul\":12127:12131 */\n 0x20\n /* \"#utility.yul\":12118:12124 */\n dup3\n /* \"#utility.yul\":12113:12116 */\n dup7\n /* \"#utility.yul\":12109:12125 */\n add\n /* \"#utility.yul\":12105:12132 */\n add\n /* \"#utility.yul\":12098:12136 */\n mstore\n /* \"#utility.yul\":12256:12260 */\n 0x20\n /* \"#utility.yul\":12186:12252 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n /* \"#utility.yul\":12181:12183 */\n 0x1f\n /* \"#utility.yul\":12173:12179 */\n dup4\n /* \"#utility.yul\":12169:12184 */\n add\n /* \"#utility.yul\":12165:12253 */\n and\n /* \"#utility.yul\":12160:12163 */\n dup6\n /* \"#utility.yul\":12156:12254 */\n add\n /* \"#utility.yul\":12152:12261 */\n add\n /* \"#utility.yul\":12145:12261 */\n swap2\n pop\n pop\n /* \"#utility.yul\":11786:12267 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":12272:12489 */\n tag_140:\n /* \"#utility.yul\":12419:12421 */\n 0x20\n /* \"#utility.yul\":12408:12417 */\n dup2\n /* \"#utility.yul\":12401:12422 */\n mstore\n /* \"#utility.yul\":12382:12386 */\n 0x00\n /* \"#utility.yul\":12439:12483 */\n tag_82\n /* \"#utility.yul\":12479:12481 */\n 0x20\n /* \"#utility.yul\":12468:12477 */\n dup4\n /* \"#utility.yul\":12464:12482 */\n add\n /* \"#utility.yul\":12456:12462 */\n dup5\n /* \"#utility.yul\":12439:12483 */\n tag_405\n jump\t// in\n /* \"#utility.yul\":13090:13477 */\n tag_164:\n /* \"#utility.yul\":13187:13191 */\n 0x00\n /* \"#utility.yul\":13245:13256 */\n dup3\n /* \"#utility.yul\":13232:13257 */\n calldataload\n /* \"#utility.yul\":13335:13401 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41\n /* \"#utility.yul\":13324:13332 */\n dup4\n /* \"#utility.yul\":13308:13322 */\n calldatasize\n /* \"#utility.yul\":13304:13333 */\n sub\n /* \"#utility.yul\":13300:13402 */\n add\n /* \"#utility.yul\":13280:13298 */\n dup2\n /* \"#utility.yul\":13276:13403 */\n slt\n /* \"#utility.yul\":13266:13421 */\n tag_494\n jumpi\n /* \"#utility.yul\":13417:13418 */\n 0x00\n /* \"#utility.yul\":13414:13415 */\n dup1\n /* \"#utility.yul\":13407:13419 */\n revert\n /* \"#utility.yul\":13266:13421 */\n tag_494:\n /* \"#utility.yul\":13438:13471 */\n swap2\n swap1\n swap2\n add\n swap3\n /* \"#utility.yul\":13090:13477 */\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":13482:13662 */\n tag_166:\n /* \"#utility.yul\":13538:13544 */\n 0x00\n /* \"#utility.yul\":13591:13593 */\n 0x20\n /* \"#utility.yul\":13579:13588 */\n dup3\n /* \"#utility.yul\":13570:13577 */\n dup5\n /* \"#utility.yul\":13566:13589 */\n sub\n /* \"#utility.yul\":13562:13594 */\n slt\n /* \"#utility.yul\":13559:13611 */\n iszero\n tag_496\n jumpi\n /* \"#utility.yul\":13607:13608 */\n 0x00\n /* \"#utility.yul\":13604:13605 */\n dup1\n /* \"#utility.yul\":13597:13609 */\n revert\n /* \"#utility.yul\":13559:13611 */\n tag_496:\n /* \"#utility.yul\":13630:13656 */\n tag_82\n /* \"#utility.yul\":13646:13655 */\n dup3\n /* \"#utility.yul\":13630:13656 */\n tag_401\n jump\t// in\n /* \"#utility.yul\":13991:14177 */\n tag_174:\n /* \"#utility.yul\":14050:14056 */\n 0x00\n /* \"#utility.yul\":14103:14105 */\n 0x20\n /* \"#utility.yul\":14091:14100 */\n dup3\n /* \"#utility.yul\":14082:14089 */\n dup5\n /* \"#utility.yul\":14078:14101 */\n sub\n /* \"#utility.yul\":14074:14106 */\n slt\n /* \"#utility.yul\":14071:14123 */\n iszero\n tag_500\n jumpi\n /* \"#utility.yul\":14119:14120 */\n 0x00\n /* \"#utility.yul\":14116:14117 */\n dup1\n /* \"#utility.yul\":14109:14121 */\n revert\n /* \"#utility.yul\":14071:14123 */\n tag_500:\n /* \"#utility.yul\":14142:14171 */\n tag_82\n /* \"#utility.yul\":14161:14170 */\n dup3\n /* \"#utility.yul\":14142:14171 */\n tag_402\n jump\t// in\n /* \"#utility.yul\":14182:14762 */\n tag_178:\n /* \"#utility.yul\":14259:14263 */\n 0x00\n /* \"#utility.yul\":14265:14271 */\n dup1\n /* \"#utility.yul\":14325:14336 */\n dup4\n /* \"#utility.yul\":14312:14337 */\n calldataload\n /* \"#utility.yul\":14415:14481 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1\n /* \"#utility.yul\":14404:14412 */\n dup5\n /* \"#utility.yul\":14388:14402 */\n calldatasize\n /* \"#utility.yul\":14384:14413 */\n sub\n /* \"#utility.yul\":14380:14482 */\n add\n /* \"#utility.yul\":14360:14378 */\n dup2\n /* \"#utility.yul\":14356:14483 */\n slt\n /* \"#utility.yul\":14346:14501 */\n tag_503\n jumpi\n /* \"#utility.yul\":14497:14498 */\n 0x00\n /* \"#utility.yul\":14494:14495 */\n dup1\n /* \"#utility.yul\":14487:14499 */\n revert\n /* \"#utility.yul\":14346:14501 */\n tag_503:\n /* \"#utility.yul\":14524:14557 */\n dup4\n add\n /* \"#utility.yul\":14576:14596 */\n dup1\n calldataload\n swap2\n pop\n /* \"#utility.yul\":14619:14637 */\n 0xffffffffffffffff\n /* \"#utility.yul\":14608:14638 */\n dup3\n gt\n /* \"#utility.yul\":14605:14655 */\n iszero\n tag_504\n jumpi\n /* \"#utility.yul\":14651:14652 */\n 0x00\n /* \"#utility.yul\":14648:14649 */\n dup1\n /* \"#utility.yul\":14641:14653 */\n revert\n /* \"#utility.yul\":14605:14655 */\n tag_504:\n /* \"#utility.yul\":14684:14688 */\n 0x20\n /* \"#utility.yul\":14672:14689 */\n add\n swap2\n pop\n /* \"#utility.yul\":14715:14729 */\n calldatasize\n /* \"#utility.yul\":14711:14738 */\n dup2\n swap1\n sub\n /* \"#utility.yul\":14701:14739 */\n dup3\n sgt\n /* \"#utility.yul\":14698:14756 */\n iszero\n tag_417\n jumpi\n /* \"#utility.yul\":14752:14753 */\n 0x00\n /* \"#utility.yul\":14749:14750 */\n dup1\n /* \"#utility.yul\":14742:14754 */\n revert\n /* \"#utility.yul\":14767:14951 */\n tag_406:\n /* \"#utility.yul\":14819:14896 */\n 0x4e487b7100000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":14816:14817 */\n 0x00\n /* \"#utility.yul\":14809:14897 */\n mstore\n /* \"#utility.yul\":14916:14920 */\n 0x11\n /* \"#utility.yul\":14913:14914 */\n 0x04\n /* \"#utility.yul\":14906:14921 */\n mstore\n /* \"#utility.yul\":14940:14944 */\n 0x24\n /* \"#utility.yul\":14937:14938 */\n 0x00\n /* \"#utility.yul\":14930:14945 */\n revert\n /* \"#utility.yul\":14956:15151 */\n tag_189:\n /* \"#utility.yul\":14995:14998 */\n 0x00\n /* \"#utility.yul\":15026:15092 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":15019:15024 */\n dup3\n /* \"#utility.yul\":15016:15093 */\n sub\n /* \"#utility.yul\":15013:15116 */\n tag_509\n jumpi\n /* \"#utility.yul\":15096:15114 */\n tag_509\n tag_406\n jump\t// in\n tag_509:\n pop\n /* \"#utility.yul\":15143:15144 */\n 0x01\n /* \"#utility.yul\":15132:15145 */\n add\n swap1\n /* \"#utility.yul\":14956:15151 */\n jump\t// out\n /* \"#utility.yul\":15156:15487 */\n tag_193:\n /* \"#utility.yul\":15261:15270 */\n 0x00\n /* \"#utility.yul\":15272:15281 */\n dup1\n /* \"#utility.yul\":15314:15322 */\n dup6\n /* \"#utility.yul\":15302:15312 */\n dup6\n /* \"#utility.yul\":15299:15323 */\n gt\n /* \"#utility.yul\":15296:15340 */\n iszero\n tag_511\n jumpi\n /* \"#utility.yul\":15336:15337 */\n 0x00\n /* \"#utility.yul\":15333:15334 */\n dup1\n /* \"#utility.yul\":15326:15338 */\n revert\n /* \"#utility.yul\":15296:15340 */\n tag_511:\n /* \"#utility.yul\":15365:15371 */\n dup4\n /* \"#utility.yul\":15355:15363 */\n dup7\n /* \"#utility.yul\":15352:15372 */\n gt\n /* \"#utility.yul\":15349:15389 */\n iszero\n tag_512\n jumpi\n /* \"#utility.yul\":15385:15386 */\n 0x00\n /* \"#utility.yul\":15382:15383 */\n dup1\n /* \"#utility.yul\":15375:15387 */\n revert\n /* \"#utility.yul\":15349:15389 */\n tag_512:\n pop\n pop\n /* \"#utility.yul\":15411:15434 */\n dup3\n add\n swap4\n /* \"#utility.yul\":15456:15481 */\n swap2\n swap1\n swap3\n sub\n swap2\n pop\n /* \"#utility.yul\":15156:15487 */\n jump\t// out\n /* \"#utility.yul\":15492:15617 */\n tag_211:\n /* \"#utility.yul\":15557:15566 */\n dup1\n dup3\n add\n /* \"#utility.yul\":15578:15588 */\n dup1\n dup3\n gt\n /* \"#utility.yul\":15575:15611 */\n iszero\n tag_80\n jumpi\n /* \"#utility.yul\":15591:15609 */\n tag_80\n tag_406\n jump\t// in\n /* \"#utility.yul\":15622:16014 */\n tag_217:\n /* \"#utility.yul\":15841:15843 */\n 0x60\n /* \"#utility.yul\":15830:15839 */\n dup2\n /* \"#utility.yul\":15823:15844 */\n mstore\n /* \"#utility.yul\":15804:15808 */\n 0x00\n /* \"#utility.yul\":15861:15922 */\n tag_517\n /* \"#utility.yul\":15918:15920 */\n 0x60\n /* \"#utility.yul\":15907:15916 */\n dup4\n /* \"#utility.yul\":15903:15921 */\n add\n /* \"#utility.yul\":15895:15901 */\n dup7\n /* \"#utility.yul\":15887:15893 */\n dup9\n /* \"#utility.yul\":15861:15922 */\n tag_403\n jump\t// in\n tag_517:\n /* \"#utility.yul\":15953:15955 */\n 0x20\n /* \"#utility.yul\":15938:15956 */\n dup4\n add\n /* \"#utility.yul\":15931:15965 */\n swap5\n swap1\n swap5\n mstore\n pop\n /* \"#utility.yul\":15996:15998 */\n 0x40\n /* \"#utility.yul\":15981:15999 */\n add\n /* \"#utility.yul\":15974:16008 */\n mstore\n /* \"#utility.yul\":15853:15922 */\n swap3\n /* \"#utility.yul\":15622:16014 */\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":16525:16813 */\n tag_246:\n /* \"#utility.yul\":16700:16706 */\n dup3\n /* \"#utility.yul\":16689:16698 */\n dup2\n /* \"#utility.yul\":16682:16707 */\n mstore\n /* \"#utility.yul\":16743:16745 */\n 0x40\n /* \"#utility.yul\":16738:16740 */\n 0x20\n /* \"#utility.yul\":16727:16736 */\n dup3\n /* \"#utility.yul\":16723:16741 */\n add\n /* \"#utility.yul\":16716:16746 */\n mstore\n /* \"#utility.yul\":16663:16667 */\n 0x00\n /* \"#utility.yul\":16763:16807 */\n tag_86\n /* \"#utility.yul\":16803:16805 */\n 0x40\n /* \"#utility.yul\":16792:16801 */\n dup4\n /* \"#utility.yul\":16788:16806 */\n add\n /* \"#utility.yul\":16780:16786 */\n dup5\n /* \"#utility.yul\":16763:16807 */\n tag_405\n jump\t// in\n /* \"#utility.yul\":16818:17259 */\n tag_278:\n /* \"#utility.yul\":17037:17043 */\n dup5\n /* \"#utility.yul\":17026:17035 */\n dup2\n /* \"#utility.yul\":17019:17044 */\n mstore\n /* \"#utility.yul\":17092:17134 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":17084:17090 */\n dup5\n /* \"#utility.yul\":17080:17135 */\n and\n /* \"#utility.yul\":17075:17077 */\n 0x20\n /* \"#utility.yul\":17064:17073 */\n dup3\n /* \"#utility.yul\":17060:17078 */\n add\n /* \"#utility.yul\":17053:17136 */\n mstore\n /* \"#utility.yul\":17172:17174 */\n 0x60\n /* \"#utility.yul\":17167:17169 */\n 0x40\n /* \"#utility.yul\":17156:17165 */\n dup3\n /* \"#utility.yul\":17152:17170 */\n add\n /* \"#utility.yul\":17145:17175 */\n mstore\n /* \"#utility.yul\":17000:17004 */\n 0x00\n /* \"#utility.yul\":17192:17253 */\n tag_523\n /* \"#utility.yul\":17249:17251 */\n 0x60\n /* \"#utility.yul\":17238:17247 */\n dup4\n /* \"#utility.yul\":17234:17252 */\n add\n /* \"#utility.yul\":17226:17232 */\n dup5\n /* \"#utility.yul\":17218:17224 */\n dup7\n /* \"#utility.yul\":17192:17253 */\n tag_403\n jump\t// in\n tag_523:\n /* \"#utility.yul\":17184:17253 */\n swap7\n /* \"#utility.yul\":16818:17259 */\n swap6\n pop\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":17264:17508 */\n tag_333:\n /* \"#utility.yul\":17421:17423 */\n 0x20\n /* \"#utility.yul\":17410:17419 */\n dup2\n /* \"#utility.yul\":17403:17424 */\n mstore\n /* \"#utility.yul\":17384:17388 */\n 0x00\n /* \"#utility.yul\":17441:17502 */\n tag_86\n /* \"#utility.yul\":17498:17500 */\n 0x20\n /* \"#utility.yul\":17487:17496 */\n dup4\n /* \"#utility.yul\":17483:17501 */\n add\n /* \"#utility.yul\":17475:17481 */\n dup5\n /* \"#utility.yul\":17467:17473 */\n dup7\n /* \"#utility.yul\":17441:17502 */\n tag_403\n jump\t// in\n /* \"#utility.yul\":17513:17641 */\n tag_336:\n /* \"#utility.yul\":17580:17589 */\n dup2\n dup2\n sub\n /* \"#utility.yul\":17601:17612 */\n dup2\n dup2\n gt\n /* \"#utility.yul\":17598:17635 */\n iszero\n tag_80\n jumpi\n /* \"#utility.yul\":17615:17633 */\n tag_80\n tag_406\n jump\t// in\n /* \"#utility.yul\":17646:17961 */\n tag_344:\n /* \"#utility.yul\":17831:17833 */\n 0x40\n /* \"#utility.yul\":17820:17829 */\n dup2\n /* \"#utility.yul\":17813:17834 */\n mstore\n /* \"#utility.yul\":17794:17798 */\n 0x00\n /* \"#utility.yul\":17851:17912 */\n tag_530\n /* \"#utility.yul\":17908:17910 */\n 0x40\n /* \"#utility.yul\":17897:17906 */\n dup4\n /* \"#utility.yul\":17893:17911 */\n add\n /* \"#utility.yul\":17885:17891 */\n dup6\n /* \"#utility.yul\":17877:17883 */\n dup8\n /* \"#utility.yul\":17851:17912 */\n tag_403\n jump\t// in\n tag_530:\n /* \"#utility.yul\":17843:17912 */\n swap1\n pop\n /* \"#utility.yul\":17948:17954 */\n dup3\n /* \"#utility.yul\":17943:17945 */\n 0x20\n /* \"#utility.yul\":17932:17941 */\n dup4\n /* \"#utility.yul\":17928:17946 */\n add\n /* \"#utility.yul\":17921:17955 */\n mstore\n /* \"#utility.yul\":17646:17961 */\n swap5\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":17966:18290 */\n tag_348:\n /* \"#utility.yul\":18149:18151 */\n 0x40\n /* \"#utility.yul\":18138:18147 */\n dup2\n /* \"#utility.yul\":18131:18152 */\n mstore\n /* \"#utility.yul\":18112:18116 */\n 0x00\n /* \"#utility.yul\":18169:18230 */\n tag_532\n /* \"#utility.yul\":18226:18228 */\n 0x40\n /* \"#utility.yul\":18215:18224 */\n dup4\n /* \"#utility.yul\":18211:18229 */\n add\n /* \"#utility.yul\":18203:18209 */\n dup6\n /* \"#utility.yul\":18195:18201 */\n dup8\n /* \"#utility.yul\":18169:18230 */\n tag_403\n jump\t// in\n tag_532:\n /* \"#utility.yul\":18161:18230 */\n swap1\n pop\n /* \"#utility.yul\":18278:18282 */\n 0xff\n /* \"#utility.yul\":18270:18276 */\n dup4\n /* \"#utility.yul\":18266:18283 */\n and\n /* \"#utility.yul\":18261:18263 */\n 0x20\n /* \"#utility.yul\":18250:18259 */\n dup4\n /* \"#utility.yul\":18246:18264 */\n add\n /* \"#utility.yul\":18239:18284 */\n mstore\n /* \"#utility.yul\":17966:18290 */\n swap5\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19083:19479 */\n tag_363:\n /* \"#utility.yul\":19290:19292 */\n 0x60\n /* \"#utility.yul\":19279:19288 */\n dup2\n /* \"#utility.yul\":19272:19293 */\n mstore\n /* \"#utility.yul\":19253:19257 */\n 0x00\n /* \"#utility.yul\":19310:19371 */\n tag_536\n /* \"#utility.yul\":19367:19369 */\n 0x60\n /* \"#utility.yul\":19356:19365 */\n dup4\n /* \"#utility.yul\":19352:19370 */\n add\n /* \"#utility.yul\":19344:19350 */\n dup7\n /* \"#utility.yul\":19336:19342 */\n dup9\n /* \"#utility.yul\":19310:19371 */\n tag_403\n jump\t// in\n tag_536:\n /* \"#utility.yul\":19402:19404 */\n 0x20\n /* \"#utility.yul\":19387:19405 */\n dup4\n add\n /* \"#utility.yul\":19380:19414 */\n swap5\n swap1\n swap5\n mstore\n pop\n /* \"#utility.yul\":19457:19471 */\n swap1\n iszero\n /* \"#utility.yul\":19450:19472 */\n iszero\n /* \"#utility.yul\":19445:19447 */\n 0x40\n /* \"#utility.yul\":19430:19448 */\n swap1\n swap2\n add\n /* \"#utility.yul\":19423:19473 */\n mstore\n /* \"#utility.yul\":19302:19371 */\n swap3\n /* \"#utility.yul\":19083:19479 */\n swap2\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19484:19805 */\n tag_379:\n /* \"#utility.yul\":19675:19681 */\n dup4\n /* \"#utility.yul\":19664:19673 */\n dup2\n /* \"#utility.yul\":19657:19682 */\n mstore\n /* \"#utility.yul\":19718:19720 */\n 0x40\n /* \"#utility.yul\":19713:19715 */\n 0x20\n /* \"#utility.yul\":19702:19711 */\n dup3\n /* \"#utility.yul\":19698:19716 */\n add\n /* \"#utility.yul\":19691:19721 */\n mstore\n /* \"#utility.yul\":19638:19642 */\n 0x00\n /* \"#utility.yul\":19738:19799 */\n tag_538\n /* \"#utility.yul\":19795:19797 */\n 0x40\n /* \"#utility.yul\":19784:19793 */\n dup4\n /* \"#utility.yul\":19780:19798 */\n add\n /* \"#utility.yul\":19772:19778 */\n dup5\n /* \"#utility.yul\":19764:19770 */\n dup7\n /* \"#utility.yul\":19738:19799 */\n tag_403\n jump\t// in\n tag_538:\n /* \"#utility.yul\":19730:19799 */\n swap6\n /* \"#utility.yul\":19484:19805 */\n swap5\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":19810:20059 */\n tag_383:\n /* \"#utility.yul\":19879:19885 */\n 0x00\n /* \"#utility.yul\":19932:19934 */\n 0x20\n /* \"#utility.yul\":19920:19929 */\n dup3\n /* \"#utility.yul\":19911:19918 */\n dup5\n /* \"#utility.yul\":19907:19930 */\n sub\n /* \"#utility.yul\":19903:19935 */\n slt\n /* \"#utility.yul\":19900:19952 */\n iszero\n tag_540\n jumpi\n /* \"#utility.yul\":19948:19949 */\n 0x00\n /* \"#utility.yul\":19945:19946 */\n dup1\n /* \"#utility.yul\":19938:19950 */\n revert\n /* \"#utility.yul\":19900:19952 */\n tag_540:\n /* \"#utility.yul\":19980:19989 */\n dup2\n /* \"#utility.yul\":19974:19990 */\n mload\n /* \"#utility.yul\":19999:20029 */\n tag_82\n /* \"#utility.yul\":20023:20028 */\n dup2\n /* \"#utility.yul\":19999:20029 */\n tag_397\n jump\t// in\n\n auxdata: 0xa26469706673582212209bb95d18e97f278aa47e0c04c20d5a6af9bdb6d473c6d4051192cd96fc17866864736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": { + "@_1068": { + "entryPoint": null, + "id": 1068, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "60a060405234801561001057600080fd5b50306080526080516121de61002d600039600050506121de6000f3fe6080604052600436106100bc5760003560e01c806361c2926c116100745780638c3f55631161004e5780638c3f55631461025357806390042baf14610273578063affed0e0146102ab57600080fd5b806361c2926c146101cb5780637a9a1628146101eb578063853c50681461020b57600080fd5b806320c13b0b116100a557806320c13b0b14610147578063295614261461016757806357c56d6b1461018957600080fd5b806301ffc9a7146100c15780631626ba7e146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc366004611880565b6102c0565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b506101166101113660046118e6565b6102d1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ed565b34801561015357600080fd5b50610116610162366004611932565b61031e565b34801561017357600080fd5b5061018761018236600461199e565b610383565b005b34801561019557600080fd5b506101bd7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b6040519081526020016100ed565b3480156101d757600080fd5b506101876101e63660046119fc565b6103d5565b3480156101f757600080fd5b50610187610206366004611a3e565b61041a565b34801561021757600080fd5b5061022b6102263660046118e6565b610447565b604080519586526020860194909452928401919091526060830152608082015260a0016100ed565b34801561025f57600080fd5b506101bd61026e36600461199e565b61060f565b610286610281366004611ae7565b61063b565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b3480156102b757600080fd5b506101bd610725565b60006102cb82610736565b92915050565b6000806102df858585610792565b509050801561031157507f1626ba7e000000000000000000000000000000000000000000000000000000009050610317565b50600090505b9392505050565b6000806103438686604051610334929190611bb6565b60405180910390208585610792565b509050801561037557507f20c13b0b00000000000000000000000000000000000000000000000000000000905061037b565b50600090505b949350505050565b3330146103c9576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b6103d2816107ca565b50565b600061040883836040516020016103ed929190611d97565b604051602081830303815290604052805190602001206107fc565b9050610415818484610881565b505050565b600061043286866040516020016103ed929190611ddf565b905061043f818787610881565b505050505050565b6000806000806000808787600081811061046357610463611e27565b909101357fff000000000000000000000000000000000000000000000000000000000000001691508190506104b95761049b896107fc565b92506104a8838989610a0e565b929850909650945091506106049050565b7fff00000000000000000000000000000000000000000000000000000000000000818116016104f8576104eb896107fc565b92506104a8838989610a5f565b7ffe000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082160161054a576104eb89610a8b565b7ffd000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216016105ae5761059e898989610af8565b9550955095509550955050610604565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff00000000000000000000000000000000000000000000000000000000000000821660048201526024016103c0565b939792965093509350565b60006102cb7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610c75565b600033301461067e576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016103c0565b81516020830134f0905073ffffffffffffffffffffffffffffffffffffffff81166106d757816040517f0d2571910000000000000000000000000000000000000000000000000000000081526004016103c09190611eba565b60405173ffffffffffffffffffffffffffffffffffffffff821681527fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b6000610731600061060f565b905090565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161078957506001919050565b6102cb82610cd3565b60008060008060006107a5888888610447565b509650919450925090508282108015906107bd575060015b9450505050935093915050565b6040517fa038794000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b81811015610a0757368484838181106108a0576108a0611e27565b90506020028101906108b29190611ecd565b90506108c16020820182611f0b565b156108fb576040517f230d1ccc000000000000000000000000000000000000000000000000000000008152600481018390526024016103c0565b6040810135805a101561094e5782815a6040517f2bb3e3ba0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016103c0565b60006109886109636080850160608601611f26565b608085013584156109745784610976565b5a5b61098360a0880188611f41565b610d2f565b905080156109cf57877f5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7856040516109c291815260200190565b60405180910390a26109f1565b6109f16109e26040850160208601611f0b565b89866109ec610d4c565b610d6b565b50505080806109ff90611fd5565b915050610885565b5050505050565b6000808080610a2987610a24876006818b61200d565b610db9565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080610a7a87610a75876001818b61200d565b610a0e565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601610864565b6000808080806004600188013560e81c82610b138383612037565b9050610b258b61022683868d8f61200d565b939b5091995097509550935087871015610b7d57610b4581848b8d61200d565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c0949392919061204a565b8092505b88831015610c675760038301928a013560e81c9150610ba08383612037565b90506000610bc2610bb08861124f565b8c8c879086926102269392919061200d565b939c50919a5098509091505088881015610c1a57610be282858c8e61200d565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c0949392919061204a565b848110610c5d576040517f37daf62b00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016103c0565b9350915081610b81565b505050939792965093509350565b6000808383604051602001610c94929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610d2657506001919050565b6102cb82611283565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b8315610d7957805160208201fd5b827fab46c69f7f32e1bf09b0725853da82a211e5402a0600296ab499a2fb5ea3b4198383604051610dab929190612071565b60405180910390a250505050565b60008060005b8381101561124657600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101610e6057601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff000000000000000000000000000000000000000016811785610e465780610e55565b60008681526020829052604090205b955050505050610dbf565b80610ef65760018201918681013560f81c906043016000610e8c8a610e8784888c8e61200d565b61136d565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161786610edb5780610eea565b60008781526020829052604090205b96505050505050610dbf565b6002810361101e576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff169150809650819250505060008186019050610f6f8b848c8c8a908692610f6a9392919061200d565b611630565b610fb7578a83610f8183898d8f61200d565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016103c0949392919061208a565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617876110025780611011565b60008881526020829052604090205b9750505050505050610dbf565b60038103611051576020820191860135836110395780611048565b60008481526020829052604090205b93505050610dbf565b6004810361109d576003808301928781013560e81c919082010160008061107e8b610a2485898d8f61200d565b60009889526020526040909720969097019650909350610dbf92505050565b600681036111a55760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff16915080965081925050506000818601905060008061110b8d8d8d8b908792610a249392919061200d565b9398508893909250905084821061112157988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a90528351808403909101815260989092019092528051910120896111875780611196565b60008a81526020829052604090205b99505050505050505050610dbf565b600581036112115760208201918601358781036111e0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b60006111eb82611817565b9050846111f85780611207565b60008581526020829052604090205b9450505050610dbf565b6040517fb2505f7c000000000000000000000000000000000000000000000000000000008152600481018290526024016103c0565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d160009081526020829052604081206102cb565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e00000000000000000000000000000000000000000000000000000000148061131657507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b1561132357506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102cb565b6000604282146113ad5782826040517f2ee17a3d0000000000000000000000000000000000000000000000000000000081526004016103c09291906120ca565b60006113c66113bd6001856120de565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561143a578686826040517fad4aac760000000000000000000000000000000000000000000000000000000081526004016103c0939291906120f1565b8260ff16601b1415801561145257508260ff16601c14155b1561148f578686846040517fe578897e0000000000000000000000000000000000000000000000000000000081526004016103c093929190612115565b600184036114fc576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa1580156114eb573d6000803e3d6000fd5b5050506020604051035194506115d4565b60028403611599576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a0016114c9565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c0949392919061213c565b73ffffffffffffffffffffffffffffffffffffffff85166116255786866040517f6c1719d20000000000000000000000000000000000000000000000000000000081526004016103c09291906120ca565b505050509392505050565b600081810361166b576040517fac241e1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838361167a6001826120de565b81811061168957611689611e27565b919091013560f81c91505060018114806116a35750600281145b156116e8578473ffffffffffffffffffffffffffffffffffffffff166116ca87868661136d565b73ffffffffffffffffffffffffffffffffffffffff1614915061180e565b600381036117d35773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e878660008761171c6001826120de565b926117299392919061200d565b6040518463ffffffff1660e01b815260040161174793929190612168565b602060405180830381865afa158015611764573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611788919061218b565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014915061180e565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c0949392919061213c565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801610864565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146103d257600080fd5b60006020828403121561189257600080fd5b813561031781611852565b60008083601f8401126118af57600080fd5b50813567ffffffffffffffff8111156118c757600080fd5b6020830191508360208285010111156118df57600080fd5b9250929050565b6000806000604084860312156118fb57600080fd5b83359250602084013567ffffffffffffffff81111561191957600080fd5b6119258682870161189d565b9497909650939450505050565b6000806000806040858703121561194857600080fd5b843567ffffffffffffffff8082111561196057600080fd5b61196c8883890161189d565b9096509450602087013591508082111561198557600080fd5b506119928782880161189d565b95989497509550505050565b6000602082840312156119b057600080fd5b5035919050565b60008083601f8401126119c957600080fd5b50813567ffffffffffffffff8111156119e157600080fd5b6020830191508360208260051b85010111156118df57600080fd5b60008060208385031215611a0f57600080fd5b823567ffffffffffffffff811115611a2657600080fd5b611a32858286016119b7565b90969095509350505050565b600080600080600060608688031215611a5657600080fd5b853567ffffffffffffffff80821115611a6e57600080fd5b611a7a89838a016119b7565b9097509550602088013594506040880135915080821115611a9a57600080fd5b50611aa78882890161189d565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611af957600080fd5b813567ffffffffffffffff80821115611b1157600080fd5b818401915084601f830112611b2557600080fd5b813581811115611b3757611b37611ab8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b7d57611b7d611ab8565b81604052828152876020848701011115611b9657600080fd5b826020860160208301376000928101602001929092525095945050505050565b8183823760009101908152919050565b80358015158114611bd657600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bd657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b87811015611d8a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41883603018112611ca157600080fd5b870160c0611cae82611bc6565b15158652611cbd878301611bc6565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff611cef828501611bdb565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611d3557600080fd5b90920187810192903567ffffffffffffffff811115611d5357600080fd5b803603841315611d6257600080fd5b8282890152611d748389018286611bff565b9c89019c97505050928601925050600101611c62565b5091979650505050505050565b60408152600560408201527f73656c663a000000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611c48565b60408152600660408201527f67756573743a0000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611c48565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b81811015611e7c57602081850181015186830182015201611e60565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006103176020830184611e56565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112611f0157600080fd5b9190910192915050565b600060208284031215611f1d57600080fd5b61031782611bc6565b600060208284031215611f3857600080fd5b61031782611bdb565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f7657600080fd5b83018035915067ffffffffffffffff821115611f9157600080fd5b6020019150368190038213156118df57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361200657612006611fa6565b5060010190565b6000808585111561201d57600080fd5b8386111561202a57600080fd5b5050820193919092039150565b808201808211156102cb576102cb611fa6565b60608152600061205e606083018688611bff565b6020830194909452506040015292915050565b82815260406020820152600061037b6040830184611e56565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006120c0606083018486611bff565b9695505050505050565b60208152600061037b602083018486611bff565b818103818111156102cb576102cb611fa6565b604081526000612105604083018587611bff565b9050826020830152949350505050565b604081526000612129604083018587611bff565b905060ff83166020830152949350505050565b606081526000612150606083018688611bff565b60208301949094525090151560409091015292915050565b838152604060208201526000612182604083018486611bff565b95945050505050565b60006020828403121561219d57600080fd5b81516103178161185256fea26469706673582212209bb95d18e97f278aa47e0c04c20d5a6af9bdb6d473c6d4051192cd96fc17866864736f6c63430008120033", + "opcodes": "PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP ADDRESS PUSH1 0x80 MSTORE PUSH1 0x80 MLOAD PUSH2 0x21DE PUSH2 0x2D PUSH1 0x0 CODECOPY PUSH1 0x0 POP POP PUSH2 0x21DE PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xBC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x61C2926C GT PUSH2 0x74 JUMPI DUP1 PUSH4 0x8C3F5563 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x8C3F5563 EQ PUSH2 0x253 JUMPI DUP1 PUSH4 0x90042BAF EQ PUSH2 0x273 JUMPI DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x61C2926C EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x7A9A1628 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0x853C5068 EQ PUSH2 0x20B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x20C13B0B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x20C13B0B EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0x29561426 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x57C56D6B EQ PUSH2 0x189 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xC1 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0xF6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE1 PUSH2 0xDC CALLDATASIZE PUSH1 0x4 PUSH2 0x1880 JUMP JUMPDEST PUSH2 0x2C0 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x116 PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x18E6 JUMP JUMPDEST PUSH2 0x2D1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x116 PUSH2 0x162 CALLDATASIZE PUSH1 0x4 PUSH2 0x1932 JUMP JUMPDEST PUSH2 0x31E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x182 CALLDATASIZE PUSH1 0x4 PUSH2 0x199E JUMP JUMPDEST PUSH2 0x383 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH32 0x8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x19FC JUMP JUMPDEST PUSH2 0x3D5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x206 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A3E JUMP JUMPDEST PUSH2 0x41A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH2 0x226 CALLDATASIZE PUSH1 0x4 PUSH2 0x18E6 JUMP JUMPDEST PUSH2 0x447 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH2 0x26E CALLDATASIZE PUSH1 0x4 PUSH2 0x199E JUMP JUMPDEST PUSH2 0x60F JUMP JUMPDEST PUSH2 0x286 PUSH2 0x281 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AE7 JUMP JUMPDEST PUSH2 0x63B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH2 0x725 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB DUP3 PUSH2 0x736 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2DF DUP6 DUP6 DUP6 PUSH2 0x792 JUMP JUMPDEST POP SWAP1 POP DUP1 ISZERO PUSH2 0x311 JUMPI POP PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0x317 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x343 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH2 0x334 SWAP3 SWAP2 SWAP1 PUSH2 0x1BB6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP6 DUP6 PUSH2 0x792 JUMP JUMPDEST POP SWAP1 POP DUP1 ISZERO PUSH2 0x375 JUMPI POP PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0x37B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x3C9 JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3D2 DUP2 PUSH2 0x7CA JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x408 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3ED SWAP3 SWAP2 SWAP1 PUSH2 0x1D97 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x7FC JUMP JUMPDEST SWAP1 POP PUSH2 0x415 DUP2 DUP5 DUP5 PUSH2 0x881 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x432 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3ED SWAP3 SWAP2 SWAP1 PUSH2 0x1DDF JUMP JUMPDEST SWAP1 POP PUSH2 0x43F DUP2 DUP8 DUP8 PUSH2 0x881 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP8 DUP8 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0x463 JUMPI PUSH2 0x463 PUSH2 0x1E27 JUMP JUMPDEST SWAP1 SWAP2 ADD CALLDATALOAD PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 AND SWAP2 POP DUP2 SWAP1 POP PUSH2 0x4B9 JUMPI PUSH2 0x49B DUP10 PUSH2 0x7FC JUMP JUMPDEST SWAP3 POP PUSH2 0x4A8 DUP4 DUP10 DUP10 PUSH2 0xA0E JUMP JUMPDEST SWAP3 SWAP9 POP SWAP1 SWAP7 POP SWAP5 POP SWAP2 POP PUSH2 0x604 SWAP1 POP JUMP JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP2 DUP2 AND ADD PUSH2 0x4F8 JUMPI PUSH2 0x4EB DUP10 PUSH2 0x7FC JUMP JUMPDEST SWAP3 POP PUSH2 0x4A8 DUP4 DUP10 DUP10 PUSH2 0xA5F JUMP JUMPDEST PUSH32 0xFE00000000000000000000000000000000000000000000000000000000000000 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x54A JUMPI PUSH2 0x4EB DUP10 PUSH2 0xA8B JUMP JUMPDEST PUSH32 0xFD00000000000000000000000000000000000000000000000000000000000000 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x5AE JUMPI PUSH2 0x59E DUP10 DUP10 DUP10 PUSH2 0xAF8 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP POP PUSH2 0x604 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6085CD8200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST SWAP4 SWAP8 SWAP3 SWAP7 POP SWAP4 POP SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB PUSH32 0x8D0BF1FD623D628C741362C1289948E57B3E2905218C676D3E69ABEE36D6AE2E DUP4 PUSH2 0xC75 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x67E JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x3C0 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD CALLVALUE CREATE SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x6D7 JUMPI DUP2 PUSH1 0x40 MLOAD PUSH32 0xD25719100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP2 SWAP1 PUSH2 0x1EBA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0xA506AD4E7F05ECEBA62A023C3219E5BD98A615F4FA87E2AFB08A2DA5CF62BF0C SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x731 PUSH1 0x0 PUSH2 0x60F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x6FFBD45100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0x789 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CB DUP3 PUSH2 0xCD3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x7A5 DUP9 DUP9 DUP9 PUSH2 0x447 JUMP JUMPDEST POP SWAP7 POP SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP DUP3 DUP3 LT DUP1 ISZERO SWAP1 PUSH2 0x7BD JUMPI POP PUSH1 0x1 JUMPDEST SWAP5 POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA038794000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE CHAINID PUSH1 0x22 DUP3 ADD MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 ADDRESS PUSH1 0x60 SHL AND PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x56 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x76 ADD JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA07 JUMPI CALLDATASIZE DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x8A0 JUMPI PUSH2 0x8A0 PUSH2 0x1E27 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x8B2 SWAP2 SWAP1 PUSH2 0x1ECD JUMP JUMPDEST SWAP1 POP PUSH2 0x8C1 PUSH1 0x20 DUP3 ADD DUP3 PUSH2 0x1F0B JUMP JUMPDEST ISZERO PUSH2 0x8FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x230D1CCC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP1 GAS LT ISZERO PUSH2 0x94E JUMPI DUP3 DUP2 GAS PUSH1 0x40 MLOAD PUSH32 0x2BB3E3BA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x988 PUSH2 0x963 PUSH1 0x80 DUP6 ADD PUSH1 0x60 DUP7 ADD PUSH2 0x1F26 JUMP JUMPDEST PUSH1 0x80 DUP6 ADD CALLDATALOAD DUP5 ISZERO PUSH2 0x974 JUMPI DUP5 PUSH2 0x976 JUMP JUMPDEST GAS JUMPDEST PUSH2 0x983 PUSH1 0xA0 DUP9 ADD DUP9 PUSH2 0x1F41 JUMP JUMPDEST PUSH2 0xD2F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x9CF JUMPI DUP8 PUSH32 0x5C4EEB02DABF8976016AB414D617F9A162936DCACE3CDEF8C69EF6E262AD5AE7 DUP6 PUSH1 0x40 MLOAD PUSH2 0x9C2 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x9F1 JUMP JUMPDEST PUSH2 0x9F1 PUSH2 0x9E2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F0B JUMP JUMPDEST DUP10 DUP7 PUSH2 0x9EC PUSH2 0xD4C JUMP JUMPDEST PUSH2 0xD6B JUMP JUMPDEST POP POP POP DUP1 DUP1 PUSH2 0x9FF SWAP1 PUSH2 0x1FD5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x885 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xA29 DUP8 PUSH2 0xA24 DUP8 PUSH1 0x6 DUP2 DUP12 PUSH2 0x200D JUMP JUMPDEST PUSH2 0xDB9 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE DUP8 CALLDATALOAD PUSH1 0xF0 SHR PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP5 MSTORE PUSH1 0x2 SWAP1 SWAP11 ADD CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 SWAP1 MSTORE SWAP9 SWAP1 SWAP2 KECCAK256 SWAP1 SWAP10 SWAP2 SWAP9 POP SWAP7 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xA7A DUP8 PUSH2 0xA75 DUP8 PUSH1 0x1 DUP2 DUP12 PUSH2 0x200D JUMP JUMPDEST PUSH2 0xA0E JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x22 DUP3 ADD DUP2 SWAP1 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 ADDRESS PUSH1 0x60 SHL AND PUSH1 0x42 DUP4 ADD MSTORE PUSH1 0x56 DUP3 ADD DUP4 SWAP1 MSTORE SWAP1 PUSH1 0x76 ADD PUSH2 0x864 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH1 0x4 PUSH1 0x1 DUP9 ADD CALLDATALOAD PUSH1 0xE8 SHR DUP3 PUSH2 0xB13 DUP4 DUP4 PUSH2 0x2037 JUMP JUMPDEST SWAP1 POP PUSH2 0xB25 DUP12 PUSH2 0x226 DUP4 DUP7 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP12 POP SWAP2 SWAP10 POP SWAP8 POP SWAP6 POP SWAP4 POP DUP8 DUP8 LT ISZERO PUSH2 0xB7D JUMPI PUSH2 0xB45 DUP2 DUP5 DUP12 DUP14 PUSH2 0x200D JUMP JUMPDEST DUP10 DUP10 PUSH1 0x40 MLOAD PUSH32 0xB006ABA000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x204A JUMP JUMPDEST DUP1 SWAP3 POP JUMPDEST DUP9 DUP4 LT ISZERO PUSH2 0xC67 JUMPI PUSH1 0x3 DUP4 ADD SWAP3 DUP11 ADD CALLDATALOAD PUSH1 0xE8 SHR SWAP2 POP PUSH2 0xBA0 DUP4 DUP4 PUSH2 0x2037 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xBC2 PUSH2 0xBB0 DUP9 PUSH2 0x124F JUMP JUMPDEST DUP13 DUP13 DUP8 SWAP1 DUP7 SWAP3 PUSH2 0x226 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP1 SWAP2 POP POP DUP9 DUP9 LT ISZERO PUSH2 0xC1A JUMPI PUSH2 0xBE2 DUP3 DUP6 DUP13 DUP15 PUSH2 0x200D JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD PUSH32 0xB006ABA000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x204A JUMP JUMPDEST DUP5 DUP2 LT PUSH2 0xC5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x37DAF62B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x3C0 JUMP JUMPDEST SWAP4 POP SWAP2 POP DUP2 PUSH2 0xB81 JUMP JUMPDEST POP POP POP SWAP4 SWAP8 SWAP3 SWAP7 POP SWAP4 POP SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xC94 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xE4A77BBC00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0xD26 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CB DUP3 PUSH2 0x1283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP3 DUP5 DUP3 CALLDATACOPY PUSH1 0x0 DUP1 DUP5 DUP4 DUP10 DUP12 DUP11 CALL SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 RETURNDATASIZE PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x20 DUP3 ADD DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP4 MSTORE DUP2 PUSH1 0x0 DUP3 RETURNDATACOPY POP POP SWAP1 JUMP JUMPDEST DUP4 ISZERO PUSH2 0xD79 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP3 PUSH32 0xAB46C69F7F32E1BF09B0725853DA82A211E5402A0600296AB499A2FB5EA3B419 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0xDAB SWAP3 SWAP2 SWAP1 PUSH2 0x2071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1246 JUMPI PUSH1 0x1 DUP2 ADD SWAP1 DUP6 ADD CALLDATALOAD PUSH1 0xF8 SHR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD PUSH2 0xE60 JUMPI PUSH1 0x15 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD PUSH1 0xF8 DUP2 SWAP1 SHR SWAP1 PUSH1 0x58 SHR PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 PUSH21 0xFF0000000000000000000000000000000000000000 AND DUP2 OR DUP6 PUSH2 0xE46 JUMPI DUP1 PUSH2 0xE55 JUMP JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP6 POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST DUP1 PUSH2 0xEF6 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 DUP7 DUP2 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP1 PUSH1 0x43 ADD PUSH1 0x0 PUSH2 0xE8C DUP11 PUSH2 0xE87 DUP5 DUP9 DUP13 DUP15 PUSH2 0x200D JUMP JUMPDEST PUSH2 0x136D JUMP JUMPDEST PUSH1 0xFF DUP5 AND SWAP8 SWAP1 SWAP8 ADD SWAP7 SWAP2 SWAP5 POP DUP5 SWAP2 SWAP1 POP PUSH1 0xA0 DUP4 SWAP1 SHL PUSH21 0xFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND OR DUP7 PUSH2 0xEDB JUMPI DUP1 PUSH2 0xEEA JUMP JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP7 POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x2 DUP2 SUB PUSH2 0x101E JUMPI PUSH1 0x0 DUP1 DUP8 DUP5 ADD CALLDATALOAD PUSH1 0xF8 DUP2 SWAP1 SHR SWAP1 PUSH1 0x58 SHR PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x15 DUP7 ADD SWAP6 POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP9 DUP6 ADD CALLDATALOAD PUSH1 0xE8 SHR PUSH1 0x3 DUP7 ADD DUP2 PUSH3 0xFFFFFF AND SWAP2 POP DUP1 SWAP7 POP DUP2 SWAP3 POP POP POP PUSH1 0x0 DUP2 DUP7 ADD SWAP1 POP PUSH2 0xF6F DUP12 DUP5 DUP13 DUP13 DUP11 SWAP1 DUP7 SWAP3 PUSH2 0xF6A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST PUSH2 0x1630 JUMP JUMPDEST PUSH2 0xFB7 JUMPI DUP11 DUP4 PUSH2 0xF81 DUP4 DUP10 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9A94623200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x208A JUMP JUMPDEST PUSH1 0xFF DUP5 AND SWAP8 SWAP1 SWAP8 ADD SWAP7 SWAP5 POP DUP5 PUSH1 0xA0 DUP5 SWAP1 SHL PUSH21 0xFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND OR DUP8 PUSH2 0x1002 JUMPI DUP1 PUSH2 0x1011 JUMP JUMPDEST PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP8 POP POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x3 DUP2 SUB PUSH2 0x1051 JUMPI PUSH1 0x20 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD DUP4 PUSH2 0x1039 JUMPI DUP1 PUSH2 0x1048 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP4 POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x4 DUP2 SUB PUSH2 0x109D JUMPI PUSH1 0x3 DUP1 DUP4 ADD SWAP3 DUP8 DUP2 ADD CALLDATALOAD PUSH1 0xE8 SHR SWAP2 SWAP1 DUP3 ADD ADD PUSH1 0x0 DUP1 PUSH2 0x107E DUP12 PUSH2 0xA24 DUP6 DUP10 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x0 SWAP9 DUP10 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP8 KECCAK256 SWAP7 SWAP1 SWAP8 ADD SWAP7 POP SWAP1 SWAP4 POP PUSH2 0xDBF SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 DUP2 SUB PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP3 DUP8 ADD CALLDATALOAD PUSH1 0xF8 SHR PUSH1 0x1 DUP5 ADD SWAP4 POP PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP8 DUP5 ADD CALLDATALOAD PUSH1 0xF0 SHR PUSH1 0x2 DUP6 ADD SWAP5 POP PUSH2 0xFFFF AND SWAP1 POP PUSH1 0x0 DUP9 DUP6 ADD CALLDATALOAD PUSH1 0xE8 SHR PUSH1 0x3 DUP7 ADD DUP2 PUSH3 0xFFFFFF AND SWAP2 POP DUP1 SWAP7 POP DUP2 SWAP3 POP POP POP PUSH1 0x0 DUP2 DUP7 ADD SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x110B DUP14 DUP14 DUP14 DUP12 SWAP1 DUP8 SWAP3 PUSH2 0xA24 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP9 POP DUP9 SWAP4 SWAP1 SWAP3 POP SWAP1 POP DUP5 DUP3 LT PUSH2 0x1121 JUMPI SWAP9 DUP6 ADD SWAP9 JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x53657175656E6365206E657374656420636F6E6669673A0A0000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x38 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x58 DUP3 ADD DUP9 SWAP1 MSTORE PUSH1 0x78 DUP1 DUP4 ADD DUP11 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x98 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 DUP10 PUSH2 0x1187 JUMPI DUP1 PUSH2 0x1196 JUMP JUMPDEST PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP10 POP POP POP POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x5 DUP2 SUB PUSH2 0x1211 JUMPI PUSH1 0x20 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD DUP8 DUP2 SUB PUSH2 0x11E0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 POP JUMPDEST PUSH1 0x0 PUSH2 0x11EB DUP3 PUSH2 0x1817 JUMP JUMPDEST SWAP1 POP DUP5 PUSH2 0x11F8 JUMPI DUP1 PUSH2 0x1207 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP5 POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB2505F7C00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2CB JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0xAC6A444E00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x1316 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x36E7817500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x1323 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND EQ PUSH2 0x2CB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x42 DUP3 EQ PUSH2 0x13AD JUMPI DUP3 DUP3 PUSH1 0x40 MLOAD PUSH32 0x2EE17A3D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP3 SWAP2 SWAP1 PUSH2 0x20CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13C6 PUSH2 0x13BD PUSH1 0x1 DUP6 PUSH2 0x20DE JUMP JUMPDEST DUP6 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH1 0xF8 SHR DUP5 CALLDATALOAD PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP2 GT ISZERO PUSH2 0x143A JUMPI DUP7 DUP7 DUP3 PUSH1 0x40 MLOAD PUSH32 0xAD4AAC7600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x20F1 JUMP JUMPDEST DUP3 PUSH1 0xFF AND PUSH1 0x1B EQ ISZERO DUP1 ISZERO PUSH2 0x1452 JUMPI POP DUP3 PUSH1 0xFF AND PUSH1 0x1C EQ ISZERO JUMPDEST ISZERO PUSH2 0x148F JUMPI DUP7 DUP7 DUP5 PUSH1 0x40 MLOAD PUSH32 0xE578897E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2115 JUMP JUMPDEST PUSH1 0x1 DUP5 SUB PUSH2 0x14FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 DUP4 MSTORE DUP11 SWAP1 MSTORE PUSH1 0xFF DUP6 AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x14EB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP5 POP PUSH2 0x15D4 JUMP JUMPDEST PUSH1 0x2 DUP5 SUB PUSH2 0x1599 JUMPI PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP10 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x0 DUP5 MSTORE SWAP1 DUP4 ADD DUP1 DUP4 MSTORE MSTORE PUSH1 0xFF DUP7 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH2 0x14C9 JUMP JUMPDEST DUP7 DUP7 DUP6 PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x9DFBA85200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x213C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x1625 JUMPI DUP7 DUP7 PUSH1 0x40 MLOAD PUSH32 0x6C1719D200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP3 SWAP2 SWAP1 PUSH2 0x20CA JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 SUB PUSH2 0x166B JUMPI PUSH1 0x40 MLOAD PUSH32 0xAC241E1100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP4 PUSH2 0x167A PUSH1 0x1 DUP3 PUSH2 0x20DE JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x1689 JUMPI PUSH2 0x1689 PUSH2 0x1E27 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP2 POP POP PUSH1 0x1 DUP2 EQ DUP1 PUSH2 0x16A3 JUMPI POP PUSH1 0x2 DUP2 EQ JUMPDEST ISZERO PUSH2 0x16E8 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x16CA DUP8 DUP7 DUP7 PUSH2 0x136D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP2 POP PUSH2 0x180E JUMP JUMPDEST PUSH1 0x3 DUP2 SUB PUSH2 0x17D3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH4 0x1626BA7E DUP8 DUP7 PUSH1 0x0 DUP8 PUSH2 0x171C PUSH1 0x1 DUP3 PUSH2 0x20DE JUMP JUMPDEST SWAP3 PUSH2 0x1729 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1747 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2168 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1764 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1788 SWAP2 SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 EQ SWAP2 POP PUSH2 0x180E JUMP JUMPDEST DUP4 DUP4 DUP3 PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0x9DFBA85200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x213C JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x53657175656E636520737461746963206469676573743A0A0000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x38 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x58 ADD PUSH2 0x864 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1892 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x317 DUP2 PUSH2 0x1852 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x18AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x18C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x18FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1919 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1925 DUP7 DUP3 DUP8 ADD PUSH2 0x189D JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1948 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1960 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x196C DUP9 DUP4 DUP10 ADD PUSH2 0x189D JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1992 DUP8 DUP3 DUP9 ADD PUSH2 0x189D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x19C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A32 DUP6 DUP3 DUP7 ADD PUSH2 0x19B7 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1A56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1A6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A7A DUP10 DUP4 DUP11 ADD PUSH2 0x19B7 JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AA7 DUP9 DUP3 DUP10 ADD PUSH2 0x189D JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1AF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1B37 JUMPI PUSH2 0x1B37 PUSH2 0x1AB8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1B7D JUMPI PUSH2 0x1B7D PUSH2 0x1AB8 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1B96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x0 PUSH1 0x20 DUP1 DUP6 ADD DUP1 DUP2 SWAP7 POP DUP6 PUSH1 0x5 SHL DUP2 ADD SWAP2 POP DUP5 PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x1D8A JUMPI DUP3 DUP5 SUB DUP10 MSTORE DUP2 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 DUP9 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1CA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 ADD PUSH1 0xC0 PUSH2 0x1CAE DUP3 PUSH2 0x1BC6 JUMP JUMPDEST ISZERO ISZERO DUP7 MSTORE PUSH2 0x1CBD DUP8 DUP4 ADD PUSH2 0x1BC6 JUMP JUMPDEST ISZERO ISZERO DUP7 DUP9 ADD MSTORE PUSH1 0x40 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1CEF DUP3 DUP6 ADD PUSH2 0x1BDB JUMP JUMPDEST AND SWAP1 DUP8 ADD MSTORE PUSH1 0x80 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP8 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD CALLDATALOAD CALLDATASIZE DUP5 SWAP1 SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 ADD DUP2 SLT PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 ADD DUP8 DUP2 ADD SWAP3 SWAP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP5 SGT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP3 DUP10 ADD MSTORE PUSH2 0x1D74 DUP4 DUP10 ADD DUP3 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP13 DUP10 ADD SWAP13 SWAP8 POP POP POP SWAP3 DUP7 ADD SWAP3 POP POP PUSH1 0x1 ADD PUSH2 0x1C62 JUMP JUMPDEST POP SWAP2 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x5 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x73656C663A000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x1C48 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x6 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x67756573743A0000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x1C48 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1E7C JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1E60 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x317 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E56 JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1F01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x317 DUP3 PUSH2 0x1BC6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x317 DUP3 PUSH2 0x1BDB JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1F76 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1F91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2006 JUMPI PUSH2 0x2006 PUSH2 0x1FA6 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x201D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x202A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x2CB JUMPI PUSH2 0x2CB PUSH2 0x1FA6 JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x205E PUSH1 0x60 DUP4 ADD DUP7 DUP9 PUSH2 0x1BFF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x40 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1E56 JUMP JUMPDEST DUP5 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x20C0 PUSH1 0x60 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x2CB JUMPI PUSH2 0x2CB PUSH2 0x1FA6 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2105 PUSH1 0x40 DUP4 ADD DUP6 DUP8 PUSH2 0x1BFF JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2129 PUSH1 0x40 DUP4 ADD DUP6 DUP8 PUSH2 0x1BFF JUMP JUMPDEST SWAP1 POP PUSH1 0xFF DUP4 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2150 PUSH1 0x60 DUP4 ADD DUP7 DUP9 PUSH2 0x1BFF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP SWAP1 ISZERO ISZERO PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x2182 PUSH1 0x40 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x219D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x317 DUP2 PUSH2 0x1852 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP12 0xB9 0x5D XOR 0xE9 PUSH32 0x278AA47E0C04C20D5A6AF9BDB6D473C6D4051192CD96FC17866864736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "640:2693:1:-:0;;;;;;;;;;;;-1:-1:-1;200:4:7;185:20;;640:2693:1;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@SET_IMAGE_HASH_TYPE_HASH_2042": { + "entryPoint": null, + "id": 2042, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@_executeGuest_199": { + "entryPoint": 2177, + "id": 199, + "parameterSlots": 3, + "returnSlots": 0 + }, + "@_hashSetImageHashStruct_2071": { + "entryPoint": 4687, + "id": 2071, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_isValidImage_211": { + "entryPoint": null, + "id": 211, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_leafForAddressAndWeight_1424": { + "entryPoint": null, + "id": 1424, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@_leafForHardcodedSubdigest_1441": { + "entryPoint": 6167, + "id": 1441, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@_leafForNested_1464": { + "entryPoint": null, + "id": 1464, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@_revertBytes_807": { + "entryPoint": 3435, + "id": 807, + "parameterSlots": 4, + "returnSlots": 0 + }, + "@_signatureValidation_457": { + "entryPoint": 1938, + "id": 457, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@_updateImageHash_222": { + "entryPoint": 1994, + "id": 222, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@call_2515": { + "entryPoint": 3375, + "id": 2515, + "parameterSlots": 5, + "returnSlots": 1 + }, + "@chainedRecover_2217": { + "entryPoint": 2808, + "id": 2217, + "parameterSlots": 3, + "returnSlots": 5 + }, + "@createContract_876": { + "entryPoint": 1595, + "id": 876, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@execute_74": { + "entryPoint": 1050, + "id": 74, + "parameterSlots": 5, + "returnSlots": 0 + }, + "@fkeccak256_2491": { + "entryPoint": null, + "id": 2491, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@isValidSignature_2797": { + "entryPoint": 5680, + "id": 2797, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@isValidSignature_488": { + "entryPoint": 798, + "id": 488, + "parameterSlots": 4, + "returnSlots": 1 + }, + "@isValidSignature_517": { + "entryPoint": 721, + "id": 517, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@nonce_955": { + "entryPoint": 1829, + "id": 955, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@readBytes32Map_1178": { + "entryPoint": 3189, + "id": 1178, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@readBytes32_2339": { + "entryPoint": null, + "id": 2339, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@readBytes32_2475": { + "entryPoint": null, + "id": 2475, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@readFirstUint16_2361": { + "entryPoint": null, + "id": 2361, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@readNonce_976": { + "entryPoint": 1551, + "id": 976, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@readUint16_2433": { + "entryPoint": null, + "id": 2433, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@readUint24_2447": { + "entryPoint": null, + "id": 2447, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@readUint32_2373": { + "entryPoint": null, + "id": 2373, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@readUint8Address_2419": { + "entryPoint": null, + "id": 2419, + "parameterSlots": 3, + "returnSlots": 3 + }, + "@readUint8_2351": { + "entryPoint": null, + "id": 2351, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@readUint8_2403": { + "entryPoint": null, + "id": 2403, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@recoverBranch_1954": { + "entryPoint": 3513, + "id": 1954, + "parameterSlots": 3, + "returnSlots": 2 + }, + "@recoverSigner_2715": { + "entryPoint": 4973, + "id": 2715, + "parameterSlots": 3, + "returnSlots": 1 + }, + "@recover_2020": { + "entryPoint": 2574, + "id": 2020, + "parameterSlots": 3, + "returnSlots": 4 + }, + "@recover_2246": { + "entryPoint": 2655, + "id": 2246, + "parameterSlots": 3, + "returnSlots": 4 + }, + "@returnData_2499": { + "entryPoint": 3404, + "id": 2499, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@selfExecute_102": { + "entryPoint": 981, + "id": 102, + "parameterSlots": 2, + "returnSlots": 0 + }, + "@signatureRecovery_413": { + "entryPoint": 1095, + "id": 413, + "parameterSlots": 3, + "returnSlots": 5 + }, + "@subdigest_1394": { + "entryPoint": 2044, + "id": 1394, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@subdigest_2274": { + "entryPoint": 2699, + "id": 2274, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_240": { + "entryPoint": 704, + "id": 240, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_549": { + "entryPoint": 4739, + "id": 549, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_832": { + "entryPoint": 3283, + "id": 832, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_901": { + "entryPoint": 1846, + "id": 901, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_919": { + "entryPoint": null, + "id": 919, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@updateImageHash_563": { + "entryPoint": 899, + "id": 563, + "parameterSlots": 1, + "returnSlots": 0 + }, + "abi_decode_address": { + "entryPoint": 7131, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_array_struct_Transaction_calldata_dyn_calldata": { + "entryPoint": 6583, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_bool": { + "entryPoint": 7110, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_bytes_calldata": { + "entryPoint": 6301, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_address": { + "entryPoint": 7974, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr": { + "entryPoint": 6652, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptrt_uint256t_bytes_calldata_ptr": { + "entryPoint": 6718, + "id": null, + "parameterSlots": 2, + "returnSlots": 5 + }, + "abi_decode_tuple_t_bool": { + "entryPoint": 7947, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes32": { + "entryPoint": 6558, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes32t_bytes_calldata_ptr": { + "entryPoint": 6374, + "id": null, + "parameterSlots": 2, + "returnSlots": 3 + }, + "abi_decode_tuple_t_bytes4": { + "entryPoint": 6272, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes4_fromMemory": { + "entryPoint": 8587, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr": { + "entryPoint": 6450, + "id": null, + "parameterSlots": 2, + "returnSlots": 4 + }, + "abi_decode_tuple_t_bytes_memory_ptr": { + "entryPoint": 6887, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_array_struct_Transaction_calldata_dyn_calldata": { + "entryPoint": 7240, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_bytes": { + "entryPoint": 7766, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_bytes_calldata": { + "entryPoint": 7167, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed": { + "entryPoint": 7094, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_uint256_t_address_t_bytes32__to_t_string_memory_ptr_t_uint256_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_583557e68bca91e5400591dbc9ae31043113c95e3cd985463ae532f51d706f8c_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_packed_t_stringliteral_58d1832f15932b40f8da147bd99ac98efab990f25a786a2229b05ee5f5be41a7_t_bytes32_t_uint256_t_uint256__to_t_string_memory_ptr_t_bytes32_t_uint256_t_uint256__nonPadded_inplace_fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes1__to_t_bytes1__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_address_t_bytes_calldata_ptr_slice__to_t_bytes32_t_address_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 8330, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes_calldata_ptr_slice__to_t_bytes32_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 8552, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 8394, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr_slice_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 8266, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr_t_bytes32__to_t_bytes_memory_ptr_t_bytes32__fromStack_reversed": { + "entryPoint": 8433, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr_t_uint256_t_bool__to_t_bytes_memory_ptr_t_uint256_t_bool__fromStack_reversed": { + "entryPoint": 8508, + "id": null, + "parameterSlots": 5, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_calldata_ptr_t_uint8__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed": { + "entryPoint": 8469, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 7866, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_4dfa0bed92fb5c2df0b47ce555e6e6b89f746e856aa9783c634a4987edcbf682_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed": { + "entryPoint": 7647, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed": { + "entryPoint": 7575, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 8305, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__to_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 6, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256_t_uint256__to_t_uint256_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 4, + "returnSlots": 1 + }, + "access_calldata_tail_t_bytes_calldata_ptr": { + "entryPoint": 8001, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "access_calldata_tail_t_struct$_Transaction_$1292_calldata_ptr": { + "entryPoint": 7885, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "calldata_array_index_range_access_t_bytes_calldata_ptr": { + "entryPoint": 8205, + "id": null, + "parameterSlots": 4, + "returnSlots": 2 + }, + "checked_add_t_uint256": { + "entryPoint": 8247, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "checked_sub_t_uint256": { + "entryPoint": 8414, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "increment_t_uint256": { + "entryPoint": 8149, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 8102, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x32": { + "entryPoint": 7719, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "panic_error_0x41": { + "entryPoint": 6840, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_bytes4": { + "entryPoint": 6226, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:20962:22", + "statements": [ + { + "nodeType": "YulBlock", + "src": "6:3:22", + "statements": [] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "58:133:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "169:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "178:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "181:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "171:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "171:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "171:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "81:5:22" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "92:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "99:66:22", + "type": "", + "value": "0xffffffff00000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "88:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "88:78:22" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "78:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "78:89:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "71:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "71:97:22" + }, + "nodeType": "YulIf", + "src": "68:117:22" + } + ] + }, + "name": "validator_revert_bytes4", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "47:5:22", + "type": "" + } + ], + "src": "14:177:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "265:176:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "311:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "323:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "313:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "313:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "313:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "286:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "295:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "282:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "282:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "307:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "278:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "278:32:22" + }, + "nodeType": "YulIf", + "src": "275:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "336:36:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "362:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "349:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "349:23:22" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "340:5:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "405:5:22" + } + ], + "functionName": { + "name": "validator_revert_bytes4", + "nodeType": "YulIdentifier", + "src": "381:23:22" + }, + "nodeType": "YulFunctionCall", + "src": "381:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "381:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "420:15:22", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "430:5:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "420:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes4", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "231:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "242:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "254:6:22", + "type": "" + } + ], + "src": "196:245:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "541:92:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "551:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "563:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "574:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "559:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "559:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "551:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "593:9:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "618:6:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "611:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "611:14:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "604:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "604:22:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "586:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "586:41:22" + }, + "nodeType": "YulExpressionStatement", + "src": "586:41:22" + } + ] + }, + "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "510:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "521:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "532:4:22", + "type": "" + } + ], + "src": "446:187:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "710:275:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "759:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "768:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "771:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "761:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "761:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "761:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "738:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "746:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "734:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "734:17:22" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "753:3:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "730:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "730:27:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "723:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "723:35:22" + }, + "nodeType": "YulIf", + "src": "720:55:22" + }, + { + "nodeType": "YulAssignment", + "src": "784:30:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "807:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "794:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "794:20:22" + }, + "variableNames": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "784:6:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "857:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "866:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "869:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "859:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "859:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "859:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "829:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "837:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "826:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "826:30:22" + }, + "nodeType": "YulIf", + "src": "823:50:22" + }, + { + "nodeType": "YulAssignment", + "src": "882:29:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "898:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "906:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "894:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "894:17:22" + }, + "variableNames": [ + { + "name": "arrayPos", + "nodeType": "YulIdentifier", + "src": "882:8:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "963:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "972:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "975:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "965:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "965:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "965:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "934:6:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "942:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "930:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "930:19:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "951:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "926:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "926:30:22" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "958:3:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "923:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "923:39:22" + }, + "nodeType": "YulIf", + "src": "920:59:22" + } + ] + }, + "name": "abi_decode_bytes_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "673:6:22", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "681:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "arrayPos", + "nodeType": "YulTypedName", + "src": "689:8:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "699:6:22", + "type": "" + } + ], + "src": "638:347:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1096:371:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1142:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1151:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1154:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1144:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1144:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1144:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1117:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1126:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1113:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1113:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1138:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1109:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1109:32:22" + }, + "nodeType": "YulIf", + "src": "1106:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "1167:33:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1190:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1177:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "1177:23:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1167:6:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1209:46:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1240:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1251:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1236:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1236:18:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1223:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "1223:32:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1213:6:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1298:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1307:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1310:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1300:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1300:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1300:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1270:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1278:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1267:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "1267:30:22" + }, + "nodeType": "YulIf", + "src": "1264:50:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1323:84:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1379:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1390:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1375:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1375:22:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1399:7:22" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "1349:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "1349:58:22" + }, + "variables": [ + { + "name": "value1_1", + "nodeType": "YulTypedName", + "src": "1327:8:22", + "type": "" + }, + { + "name": "value2_1", + "nodeType": "YulTypedName", + "src": "1337:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1416:18:22", + "value": { + "name": "value1_1", + "nodeType": "YulIdentifier", + "src": "1426:8:22" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1416:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1443:18:22", + "value": { + "name": "value2_1", + "nodeType": "YulIdentifier", + "src": "1453:8:22" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "1443:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1046:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1057:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1069:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "1077:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "1085:6:22", + "type": "" + } + ], + "src": "990:477:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1571:149:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1581:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1593:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1604:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1589:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1589:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1581:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1623:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1638:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1646:66:22", + "type": "", + "value": "0xffffffff00000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "1634:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1634:79:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1616:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1616:98:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1616:98:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1540:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1551:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1562:4:22", + "type": "" + } + ], + "src": "1472:248:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1850:592:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1896:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1905:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1908:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1898:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1898:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1898:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1871:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1880:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1867:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1867:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1892:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1863:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1863:32:22" + }, + "nodeType": "YulIf", + "src": "1860:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1921:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1948:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1935:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "1935:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1925:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1967:28:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1977:18:22", + "type": "", + "value": "0xffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "1971:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2022:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2031:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2034:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2024:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2024:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2024:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2010:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2018:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "2007:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "2007:14:22" + }, + "nodeType": "YulIf", + "src": "2004:34:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2047:84:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2103:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2114:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2099:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2099:22:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2123:7:22" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "2073:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "2073:58:22" + }, + "variables": [ + { + "name": "value0_1", + "nodeType": "YulTypedName", + "src": "2051:8:22", + "type": "" + }, + { + "name": "value1_1", + "nodeType": "YulTypedName", + "src": "2061:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2140:18:22", + "value": { + "name": "value0_1", + "nodeType": "YulIdentifier", + "src": "2150:8:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2140:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2167:18:22", + "value": { + "name": "value1_1", + "nodeType": "YulIdentifier", + "src": "2177:8:22" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "2167:6:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2194:48:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2227:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2238:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2223:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2223:18:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2210:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "2210:32:22" + }, + "variables": [ + { + "name": "offset_1", + "nodeType": "YulTypedName", + "src": "2198:8:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2271:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2280:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2283:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2273:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2273:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2273:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_1", + "nodeType": "YulIdentifier", + "src": "2257:8:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2267:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "2254:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "2254:16:22" + }, + "nodeType": "YulIf", + "src": "2251:36:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2296:86:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2352:9:22" + }, + { + "name": "offset_1", + "nodeType": "YulIdentifier", + "src": "2363:8:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2348:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2348:24:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2374:7:22" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "2322:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "2322:60:22" + }, + "variables": [ + { + "name": "value2_1", + "nodeType": "YulTypedName", + "src": "2300:8:22", + "type": "" + }, + { + "name": "value3_1", + "nodeType": "YulTypedName", + "src": "2310:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2391:18:22", + "value": { + "name": "value2_1", + "nodeType": "YulIdentifier", + "src": "2401:8:22" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "2391:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2418:18:22", + "value": { + "name": "value3_1", + "nodeType": "YulIdentifier", + "src": "2428:8:22" + }, + "variableNames": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "2418:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1792:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1803:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1815:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "1823:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "1831:6:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "1839:6:22", + "type": "" + } + ], + "src": "1725:717:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2517:110:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "2563:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2572:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2575:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2565:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2565:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2565:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2538:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2547:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2534:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2534:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2559:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "2530:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2530:32:22" + }, + "nodeType": "YulIf", + "src": "2527:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "2588:33:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2611:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2598:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "2598:23:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2588:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes32", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2483:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "2494:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "2506:6:22", + "type": "" + } + ], + "src": "2447:180:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2733:76:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2743:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2755:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2766:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2751:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2751:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2743:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2785:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2796:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2778:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2778:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2778:25:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2702:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "2713:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2724:4:22", + "type": "" + } + ], + "src": "2632:177:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2918:283:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "2967:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2976:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2979:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "2969:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2969:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2969:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2946:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2954:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2942:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2942:17:22" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "2961:3:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "2938:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2938:27:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "2931:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2931:35:22" + }, + "nodeType": "YulIf", + "src": "2928:55:22" + }, + { + "nodeType": "YulAssignment", + "src": "2992:30:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3015:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3002:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "3002:20:22" + }, + "variableNames": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "2992:6:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3065:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3074:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3077:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3067:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3067:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3067:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "3037:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3045:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "3034:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "3034:30:22" + }, + "nodeType": "YulIf", + "src": "3031:50:22" + }, + { + "nodeType": "YulAssignment", + "src": "3090:29:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3106:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3114:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3102:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3102:17:22" + }, + "variableNames": [ + { + "name": "arrayPos", + "nodeType": "YulIdentifier", + "src": "3090:8:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3179:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3188:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3191:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3181:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3181:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3181:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3142:6:22" + }, + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3154:1:22", + "type": "", + "value": "5" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "3157:6:22" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "3150:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3150:14:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3138:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3138:27:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3167:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3134:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3134:38:22" + }, + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "3174:3:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "3131:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "3131:47:22" + }, + "nodeType": "YulIf", + "src": "3128:67:22" + } + ] + }, + "name": "abi_decode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "2881:6:22", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "2889:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "arrayPos", + "nodeType": "YulTypedName", + "src": "2897:8:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "2907:6:22", + "type": "" + } + ], + "src": "2814:387:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3342:352:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "3388:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3397:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3400:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3390:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3390:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3390:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "3363:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3372:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3359:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3359:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3384:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "3355:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3355:32:22" + }, + "nodeType": "YulIf", + "src": "3352:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "3413:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3440:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3427:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "3427:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "3417:6:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3493:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3502:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3505:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3495:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3495:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3495:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3465:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3473:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "3462:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "3462:30:22" + }, + "nodeType": "YulIf", + "src": "3459:50:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "3518:116:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3606:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "3617:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3602:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3602:22:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "3626:7:22" + } + ], + "functionName": { + "name": "abi_decode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulIdentifier", + "src": "3544:57:22" + }, + "nodeType": "YulFunctionCall", + "src": "3544:90:22" + }, + "variables": [ + { + "name": "value0_1", + "nodeType": "YulTypedName", + "src": "3522:8:22", + "type": "" + }, + { + "name": "value1_1", + "nodeType": "YulTypedName", + "src": "3532:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3643:18:22", + "value": { + "name": "value0_1", + "nodeType": "YulIdentifier", + "src": "3653:8:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3643:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3670:18:22", + "value": { + "name": "value1_1", + "nodeType": "YulIdentifier", + "src": "3680:8:22" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "3670:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3300:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "3311:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3323:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3331:6:22", + "type": "" + } + ], + "src": "3206:488:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3888:675:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "3934:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3943:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3946:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3936:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "3936:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "3936:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "3909:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3918:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3905:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3905:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3930:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "3901:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "3901:32:22" + }, + "nodeType": "YulIf", + "src": "3898:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "3959:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3986:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3973:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "3973:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "3963:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4005:28:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4015:18:22", + "type": "", + "value": "0xffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "4009:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4060:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4069:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4072:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4062:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4062:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4062:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4048:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "4056:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "4045:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "4045:14:22" + }, + "nodeType": "YulIf", + "src": "4042:34:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4085:116:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4173:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "4184:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4169:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4169:22:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "4193:7:22" + } + ], + "functionName": { + "name": "abi_decode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulIdentifier", + "src": "4111:57:22" + }, + "nodeType": "YulFunctionCall", + "src": "4111:90:22" + }, + "variables": [ + { + "name": "value0_1", + "nodeType": "YulTypedName", + "src": "4089:8:22", + "type": "" + }, + { + "name": "value1_1", + "nodeType": "YulTypedName", + "src": "4099:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4210:18:22", + "value": { + "name": "value0_1", + "nodeType": "YulIdentifier", + "src": "4220:8:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "4210:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4237:18:22", + "value": { + "name": "value1_1", + "nodeType": "YulIdentifier", + "src": "4247:8:22" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "4237:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4264:42:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4291:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4302:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4287:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4287:18:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4274:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "4274:32:22" + }, + "variableNames": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "4264:6:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4315:48:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4348:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4359:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4344:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4344:18:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4331:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "4331:32:22" + }, + "variables": [ + { + "name": "offset_1", + "nodeType": "YulTypedName", + "src": "4319:8:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4392:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4401:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4404:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "4394:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4394:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4394:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset_1", + "nodeType": "YulIdentifier", + "src": "4378:8:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "4388:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "4375:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "4375:16:22" + }, + "nodeType": "YulIf", + "src": "4372:36:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "4417:86:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4473:9:22" + }, + { + "name": "offset_1", + "nodeType": "YulIdentifier", + "src": "4484:8:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4469:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4469:24:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "4495:7:22" + } + ], + "functionName": { + "name": "abi_decode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "4443:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "4443:60:22" + }, + "variables": [ + { + "name": "value3_1", + "nodeType": "YulTypedName", + "src": "4421:8:22", + "type": "" + }, + { + "name": "value4_1", + "nodeType": "YulTypedName", + "src": "4431:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4512:18:22", + "value": { + "name": "value3_1", + "nodeType": "YulIdentifier", + "src": "4522:8:22" + }, + "variableNames": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "4512:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4539:18:22", + "value": { + "name": "value4_1", + "nodeType": "YulIdentifier", + "src": "4549:8:22" + }, + "variableNames": [ + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "4539:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptrt_uint256t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3822:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "3833:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3845:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3853:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "3861:6:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "3869:6:22", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "3877:6:22", + "type": "" + } + ], + "src": "3699:864:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "4781:250:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "4791:27:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4803:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4814:3:22", + "type": "", + "value": "160" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4799:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4799:19:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "4791:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4834:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "4845:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4827:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4827:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4827:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4872:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4883:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4868:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4868:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "4888:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4861:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4861:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4861:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4915:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4926:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4911:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4911:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "4931:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4904:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4904:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4904:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "4958:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4969:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4954:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4954:18:22" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "4974:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4947:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4947:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4947:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5001:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5012:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4997:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "4997:19:22" + }, + { + "name": "value4", + "nodeType": "YulIdentifier", + "src": "5018:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "4990:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "4990:35:22" + }, + "nodeType": "YulExpressionStatement", + "src": "4990:35:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__to_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "4718:9:22", + "type": "" + }, + { + "name": "value4", + "nodeType": "YulTypedName", + "src": "4729:6:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "4737:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "4745:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "4753:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "4761:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "4772:4:22", + "type": "" + } + ], + "src": "4568:463:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5106:110:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "5152:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5161:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5164:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5154:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5154:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5154:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5127:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5136:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "5123:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5123:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5148:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "5119:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5119:32:22" + }, + "nodeType": "YulIf", + "src": "5116:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "5177:33:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5200:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5187:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "5187:23:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "5177:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "5072:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "5083:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "5095:6:22", + "type": "" + } + ], + "src": "5036:180:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5322:76:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "5332:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5344:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5355:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5340:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5340:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "5332:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5374:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "5385:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "5367:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5367:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5367:25:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "5291:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "5302:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "5313:4:22", + "type": "" + } + ], + "src": "5221:177:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5435:152:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5452:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5455:77:22", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "5445:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5445:88:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5445:88:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5549:1:22", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5552:4:22", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "5542:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5542:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5542:15:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5573:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5576:4:22", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5566:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5566:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5566:15:22" + } + ] + }, + "name": "panic_error_0x41", + "nodeType": "YulFunctionDefinition", + "src": "5403:184:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5671:901:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "5717:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5726:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5729:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5719:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5719:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5719:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5692:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5701:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "5688:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5688:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5713:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "5684:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5684:32:22" + }, + "nodeType": "YulIf", + "src": "5681:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5742:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5769:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5756:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "5756:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "5746:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5788:28:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5798:18:22", + "type": "", + "value": "0xffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "5792:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5843:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5852:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5855:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5845:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5845:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5845:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "5831:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "5839:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "5828:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "5828:14:22" + }, + "nodeType": "YulIf", + "src": "5825:34:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5868:32:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "5882:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "5893:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5878:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5878:22:22" + }, + "variables": [ + { + "name": "_2", + "nodeType": "YulTypedName", + "src": "5872:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "5948:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5957:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5960:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "5950:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5950:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "5950:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "5927:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "5931:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "5923:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5923:13:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "5938:7:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "5919:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "5919:27:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "5912:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "5912:35:22" + }, + "nodeType": "YulIf", + "src": "5909:55:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "5973:26:22", + "value": { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "5996:2:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "5983:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "5983:16:22" + }, + "variables": [ + { + "name": "_3", + "nodeType": "YulTypedName", + "src": "5977:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6022:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nodeType": "YulIdentifier", + "src": "6024:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "6024:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6024:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6014:2:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "6018:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "6011:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6011:10:22" + }, + "nodeType": "YulIf", + "src": "6008:36:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6053:76:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6063:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + }, + "variables": [ + { + "name": "_4", + "nodeType": "YulTypedName", + "src": "6057:2:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6138:23:22", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6158:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "6152:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "6152:9:22" + }, + "variables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "6142:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "6170:71:22", + "value": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6192:6:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6216:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6220:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6212:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6212:13:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "6227:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "6208:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6208:22:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6232:2:22", + "type": "", + "value": "63" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6204:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6204:31:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "6237:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "6200:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6200:40:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6188:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6188:53:22" + }, + "variables": [ + { + "name": "newFreePtr", + "nodeType": "YulTypedName", + "src": "6174:10:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6300:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nodeType": "YulIdentifier", + "src": "6302:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "6302:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6302:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "6259:10:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "6271:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "6256:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6256:18:22" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "6279:10:22" + }, + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6291:6:22" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "6276:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6276:22:22" + } + ], + "functionName": { + "name": "or", + "nodeType": "YulIdentifier", + "src": "6253:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6253:46:22" + }, + "nodeType": "YulIf", + "src": "6250:72:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6338:2:22", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "6342:10:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6331:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6331:22:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6331:22:22" + }, + { + "expression": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6369:6:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6377:2:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6362:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6362:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6362:18:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6426:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6435:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6438:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "6428:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6428:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6428:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "6403:2:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6407:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6399:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6399:11:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6412:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6395:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6395:20:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "6417:7:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "6392:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "6392:33:22" + }, + "nodeType": "YulIf", + "src": "6389:53:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6468:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6476:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6464:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6464:15:22" + }, + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "6485:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6489:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6481:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6481:11:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6494:2:22" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "6451:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "6451:46:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6451:46:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6521:6:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "6529:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6517:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6517:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6534:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6513:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6513:24:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6539:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6506:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6506:35:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6506:35:22" + }, + { + "nodeType": "YulAssignment", + "src": "6550:16:22", + "value": { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "6560:6:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "6550:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes_memory_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "5637:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "5648:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "5660:6:22", + "type": "" + } + ], + "src": "5592:980:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6678:125:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "6688:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6700:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6711:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "6696:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6696:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "6688:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "6730:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "6745:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "6753:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "6741:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "6741:55:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "6723:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "6723:74:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6723:74:22" + } + ] + }, + "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "6647:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "6658:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "6669:4:22", + "type": "" + } + ], + "src": "6577:226:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "6955:124:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "6978:3:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "6983:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "6991:6:22" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "6965:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "6965:33:22" + }, + "nodeType": "YulExpressionStatement", + "src": "6965:33:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7007:26:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7021:3:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "7026:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7017:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7017:16:22" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "7011:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7049:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7053:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7042:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7042:13:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7042:13:22" + }, + { + "nodeType": "YulAssignment", + "src": "7064:9:22", + "value": { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7071:2:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "7064:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "6923:3:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "6928:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "6936:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "6947:3:22", + "type": "" + } + ], + "src": "6808:271:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7213:198:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "7223:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7235:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7246:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7231:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7231:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "7223:4:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "7258:52:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7268:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "7262:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7326:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "7341:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7349:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "7337:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7337:15:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7319:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7319:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7319:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "7373:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7384:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7369:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7369:18:22" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "7393:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "7401:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "7389:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7389:15:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7362:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7362:43:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7362:43:22" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "7174:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "7185:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "7193:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "7204:4:22", + "type": "" + } + ], + "src": "7084:327:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7462:114:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "7472:29:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "7494:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7481:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "7481:20:22" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7472:5:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7554:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7563:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7566:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "7556:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7556:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7556:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7523:5:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7544:5:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7537:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7537:13:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7530:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7530:21:22" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "7520:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "7520:32:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7513:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7513:40:22" + }, + "nodeType": "YulIf", + "src": "7510:60:22" + } + ] + }, + "name": "abi_decode_bool", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "7441:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "7452:5:22", + "type": "" + } + ], + "src": "7416:160:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7630:147:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "7640:29:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "7662:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "7649:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "7649:20:22" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7640:5:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7755:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7764:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7767:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "7757:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7757:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7757:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7691:5:22" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "7702:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7709:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "7698:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7698:54:22" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "7688:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "7688:65:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "7681:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7681:73:22" + }, + "nodeType": "YulIf", + "src": "7678:93:22" + } + ] + }, + "name": "abi_decode_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "7609:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "7620:5:22", + "type": "" + } + ], + "src": "7581:196:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "7848:259:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7865:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "7870:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7858:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7858:19:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7858:19:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7903:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7908:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7899:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7899:14:22" + }, + { + "name": "start", + "nodeType": "YulIdentifier", + "src": "7915:5:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "7922:6:22" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "7886:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "7886:43:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7886:43:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "7953:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "7958:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7949:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7949:16:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7967:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7945:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7945:27:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "7974:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "7938:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "7938:38:22" + }, + "nodeType": "YulExpressionStatement", + "src": "7938:38:22" + }, + { + "nodeType": "YulAssignment", + "src": "7985:116:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8000:3:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "8013:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8021:2:22", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8009:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8009:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8026:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "8005:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8005:88:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7996:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7996:98:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8096:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "7992:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "7992:109:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "7985:3:22" + } + ] + } + ] + }, + "name": "abi_encode_bytes_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "start", + "nodeType": "YulTypedName", + "src": "7817:5:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "7824:6:22", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "7832:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "7840:3:22", + "type": "" + } + ], + "src": "7782:325:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8210:1930:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8227:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "8232:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8220:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8220:19:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8220:19:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8248:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8258:4:22", + "type": "", + "value": "0x20" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "8252:2:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8271:31:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8294:3:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "8299:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8290:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8290:12:22" + }, + "variables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "8275:11:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8311:24:22", + "value": { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "8324:11:22" + }, + "variables": [ + { + "name": "pos_1", + "nodeType": "YulTypedName", + "src": "8315:5:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "8344:18:22", + "value": { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "8351:11:22" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8344:3:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8371:38:22", + "value": { + "arguments": [ + { + "name": "pos_1", + "nodeType": "YulIdentifier", + "src": "8387:5:22" + }, + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8398:1:22", + "type": "", + "value": "5" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "8401:6:22" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "8394:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8394:14:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8383:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8383:26:22" + }, + "variables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "8375:4:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8418:19:22", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8432:5:22" + }, + "variables": [ + { + "name": "srcPtr", + "nodeType": "YulTypedName", + "src": "8422:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8446:10:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8455:1:22", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nodeType": "YulTypedName", + "src": "8450:1:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8514:1600:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "8535:3:22" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "8544:4:22" + }, + { + "name": "pos_1", + "nodeType": "YulIdentifier", + "src": "8550:5:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "8540:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8540:16:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8528:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8528:29:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8528:29:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8570:46:22", + "value": { + "arguments": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "8609:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "8596:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "8596:20:22" + }, + "variables": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulTypedName", + "src": "8574:18:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "8765:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8774:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8777:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "8767:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8767:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8767:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "8643:18:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "8671:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "8671:14:22" + }, + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8687:5:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "8667:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8667:26:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8695:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8663:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8663:99:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "8639:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8639:124:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8632:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8632:132:22" + }, + "nodeType": "YulIf", + "src": "8629:152:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8794:45:22", + "value": { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "8813:18:22" + }, + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "8833:5:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8809:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8809:30:22" + }, + "variables": [ + { + "name": "value_1", + "nodeType": "YulTypedName", + "src": "8798:7:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "8852:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8862:4:22", + "type": "", + "value": "0xc0" + }, + "variables": [ + { + "name": "_2", + "nodeType": "YulTypedName", + "src": "8856:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "8886:4:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "8922:7:22" + } + ], + "functionName": { + "name": "abi_decode_bool", + "nodeType": "YulIdentifier", + "src": "8906:15:22" + }, + "nodeType": "YulFunctionCall", + "src": "8906:24:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8899:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8899:32:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8892:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8892:40:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8879:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8879:54:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8879:54:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "8957:4:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "8963:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8953:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8953:13:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9002:7:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "9011:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8998:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8998:16:22" + } + ], + "functionName": { + "name": "abi_decode_bool", + "nodeType": "YulIdentifier", + "src": "8982:15:22" + }, + "nodeType": "YulFunctionCall", + "src": "8982:33:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8975:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8975:41:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "8968:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8968:49:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "8946:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "8946:72:22" + }, + "nodeType": "YulExpressionStatement", + "src": "8946:72:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9031:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9041:4:22", + "type": "", + "value": "0x40" + }, + "variables": [ + { + "name": "_3", + "nodeType": "YulTypedName", + "src": "9035:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9069:4:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "9075:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9065:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9065:13:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9097:7:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "9106:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9093:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9093:16:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "9080:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9080:30:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9058:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9058:53:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9058:53:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9124:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9134:4:22", + "type": "", + "value": "0x60" + }, + "variables": [ + { + "name": "_4", + "nodeType": "YulTypedName", + "src": "9128:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9162:4:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "9168:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9158:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9158:13:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9200:7:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "9209:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9196:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9196:16:22" + } + ], + "functionName": { + "name": "abi_decode_address", + "nodeType": "YulIdentifier", + "src": "9177:18:22" + }, + "nodeType": "YulFunctionCall", + "src": "9177:36:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9215:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "9173:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9173:85:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9151:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9151:108:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9151:108:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9272:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9282:4:22", + "type": "", + "value": "0x80" + }, + "variables": [ + { + "name": "_5", + "nodeType": "YulTypedName", + "src": "9276:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9310:4:22" + }, + { + "name": "_5", + "nodeType": "YulIdentifier", + "src": "9316:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9306:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9306:13:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9338:7:22" + }, + { + "name": "_5", + "nodeType": "YulIdentifier", + "src": "9347:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9334:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9334:16:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "9321:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9321:30:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9299:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9299:53:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9299:53:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9365:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9375:4:22", + "type": "", + "value": "0xa0" + }, + "variables": [ + { + "name": "_6", + "nodeType": "YulTypedName", + "src": "9369:2:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9392:58:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9437:7:22" + }, + { + "name": "_6", + "nodeType": "YulIdentifier", + "src": "9446:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9433:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9433:16:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "9420:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9420:30:22" + }, + "variables": [ + { + "name": "rel_offset_of_tail_1", + "nodeType": "YulTypedName", + "src": "9396:20:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9603:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9612:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9615:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9605:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9605:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9605:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail_1", + "nodeType": "YulIdentifier", + "src": "9477:20:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "9507:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9507:14:22" + }, + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9523:7:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "9503:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9503:28:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9533:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9499:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9499:101:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "9473:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9473:128:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "9466:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9466:136:22" + }, + "nodeType": "YulIf", + "src": "9463:156:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9632:49:22", + "value": { + "arguments": [ + { + "name": "rel_offset_of_tail_1", + "nodeType": "YulIdentifier", + "src": "9651:20:22" + }, + { + "name": "value_1", + "nodeType": "YulIdentifier", + "src": "9673:7:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9647:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9647:34:22" + }, + "variables": [ + { + "name": "value_2", + "nodeType": "YulTypedName", + "src": "9636:7:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9694:37:22", + "value": { + "arguments": [ + { + "name": "value_2", + "nodeType": "YulIdentifier", + "src": "9723:7:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "9710:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9710:21:22" + }, + "variables": [ + { + "name": "length_1", + "nodeType": "YulTypedName", + "src": "9698:8:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "9744:31:22", + "value": { + "arguments": [ + { + "name": "value_2", + "nodeType": "YulIdentifier", + "src": "9763:7:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "9772:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9759:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9759:16:22" + }, + "variables": [ + { + "name": "value_3", + "nodeType": "YulTypedName", + "src": "9748:7:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9824:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9833:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9836:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9826:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9826:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9826:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length_1", + "nodeType": "YulIdentifier", + "src": "9794:8:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9804:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "9791:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "9791:32:22" + }, + "nodeType": "YulIf", + "src": "9788:52:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "9900:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9909:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "9912:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "9902:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9902:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9902:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "value_3", + "nodeType": "YulIdentifier", + "src": "9860:7:22" + }, + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "9873:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "9873:14:22" + }, + { + "name": "length_1", + "nodeType": "YulIdentifier", + "src": "9889:8:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "9869:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9869:29:22" + } + ], + "functionName": { + "name": "sgt", + "nodeType": "YulIdentifier", + "src": "9856:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9856:43:22" + }, + "nodeType": "YulIf", + "src": "9853:63:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9940:4:22" + }, + { + "name": "_6", + "nodeType": "YulIdentifier", + "src": "9946:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "9936:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "9936:13:22" + }, + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "9951:2:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "9929:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "9929:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "9929:25:22" + }, + { + "nodeType": "YulAssignment", + "src": "9967:67:22", + "value": { + "arguments": [ + { + "name": "value_3", + "nodeType": "YulIdentifier", + "src": "10001:7:22" + }, + { + "name": "length_1", + "nodeType": "YulIdentifier", + "src": "10010:8:22" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "10024:4:22" + }, + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "10030:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10020:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10020:13:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "9975:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "9975:59:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "9967:4:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "10047:25:22", + "value": { + "arguments": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "10061:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "10069:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10057:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10057:15:22" + }, + "variableNames": [ + { + "name": "srcPtr", + "nodeType": "YulIdentifier", + "src": "10047:6:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "10085:19:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "10096:3:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "10101:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10092:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10092:12:22" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "10085:3:22" + } + ] + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "8476:1:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "8479:6:22" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "8473:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "8473:13:22" + }, + "nodeType": "YulForLoop", + "post": { + "nodeType": "YulBlock", + "src": "8487:18:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "8489:14:22", + "value": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "8498:1:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "8501:1:22", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "8494:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "8494:9:22" + }, + "variableNames": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "8489:1:22" + } + ] + } + ] + }, + "pre": { + "nodeType": "YulBlock", + "src": "8469:3:22", + "statements": [] + }, + "src": "8465:1649:22" + }, + { + "nodeType": "YulAssignment", + "src": "10123:11:22", + "value": { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "10130:4:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "10123:3:22" + } + ] + } + ] + }, + "name": "abi_encode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "8179:5:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "8186:6:22", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "8194:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "8202:3:22", + "type": "" + } + ], + "src": "8112:2028:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "10467:272:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10484:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10495:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10477:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "10477:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "10477:21:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10518:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10529:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10514:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10514:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10534:1:22", + "type": "", + "value": "5" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10507:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "10507:29:22" + }, + "nodeType": "YulExpressionStatement", + "src": "10507:29:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10556:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10567:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10552:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10552:18:22" + }, + { + "hexValue": "73656c663a", + "kind": "string", + "nodeType": "YulLiteral", + "src": "10572:7:22", + "type": "", + "value": "self:" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10545:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "10545:35:22" + }, + "nodeType": "YulExpressionStatement", + "src": "10545:35:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10600:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10611:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10596:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10596:20:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10618:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "10589:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "10589:33:22" + }, + "nodeType": "YulExpressionStatement", + "src": "10589:33:22" + }, + { + "nodeType": "YulAssignment", + "src": "10631:102:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "10697:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "10705:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "10717:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "10728:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "10713:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "10713:19:22" + } + ], + "functionName": { + "name": "abi_encode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulIdentifier", + "src": "10639:57:22" + }, + "nodeType": "YulFunctionCall", + "src": "10639:94:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "10631:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "10428:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "10439:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "10447:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "10458:4:22", + "type": "" + } + ], + "src": "10145:594:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11066:273:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11083:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11094:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11076:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11076:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11076:21:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11117:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11128:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11113:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11113:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11133:1:22", + "type": "", + "value": "6" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11106:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11106:29:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11106:29:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11155:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11166:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11151:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11151:18:22" + }, + { + "hexValue": "67756573743a", + "kind": "string", + "nodeType": "YulLiteral", + "src": "11171:8:22", + "type": "", + "value": "guest:" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11144:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11144:36:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11144:36:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11200:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11211:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11196:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11196:20:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11218:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11189:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11189:33:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11189:33:22" + }, + { + "nodeType": "YulAssignment", + "src": "11231:102:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "11297:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "11305:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11317:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11328:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11313:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11313:19:22" + } + ], + "functionName": { + "name": "abi_encode_array_struct_Transaction_calldata_dyn_calldata", + "nodeType": "YulIdentifier", + "src": "11239:57:22" + }, + "nodeType": "YulFunctionCall", + "src": "11239:94:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "11231:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_4dfa0bed92fb5c2df0b47ce555e6e6b89f746e856aa9783c634a4987edcbf682_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "11027:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "11038:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "11046:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "11057:4:22", + "type": "" + } + ], + "src": "10744:595:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11376:152:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11393:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11396:77:22", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11386:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11386:88:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11386:88:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11490:1:22", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11493:4:22", + "type": "", + "value": "0x32" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11483:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11483:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11483:15:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11514:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11517:4:22", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "11507:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11507:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11507:15:22" + } + ] + }, + "name": "panic_error_0x32", + "nodeType": "YulFunctionDefinition", + "src": "11344:184:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11632:149:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "11642:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11654:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11665:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11650:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11650:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "11642:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "11684:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "11699:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11707:66:22", + "type": "", + "value": "0xff00000000000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "11695:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11695:79:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11677:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11677:98:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11677:98:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes1__to_t_bytes1__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "11601:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "11612:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "11623:4:22", + "type": "" + } + ], + "src": "11533:248:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11835:432:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "11845:26:22", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "11865:5:22" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "11859:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "11859:12:22" + }, + "variables": [ + { + "name": "length", + "nodeType": "YulTypedName", + "src": "11849:6:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "11887:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "11892:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "11880:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "11880:19:22" + }, + "nodeType": "YulExpressionStatement", + "src": "11880:19:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "11908:10:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11917:1:22", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nodeType": "YulTypedName", + "src": "11912:1:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "11979:110:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "11993:14:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12003:4:22", + "type": "", + "value": "0x20" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "11997:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12035:3:22" + }, + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "12040:1:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12031:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12031:11:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "12044:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12027:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12027:20:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "12063:5:22" + }, + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "12070:1:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12059:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12059:13:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "12074:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12055:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12055:22:22" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "12049:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "12049:29:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12020:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12020:59:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12020:59:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "11938:1:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "11941:6:22" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "11935:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "11935:13:22" + }, + "nodeType": "YulForLoop", + "post": { + "nodeType": "YulBlock", + "src": "11949:21:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "11951:17:22", + "value": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "11960:1:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "11963:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "11956:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "11956:12:22" + }, + "variableNames": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "11951:1:22" + } + ] + } + ] + }, + "pre": { + "nodeType": "YulBlock", + "src": "11931:3:22", + "statements": [] + }, + "src": "11927:162:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12113:3:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "12118:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12109:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12109:16:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12127:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12105:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12105:27:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12134:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12098:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12098:38:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12098:38:22" + }, + { + "nodeType": "YulAssignment", + "src": "12145:116:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12160:3:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "12173:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12181:2:22", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12169:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12169:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12186:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "12165:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12165:88:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12156:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12156:98:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12256:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12152:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12152:109:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "12145:3:22" + } + ] + } + ] + }, + "name": "abi_encode_bytes", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "11812:5:22", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "11819:3:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "11827:3:22", + "type": "" + } + ], + "src": "11786:481:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "12391:98:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12408:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12419:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12401:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12401:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12401:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "12431:52:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "12456:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "12468:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12479:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12464:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12464:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes", + "nodeType": "YulIdentifier", + "src": "12439:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "12439:44:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "12431:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "12360:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "12371:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "12382:4:22", + "type": "" + } + ], + "src": "12272:217:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "12770:315:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12787:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12792:66:22", + "type": "", + "value": "0x1901000000000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12780:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12780:79:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12780:79:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12879:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12884:1:22", + "type": "", + "value": "2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12875:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12875:11:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "12888:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12868:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12868:27:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12868:27:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "12915:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12920:2:22", + "type": "", + "value": "34" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "12911:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12911:12:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12933:2:22", + "type": "", + "value": "96" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "12937:6:22" + } + ], + "functionName": { + "name": "shl", + "nodeType": "YulIdentifier", + "src": "12929:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12929:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "12946:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "12925:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "12925:88:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "12904:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "12904:110:22" + }, + "nodeType": "YulExpressionStatement", + "src": "12904:110:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "13034:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13039:2:22", + "type": "", + "value": "54" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13030:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13030:12:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "13044:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13023:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13023:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13023:28:22" + }, + { + "nodeType": "YulAssignment", + "src": "13060:19:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "13071:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13076:2:22", + "type": "", + "value": "86" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13067:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13067:12:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "13060:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_uint256_t_address_t_bytes32__to_t_string_memory_ptr_t_uint256_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "12730:3:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "12735:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "12743:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "12751:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "12762:3:22", + "type": "" + } + ], + "src": "12494:591:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13196:281:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "13206:51:22", + "value": { + "arguments": [ + { + "name": "ptr_to_tail", + "nodeType": "YulIdentifier", + "src": "13245:11:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "13232:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "13232:25:22" + }, + "variables": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulTypedName", + "src": "13210:18:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13405:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13414:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13417:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "13407:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13407:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13407:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "13280:18:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "13308:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "13308:14:22" + }, + { + "name": "base_ref", + "nodeType": "YulIdentifier", + "src": "13324:8:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "13304:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13304:29:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13335:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13300:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13300:102:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "13276:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13276:127:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "13269:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13269:135:22" + }, + "nodeType": "YulIf", + "src": "13266:155:22" + }, + { + "nodeType": "YulAssignment", + "src": "13430:41:22", + "value": { + "arguments": [ + { + "name": "base_ref", + "nodeType": "YulIdentifier", + "src": "13442:8:22" + }, + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "13452:18:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13438:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13438:33:22" + }, + "variableNames": [ + { + "name": "addr", + "nodeType": "YulIdentifier", + "src": "13430:4:22" + } + ] + } + ] + }, + "name": "access_calldata_tail_t_struct$_Transaction_$1292_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "base_ref", + "nodeType": "YulTypedName", + "src": "13161:8:22", + "type": "" + }, + { + "name": "ptr_to_tail", + "nodeType": "YulTypedName", + "src": "13171:11:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "addr", + "nodeType": "YulTypedName", + "src": "13187:4:22", + "type": "" + } + ], + "src": "13090:387:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13549:113:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "13595:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13604:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13607:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "13597:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13597:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13597:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "13570:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13579:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "13566:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13566:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13591:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "13562:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13562:32:22" + }, + "nodeType": "YulIf", + "src": "13559:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "13620:36:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13646:9:22" + } + ], + "functionName": { + "name": "abi_decode_bool", + "nodeType": "YulIdentifier", + "src": "13630:15:22" + }, + "nodeType": "YulFunctionCall", + "src": "13630:26:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "13620:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bool", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "13515:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "13526:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "13538:6:22", + "type": "" + } + ], + "src": "13482:180:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "13824:162:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "13834:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13846:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13857:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13842:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13842:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "13834:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13876:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "13887:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13869:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13869:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13869:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13914:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13925:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13910:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13910:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "13930:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13903:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13903:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13903:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "13957:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "13968:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "13953:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "13953:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "13973:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "13946:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "13946:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "13946:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256_t_uint256__to_t_uint256_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "13777:9:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "13788:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "13796:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "13804:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "13815:4:22", + "type": "" + } + ], + "src": "13667:319:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14061:116:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "14107:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14116:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14119:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14109:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14109:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14109:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "14082:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "14091:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "14078:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14078:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14103:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "14074:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14074:32:22" + }, + "nodeType": "YulIf", + "src": "14071:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "14132:39:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "14161:9:22" + } + ], + "functionName": { + "name": "abi_decode_address", + "nodeType": "YulIdentifier", + "src": "14142:18:22" + }, + "nodeType": "YulFunctionCall", + "src": "14142:29:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "14132:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "14027:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "14038:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "14050:6:22", + "type": "" + } + ], + "src": "13991:186:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14276:486:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "14286:51:22", + "value": { + "arguments": [ + { + "name": "ptr_to_tail", + "nodeType": "YulIdentifier", + "src": "14325:11:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "14312:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "14312:25:22" + }, + "variables": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulTypedName", + "src": "14290:18:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14485:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14494:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14497:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14487:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14487:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14487:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "14360:18:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "14388:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "14388:14:22" + }, + { + "name": "base_ref", + "nodeType": "YulIdentifier", + "src": "14404:8:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "14384:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14384:29:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14415:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14380:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14380:102:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "14356:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14356:127:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "14349:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14349:135:22" + }, + "nodeType": "YulIf", + "src": "14346:155:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "14510:47:22", + "value": { + "arguments": [ + { + "name": "base_ref", + "nodeType": "YulIdentifier", + "src": "14528:8:22" + }, + { + "name": "rel_offset_of_tail", + "nodeType": "YulIdentifier", + "src": "14538:18:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14524:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14524:33:22" + }, + "variables": [ + { + "name": "addr_1", + "nodeType": "YulTypedName", + "src": "14514:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "14566:30:22", + "value": { + "arguments": [ + { + "name": "addr_1", + "nodeType": "YulIdentifier", + "src": "14589:6:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "14576:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "14576:20:22" + }, + "variableNames": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "14566:6:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14639:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14648:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14651:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14641:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14641:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14641:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "14611:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14619:18:22", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "14608:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "14608:30:22" + }, + "nodeType": "YulIf", + "src": "14605:50:22" + }, + { + "nodeType": "YulAssignment", + "src": "14664:25:22", + "value": { + "arguments": [ + { + "name": "addr_1", + "nodeType": "YulIdentifier", + "src": "14676:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14684:4:22", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "14672:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14672:17:22" + }, + "variableNames": [ + { + "name": "addr", + "nodeType": "YulIdentifier", + "src": "14664:4:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14740:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14749:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14752:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14742:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14742:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14742:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "addr", + "nodeType": "YulIdentifier", + "src": "14705:4:22" + }, + { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "calldatasize", + "nodeType": "YulIdentifier", + "src": "14715:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "14715:14:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "14731:6:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "14711:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14711:27:22" + } + ], + "functionName": { + "name": "sgt", + "nodeType": "YulIdentifier", + "src": "14701:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "14701:38:22" + }, + "nodeType": "YulIf", + "src": "14698:58:22" + } + ] + }, + "name": "access_calldata_tail_t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "base_ref", + "nodeType": "YulTypedName", + "src": "14233:8:22", + "type": "" + }, + { + "name": "ptr_to_tail", + "nodeType": "YulTypedName", + "src": "14243:11:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "addr", + "nodeType": "YulTypedName", + "src": "14259:4:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "14265:6:22", + "type": "" + } + ], + "src": "14182:580:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "14799:152:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14816:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14819:77:22", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "14809:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14809:88:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14809:88:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14913:1:22", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14916:4:22", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "14906:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14906:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14906:15:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14937:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "14940:4:22", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "14930:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "14930:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "14930:15:22" + } + ] + }, + "name": "panic_error_0x11", + "nodeType": "YulFunctionDefinition", + "src": "14767:184:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15003:148:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "15094:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "15096:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "15096:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15096:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "15019:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15026:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "15016:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "15016:77:22" + }, + "nodeType": "YulIf", + "src": "15013:103:22" + }, + { + "nodeType": "YulAssignment", + "src": "15125:20:22", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "15136:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15143:1:22", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15132:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15132:13:22" + }, + "variableNames": [ + { + "name": "ret", + "nodeType": "YulIdentifier", + "src": "15125:3:22" + } + ] + } + ] + }, + "name": "increment_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "14985:5:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "ret", + "nodeType": "YulTypedName", + "src": "14995:3:22", + "type": "" + } + ], + "src": "14956:195:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15286:201:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "15324:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15333:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15336:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "15326:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15326:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15326:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "startIndex", + "nodeType": "YulIdentifier", + "src": "15302:10:22" + }, + { + "name": "endIndex", + "nodeType": "YulIdentifier", + "src": "15314:8:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "15299:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "15299:24:22" + }, + "nodeType": "YulIf", + "src": "15296:44:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15373:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15382:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15385:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "15375:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15375:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15375:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "endIndex", + "nodeType": "YulIdentifier", + "src": "15355:8:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "15365:6:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "15352:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "15352:20:22" + }, + "nodeType": "YulIf", + "src": "15349:40:22" + }, + { + "nodeType": "YulAssignment", + "src": "15398:36:22", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "15415:6:22" + }, + { + "name": "startIndex", + "nodeType": "YulIdentifier", + "src": "15423:10:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15411:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15411:23:22" + }, + "variableNames": [ + { + "name": "offsetOut", + "nodeType": "YulIdentifier", + "src": "15398:9:22" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "15443:38:22", + "value": { + "arguments": [ + { + "name": "endIndex", + "nodeType": "YulIdentifier", + "src": "15460:8:22" + }, + { + "name": "startIndex", + "nodeType": "YulIdentifier", + "src": "15470:10:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "15456:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15456:25:22" + }, + "variableNames": [ + { + "name": "lengthOut", + "nodeType": "YulIdentifier", + "src": "15443:9:22" + } + ] + } + ] + }, + "name": "calldata_array_index_range_access_t_bytes_calldata_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "15220:6:22", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "15228:6:22", + "type": "" + }, + { + "name": "startIndex", + "nodeType": "YulTypedName", + "src": "15236:10:22", + "type": "" + }, + { + "name": "endIndex", + "nodeType": "YulTypedName", + "src": "15248:8:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "offsetOut", + "nodeType": "YulTypedName", + "src": "15261:9:22", + "type": "" + }, + { + "name": "lengthOut", + "nodeType": "YulTypedName", + "src": "15272:9:22", + "type": "" + } + ], + "src": "15156:331:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15540:77:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "15550:16:22", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "15561:1:22" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "15564:1:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15557:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15557:9:22" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "15550:3:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15589:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "15591:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "15591:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15591:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "15581:1:22" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "15584:3:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "15578:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "15578:10:22" + }, + "nodeType": "YulIf", + "src": "15575:36:22" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "15523:1:22", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "15526:1:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "15532:3:22", + "type": "" + } + ], + "src": "15492:125:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "15813:201:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "15830:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15841:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "15823:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15823:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15823:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "15853:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "15887:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "15895:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "15907:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15918:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15903:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15903:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "15861:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "15861:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "15853:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "15942:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15953:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15938:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15938:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "15958:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "15931:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15931:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15931:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "15985:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "15996:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "15981:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "15981:18:22" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "16001:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "15974:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "15974:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "15974:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr_slice_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "15758:9:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "15769:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "15777:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "15785:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "15793:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "15804:4:22", + "type": "" + } + ], + "src": "15622:392:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "16148:119:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "16158:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16170:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16181:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16166:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16166:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "16158:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16200:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "16211:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16193:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16193:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16193:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16238:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16249:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16234:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16234:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "16254:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16227:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16227:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16227:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "16109:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "16120:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "16128:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "16139:4:22", + "type": "" + } + ], + "src": "16019:248:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "16401:119:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "16411:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16423:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16434:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16419:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16419:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "16411:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16453:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "16464:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16446:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16446:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16446:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16491:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16502:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16487:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16487:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "16507:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16480:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16480:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16480:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "16362:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "16373:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "16381:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "16392:4:22", + "type": "" + } + ], + "src": "16272:248:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "16672:141:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16689:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "16700:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16682:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16682:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16682:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16727:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16738:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16723:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16723:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16743:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "16716:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "16716:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "16716:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "16755:52:22", + "value": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "16780:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "16792:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "16803:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "16788:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "16788:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes", + "nodeType": "YulIdentifier", + "src": "16763:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "16763:44:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "16755:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "16633:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "16644:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "16652:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "16663:4:22", + "type": "" + } + ], + "src": "16525:288:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17009:250:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17026:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "17037:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17019:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17019:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17019:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17064:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17075:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17060:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17060:18:22" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "17084:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17092:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "17080:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17080:55:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17053:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17053:83:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17053:83:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17156:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17167:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17152:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17152:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17172:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17145:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17145:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17145:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "17184:69:22", + "value": { + "arguments": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "17218:6:22" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "17226:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17238:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17249:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17234:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17234:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "17192:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "17192:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "17184:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_address_t_bytes_calldata_ptr_slice__to_t_bytes32_t_address_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "16954:9:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "16965:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "16973:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "16981:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "16989:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "17000:4:22", + "type": "" + } + ], + "src": "16818:441:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17393:115:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17410:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17421:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17403:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17403:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17403:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "17433:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "17467:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "17475:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17487:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17498:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17483:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17483:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "17441:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "17441:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "17433:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "17354:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "17365:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "17373:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "17384:4:22", + "type": "" + } + ], + "src": "17264:244:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17562:79:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "17572:17:22", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "17584:1:22" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "17587:1:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "17580:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17580:9:22" + }, + "variableNames": [ + { + "name": "diff", + "nodeType": "YulIdentifier", + "src": "17572:4:22" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17613:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "17615:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "17615:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17615:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "diff", + "nodeType": "YulIdentifier", + "src": "17604:4:22" + }, + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "17610:1:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "17601:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "17601:11:22" + }, + "nodeType": "YulIf", + "src": "17598:37:22" + } + ] + }, + "name": "checked_sub_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "17544:1:22", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "17547:1:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "diff", + "nodeType": "YulTypedName", + "src": "17553:4:22", + "type": "" + } + ], + "src": "17513:128:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "17803:158:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17820:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17831:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17813:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17813:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17813:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "17843:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "17877:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "17885:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17897:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17908:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17893:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17893:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "17851:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "17851:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "17843:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "17932:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "17943:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "17928:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "17928:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "17948:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "17921:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "17921:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "17921:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr_t_bytes32__to_t_bytes_memory_ptr_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "17756:9:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "17767:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "17775:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "17783:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "17794:4:22", + "type": "" + } + ], + "src": "17646:315:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "18121:169:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18138:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18149:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18131:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18131:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18131:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "18161:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "18195:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "18203:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18215:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18226:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18211:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18211:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "18169:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "18169:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "18161:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18250:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18261:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18246:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18246:18:22" + }, + { + "arguments": [ + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "18270:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18278:4:22", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "18266:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18266:17:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18239:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18239:45:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18239:45:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr_t_uint8__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "18074:9:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "18085:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "18093:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "18101:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "18112:4:22", + "type": "" + } + ], + "src": "17966:324:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "18476:217:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "18486:27:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18498:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18509:3:22", + "type": "", + "value": "128" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18494:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18494:19:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "18486:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18529:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "18540:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18522:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18522:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18522:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18567:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18578:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18563:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18563:18:22" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "18587:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18595:4:22", + "type": "", + "value": "0xff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "18583:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18583:17:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18556:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18556:45:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18556:45:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18621:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18632:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18617:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18617:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "18637:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18610:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18610:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18610:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "18664:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18675:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "18660:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "18660:18:22" + }, + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "18680:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18653:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18653:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18653:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "18421:9:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "18432:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "18440:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "18448:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "18456:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "18467:4:22", + "type": "" + } + ], + "src": "18295:398:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "18918:160:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "18935:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "18940:66:22", + "type": "", + "value": "0x19457468657265756d205369676e6564204d6573736167653a0a333200000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "18928:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "18928:79:22" + }, + "nodeType": "YulExpressionStatement", + "src": "18928:79:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "19027:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19032:2:22", + "type": "", + "value": "28" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19023:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19023:12:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "19037:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19016:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19016:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19016:28:22" + }, + { + "nodeType": "YulAssignment", + "src": "19053:19:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "19064:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19069:2:22", + "type": "", + "value": "60" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19060:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19060:12:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "19053:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "18894:3:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "18899:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "18910:3:22", + "type": "" + } + ], + "src": "18698:380:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "19262:217:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19279:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19290:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19272:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19272:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19272:21:22" + }, + { + "nodeType": "YulAssignment", + "src": "19302:69:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "19336:6:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "19344:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19356:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19367:2:22", + "type": "", + "value": "96" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19352:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19352:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "19310:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "19310:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "19302:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19391:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19402:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19387:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19387:18:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "19407:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19380:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19380:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19380:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19434:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19445:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19430:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19430:18:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value3", + "nodeType": "YulIdentifier", + "src": "19464:6:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "19457:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19457:14:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "19450:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19450:22:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19423:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19423:50:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19423:50:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes_calldata_ptr_t_uint256_t_bool__to_t_bytes_memory_ptr_t_uint256_t_bool__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "19207:9:22", + "type": "" + }, + { + "name": "value3", + "nodeType": "YulTypedName", + "src": "19218:6:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "19226:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "19234:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "19242:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "19253:4:22", + "type": "" + } + ], + "src": "19083:396:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "19647:158:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19664:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "19675:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19657:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19657:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19657:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19702:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19713:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19698:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19698:18:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19718:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "19691:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19691:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19691:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "19730:69:22", + "value": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "19764:6:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "19772:6:22" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19784:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19795:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "19780:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19780:18:22" + } + ], + "functionName": { + "name": "abi_encode_bytes_calldata", + "nodeType": "YulIdentifier", + "src": "19738:25:22" + }, + "nodeType": "YulFunctionCall", + "src": "19738:61:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "19730:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes_calldata_ptr_slice__to_t_bytes32_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "19600:9:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "19611:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "19619:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "19627:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "19638:4:22", + "type": "" + } + ], + "src": "19484:321:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "19890:169:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "19936:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19945:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19948:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "19938:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "19938:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19938:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "19911:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19920:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "19907:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19907:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "19932:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "19903:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "19903:32:22" + }, + "nodeType": "YulIf", + "src": "19900:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "19961:29:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "19980:9:22" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "19974:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "19974:16:22" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "19965:5:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "20023:5:22" + } + ], + "functionName": { + "name": "validator_revert_bytes4", + "nodeType": "YulIdentifier", + "src": "19999:23:22" + }, + "nodeType": "YulFunctionCall", + "src": "19999:30:22" + }, + "nodeType": "YulExpressionStatement", + "src": "19999:30:22" + }, + { + "nodeType": "YulAssignment", + "src": "20038:15:22", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "20048:5:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "20038:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes4_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "19856:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "19867:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "19879:6:22", + "type": "" + } + ], + "src": "19810:249:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "20340:235:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20357:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20362:66:22", + "type": "", + "value": "0x53657175656e6365206e657374656420636f6e6669673a0a0000000000000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20350:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20350:79:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20350:79:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20449:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20454:2:22", + "type": "", + "value": "24" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20445:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20445:12:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "20459:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20438:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20438:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20438:28:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20486:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20491:2:22", + "type": "", + "value": "56" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20482:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20482:12:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "20496:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20475:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20475:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20475:28:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20523:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20528:2:22", + "type": "", + "value": "88" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20519:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20519:12:22" + }, + { + "name": "value2", + "nodeType": "YulIdentifier", + "src": "20533:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20512:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20512:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20512:28:22" + }, + { + "nodeType": "YulAssignment", + "src": "20549:20:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20560:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20565:3:22", + "type": "", + "value": "120" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20556:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20556:13:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "20549:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_58d1832f15932b40f8da147bd99ac98efab990f25a786a2229b05ee5f5be41a7_t_bytes32_t_uint256_t_uint256__to_t_string_memory_ptr_t_bytes32_t_uint256_t_uint256__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "20300:3:22", + "type": "" + }, + { + "name": "value2", + "nodeType": "YulTypedName", + "src": "20305:6:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "20313:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "20321:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "20332:3:22", + "type": "" + } + ], + "src": "20064:511:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "20800:160:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20817:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20822:66:22", + "type": "", + "value": "0x53657175656e636520737461746963206469676573743a0a0000000000000000" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20810:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20810:79:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20810:79:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20909:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20914:2:22", + "type": "", + "value": "24" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20905:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20905:12:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "20919:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "20898:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "20898:28:22" + }, + "nodeType": "YulExpressionStatement", + "src": "20898:28:22" + }, + { + "nodeType": "YulAssignment", + "src": "20935:19:22", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "20946:3:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "20951:2:22", + "type": "", + "value": "56" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "20942:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "20942:12:22" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "20935:3:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_packed_t_stringliteral_583557e68bca91e5400591dbc9ae31043113c95e3cd985463ae532f51d706f8c_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "20776:3:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "20781:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "20792:3:22", + "type": "" + } + ], + "src": "20580:380:22" + } + ] + }, + "contents": "{\n { }\n function validator_revert_bytes4(value)\n {\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n validator_revert_bytes4(value)\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_decode_bytes_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, length), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_bytes32t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n value0 := calldataload(headStart)\n let offset := calldataload(add(headStart, 32))\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value1_1, value2_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value1 := value1_1\n value2 := value2_1\n }\n function abi_encode_tuple_t_bytes4__to_t_bytes4__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffff00000000000000000000000000000000000000000000000000000000))\n }\n function abi_decode_tuple_t_bytes_calldata_ptrt_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3\n {\n if slt(sub(dataEnd, headStart), 64) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_bytes_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n let offset_1 := calldataload(add(headStart, 32))\n if gt(offset_1, _1) { revert(0, 0) }\n let value2_1, value3_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value2 := value2_1\n value3 := value3_1\n }\n function abi_decode_tuple_t_bytes32(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_bytes32__to_t_bytes32__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_decode_array_struct_Transaction_calldata_dyn_calldata(offset, end) -> arrayPos, length\n {\n if iszero(slt(add(offset, 0x1f), end)) { revert(0, 0) }\n length := calldataload(offset)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n arrayPos := add(offset, 0x20)\n if gt(add(add(offset, shl(5, length)), 0x20), end) { revert(0, 0) }\n }\n function abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n if gt(offset, 0xffffffffffffffff) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_Transaction_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n }\n function abi_decode_tuple_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptrt_uint256t_bytes_calldata_ptr(headStart, dataEnd) -> value0, value1, value2, value3, value4\n {\n if slt(sub(dataEnd, headStart), 96) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let value0_1, value1_1 := abi_decode_array_struct_Transaction_calldata_dyn_calldata(add(headStart, offset), dataEnd)\n value0 := value0_1\n value1 := value1_1\n value2 := calldataload(add(headStart, 32))\n let offset_1 := calldataload(add(headStart, 64))\n if gt(offset_1, _1) { revert(0, 0) }\n let value3_1, value4_1 := abi_decode_bytes_calldata(add(headStart, offset_1), dataEnd)\n value3 := value3_1\n value4 := value4_1\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__to_t_uint256_t_uint256_t_bytes32_t_bytes32_t_uint256__fromStack_reversed(headStart, value4, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 160)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n mstore(add(headStart, 128), value4)\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_bytes_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 32), add(_2, 32), _3)\n mstore(add(add(memPtr, _3), 32), 0)\n value0 := memPtr\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_packed_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__nonPadded_inplace_fromStack_reversed(pos, value1, value0) -> end\n {\n calldatacopy(pos, value0, value1)\n let _1 := add(pos, value1)\n mstore(_1, 0)\n end := _1\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n function abi_decode_bool(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, iszero(iszero(value)))) { revert(0, 0) }\n }\n function abi_decode_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, 0xffffffffffffffffffffffffffffffffffffffff))) { revert(0, 0) }\n }\n function abi_encode_bytes_calldata(start, length, pos) -> end\n {\n mstore(pos, length)\n calldatacopy(add(pos, 0x20), start, length)\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_array_struct_Transaction_calldata_dyn_calldata(value, length, pos) -> end\n {\n mstore(pos, length)\n let _1 := 0x20\n let updated_pos := add(pos, _1)\n let pos_1 := updated_pos\n pos := updated_pos\n let tail := add(pos_1, shl(5, length))\n let srcPtr := value\n let i := 0\n for { } lt(i, length) { i := add(i, 1) }\n {\n mstore(pos, sub(tail, pos_1))\n let rel_offset_of_tail := calldataload(srcPtr)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), value), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41))) { revert(0, 0) }\n let value_1 := add(rel_offset_of_tail, value)\n let _2 := 0xc0\n mstore(tail, iszero(iszero(abi_decode_bool(value_1))))\n mstore(add(tail, _1), iszero(iszero(abi_decode_bool(add(value_1, _1)))))\n let _3 := 0x40\n mstore(add(tail, _3), calldataload(add(value_1, _3)))\n let _4 := 0x60\n mstore(add(tail, _4), and(abi_decode_address(add(value_1, _4)), 0xffffffffffffffffffffffffffffffffffffffff))\n let _5 := 0x80\n mstore(add(tail, _5), calldataload(add(value_1, _5)))\n let _6 := 0xa0\n let rel_offset_of_tail_1 := calldataload(add(value_1, _6))\n if iszero(slt(rel_offset_of_tail_1, add(sub(calldatasize(), value_1), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let value_2 := add(rel_offset_of_tail_1, value_1)\n let length_1 := calldataload(value_2)\n let value_3 := add(value_2, _1)\n if gt(length_1, 0xffffffffffffffff) { revert(0, 0) }\n if sgt(value_3, sub(calldatasize(), length_1)) { revert(0, 0) }\n mstore(add(tail, _6), _2)\n tail := abi_encode_bytes_calldata(value_3, length_1, add(tail, _2))\n srcPtr := add(srcPtr, _1)\n pos := add(pos, _1)\n }\n end := tail\n }\n function abi_encode_tuple_t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n mstore(add(headStart, 64), 5)\n mstore(add(headStart, 96), \"self:\")\n mstore(add(headStart, 0x20), 128)\n tail := abi_encode_array_struct_Transaction_calldata_dyn_calldata(value0, value1, add(headStart, 128))\n }\n function abi_encode_tuple_t_stringliteral_4dfa0bed92fb5c2df0b47ce555e6e6b89f746e856aa9783c634a4987edcbf682_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr__to_t_string_memory_ptr_t_array$_t_struct$_Transaction_$1292_memory_ptr_$dyn_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 64)\n mstore(add(headStart, 64), 6)\n mstore(add(headStart, 96), \"guest:\")\n mstore(add(headStart, 0x20), 128)\n tail := abi_encode_array_struct_Transaction_calldata_dyn_calldata(value0, value1, add(headStart, 128))\n }\n function panic_error_0x32()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x32)\n revert(0, 0x24)\n }\n function abi_encode_tuple_t_bytes1__to_t_bytes1__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff00000000000000000000000000000000000000000000000000000000000000))\n }\n function abi_encode_bytes(value, pos) -> end\n {\n let length := mload(value)\n mstore(pos, length)\n let i := 0\n for { } lt(i, length) { i := add(i, 0x20) }\n {\n let _1 := 0x20\n mstore(add(add(pos, i), _1), mload(add(add(value, i), _1)))\n }\n mstore(add(add(pos, length), 0x20), 0)\n end := add(add(pos, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20)\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes(value0, add(headStart, 32))\n }\n function abi_encode_tuple_packed_t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541_t_uint256_t_address_t_bytes32__to_t_string_memory_ptr_t_uint256_t_address_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value2, value1, value0) -> end\n {\n mstore(pos, 0x1901000000000000000000000000000000000000000000000000000000000000)\n mstore(add(pos, 2), value0)\n mstore(add(pos, 34), and(shl(96, value1), 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000))\n mstore(add(pos, 54), value2)\n end := add(pos, 86)\n }\n function access_calldata_tail_t_struct$_Transaction_$1292_calldata_ptr(base_ref, ptr_to_tail) -> addr\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41))) { revert(0, 0) }\n addr := add(base_ref, rel_offset_of_tail)\n }\n function abi_decode_tuple_t_bool(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_bool(headStart)\n }\n function abi_encode_tuple_t_uint256_t_uint256_t_uint256__to_t_uint256_t_uint256_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n tail := add(headStart, 96)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n mstore(add(headStart, 64), value2)\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := abi_decode_address(headStart)\n }\n function access_calldata_tail_t_bytes_calldata_ptr(base_ref, ptr_to_tail) -> addr, length\n {\n let rel_offset_of_tail := calldataload(ptr_to_tail)\n if iszero(slt(rel_offset_of_tail, add(sub(calldatasize(), base_ref), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1))) { revert(0, 0) }\n let addr_1 := add(base_ref, rel_offset_of_tail)\n length := calldataload(addr_1)\n if gt(length, 0xffffffffffffffff) { revert(0, 0) }\n addr := add(addr_1, 0x20)\n if sgt(addr, sub(calldatasize(), length)) { revert(0, 0) }\n }\n function panic_error_0x11()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function increment_t_uint256(value) -> ret\n {\n if eq(value, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) { panic_error_0x11() }\n ret := add(value, 1)\n }\n function calldata_array_index_range_access_t_bytes_calldata_ptr(offset, length, startIndex, endIndex) -> offsetOut, lengthOut\n {\n if gt(startIndex, endIndex) { revert(0, 0) }\n if gt(endIndex, length) { revert(0, 0) }\n offsetOut := add(offset, startIndex)\n lengthOut := sub(endIndex, startIndex)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n sum := add(x, y)\n if gt(x, sum) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_slice_t_uint256_t_uint256__to_t_bytes_memory_ptr_t_uint256_t_uint256__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 96)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 96))\n mstore(add(headStart, 32), value2)\n mstore(add(headStart, 64), value3)\n }\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n function abi_encode_tuple_t_uint256_t_bytes_memory_ptr__to_t_uint256_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes(value1, add(headStart, 64))\n }\n function abi_encode_tuple_t_bytes32_t_address_t_bytes_calldata_ptr_slice__to_t_bytes32_t_address_t_bytes_memory_ptr__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(headStart, 64), 96)\n tail := abi_encode_bytes_calldata(value2, value3, add(headStart, 96))\n }\n function abi_encode_tuple_t_bytes_calldata_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value1, value0) -> tail\n {\n mstore(headStart, 32)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 32))\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n diff := sub(x, y)\n if gt(diff, x) { panic_error_0x11() }\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_t_bytes32__to_t_bytes_memory_ptr_t_bytes32__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 64))\n mstore(add(headStart, 32), value2)\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_t_uint8__to_t_bytes_memory_ptr_t_uint256__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, 64)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 64))\n mstore(add(headStart, 32), and(value2, 0xff))\n }\n function abi_encode_tuple_t_bytes32_t_uint8_t_bytes32_t_bytes32__to_t_bytes32_t_uint8_t_bytes32_t_bytes32__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n tail := add(headStart, 128)\n mstore(headStart, value0)\n mstore(add(headStart, 32), and(value1, 0xff))\n mstore(add(headStart, 64), value2)\n mstore(add(headStart, 96), value3)\n }\n function abi_encode_tuple_packed_t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000)\n mstore(add(pos, 28), value0)\n end := add(pos, 60)\n }\n function abi_encode_tuple_t_bytes_calldata_ptr_t_uint256_t_bool__to_t_bytes_memory_ptr_t_uint256_t_bool__fromStack_reversed(headStart, value3, value2, value1, value0) -> tail\n {\n mstore(headStart, 96)\n tail := abi_encode_bytes_calldata(value0, value1, add(headStart, 96))\n mstore(add(headStart, 32), value2)\n mstore(add(headStart, 64), iszero(iszero(value3)))\n }\n function abi_encode_tuple_t_bytes32_t_bytes_calldata_ptr_slice__to_t_bytes32_t_bytes_memory_ptr__fromStack_reversed(headStart, value2, value1, value0) -> tail\n {\n mstore(headStart, value0)\n mstore(add(headStart, 32), 64)\n tail := abi_encode_bytes_calldata(value1, value2, add(headStart, 64))\n }\n function abi_decode_tuple_t_bytes4_fromMemory(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := mload(headStart)\n validator_revert_bytes4(value)\n value0 := value\n }\n function abi_encode_tuple_packed_t_stringliteral_58d1832f15932b40f8da147bd99ac98efab990f25a786a2229b05ee5f5be41a7_t_bytes32_t_uint256_t_uint256__to_t_string_memory_ptr_t_bytes32_t_uint256_t_uint256__nonPadded_inplace_fromStack_reversed(pos, value2, value1, value0) -> end\n {\n mstore(pos, 0x53657175656e6365206e657374656420636f6e6669673a0a0000000000000000)\n mstore(add(pos, 24), value0)\n mstore(add(pos, 56), value1)\n mstore(add(pos, 88), value2)\n end := add(pos, 120)\n }\n function abi_encode_tuple_packed_t_stringliteral_583557e68bca91e5400591dbc9ae31043113c95e3cd985463ae532f51d706f8c_t_bytes32__to_t_string_memory_ptr_t_bytes32__nonPadded_inplace_fromStack_reversed(pos, value0) -> end\n {\n mstore(pos, 0x53657175656e636520737461746963206469676573743a0a0000000000000000)\n mstore(add(pos, 24), value0)\n end := add(pos, 56)\n }\n}", + "id": 22, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600436106100bc5760003560e01c806361c2926c116100745780638c3f55631161004e5780638c3f55631461025357806390042baf14610273578063affed0e0146102ab57600080fd5b806361c2926c146101cb5780637a9a1628146101eb578063853c50681461020b57600080fd5b806320c13b0b116100a557806320c13b0b14610147578063295614261461016757806357c56d6b1461018957600080fd5b806301ffc9a7146100c15780631626ba7e146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc366004611880565b6102c0565b60405190151581526020015b60405180910390f35b34801561010257600080fd5b506101166101113660046118e6565b6102d1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016100ed565b34801561015357600080fd5b50610116610162366004611932565b61031e565b34801561017357600080fd5b5061018761018236600461199e565b610383565b005b34801561019557600080fd5b506101bd7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d181565b6040519081526020016100ed565b3480156101d757600080fd5b506101876101e63660046119fc565b6103d5565b3480156101f757600080fd5b50610187610206366004611a3e565b61041a565b34801561021757600080fd5b5061022b6102263660046118e6565b610447565b604080519586526020860194909452928401919091526060830152608082015260a0016100ed565b34801561025f57600080fd5b506101bd61026e36600461199e565b61060f565b610286610281366004611ae7565b61063b565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b3480156102b757600080fd5b506101bd610725565b60006102cb82610736565b92915050565b6000806102df858585610792565b509050801561031157507f1626ba7e000000000000000000000000000000000000000000000000000000009050610317565b50600090505b9392505050565b6000806103438686604051610334929190611bb6565b60405180910390208585610792565b509050801561037557507f20c13b0b00000000000000000000000000000000000000000000000000000000905061037b565b50600090505b949350505050565b3330146103c9576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b6103d2816107ca565b50565b600061040883836040516020016103ed929190611d97565b604051602081830303815290604052805190602001206107fc565b9050610415818484610881565b505050565b600061043286866040516020016103ed929190611ddf565b905061043f818787610881565b505050505050565b6000806000806000808787600081811061046357610463611e27565b909101357fff000000000000000000000000000000000000000000000000000000000000001691508190506104b95761049b896107fc565b92506104a8838989610a0e565b929850909650945091506106049050565b7fff00000000000000000000000000000000000000000000000000000000000000818116016104f8576104eb896107fc565b92506104a8838989610a5f565b7ffe000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082160161054a576104eb89610a8b565b7ffd000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216016105ae5761059e898989610af8565b9550955095509550955050610604565b6040517f6085cd820000000000000000000000000000000000000000000000000000000081527fff00000000000000000000000000000000000000000000000000000000000000821660048201526024016103c0565b939792965093509350565b60006102cb7f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e83610c75565b600033301461067e576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044016103c0565b81516020830134f0905073ffffffffffffffffffffffffffffffffffffffff81166106d757816040517f0d2571910000000000000000000000000000000000000000000000000000000081526004016103c09190611eba565b60405173ffffffffffffffffffffffffffffffffffffffff821681527fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b6000610731600061060f565b905090565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161078957506001919050565b6102cb82610cd3565b60008060008060006107a5888888610447565b509650919450925090508282108015906107bd575060015b9450505050935093915050565b6040517fa038794000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f190100000000000000000000000000000000000000000000000000000000000060208201524660228201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b166042820152605681018290526000906076015b604051602081830303815290604052805190602001209050919050565b8060005b81811015610a0757368484838181106108a0576108a0611e27565b90506020028101906108b29190611ecd565b90506108c16020820182611f0b565b156108fb576040517f230d1ccc000000000000000000000000000000000000000000000000000000008152600481018390526024016103c0565b6040810135805a101561094e5782815a6040517f2bb3e3ba0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016103c0565b60006109886109636080850160608601611f26565b608085013584156109745784610976565b5a5b61098360a0880188611f41565b610d2f565b905080156109cf57877f5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7856040516109c291815260200190565b60405180910390a26109f1565b6109f16109e26040850160208601611f0b565b89866109ec610d4c565b610d6b565b50505080806109ff90611fd5565b915050610885565b5050505050565b6000808080610a2987610a24876006818b61200d565b610db9565b6000908152873560f01c6020818152604080842084526002909a013560e01c908190529890912090999198509695509350505050565b6000808080610a7a87610a75876001818b61200d565b610a0e565b935093509350935093509350935093565b6040517f190100000000000000000000000000000000000000000000000000000000000060208201526000602282018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660428301526056820183905290607601610864565b6000808080806004600188013560e81c82610b138383612037565b9050610b258b61022683868d8f61200d565b939b5091995097509550935087871015610b7d57610b4581848b8d61200d565b89896040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c0949392919061204a565b8092505b88831015610c675760038301928a013560e81c9150610ba08383612037565b90506000610bc2610bb08861124f565b8c8c879086926102269392919061200d565b939c50919a5098509091505088881015610c1a57610be282858c8e61200d565b8a8a6040517fb006aba00000000000000000000000000000000000000000000000000000000081526004016103c0949392919061204a565b848110610c5d576040517f37daf62b00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016103c0565b9350915081610b81565b505050939792965093509350565b6000808383604051602001610c94929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60007fe4a77bbc000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610d2657506001919050565b6102cb82611283565b6000604051828482376000808483898b8af1979650505050505050565b60603d604051915060208201818101604052818352816000823e505090565b8315610d7957805160208201fd5b827fab46c69f7f32e1bf09b0725853da82a211e5402a0600296ab499a2fb5ea3b4198383604051610dab929190612071565b60405180910390a250505050565b60008060005b8381101561124657600181019085013560f81c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101610e6057601582019186013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff81169074ff000000000000000000000000000000000000000016811785610e465780610e55565b60008681526020829052604090205b955050505050610dbf565b80610ef65760018201918681013560f81c906043016000610e8c8a610e8784888c8e61200d565b61136d565b60ff841697909701969194508491905060a083901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff82161786610edb5780610eea565b60008781526020829052604090205b96505050505050610dbf565b6002810361101e576000808784013560f881901c9060581c73ffffffffffffffffffffffffffffffffffffffff16601586019550909250905060008885013560e81c600386018162ffffff169150809650819250505060008186019050610f6f8b848c8c8a908692610f6a9392919061200d565b611630565b610fb7578a83610f8183898d8f61200d565b6040517f9a9462320000000000000000000000000000000000000000000000000000000081526004016103c0949392919061208a565b60ff8416979097019694508460a084901b74ff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617876110025780611011565b60008881526020829052604090205b9750505050505050610dbf565b60038103611051576020820191860135836110395780611048565b60008481526020829052604090205b93505050610dbf565b6004810361109d576003808301928781013560e81c919082010160008061107e8b610a2485898d8f61200d565b60009889526020526040909720969097019650909350610dbf92505050565b600681036111a55760008287013560f81c60018401935060ff16905060008784013560f01c60028501945061ffff16905060008885013560e81c600386018162ffffff16915080965081925050506000818601905060008061110b8d8d8d8b908792610a249392919061200d565b9398508893909250905084821061112157988501985b604080517f53657175656e6365206e657374656420636f6e6669673a0a0000000000000000602080830191909152603882018490526058820188905260788083018a90528351808403909101815260989092019092528051910120896111875780611196565b60008a81526020829052604090205b99505050505050505050610dbf565b600581036112115760208201918601358781036111e0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff94505b60006111eb82611817565b9050846111f85780611207565b60008581526020829052604090205b9450505050610dbf565b6040517fb2505f7c000000000000000000000000000000000000000000000000000000008152600481018290526024016103c0565b50935093915050565b7f8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d160009081526020829052604081206102cb565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fac6a444e00000000000000000000000000000000000000000000000000000000148061131657507fffffffff0000000000000000000000000000000000000000000000000000000082167f36e7817500000000000000000000000000000000000000000000000000000000145b1561132357506001919050565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146102cb565b6000604282146113ad5782826040517f2ee17a3d0000000000000000000000000000000000000000000000000000000081526004016103c09291906120ca565b60006113c66113bd6001856120de565b85013560f81c90565b60ff169050604084013560f81c843560208601357f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081111561143a578686826040517fad4aac760000000000000000000000000000000000000000000000000000000081526004016103c0939291906120f1565b8260ff16601b1415801561145257508260ff16601c14155b1561148f578686846040517fe578897e0000000000000000000000000000000000000000000000000000000081526004016103c093929190612115565b600184036114fc576040805160008152602081018083528a905260ff851691810191909152606081018390526080810182905260019060a0015b6020604051602081039080840390855afa1580156114eb573d6000803e3d6000fd5b5050506020604051035194506115d4565b60028403611599576040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101899052600190605c01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff861690820152606081018490526080810183905260a0016114c9565b86868560016040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c0949392919061213c565b73ffffffffffffffffffffffffffffffffffffffff85166116255786866040517f6c1719d20000000000000000000000000000000000000000000000000000000081526004016103c09291906120ca565b505050509392505050565b600081810361166b576040517fac241e1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838361167a6001826120de565b81811061168957611689611e27565b919091013560f81c91505060018114806116a35750600281145b156116e8578473ffffffffffffffffffffffffffffffffffffffff166116ca87868661136d565b73ffffffffffffffffffffffffffffffffffffffff1614915061180e565b600381036117d35773ffffffffffffffffffffffffffffffffffffffff8516631626ba7e878660008761171c6001826120de565b926117299392919061200d565b6040518463ffffffff1660e01b815260040161174793929190612168565b602060405180830381865afa158015611764573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611788919061218b565b7fffffffff00000000000000000000000000000000000000000000000000000000167f1626ba7e0000000000000000000000000000000000000000000000000000000014915061180e565b83838260006040517f9dfba8520000000000000000000000000000000000000000000000000000000081526004016103c0949392919061213c565b50949350505050565b6040517f53657175656e636520737461746963206469676573743a0a0000000000000000602082015260388101829052600090605801610864565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146103d257600080fd5b60006020828403121561189257600080fd5b813561031781611852565b60008083601f8401126118af57600080fd5b50813567ffffffffffffffff8111156118c757600080fd5b6020830191508360208285010111156118df57600080fd5b9250929050565b6000806000604084860312156118fb57600080fd5b83359250602084013567ffffffffffffffff81111561191957600080fd5b6119258682870161189d565b9497909650939450505050565b6000806000806040858703121561194857600080fd5b843567ffffffffffffffff8082111561196057600080fd5b61196c8883890161189d565b9096509450602087013591508082111561198557600080fd5b506119928782880161189d565b95989497509550505050565b6000602082840312156119b057600080fd5b5035919050565b60008083601f8401126119c957600080fd5b50813567ffffffffffffffff8111156119e157600080fd5b6020830191508360208260051b85010111156118df57600080fd5b60008060208385031215611a0f57600080fd5b823567ffffffffffffffff811115611a2657600080fd5b611a32858286016119b7565b90969095509350505050565b600080600080600060608688031215611a5657600080fd5b853567ffffffffffffffff80821115611a6e57600080fd5b611a7a89838a016119b7565b9097509550602088013594506040880135915080821115611a9a57600080fd5b50611aa78882890161189d565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060208284031215611af957600080fd5b813567ffffffffffffffff80821115611b1157600080fd5b818401915084601f830112611b2557600080fd5b813581811115611b3757611b37611ab8565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b7d57611b7d611ab8565b81604052828152876020848701011115611b9657600080fd5b826020860160208301376000928101602001929092525095945050505050565b8183823760009101908152919050565b80358015158114611bd657600080fd5b919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bd657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b81835260006020808501808196508560051b810191508460005b87811015611d8a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41883603018112611ca157600080fd5b870160c0611cae82611bc6565b15158652611cbd878301611bc6565b15158688015260408281013590870152606073ffffffffffffffffffffffffffffffffffffffff611cef828501611bdb565b16908701526080828101359087015260a080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1018112611d3557600080fd5b90920187810192903567ffffffffffffffff811115611d5357600080fd5b803603841315611d6257600080fd5b8282890152611d748389018286611bff565b9c89019c97505050928601925050600101611c62565b5091979650505050505050565b60408152600560408201527f73656c663a000000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611c48565b60408152600660408201527f67756573743a0000000000000000000000000000000000000000000000000000606082015260806020820152600061037b608083018486611c48565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815180845260005b81811015611e7c57602081850181015186830182015201611e60565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006103176020830184611e56565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff41833603018112611f0157600080fd5b9190910192915050565b600060208284031215611f1d57600080fd5b61031782611bc6565b600060208284031215611f3857600080fd5b61031782611bdb565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f7657600080fd5b83018035915067ffffffffffffffff821115611f9157600080fd5b6020019150368190038213156118df57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361200657612006611fa6565b5060010190565b6000808585111561201d57600080fd5b8386111561202a57600080fd5b5050820193919092039150565b808201808211156102cb576102cb611fa6565b60608152600061205e606083018688611bff565b6020830194909452506040015292915050565b82815260406020820152600061037b6040830184611e56565b84815273ffffffffffffffffffffffffffffffffffffffff841660208201526060604082015260006120c0606083018486611bff565b9695505050505050565b60208152600061037b602083018486611bff565b818103818111156102cb576102cb611fa6565b604081526000612105604083018587611bff565b9050826020830152949350505050565b604081526000612129604083018587611bff565b905060ff83166020830152949350505050565b606081526000612150606083018688611bff565b60208301949094525090151560409091015292915050565b838152604060208201526000612182604083018486611bff565b95945050505050565b60006020828403121561219d57600080fd5b81516103178161185256fea26469706673582212209bb95d18e97f278aa47e0c04c20d5a6af9bdb6d473c6d4051192cd96fc17866864736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xBC JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x61C2926C GT PUSH2 0x74 JUMPI DUP1 PUSH4 0x8C3F5563 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x8C3F5563 EQ PUSH2 0x253 JUMPI DUP1 PUSH4 0x90042BAF EQ PUSH2 0x273 JUMPI DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x2AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x61C2926C EQ PUSH2 0x1CB JUMPI DUP1 PUSH4 0x7A9A1628 EQ PUSH2 0x1EB JUMPI DUP1 PUSH4 0x853C5068 EQ PUSH2 0x20B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x20C13B0B GT PUSH2 0xA5 JUMPI DUP1 PUSH4 0x20C13B0B EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0x29561426 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x57C56D6B EQ PUSH2 0x189 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0xC1 JUMPI DUP1 PUSH4 0x1626BA7E EQ PUSH2 0xF6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE1 PUSH2 0xDC CALLDATASIZE PUSH1 0x4 PUSH2 0x1880 JUMP JUMPDEST PUSH2 0x2C0 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x116 PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x18E6 JUMP JUMPDEST PUSH2 0x2D1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x116 PUSH2 0x162 CALLDATASIZE PUSH1 0x4 PUSH2 0x1932 JUMP JUMPDEST PUSH2 0x31E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x182 CALLDATASIZE PUSH1 0x4 PUSH2 0x199E JUMP JUMPDEST PUSH2 0x383 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH32 0x8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1 DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x1E6 CALLDATASIZE PUSH1 0x4 PUSH2 0x19FC JUMP JUMPDEST PUSH2 0x3D5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x187 PUSH2 0x206 CALLDATASIZE PUSH1 0x4 PUSH2 0x1A3E JUMP JUMPDEST PUSH2 0x41A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x22B PUSH2 0x226 CALLDATASIZE PUSH1 0x4 PUSH2 0x18E6 JUMP JUMPDEST PUSH2 0x447 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP6 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP5 SWAP1 SWAP5 MSTORE SWAP3 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP4 ADD MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH2 0x26E CALLDATASIZE PUSH1 0x4 PUSH2 0x199E JUMP JUMPDEST PUSH2 0x60F JUMP JUMPDEST PUSH2 0x286 PUSH2 0x281 CALLDATASIZE PUSH1 0x4 PUSH2 0x1AE7 JUMP JUMPDEST PUSH2 0x63B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BD PUSH2 0x725 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB DUP3 PUSH2 0x736 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x2DF DUP6 DUP6 DUP6 PUSH2 0x792 JUMP JUMPDEST POP SWAP1 POP DUP1 ISZERO PUSH2 0x311 JUMPI POP PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0x317 JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x343 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH2 0x334 SWAP3 SWAP2 SWAP1 PUSH2 0x1BB6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP6 DUP6 PUSH2 0x792 JUMP JUMPDEST POP SWAP1 POP DUP1 ISZERO PUSH2 0x375 JUMPI POP PUSH32 0x20C13B0B00000000000000000000000000000000000000000000000000000000 SWAP1 POP PUSH2 0x37B JUMP JUMPDEST POP PUSH1 0x0 SWAP1 POP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x3C9 JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3D2 DUP2 PUSH2 0x7CA JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x408 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3ED SWAP3 SWAP2 SWAP1 PUSH2 0x1D97 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH2 0x7FC JUMP JUMPDEST SWAP1 POP PUSH2 0x415 DUP2 DUP5 DUP5 PUSH2 0x881 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x432 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x3ED SWAP3 SWAP2 SWAP1 PUSH2 0x1DDF JUMP JUMPDEST SWAP1 POP PUSH2 0x43F DUP2 DUP8 DUP8 PUSH2 0x881 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 DUP8 DUP8 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0x463 JUMPI PUSH2 0x463 PUSH2 0x1E27 JUMP JUMPDEST SWAP1 SWAP2 ADD CALLDATALOAD PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 AND SWAP2 POP DUP2 SWAP1 POP PUSH2 0x4B9 JUMPI PUSH2 0x49B DUP10 PUSH2 0x7FC JUMP JUMPDEST SWAP3 POP PUSH2 0x4A8 DUP4 DUP10 DUP10 PUSH2 0xA0E JUMP JUMPDEST SWAP3 SWAP9 POP SWAP1 SWAP7 POP SWAP5 POP SWAP2 POP PUSH2 0x604 SWAP1 POP JUMP JUMPDEST PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP2 DUP2 AND ADD PUSH2 0x4F8 JUMPI PUSH2 0x4EB DUP10 PUSH2 0x7FC JUMP JUMPDEST SWAP3 POP PUSH2 0x4A8 DUP4 DUP10 DUP10 PUSH2 0xA5F JUMP JUMPDEST PUSH32 0xFE00000000000000000000000000000000000000000000000000000000000000 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x54A JUMPI PUSH2 0x4EB DUP10 PUSH2 0xA8B JUMP JUMPDEST PUSH32 0xFD00000000000000000000000000000000000000000000000000000000000000 PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND ADD PUSH2 0x5AE JUMPI PUSH2 0x59E DUP10 DUP10 DUP10 PUSH2 0xAF8 JUMP JUMPDEST SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP SWAP6 POP POP PUSH2 0x604 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x6085CD8200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH32 0xFF00000000000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST SWAP4 SWAP8 SWAP3 SWAP7 POP SWAP4 POP SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2CB PUSH32 0x8D0BF1FD623D628C741362C1289948E57B3E2905218C676D3E69ABEE36D6AE2E DUP4 PUSH2 0xC75 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x67E JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD PUSH2 0x3C0 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD CALLVALUE CREATE SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x6D7 JUMPI DUP2 PUSH1 0x40 MLOAD PUSH32 0xD25719100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP2 SWAP1 PUSH2 0x1EBA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0xA506AD4E7F05ECEBA62A023C3219E5BD98A615F4FA87E2AFB08A2DA5CF62BF0C SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x731 PUSH1 0x0 PUSH2 0x60F JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH32 0x6FFBD45100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0x789 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CB DUP3 PUSH2 0xCD3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x7A5 DUP9 DUP9 DUP9 PUSH2 0x447 JUMP JUMPDEST POP SWAP7 POP SWAP2 SWAP5 POP SWAP3 POP SWAP1 POP DUP3 DUP3 LT DUP1 ISZERO SWAP1 PUSH2 0x7BD JUMPI POP PUSH1 0x1 JUMPDEST SWAP5 POP POP POP POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA038794000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE CHAINID PUSH1 0x22 DUP3 ADD MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 ADDRESS PUSH1 0x60 SHL AND PUSH1 0x42 DUP3 ADD MSTORE PUSH1 0x56 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x76 ADD JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xA07 JUMPI CALLDATASIZE DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x8A0 JUMPI PUSH2 0x8A0 PUSH2 0x1E27 JUMP JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x8B2 SWAP2 SWAP1 PUSH2 0x1ECD JUMP JUMPDEST SWAP1 POP PUSH2 0x8C1 PUSH1 0x20 DUP3 ADD DUP3 PUSH2 0x1F0B JUMP JUMPDEST ISZERO PUSH2 0x8FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x230D1CCC00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD CALLDATALOAD DUP1 GAS LT ISZERO PUSH2 0x94E JUMPI DUP3 DUP2 GAS PUSH1 0x40 MLOAD PUSH32 0x2BB3E3BA00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x24 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x988 PUSH2 0x963 PUSH1 0x80 DUP6 ADD PUSH1 0x60 DUP7 ADD PUSH2 0x1F26 JUMP JUMPDEST PUSH1 0x80 DUP6 ADD CALLDATALOAD DUP5 ISZERO PUSH2 0x974 JUMPI DUP5 PUSH2 0x976 JUMP JUMPDEST GAS JUMPDEST PUSH2 0x983 PUSH1 0xA0 DUP9 ADD DUP9 PUSH2 0x1F41 JUMP JUMPDEST PUSH2 0xD2F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x9CF JUMPI DUP8 PUSH32 0x5C4EEB02DABF8976016AB414D617F9A162936DCACE3CDEF8C69EF6E262AD5AE7 DUP6 PUSH1 0x40 MLOAD PUSH2 0x9C2 SWAP2 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x9F1 JUMP JUMPDEST PUSH2 0x9F1 PUSH2 0x9E2 PUSH1 0x40 DUP6 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x1F0B JUMP JUMPDEST DUP10 DUP7 PUSH2 0x9EC PUSH2 0xD4C JUMP JUMPDEST PUSH2 0xD6B JUMP JUMPDEST POP POP POP DUP1 DUP1 PUSH2 0x9FF SWAP1 PUSH2 0x1FD5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x885 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xA29 DUP8 PUSH2 0xA24 DUP8 PUSH1 0x6 DUP2 DUP12 PUSH2 0x200D JUMP JUMPDEST PUSH2 0xDB9 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE DUP8 CALLDATALOAD PUSH1 0xF0 SHR PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 DUP5 MSTORE PUSH1 0x2 SWAP1 SWAP11 ADD CALLDATALOAD PUSH1 0xE0 SHR SWAP1 DUP2 SWAP1 MSTORE SWAP9 SWAP1 SWAP2 KECCAK256 SWAP1 SWAP10 SWAP2 SWAP9 POP SWAP7 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH2 0xA7A DUP8 PUSH2 0xA75 DUP8 PUSH1 0x1 DUP2 DUP12 PUSH2 0x200D JUMP JUMPDEST PUSH2 0xA0E JUMP JUMPDEST SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 POP SWAP4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH1 0x22 DUP3 ADD DUP2 SWAP1 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000 ADDRESS PUSH1 0x60 SHL AND PUSH1 0x42 DUP4 ADD MSTORE PUSH1 0x56 DUP3 ADD DUP4 SWAP1 MSTORE SWAP1 PUSH1 0x76 ADD PUSH2 0x864 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH1 0x4 PUSH1 0x1 DUP9 ADD CALLDATALOAD PUSH1 0xE8 SHR DUP3 PUSH2 0xB13 DUP4 DUP4 PUSH2 0x2037 JUMP JUMPDEST SWAP1 POP PUSH2 0xB25 DUP12 PUSH2 0x226 DUP4 DUP7 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP12 POP SWAP2 SWAP10 POP SWAP8 POP SWAP6 POP SWAP4 POP DUP8 DUP8 LT ISZERO PUSH2 0xB7D JUMPI PUSH2 0xB45 DUP2 DUP5 DUP12 DUP14 PUSH2 0x200D JUMP JUMPDEST DUP10 DUP10 PUSH1 0x40 MLOAD PUSH32 0xB006ABA000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x204A JUMP JUMPDEST DUP1 SWAP3 POP JUMPDEST DUP9 DUP4 LT ISZERO PUSH2 0xC67 JUMPI PUSH1 0x3 DUP4 ADD SWAP3 DUP11 ADD CALLDATALOAD PUSH1 0xE8 SHR SWAP2 POP PUSH2 0xBA0 DUP4 DUP4 PUSH2 0x2037 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xBC2 PUSH2 0xBB0 DUP9 PUSH2 0x124F JUMP JUMPDEST DUP13 DUP13 DUP8 SWAP1 DUP7 SWAP3 PUSH2 0x226 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP1 SWAP2 POP POP DUP9 DUP9 LT ISZERO PUSH2 0xC1A JUMPI PUSH2 0xBE2 DUP3 DUP6 DUP13 DUP15 PUSH2 0x200D JUMP JUMPDEST DUP11 DUP11 PUSH1 0x40 MLOAD PUSH32 0xB006ABA000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x204A JUMP JUMPDEST DUP5 DUP2 LT PUSH2 0xC5D JUMPI PUSH1 0x40 MLOAD PUSH32 0x37DAF62B00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0x44 ADD PUSH2 0x3C0 JUMP JUMPDEST SWAP4 POP SWAP2 POP DUP2 PUSH2 0xB81 JUMP JUMPDEST POP POP POP SWAP4 SWAP8 SWAP3 SWAP7 POP SWAP4 POP SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xC94 SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0xE4A77BBC00000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0xD26 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CB DUP3 PUSH2 0x1283 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP3 DUP5 DUP3 CALLDATACOPY PUSH1 0x0 DUP1 DUP5 DUP4 DUP10 DUP12 DUP11 CALL SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 RETURNDATASIZE PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x20 DUP3 ADD DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 DUP4 MSTORE DUP2 PUSH1 0x0 DUP3 RETURNDATACOPY POP POP SWAP1 JUMP JUMPDEST DUP4 ISZERO PUSH2 0xD79 JUMPI DUP1 MLOAD PUSH1 0x20 DUP3 ADD REVERT JUMPDEST DUP3 PUSH32 0xAB46C69F7F32E1BF09B0725853DA82A211E5402A0600296AB499A2FB5EA3B419 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH2 0xDAB SWAP3 SWAP2 SWAP1 PUSH2 0x2071 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1246 JUMPI PUSH1 0x1 DUP2 ADD SWAP1 DUP6 ADD CALLDATALOAD PUSH1 0xF8 SHR PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD PUSH2 0xE60 JUMPI PUSH1 0x15 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD PUSH1 0xF8 DUP2 SWAP1 SHR SWAP1 PUSH1 0x58 SHR PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND SWAP1 PUSH21 0xFF0000000000000000000000000000000000000000 AND DUP2 OR DUP6 PUSH2 0xE46 JUMPI DUP1 PUSH2 0xE55 JUMP JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP6 POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST DUP1 PUSH2 0xEF6 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 DUP7 DUP2 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP1 PUSH1 0x43 ADD PUSH1 0x0 PUSH2 0xE8C DUP11 PUSH2 0xE87 DUP5 DUP9 DUP13 DUP15 PUSH2 0x200D JUMP JUMPDEST PUSH2 0x136D JUMP JUMPDEST PUSH1 0xFF DUP5 AND SWAP8 SWAP1 SWAP8 ADD SWAP7 SWAP2 SWAP5 POP DUP5 SWAP2 SWAP1 POP PUSH1 0xA0 DUP4 SWAP1 SHL PUSH21 0xFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND OR DUP7 PUSH2 0xEDB JUMPI DUP1 PUSH2 0xEEA JUMP JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP7 POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x2 DUP2 SUB PUSH2 0x101E JUMPI PUSH1 0x0 DUP1 DUP8 DUP5 ADD CALLDATALOAD PUSH1 0xF8 DUP2 SWAP1 SHR SWAP1 PUSH1 0x58 SHR PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x15 DUP7 ADD SWAP6 POP SWAP1 SWAP3 POP SWAP1 POP PUSH1 0x0 DUP9 DUP6 ADD CALLDATALOAD PUSH1 0xE8 SHR PUSH1 0x3 DUP7 ADD DUP2 PUSH3 0xFFFFFF AND SWAP2 POP DUP1 SWAP7 POP DUP2 SWAP3 POP POP POP PUSH1 0x0 DUP2 DUP7 ADD SWAP1 POP PUSH2 0xF6F DUP12 DUP5 DUP13 DUP13 DUP11 SWAP1 DUP7 SWAP3 PUSH2 0xF6A SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST PUSH2 0x1630 JUMP JUMPDEST PUSH2 0xFB7 JUMPI DUP11 DUP4 PUSH2 0xF81 DUP4 DUP10 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9A94623200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x208A JUMP JUMPDEST PUSH1 0xFF DUP5 AND SWAP8 SWAP1 SWAP8 ADD SWAP7 SWAP5 POP DUP5 PUSH1 0xA0 DUP5 SWAP1 SHL PUSH21 0xFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND OR DUP8 PUSH2 0x1002 JUMPI DUP1 PUSH2 0x1011 JUMP JUMPDEST PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP8 POP POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x3 DUP2 SUB PUSH2 0x1051 JUMPI PUSH1 0x20 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD DUP4 PUSH2 0x1039 JUMPI DUP1 PUSH2 0x1048 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP4 POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x4 DUP2 SUB PUSH2 0x109D JUMPI PUSH1 0x3 DUP1 DUP4 ADD SWAP3 DUP8 DUP2 ADD CALLDATALOAD PUSH1 0xE8 SHR SWAP2 SWAP1 DUP3 ADD ADD PUSH1 0x0 DUP1 PUSH2 0x107E DUP12 PUSH2 0xA24 DUP6 DUP10 DUP14 DUP16 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x0 SWAP9 DUP10 MSTORE PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SWAP8 KECCAK256 SWAP7 SWAP1 SWAP8 ADD SWAP7 POP SWAP1 SWAP4 POP PUSH2 0xDBF SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 DUP2 SUB PUSH2 0x11A5 JUMPI PUSH1 0x0 DUP3 DUP8 ADD CALLDATALOAD PUSH1 0xF8 SHR PUSH1 0x1 DUP5 ADD SWAP4 POP PUSH1 0xFF AND SWAP1 POP PUSH1 0x0 DUP8 DUP5 ADD CALLDATALOAD PUSH1 0xF0 SHR PUSH1 0x2 DUP6 ADD SWAP5 POP PUSH2 0xFFFF AND SWAP1 POP PUSH1 0x0 DUP9 DUP6 ADD CALLDATALOAD PUSH1 0xE8 SHR PUSH1 0x3 DUP7 ADD DUP2 PUSH3 0xFFFFFF AND SWAP2 POP DUP1 SWAP7 POP DUP2 SWAP3 POP POP POP PUSH1 0x0 DUP2 DUP7 ADD SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x110B DUP14 DUP14 DUP14 DUP12 SWAP1 DUP8 SWAP3 PUSH2 0xA24 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST SWAP4 SWAP9 POP DUP9 SWAP4 SWAP1 SWAP3 POP SWAP1 POP DUP5 DUP3 LT PUSH2 0x1121 JUMPI SWAP9 DUP6 ADD SWAP9 JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x53657175656E6365206E657374656420636F6E6669673A0A0000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x38 DUP3 ADD DUP5 SWAP1 MSTORE PUSH1 0x58 DUP3 ADD DUP9 SWAP1 MSTORE PUSH1 0x78 DUP1 DUP4 ADD DUP11 SWAP1 MSTORE DUP4 MLOAD DUP1 DUP5 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0x98 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD SWAP2 ADD KECCAK256 DUP10 PUSH2 0x1187 JUMPI DUP1 PUSH2 0x1196 JUMP JUMPDEST PUSH1 0x0 DUP11 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP10 POP POP POP POP POP POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x5 DUP2 SUB PUSH2 0x1211 JUMPI PUSH1 0x20 DUP3 ADD SWAP2 DUP7 ADD CALLDATALOAD DUP8 DUP2 SUB PUSH2 0x11E0 JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 POP JUMPDEST PUSH1 0x0 PUSH2 0x11EB DUP3 PUSH2 0x1817 JUMP JUMPDEST SWAP1 POP DUP5 PUSH2 0x11F8 JUMPI DUP1 PUSH2 0x1207 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 JUMPDEST SWAP5 POP POP POP POP PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB2505F7C00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x24 ADD PUSH2 0x3C0 JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1 PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP3 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH2 0x2CB JUMP JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0xAC6A444E00000000000000000000000000000000000000000000000000000000 EQ DUP1 PUSH2 0x1316 JUMPI POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH32 0x36E7817500000000000000000000000000000000000000000000000000000000 EQ JUMPDEST ISZERO PUSH2 0x1323 JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND EQ PUSH2 0x2CB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x42 DUP3 EQ PUSH2 0x13AD JUMPI DUP3 DUP3 PUSH1 0x40 MLOAD PUSH32 0x2EE17A3D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP3 SWAP2 SWAP1 PUSH2 0x20CA JUMP JUMPDEST PUSH1 0x0 PUSH2 0x13C6 PUSH2 0x13BD PUSH1 0x1 DUP6 PUSH2 0x20DE JUMP JUMPDEST DUP6 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH1 0xF8 SHR DUP5 CALLDATALOAD PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH32 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 DUP2 GT ISZERO PUSH2 0x143A JUMPI DUP7 DUP7 DUP3 PUSH1 0x40 MLOAD PUSH32 0xAD4AAC7600000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x20F1 JUMP JUMPDEST DUP3 PUSH1 0xFF AND PUSH1 0x1B EQ ISZERO DUP1 ISZERO PUSH2 0x1452 JUMPI POP DUP3 PUSH1 0xFF AND PUSH1 0x1C EQ ISZERO JUMPDEST ISZERO PUSH2 0x148F JUMPI DUP7 DUP7 DUP5 PUSH1 0x40 MLOAD PUSH32 0xE578897E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2115 JUMP JUMPDEST PUSH1 0x1 DUP5 SUB PUSH2 0x14FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP1 DUP4 MSTORE DUP11 SWAP1 MSTORE PUSH1 0xFF DUP6 AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0xA0 ADD JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 DUP6 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x14EB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD SWAP5 POP PUSH2 0x15D4 JUMP JUMPDEST PUSH1 0x2 DUP5 SUB PUSH2 0x1599 JUMPI PUSH1 0x40 MLOAD PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x3C DUP2 ADD DUP10 SWAP1 MSTORE PUSH1 0x1 SWAP1 PUSH1 0x5C ADD PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE DUP3 DUP3 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD KECCAK256 PUSH1 0x0 DUP5 MSTORE SWAP1 DUP4 ADD DUP1 DUP4 MSTORE MSTORE PUSH1 0xFF DUP7 AND SWAP1 DUP3 ADD MSTORE PUSH1 0x60 DUP2 ADD DUP5 SWAP1 MSTORE PUSH1 0x80 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0xA0 ADD PUSH2 0x14C9 JUMP JUMPDEST DUP7 DUP7 DUP6 PUSH1 0x1 PUSH1 0x40 MLOAD PUSH32 0x9DFBA85200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x213C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH2 0x1625 JUMPI DUP7 DUP7 PUSH1 0x40 MLOAD PUSH32 0x6C1719D200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP3 SWAP2 SWAP1 PUSH2 0x20CA JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 SUB PUSH2 0x166B JUMPI PUSH1 0x40 MLOAD PUSH32 0xAC241E1100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP4 PUSH2 0x167A PUSH1 0x1 DUP3 PUSH2 0x20DE JUMP JUMPDEST DUP2 DUP2 LT PUSH2 0x1689 JUMPI PUSH2 0x1689 PUSH2 0x1E27 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD PUSH1 0xF8 SHR SWAP2 POP POP PUSH1 0x1 DUP2 EQ DUP1 PUSH2 0x16A3 JUMPI POP PUSH1 0x2 DUP2 EQ JUMPDEST ISZERO PUSH2 0x16E8 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x16CA DUP8 DUP7 DUP7 PUSH2 0x136D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP2 POP PUSH2 0x180E JUMP JUMPDEST PUSH1 0x3 DUP2 SUB PUSH2 0x17D3 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH4 0x1626BA7E DUP8 DUP7 PUSH1 0x0 DUP8 PUSH2 0x171C PUSH1 0x1 DUP3 PUSH2 0x20DE JUMP JUMPDEST SWAP3 PUSH2 0x1729 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x200D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1747 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2168 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1764 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1788 SWAP2 SWAP1 PUSH2 0x218B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 EQ SWAP2 POP PUSH2 0x180E JUMP JUMPDEST DUP4 DUP4 DUP3 PUSH1 0x0 PUSH1 0x40 MLOAD PUSH32 0x9DFBA85200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x3C0 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x213C JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x53657175656E636520737461746963206469676573743A0A0000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x38 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x58 ADD PUSH2 0x864 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x3D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1892 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x317 DUP2 PUSH2 0x1852 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x18AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x18C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x18FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1919 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1925 DUP7 DUP3 DUP8 ADD PUSH2 0x189D JUMP JUMPDEST SWAP5 SWAP8 SWAP1 SWAP7 POP SWAP4 SWAP5 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x40 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1948 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1960 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x196C DUP9 DUP4 DUP10 ADD PUSH2 0x189D JUMP JUMPDEST SWAP1 SWAP7 POP SWAP5 POP PUSH1 0x20 DUP8 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1985 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1992 DUP8 DUP3 DUP9 ADD PUSH2 0x189D JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x19B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x19C9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x19E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP3 PUSH1 0x5 SHL DUP6 ADD ADD GT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1A0F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1A26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A32 DUP6 DUP3 DUP7 ADD PUSH2 0x19B7 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1A56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1A6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A7A DUP10 DUP4 DUP11 ADD PUSH2 0x19B7 JUMP JUMPDEST SWAP1 SWAP8 POP SWAP6 POP PUSH1 0x20 DUP9 ADD CALLDATALOAD SWAP5 POP PUSH1 0x40 DUP9 ADD CALLDATALOAD SWAP2 POP DUP1 DUP3 GT ISZERO PUSH2 0x1A9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AA7 DUP9 DUP3 DUP10 ADD PUSH2 0x189D JUMP JUMPDEST SWAP7 SWAP10 SWAP6 SWAP9 POP SWAP4 SWAP7 POP SWAP3 SWAP5 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1AF9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1B11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1B25 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1B37 JUMPI PUSH2 0x1B37 PUSH2 0x1AB8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1B7D JUMPI PUSH2 0x1B7D PUSH2 0x1AB8 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1B96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP2 DUP4 DUP3 CALLDATACOPY PUSH1 0x0 SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1BD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP4 MSTORE DUP2 DUP2 PUSH1 0x20 DUP6 ADD CALLDATACOPY POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 ADD ADD MSTORE PUSH1 0x0 PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP5 ADD AND DUP5 ADD ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 DUP4 MSTORE PUSH1 0x0 PUSH1 0x20 DUP1 DUP6 ADD DUP1 DUP2 SWAP7 POP DUP6 PUSH1 0x5 SHL DUP2 ADD SWAP2 POP DUP5 PUSH1 0x0 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x1D8A JUMPI DUP3 DUP5 SUB DUP10 MSTORE DUP2 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 DUP9 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1CA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 ADD PUSH1 0xC0 PUSH2 0x1CAE DUP3 PUSH2 0x1BC6 JUMP JUMPDEST ISZERO ISZERO DUP7 MSTORE PUSH2 0x1CBD DUP8 DUP4 ADD PUSH2 0x1BC6 JUMP JUMPDEST ISZERO ISZERO DUP7 DUP9 ADD MSTORE PUSH1 0x40 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x60 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x1CEF DUP3 DUP6 ADD PUSH2 0x1BDB JUMP JUMPDEST AND SWAP1 DUP8 ADD MSTORE PUSH1 0x80 DUP3 DUP2 ADD CALLDATALOAD SWAP1 DUP8 ADD MSTORE PUSH1 0xA0 DUP1 DUP4 ADD CALLDATALOAD CALLDATASIZE DUP5 SWAP1 SUB PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 ADD DUP2 SLT PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP3 ADD DUP8 DUP2 ADD SWAP3 SWAP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATASIZE SUB DUP5 SGT ISZERO PUSH2 0x1D62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 DUP3 DUP10 ADD MSTORE PUSH2 0x1D74 DUP4 DUP10 ADD DUP3 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP13 DUP10 ADD SWAP13 SWAP8 POP POP POP SWAP3 DUP7 ADD SWAP3 POP POP PUSH1 0x1 ADD PUSH2 0x1C62 JUMP JUMPDEST POP SWAP2 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x5 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x73656C663A000000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x1C48 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x6 PUSH1 0x40 DUP3 ADD MSTORE PUSH32 0x67756573743A0000000000000000000000000000000000000000000000000000 PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x80 DUP4 ADD DUP5 DUP7 PUSH2 0x1C48 JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1E7C JUMPI PUSH1 0x20 DUP2 DUP6 ADD DUP2 ADD MLOAD DUP7 DUP4 ADD DUP3 ADD MSTORE ADD PUSH2 0x1E60 JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x20 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x20 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x317 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E56 JUMP JUMPDEST PUSH1 0x0 DUP3 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41 DUP4 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1F01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x317 DUP3 PUSH2 0x1BC6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F38 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x317 DUP3 PUSH2 0x1BDB JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1 DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x1F76 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x1F91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x18DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 SUB PUSH2 0x2006 JUMPI PUSH2 0x2006 PUSH2 0x1FA6 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP6 DUP6 GT ISZERO PUSH2 0x201D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP7 GT ISZERO PUSH2 0x202A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP DUP3 ADD SWAP4 SWAP2 SWAP1 SWAP3 SUB SWAP2 POP JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x2CB JUMPI PUSH2 0x2CB PUSH2 0x1FA6 JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x205E PUSH1 0x60 DUP4 ADD DUP7 DUP9 PUSH2 0x1BFF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP PUSH1 0x40 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP3 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1E56 JUMP JUMPDEST DUP5 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x60 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x20C0 PUSH1 0x60 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 MSTORE PUSH1 0x0 PUSH2 0x37B PUSH1 0x20 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x2CB JUMPI PUSH2 0x2CB PUSH2 0x1FA6 JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2105 PUSH1 0x40 DUP4 ADD DUP6 DUP8 PUSH2 0x1BFF JUMP JUMPDEST SWAP1 POP DUP3 PUSH1 0x20 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2129 PUSH1 0x40 DUP4 ADD DUP6 DUP8 PUSH2 0x1BFF JUMP JUMPDEST SWAP1 POP PUSH1 0xFF DUP4 AND PUSH1 0x20 DUP4 ADD MSTORE SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH2 0x2150 PUSH1 0x60 DUP4 ADD DUP7 DUP9 PUSH2 0x1BFF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD SWAP5 SWAP1 SWAP5 MSTORE POP SWAP1 ISZERO ISZERO PUSH1 0x40 SWAP1 SWAP2 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP4 DUP2 MSTORE PUSH1 0x40 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x0 PUSH2 0x2182 PUSH1 0x40 DUP4 ADD DUP5 DUP7 PUSH2 0x1BFF JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x219D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x317 DUP2 PUSH2 0x1852 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP12 0xB9 0x5D XOR 0xE9 PUSH32 0x278AA47E0C04C20D5A6AF9BDB6D473C6D4051192CD96FC17866864736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "640:2693:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3127:204;;;;;;;;;;-1:-1:-1;3127:204:1;;;;;:::i;:::-;;:::i;:::-;;;611:14:22;;604:22;586:41;;574:2;559:18;3127:204:1;;;;;;;;5489:316:2;;;;;;;;;;-1:-1:-1;5489:316:2;;;;;:::i;:::-;;:::i;:::-;;;1646:66:22;1634:79;;;1616:98;;1604:2;1589:18;5489:316:2;1472:248:22;4525:332:2;;;;;;;;;;-1:-1:-1;4525:332:2;;;;;:::i;:::-;;:::i;6456:119::-;;;;;;;;;;-1:-1:-1;6456:119:2;;;;;:::i;:::-;;:::i;:::-;;811:95:14;;;;;;;;;;;;862:44;811:95;;;;;2778:25:22;;;2766:2;2751:18;811:95:14;2632:177:22;1290:262:1;;;;;;;;;;-1:-1:-1;1290:262:1;;;;;:::i;:::-;;:::i;890:292::-;;;;;;;;;;-1:-1:-1;890:292:1;;;;;:::i;:::-;;:::i;1675:1486:2:-;;;;;;;;;;-1:-1:-1;1675:1486:2;;;;;:::i;:::-;;:::i;:::-;;;;4827:25:22;;;4883:2;4868:18;;4861:34;;;;4911:18;;;4904:34;;;;4969:2;4954:18;;4947:34;5012:3;4997:19;;4990:35;4814:3;4799:19;1675:1486:2;4568:463:22;938:156:6;;;;;;;;;;-1:-1:-1;938:156:6;;;;;:::i;:::-;;:::i;456:276:4:-;;;;;;:::i;:::-;;:::i;:::-;;;6753:42:22;6741:55;;;6723:74;;6711:2;6696:18;456:276:4;6577:226:22;670:87:6;;;;;;;;;;;;;:::i;3127:204:1:-;3270:4;3289:37;3313:12;3289:23;:37::i;:::-;3282:44;3127:204;-1:-1:-1;;3127:204:1:o;5489:316:2:-;5608:6;5650:12;5667:40;5688:5;5695:11;;5667:20;:40::i;:::-;5649:58;;;5717:7;5713:65;;;-1:-1:-1;5741:30:2;;-1:-1:-1;5734:37:2;;5713:65;-1:-1:-1;5798:1:2;;-1:-1:-1;5489:316:2;;;;;;:::o;4525:332::-;4651:6;4693:12;4710:51;4741:5;;4731:16;;;;;;;:::i;:::-;;;;;;;;4749:11;;4710:20;:51::i;:::-;4692:69;;;4771:7;4767:63;;;-1:-1:-1;4795:28:2;;-1:-1:-1;4788:35:2;;4767:63;-1:-1:-1;4850:1:2;;-1:-1:-1;4525:332:2;;;;;;;:::o;6456:119::-;178:10:8;200:4;178:27;174:94;;222:39;;;;;235:10;222:39;;;7319:34:22;255:4:8;7369:18:22;;;7362:43;7231:18;;222:39:8;;;;;;;;174:94;6542:28:2::1;6559:10;6542:16;:28::i;:::-;6456:119:::0;:::o;1290:262:1:-;1401:14;1418:63;1474:4;;1454:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1444:36;;;;;;1418:25;:63::i;:::-;1401:80;;1520:27;1534:6;1542:4;;1520:13;:27::i;:::-;1364:188;1290:262;;:::o;890:292::-;1030:14;1047:64;1104:4;;1083:26;;;;;;;;;:::i;1047:64::-;1030:81;;1150:27;1164:6;1172:4;;1150:13;:27::i;:::-;993:189;890:292;;;;;:::o;1675:1486:2:-;1801:17;1824:14;1844:17;1867;1890:18;1919:20;1942:10;;1953:1;1942:13;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;1942:13:2;;-1:-1:-1;1962:303:2;;2057:34;2083:7;2057:25;:34::i;:::-;2045:46;;2144;2168:9;2179:10;;2144:23;:46::i;:::-;2099:91;;-1:-1:-1;2099:91:2;;-1:-1:-1;2099:91:2;-1:-1:-1;2099:91:2;-1:-1:-1;2198:60:2;;-1:-1:-1;2198:60:2;1962:303;2275:29;;;;;2271:310;;2370:34;2396:7;2370:25;:34::i;:::-;2358:46;;2457:49;2484:9;2495:10;;2457:26;:49::i;2271:310::-;2591:33;;;;;2587:319;;2690:39;2721:7;2690:30;:39::i;2587:319::-;2916:29;;;;;2912:196;;3066:35;3081:7;3090:10;;3066:14;:35::i;:::-;3059:42;;;;;;;;;;;;;2912:196;3121:35;;;;;11707:66:22;11695:79;;3121:35:2;;;11677:98:22;11650:18;;3121:35:2;11533:248:22;1675:1486:2;;;;;;;;;;:::o;938:156:6:-;1002:7;1032:56;453:66;1080:6;1032:28;:56::i;456:276:4:-;550:12;178:10:8;200:4;178:27;174:94;;222:39;;;;;235:10;222:39;;;7319:34:22;255:4:8;7369:18:22;;;7362:43;7231:18;;222:39:8;7084:327:22;174:94:8;631:5:4::1;625:12;620:2;613:5;609:14;596:11;589:49;581:57:::0;-1:-1:-1;649:18:4::1;::::0;::::1;645:50;;689:5;676:19;;;;;;;;;;;:::i;645:50::-;706:21;::::0;6753:42:22;6741:55;;6723:74;;706:21:4::1;::::0;6711:2:22;6696:18;706:21:4::1;;;;;;;456:276:::0;;;:::o;670:87:6:-;718:7;740:12;750:1;740:9;:12::i;:::-;733:19;;670:87;:::o;942:233:4:-;1028:4;1044:48;;;;;1040:80;;-1:-1:-1;1109:4:4;;942:233;-1:-1:-1;942:233:4:o;1040:80::-;1133:37;1157:12;1133:23;:37::i;3480:386:2:-;3611:12;3629:17;3657;3676:14;3692:17;3760:38;3778:7;3787:10;;3760:17;:38::i;:::-;-1:-1:-1;3715:83:2;-1:-1:-1;3715:83:2;;-1:-1:-1;3715:83:2;-1:-1:-1;3715:83:2;-1:-1:-1;3814:19:2;;;;;;:47;;-1:-1:-1;2779:4:1;3837:24:2;3804:57;;3651:215;;;3480:386;;;;;;:::o;2824:93:1:-;2898:14;;;;;;;;;;;;;;1173:224:13;1279:107;;12792:66:22;1279:107:13;;;12780:79:22;1325:13:13;12875:11:22;;;12868:27;12946:66;1356:4:13;12933:2:22;12929:15;12925:88;12911:12;;;12904:110;13030:12;;;13023:28;;;1240:7:13;;13067:12:22;;1279:107:13;;;;;;;;;;;;;1262:130;;;;;;1255:137;;1173:224;;;:::o;1710:834:1:-;1847:4;1832:12;1864:676;1888:4;1884:1;:8;1864:676;;;1907:32;1942:4;;1947:1;1942:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;1907:42;-1:-1:-1;1962:24:1;;;;1907:42;1962:24;:::i;:::-;1958:62;;;1995:25;;;;;;;;2778::22;;;2751:18;;1995:25:1;2632:177:22;1958:62:1;2048:20;;;;;2080:9;:20;2076:69;;;2122:1;2125:8;2135:9;2109:36;;;;;;;;13869:25:22;;;;13910:18;;;13903:34;;;;13953:18;;;13946:34;13842:18;;2109:36:1;13667:319:22;2076:69:1;2154:12;2169:148;2192:18;;;;;;;;:::i;:::-;2220:17;;;;2247:13;;:36;;2275:8;2247:36;;;2263:9;2247:36;2293:16;;;;:11;:16;:::i;:::-;2169:13;:148::i;:::-;2154:163;;2330:7;2326:208;;;2365:7;2354:22;2374:1;2354:22;;;;2778:25:22;;2766:2;2751:18;;2632:177;2354:22:1;;;;;;;;2326:208;;;2401:124;2425:25;;;;;;;;:::i;:::-;2462:7;2481:1;2494:21;:19;:21::i;:::-;2401:12;:124::i;:::-;1899:641;;;1894:3;;;;;:::i;:::-;;;;1864:676;;;;1799:745;1710:834;;;:::o;8892:642:13:-;8996:17;;;;9131:41;9145:10;9157:14;:10;9168:1;9157:10;;:14;:::i;:::-;9131:13;:41::i;:::-;622:9:20;656:13;;;1585:25:18;;1626:3;1622:14;683:2:20;676:14;;;715:2;702:16;;;656:13;;9379:1:13;2034:23:18;;;2021:37;2074:3;2070:14;676::20;;;;702:16;;;;1622:14:18;;9109:63:13;;-1:-1:-1;702:16:20;2070:14:18;-1:-1:-1;8892:642:13;-1:-1:-1;;;;8892:642:13:o;648:262:15:-;752:17;;;;854:51;878:10;890:14;:10;901:1;890:10;;:14;:::i;:::-;854:23;:51::i;:::-;847:58;;;;;;;;648:262;;;;;;;:::o;404:213:16:-;502:104;;12792:66:22;502:104:16;;;12780:79:22;463:7:16;12875:11:22;;;12868:27;;;12946:66;576:4:16;12933:2:22;12929:15;12925:88;12911:12;;;12904:110;13030:12;;;13023:28;;;463:7:16;13067:12:22;;502:104:16;12494:591:22;2320:2059:14;2428:17;;;;;3378:14:19;2563:1:14;3290:25:19;;3277:39;3336:3;3332:14;2428:17:14;2768:16;3378:14:19;3332;2768:16:14;:::i;:::-;2750:34;-1:-1:-1;2883:72:14;2908:7;2923:26;2750:34;2934:6;2923:10;;:26;:::i;2883:72::-;2791:164;;-1:-1:-1;2791:164:14;;-1:-1:-1;2791:164:14;-1:-1:-1;2791:164:14;-1:-1:-1;2791:164:14;-1:-1:-1;2966:18:14;;;2962:118;;;3027:26;3045:7;3038:6;3027:10;;:26;:::i;:::-;3055:9;3066:6;3001:72;;;;;;;;;;;;;;:::i;2962:118::-;3095:7;3086:16;;3283:1092;3290:26;;;3283:1092;;;3390:1:19;3378:14;;;3290:25;;3277:39;3336:3;3332:14;;-1:-1:-1;3444:16:14;3378:14:19;3332;3444:16:14;:::i;:::-;3434:26;;3469:22;3687:105;3714:34;3738:9;3714:23;:34::i;:::-;3758:10;;3769:6;3758:26;3776:7;3758:26;;;;;;;:::i;3687:105::-;3500:292;;-1:-1:-1;3500:292:14;;-1:-1:-1;3500:292:14;-1:-1:-1;3500:292:14;;-1:-1:-1;;3833:18:14;;;3829:122;;;3896:26;3914:7;3907:6;3896:10;;:26;:::i;:::-;3924:9;3935:6;3870:72;;;;;;;;;;;;;;:::i;3829:122::-;4216:10;4198:14;:28;4194:115;;4245:55;;;;;;;;16193:25:22;;;16234:18;;;16227:34;;;16166:18;;4245:55:14;16019:248:22;4194:115:14;4330:14;-1:-1:-1;4361:7:14;-1:-1:-1;4361:7:14;3283:1092;;;2540:1839;;;2320:2059;;;;;;;;;:::o;490:187:9:-;568:11;587;622:4;628:7;611:25;;;;;;;;16193::22;;;16249:2;16234:18;;16227:34;16181:2;16166:18;;16019:248;611:25:9;;;;;;;;;;;;;;601:36;;611:25;601:36;;;;661:10;;490:187;-1:-1:-1;;;;490:187:9:o;4140:231:3:-;4226:4;4242:46;;;;;4238:78;;-1:-1:-1;4305:4:3;;4140:231;-1:-1:-1;4140:231:3:o;4238:78::-;4329:37;4353:12;4329:23;:37::i;1525:353:20:-;1640:6;1688:4;1682:11;1732:12;1718;1713:3;1700:45;1859:1;1848;1826:12;1813:3;1799:4;1786:3;1772:4;1758:110;1753:115;1525:353;-1:-1:-1;;;;;;;1525:353:20:o;852:271::-;897:14;948:16;982:4;976:11;971:16;;1014:2;1011:1;1007:10;1048:4;1041:5;1037:16;1031:4;1024:30;1071:4;1068:1;1061:15;1108:4;1105:1;1098:5;1083:30;;;852:271;:::o;3644:286:3:-;3781:14;3777:149;;;3849:7;3843:14;3836:4;3827:7;3823:18;3816:42;3777:149;3894:7;3885:34;3903:6;3911:7;3885:34;;;;;;;:::i;:::-;;;;;;;;3644:286;;;;:::o;3525:4708:13:-;3635:14;3655:12;3696:14;3765:4458;3772:26;;;3765:4458;;;1475:1:19;1463:14;;;1390:25;;1377:39;1432:3;1428:14;3923:20:13;;;3919:402;;2205:2:19;2193:15;;;2046:25;;2033:39;2088:3;2084:14;;;;2118:2;2114:13;2129:42;2110:62;;;1873:23:13;;:49;;4231:4;:59;;4286:4;4231:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;4252:31:13;4224:66;;4302:8;;;;;;3919:402;4335:4;4331:679;;1475:1:19;1463:14;;;1390:25;;;1377:39;1432:3;1428:14;;4560:11:13;;4396:16;4598:72;4631:10;4643:26;4560:11;1463:14:19;4643:10:13;1390:25:19;4643:26:13;:::i;:::-;4598:32;:72::i;:::-;4764:20;;;;;;;;4691:7;;-1:-1:-1;4691:7:13;;4764:20;-1:-1:-1;1893:3:13;1873:23;;;;;1899;;;1873:49;4920:4;:59;;4975:4;4920:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;4941:31:13;4913:66;;4991:8;;;;;;;4331:679;625:1;5024:4;:30;5020:932;;5104:16;;2046:25:19;;;2033:39;2088:3;2084:14;;;;2118:2;2114:13;2129:42;2110:62;2205:2;2193:15;;5146:64:13;-1:-1:-1;5146:64:13;;-1:-1:-1;5146:64:13;-1:-1:-1;5256:12:13;3290:25:19;;;3277:39;3336:3;3332:14;3390:1;3378:14;;5280:46:13;;;;;;;;;;;;;5380:15;5407:4;5398:6;:13;5380:31;;5428:81;5464:10;5476:4;5482:10;;5493:6;5482:26;5500:7;5482:26;;;;;;;:::i;:::-;5428:35;:81::i;:::-;5423:190;;5555:10;5567:4;5573:26;5591:7;5584:6;5573:10;;:26;:::i;:::-;5532:68;;;;;;;;;;;;;;:::i;5423:190::-;5706:20;;;;;;;;;-1:-1:-1;5706:20:13;1893:3;1873:23;;;;;1899;;;1873:49;5862:4;:59;;5917:4;5862:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;5883:31:13;5855:66;;5933:8;;;;;;;;5020:932;667:1;5966:4;:17;5962:243;;4550:2:19;4536:17;;;4487:27;;4474:41;6115:4:13;:59;;6170:4;6115:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;6136:31:13;6108:66;;6186:8;;;;5962:243;711:1;6219:4;:19;6215:472;;3390:1:19;3378:14;;;;3290:25;;;3277:39;3336:3;3332:14;;6409:13:13;;;;6309:12;;6494:53;6508:10;6520:26;6409:13;3378:14:19;6520:10:13;3290:25:19;6520:26:13;:::i;6494:53::-;622:9:20;656:13;;;683:2;676:14;715:2;702:16;;;6560:17:13;;;;;-1:-1:-1;6649:7:13;;-1:-1:-1;6668:8:13;;-1:-1:-1;;;6668:8:13;6215:472;802:1;6701:4;:19;6697:979;;6864:22;1390:25:19;;;1377:39;1432:3;1428:14;1475:1;1463:14;;6898:55:13;-1:-1:-1;6898:55:13;;;-1:-1:-1;6966:25:13;2699::19;;;2686:39;2745:3;2741:14;2797:1;2785:14;;7003:59:13;-1:-1:-1;7003:59:13;;;-1:-1:-1;7075:12:13;3290:25:19;;;3277:39;3336:3;3332:14;3390:1;3378:14;;7099:46:13;;;;;;;;;;;;;7157:15;7184:4;7175:6;:13;7157:31;;7201:22;7225:20;7290:53;7304:10;7316;;7327:6;7316:26;7334:7;7316:26;;;;;;;:::i;7290:53::-;7364:7;;-1:-1:-1;7364:7:13;;7257:86;;-1:-1:-1;7257:86:13;-1:-1:-1;7388:35:13;;;7384:92;;7439:24;;;;7384:92;2976:73;;;20362:66:22;2976:73:13;;;;20350:79:22;;;;20445:12;;;20438:28;;;20482:12;;;20475:28;;;20519:12;;;;20512:28;;;2976:73:13;;;;;;;;;;20556:13:22;;;;2976:73:13;;;2966:84;;;;;7585:4;:59;;7640:4;7585:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;7606:31:13;7578:66;;7657:8;;;;;;;;;;6697:979;758:1;7690:4;:22;7686:485;;4550:2:19;4536:17;;;4487:27;;4474:41;7920:23:13;;;7916:82;;7968:17;7959:26;;7916:82;8010:12;8025:37;8052:9;8025:26;:37::i;:::-;8010:52;-1:-1:-1;8081:4:13;:59;;8136:4;8081:59;;;622:9:20;656:13;;;683:2;676:14;;;715:2;702:16;;8102:31:13;8074:66;;8152:8;;;;;7686:485;8188:26;;;;;;;;2778:25:22;;;2751:18;;8188:26:13;2632:177:22;3765:4458:13;3678:4551;3525:4708;;;;;;:::o;1296:160:14:-;862:44;1372:7;656:13:20;;;683:2;676:14;;;715:2;702:16;;1394:57:14;543:185:20;6015:300:2;6101:4;6124:45;;;6140:29;6124:45;;:103;;-1:-1:-1;6179:48:2;;;6195:32;6179:48;6124:103;6113:147;;;-1:-1:-1;6249:4:2;;6015:300;-1:-1:-1;6015:300:2:o;6113:147::-;725:31:5;709:47;;;;6273:37:2;613:148:5;1767:2316:21;1867:14;1914:2;1893:23;;1889:70;;1948:10;;1925:34;;;;;;;;;;;;:::i;1889:70::-;1965:21;1989:43;2010:21;2030:1;2010:10;:21;:::i;:::-;1226:23:18;;1213:37;1266:3;1262:14;;1071:215;1989:43:21;1965:67;;;-1:-1:-1;2115:2:21;1226:23:18;;1213:37;1266:3;1262:14;795:37;;2202:2:21;808:23:18;;795:37;3209:66:21;3196:79;;3192:135;;;3306:10;;3318:1;3292:28;;;;;;;;;;;;;:::i;3192:135::-;3337:1;:7;;3342:2;3337:7;;:18;;;;;3348:1;:7;;3353:2;3348:7;;3337:18;3333:74;;;3386:10;;3398:1;3372:28;;;;;;;;;;;;;:::i;3333:74::-;1253:1;3447:13;:32;3443:509;;3498:25;;;;;;;;;;;;18522::22;;;18595:4;18583:17;;18563:18;;;18556:45;;;;18617:18;;;18610:34;;;18660:18;;;18653:34;;;3498:25:21;;18494:19:22;;3498:25:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3489:34;;3443:509;;;1303:1;3608:13;:34;3604:348;;3690:59;;18940:66:22;3690:59:21;;;18928:79:22;19023:12;;;19016:28;;;3661:130:21;;19060:12:22;;3690:59:21;;;;;;;;;;;;;3680:70;;3690:59;3680:70;;;;3661:130;;;;;;;;;18522:25:22;18595:4;18583:17;;18563:18;;;18556:45;18617:18;;;18610:34;;;18660:18;;;18653:34;;;18494:19;;3661:130:21;18295:398:22;3604:348:21;3913:10;;3925:13;3940:4;3888:57;;;;;;;;;;;;;;:::i;3604:348::-;3999:22;;;3995:63;;4047:10;;4030:28;;;;;;;;;;;;:::i;3995:63::-;4065:13;;;;1767:2316;;;;;:::o;4411:951::-;4535:10;4557:22;;;4553:66;;4596:16;;;;;;;;;;;;;;4553:66;4625:21;4655:10;;4666:21;4686:1;4655:10;4666:21;:::i;:::-;4655:33;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;1253:1:21;4699:32;;;:70;;;1303:1;4735:13;:34;4699:70;4695:663;;;4873:7;4837:43;;:32;4851:5;4858:10;;4837:13;:32::i;:::-;:43;;;4829:51;;4695:663;;;1359:1;4898:13;:40;4894:464;;5060:40;;;;5101:5;5108:10;5119:1;5108:10;5121:21;5141:1;5108:10;5121:21;:::i;:::-;5108:35;;;;;;;:::i;:::-;5060:84;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5030:114;;:26;:114;;-1:-1:-1;4894:464:21;;;5318:10;;5330:13;5345:5;5293:58;;;;;;;;;;;;;;:::i;4894:464::-;4547:815;4411:951;;;;;;:::o;2227:182:13:-;2346:57;;20822:66:22;2346:57:13;;;20810:79:22;20905:12;;;20898:28;;;2314:7:13;;20942:12:22;;2346:57:13;20580:380:22;14:177;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:347::-;689:8;699:6;753:3;746:4;738:6;734:17;730:27;720:55;;771:1;768;761:12;720:55;-1:-1:-1;794:20:22;;837:18;826:30;;823:50;;;869:1;866;859:12;823:50;906:4;898:6;894:17;882:29;;958:3;951:4;942:6;934;930:19;926:30;923:39;920:59;;;975:1;972;965:12;920:59;638:347;;;;;:::o;990:477::-;1069:6;1077;1085;1138:2;1126:9;1117:7;1113:23;1109:32;1106:52;;;1154:1;1151;1144:12;1106:52;1190:9;1177:23;1167:33;;1251:2;1240:9;1236:18;1223:32;1278:18;1270:6;1267:30;1264:50;;;1310:1;1307;1300:12;1264:50;1349:58;1399:7;1390:6;1379:9;1375:22;1349:58;:::i;:::-;990:477;;1426:8;;-1:-1:-1;1323:84:22;;-1:-1:-1;;;;990:477:22:o;1725:717::-;1815:6;1823;1831;1839;1892:2;1880:9;1871:7;1867:23;1863:32;1860:52;;;1908:1;1905;1898:12;1860:52;1948:9;1935:23;1977:18;2018:2;2010:6;2007:14;2004:34;;;2034:1;2031;2024:12;2004:34;2073:58;2123:7;2114:6;2103:9;2099:22;2073:58;:::i;:::-;2150:8;;-1:-1:-1;2047:84:22;-1:-1:-1;2238:2:22;2223:18;;2210:32;;-1:-1:-1;2254:16:22;;;2251:36;;;2283:1;2280;2273:12;2251:36;;2322:60;2374:7;2363:8;2352:9;2348:24;2322:60;:::i;:::-;1725:717;;;;-1:-1:-1;2401:8:22;-1:-1:-1;;;;1725:717:22:o;2447:180::-;2506:6;2559:2;2547:9;2538:7;2534:23;2530:32;2527:52;;;2575:1;2572;2565:12;2527:52;-1:-1:-1;2598:23:22;;2447:180;-1:-1:-1;2447:180:22:o;2814:387::-;2897:8;2907:6;2961:3;2954:4;2946:6;2942:17;2938:27;2928:55;;2979:1;2976;2969:12;2928:55;-1:-1:-1;3002:20:22;;3045:18;3034:30;;3031:50;;;3077:1;3074;3067:12;3031:50;3114:4;3106:6;3102:17;3090:29;;3174:3;3167:4;3157:6;3154:1;3150:14;3142:6;3138:27;3134:38;3131:47;3128:67;;;3191:1;3188;3181:12;3206:488;3323:6;3331;3384:2;3372:9;3363:7;3359:23;3355:32;3352:52;;;3400:1;3397;3390:12;3352:52;3440:9;3427:23;3473:18;3465:6;3462:30;3459:50;;;3505:1;3502;3495:12;3459:50;3544:90;3626:7;3617:6;3606:9;3602:22;3544:90;:::i;:::-;3653:8;;3518:116;;-1:-1:-1;3206:488:22;-1:-1:-1;;;;3206:488:22:o;3699:864::-;3845:6;3853;3861;3869;3877;3930:2;3918:9;3909:7;3905:23;3901:32;3898:52;;;3946:1;3943;3936:12;3898:52;3986:9;3973:23;4015:18;4056:2;4048:6;4045:14;4042:34;;;4072:1;4069;4062:12;4042:34;4111:90;4193:7;4184:6;4173:9;4169:22;4111:90;:::i;:::-;4220:8;;-1:-1:-1;4085:116:22;-1:-1:-1;4302:2:22;4287:18;;4274:32;;-1:-1:-1;4359:2:22;4344:18;;4331:32;;-1:-1:-1;4375:16:22;;;4372:36;;;4404:1;4401;4394:12;4372:36;;4443:60;4495:7;4484:8;4473:9;4469:24;4443:60;:::i;:::-;3699:864;;;;-1:-1:-1;3699:864:22;;-1:-1:-1;4522:8:22;;4417:86;3699:864;-1:-1:-1;;;3699:864:22:o;5403:184::-;5455:77;5452:1;5445:88;5552:4;5549:1;5542:15;5576:4;5573:1;5566:15;5592:980;5660:6;5713:2;5701:9;5692:7;5688:23;5684:32;5681:52;;;5729:1;5726;5719:12;5681:52;5769:9;5756:23;5798:18;5839:2;5831:6;5828:14;5825:34;;;5855:1;5852;5845:12;5825:34;5893:6;5882:9;5878:22;5868:32;;5938:7;5931:4;5927:2;5923:13;5919:27;5909:55;;5960:1;5957;5950:12;5909:55;5996:2;5983:16;6018:2;6014;6011:10;6008:36;;;6024:18;;:::i;:::-;6158:2;6152:9;6220:4;6212:13;;6063:66;6208:22;;;6232:2;6204:31;6200:40;6188:53;;;6256:18;;;6276:22;;;6253:46;6250:72;;;6302:18;;:::i;:::-;6342:10;6338:2;6331:22;6377:2;6369:6;6362:18;6417:7;6412:2;6407;6403;6399:11;6395:20;6392:33;6389:53;;;6438:1;6435;6428:12;6389:53;6494:2;6489;6485;6481:11;6476:2;6468:6;6464:15;6451:46;6539:1;6517:15;;;6534:2;6513:24;6506:35;;;;-1:-1:-1;6521:6:22;5592:980;-1:-1:-1;;;;;5592:980:22:o;6808:271::-;6991:6;6983;6978:3;6965:33;6947:3;7017:16;;7042:13;;;7017:16;6808:271;-1:-1:-1;6808:271:22:o;7416:160::-;7481:20;;7537:13;;7530:21;7520:32;;7510:60;;7566:1;7563;7556:12;7510:60;7416:160;;;:::o;7581:196::-;7649:20;;7709:42;7698:54;;7688:65;;7678:93;;7767:1;7764;7757:12;7782:325;7870:6;7865:3;7858:19;7922:6;7915:5;7908:4;7903:3;7899:14;7886:43;;7974:1;7967:4;7958:6;7953:3;7949:16;7945:27;7938:38;7840:3;8096:4;8026:66;8021:2;8013:6;8009:15;8005:88;8000:3;7996:98;7992:109;7985:116;;7782:325;;;;:::o;8112:2028::-;8232:6;8227:3;8220:19;8202:3;8258:4;8299:2;8294:3;8290:12;8324:11;8351;8344:18;;8401:6;8398:1;8394:14;8387:5;8383:26;8371:38;;8432:5;8455:1;8465:1649;8479:6;8476:1;8473:13;8465:1649;;;8550:5;8544:4;8540:16;8535:3;8528:29;8609:6;8596:20;8695:66;8687:5;8671:14;8667:26;8663:99;8643:18;8639:124;8629:152;;8777:1;8774;8767:12;8629:152;8809:30;;8862:4;8906:24;8809:30;8906:24;:::i;:::-;8899:32;8892:40;8886:4;8879:54;8982:33;9011:2;9002:7;8998:16;8982:33;:::i;:::-;8975:41;8968:49;8953:13;;;8946:72;9041:4;9093:16;;;9080:30;9065:13;;;9058:53;9134:4;9215:42;9177:36;9196:16;;;9177:36;:::i;:::-;9173:85;9158:13;;;9151:108;9282:4;9334:16;;;9321:30;9306:13;;;9299:53;9375:4;9433:16;;;9420:30;9507:14;9503:28;;;9533:66;9499:101;9473:128;;9463:156;;9615:1;9612;9605:12;9463:156;9647:34;;;9759:16;;;;-1:-1:-1;9710:21:22;9804:18;9791:32;;9788:52;;;9836:1;9833;9826:12;9788:52;9889:8;9873:14;9869:29;9860:7;9856:43;9853:63;;;9912:1;9909;9902:12;9853:63;9951:2;9946;9940:4;9936:13;9929:25;9975:59;10030:2;10024:4;10020:13;10010:8;10001:7;9975:59;:::i;:::-;10092:12;;;;9967:67;-1:-1:-1;;;10057:15:22;;;;-1:-1:-1;;8501:1:22;8494:9;8465:1649;;;-1:-1:-1;10130:4:22;;8112:2028;-1:-1:-1;;;;;;;8112:2028:22:o;10145:594::-;10495:2;10484:9;10477:21;10534:1;10529:2;10518:9;10514:18;10507:29;10572:7;10567:2;10556:9;10552:18;10545:35;10618:3;10611:4;10600:9;10596:20;10589:33;10458:4;10639:94;10728:3;10717:9;10713:19;10705:6;10697;10639:94;:::i;10744:595::-;11094:2;11083:9;11076:21;11133:1;11128:2;11117:9;11113:18;11106:29;11171:8;11166:2;11155:9;11151:18;11144:36;11218:3;11211:4;11200:9;11196:20;11189:33;11057:4;11239:94;11328:3;11317:9;11313:19;11305:6;11297;11239:94;:::i;11344:184::-;11396:77;11393:1;11386:88;11493:4;11490:1;11483:15;11517:4;11514:1;11507:15;11786:481;11827:3;11865:5;11859:12;11892:6;11887:3;11880:19;11917:1;11927:162;11941:6;11938:1;11935:13;11927:162;;;12003:4;12059:13;;;12055:22;;12049:29;12031:11;;;12027:20;;12020:59;11956:12;11927:162;;;11931:3;12134:1;12127:4;12118:6;12113:3;12109:16;12105:27;12098:38;12256:4;12186:66;12181:2;12173:6;12169:15;12165:88;12160:3;12156:98;12152:109;12145:116;;;11786:481;;;;:::o;12272:217::-;12419:2;12408:9;12401:21;12382:4;12439:44;12479:2;12468:9;12464:18;12456:6;12439:44;:::i;13090:387::-;13187:4;13245:11;13232:25;13335:66;13324:8;13308:14;13304:29;13300:102;13280:18;13276:127;13266:155;;13417:1;13414;13407:12;13266:155;13438:33;;;;;13090:387;-1:-1:-1;;13090:387:22:o;13482:180::-;13538:6;13591:2;13579:9;13570:7;13566:23;13562:32;13559:52;;;13607:1;13604;13597:12;13559:52;13630:26;13646:9;13630:26;:::i;13991:186::-;14050:6;14103:2;14091:9;14082:7;14078:23;14074:32;14071:52;;;14119:1;14116;14109:12;14071:52;14142:29;14161:9;14142:29;:::i;14182:580::-;14259:4;14265:6;14325:11;14312:25;14415:66;14404:8;14388:14;14384:29;14380:102;14360:18;14356:127;14346:155;;14497:1;14494;14487:12;14346:155;14524:33;;14576:20;;;-1:-1:-1;14619:18:22;14608:30;;14605:50;;;14651:1;14648;14641:12;14605:50;14684:4;14672:17;;-1:-1:-1;14715:14:22;14711:27;;;14701:38;;14698:58;;;14752:1;14749;14742:12;14767:184;14819:77;14816:1;14809:88;14916:4;14913:1;14906:15;14940:4;14937:1;14930:15;14956:195;14995:3;15026:66;15019:5;15016:77;15013:103;;15096:18;;:::i;:::-;-1:-1:-1;15143:1:22;15132:13;;14956:195::o;15156:331::-;15261:9;15272;15314:8;15302:10;15299:24;15296:44;;;15336:1;15333;15326:12;15296:44;15365:6;15355:8;15352:20;15349:40;;;15385:1;15382;15375:12;15349:40;-1:-1:-1;;15411:23:22;;;15456:25;;;;;-1:-1:-1;15156:331:22:o;15492:125::-;15557:9;;;15578:10;;;15575:36;;;15591:18;;:::i;15622:392::-;15841:2;15830:9;15823:21;15804:4;15861:61;15918:2;15907:9;15903:18;15895:6;15887;15861:61;:::i;:::-;15953:2;15938:18;;15931:34;;;;-1:-1:-1;15996:2:22;15981:18;15974:34;15853:69;15622:392;-1:-1:-1;;15622:392:22:o;16525:288::-;16700:6;16689:9;16682:25;16743:2;16738;16727:9;16723:18;16716:30;16663:4;16763:44;16803:2;16792:9;16788:18;16780:6;16763:44;:::i;16818:441::-;17037:6;17026:9;17019:25;17092:42;17084:6;17080:55;17075:2;17064:9;17060:18;17053:83;17172:2;17167;17156:9;17152:18;17145:30;17000:4;17192:61;17249:2;17238:9;17234:18;17226:6;17218;17192:61;:::i;:::-;17184:69;16818:441;-1:-1:-1;;;;;;16818:441:22:o;17264:244::-;17421:2;17410:9;17403:21;17384:4;17441:61;17498:2;17487:9;17483:18;17475:6;17467;17441:61;:::i;17513:128::-;17580:9;;;17601:11;;;17598:37;;;17615:18;;:::i;17646:315::-;17831:2;17820:9;17813:21;17794:4;17851:61;17908:2;17897:9;17893:18;17885:6;17877;17851:61;:::i;:::-;17843:69;;17948:6;17943:2;17932:9;17928:18;17921:34;17646:315;;;;;;:::o;17966:324::-;18149:2;18138:9;18131:21;18112:4;18169:61;18226:2;18215:9;18211:18;18203:6;18195;18169:61;:::i;:::-;18161:69;;18278:4;18270:6;18266:17;18261:2;18250:9;18246:18;18239:45;17966:324;;;;;;:::o;19083:396::-;19290:2;19279:9;19272:21;19253:4;19310:61;19367:2;19356:9;19352:18;19344:6;19336;19310:61;:::i;:::-;19402:2;19387:18;;19380:34;;;;-1:-1:-1;19457:14:22;;19450:22;19445:2;19430:18;;;19423:50;19302:69;19083:396;-1:-1:-1;;19083:396:22:o;19484:321::-;19675:6;19664:9;19657:25;19718:2;19713;19702:9;19698:18;19691:30;19638:4;19738:61;19795:2;19784:9;19780:18;19772:6;19764;19738:61;:::i;:::-;19730:69;19484:321;-1:-1:-1;;;;;19484:321:22:o;19810:249::-;19879:6;19932:2;19920:9;19911:7;19907:23;19903:32;19900:52;;;19948:1;19945;19938:12;19900:52;19980:9;19974:16;19999:30;20023:5;19999:30;:::i" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "1734000", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "SET_IMAGE_HASH_TYPE_HASH()": "262", + "createContract(bytes)": "infinite", + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": "infinite", + "isValidSignature(bytes,bytes)": "infinite", + "isValidSignature(bytes32,bytes)": "infinite", + "nonce()": "2645", + "readNonce(uint256)": "2640", + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": "infinite", + "signatureRecovery(bytes32,bytes)": "infinite", + "supportsInterface(bytes4)": "infinite", + "updateImageHash(bytes32)": "357" + }, + "internal": { + "_executeGuest(bytes32,struct IModuleCalls.Transaction calldata[] calldata)": "infinite", + "_isValidImage(bytes32)": "infinite", + "_updateImageHash(bytes32)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "A0" + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 640, + "end": 3333, + "name": "MSTORE", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "CALLVALUE", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "1" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "REVERT", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "tag", + "source": 1, + "value": "1" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 200, + "end": 204, + "name": "ADDRESS", + "source": 7 + }, + { + "begin": 185, + "end": 205, + "name": "PUSH", + "source": 7, + "value": "80" + }, + { + "begin": 185, + "end": 205, + "name": "MSTORE", + "source": 7 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "80" + }, + { + "begin": 640, + "end": 3333, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH #[$]", + "source": 1, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [$]", + "source": 1, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "CODECOPY", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "ASSIGNIMMUTABLE", + "source": 1, + "value": "1055" + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH #[$]", + "source": 1, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "RETURN", + "source": 1 + } + ], + ".data": { + "0": { + ".auxdata": "a26469706673582212209bb95d18e97f278aa47e0c04c20d5a6af9bdb6d473c6d4051192cd96fc17866864736f6c63430008120033", + ".code": [ + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "80" + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 640, + "end": 3333, + "name": "MSTORE", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "4" + }, + { + "begin": 640, + "end": 3333, + "name": "CALLDATASIZE", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "LT", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "1" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "CALLDATALOAD", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "E0" + }, + { + "begin": 640, + "end": 3333, + "name": "SHR", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "61C2926C" + }, + { + "begin": 640, + "end": 3333, + "name": "GT", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "13" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "8C3F5563" + }, + { + "begin": 640, + "end": 3333, + "name": "GT", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "14" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "8C3F5563" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "10" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "90042BAF" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "11" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "AFFED0E0" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "12" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "REVERT", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "tag", + "source": 1, + "value": "14" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "61C2926C" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "7" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "7A9A1628" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "8" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "853C5068" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "9" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "REVERT", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "tag", + "source": 1, + "value": "13" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "20C13B0B" + }, + { + "begin": 640, + "end": 3333, + "name": "GT", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "15" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "20C13B0B" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "4" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "29561426" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "5" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "57C56D6B" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "6" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "REVERT", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "tag", + "source": 1, + "value": "15" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "1FFC9A7" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "2" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "1626BA7E" + }, + { + "begin": 640, + "end": 3333, + "name": "EQ", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH [tag]", + "source": 1, + "value": "3" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "tag", + "source": 1, + "value": "1" + }, + { + "begin": 640, + "end": 3333, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 640, + "end": 3333, + "name": "DUP1", + "source": 1 + }, + { + "begin": 640, + "end": 3333, + "name": "REVERT", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "tag", + "source": 1, + "value": "2" + }, + { + "begin": 3127, + "end": 3331, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "CALLVALUE", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "DUP1", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH [tag]", + "source": 1, + "value": "16" + }, + { + "begin": 3127, + "end": 3331, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 3127, + "end": 3331, + "name": "DUP1", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "REVERT", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "tag", + "source": 1, + "value": "16" + }, + { + "begin": 3127, + "end": 3331, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH [tag]", + "source": 1, + "value": "17" + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH [tag]", + "source": 1, + "value": "18" + }, + { + "begin": 3127, + "end": 3331, + "name": "CALLDATASIZE", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH", + "source": 1, + "value": "4" + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH [tag]", + "source": 1, + "value": "19" + }, + { + "begin": 3127, + "end": 3331, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "tag", + "source": 1, + "value": "18" + }, + { + "begin": 3127, + "end": 3331, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH [tag]", + "source": 1, + "value": "20" + }, + { + "begin": 3127, + "end": 3331, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "tag", + "source": 1, + "value": "17" + }, + { + "begin": 3127, + "end": 3331, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 3127, + "end": 3331, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 611, + "end": 625, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 611, + "end": 625, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 604, + "end": 626, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 586, + "end": 627, + "name": "DUP2", + "source": 22 + }, + { + "begin": 586, + "end": 627, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 574, + "end": 576, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 559, + "end": 577, + "name": "ADD", + "source": 22 + }, + { + "begin": 3127, + "end": 3331, + "name": "tag", + "source": 1, + "value": "21" + }, + { + "begin": 3127, + "end": 3331, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 3127, + "end": 3331, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "DUP1", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "SWAP2", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "SUB", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "RETURN", + "source": 1 + }, + { + "begin": 5489, + "end": 5805, + "name": "tag", + "source": 2, + "value": "3" + }, + { + "begin": 5489, + "end": 5805, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "CALLVALUE", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "DUP1", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "ISZERO", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH [tag]", + "source": 2, + "value": "23" + }, + { + "begin": 5489, + "end": 5805, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 5489, + "end": 5805, + "name": "DUP1", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "REVERT", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "tag", + "source": 2, + "value": "23" + }, + { + "begin": 5489, + "end": 5805, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH [tag]", + "source": 2, + "value": "24" + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH [tag]", + "source": 2, + "value": "25" + }, + { + "begin": 5489, + "end": 5805, + "name": "CALLDATASIZE", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH", + "source": 2, + "value": "4" + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH [tag]", + "source": 2, + "value": "26" + }, + { + "begin": 5489, + "end": 5805, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "tag", + "source": 2, + "value": "25" + }, + { + "begin": 5489, + "end": 5805, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH [tag]", + "source": 2, + "value": "27" + }, + { + "begin": 5489, + "end": 5805, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "tag", + "source": 2, + "value": "24" + }, + { + "begin": 5489, + "end": 5805, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH", + "source": 2, + "value": "40" + }, + { + "begin": 5489, + "end": 5805, + "name": "MLOAD", + "source": 2 + }, + { + "begin": 1646, + "end": 1712, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1634, + "end": 1713, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 1634, + "end": 1713, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 1634, + "end": 1713, + "name": "AND", + "source": 22 + }, + { + "begin": 1616, + "end": 1714, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1616, + "end": 1714, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 1604, + "end": 1606, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 1589, + "end": 1607, + "name": "ADD", + "source": 22 + }, + { + "begin": 5489, + "end": 5805, + "name": "PUSH [tag]", + "source": 2, + "value": "21" + }, + { + "begin": 1472, + "end": 1720, + "name": "JUMP", + "source": 22 + }, + { + "begin": 4525, + "end": 4857, + "name": "tag", + "source": 2, + "value": "4" + }, + { + "begin": 4525, + "end": 4857, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "CALLVALUE", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "DUP1", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "ISZERO", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "PUSH [tag]", + "source": 2, + "value": "30" + }, + { + "begin": 4525, + "end": 4857, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 4525, + "end": 4857, + "name": "DUP1", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "REVERT", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "tag", + "source": 2, + "value": "30" + }, + { + "begin": 4525, + "end": 4857, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4525, + "end": 4857, + "name": "PUSH [tag]", + "source": 2, + "value": "24" + }, + { + "begin": 4525, + "end": 4857, + "name": "PUSH [tag]", + "source": 2, + "value": "32" + }, + { + "begin": 4525, + "end": 4857, + "name": "CALLDATASIZE", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "PUSH", + "source": 2, + "value": "4" + }, + { + "begin": 4525, + "end": 4857, + "name": "PUSH [tag]", + "source": 2, + "value": "33" + }, + { + "begin": 4525, + "end": 4857, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "tag", + "source": 2, + "value": "32" + }, + { + "begin": 4525, + "end": 4857, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "PUSH [tag]", + "source": 2, + "value": "34" + }, + { + "begin": 4525, + "end": 4857, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "tag", + "source": 2, + "value": "5" + }, + { + "begin": 6456, + "end": 6575, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "CALLVALUE", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "DUP1", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "ISZERO", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "PUSH [tag]", + "source": 2, + "value": "36" + }, + { + "begin": 6456, + "end": 6575, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 6456, + "end": 6575, + "name": "DUP1", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "REVERT", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "tag", + "source": 2, + "value": "36" + }, + { + "begin": 6456, + "end": 6575, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6456, + "end": 6575, + "name": "PUSH [tag]", + "source": 2, + "value": "37" + }, + { + "begin": 6456, + "end": 6575, + "name": "PUSH [tag]", + "source": 2, + "value": "38" + }, + { + "begin": 6456, + "end": 6575, + "name": "CALLDATASIZE", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "PUSH", + "source": 2, + "value": "4" + }, + { + "begin": 6456, + "end": 6575, + "name": "PUSH [tag]", + "source": 2, + "value": "39" + }, + { + "begin": 6456, + "end": 6575, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "tag", + "source": 2, + "value": "38" + }, + { + "begin": 6456, + "end": 6575, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "PUSH [tag]", + "source": 2, + "value": "40" + }, + { + "begin": 6456, + "end": 6575, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "tag", + "source": 2, + "value": "37" + }, + { + "begin": 6456, + "end": 6575, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "STOP", + "source": 2 + }, + { + "begin": 811, + "end": 906, + "name": "tag", + "source": 14, + "value": "6" + }, + { + "begin": 811, + "end": 906, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "CALLVALUE", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "DUP1", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "ISZERO", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "PUSH [tag]", + "source": 14, + "value": "41" + }, + { + "begin": 811, + "end": 906, + "name": "JUMPI", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "PUSH", + "source": 14, + "value": "0" + }, + { + "begin": 811, + "end": 906, + "name": "DUP1", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "REVERT", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "tag", + "source": 14, + "value": "41" + }, + { + "begin": 811, + "end": 906, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "POP", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "PUSH [tag]", + "source": 14, + "value": "42" + }, + { + "begin": 862, + "end": 906, + "name": "PUSH", + "source": 14, + "value": "8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1" + }, + { + "begin": 811, + "end": 906, + "name": "DUP2", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "JUMP", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "tag", + "source": 14, + "value": "42" + }, + { + "begin": 811, + "end": 906, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 811, + "end": 906, + "name": "PUSH", + "source": 14, + "value": "40" + }, + { + "begin": 811, + "end": 906, + "name": "MLOAD", + "source": 14 + }, + { + "begin": 2778, + "end": 2803, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 2778, + "end": 2803, + "name": "DUP2", + "source": 22 + }, + { + "begin": 2778, + "end": 2803, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2766, + "end": 2768, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 2751, + "end": 2769, + "name": "ADD", + "source": 22 + }, + { + "begin": 811, + "end": 906, + "name": "PUSH [tag]", + "source": 14, + "value": "21" + }, + { + "begin": 2632, + "end": 2809, + "name": "JUMP", + "source": 22 + }, + { + "begin": 1290, + "end": 1552, + "name": "tag", + "source": 1, + "value": "7" + }, + { + "begin": 1290, + "end": 1552, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "CALLVALUE", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "DUP1", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "PUSH [tag]", + "source": 1, + "value": "46" + }, + { + "begin": 1290, + "end": 1552, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 1290, + "end": 1552, + "name": "DUP1", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "REVERT", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "tag", + "source": 1, + "value": "46" + }, + { + "begin": 1290, + "end": 1552, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1290, + "end": 1552, + "name": "PUSH [tag]", + "source": 1, + "value": "37" + }, + { + "begin": 1290, + "end": 1552, + "name": "PUSH [tag]", + "source": 1, + "value": "48" + }, + { + "begin": 1290, + "end": 1552, + "name": "CALLDATASIZE", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "PUSH", + "source": 1, + "value": "4" + }, + { + "begin": 1290, + "end": 1552, + "name": "PUSH [tag]", + "source": 1, + "value": "49" + }, + { + "begin": 1290, + "end": 1552, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "tag", + "source": 1, + "value": "48" + }, + { + "begin": 1290, + "end": 1552, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "PUSH [tag]", + "source": 1, + "value": "50" + }, + { + "begin": 1290, + "end": 1552, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "tag", + "source": 1, + "value": "8" + }, + { + "begin": 890, + "end": 1182, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "CALLVALUE", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "DUP1", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "PUSH [tag]", + "source": 1, + "value": "51" + }, + { + "begin": 890, + "end": 1182, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 890, + "end": 1182, + "name": "DUP1", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "REVERT", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "tag", + "source": 1, + "value": "51" + }, + { + "begin": 890, + "end": 1182, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 890, + "end": 1182, + "name": "PUSH [tag]", + "source": 1, + "value": "37" + }, + { + "begin": 890, + "end": 1182, + "name": "PUSH [tag]", + "source": 1, + "value": "53" + }, + { + "begin": 890, + "end": 1182, + "name": "CALLDATASIZE", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "PUSH", + "source": 1, + "value": "4" + }, + { + "begin": 890, + "end": 1182, + "name": "PUSH [tag]", + "source": 1, + "value": "54" + }, + { + "begin": 890, + "end": 1182, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "tag", + "source": 1, + "value": "53" + }, + { + "begin": 890, + "end": 1182, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "PUSH [tag]", + "source": 1, + "value": "55" + }, + { + "begin": 890, + "end": 1182, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1675, + "end": 3161, + "name": "tag", + "source": 2, + "value": "9" + }, + { + "begin": 1675, + "end": 3161, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "CALLVALUE", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "DUP1", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "ISZERO", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH [tag]", + "source": 2, + "value": "56" + }, + { + "begin": 1675, + "end": 3161, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 1675, + "end": 3161, + "name": "DUP1", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "REVERT", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "tag", + "source": 2, + "value": "56" + }, + { + "begin": 1675, + "end": 3161, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH [tag]", + "source": 2, + "value": "57" + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH [tag]", + "source": 2, + "value": "58" + }, + { + "begin": 1675, + "end": 3161, + "name": "CALLDATASIZE", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH", + "source": 2, + "value": "4" + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH [tag]", + "source": 2, + "value": "26" + }, + { + "begin": 1675, + "end": 3161, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "tag", + "source": 2, + "value": "58" + }, + { + "begin": 1675, + "end": 3161, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH [tag]", + "source": 2, + "value": "59" + }, + { + "begin": 1675, + "end": 3161, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "tag", + "source": 2, + "value": "57" + }, + { + "begin": 1675, + "end": 3161, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH", + "source": 2, + "value": "40" + }, + { + "begin": 1675, + "end": 3161, + "name": "DUP1", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "MLOAD", + "source": 2 + }, + { + "begin": 4827, + "end": 4852, + "name": "SWAP6", + "source": 22 + }, + { + "begin": 4827, + "end": 4852, + "name": "DUP7", + "source": 22 + }, + { + "begin": 4827, + "end": 4852, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 4883, + "end": 4885, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 4868, + "end": 4886, + "name": "DUP7", + "source": 22 + }, + { + "begin": 4868, + "end": 4886, + "name": "ADD", + "source": 22 + }, + { + "begin": 4861, + "end": 4895, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 4861, + "end": 4895, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 4861, + "end": 4895, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 4861, + "end": 4895, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 4911, + "end": 4929, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 4911, + "end": 4929, + "name": "DUP5", + "source": 22 + }, + { + "begin": 4911, + "end": 4929, + "name": "ADD", + "source": 22 + }, + { + "begin": 4904, + "end": 4938, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 4904, + "end": 4938, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 4904, + "end": 4938, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 4904, + "end": 4938, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 4969, + "end": 4971, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 4954, + "end": 4972, + "name": "DUP4", + "source": 22 + }, + { + "begin": 4954, + "end": 4972, + "name": "ADD", + "source": 22 + }, + { + "begin": 4947, + "end": 4981, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 5012, + "end": 5015, + "name": "PUSH", + "source": 22, + "value": "80" + }, + { + "begin": 4997, + "end": 5016, + "name": "DUP3", + "source": 22 + }, + { + "begin": 4997, + "end": 5016, + "name": "ADD", + "source": 22 + }, + { + "begin": 4990, + "end": 5025, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 4814, + "end": 4817, + "name": "PUSH", + "source": 22, + "value": "A0" + }, + { + "begin": 4799, + "end": 4818, + "name": "ADD", + "source": 22 + }, + { + "begin": 1675, + "end": 3161, + "name": "PUSH [tag]", + "source": 2, + "value": "21" + }, + { + "begin": 4568, + "end": 5031, + "name": "JUMP", + "source": 22 + }, + { + "begin": 938, + "end": 1094, + "name": "tag", + "source": 6, + "value": "10" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "CALLVALUE", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "DUP1", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "ISZERO", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "62" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPI", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 938, + "end": 1094, + "name": "DUP1", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "REVERT", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "tag", + "source": 6, + "value": "62" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "42" + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "64" + }, + { + "begin": 938, + "end": 1094, + "name": "CALLDATASIZE", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH", + "source": 6, + "value": "4" + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "39" + }, + { + "begin": 938, + "end": 1094, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "tag", + "source": 6, + "value": "64" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "66" + }, + { + "begin": 938, + "end": 1094, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 456, + "end": 732, + "name": "tag", + "source": 4, + "value": "11" + }, + { + "begin": 456, + "end": 732, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "69" + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "70" + }, + { + "begin": 456, + "end": 732, + "name": "CALLDATASIZE", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH", + "source": 4, + "value": "4" + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "71" + }, + { + "begin": 456, + "end": 732, + "jumpType": "[in]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "tag", + "source": 4, + "value": "70" + }, + { + "begin": 456, + "end": 732, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "72" + }, + { + "begin": 456, + "end": 732, + "jumpType": "[in]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "tag", + "source": 4, + "value": "69" + }, + { + "begin": 456, + "end": 732, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 456, + "end": 732, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 6753, + "end": 6795, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 6741, + "end": 6796, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 6741, + "end": 6796, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 6741, + "end": 6796, + "name": "AND", + "source": 22 + }, + { + "begin": 6723, + "end": 6797, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6723, + "end": 6797, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 6711, + "end": 6713, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 6696, + "end": 6714, + "name": "ADD", + "source": 22 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "21" + }, + { + "begin": 6577, + "end": 6803, + "name": "JUMP", + "source": 22 + }, + { + "begin": 670, + "end": 757, + "name": "tag", + "source": 6, + "value": "12" + }, + { + "begin": 670, + "end": 757, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "CALLVALUE", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "DUP1", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "ISZERO", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "PUSH [tag]", + "source": 6, + "value": "75" + }, + { + "begin": 670, + "end": 757, + "name": "JUMPI", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 670, + "end": 757, + "name": "DUP1", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "REVERT", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "tag", + "source": 6, + "value": "75" + }, + { + "begin": 670, + "end": 757, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "POP", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "PUSH [tag]", + "source": 6, + "value": "42" + }, + { + "begin": 670, + "end": 757, + "name": "PUSH [tag]", + "source": 6, + "value": "77" + }, + { + "begin": 670, + "end": 757, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 3127, + "end": 3331, + "name": "tag", + "source": 1, + "value": "20" + }, + { + "begin": 3127, + "end": 3331, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 3270, + "end": 3274, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 3289, + "end": 3326, + "name": "PUSH [tag]", + "source": 1, + "value": "80" + }, + { + "begin": 3313, + "end": 3325, + "name": "DUP3", + "source": 1 + }, + { + "begin": 3289, + "end": 3312, + "name": "PUSH [tag]", + "source": 1, + "value": "81" + }, + { + "begin": 3289, + "end": 3326, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 3289, + "end": 3326, + "name": "tag", + "source": 1, + "value": "80" + }, + { + "begin": 3289, + "end": 3326, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 3282, + "end": 3326, + "name": "SWAP3", + "source": 1 + }, + { + "begin": 3127, + "end": 3331, + "name": "SWAP2", + "source": 1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3127, + "end": 3331, + "jumpType": "[out]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 5489, + "end": 5805, + "name": "tag", + "source": 2, + "value": "27" + }, + { + "begin": 5489, + "end": 5805, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 5608, + "end": 5614, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 5650, + "end": 5662, + "name": "DUP1", + "source": 2 + }, + { + "begin": 5667, + "end": 5707, + "name": "PUSH [tag]", + "source": 2, + "value": "83" + }, + { + "begin": 5688, + "end": 5693, + "name": "DUP6", + "source": 2 + }, + { + "begin": 5695, + "end": 5706, + "name": "DUP6", + "source": 2 + }, + { + "begin": 5695, + "end": 5706, + "name": "DUP6", + "source": 2 + }, + { + "begin": 5667, + "end": 5687, + "name": "PUSH [tag]", + "source": 2, + "value": "84" + }, + { + "begin": 5667, + "end": 5707, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 5667, + "end": 5707, + "name": "tag", + "source": 2, + "value": "83" + }, + { + "begin": 5667, + "end": 5707, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 5649, + "end": 5707, + "name": "POP", + "source": 2 + }, + { + "begin": 5649, + "end": 5707, + "name": "SWAP1", + "source": 2 + }, + { + "begin": 5649, + "end": 5707, + "name": "POP", + "source": 2 + }, + { + "begin": 5717, + "end": 5724, + "name": "DUP1", + "source": 2 + }, + { + "begin": 5713, + "end": 5778, + "name": "ISZERO", + "source": 2 + }, + { + "begin": 5713, + "end": 5778, + "name": "PUSH [tag]", + "source": 2, + "value": "85" + }, + { + "begin": 5713, + "end": 5778, + "name": "JUMPI", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5741, + "end": 5771, + "name": "PUSH", + "source": 2, + "value": "1626BA7E00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 5741, + "end": 5771, + "name": "SWAP1", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5734, + "end": 5771, + "name": "PUSH [tag]", + "source": 2, + "value": "82" + }, + { + "begin": 5734, + "end": 5771, + "name": "JUMP", + "source": 2 + }, + { + "begin": 5713, + "end": 5778, + "name": "tag", + "source": 2, + "value": "85" + }, + { + "begin": 5713, + "end": 5778, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5798, + "end": 5799, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 5798, + "end": 5799, + "name": "SWAP1", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5489, + "end": 5805, + "name": "tag", + "source": 2, + "value": "82" + }, + { + "begin": 5489, + "end": 5805, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "SWAP4", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "SWAP3", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "POP", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "POP", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "name": "POP", + "source": 2 + }, + { + "begin": 5489, + "end": 5805, + "jumpType": "[out]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "tag", + "source": 2, + "value": "34" + }, + { + "begin": 4525, + "end": 4857, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 4651, + "end": 4657, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 4693, + "end": 4705, + "name": "DUP1", + "source": 2 + }, + { + "begin": 4710, + "end": 4761, + "name": "PUSH [tag]", + "source": 2, + "value": "87" + }, + { + "begin": 4741, + "end": 4746, + "name": "DUP7", + "source": 2 + }, + { + "begin": 4741, + "end": 4746, + "name": "DUP7", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "PUSH", + "source": 2, + "value": "40" + }, + { + "begin": 4731, + "end": 4747, + "name": "MLOAD", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "PUSH [tag]", + "source": 2, + "value": "88" + }, + { + "begin": 4731, + "end": 4747, + "name": "SWAP3", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "SWAP2", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "SWAP1", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "PUSH [tag]", + "source": 2, + "value": "89" + }, + { + "begin": 4731, + "end": 4747, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "tag", + "source": 2, + "value": "88" + }, + { + "begin": 4731, + "end": 4747, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "PUSH", + "source": 2, + "value": "40" + }, + { + "begin": 4731, + "end": 4747, + "name": "MLOAD", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "DUP1", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "SWAP2", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "SUB", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "SWAP1", + "source": 2 + }, + { + "begin": 4731, + "end": 4747, + "name": "KECCAK256", + "source": 2 + }, + { + "begin": 4749, + "end": 4760, + "name": "DUP6", + "source": 2 + }, + { + "begin": 4749, + "end": 4760, + "name": "DUP6", + "source": 2 + }, + { + "begin": 4710, + "end": 4730, + "name": "PUSH [tag]", + "source": 2, + "value": "84" + }, + { + "begin": 4710, + "end": 4761, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 4710, + "end": 4761, + "name": "tag", + "source": 2, + "value": "87" + }, + { + "begin": 4710, + "end": 4761, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 4692, + "end": 4761, + "name": "POP", + "source": 2 + }, + { + "begin": 4692, + "end": 4761, + "name": "SWAP1", + "source": 2 + }, + { + "begin": 4692, + "end": 4761, + "name": "POP", + "source": 2 + }, + { + "begin": 4771, + "end": 4778, + "name": "DUP1", + "source": 2 + }, + { + "begin": 4767, + "end": 4830, + "name": "ISZERO", + "source": 2 + }, + { + "begin": 4767, + "end": 4830, + "name": "PUSH [tag]", + "source": 2, + "value": "90" + }, + { + "begin": 4767, + "end": 4830, + "name": "JUMPI", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4795, + "end": 4823, + "name": "PUSH", + "source": 2, + "value": "20C13B0B00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 4795, + "end": 4823, + "name": "SWAP1", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4788, + "end": 4823, + "name": "PUSH [tag]", + "source": 2, + "value": "86" + }, + { + "begin": 4788, + "end": 4823, + "name": "JUMP", + "source": 2 + }, + { + "begin": 4767, + "end": 4830, + "name": "tag", + "source": 2, + "value": "90" + }, + { + "begin": 4767, + "end": 4830, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4850, + "end": 4851, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 4850, + "end": 4851, + "name": "SWAP1", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4525, + "end": 4857, + "name": "tag", + "source": 2, + "value": "86" + }, + { + "begin": 4525, + "end": 4857, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "SWAP5", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "SWAP4", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "POP", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "POP", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "POP", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "name": "POP", + "source": 2 + }, + { + "begin": 4525, + "end": 4857, + "jumpType": "[out]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "tag", + "source": 2, + "value": "40" + }, + { + "begin": 6456, + "end": 6575, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 178, + "end": 188, + "name": "CALLER", + "source": 8 + }, + { + "begin": 200, + "end": 204, + "name": "ADDRESS", + "source": 8 + }, + { + "begin": 178, + "end": 205, + "name": "EQ", + "source": 8 + }, + { + "begin": 174, + "end": 268, + "name": "PUSH [tag]", + "source": 8, + "value": "92" + }, + { + "begin": 174, + "end": 268, + "name": "JUMPI", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "40" + }, + { + "begin": 222, + "end": 261, + "name": "MLOAD", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "E125889400000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 222, + "end": 261, + "name": "DUP2", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "MSTORE", + "source": 8 + }, + { + "begin": 235, + "end": 245, + "name": "CALLER", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "4" + }, + { + "begin": 222, + "end": 261, + "name": "DUP3", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "ADD", + "source": 8 + }, + { + "begin": 7319, + "end": 7353, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 255, + "end": 259, + "name": "ADDRESS", + "source": 8 + }, + { + "begin": 7369, + "end": 7387, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 7369, + "end": 7387, + "name": "DUP3", + "source": 22 + }, + { + "begin": 7369, + "end": 7387, + "name": "ADD", + "source": 22 + }, + { + "begin": 7362, + "end": 7405, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 7231, + "end": 7249, + "name": "PUSH", + "source": 22, + "value": "44" + }, + { + "begin": 7231, + "end": 7249, + "name": "ADD", + "source": 22 + }, + { + "begin": 222, + "end": 261, + "name": "tag", + "source": 8, + "value": "93" + }, + { + "begin": 222, + "end": 261, + "name": "JUMPDEST", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "40" + }, + { + "begin": 222, + "end": 261, + "name": "MLOAD", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "DUP1", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "SWAP2", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "SUB", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "SWAP1", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "REVERT", + "source": 8 + }, + { + "begin": 174, + "end": 268, + "name": "tag", + "source": 8, + "value": "92" + }, + { + "begin": 174, + "end": 268, + "name": "JUMPDEST", + "source": 8 + }, + { + "begin": 6542, + "end": 6570, + "modifierDepth": 1, + "name": "PUSH [tag]", + "source": 2, + "value": "96" + }, + { + "begin": 6559, + "end": 6569, + "modifierDepth": 1, + "name": "DUP2", + "source": 2 + }, + { + "begin": 6542, + "end": 6558, + "modifierDepth": 1, + "name": "PUSH [tag]", + "source": 2, + "value": "97" + }, + { + "begin": 6542, + "end": 6570, + "jumpType": "[in]", + "modifierDepth": 1, + "name": "JUMP", + "source": 2 + }, + { + "begin": 6542, + "end": 6570, + "modifierDepth": 1, + "name": "tag", + "source": 2, + "value": "96" + }, + { + "begin": 6542, + "end": 6570, + "modifierDepth": 1, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "name": "POP", + "source": 2 + }, + { + "begin": 6456, + "end": 6575, + "jumpType": "[out]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 1290, + "end": 1552, + "name": "tag", + "source": 1, + "value": "50" + }, + { + "begin": 1290, + "end": 1552, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1401, + "end": 1415, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 1418, + "end": 1481, + "name": "PUSH [tag]", + "source": 1, + "value": "99" + }, + { + "begin": 1474, + "end": 1478, + "name": "DUP4", + "source": 1 + }, + { + "begin": 1474, + "end": 1478, + "name": "DUP4", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 1454, + "end": 1479, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "PUSH", + "source": 1, + "value": "20" + }, + { + "begin": 1454, + "end": 1479, + "name": "ADD", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "PUSH [tag]", + "source": 1, + "value": "100" + }, + { + "begin": 1454, + "end": 1479, + "name": "SWAP3", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "SWAP2", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "PUSH [tag]", + "source": 1, + "value": "101" + }, + { + "begin": 1454, + "end": 1479, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "tag", + "source": 1, + "value": "100" + }, + { + "begin": 1454, + "end": 1479, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 1454, + "end": 1479, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "PUSH", + "source": 1, + "value": "20" + }, + { + "begin": 1454, + "end": 1479, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "DUP4", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "SUB", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "SUB", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "MSTORE", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1454, + "end": 1479, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 1454, + "end": 1479, + "name": "MSTORE", + "source": 1 + }, + { + "begin": 1444, + "end": 1480, + "name": "DUP1", + "source": 1 + }, + { + "begin": 1444, + "end": 1480, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 1444, + "end": 1480, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1444, + "end": 1480, + "name": "PUSH", + "source": 1, + "value": "20" + }, + { + "begin": 1444, + "end": 1480, + "name": "ADD", + "source": 1 + }, + { + "begin": 1444, + "end": 1480, + "name": "KECCAK256", + "source": 1 + }, + { + "begin": 1418, + "end": 1443, + "name": "PUSH [tag]", + "source": 1, + "value": "102" + }, + { + "begin": 1418, + "end": 1481, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1418, + "end": 1481, + "name": "tag", + "source": 1, + "value": "99" + }, + { + "begin": 1418, + "end": 1481, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1401, + "end": 1481, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1401, + "end": 1481, + "name": "POP", + "source": 1 + }, + { + "begin": 1520, + "end": 1547, + "name": "PUSH [tag]", + "source": 1, + "value": "103" + }, + { + "begin": 1534, + "end": 1540, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1542, + "end": 1546, + "name": "DUP5", + "source": 1 + }, + { + "begin": 1542, + "end": 1546, + "name": "DUP5", + "source": 1 + }, + { + "begin": 1520, + "end": 1533, + "name": "PUSH [tag]", + "source": 1, + "value": "104" + }, + { + "begin": 1520, + "end": 1547, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1520, + "end": 1547, + "name": "tag", + "source": 1, + "value": "103" + }, + { + "begin": 1520, + "end": 1547, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1364, + "end": 1552, + "name": "POP", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "POP", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "name": "POP", + "source": 1 + }, + { + "begin": 1290, + "end": 1552, + "jumpType": "[out]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "tag", + "source": 1, + "value": "55" + }, + { + "begin": 890, + "end": 1182, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1030, + "end": 1044, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 1047, + "end": 1111, + "name": "PUSH [tag]", + "source": 1, + "value": "106" + }, + { + "begin": 1104, + "end": 1108, + "name": "DUP7", + "source": 1 + }, + { + "begin": 1104, + "end": 1108, + "name": "DUP7", + "source": 1 + }, + { + "begin": 1083, + "end": 1109, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 1083, + "end": 1109, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 1083, + "end": 1109, + "name": "PUSH", + "source": 1, + "value": "20" + }, + { + "begin": 1083, + "end": 1109, + "name": "ADD", + "source": 1 + }, + { + "begin": 1083, + "end": 1109, + "name": "PUSH [tag]", + "source": 1, + "value": "100" + }, + { + "begin": 1083, + "end": 1109, + "name": "SWAP3", + "source": 1 + }, + { + "begin": 1083, + "end": 1109, + "name": "SWAP2", + "source": 1 + }, + { + "begin": 1083, + "end": 1109, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1083, + "end": 1109, + "name": "PUSH [tag]", + "source": 1, + "value": "108" + }, + { + "begin": 1083, + "end": 1109, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1047, + "end": 1111, + "name": "tag", + "source": 1, + "value": "106" + }, + { + "begin": 1047, + "end": 1111, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1030, + "end": 1111, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1030, + "end": 1111, + "name": "POP", + "source": 1 + }, + { + "begin": 1150, + "end": 1177, + "name": "PUSH [tag]", + "source": 1, + "value": "109" + }, + { + "begin": 1164, + "end": 1170, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1172, + "end": 1176, + "name": "DUP8", + "source": 1 + }, + { + "begin": 1172, + "end": 1176, + "name": "DUP8", + "source": 1 + }, + { + "begin": 1150, + "end": 1163, + "name": "PUSH [tag]", + "source": 1, + "value": "104" + }, + { + "begin": 1150, + "end": 1177, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1150, + "end": 1177, + "name": "tag", + "source": 1, + "value": "109" + }, + { + "begin": 1150, + "end": 1177, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 993, + "end": 1182, + "name": "POP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "POP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "POP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "POP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "POP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "name": "POP", + "source": 1 + }, + { + "begin": 890, + "end": 1182, + "jumpType": "[out]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1675, + "end": 3161, + "name": "tag", + "source": 2, + "value": "59" + }, + { + "begin": 1675, + "end": 3161, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 1801, + "end": 1818, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 1824, + "end": 1838, + "name": "DUP1", + "source": 2 + }, + { + "begin": 1844, + "end": 1861, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 1867, + "end": 1884, + "name": "DUP1", + "source": 2 + }, + { + "begin": 1890, + "end": 1908, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 1919, + "end": 1939, + "name": "DUP1", + "source": 2 + }, + { + "begin": 1942, + "end": 1952, + "name": "DUP8", + "source": 2 + }, + { + "begin": 1942, + "end": 1952, + "name": "DUP8", + "source": 2 + }, + { + "begin": 1953, + "end": 1954, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 1942, + "end": 1955, + "name": "DUP2", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "DUP2", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "LT", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "PUSH [tag]", + "source": 2, + "value": "112" + }, + { + "begin": 1942, + "end": 1955, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "PUSH [tag]", + "source": 2, + "value": "112" + }, + { + "begin": 1942, + "end": 1955, + "name": "PUSH [tag]", + "source": 2, + "value": "113" + }, + { + "begin": 1942, + "end": 1955, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "tag", + "source": 2, + "value": "112" + }, + { + "begin": 1942, + "end": 1955, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "SWAP1", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "SWAP2", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "ADD", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "CALLDATALOAD", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "PUSH", + "source": 2, + "value": "FF00000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1942, + "end": 1955, + "name": "AND", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "SWAP2", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1942, + "end": 1955, + "name": "DUP2", + "source": 2 + }, + { + "begin": 1942, + "end": 1955, + "name": "SWAP1", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1962, + "end": 2265, + "name": "PUSH [tag]", + "source": 2, + "value": "114" + }, + { + "begin": 1962, + "end": 2265, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 2057, + "end": 2091, + "name": "PUSH [tag]", + "source": 2, + "value": "115" + }, + { + "begin": 2083, + "end": 2090, + "name": "DUP10", + "source": 2 + }, + { + "begin": 2057, + "end": 2082, + "name": "PUSH [tag]", + "source": 2, + "value": "102" + }, + { + "begin": 2057, + "end": 2091, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 2057, + "end": 2091, + "name": "tag", + "source": 2, + "value": "115" + }, + { + "begin": 2057, + "end": 2091, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 2045, + "end": 2091, + "name": "SWAP3", + "source": 2 + }, + { + "begin": 2045, + "end": 2091, + "name": "POP", + "source": 2 + }, + { + "begin": 2144, + "end": 2190, + "name": "PUSH [tag]", + "source": 2, + "value": "116" + }, + { + "begin": 2168, + "end": 2177, + "name": "DUP4", + "source": 2 + }, + { + "begin": 2179, + "end": 2189, + "name": "DUP10", + "source": 2 + }, + { + "begin": 2179, + "end": 2189, + "name": "DUP10", + "source": 2 + }, + { + "begin": 2144, + "end": 2167, + "name": "PUSH [tag]", + "source": 2, + "value": "117" + }, + { + "begin": 2144, + "end": 2190, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 2144, + "end": 2190, + "name": "tag", + "source": 2, + "value": "116" + }, + { + "begin": 2144, + "end": 2190, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 2099, + "end": 2190, + "name": "SWAP3", + "source": 2 + }, + { + "begin": 2099, + "end": 2190, + "name": "SWAP9", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2099, + "end": 2190, + "name": "SWAP1", + "source": 2 + }, + { + "begin": 2099, + "end": 2190, + "name": "SWAP7", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2099, + "end": 2190, + "name": "SWAP5", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2099, + "end": 2190, + "name": "SWAP2", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2198, + "end": 2258, + "name": "PUSH [tag]", + "source": 2, + "value": "110" + }, + { + "begin": 2198, + "end": 2258, + "name": "SWAP1", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2198, + "end": 2258, + "name": "JUMP", + "source": 2 + }, + { + "begin": 1962, + "end": 2265, + "name": "tag", + "source": 2, + "value": "114" + }, + { + "begin": 1962, + "end": 2265, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 2275, + "end": 2304, + "name": "PUSH", + "source": 2, + "value": "FF00000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 2275, + "end": 2304, + "name": "DUP2", + "source": 2 + }, + { + "begin": 2275, + "end": 2304, + "name": "DUP2", + "source": 2 + }, + { + "begin": 2275, + "end": 2304, + "name": "AND", + "source": 2 + }, + { + "begin": 2275, + "end": 2304, + "name": "ADD", + "source": 2 + }, + { + "begin": 2271, + "end": 2581, + "name": "PUSH [tag]", + "source": 2, + "value": "118" + }, + { + "begin": 2271, + "end": 2581, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 2370, + "end": 2404, + "name": "PUSH [tag]", + "source": 2, + "value": "119" + }, + { + "begin": 2396, + "end": 2403, + "name": "DUP10", + "source": 2 + }, + { + "begin": 2370, + "end": 2395, + "name": "PUSH [tag]", + "source": 2, + "value": "102" + }, + { + "begin": 2370, + "end": 2404, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 2370, + "end": 2404, + "name": "tag", + "source": 2, + "value": "119" + }, + { + "begin": 2370, + "end": 2404, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 2358, + "end": 2404, + "name": "SWAP3", + "source": 2 + }, + { + "begin": 2358, + "end": 2404, + "name": "POP", + "source": 2 + }, + { + "begin": 2457, + "end": 2506, + "name": "PUSH [tag]", + "source": 2, + "value": "116" + }, + { + "begin": 2484, + "end": 2493, + "name": "DUP4", + "source": 2 + }, + { + "begin": 2495, + "end": 2505, + "name": "DUP10", + "source": 2 + }, + { + "begin": 2495, + "end": 2505, + "name": "DUP10", + "source": 2 + }, + { + "begin": 2457, + "end": 2483, + "name": "PUSH [tag]", + "source": 2, + "value": "121" + }, + { + "begin": 2457, + "end": 2506, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 2271, + "end": 2581, + "name": "tag", + "source": 2, + "value": "118" + }, + { + "begin": 2271, + "end": 2581, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 2591, + "end": 2624, + "name": "PUSH", + "source": 2, + "value": "FE00000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 2591, + "end": 2624, + "name": "PUSH", + "source": 2, + "value": "FF00000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 2591, + "end": 2624, + "name": "DUP3", + "source": 2 + }, + { + "begin": 2591, + "end": 2624, + "name": "AND", + "source": 2 + }, + { + "begin": 2591, + "end": 2624, + "name": "ADD", + "source": 2 + }, + { + "begin": 2587, + "end": 2906, + "name": "PUSH [tag]", + "source": 2, + "value": "122" + }, + { + "begin": 2587, + "end": 2906, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 2690, + "end": 2729, + "name": "PUSH [tag]", + "source": 2, + "value": "119" + }, + { + "begin": 2721, + "end": 2728, + "name": "DUP10", + "source": 2 + }, + { + "begin": 2690, + "end": 2720, + "name": "PUSH [tag]", + "source": 2, + "value": "124" + }, + { + "begin": 2690, + "end": 2729, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 2587, + "end": 2906, + "name": "tag", + "source": 2, + "value": "122" + }, + { + "begin": 2587, + "end": 2906, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 2916, + "end": 2945, + "name": "PUSH", + "source": 2, + "value": "FD00000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 2916, + "end": 2945, + "name": "PUSH", + "source": 2, + "value": "FF00000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 2916, + "end": 2945, + "name": "DUP3", + "source": 2 + }, + { + "begin": 2916, + "end": 2945, + "name": "AND", + "source": 2 + }, + { + "begin": 2916, + "end": 2945, + "name": "ADD", + "source": 2 + }, + { + "begin": 2912, + "end": 3108, + "name": "PUSH [tag]", + "source": 2, + "value": "126" + }, + { + "begin": 2912, + "end": 3108, + "name": "JUMPI", + "source": 2 + }, + { + "begin": 3066, + "end": 3101, + "name": "PUSH [tag]", + "source": 2, + "value": "127" + }, + { + "begin": 3081, + "end": 3088, + "name": "DUP10", + "source": 2 + }, + { + "begin": 3090, + "end": 3100, + "name": "DUP10", + "source": 2 + }, + { + "begin": 3090, + "end": 3100, + "name": "DUP10", + "source": 2 + }, + { + "begin": 3066, + "end": 3080, + "name": "PUSH [tag]", + "source": 2, + "value": "128" + }, + { + "begin": 3066, + "end": 3101, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 3066, + "end": 3101, + "name": "tag", + "source": 2, + "value": "127" + }, + { + "begin": 3066, + "end": 3101, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "SWAP6", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "POP", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "SWAP6", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "POP", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "SWAP6", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "POP", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "SWAP6", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "POP", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "SWAP6", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "POP", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "POP", + "source": 2 + }, + { + "begin": 3059, + "end": 3101, + "name": "PUSH [tag]", + "source": 2, + "value": "110" + }, + { + "begin": 3059, + "end": 3101, + "name": "JUMP", + "source": 2 + }, + { + "begin": 2912, + "end": 3108, + "name": "tag", + "source": 2, + "value": "126" + }, + { + "begin": 2912, + "end": 3108, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 3121, + "end": 3156, + "name": "PUSH", + "source": 2, + "value": "40" + }, + { + "begin": 3121, + "end": 3156, + "name": "MLOAD", + "source": 2 + }, + { + "begin": 3121, + "end": 3156, + "name": "PUSH", + "source": 2, + "value": "6085CD8200000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 3121, + "end": 3156, + "name": "DUP2", + "source": 2 + }, + { + "begin": 3121, + "end": 3156, + "name": "MSTORE", + "source": 2 + }, + { + "begin": 11707, + "end": 11773, + "name": "PUSH", + "source": 22, + "value": "FF00000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 11695, + "end": 11774, + "name": "DUP3", + "source": 22 + }, + { + "begin": 11695, + "end": 11774, + "name": "AND", + "source": 22 + }, + { + "begin": 3121, + "end": 3156, + "name": "PUSH", + "source": 2, + "value": "4" + }, + { + "begin": 3121, + "end": 3156, + "name": "DUP3", + "source": 2 + }, + { + "begin": 3121, + "end": 3156, + "name": "ADD", + "source": 2 + }, + { + "begin": 11677, + "end": 11775, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11650, + "end": 11668, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 11650, + "end": 11668, + "name": "ADD", + "source": 22 + }, + { + "begin": 3121, + "end": 3156, + "name": "PUSH [tag]", + "source": 2, + "value": "93" + }, + { + "begin": 11533, + "end": 11781, + "name": "JUMP", + "source": 22 + }, + { + "begin": 1675, + "end": 3161, + "name": "tag", + "source": 2, + "value": "110" + }, + { + "begin": 1675, + "end": 3161, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "SWAP4", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "SWAP8", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "SWAP3", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "SWAP7", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "POP", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "SWAP4", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "POP", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "SWAP4", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "name": "POP", + "source": 2 + }, + { + "begin": 1675, + "end": 3161, + "jumpType": "[out]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 938, + "end": 1094, + "name": "tag", + "source": 6, + "value": "66" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 1002, + "end": 1009, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 1032, + "end": 1088, + "name": "PUSH [tag]", + "source": 6, + "value": "80" + }, + { + "begin": 453, + "end": 519, + "name": "PUSH", + "source": 6, + "value": "8D0BF1FD623D628C741362C1289948E57B3E2905218C676D3E69ABEE36D6AE2E" + }, + { + "begin": 1080, + "end": 1086, + "name": "DUP4", + "source": 6 + }, + { + "begin": 1032, + "end": 1060, + "name": "PUSH [tag]", + "source": 6, + "value": "133" + }, + { + "begin": 1032, + "end": 1088, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 456, + "end": 732, + "name": "tag", + "source": 4, + "value": "72" + }, + { + "begin": 456, + "end": 732, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 550, + "end": 562, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 178, + "end": 188, + "name": "CALLER", + "source": 8 + }, + { + "begin": 200, + "end": 204, + "name": "ADDRESS", + "source": 8 + }, + { + "begin": 178, + "end": 205, + "name": "EQ", + "source": 8 + }, + { + "begin": 174, + "end": 268, + "name": "PUSH [tag]", + "source": 8, + "value": "135" + }, + { + "begin": 174, + "end": 268, + "name": "JUMPI", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "40" + }, + { + "begin": 222, + "end": 261, + "name": "MLOAD", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "E125889400000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 222, + "end": 261, + "name": "DUP2", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "MSTORE", + "source": 8 + }, + { + "begin": 235, + "end": 245, + "name": "CALLER", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "4" + }, + { + "begin": 222, + "end": 261, + "name": "DUP3", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "ADD", + "source": 8 + }, + { + "begin": 7319, + "end": 7353, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 255, + "end": 259, + "name": "ADDRESS", + "source": 8 + }, + { + "begin": 7369, + "end": 7387, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 7369, + "end": 7387, + "name": "DUP3", + "source": 22 + }, + { + "begin": 7369, + "end": 7387, + "name": "ADD", + "source": 22 + }, + { + "begin": 7362, + "end": 7405, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 7231, + "end": 7249, + "name": "PUSH", + "source": 22, + "value": "44" + }, + { + "begin": 7231, + "end": 7249, + "name": "ADD", + "source": 22 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH [tag]", + "source": 8, + "value": "93" + }, + { + "begin": 7084, + "end": 7411, + "name": "JUMP", + "source": 22 + }, + { + "begin": 174, + "end": 268, + "name": "tag", + "source": 8, + "value": "135" + }, + { + "begin": 174, + "end": 268, + "name": "JUMPDEST", + "source": 8 + }, + { + "begin": 631, + "end": 636, + "modifierDepth": 1, + "name": "DUP2", + "source": 4 + }, + { + "begin": 625, + "end": 637, + "modifierDepth": 1, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 620, + "end": 622, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "20" + }, + { + "begin": 613, + "end": 618, + "modifierDepth": 1, + "name": "DUP4", + "source": 4 + }, + { + "begin": 609, + "end": 623, + "modifierDepth": 1, + "name": "ADD", + "source": 4 + }, + { + "begin": 596, + "end": 607, + "modifierDepth": 1, + "name": "CALLVALUE", + "source": 4 + }, + { + "begin": 589, + "end": 638, + "modifierDepth": 1, + "name": "CREATE", + "source": 4 + }, + { + "begin": 581, + "end": 638, + "name": "SWAP1", + "source": 4 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 649, + "end": 667, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 649, + "end": 667, + "name": "DUP2", + "source": 4 + }, + { + "begin": 649, + "end": 667, + "modifierDepth": 1, + "name": "AND", + "source": 4 + }, + { + "begin": 645, + "end": 695, + "modifierDepth": 1, + "name": "PUSH [tag]", + "source": 4, + "value": "138" + }, + { + "begin": 645, + "end": 695, + "modifierDepth": 1, + "name": "JUMPI", + "source": 4 + }, + { + "begin": 689, + "end": 694, + "modifierDepth": 1, + "name": "DUP2", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "D25719100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "DUP2", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "MSTORE", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "4" + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "ADD", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH [tag]", + "source": 4, + "value": "93" + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH [tag]", + "source": 4, + "value": "140" + }, + { + "begin": 676, + "end": 695, + "jumpType": "[in]", + "modifierDepth": 1, + "name": "JUMP", + "source": 4 + }, + { + "begin": 645, + "end": 695, + "modifierDepth": 1, + "name": "tag", + "source": 4, + "value": "138" + }, + { + "begin": 645, + "end": 695, + "modifierDepth": 1, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 706, + "end": 727, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 6753, + "end": 6795, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 6741, + "end": 6796, + "name": "DUP3", + "source": 22 + }, + { + "begin": 6741, + "end": 6796, + "name": "AND", + "source": 22 + }, + { + "begin": 6723, + "end": 6797, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6723, + "end": 6797, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "A506AD4E7F05ECEBA62A023C3219E5BD98A615F4FA87E2AFB08A2DA5CF62BF0C" + }, + { + "begin": 706, + "end": 727, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 6711, + "end": 6713, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 6696, + "end": 6714, + "name": "ADD", + "source": 22 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "DUP1", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "SUB", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "LOG1", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "POP", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "jumpType": "[out]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 670, + "end": 757, + "name": "tag", + "source": 6, + "value": "77" + }, + { + "begin": 670, + "end": 757, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 718, + "end": 725, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 740, + "end": 752, + "name": "PUSH [tag]", + "source": 6, + "value": "143" + }, + { + "begin": 750, + "end": 751, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 740, + "end": 749, + "name": "PUSH [tag]", + "source": 6, + "value": "66" + }, + { + "begin": 740, + "end": 752, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 740, + "end": 752, + "name": "tag", + "source": 6, + "value": "143" + }, + { + "begin": 740, + "end": 752, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 733, + "end": 752, + "name": "SWAP1", + "source": 6 + }, + { + "begin": 733, + "end": 752, + "name": "POP", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "SWAP1", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "jumpType": "[out]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 942, + "end": 1175, + "name": "tag", + "source": 4, + "value": "81" + }, + { + "begin": 942, + "end": 1175, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 1028, + "end": 1032, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 1044, + "end": 1092, + "name": "PUSH", + "source": 4, + "value": "6FFBD45100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1044, + "end": 1092, + "name": "PUSH", + "source": 4, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1044, + "end": 1092, + "name": "DUP4", + "source": 4 + }, + { + "begin": 1044, + "end": 1092, + "name": "AND", + "source": 4 + }, + { + "begin": 1044, + "end": 1092, + "name": "ADD", + "source": 4 + }, + { + "begin": 1040, + "end": 1120, + "name": "PUSH [tag]", + "source": 4, + "value": "145" + }, + { + "begin": 1040, + "end": 1120, + "name": "JUMPI", + "source": 4 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1109, + "end": 1113, + "name": "PUSH", + "source": 4, + "value": "1" + }, + { + "begin": 1109, + "end": 1113, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "SWAP1", + "source": 4 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 942, + "end": 1175, + "jumpType": "[out]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 1040, + "end": 1120, + "name": "tag", + "source": 4, + "value": "145" + }, + { + "begin": 1040, + "end": 1120, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 1133, + "end": 1170, + "name": "PUSH [tag]", + "source": 4, + "value": "80" + }, + { + "begin": 1157, + "end": 1169, + "name": "DUP3", + "source": 4 + }, + { + "begin": 1133, + "end": 1156, + "name": "PUSH [tag]", + "source": 4, + "value": "147" + }, + { + "begin": 1133, + "end": 1170, + "jumpType": "[in]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 3480, + "end": 3866, + "name": "tag", + "source": 2, + "value": "84" + }, + { + "begin": 3480, + "end": 3866, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 3611, + "end": 3623, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 3629, + "end": 3646, + "name": "DUP1", + "source": 2 + }, + { + "begin": 3657, + "end": 3674, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 3676, + "end": 3690, + "name": "DUP1", + "source": 2 + }, + { + "begin": 3692, + "end": 3709, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 3760, + "end": 3798, + "name": "PUSH [tag]", + "source": 2, + "value": "149" + }, + { + "begin": 3778, + "end": 3785, + "name": "DUP9", + "source": 2 + }, + { + "begin": 3787, + "end": 3797, + "name": "DUP9", + "source": 2 + }, + { + "begin": 3787, + "end": 3797, + "name": "DUP9", + "source": 2 + }, + { + "begin": 3760, + "end": 3777, + "name": "PUSH [tag]", + "source": 2, + "value": "59" + }, + { + "begin": 3760, + "end": 3798, + "jumpType": "[in]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 3760, + "end": 3798, + "name": "tag", + "source": 2, + "value": "149" + }, + { + "begin": 3760, + "end": 3798, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3715, + "end": 3798, + "name": "SWAP7", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3715, + "end": 3798, + "name": "SWAP2", + "source": 2 + }, + { + "begin": 3715, + "end": 3798, + "name": "SWAP5", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3715, + "end": 3798, + "name": "SWAP3", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3715, + "end": 3798, + "name": "SWAP1", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3814, + "end": 3833, + "name": "DUP3", + "source": 2 + }, + { + "begin": 3814, + "end": 3833, + "name": "DUP3", + "source": 2 + }, + { + "begin": 3814, + "end": 3833, + "name": "LT", + "source": 2 + }, + { + "begin": 3814, + "end": 3833, + "name": "DUP1", + "source": 2 + }, + { + "begin": 3814, + "end": 3833, + "name": "ISZERO", + "source": 2 + }, + { + "begin": 3814, + "end": 3833, + "name": "SWAP1", + "source": 2 + }, + { + "begin": 3814, + "end": 3861, + "name": "PUSH [tag]", + "source": 2, + "value": "151" + }, + { + "begin": 3814, + "end": 3861, + "name": "JUMPI", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2779, + "end": 2783, + "name": "PUSH", + "source": 1, + "value": "1" + }, + { + "begin": 3837, + "end": 3861, + "name": "tag", + "source": 2, + "value": "151" + }, + { + "begin": 3837, + "end": 3861, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 3804, + "end": 3861, + "name": "SWAP5", + "source": 2 + }, + { + "begin": 3804, + "end": 3861, + "name": "POP", + "source": 2 + }, + { + "begin": 3651, + "end": 3866, + "name": "POP", + "source": 2 + }, + { + "begin": 3651, + "end": 3866, + "name": "POP", + "source": 2 + }, + { + "begin": 3651, + "end": 3866, + "name": "POP", + "source": 2 + }, + { + "begin": 3480, + "end": 3866, + "name": "SWAP4", + "source": 2 + }, + { + "begin": 3480, + "end": 3866, + "name": "POP", + "source": 2 + }, + { + "begin": 3480, + "end": 3866, + "name": "SWAP4", + "source": 2 + }, + { + "begin": 3480, + "end": 3866, + "name": "SWAP2", + "source": 2 + }, + { + "begin": 3480, + "end": 3866, + "name": "POP", + "source": 2 + }, + { + "begin": 3480, + "end": 3866, + "name": "POP", + "source": 2 + }, + { + "begin": 3480, + "end": 3866, + "jumpType": "[out]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 2824, + "end": 2917, + "name": "tag", + "source": 1, + "value": "97" + }, + { + "begin": 2824, + "end": 2917, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 2898, + "end": 2912, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "PUSH", + "source": 1, + "value": "A038794000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 2898, + "end": 2912, + "name": "DUP2", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "MSTORE", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "PUSH", + "source": 1, + "value": "4" + }, + { + "begin": 2898, + "end": 2912, + "name": "ADD", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 2898, + "end": 2912, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "DUP1", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "SWAP2", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "SUB", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 2898, + "end": 2912, + "name": "REVERT", + "source": 1 + }, + { + "begin": 1173, + "end": 1397, + "name": "tag", + "source": 13, + "value": "102" + }, + { + "begin": 1173, + "end": 1397, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "PUSH", + "source": 13, + "value": "40" + }, + { + "begin": 1279, + "end": 1386, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 12792, + "end": 12858, + "name": "PUSH", + "source": 22, + "value": "1901000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1279, + "end": 1386, + "name": "PUSH", + "source": 13, + "value": "20" + }, + { + "begin": 1279, + "end": 1386, + "name": "DUP3", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "ADD", + "source": 13 + }, + { + "begin": 12780, + "end": 12859, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 1325, + "end": 1338, + "name": "CHAINID", + "source": 13 + }, + { + "begin": 12875, + "end": 12886, + "name": "PUSH", + "source": 22, + "value": "22" + }, + { + "begin": 12875, + "end": 12886, + "name": "DUP3", + "source": 22 + }, + { + "begin": 12875, + "end": 12886, + "name": "ADD", + "source": 22 + }, + { + "begin": 12868, + "end": 12895, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 12946, + "end": 13012, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000" + }, + { + "begin": 1356, + "end": 1360, + "name": "ADDRESS", + "source": 13 + }, + { + "begin": 12933, + "end": 12935, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 12929, + "end": 12944, + "name": "SHL", + "source": 22 + }, + { + "begin": 12925, + "end": 13013, + "name": "AND", + "source": 22 + }, + { + "begin": 12911, + "end": 12923, + "name": "PUSH", + "source": 22, + "value": "42" + }, + { + "begin": 12911, + "end": 12923, + "name": "DUP3", + "source": 22 + }, + { + "begin": 12911, + "end": 12923, + "name": "ADD", + "source": 22 + }, + { + "begin": 12904, + "end": 13014, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 13030, + "end": 13042, + "name": "PUSH", + "source": 22, + "value": "56" + }, + { + "begin": 13030, + "end": 13042, + "name": "DUP2", + "source": 22 + }, + { + "begin": 13030, + "end": 13042, + "name": "ADD", + "source": 22 + }, + { + "begin": 13023, + "end": 13051, + "name": "DUP3", + "source": 22 + }, + { + "begin": 13023, + "end": 13051, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 13023, + "end": 13051, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 1240, + "end": 1247, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 1240, + "end": 1247, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 13067, + "end": 13079, + "name": "PUSH", + "source": 22, + "value": "76" + }, + { + "begin": 13067, + "end": 13079, + "name": "ADD", + "source": 22 + }, + { + "begin": 1279, + "end": 1386, + "name": "tag", + "source": 13, + "value": "155" + }, + { + "begin": 1279, + "end": 1386, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "PUSH", + "source": 13, + "value": "40" + }, + { + "begin": 1279, + "end": 1386, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "PUSH", + "source": 13, + "value": "20" + }, + { + "begin": 1279, + "end": 1386, + "name": "DUP2", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "DUP4", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "SUB", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "SUB", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "DUP2", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 1279, + "end": 1386, + "name": "PUSH", + "source": 13, + "value": "40" + }, + { + "begin": 1279, + "end": 1386, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 1262, + "end": 1392, + "name": "DUP1", + "source": 13 + }, + { + "begin": 1262, + "end": 1392, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 1262, + "end": 1392, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 1262, + "end": 1392, + "name": "PUSH", + "source": 13, + "value": "20" + }, + { + "begin": 1262, + "end": 1392, + "name": "ADD", + "source": 13 + }, + { + "begin": 1262, + "end": 1392, + "name": "KECCAK256", + "source": 13 + }, + { + "begin": 1255, + "end": 1392, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 1255, + "end": 1392, + "name": "POP", + "source": 13 + }, + { + "begin": 1173, + "end": 1397, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 1173, + "end": 1397, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 1173, + "end": 1397, + "name": "POP", + "source": 13 + }, + { + "begin": 1173, + "end": 1397, + "jumpType": "[out]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 1710, + "end": 2544, + "name": "tag", + "source": 1, + "value": "104" + }, + { + "begin": 1710, + "end": 2544, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1847, + "end": 1851, + "name": "DUP1", + "source": 1 + }, + { + "begin": 1832, + "end": 1844, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 1864, + "end": 2540, + "name": "tag", + "source": 1, + "value": "158" + }, + { + "begin": 1864, + "end": 2540, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1888, + "end": 1892, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1884, + "end": 1885, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1884, + "end": 1892, + "name": "LT", + "source": 1 + }, + { + "begin": 1864, + "end": 2540, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 1864, + "end": 2540, + "name": "PUSH [tag]", + "source": 1, + "value": "159" + }, + { + "begin": 1864, + "end": 2540, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 1907, + "end": 1939, + "name": "CALLDATASIZE", + "source": 1 + }, + { + "begin": 1942, + "end": 1946, + "name": "DUP5", + "source": 1 + }, + { + "begin": 1942, + "end": 1946, + "name": "DUP5", + "source": 1 + }, + { + "begin": 1947, + "end": 1948, + "name": "DUP4", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "LT", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "PUSH [tag]", + "source": 1, + "value": "162" + }, + { + "begin": 1942, + "end": 1949, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "PUSH [tag]", + "source": 1, + "value": "162" + }, + { + "begin": 1942, + "end": 1949, + "name": "PUSH [tag]", + "source": 1, + "value": "113" + }, + { + "begin": 1942, + "end": 1949, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "tag", + "source": 1, + "value": "162" + }, + { + "begin": 1942, + "end": 1949, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "POP", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "PUSH", + "source": 1, + "value": "20" + }, + { + "begin": 1942, + "end": 1949, + "name": "MUL", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "ADD", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "PUSH [tag]", + "source": 1, + "value": "163" + }, + { + "begin": 1942, + "end": 1949, + "name": "SWAP2", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "PUSH [tag]", + "source": 1, + "value": "164" + }, + { + "begin": 1942, + "end": 1949, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1942, + "end": 1949, + "name": "tag", + "source": 1, + "value": "163" + }, + { + "begin": 1942, + "end": 1949, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1907, + "end": 1949, + "name": "SWAP1", + "source": 1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1962, + "end": 1986, + "name": "PUSH [tag]", + "source": 1, + "value": "165" + }, + { + "begin": 1962, + "end": 1986, + "name": "PUSH", + "source": 1, + "value": "20" + }, + { + "begin": 1962, + "end": 1986, + "name": "DUP3", + "source": 1 + }, + { + "begin": 1962, + "end": 1986, + "name": "ADD", + "source": 1 + }, + { + "begin": 1907, + "end": 1949, + "name": "DUP3", + "source": 1 + }, + { + "begin": 1962, + "end": 1986, + "name": "PUSH [tag]", + "source": 1, + "value": "166" + }, + { + "begin": 1962, + "end": 1986, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1962, + "end": 1986, + "name": "tag", + "source": 1, + "value": "165" + }, + { + "begin": 1962, + "end": 1986, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1958, + "end": 2020, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 1958, + "end": 2020, + "name": "PUSH [tag]", + "source": 1, + "value": "167" + }, + { + "begin": 1958, + "end": 2020, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 1995, + "end": 2020, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 1995, + "end": 2020, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 1995, + "end": 2020, + "name": "PUSH", + "source": 1, + "value": "230D1CCC00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1995, + "end": 2020, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1995, + "end": 2020, + "name": "MSTORE", + "source": 1 + }, + { + "begin": 1995, + "end": 2020, + "name": "PUSH", + "source": 1, + "value": "4" + }, + { + "begin": 1995, + "end": 2020, + "name": "DUP2", + "source": 1 + }, + { + "begin": 1995, + "end": 2020, + "name": "ADD", + "source": 1 + }, + { + "begin": 2778, + "end": 2803, + "name": "DUP4", + "source": 22 + }, + { + "begin": 2778, + "end": 2803, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 2778, + "end": 2803, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2751, + "end": 2769, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 2751, + "end": 2769, + "name": "ADD", + "source": 22 + }, + { + "begin": 1995, + "end": 2020, + "name": "PUSH [tag]", + "source": 1, + "value": "93" + }, + { + "begin": 2632, + "end": 2809, + "name": "JUMP", + "source": 22 + }, + { + "begin": 1958, + "end": 2020, + "name": "tag", + "source": 1, + "value": "167" + }, + { + "begin": 1958, + "end": 2020, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2048, + "end": 2068, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 2048, + "end": 2068, + "name": "DUP2", + "source": 1 + }, + { + "begin": 2048, + "end": 2068, + "name": "ADD", + "source": 1 + }, + { + "begin": 2048, + "end": 2068, + "name": "CALLDATALOAD", + "source": 1 + }, + { + "begin": 2048, + "end": 2068, + "name": "DUP1", + "source": 1 + }, + { + "begin": 2080, + "end": 2089, + "name": "GAS", + "source": 1 + }, + { + "begin": 2080, + "end": 2100, + "name": "LT", + "source": 1 + }, + { + "begin": 2076, + "end": 2145, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 2076, + "end": 2145, + "name": "PUSH [tag]", + "source": 1, + "value": "169" + }, + { + "begin": 2076, + "end": 2145, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 2122, + "end": 2123, + "name": "DUP3", + "source": 1 + }, + { + "begin": 2125, + "end": 2133, + "name": "DUP2", + "source": 1 + }, + { + "begin": 2135, + "end": 2144, + "name": "GAS", + "source": 1 + }, + { + "begin": 2109, + "end": 2145, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 2109, + "end": 2145, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 2109, + "end": 2145, + "name": "PUSH", + "source": 1, + "value": "2BB3E3BA00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 2109, + "end": 2145, + "name": "DUP2", + "source": 1 + }, + { + "begin": 2109, + "end": 2145, + "name": "MSTORE", + "source": 1 + }, + { + "begin": 2109, + "end": 2145, + "name": "PUSH", + "source": 1, + "value": "4" + }, + { + "begin": 2109, + "end": 2145, + "name": "DUP2", + "source": 1 + }, + { + "begin": 2109, + "end": 2145, + "name": "ADD", + "source": 1 + }, + { + "begin": 13869, + "end": 13894, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 13869, + "end": 13894, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 13869, + "end": 13894, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 13869, + "end": 13894, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 13910, + "end": 13928, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 13910, + "end": 13928, + "name": "DUP4", + "source": 22 + }, + { + "begin": 13910, + "end": 13928, + "name": "ADD", + "source": 22 + }, + { + "begin": 13903, + "end": 13937, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 13903, + "end": 13937, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 13903, + "end": 13937, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 13903, + "end": 13937, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 13953, + "end": 13971, + "name": "PUSH", + "source": 22, + "value": "44" + }, + { + "begin": 13953, + "end": 13971, + "name": "DUP3", + "source": 22 + }, + { + "begin": 13953, + "end": 13971, + "name": "ADD", + "source": 22 + }, + { + "begin": 13946, + "end": 13980, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 13842, + "end": 13860, + "name": "PUSH", + "source": 22, + "value": "64" + }, + { + "begin": 13842, + "end": 13860, + "name": "ADD", + "source": 22 + }, + { + "begin": 2109, + "end": 2145, + "name": "PUSH [tag]", + "source": 1, + "value": "93" + }, + { + "begin": 13667, + "end": 13986, + "name": "JUMP", + "source": 22 + }, + { + "begin": 2076, + "end": 2145, + "name": "tag", + "source": 1, + "value": "169" + }, + { + "begin": 2076, + "end": 2145, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2154, + "end": 2166, + "name": "PUSH", + "source": 1, + "value": "0" + }, + { + "begin": 2169, + "end": 2317, + "name": "PUSH [tag]", + "source": 1, + "value": "172" + }, + { + "begin": 2192, + "end": 2210, + "name": "PUSH [tag]", + "source": 1, + "value": "173" + }, + { + "begin": 2192, + "end": 2210, + "name": "PUSH", + "source": 1, + "value": "80" + }, + { + "begin": 2192, + "end": 2210, + "name": "DUP6", + "source": 1 + }, + { + "begin": 2192, + "end": 2210, + "name": "ADD", + "source": 1 + }, + { + "begin": 2192, + "end": 2210, + "name": "PUSH", + "source": 1, + "value": "60" + }, + { + "begin": 2192, + "end": 2210, + "name": "DUP7", + "source": 1 + }, + { + "begin": 2192, + "end": 2210, + "name": "ADD", + "source": 1 + }, + { + "begin": 2192, + "end": 2210, + "name": "PUSH [tag]", + "source": 1, + "value": "174" + }, + { + "begin": 2192, + "end": 2210, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 2192, + "end": 2210, + "name": "tag", + "source": 1, + "value": "173" + }, + { + "begin": 2192, + "end": 2210, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2220, + "end": 2237, + "name": "PUSH", + "source": 1, + "value": "80" + }, + { + "begin": 2220, + "end": 2237, + "name": "DUP6", + "source": 1 + }, + { + "begin": 2220, + "end": 2237, + "name": "ADD", + "source": 1 + }, + { + "begin": 2220, + "end": 2237, + "name": "CALLDATALOAD", + "source": 1 + }, + { + "begin": 2247, + "end": 2260, + "name": "DUP5", + "source": 1 + }, + { + "begin": 2247, + "end": 2260, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 2247, + "end": 2283, + "name": "PUSH [tag]", + "source": 1, + "value": "175" + }, + { + "begin": 2247, + "end": 2283, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 2275, + "end": 2283, + "name": "DUP5", + "source": 1 + }, + { + "begin": 2247, + "end": 2283, + "name": "PUSH [tag]", + "source": 1, + "value": "176" + }, + { + "begin": 2247, + "end": 2283, + "name": "JUMP", + "source": 1 + }, + { + "begin": 2247, + "end": 2283, + "name": "tag", + "source": 1, + "value": "175" + }, + { + "begin": 2247, + "end": 2283, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2263, + "end": 2272, + "name": "GAS", + "source": 1 + }, + { + "begin": 2247, + "end": 2283, + "name": "tag", + "source": 1, + "value": "176" + }, + { + "begin": 2247, + "end": 2283, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2293, + "end": 2309, + "name": "PUSH [tag]", + "source": 1, + "value": "177" + }, + { + "begin": 2293, + "end": 2309, + "name": "PUSH", + "source": 1, + "value": "A0" + }, + { + "begin": 2293, + "end": 2309, + "name": "DUP9", + "source": 1 + }, + { + "begin": 2293, + "end": 2309, + "name": "ADD", + "source": 1 + }, + { + "begin": 2293, + "end": 2304, + "name": "DUP9", + "source": 1 + }, + { + "begin": 2293, + "end": 2309, + "name": "PUSH [tag]", + "source": 1, + "value": "178" + }, + { + "begin": 2293, + "end": 2309, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 2293, + "end": 2309, + "name": "tag", + "source": 1, + "value": "177" + }, + { + "begin": 2293, + "end": 2309, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2169, + "end": 2182, + "name": "PUSH [tag]", + "source": 1, + "value": "179" + }, + { + "begin": 2169, + "end": 2317, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 2169, + "end": 2317, + "name": "tag", + "source": 1, + "value": "172" + }, + { + "begin": 2169, + "end": 2317, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2154, + "end": 2317, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 2154, + "end": 2317, + "name": "POP", + "source": 1 + }, + { + "begin": 2330, + "end": 2337, + "name": "DUP1", + "source": 1 + }, + { + "begin": 2326, + "end": 2534, + "name": "ISZERO", + "source": 1 + }, + { + "begin": 2326, + "end": 2534, + "name": "PUSH [tag]", + "source": 1, + "value": "180" + }, + { + "begin": 2326, + "end": 2534, + "name": "JUMPI", + "source": 1 + }, + { + "begin": 2365, + "end": 2372, + "name": "DUP8", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "PUSH", + "source": 1, + "value": "5C4EEB02DABF8976016AB414D617F9A162936DCACE3CDEF8C69EF6E262AD5AE7" + }, + { + "begin": 2374, + "end": 2375, + "name": "DUP6", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 2354, + "end": 2376, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "PUSH [tag]", + "source": 1, + "value": "181" + }, + { + "begin": 2354, + "end": 2376, + "name": "SWAP2", + "source": 1 + }, + { + "begin": 2778, + "end": 2803, + "name": "DUP2", + "source": 22 + }, + { + "begin": 2778, + "end": 2803, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2766, + "end": 2768, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 2751, + "end": 2769, + "name": "ADD", + "source": 22 + }, + { + "begin": 2751, + "end": 2769, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 2632, + "end": 2809, + "name": "JUMP", + "source": 22 + }, + { + "begin": 2354, + "end": 2376, + "name": "tag", + "source": 1, + "value": "181" + }, + { + "begin": 2354, + "end": 2376, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 2354, + "end": 2376, + "name": "MLOAD", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "DUP1", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "SWAP2", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "SUB", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 2354, + "end": 2376, + "name": "LOG2", + "source": 1 + }, + { + "begin": 2326, + "end": 2534, + "name": "PUSH [tag]", + "source": 1, + "value": "183" + }, + { + "begin": 2326, + "end": 2534, + "name": "JUMP", + "source": 1 + }, + { + "begin": 2326, + "end": 2534, + "name": "tag", + "source": 1, + "value": "180" + }, + { + "begin": 2326, + "end": 2534, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2401, + "end": 2525, + "name": "PUSH [tag]", + "source": 1, + "value": "183" + }, + { + "begin": 2425, + "end": 2450, + "name": "PUSH [tag]", + "source": 1, + "value": "184" + }, + { + "begin": 2425, + "end": 2450, + "name": "PUSH", + "source": 1, + "value": "40" + }, + { + "begin": 2425, + "end": 2450, + "name": "DUP6", + "source": 1 + }, + { + "begin": 2425, + "end": 2450, + "name": "ADD", + "source": 1 + }, + { + "begin": 2425, + "end": 2450, + "name": "PUSH", + "source": 1, + "value": "20" + }, + { + "begin": 2425, + "end": 2450, + "name": "DUP7", + "source": 1 + }, + { + "begin": 2425, + "end": 2450, + "name": "ADD", + "source": 1 + }, + { + "begin": 2425, + "end": 2450, + "name": "PUSH [tag]", + "source": 1, + "value": "166" + }, + { + "begin": 2425, + "end": 2450, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 2425, + "end": 2450, + "name": "tag", + "source": 1, + "value": "184" + }, + { + "begin": 2425, + "end": 2450, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2462, + "end": 2469, + "name": "DUP10", + "source": 1 + }, + { + "begin": 2481, + "end": 2482, + "name": "DUP7", + "source": 1 + }, + { + "begin": 2494, + "end": 2515, + "name": "PUSH [tag]", + "source": 1, + "value": "185" + }, + { + "begin": 2494, + "end": 2513, + "name": "PUSH [tag]", + "source": 1, + "value": "186" + }, + { + "begin": 2494, + "end": 2515, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 2494, + "end": 2515, + "name": "tag", + "source": 1, + "value": "185" + }, + { + "begin": 2494, + "end": 2515, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 2401, + "end": 2413, + "name": "PUSH [tag]", + "source": 1, + "value": "187" + }, + { + "begin": 2401, + "end": 2525, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 2401, + "end": 2525, + "name": "tag", + "source": 1, + "value": "183" + }, + { + "begin": 2401, + "end": 2525, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1899, + "end": 2540, + "name": "POP", + "source": 1 + }, + { + "begin": 1899, + "end": 2540, + "name": "POP", + "source": 1 + }, + { + "begin": 1899, + "end": 2540, + "name": "POP", + "source": 1 + }, + { + "begin": 1894, + "end": 1897, + "name": "DUP1", + "source": 1 + }, + { + "begin": 1894, + "end": 1897, + "name": "DUP1", + "source": 1 + }, + { + "begin": 1894, + "end": 1897, + "name": "PUSH [tag]", + "source": 1, + "value": "188" + }, + { + "begin": 1894, + "end": 1897, + "name": "SWAP1", + "source": 1 + }, + { + "begin": 1894, + "end": 1897, + "name": "PUSH [tag]", + "source": 1, + "value": "189" + }, + { + "begin": 1894, + "end": 1897, + "jumpType": "[in]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 1894, + "end": 1897, + "name": "tag", + "source": 1, + "value": "188" + }, + { + "begin": 1894, + "end": 1897, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1894, + "end": 1897, + "name": "SWAP2", + "source": 1 + }, + { + "begin": 1894, + "end": 1897, + "name": "POP", + "source": 1 + }, + { + "begin": 1894, + "end": 1897, + "name": "POP", + "source": 1 + }, + { + "begin": 1864, + "end": 2540, + "name": "PUSH [tag]", + "source": 1, + "value": "158" + }, + { + "begin": 1864, + "end": 2540, + "name": "JUMP", + "source": 1 + }, + { + "begin": 1864, + "end": 2540, + "name": "tag", + "source": 1, + "value": "159" + }, + { + "begin": 1864, + "end": 2540, + "name": "JUMPDEST", + "source": 1 + }, + { + "begin": 1864, + "end": 2540, + "name": "POP", + "source": 1 + }, + { + "begin": 1799, + "end": 2544, + "name": "POP", + "source": 1 + }, + { + "begin": 1710, + "end": 2544, + "name": "POP", + "source": 1 + }, + { + "begin": 1710, + "end": 2544, + "name": "POP", + "source": 1 + }, + { + "begin": 1710, + "end": 2544, + "name": "POP", + "source": 1 + }, + { + "begin": 1710, + "end": 2544, + "jumpType": "[out]", + "name": "JUMP", + "source": 1 + }, + { + "begin": 8892, + "end": 9534, + "name": "tag", + "source": 13, + "value": "117" + }, + { + "begin": 8892, + "end": 9534, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 8996, + "end": 9013, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 8996, + "end": 9013, + "name": "DUP1", + "source": 13 + }, + { + "begin": 8996, + "end": 9013, + "name": "DUP1", + "source": 13 + }, + { + "begin": 8996, + "end": 9013, + "name": "DUP1", + "source": 13 + }, + { + "begin": 9131, + "end": 9172, + "name": "PUSH [tag]", + "source": 13, + "value": "191" + }, + { + "begin": 9145, + "end": 9155, + "name": "DUP8", + "source": 13 + }, + { + "begin": 9157, + "end": 9171, + "name": "PUSH [tag]", + "source": 13, + "value": "192" + }, + { + "begin": 9157, + "end": 9167, + "name": "DUP8", + "source": 13 + }, + { + "begin": 9168, + "end": 9169, + "name": "PUSH", + "source": 13, + "value": "6" + }, + { + "begin": 9157, + "end": 9167, + "name": "DUP2", + "source": 13 + }, + { + "begin": 9157, + "end": 9167, + "name": "DUP12", + "source": 13 + }, + { + "begin": 9157, + "end": 9171, + "name": "PUSH [tag]", + "source": 13, + "value": "193" + }, + { + "begin": 9157, + "end": 9171, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 9157, + "end": 9171, + "name": "tag", + "source": 13, + "value": "192" + }, + { + "begin": 9157, + "end": 9171, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 9131, + "end": 9144, + "name": "PUSH [tag]", + "source": 13, + "value": "194" + }, + { + "begin": 9131, + "end": 9172, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 9131, + "end": 9172, + "name": "tag", + "source": 13, + "value": "191" + }, + { + "begin": 9131, + "end": 9172, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 622, + "end": 631, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP2", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 1585, + "end": 1610, + "name": "DUP8", + "source": 18 + }, + { + "begin": 1585, + "end": 1610, + "name": "CALLDATALOAD", + "source": 18 + }, + { + "begin": 1626, + "end": 1629, + "name": "PUSH", + "source": 18, + "value": "F0" + }, + { + "begin": 1622, + "end": 1636, + "name": "SHR", + "source": 18 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "DUP2", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "DUP2", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "DUP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "DUP5", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP5", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 9379, + "end": 9380, + "name": "PUSH", + "source": 13, + "value": "2" + }, + { + "begin": 2034, + "end": 2057, + "name": "SWAP1", + "source": 18 + }, + { + "begin": 2034, + "end": 2057, + "name": "SWAP11", + "source": 18 + }, + { + "begin": 2034, + "end": 2057, + "name": "ADD", + "source": 18 + }, + { + "begin": 2021, + "end": 2058, + "name": "CALLDATALOAD", + "source": 18 + }, + { + "begin": 2074, + "end": 2077, + "name": "PUSH", + "source": 18, + "value": "E0" + }, + { + "begin": 2070, + "end": 2084, + "name": "SHR", + "source": 18 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "DUP2", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "SWAP9", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "SWAP2", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 1622, + "end": 1636, + "name": "SWAP1", + "source": 18 + }, + { + "begin": 1622, + "end": 1636, + "name": "SWAP10", + "source": 18 + }, + { + "begin": 9109, + "end": 9172, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 9109, + "end": 9172, + "name": "SWAP9", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 702, + "end": 718, + "name": "SWAP7", + "source": 20 + }, + { + "begin": 2070, + "end": 2084, + "name": "SWAP6", + "source": 18 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 8892, + "end": 9534, + "name": "SWAP4", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 8892, + "end": 9534, + "jumpType": "[out]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 648, + "end": 910, + "name": "tag", + "source": 15, + "value": "121" + }, + { + "begin": 648, + "end": 910, + "name": "JUMPDEST", + "source": 15 + }, + { + "begin": 752, + "end": 769, + "name": "PUSH", + "source": 15, + "value": "0" + }, + { + "begin": 752, + "end": 769, + "name": "DUP1", + "source": 15 + }, + { + "begin": 752, + "end": 769, + "name": "DUP1", + "source": 15 + }, + { + "begin": 752, + "end": 769, + "name": "DUP1", + "source": 15 + }, + { + "begin": 854, + "end": 905, + "name": "PUSH [tag]", + "source": 15, + "value": "203" + }, + { + "begin": 878, + "end": 888, + "name": "DUP8", + "source": 15 + }, + { + "begin": 890, + "end": 904, + "name": "PUSH [tag]", + "source": 15, + "value": "204" + }, + { + "begin": 890, + "end": 900, + "name": "DUP8", + "source": 15 + }, + { + "begin": 901, + "end": 902, + "name": "PUSH", + "source": 15, + "value": "1" + }, + { + "begin": 890, + "end": 900, + "name": "DUP2", + "source": 15 + }, + { + "begin": 890, + "end": 900, + "name": "DUP12", + "source": 15 + }, + { + "begin": 890, + "end": 904, + "name": "PUSH [tag]", + "source": 15, + "value": "193" + }, + { + "begin": 890, + "end": 904, + "jumpType": "[in]", + "name": "JUMP", + "source": 15 + }, + { + "begin": 890, + "end": 904, + "name": "tag", + "source": 15, + "value": "204" + }, + { + "begin": 890, + "end": 904, + "name": "JUMPDEST", + "source": 15 + }, + { + "begin": 854, + "end": 877, + "name": "PUSH [tag]", + "source": 15, + "value": "117" + }, + { + "begin": 854, + "end": 905, + "jumpType": "[in]", + "name": "JUMP", + "source": 15 + }, + { + "begin": 854, + "end": 905, + "name": "tag", + "source": 15, + "value": "203" + }, + { + "begin": 854, + "end": 905, + "name": "JUMPDEST", + "source": 15 + }, + { + "begin": 847, + "end": 905, + "name": "SWAP4", + "source": 15 + }, + { + "begin": 847, + "end": 905, + "name": "POP", + "source": 15 + }, + { + "begin": 847, + "end": 905, + "name": "SWAP4", + "source": 15 + }, + { + "begin": 847, + "end": 905, + "name": "POP", + "source": 15 + }, + { + "begin": 847, + "end": 905, + "name": "SWAP4", + "source": 15 + }, + { + "begin": 847, + "end": 905, + "name": "POP", + "source": 15 + }, + { + "begin": 847, + "end": 905, + "name": "SWAP4", + "source": 15 + }, + { + "begin": 847, + "end": 905, + "name": "POP", + "source": 15 + }, + { + "begin": 648, + "end": 910, + "name": "SWAP4", + "source": 15 + }, + { + "begin": 648, + "end": 910, + "name": "POP", + "source": 15 + }, + { + "begin": 648, + "end": 910, + "name": "SWAP4", + "source": 15 + }, + { + "begin": 648, + "end": 910, + "name": "POP", + "source": 15 + }, + { + "begin": 648, + "end": 910, + "name": "SWAP4", + "source": 15 + }, + { + "begin": 648, + "end": 910, + "name": "POP", + "source": 15 + }, + { + "begin": 648, + "end": 910, + "name": "SWAP4", + "source": 15 + }, + { + "begin": 648, + "end": 910, + "jumpType": "[out]", + "name": "JUMP", + "source": 15 + }, + { + "begin": 404, + "end": 617, + "name": "tag", + "source": 16, + "value": "124" + }, + { + "begin": 404, + "end": 617, + "name": "JUMPDEST", + "source": 16 + }, + { + "begin": 502, + "end": 606, + "name": "PUSH", + "source": 16, + "value": "40" + }, + { + "begin": 502, + "end": 606, + "name": "MLOAD", + "source": 16 + }, + { + "begin": 12792, + "end": 12858, + "name": "PUSH", + "source": 22, + "value": "1901000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 502, + "end": 606, + "name": "PUSH", + "source": 16, + "value": "20" + }, + { + "begin": 502, + "end": 606, + "name": "DUP3", + "source": 16 + }, + { + "begin": 502, + "end": 606, + "name": "ADD", + "source": 16 + }, + { + "begin": 12780, + "end": 12859, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 463, + "end": 470, + "name": "PUSH", + "source": 16, + "value": "0" + }, + { + "begin": 12875, + "end": 12886, + "name": "PUSH", + "source": 22, + "value": "22" + }, + { + "begin": 12875, + "end": 12886, + "name": "DUP3", + "source": 22 + }, + { + "begin": 12875, + "end": 12886, + "name": "ADD", + "source": 22 + }, + { + "begin": 12868, + "end": 12895, + "name": "DUP2", + "source": 22 + }, + { + "begin": 12868, + "end": 12895, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 12868, + "end": 12895, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 12946, + "end": 13012, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000" + }, + { + "begin": 576, + "end": 580, + "name": "ADDRESS", + "source": 16 + }, + { + "begin": 12933, + "end": 12935, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 12929, + "end": 12944, + "name": "SHL", + "source": 22 + }, + { + "begin": 12925, + "end": 13013, + "name": "AND", + "source": 22 + }, + { + "begin": 12911, + "end": 12923, + "name": "PUSH", + "source": 22, + "value": "42" + }, + { + "begin": 12911, + "end": 12923, + "name": "DUP4", + "source": 22 + }, + { + "begin": 12911, + "end": 12923, + "name": "ADD", + "source": 22 + }, + { + "begin": 12904, + "end": 13014, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 13030, + "end": 13042, + "name": "PUSH", + "source": 22, + "value": "56" + }, + { + "begin": 13030, + "end": 13042, + "name": "DUP3", + "source": 22 + }, + { + "begin": 13030, + "end": 13042, + "name": "ADD", + "source": 22 + }, + { + "begin": 13023, + "end": 13051, + "name": "DUP4", + "source": 22 + }, + { + "begin": 13023, + "end": 13051, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 13023, + "end": 13051, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 463, + "end": 470, + "name": "SWAP1", + "source": 16 + }, + { + "begin": 13067, + "end": 13079, + "name": "PUSH", + "source": 22, + "value": "76" + }, + { + "begin": 13067, + "end": 13079, + "name": "ADD", + "source": 22 + }, + { + "begin": 502, + "end": 606, + "name": "PUSH [tag]", + "source": 16, + "value": "155" + }, + { + "begin": 12494, + "end": 13085, + "name": "JUMP", + "source": 22 + }, + { + "begin": 2320, + "end": 4379, + "name": "tag", + "source": 14, + "value": "128" + }, + { + "begin": 2320, + "end": 4379, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 2428, + "end": 2445, + "name": "PUSH", + "source": 14, + "value": "0" + }, + { + "begin": 2428, + "end": 2445, + "name": "DUP1", + "source": 14 + }, + { + "begin": 2428, + "end": 2445, + "name": "DUP1", + "source": 14 + }, + { + "begin": 2428, + "end": 2445, + "name": "DUP1", + "source": 14 + }, + { + "begin": 2428, + "end": 2445, + "name": "DUP1", + "source": 14 + }, + { + "begin": 3378, + "end": 3392, + "name": "PUSH", + "source": 19, + "value": "4" + }, + { + "begin": 2563, + "end": 2564, + "name": "PUSH", + "source": 14, + "value": "1" + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP9", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "ADD", + "source": 19 + }, + { + "begin": 3277, + "end": 3316, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 3336, + "end": 3339, + "name": "PUSH", + "source": 19, + "value": "E8" + }, + { + "begin": 3332, + "end": 3346, + "name": "SHR", + "source": 19 + }, + { + "begin": 2428, + "end": 2445, + "name": "DUP3", + "source": 14 + }, + { + "begin": 2768, + "end": 2784, + "name": "PUSH [tag]", + "source": 14, + "value": "210" + }, + { + "begin": 3378, + "end": 3392, + "name": "DUP4", + "source": 19 + }, + { + "begin": 3332, + "end": 3346, + "name": "DUP4", + "source": 19 + }, + { + "begin": 2768, + "end": 2784, + "name": "PUSH [tag]", + "source": 14, + "value": "211" + }, + { + "begin": 2768, + "end": 2784, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 2768, + "end": 2784, + "name": "tag", + "source": 14, + "value": "210" + }, + { + "begin": 2768, + "end": 2784, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 2750, + "end": 2784, + "name": "SWAP1", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2883, + "end": 2955, + "name": "PUSH [tag]", + "source": 14, + "value": "212" + }, + { + "begin": 2908, + "end": 2915, + "name": "DUP12", + "source": 14 + }, + { + "begin": 2923, + "end": 2949, + "name": "PUSH [tag]", + "source": 14, + "value": "58" + }, + { + "begin": 2750, + "end": 2784, + "name": "DUP4", + "source": 14 + }, + { + "begin": 2934, + "end": 2940, + "name": "DUP7", + "source": 14 + }, + { + "begin": 2923, + "end": 2933, + "name": "DUP14", + "source": 14 + }, + { + "begin": 2923, + "end": 2933, + "name": "DUP16", + "source": 14 + }, + { + "begin": 2923, + "end": 2949, + "name": "PUSH [tag]", + "source": 14, + "value": "193" + }, + { + "begin": 2923, + "end": 2949, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 2883, + "end": 2955, + "name": "tag", + "source": 14, + "value": "212" + }, + { + "begin": 2883, + "end": 2955, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 2791, + "end": 2955, + "name": "SWAP4", + "source": 14 + }, + { + "begin": 2791, + "end": 2955, + "name": "SWAP12", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2791, + "end": 2955, + "name": "SWAP2", + "source": 14 + }, + { + "begin": 2791, + "end": 2955, + "name": "SWAP10", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2791, + "end": 2955, + "name": "SWAP8", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2791, + "end": 2955, + "name": "SWAP6", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2791, + "end": 2955, + "name": "SWAP4", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2966, + "end": 2984, + "name": "DUP8", + "source": 14 + }, + { + "begin": 2966, + "end": 2984, + "name": "DUP8", + "source": 14 + }, + { + "begin": 2966, + "end": 2984, + "name": "LT", + "source": 14 + }, + { + "begin": 2962, + "end": 3080, + "name": "ISZERO", + "source": 14 + }, + { + "begin": 2962, + "end": 3080, + "name": "PUSH [tag]", + "source": 14, + "value": "214" + }, + { + "begin": 2962, + "end": 3080, + "name": "JUMPI", + "source": 14 + }, + { + "begin": 3027, + "end": 3053, + "name": "PUSH [tag]", + "source": 14, + "value": "215" + }, + { + "begin": 3045, + "end": 3052, + "name": "DUP2", + "source": 14 + }, + { + "begin": 3038, + "end": 3044, + "name": "DUP5", + "source": 14 + }, + { + "begin": 3027, + "end": 3037, + "name": "DUP12", + "source": 14 + }, + { + "begin": 3027, + "end": 3037, + "name": "DUP14", + "source": 14 + }, + { + "begin": 3027, + "end": 3053, + "name": "PUSH [tag]", + "source": 14, + "value": "193" + }, + { + "begin": 3027, + "end": 3053, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 3027, + "end": 3053, + "name": "tag", + "source": 14, + "value": "215" + }, + { + "begin": 3027, + "end": 3053, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 3055, + "end": 3064, + "name": "DUP10", + "source": 14 + }, + { + "begin": 3066, + "end": 3072, + "name": "DUP10", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "PUSH", + "source": 14, + "value": "40" + }, + { + "begin": 3001, + "end": 3073, + "name": "MLOAD", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "PUSH", + "source": 14, + "value": "B006ABA000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 3001, + "end": 3073, + "name": "DUP2", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "MSTORE", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "PUSH", + "source": 14, + "value": "4" + }, + { + "begin": 3001, + "end": 3073, + "name": "ADD", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "PUSH [tag]", + "source": 14, + "value": "93" + }, + { + "begin": 3001, + "end": 3073, + "name": "SWAP5", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "SWAP4", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "SWAP3", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "SWAP2", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "SWAP1", + "source": 14 + }, + { + "begin": 3001, + "end": 3073, + "name": "PUSH [tag]", + "source": 14, + "value": "217" + }, + { + "begin": 3001, + "end": 3073, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 2962, + "end": 3080, + "name": "tag", + "source": 14, + "value": "214" + }, + { + "begin": 2962, + "end": 3080, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 3095, + "end": 3102, + "name": "DUP1", + "source": 14 + }, + { + "begin": 3086, + "end": 3102, + "name": "SWAP3", + "source": 14 + }, + { + "begin": 3086, + "end": 3102, + "name": "POP", + "source": 14 + }, + { + "begin": 3283, + "end": 4375, + "name": "tag", + "source": 14, + "value": "218" + }, + { + "begin": 3283, + "end": 4375, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 3290, + "end": 3316, + "name": "DUP9", + "source": 14 + }, + { + "begin": 3290, + "end": 3316, + "name": "DUP4", + "source": 14 + }, + { + "begin": 3290, + "end": 3316, + "name": "LT", + "source": 14 + }, + { + "begin": 3283, + "end": 4375, + "name": "ISZERO", + "source": 14 + }, + { + "begin": 3283, + "end": 4375, + "name": "PUSH [tag]", + "source": 14, + "value": "219" + }, + { + "begin": 3283, + "end": 4375, + "name": "JUMPI", + "source": 14 + }, + { + "begin": 3390, + "end": 3391, + "name": "PUSH", + "source": 19, + "value": "3" + }, + { + "begin": 3378, + "end": 3392, + "name": "DUP4", + "source": 19 + }, + { + "begin": 3378, + "end": 3392, + "name": "ADD", + "source": 19 + }, + { + "begin": 3378, + "end": 3392, + "name": "SWAP3", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP11", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "ADD", + "source": 19 + }, + { + "begin": 3277, + "end": 3316, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 3336, + "end": 3339, + "name": "PUSH", + "source": 19, + "value": "E8" + }, + { + "begin": 3332, + "end": 3346, + "name": "SHR", + "source": 19 + }, + { + "begin": 3332, + "end": 3346, + "name": "SWAP2", + "source": 19 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3444, + "end": 3460, + "name": "PUSH [tag]", + "source": 14, + "value": "221" + }, + { + "begin": 3378, + "end": 3392, + "name": "DUP4", + "source": 19 + }, + { + "begin": 3332, + "end": 3346, + "name": "DUP4", + "source": 19 + }, + { + "begin": 3444, + "end": 3460, + "name": "PUSH [tag]", + "source": 14, + "value": "211" + }, + { + "begin": 3444, + "end": 3460, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 3444, + "end": 3460, + "name": "tag", + "source": 14, + "value": "221" + }, + { + "begin": 3444, + "end": 3460, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 3434, + "end": 3460, + "name": "SWAP1", + "source": 14 + }, + { + "begin": 3434, + "end": 3460, + "name": "POP", + "source": 14 + }, + { + "begin": 3469, + "end": 3491, + "name": "PUSH", + "source": 14, + "value": "0" + }, + { + "begin": 3687, + "end": 3792, + "name": "PUSH [tag]", + "source": 14, + "value": "222" + }, + { + "begin": 3714, + "end": 3748, + "name": "PUSH [tag]", + "source": 14, + "value": "223" + }, + { + "begin": 3738, + "end": 3747, + "name": "DUP9", + "source": 14 + }, + { + "begin": 3714, + "end": 3737, + "name": "PUSH [tag]", + "source": 14, + "value": "224" + }, + { + "begin": 3714, + "end": 3748, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 3714, + "end": 3748, + "name": "tag", + "source": 14, + "value": "223" + }, + { + "begin": 3714, + "end": 3748, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 3758, + "end": 3768, + "name": "DUP13", + "source": 14 + }, + { + "begin": 3758, + "end": 3768, + "name": "DUP13", + "source": 14 + }, + { + "begin": 3769, + "end": 3775, + "name": "DUP8", + "source": 14 + }, + { + "begin": 3758, + "end": 3784, + "name": "SWAP1", + "source": 14 + }, + { + "begin": 3776, + "end": 3783, + "name": "DUP7", + "source": 14 + }, + { + "begin": 3758, + "end": 3784, + "name": "SWAP3", + "source": 14 + }, + { + "begin": 3758, + "end": 3784, + "name": "PUSH [tag]", + "source": 14, + "value": "58" + }, + { + "begin": 3758, + "end": 3784, + "name": "SWAP4", + "source": 14 + }, + { + "begin": 3758, + "end": 3784, + "name": "SWAP3", + "source": 14 + }, + { + "begin": 3758, + "end": 3784, + "name": "SWAP2", + "source": 14 + }, + { + "begin": 3758, + "end": 3784, + "name": "SWAP1", + "source": 14 + }, + { + "begin": 3758, + "end": 3784, + "name": "PUSH [tag]", + "source": 14, + "value": "193" + }, + { + "begin": 3758, + "end": 3784, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 3687, + "end": 3792, + "name": "tag", + "source": 14, + "value": "222" + }, + { + "begin": 3687, + "end": 3792, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 3500, + "end": 3792, + "name": "SWAP4", + "source": 14 + }, + { + "begin": 3500, + "end": 3792, + "name": "SWAP13", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3500, + "end": 3792, + "name": "SWAP2", + "source": 14 + }, + { + "begin": 3500, + "end": 3792, + "name": "SWAP11", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3500, + "end": 3792, + "name": "SWAP9", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3500, + "end": 3792, + "name": "SWAP1", + "source": 14 + }, + { + "begin": 3500, + "end": 3792, + "name": "SWAP2", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3833, + "end": 3851, + "name": "DUP9", + "source": 14 + }, + { + "begin": 3833, + "end": 3851, + "name": "DUP9", + "source": 14 + }, + { + "begin": 3833, + "end": 3851, + "name": "LT", + "source": 14 + }, + { + "begin": 3829, + "end": 3951, + "name": "ISZERO", + "source": 14 + }, + { + "begin": 3829, + "end": 3951, + "name": "PUSH [tag]", + "source": 14, + "value": "226" + }, + { + "begin": 3829, + "end": 3951, + "name": "JUMPI", + "source": 14 + }, + { + "begin": 3896, + "end": 3922, + "name": "PUSH [tag]", + "source": 14, + "value": "227" + }, + { + "begin": 3914, + "end": 3921, + "name": "DUP3", + "source": 14 + }, + { + "begin": 3907, + "end": 3913, + "name": "DUP6", + "source": 14 + }, + { + "begin": 3896, + "end": 3906, + "name": "DUP13", + "source": 14 + }, + { + "begin": 3896, + "end": 3906, + "name": "DUP15", + "source": 14 + }, + { + "begin": 3896, + "end": 3922, + "name": "PUSH [tag]", + "source": 14, + "value": "193" + }, + { + "begin": 3896, + "end": 3922, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 3896, + "end": 3922, + "name": "tag", + "source": 14, + "value": "227" + }, + { + "begin": 3896, + "end": 3922, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 3924, + "end": 3933, + "name": "DUP11", + "source": 14 + }, + { + "begin": 3935, + "end": 3941, + "name": "DUP11", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "PUSH", + "source": 14, + "value": "40" + }, + { + "begin": 3870, + "end": 3942, + "name": "MLOAD", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "PUSH", + "source": 14, + "value": "B006ABA000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 3870, + "end": 3942, + "name": "DUP2", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "MSTORE", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "PUSH", + "source": 14, + "value": "4" + }, + { + "begin": 3870, + "end": 3942, + "name": "ADD", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "PUSH [tag]", + "source": 14, + "value": "93" + }, + { + "begin": 3870, + "end": 3942, + "name": "SWAP5", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "SWAP4", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "SWAP3", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "SWAP2", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "SWAP1", + "source": 14 + }, + { + "begin": 3870, + "end": 3942, + "name": "PUSH [tag]", + "source": 14, + "value": "217" + }, + { + "begin": 3870, + "end": 3942, + "jumpType": "[in]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 3829, + "end": 3951, + "name": "tag", + "source": 14, + "value": "226" + }, + { + "begin": 3829, + "end": 3951, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 4216, + "end": 4226, + "name": "DUP5", + "source": 14 + }, + { + "begin": 4198, + "end": 4212, + "name": "DUP2", + "source": 14 + }, + { + "begin": 4198, + "end": 4226, + "name": "LT", + "source": 14 + }, + { + "begin": 4194, + "end": 4309, + "name": "PUSH [tag]", + "source": 14, + "value": "229" + }, + { + "begin": 4194, + "end": 4309, + "name": "JUMPI", + "source": 14 + }, + { + "begin": 4245, + "end": 4300, + "name": "PUSH", + "source": 14, + "value": "40" + }, + { + "begin": 4245, + "end": 4300, + "name": "MLOAD", + "source": 14 + }, + { + "begin": 4245, + "end": 4300, + "name": "PUSH", + "source": 14, + "value": "37DAF62B00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 4245, + "end": 4300, + "name": "DUP2", + "source": 14 + }, + { + "begin": 4245, + "end": 4300, + "name": "MSTORE", + "source": 14 + }, + { + "begin": 4245, + "end": 4300, + "name": "PUSH", + "source": 14, + "value": "4" + }, + { + "begin": 4245, + "end": 4300, + "name": "DUP2", + "source": 14 + }, + { + "begin": 4245, + "end": 4300, + "name": "ADD", + "source": 14 + }, + { + "begin": 16193, + "end": 16218, + "name": "DUP3", + "source": 22 + }, + { + "begin": 16193, + "end": 16218, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 16193, + "end": 16218, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 16234, + "end": 16252, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 16234, + "end": 16252, + "name": "DUP2", + "source": 22 + }, + { + "begin": 16234, + "end": 16252, + "name": "ADD", + "source": 22 + }, + { + "begin": 16227, + "end": 16261, + "name": "DUP7", + "source": 22 + }, + { + "begin": 16227, + "end": 16261, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 16227, + "end": 16261, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 16166, + "end": 16184, + "name": "PUSH", + "source": 22, + "value": "44" + }, + { + "begin": 16166, + "end": 16184, + "name": "ADD", + "source": 22 + }, + { + "begin": 4245, + "end": 4300, + "name": "PUSH [tag]", + "source": 14, + "value": "93" + }, + { + "begin": 16019, + "end": 16267, + "name": "JUMP", + "source": 22 + }, + { + "begin": 4194, + "end": 4309, + "name": "tag", + "source": 14, + "value": "229" + }, + { + "begin": 4194, + "end": 4309, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 4330, + "end": 4344, + "name": "SWAP4", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4361, + "end": 4368, + "name": "SWAP2", + "source": 14 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4361, + "end": 4368, + "name": "DUP2", + "source": 14 + }, + { + "begin": 3283, + "end": 4375, + "name": "PUSH [tag]", + "source": 14, + "value": "218" + }, + { + "begin": 3283, + "end": 4375, + "name": "JUMP", + "source": 14 + }, + { + "begin": 3283, + "end": 4375, + "name": "tag", + "source": 14, + "value": "219" + }, + { + "begin": 3283, + "end": 4375, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 2540, + "end": 4379, + "name": "POP", + "source": 14 + }, + { + "begin": 2540, + "end": 4379, + "name": "POP", + "source": 14 + }, + { + "begin": 2540, + "end": 4379, + "name": "POP", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "SWAP4", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "SWAP8", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "SWAP3", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "SWAP7", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "POP", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "SWAP4", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "POP", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "SWAP4", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "name": "POP", + "source": 14 + }, + { + "begin": 2320, + "end": 4379, + "jumpType": "[out]", + "name": "JUMP", + "source": 14 + }, + { + "begin": 490, + "end": 677, + "name": "tag", + "source": 9, + "value": "133" + }, + { + "begin": 490, + "end": 677, + "name": "JUMPDEST", + "source": 9 + }, + { + "begin": 568, + "end": 579, + "name": "PUSH", + "source": 9, + "value": "0" + }, + { + "begin": 587, + "end": 598, + "name": "DUP1", + "source": 9 + }, + { + "begin": 622, + "end": 626, + "name": "DUP4", + "source": 9 + }, + { + "begin": 628, + "end": 635, + "name": "DUP4", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "40" + }, + { + "begin": 611, + "end": 636, + "name": "MLOAD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "20" + }, + { + "begin": 611, + "end": 636, + "name": "ADD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH [tag]", + "source": 9, + "value": "233" + }, + { + "begin": 611, + "end": 636, + "name": "SWAP3", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SWAP2", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SWAP1", + "source": 9 + }, + { + "begin": 16193, + "end": 16218, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 16193, + "end": 16218, + "name": "DUP3", + "source": 22 + }, + { + "begin": 16193, + "end": 16218, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 16249, + "end": 16251, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 16234, + "end": 16252, + "name": "DUP3", + "source": 22 + }, + { + "begin": 16234, + "end": 16252, + "name": "ADD", + "source": 22 + }, + { + "begin": 16227, + "end": 16261, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 16181, + "end": 16183, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 16166, + "end": 16184, + "name": "ADD", + "source": 22 + }, + { + "begin": 16166, + "end": 16184, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 16019, + "end": 16267, + "name": "JUMP", + "source": 22 + }, + { + "begin": 611, + "end": 636, + "name": "tag", + "source": 9, + "value": "233" + }, + { + "begin": 611, + "end": 636, + "name": "JUMPDEST", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "40" + }, + { + "begin": 611, + "end": 636, + "name": "DUP1", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "MLOAD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0" + }, + { + "begin": 611, + "end": 636, + "name": "DUP2", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "DUP5", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SUB", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "ADD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "DUP2", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "MSTORE", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SWAP2", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SWAP1", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "MSTORE", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "DUP1", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "MLOAD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "20" + }, + { + "begin": 601, + "end": 637, + "name": "SWAP1", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "SWAP2", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "ADD", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "KECCAK256", + "source": 9 + }, + { + "begin": 661, + "end": 671, + "name": "SLOAD", + "source": 9 + }, + { + "begin": 661, + "end": 671, + "name": "SWAP5", + "source": 9 + }, + { + "begin": 490, + "end": 677, + "name": "SWAP4", + "source": 9 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 490, + "end": 677, + "jumpType": "[out]", + "name": "JUMP", + "source": 9 + }, + { + "begin": 4140, + "end": 4371, + "name": "tag", + "source": 3, + "value": "147" + }, + { + "begin": 4140, + "end": 4371, + "name": "JUMPDEST", + "source": 3 + }, + { + "begin": 4226, + "end": 4230, + "name": "PUSH", + "source": 3, + "value": "0" + }, + { + "begin": 4242, + "end": 4288, + "name": "PUSH", + "source": 3, + "value": "E4A77BBC00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 4242, + "end": 4288, + "name": "PUSH", + "source": 3, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 4242, + "end": 4288, + "name": "DUP4", + "source": 3 + }, + { + "begin": 4242, + "end": 4288, + "name": "AND", + "source": 3 + }, + { + "begin": 4242, + "end": 4288, + "name": "ADD", + "source": 3 + }, + { + "begin": 4238, + "end": 4316, + "name": "PUSH [tag]", + "source": 3, + "value": "236" + }, + { + "begin": 4238, + "end": 4316, + "name": "JUMPI", + "source": 3 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4305, + "end": 4309, + "name": "PUSH", + "source": 3, + "value": "1" + }, + { + "begin": 4305, + "end": 4309, + "name": "SWAP2", + "source": 3 + }, + { + "begin": 4140, + "end": 4371, + "name": "SWAP1", + "source": 3 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4140, + "end": 4371, + "jumpType": "[out]", + "name": "JUMP", + "source": 3 + }, + { + "begin": 4238, + "end": 4316, + "name": "tag", + "source": 3, + "value": "236" + }, + { + "begin": 4238, + "end": 4316, + "name": "JUMPDEST", + "source": 3 + }, + { + "begin": 4329, + "end": 4366, + "name": "PUSH [tag]", + "source": 3, + "value": "80" + }, + { + "begin": 4353, + "end": 4365, + "name": "DUP3", + "source": 3 + }, + { + "begin": 4329, + "end": 4352, + "name": "PUSH [tag]", + "source": 3, + "value": "238" + }, + { + "begin": 4329, + "end": 4366, + "jumpType": "[in]", + "name": "JUMP", + "source": 3 + }, + { + "begin": 1525, + "end": 1878, + "name": "tag", + "source": 20, + "value": "179" + }, + { + "begin": 1525, + "end": 1878, + "name": "JUMPDEST", + "source": 20 + }, + { + "begin": 1640, + "end": 1646, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 1688, + "end": 1692, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 1682, + "end": 1693, + "name": "MLOAD", + "source": 20 + }, + { + "begin": 1732, + "end": 1744, + "name": "DUP3", + "source": 20 + }, + { + "begin": 1718, + "end": 1730, + "name": "DUP5", + "source": 20 + }, + { + "begin": 1713, + "end": 1716, + "name": "DUP3", + "source": 20 + }, + { + "begin": 1700, + "end": 1745, + "name": "CALLDATACOPY", + "source": 20 + }, + { + "begin": 1859, + "end": 1860, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 1848, + "end": 1849, + "name": "DUP1", + "source": 20 + }, + { + "begin": 1826, + "end": 1838, + "name": "DUP5", + "source": 20 + }, + { + "begin": 1813, + "end": 1816, + "name": "DUP4", + "source": 20 + }, + { + "begin": 1799, + "end": 1803, + "name": "DUP10", + "source": 20 + }, + { + "begin": 1786, + "end": 1789, + "name": "DUP12", + "source": 20 + }, + { + "begin": 1772, + "end": 1776, + "name": "DUP11", + "source": 20 + }, + { + "begin": 1758, + "end": 1868, + "name": "CALL", + "source": 20 + }, + { + "begin": 1753, + "end": 1868, + "name": "SWAP8", + "source": 20 + }, + { + "begin": 1525, + "end": 1878, + "name": "SWAP7", + "source": 20 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1525, + "end": 1878, + "jumpType": "[out]", + "name": "JUMP", + "source": 20 + }, + { + "begin": 852, + "end": 1123, + "name": "tag", + "source": 20, + "value": "186" + }, + { + "begin": 852, + "end": 1123, + "name": "JUMPDEST", + "source": 20 + }, + { + "begin": 897, + "end": 911, + "name": "PUSH", + "source": 20, + "value": "60" + }, + { + "begin": 948, + "end": 964, + "name": "RETURNDATASIZE", + "source": 20 + }, + { + "begin": 982, + "end": 986, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 976, + "end": 987, + "name": "MLOAD", + "source": 20 + }, + { + "begin": 971, + "end": 987, + "name": "SWAP2", + "source": 20 + }, + { + "begin": 971, + "end": 987, + "name": "POP", + "source": 20 + }, + { + "begin": 1014, + "end": 1016, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 1011, + "end": 1012, + "name": "DUP3", + "source": 20 + }, + { + "begin": 1007, + "end": 1017, + "name": "ADD", + "source": 20 + }, + { + "begin": 1048, + "end": 1052, + "name": "DUP2", + "source": 20 + }, + { + "begin": 1041, + "end": 1046, + "name": "DUP2", + "source": 20 + }, + { + "begin": 1037, + "end": 1053, + "name": "ADD", + "source": 20 + }, + { + "begin": 1031, + "end": 1035, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 1024, + "end": 1054, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 1071, + "end": 1075, + "name": "DUP2", + "source": 20 + }, + { + "begin": 1068, + "end": 1069, + "name": "DUP4", + "source": 20 + }, + { + "begin": 1061, + "end": 1076, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 1108, + "end": 1112, + "name": "DUP2", + "source": 20 + }, + { + "begin": 1105, + "end": 1106, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 1098, + "end": 1103, + "name": "DUP3", + "source": 20 + }, + { + "begin": 1083, + "end": 1113, + "name": "RETURNDATACOPY", + "source": 20 + }, + { + "begin": 1083, + "end": 1113, + "name": "POP", + "source": 20 + }, + { + "begin": 1083, + "end": 1113, + "name": "POP", + "source": 20 + }, + { + "begin": 852, + "end": 1123, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 852, + "end": 1123, + "jumpType": "[out]", + "name": "JUMP", + "source": 20 + }, + { + "begin": 3644, + "end": 3930, + "name": "tag", + "source": 3, + "value": "187" + }, + { + "begin": 3644, + "end": 3930, + "name": "JUMPDEST", + "source": 3 + }, + { + "begin": 3781, + "end": 3795, + "name": "DUP4", + "source": 3 + }, + { + "begin": 3777, + "end": 3926, + "name": "ISZERO", + "source": 3 + }, + { + "begin": 3777, + "end": 3926, + "name": "PUSH [tag]", + "source": 3, + "value": "243" + }, + { + "begin": 3777, + "end": 3926, + "name": "JUMPI", + "source": 3 + }, + { + "begin": 3849, + "end": 3856, + "name": "DUP1", + "source": 3 + }, + { + "begin": 3843, + "end": 3857, + "name": "MLOAD", + "source": 3 + }, + { + "begin": 3836, + "end": 3840, + "name": "PUSH", + "source": 3, + "value": "20" + }, + { + "begin": 3827, + "end": 3834, + "name": "DUP3", + "source": 3 + }, + { + "begin": 3823, + "end": 3841, + "name": "ADD", + "source": 3 + }, + { + "begin": 3816, + "end": 3858, + "name": "REVERT", + "source": 3 + }, + { + "begin": 3777, + "end": 3926, + "name": "tag", + "source": 3, + "value": "243" + }, + { + "begin": 3777, + "end": 3926, + "name": "JUMPDEST", + "source": 3 + }, + { + "begin": 3894, + "end": 3901, + "name": "DUP3", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "PUSH", + "source": 3, + "value": "AB46C69F7F32E1BF09B0725853DA82A211E5402A0600296AB499A2FB5EA3B419" + }, + { + "begin": 3903, + "end": 3909, + "name": "DUP4", + "source": 3 + }, + { + "begin": 3911, + "end": 3918, + "name": "DUP4", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "PUSH", + "source": 3, + "value": "40" + }, + { + "begin": 3885, + "end": 3919, + "name": "MLOAD", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "PUSH [tag]", + "source": 3, + "value": "245" + }, + { + "begin": 3885, + "end": 3919, + "name": "SWAP3", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "SWAP2", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "SWAP1", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "PUSH [tag]", + "source": 3, + "value": "246" + }, + { + "begin": 3885, + "end": 3919, + "jumpType": "[in]", + "name": "JUMP", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "tag", + "source": 3, + "value": "245" + }, + { + "begin": 3885, + "end": 3919, + "name": "JUMPDEST", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "PUSH", + "source": 3, + "value": "40" + }, + { + "begin": 3885, + "end": 3919, + "name": "MLOAD", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "DUP1", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "SWAP2", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "SUB", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "SWAP1", + "source": 3 + }, + { + "begin": 3885, + "end": 3919, + "name": "LOG2", + "source": 3 + }, + { + "begin": 3644, + "end": 3930, + "name": "POP", + "source": 3 + }, + { + "begin": 3644, + "end": 3930, + "name": "POP", + "source": 3 + }, + { + "begin": 3644, + "end": 3930, + "name": "POP", + "source": 3 + }, + { + "begin": 3644, + "end": 3930, + "name": "POP", + "source": 3 + }, + { + "begin": 3644, + "end": 3930, + "jumpType": "[out]", + "name": "JUMP", + "source": 3 + }, + { + "begin": 3525, + "end": 8233, + "name": "tag", + "source": 13, + "value": "194" + }, + { + "begin": 3525, + "end": 8233, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 3635, + "end": 3649, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 3655, + "end": 3667, + "name": "DUP1", + "source": 13 + }, + { + "begin": 3696, + "end": 3710, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 3765, + "end": 8223, + "name": "tag", + "source": 13, + "value": "248" + }, + { + "begin": 3765, + "end": 8223, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 3772, + "end": 3798, + "name": "DUP4", + "source": 13 + }, + { + "begin": 3772, + "end": 3798, + "name": "DUP2", + "source": 13 + }, + { + "begin": 3772, + "end": 3798, + "name": "LT", + "source": 13 + }, + { + "begin": 3765, + "end": 8223, + "name": "ISZERO", + "source": 13 + }, + { + "begin": 3765, + "end": 8223, + "name": "PUSH [tag]", + "source": 13, + "value": "249" + }, + { + "begin": 3765, + "end": 8223, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 1475, + "end": 1476, + "name": "PUSH", + "source": 19, + "value": "1" + }, + { + "begin": 1463, + "end": 1477, + "name": "DUP2", + "source": 19 + }, + { + "begin": 1463, + "end": 1477, + "name": "ADD", + "source": 19 + }, + { + "begin": 1463, + "end": 1477, + "name": "SWAP1", + "source": 19 + }, + { + "begin": 1390, + "end": 1415, + "name": "DUP6", + "source": 19 + }, + { + "begin": 1390, + "end": 1415, + "name": "ADD", + "source": 19 + }, + { + "begin": 1377, + "end": 1416, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 1432, + "end": 1435, + "name": "PUSH", + "source": 19, + "value": "F8" + }, + { + "begin": 1428, + "end": 1442, + "name": "SHR", + "source": 19 + }, + { + "begin": 3923, + "end": 3943, + "name": "PUSH", + "source": 13, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3923, + "end": 3943, + "name": "DUP2", + "source": 13 + }, + { + "begin": 3923, + "end": 3943, + "name": "ADD", + "source": 13 + }, + { + "begin": 3919, + "end": 4321, + "name": "PUSH [tag]", + "source": 13, + "value": "252" + }, + { + "begin": 3919, + "end": 4321, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 2205, + "end": 2207, + "name": "PUSH", + "source": 19, + "value": "15" + }, + { + "begin": 2193, + "end": 2208, + "name": "DUP3", + "source": 19 + }, + { + "begin": 2193, + "end": 2208, + "name": "ADD", + "source": 19 + }, + { + "begin": 2193, + "end": 2208, + "name": "SWAP2", + "source": 19 + }, + { + "begin": 2046, + "end": 2071, + "name": "DUP7", + "source": 19 + }, + { + "begin": 2046, + "end": 2071, + "name": "ADD", + "source": 19 + }, + { + "begin": 2033, + "end": 2072, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 2088, + "end": 2091, + "name": "PUSH", + "source": 19, + "value": "F8" + }, + { + "begin": 2084, + "end": 2098, + "name": "DUP2", + "source": 19 + }, + { + "begin": 2084, + "end": 2098, + "name": "SWAP1", + "source": 19 + }, + { + "begin": 2084, + "end": 2098, + "name": "SHR", + "source": 19 + }, + { + "begin": 2084, + "end": 2098, + "name": "SWAP1", + "source": 19 + }, + { + "begin": 2118, + "end": 2120, + "name": "PUSH", + "source": 19, + "value": "58" + }, + { + "begin": 2114, + "end": 2127, + "name": "SHR", + "source": 19 + }, + { + "begin": 2129, + "end": 2171, + "name": "PUSH", + "source": 19, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 2110, + "end": 2172, + "name": "DUP2", + "source": 19 + }, + { + "begin": 2110, + "end": 2172, + "name": "AND", + "source": 19 + }, + { + "begin": 2110, + "end": 2172, + "name": "SWAP1", + "source": 19 + }, + { + "begin": 1873, + "end": 1896, + "name": "PUSH", + "source": 13, + "value": "FF0000000000000000000000000000000000000000" + }, + { + "begin": 1873, + "end": 1896, + "name": "AND", + "source": 13 + }, + { + "begin": 1873, + "end": 1922, + "name": "DUP2", + "source": 13 + }, + { + "begin": 1873, + "end": 1922, + "name": "OR", + "source": 13 + }, + { + "begin": 4231, + "end": 4235, + "name": "DUP6", + "source": 13 + }, + { + "begin": 4231, + "end": 4290, + "name": "PUSH [tag]", + "source": 13, + "value": "257" + }, + { + "begin": 4231, + "end": 4290, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 4286, + "end": 4290, + "name": "DUP1", + "source": 13 + }, + { + "begin": 4231, + "end": 4290, + "name": "PUSH [tag]", + "source": 13, + "value": "259" + }, + { + "begin": 4231, + "end": 4290, + "name": "JUMP", + "source": 13 + }, + { + "begin": 4231, + "end": 4290, + "name": "tag", + "source": 13, + "value": "257" + }, + { + "begin": 4231, + "end": 4290, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 622, + "end": 631, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "DUP7", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP2", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "DUP3", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 4252, + "end": 4283, + "name": "tag", + "source": 13, + "value": "259" + }, + { + "begin": 4252, + "end": 4283, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 4224, + "end": 4290, + "name": "SWAP6", + "source": 13 + }, + { + "begin": 4224, + "end": 4290, + "name": "POP", + "source": 13 + }, + { + "begin": 4302, + "end": 4310, + "name": "POP", + "source": 13 + }, + { + "begin": 4302, + "end": 4310, + "name": "POP", + "source": 13 + }, + { + "begin": 4302, + "end": 4310, + "name": "POP", + "source": 13 + }, + { + "begin": 4302, + "end": 4310, + "name": "POP", + "source": 13 + }, + { + "begin": 4302, + "end": 4310, + "name": "PUSH [tag]", + "source": 13, + "value": "248" + }, + { + "begin": 4302, + "end": 4310, + "name": "JUMP", + "source": 13 + }, + { + "begin": 3919, + "end": 4321, + "name": "tag", + "source": 13, + "value": "252" + }, + { + "begin": 3919, + "end": 4321, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 4335, + "end": 4339, + "name": "DUP1", + "source": 13 + }, + { + "begin": 4331, + "end": 5010, + "name": "PUSH [tag]", + "source": 13, + "value": "260" + }, + { + "begin": 4331, + "end": 5010, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 1475, + "end": 1476, + "name": "PUSH", + "source": 19, + "value": "1" + }, + { + "begin": 1463, + "end": 1477, + "name": "DUP3", + "source": 19 + }, + { + "begin": 1463, + "end": 1477, + "name": "ADD", + "source": 19 + }, + { + "begin": 1463, + "end": 1477, + "name": "SWAP2", + "source": 19 + }, + { + "begin": 1390, + "end": 1415, + "name": "DUP7", + "source": 19 + }, + { + "begin": 1390, + "end": 1415, + "name": "DUP2", + "source": 19 + }, + { + "begin": 1390, + "end": 1415, + "name": "ADD", + "source": 19 + }, + { + "begin": 1377, + "end": 1416, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 1432, + "end": 1435, + "name": "PUSH", + "source": 19, + "value": "F8" + }, + { + "begin": 1428, + "end": 1442, + "name": "SHR", + "source": 19 + }, + { + "begin": 1428, + "end": 1442, + "name": "SWAP1", + "source": 19 + }, + { + "begin": 4560, + "end": 4571, + "name": "PUSH", + "source": 13, + "value": "43" + }, + { + "begin": 4560, + "end": 4571, + "name": "ADD", + "source": 13 + }, + { + "begin": 4396, + "end": 4412, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 4598, + "end": 4670, + "name": "PUSH [tag]", + "source": 13, + "value": "262" + }, + { + "begin": 4631, + "end": 4641, + "name": "DUP11", + "source": 13 + }, + { + "begin": 4643, + "end": 4669, + "name": "PUSH [tag]", + "source": 13, + "value": "263" + }, + { + "begin": 4560, + "end": 4571, + "name": "DUP5", + "source": 13 + }, + { + "begin": 1463, + "end": 1477, + "name": "DUP9", + "source": 19 + }, + { + "begin": 4643, + "end": 4653, + "name": "DUP13", + "source": 13 + }, + { + "begin": 1390, + "end": 1415, + "name": "DUP15", + "source": 19 + }, + { + "begin": 4643, + "end": 4669, + "name": "PUSH [tag]", + "source": 13, + "value": "193" + }, + { + "begin": 4643, + "end": 4669, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 4643, + "end": 4669, + "name": "tag", + "source": 13, + "value": "263" + }, + { + "begin": 4643, + "end": 4669, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 4598, + "end": 4630, + "name": "PUSH [tag]", + "source": 13, + "value": "264" + }, + { + "begin": 4598, + "end": 4670, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 4598, + "end": 4670, + "name": "tag", + "source": 13, + "value": "262" + }, + { + "begin": 4598, + "end": 4670, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 4764, + "end": 4784, + "name": "PUSH", + "source": 13, + "value": "FF" + }, + { + "begin": 4764, + "end": 4784, + "name": "DUP5", + "source": 13 + }, + { + "begin": 4764, + "end": 4784, + "name": "AND", + "source": 13 + }, + { + "begin": 4764, + "end": 4784, + "name": "SWAP8", + "source": 13 + }, + { + "begin": 4764, + "end": 4784, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 4764, + "end": 4784, + "name": "SWAP8", + "source": 13 + }, + { + "begin": 4764, + "end": 4784, + "name": "ADD", + "source": 13 + }, + { + "begin": 4764, + "end": 4784, + "name": "SWAP7", + "source": 13 + }, + { + "begin": 4691, + "end": 4698, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 4691, + "end": 4698, + "name": "SWAP5", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4691, + "end": 4698, + "name": "DUP5", + "source": 13 + }, + { + "begin": 4691, + "end": 4698, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 4764, + "end": 4784, + "name": "SWAP1", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1893, + "end": 1896, + "name": "PUSH", + "source": 13, + "value": "A0" + }, + { + "begin": 1873, + "end": 1896, + "name": "DUP4", + "source": 13 + }, + { + "begin": 1873, + "end": 1896, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 1873, + "end": 1896, + "name": "SHL", + "source": 13 + }, + { + "begin": 1873, + "end": 1896, + "name": "PUSH", + "source": 13, + "value": "FF0000000000000000000000000000000000000000" + }, + { + "begin": 1873, + "end": 1896, + "name": "AND", + "source": 13 + }, + { + "begin": 1899, + "end": 1922, + "name": "PUSH", + "source": 13, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1899, + "end": 1922, + "name": "DUP3", + "source": 13 + }, + { + "begin": 1899, + "end": 1922, + "name": "AND", + "source": 13 + }, + { + "begin": 1873, + "end": 1922, + "name": "OR", + "source": 13 + }, + { + "begin": 4920, + "end": 4924, + "name": "DUP7", + "source": 13 + }, + { + "begin": 4920, + "end": 4979, + "name": "PUSH [tag]", + "source": 13, + "value": "266" + }, + { + "begin": 4920, + "end": 4979, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 4975, + "end": 4979, + "name": "DUP1", + "source": 13 + }, + { + "begin": 4920, + "end": 4979, + "name": "PUSH [tag]", + "source": 13, + "value": "268" + }, + { + "begin": 4920, + "end": 4979, + "name": "JUMP", + "source": 13 + }, + { + "begin": 4920, + "end": 4979, + "name": "tag", + "source": 13, + "value": "266" + }, + { + "begin": 4920, + "end": 4979, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 622, + "end": 631, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "DUP8", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP2", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "DUP3", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 4941, + "end": 4972, + "name": "tag", + "source": 13, + "value": "268" + }, + { + "begin": 4941, + "end": 4972, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 4913, + "end": 4979, + "name": "SWAP7", + "source": 13 + }, + { + "begin": 4913, + "end": 4979, + "name": "POP", + "source": 13 + }, + { + "begin": 4991, + "end": 4999, + "name": "POP", + "source": 13 + }, + { + "begin": 4991, + "end": 4999, + "name": "POP", + "source": 13 + }, + { + "begin": 4991, + "end": 4999, + "name": "POP", + "source": 13 + }, + { + "begin": 4991, + "end": 4999, + "name": "POP", + "source": 13 + }, + { + "begin": 4991, + "end": 4999, + "name": "POP", + "source": 13 + }, + { + "begin": 4991, + "end": 4999, + "name": "PUSH [tag]", + "source": 13, + "value": "248" + }, + { + "begin": 4991, + "end": 4999, + "name": "JUMP", + "source": 13 + }, + { + "begin": 4331, + "end": 5010, + "name": "tag", + "source": 13, + "value": "260" + }, + { + "begin": 4331, + "end": 5010, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 625, + "end": 626, + "name": "PUSH", + "source": 13, + "value": "2" + }, + { + "begin": 5024, + "end": 5028, + "name": "DUP2", + "source": 13 + }, + { + "begin": 5024, + "end": 5054, + "name": "SUB", + "source": 13 + }, + { + "begin": 5020, + "end": 5952, + "name": "PUSH [tag]", + "source": 13, + "value": "269" + }, + { + "begin": 5020, + "end": 5952, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 5104, + "end": 5120, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 5104, + "end": 5120, + "name": "DUP1", + "source": 13 + }, + { + "begin": 2046, + "end": 2071, + "name": "DUP8", + "source": 19 + }, + { + "begin": 2046, + "end": 2071, + "name": "DUP5", + "source": 19 + }, + { + "begin": 2046, + "end": 2071, + "name": "ADD", + "source": 19 + }, + { + "begin": 2033, + "end": 2072, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 2088, + "end": 2091, + "name": "PUSH", + "source": 19, + "value": "F8" + }, + { + "begin": 2084, + "end": 2098, + "name": "DUP2", + "source": 19 + }, + { + "begin": 2084, + "end": 2098, + "name": "SWAP1", + "source": 19 + }, + { + "begin": 2084, + "end": 2098, + "name": "SHR", + "source": 19 + }, + { + "begin": 2084, + "end": 2098, + "name": "SWAP1", + "source": 19 + }, + { + "begin": 2118, + "end": 2120, + "name": "PUSH", + "source": 19, + "value": "58" + }, + { + "begin": 2114, + "end": 2127, + "name": "SHR", + "source": 19 + }, + { + "begin": 2129, + "end": 2171, + "name": "PUSH", + "source": 19, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 2110, + "end": 2172, + "name": "AND", + "source": 19 + }, + { + "begin": 2205, + "end": 2207, + "name": "PUSH", + "source": 19, + "value": "15" + }, + { + "begin": 2193, + "end": 2208, + "name": "DUP7", + "source": 19 + }, + { + "begin": 2193, + "end": 2208, + "name": "ADD", + "source": 19 + }, + { + "begin": 5146, + "end": 5210, + "name": "SWAP6", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5146, + "end": 5210, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 5146, + "end": 5210, + "name": "SWAP3", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5146, + "end": 5210, + "name": "SWAP1", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5256, + "end": 5268, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP9", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP6", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "ADD", + "source": 19 + }, + { + "begin": 3277, + "end": 3316, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 3336, + "end": 3339, + "name": "PUSH", + "source": 19, + "value": "E8" + }, + { + "begin": 3332, + "end": 3346, + "name": "SHR", + "source": 19 + }, + { + "begin": 3390, + "end": 3391, + "name": "PUSH", + "source": 19, + "value": "3" + }, + { + "begin": 3378, + "end": 3392, + "name": "DUP7", + "source": 19 + }, + { + "begin": 3378, + "end": 3392, + "name": "ADD", + "source": 19 + }, + { + "begin": 5280, + "end": 5326, + "name": "DUP2", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "PUSH", + "source": 13, + "value": "FFFFFF" + }, + { + "begin": 5280, + "end": 5326, + "name": "AND", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "POP", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "DUP1", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "SWAP7", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "POP", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "DUP2", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "SWAP3", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "POP", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "POP", + "source": 13 + }, + { + "begin": 5280, + "end": 5326, + "name": "POP", + "source": 13 + }, + { + "begin": 5380, + "end": 5395, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 5407, + "end": 5411, + "name": "DUP2", + "source": 13 + }, + { + "begin": 5398, + "end": 5404, + "name": "DUP7", + "source": 13 + }, + { + "begin": 5398, + "end": 5411, + "name": "ADD", + "source": 13 + }, + { + "begin": 5380, + "end": 5411, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 5380, + "end": 5411, + "name": "POP", + "source": 13 + }, + { + "begin": 5428, + "end": 5509, + "name": "PUSH [tag]", + "source": 13, + "value": "272" + }, + { + "begin": 5464, + "end": 5474, + "name": "DUP12", + "source": 13 + }, + { + "begin": 5476, + "end": 5480, + "name": "DUP5", + "source": 13 + }, + { + "begin": 5482, + "end": 5492, + "name": "DUP13", + "source": 13 + }, + { + "begin": 5482, + "end": 5492, + "name": "DUP13", + "source": 13 + }, + { + "begin": 5493, + "end": 5499, + "name": "DUP11", + "source": 13 + }, + { + "begin": 5482, + "end": 5508, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 5500, + "end": 5507, + "name": "DUP7", + "source": 13 + }, + { + "begin": 5482, + "end": 5508, + "name": "SWAP3", + "source": 13 + }, + { + "begin": 5482, + "end": 5508, + "name": "PUSH [tag]", + "source": 13, + "value": "273" + }, + { + "begin": 5482, + "end": 5508, + "name": "SWAP4", + "source": 13 + }, + { + "begin": 5482, + "end": 5508, + "name": "SWAP3", + "source": 13 + }, + { + "begin": 5482, + "end": 5508, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 5482, + "end": 5508, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 5482, + "end": 5508, + "name": "PUSH [tag]", + "source": 13, + "value": "193" + }, + { + "begin": 5482, + "end": 5508, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 5482, + "end": 5508, + "name": "tag", + "source": 13, + "value": "273" + }, + { + "begin": 5482, + "end": 5508, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 5428, + "end": 5463, + "name": "PUSH [tag]", + "source": 13, + "value": "274" + }, + { + "begin": 5428, + "end": 5509, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 5428, + "end": 5509, + "name": "tag", + "source": 13, + "value": "272" + }, + { + "begin": 5428, + "end": 5509, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 5423, + "end": 5613, + "name": "PUSH [tag]", + "source": 13, + "value": "275" + }, + { + "begin": 5423, + "end": 5613, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 5555, + "end": 5565, + "name": "DUP11", + "source": 13 + }, + { + "begin": 5567, + "end": 5571, + "name": "DUP4", + "source": 13 + }, + { + "begin": 5573, + "end": 5599, + "name": "PUSH [tag]", + "source": 13, + "value": "276" + }, + { + "begin": 5591, + "end": 5598, + "name": "DUP4", + "source": 13 + }, + { + "begin": 5584, + "end": 5590, + "name": "DUP10", + "source": 13 + }, + { + "begin": 5573, + "end": 5583, + "name": "DUP14", + "source": 13 + }, + { + "begin": 5573, + "end": 5583, + "name": "DUP16", + "source": 13 + }, + { + "begin": 5573, + "end": 5599, + "name": "PUSH [tag]", + "source": 13, + "value": "193" + }, + { + "begin": 5573, + "end": 5599, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 5573, + "end": 5599, + "name": "tag", + "source": 13, + "value": "276" + }, + { + "begin": 5573, + "end": 5599, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "PUSH", + "source": 13, + "value": "40" + }, + { + "begin": 5532, + "end": 5600, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "PUSH", + "source": 13, + "value": "9A94623200000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 5532, + "end": 5600, + "name": "DUP2", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "PUSH", + "source": 13, + "value": "4" + }, + { + "begin": 5532, + "end": 5600, + "name": "ADD", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "PUSH [tag]", + "source": 13, + "value": "93" + }, + { + "begin": 5532, + "end": 5600, + "name": "SWAP5", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "SWAP4", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "SWAP3", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 5532, + "end": 5600, + "name": "PUSH [tag]", + "source": 13, + "value": "278" + }, + { + "begin": 5532, + "end": 5600, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 5423, + "end": 5613, + "name": "tag", + "source": 13, + "value": "275" + }, + { + "begin": 5423, + "end": 5613, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 5706, + "end": 5726, + "name": "PUSH", + "source": 13, + "value": "FF" + }, + { + "begin": 5706, + "end": 5726, + "name": "DUP5", + "source": 13 + }, + { + "begin": 5706, + "end": 5726, + "name": "AND", + "source": 13 + }, + { + "begin": 5706, + "end": 5726, + "name": "SWAP8", + "source": 13 + }, + { + "begin": 5706, + "end": 5726, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 5706, + "end": 5726, + "name": "SWAP8", + "source": 13 + }, + { + "begin": 5706, + "end": 5726, + "name": "ADD", + "source": 13 + }, + { + "begin": 5706, + "end": 5726, + "name": "SWAP7", + "source": 13 + }, + { + "begin": 5706, + "end": 5726, + "name": "SWAP5", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5706, + "end": 5726, + "name": "DUP5", + "source": 13 + }, + { + "begin": 1893, + "end": 1896, + "name": "PUSH", + "source": 13, + "value": "A0" + }, + { + "begin": 1873, + "end": 1896, + "name": "DUP5", + "source": 13 + }, + { + "begin": 1873, + "end": 1896, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 1873, + "end": 1896, + "name": "SHL", + "source": 13 + }, + { + "begin": 1873, + "end": 1896, + "name": "PUSH", + "source": 13, + "value": "FF0000000000000000000000000000000000000000" + }, + { + "begin": 1873, + "end": 1896, + "name": "AND", + "source": 13 + }, + { + "begin": 1899, + "end": 1922, + "name": "PUSH", + "source": 13, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1899, + "end": 1922, + "name": "DUP5", + "source": 13 + }, + { + "begin": 1899, + "end": 1922, + "name": "AND", + "source": 13 + }, + { + "begin": 1873, + "end": 1922, + "name": "OR", + "source": 13 + }, + { + "begin": 5862, + "end": 5866, + "name": "DUP8", + "source": 13 + }, + { + "begin": 5862, + "end": 5921, + "name": "PUSH [tag]", + "source": 13, + "value": "280" + }, + { + "begin": 5862, + "end": 5921, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 5917, + "end": 5921, + "name": "DUP1", + "source": 13 + }, + { + "begin": 5862, + "end": 5921, + "name": "PUSH [tag]", + "source": 13, + "value": "282" + }, + { + "begin": 5862, + "end": 5921, + "name": "JUMP", + "source": 13 + }, + { + "begin": 5862, + "end": 5921, + "name": "tag", + "source": 13, + "value": "280" + }, + { + "begin": 5862, + "end": 5921, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 622, + "end": 631, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "DUP9", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP2", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "DUP3", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 5883, + "end": 5914, + "name": "tag", + "source": 13, + "value": "282" + }, + { + "begin": 5883, + "end": 5914, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 5855, + "end": 5921, + "name": "SWAP8", + "source": 13 + }, + { + "begin": 5855, + "end": 5921, + "name": "POP", + "source": 13 + }, + { + "begin": 5933, + "end": 5941, + "name": "POP", + "source": 13 + }, + { + "begin": 5933, + "end": 5941, + "name": "POP", + "source": 13 + }, + { + "begin": 5933, + "end": 5941, + "name": "POP", + "source": 13 + }, + { + "begin": 5933, + "end": 5941, + "name": "POP", + "source": 13 + }, + { + "begin": 5933, + "end": 5941, + "name": "POP", + "source": 13 + }, + { + "begin": 5933, + "end": 5941, + "name": "POP", + "source": 13 + }, + { + "begin": 5933, + "end": 5941, + "name": "PUSH [tag]", + "source": 13, + "value": "248" + }, + { + "begin": 5933, + "end": 5941, + "name": "JUMP", + "source": 13 + }, + { + "begin": 5020, + "end": 5952, + "name": "tag", + "source": 13, + "value": "269" + }, + { + "begin": 5020, + "end": 5952, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 667, + "end": 668, + "name": "PUSH", + "source": 13, + "value": "3" + }, + { + "begin": 5966, + "end": 5970, + "name": "DUP2", + "source": 13 + }, + { + "begin": 5966, + "end": 5983, + "name": "SUB", + "source": 13 + }, + { + "begin": 5962, + "end": 6205, + "name": "PUSH [tag]", + "source": 13, + "value": "283" + }, + { + "begin": 5962, + "end": 6205, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 4550, + "end": 4552, + "name": "PUSH", + "source": 19, + "value": "20" + }, + { + "begin": 4536, + "end": 4553, + "name": "DUP3", + "source": 19 + }, + { + "begin": 4536, + "end": 4553, + "name": "ADD", + "source": 19 + }, + { + "begin": 4536, + "end": 4553, + "name": "SWAP2", + "source": 19 + }, + { + "begin": 4487, + "end": 4514, + "name": "DUP7", + "source": 19 + }, + { + "begin": 4487, + "end": 4514, + "name": "ADD", + "source": 19 + }, + { + "begin": 4474, + "end": 4515, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 6115, + "end": 6119, + "name": "DUP4", + "source": 13 + }, + { + "begin": 6115, + "end": 6174, + "name": "PUSH [tag]", + "source": 13, + "value": "286" + }, + { + "begin": 6115, + "end": 6174, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 6170, + "end": 6174, + "name": "DUP1", + "source": 13 + }, + { + "begin": 6115, + "end": 6174, + "name": "PUSH [tag]", + "source": 13, + "value": "288" + }, + { + "begin": 6115, + "end": 6174, + "name": "JUMP", + "source": 13 + }, + { + "begin": 6115, + "end": 6174, + "name": "tag", + "source": 13, + "value": "286" + }, + { + "begin": 6115, + "end": 6174, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 622, + "end": 631, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "DUP5", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP2", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "DUP3", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 6136, + "end": 6167, + "name": "tag", + "source": 13, + "value": "288" + }, + { + "begin": 6136, + "end": 6167, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 6108, + "end": 6174, + "name": "SWAP4", + "source": 13 + }, + { + "begin": 6108, + "end": 6174, + "name": "POP", + "source": 13 + }, + { + "begin": 6186, + "end": 6194, + "name": "POP", + "source": 13 + }, + { + "begin": 6186, + "end": 6194, + "name": "POP", + "source": 13 + }, + { + "begin": 6186, + "end": 6194, + "name": "PUSH [tag]", + "source": 13, + "value": "248" + }, + { + "begin": 6186, + "end": 6194, + "name": "JUMP", + "source": 13 + }, + { + "begin": 5962, + "end": 6205, + "name": "tag", + "source": 13, + "value": "283" + }, + { + "begin": 5962, + "end": 6205, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 711, + "end": 712, + "name": "PUSH", + "source": 13, + "value": "4" + }, + { + "begin": 6219, + "end": 6223, + "name": "DUP2", + "source": 13 + }, + { + "begin": 6219, + "end": 6238, + "name": "SUB", + "source": 13 + }, + { + "begin": 6215, + "end": 6687, + "name": "PUSH [tag]", + "source": 13, + "value": "289" + }, + { + "begin": 6215, + "end": 6687, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 3390, + "end": 3391, + "name": "PUSH", + "source": 19, + "value": "3" + }, + { + "begin": 3378, + "end": 3392, + "name": "DUP1", + "source": 19 + }, + { + "begin": 3378, + "end": 3392, + "name": "DUP4", + "source": 19 + }, + { + "begin": 3378, + "end": 3392, + "name": "ADD", + "source": 19 + }, + { + "begin": 3378, + "end": 3392, + "name": "SWAP3", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP8", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP2", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "ADD", + "source": 19 + }, + { + "begin": 3277, + "end": 3316, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 3336, + "end": 3339, + "name": "PUSH", + "source": 19, + "value": "E8" + }, + { + "begin": 3332, + "end": 3346, + "name": "SHR", + "source": 19 + }, + { + "begin": 3332, + "end": 3346, + "name": "SWAP2", + "source": 19 + }, + { + "begin": 6409, + "end": 6422, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 6409, + "end": 6422, + "name": "DUP3", + "source": 13 + }, + { + "begin": 6409, + "end": 6422, + "name": "ADD", + "source": 13 + }, + { + "begin": 6409, + "end": 6422, + "name": "ADD", + "source": 13 + }, + { + "begin": 6309, + "end": 6321, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 6309, + "end": 6321, + "name": "DUP1", + "source": 13 + }, + { + "begin": 6494, + "end": 6547, + "name": "PUSH [tag]", + "source": 13, + "value": "291" + }, + { + "begin": 6508, + "end": 6518, + "name": "DUP12", + "source": 13 + }, + { + "begin": 6520, + "end": 6546, + "name": "PUSH [tag]", + "source": 13, + "value": "192" + }, + { + "begin": 6409, + "end": 6422, + "name": "DUP6", + "source": 13 + }, + { + "begin": 3378, + "end": 3392, + "name": "DUP10", + "source": 19 + }, + { + "begin": 6520, + "end": 6530, + "name": "DUP14", + "source": 13 + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP16", + "source": 19 + }, + { + "begin": 6520, + "end": 6546, + "name": "PUSH [tag]", + "source": 13, + "value": "193" + }, + { + "begin": 6520, + "end": 6546, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 6494, + "end": 6547, + "name": "tag", + "source": 13, + "value": "291" + }, + { + "begin": 6494, + "end": 6547, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 622, + "end": 631, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "SWAP9", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP10", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "SWAP8", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 6560, + "end": 6577, + "name": "SWAP7", + "source": 13 + }, + { + "begin": 6560, + "end": 6577, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 6560, + "end": 6577, + "name": "SWAP8", + "source": 13 + }, + { + "begin": 6560, + "end": 6577, + "name": "ADD", + "source": 13 + }, + { + "begin": 6560, + "end": 6577, + "name": "SWAP7", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6649, + "end": 6656, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 6649, + "end": 6656, + "name": "SWAP4", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6668, + "end": 6676, + "name": "PUSH [tag]", + "source": 13, + "value": "248" + }, + { + "begin": 6668, + "end": 6676, + "name": "SWAP3", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6668, + "end": 6676, + "name": "JUMP", + "source": 13 + }, + { + "begin": 6215, + "end": 6687, + "name": "tag", + "source": 13, + "value": "289" + }, + { + "begin": 6215, + "end": 6687, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 802, + "end": 803, + "name": "PUSH", + "source": 13, + "value": "6" + }, + { + "begin": 6701, + "end": 6705, + "name": "DUP2", + "source": 13 + }, + { + "begin": 6701, + "end": 6720, + "name": "SUB", + "source": 13 + }, + { + "begin": 6697, + "end": 7676, + "name": "PUSH [tag]", + "source": 13, + "value": "294" + }, + { + "begin": 6697, + "end": 7676, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 6864, + "end": 6886, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 1390, + "end": 1415, + "name": "DUP3", + "source": 19 + }, + { + "begin": 1390, + "end": 1415, + "name": "DUP8", + "source": 19 + }, + { + "begin": 1390, + "end": 1415, + "name": "ADD", + "source": 19 + }, + { + "begin": 1377, + "end": 1416, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 1432, + "end": 1435, + "name": "PUSH", + "source": 19, + "value": "F8" + }, + { + "begin": 1428, + "end": 1442, + "name": "SHR", + "source": 19 + }, + { + "begin": 1475, + "end": 1476, + "name": "PUSH", + "source": 19, + "value": "1" + }, + { + "begin": 1463, + "end": 1477, + "name": "DUP5", + "source": 19 + }, + { + "begin": 1463, + "end": 1477, + "name": "ADD", + "source": 19 + }, + { + "begin": 6898, + "end": 6953, + "name": "SWAP4", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6898, + "end": 6953, + "name": "PUSH", + "source": 13, + "value": "FF" + }, + { + "begin": 6898, + "end": 6953, + "name": "AND", + "source": 13 + }, + { + "begin": 6898, + "end": 6953, + "name": "SWAP1", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6966, + "end": 6991, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 2699, + "end": 2724, + "name": "DUP8", + "source": 19 + }, + { + "begin": 2699, + "end": 2724, + "name": "DUP5", + "source": 19 + }, + { + "begin": 2699, + "end": 2724, + "name": "ADD", + "source": 19 + }, + { + "begin": 2686, + "end": 2725, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 2745, + "end": 2748, + "name": "PUSH", + "source": 19, + "value": "F0" + }, + { + "begin": 2741, + "end": 2755, + "name": "SHR", + "source": 19 + }, + { + "begin": 2797, + "end": 2798, + "name": "PUSH", + "source": 19, + "value": "2" + }, + { + "begin": 2785, + "end": 2799, + "name": "DUP6", + "source": 19 + }, + { + "begin": 2785, + "end": 2799, + "name": "ADD", + "source": 19 + }, + { + "begin": 7003, + "end": 7062, + "name": "SWAP5", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 7003, + "end": 7062, + "name": "PUSH", + "source": 13, + "value": "FFFF" + }, + { + "begin": 7003, + "end": 7062, + "name": "AND", + "source": 13 + }, + { + "begin": 7003, + "end": 7062, + "name": "SWAP1", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 7075, + "end": 7087, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP9", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "DUP6", + "source": 19 + }, + { + "begin": 3290, + "end": 3315, + "name": "ADD", + "source": 19 + }, + { + "begin": 3277, + "end": 3316, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 3336, + "end": 3339, + "name": "PUSH", + "source": 19, + "value": "E8" + }, + { + "begin": 3332, + "end": 3346, + "name": "SHR", + "source": 19 + }, + { + "begin": 3390, + "end": 3391, + "name": "PUSH", + "source": 19, + "value": "3" + }, + { + "begin": 3378, + "end": 3392, + "name": "DUP7", + "source": 19 + }, + { + "begin": 3378, + "end": 3392, + "name": "ADD", + "source": 19 + }, + { + "begin": 7099, + "end": 7145, + "name": "DUP2", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "PUSH", + "source": 13, + "value": "FFFFFF" + }, + { + "begin": 7099, + "end": 7145, + "name": "AND", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "POP", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "DUP1", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "SWAP7", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "POP", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "DUP2", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "SWAP3", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "POP", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "POP", + "source": 13 + }, + { + "begin": 7099, + "end": 7145, + "name": "POP", + "source": 13 + }, + { + "begin": 7157, + "end": 7172, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 7184, + "end": 7188, + "name": "DUP2", + "source": 13 + }, + { + "begin": 7175, + "end": 7181, + "name": "DUP7", + "source": 13 + }, + { + "begin": 7175, + "end": 7188, + "name": "ADD", + "source": 13 + }, + { + "begin": 7157, + "end": 7188, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 7157, + "end": 7188, + "name": "POP", + "source": 13 + }, + { + "begin": 7201, + "end": 7223, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 7225, + "end": 7245, + "name": "DUP1", + "source": 13 + }, + { + "begin": 7290, + "end": 7343, + "name": "PUSH [tag]", + "source": 13, + "value": "299" + }, + { + "begin": 7304, + "end": 7314, + "name": "DUP14", + "source": 13 + }, + { + "begin": 7316, + "end": 7326, + "name": "DUP14", + "source": 13 + }, + { + "begin": 7316, + "end": 7326, + "name": "DUP14", + "source": 13 + }, + { + "begin": 7327, + "end": 7333, + "name": "DUP12", + "source": 13 + }, + { + "begin": 7316, + "end": 7342, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 7334, + "end": 7341, + "name": "DUP8", + "source": 13 + }, + { + "begin": 7316, + "end": 7342, + "name": "SWAP3", + "source": 13 + }, + { + "begin": 7316, + "end": 7342, + "name": "PUSH [tag]", + "source": 13, + "value": "192" + }, + { + "begin": 7316, + "end": 7342, + "name": "SWAP4", + "source": 13 + }, + { + "begin": 7316, + "end": 7342, + "name": "SWAP3", + "source": 13 + }, + { + "begin": 7316, + "end": 7342, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 7316, + "end": 7342, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 7316, + "end": 7342, + "name": "PUSH [tag]", + "source": 13, + "value": "193" + }, + { + "begin": 7316, + "end": 7342, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 7290, + "end": 7343, + "name": "tag", + "source": 13, + "value": "299" + }, + { + "begin": 7290, + "end": 7343, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 7364, + "end": 7371, + "name": "SWAP4", + "source": 13 + }, + { + "begin": 7364, + "end": 7371, + "name": "SWAP9", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 7364, + "end": 7371, + "name": "DUP9", + "source": 13 + }, + { + "begin": 7364, + "end": 7371, + "name": "SWAP4", + "source": 13 + }, + { + "begin": 7257, + "end": 7343, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 7257, + "end": 7343, + "name": "SWAP3", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 7257, + "end": 7343, + "name": "SWAP1", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 7388, + "end": 7423, + "name": "DUP5", + "source": 13 + }, + { + "begin": 7388, + "end": 7423, + "name": "DUP3", + "source": 13 + }, + { + "begin": 7388, + "end": 7423, + "name": "LT", + "source": 13 + }, + { + "begin": 7384, + "end": 7476, + "name": "PUSH [tag]", + "source": 13, + "value": "301" + }, + { + "begin": 7384, + "end": 7476, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 7439, + "end": 7463, + "name": "SWAP9", + "source": 13 + }, + { + "begin": 7439, + "end": 7463, + "name": "DUP6", + "source": 13 + }, + { + "begin": 7439, + "end": 7463, + "name": "ADD", + "source": 13 + }, + { + "begin": 7439, + "end": 7463, + "name": "SWAP9", + "source": 13 + }, + { + "begin": 7384, + "end": 7476, + "name": "tag", + "source": 13, + "value": "301" + }, + { + "begin": 7384, + "end": 7476, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "PUSH", + "source": 13, + "value": "40" + }, + { + "begin": 2976, + "end": 3049, + "name": "DUP1", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 20362, + "end": 20428, + "name": "PUSH", + "source": 22, + "value": "53657175656E6365206E657374656420636F6E6669673A0A0000000000000000" + }, + { + "begin": 2976, + "end": 3049, + "name": "PUSH", + "source": 13, + "value": "20" + }, + { + "begin": 2976, + "end": 3049, + "name": "DUP1", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "DUP4", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "ADD", + "source": 13 + }, + { + "begin": 20350, + "end": 20429, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 20350, + "end": 20429, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 20350, + "end": 20429, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 20350, + "end": 20429, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 20445, + "end": 20457, + "name": "PUSH", + "source": 22, + "value": "38" + }, + { + "begin": 20445, + "end": 20457, + "name": "DUP3", + "source": 22 + }, + { + "begin": 20445, + "end": 20457, + "name": "ADD", + "source": 22 + }, + { + "begin": 20438, + "end": 20466, + "name": "DUP5", + "source": 22 + }, + { + "begin": 20438, + "end": 20466, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 20438, + "end": 20466, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 20482, + "end": 20494, + "name": "PUSH", + "source": 22, + "value": "58" + }, + { + "begin": 20482, + "end": 20494, + "name": "DUP3", + "source": 22 + }, + { + "begin": 20482, + "end": 20494, + "name": "ADD", + "source": 22 + }, + { + "begin": 20475, + "end": 20503, + "name": "DUP9", + "source": 22 + }, + { + "begin": 20475, + "end": 20503, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 20475, + "end": 20503, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 20519, + "end": 20531, + "name": "PUSH", + "source": 22, + "value": "78" + }, + { + "begin": 20519, + "end": 20531, + "name": "DUP1", + "source": 22 + }, + { + "begin": 20519, + "end": 20531, + "name": "DUP4", + "source": 22 + }, + { + "begin": 20519, + "end": 20531, + "name": "ADD", + "source": 22 + }, + { + "begin": 20512, + "end": 20540, + "name": "DUP11", + "source": 22 + }, + { + "begin": 20512, + "end": 20540, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 20512, + "end": 20540, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2976, + "end": 3049, + "name": "DUP4", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "DUP1", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "DUP5", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "SUB", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "ADD", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "DUP2", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 20556, + "end": 20569, + "name": "PUSH", + "source": 22, + "value": "98" + }, + { + "begin": 20556, + "end": 20569, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 20556, + "end": 20569, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 20556, + "end": 20569, + "name": "ADD", + "source": 22 + }, + { + "begin": 2976, + "end": 3049, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "SWAP3", + "source": 13 + }, + { + "begin": 2976, + "end": 3049, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 2966, + "end": 3050, + "name": "DUP1", + "source": 13 + }, + { + "begin": 2966, + "end": 3050, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 2966, + "end": 3050, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 2966, + "end": 3050, + "name": "ADD", + "source": 13 + }, + { + "begin": 2966, + "end": 3050, + "name": "KECCAK256", + "source": 13 + }, + { + "begin": 7585, + "end": 7589, + "name": "DUP10", + "source": 13 + }, + { + "begin": 7585, + "end": 7644, + "name": "PUSH [tag]", + "source": 13, + "value": "304" + }, + { + "begin": 7585, + "end": 7644, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 7640, + "end": 7644, + "name": "DUP1", + "source": 13 + }, + { + "begin": 7585, + "end": 7644, + "name": "PUSH [tag]", + "source": 13, + "value": "306" + }, + { + "begin": 7585, + "end": 7644, + "name": "JUMP", + "source": 13 + }, + { + "begin": 7585, + "end": 7644, + "name": "tag", + "source": 13, + "value": "304" + }, + { + "begin": 7585, + "end": 7644, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 622, + "end": 631, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "DUP11", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP2", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "DUP3", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 7606, + "end": 7637, + "name": "tag", + "source": 13, + "value": "306" + }, + { + "begin": 7606, + "end": 7637, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 7578, + "end": 7644, + "name": "SWAP10", + "source": 13 + }, + { + "begin": 7578, + "end": 7644, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "POP", + "source": 13 + }, + { + "begin": 7657, + "end": 7665, + "name": "PUSH [tag]", + "source": 13, + "value": "248" + }, + { + "begin": 7657, + "end": 7665, + "name": "JUMP", + "source": 13 + }, + { + "begin": 6697, + "end": 7676, + "name": "tag", + "source": 13, + "value": "294" + }, + { + "begin": 6697, + "end": 7676, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 758, + "end": 759, + "name": "PUSH", + "source": 13, + "value": "5" + }, + { + "begin": 7690, + "end": 7694, + "name": "DUP2", + "source": 13 + }, + { + "begin": 7690, + "end": 7712, + "name": "SUB", + "source": 13 + }, + { + "begin": 7686, + "end": 8171, + "name": "PUSH [tag]", + "source": 13, + "value": "307" + }, + { + "begin": 7686, + "end": 8171, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 4550, + "end": 4552, + "name": "PUSH", + "source": 19, + "value": "20" + }, + { + "begin": 4536, + "end": 4553, + "name": "DUP3", + "source": 19 + }, + { + "begin": 4536, + "end": 4553, + "name": "ADD", + "source": 19 + }, + { + "begin": 4536, + "end": 4553, + "name": "SWAP2", + "source": 19 + }, + { + "begin": 4487, + "end": 4514, + "name": "DUP7", + "source": 19 + }, + { + "begin": 4487, + "end": 4514, + "name": "ADD", + "source": 19 + }, + { + "begin": 4474, + "end": 4515, + "name": "CALLDATALOAD", + "source": 19 + }, + { + "begin": 7920, + "end": 7943, + "name": "DUP8", + "source": 13 + }, + { + "begin": 7920, + "end": 7943, + "name": "DUP2", + "source": 13 + }, + { + "begin": 7920, + "end": 7943, + "name": "SUB", + "source": 13 + }, + { + "begin": 7916, + "end": 7998, + "name": "PUSH [tag]", + "source": 13, + "value": "309" + }, + { + "begin": 7916, + "end": 7998, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 7968, + "end": 7985, + "name": "PUSH", + "source": 13, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 7959, + "end": 7985, + "name": "SWAP5", + "source": 13 + }, + { + "begin": 7959, + "end": 7985, + "name": "POP", + "source": 13 + }, + { + "begin": 7916, + "end": 7998, + "name": "tag", + "source": 13, + "value": "309" + }, + { + "begin": 7916, + "end": 7998, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 8010, + "end": 8022, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 8025, + "end": 8062, + "name": "PUSH [tag]", + "source": 13, + "value": "310" + }, + { + "begin": 8052, + "end": 8061, + "name": "DUP3", + "source": 13 + }, + { + "begin": 8025, + "end": 8051, + "name": "PUSH [tag]", + "source": 13, + "value": "311" + }, + { + "begin": 8025, + "end": 8062, + "jumpType": "[in]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 8025, + "end": 8062, + "name": "tag", + "source": 13, + "value": "310" + }, + { + "begin": 8025, + "end": 8062, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 8010, + "end": 8062, + "name": "SWAP1", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 8081, + "end": 8085, + "name": "DUP5", + "source": 13 + }, + { + "begin": 8081, + "end": 8140, + "name": "PUSH [tag]", + "source": 13, + "value": "312" + }, + { + "begin": 8081, + "end": 8140, + "name": "JUMPI", + "source": 13 + }, + { + "begin": 8136, + "end": 8140, + "name": "DUP1", + "source": 13 + }, + { + "begin": 8081, + "end": 8140, + "name": "PUSH [tag]", + "source": 13, + "value": "314" + }, + { + "begin": 8081, + "end": 8140, + "name": "JUMP", + "source": 13 + }, + { + "begin": 8081, + "end": 8140, + "name": "tag", + "source": 13, + "value": "312" + }, + { + "begin": 8081, + "end": 8140, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 622, + "end": 631, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "DUP6", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP2", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "DUP3", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 8102, + "end": 8133, + "name": "tag", + "source": 13, + "value": "314" + }, + { + "begin": 8102, + "end": 8133, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 8074, + "end": 8140, + "name": "SWAP5", + "source": 13 + }, + { + "begin": 8074, + "end": 8140, + "name": "POP", + "source": 13 + }, + { + "begin": 8152, + "end": 8160, + "name": "POP", + "source": 13 + }, + { + "begin": 8152, + "end": 8160, + "name": "POP", + "source": 13 + }, + { + "begin": 8152, + "end": 8160, + "name": "POP", + "source": 13 + }, + { + "begin": 8152, + "end": 8160, + "name": "PUSH [tag]", + "source": 13, + "value": "248" + }, + { + "begin": 8152, + "end": 8160, + "name": "JUMP", + "source": 13 + }, + { + "begin": 7686, + "end": 8171, + "name": "tag", + "source": 13, + "value": "307" + }, + { + "begin": 7686, + "end": 8171, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 8188, + "end": 8214, + "name": "PUSH", + "source": 13, + "value": "40" + }, + { + "begin": 8188, + "end": 8214, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 8188, + "end": 8214, + "name": "PUSH", + "source": 13, + "value": "B2505F7C00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 8188, + "end": 8214, + "name": "DUP2", + "source": 13 + }, + { + "begin": 8188, + "end": 8214, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 8188, + "end": 8214, + "name": "PUSH", + "source": 13, + "value": "4" + }, + { + "begin": 8188, + "end": 8214, + "name": "DUP2", + "source": 13 + }, + { + "begin": 8188, + "end": 8214, + "name": "ADD", + "source": 13 + }, + { + "begin": 2778, + "end": 2803, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2778, + "end": 2803, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 2778, + "end": 2803, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2751, + "end": 2769, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 2751, + "end": 2769, + "name": "ADD", + "source": 22 + }, + { + "begin": 8188, + "end": 8214, + "name": "PUSH [tag]", + "source": 13, + "value": "93" + }, + { + "begin": 2632, + "end": 2809, + "name": "JUMP", + "source": 22 + }, + { + "begin": 3765, + "end": 8223, + "name": "tag", + "source": 13, + "value": "249" + }, + { + "begin": 3765, + "end": 8223, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 3678, + "end": 8229, + "name": "POP", + "source": 13 + }, + { + "begin": 3525, + "end": 8233, + "name": "SWAP4", + "source": 13 + }, + { + "begin": 3525, + "end": 8233, + "name": "POP", + "source": 13 + }, + { + "begin": 3525, + "end": 8233, + "name": "SWAP4", + "source": 13 + }, + { + "begin": 3525, + "end": 8233, + "name": "SWAP2", + "source": 13 + }, + { + "begin": 3525, + "end": 8233, + "name": "POP", + "source": 13 + }, + { + "begin": 3525, + "end": 8233, + "name": "POP", + "source": 13 + }, + { + "begin": 3525, + "end": 8233, + "jumpType": "[out]", + "name": "JUMP", + "source": 13 + }, + { + "begin": 1296, + "end": 1456, + "name": "tag", + "source": 14, + "value": "224" + }, + { + "begin": 1296, + "end": 1456, + "name": "JUMPDEST", + "source": 14 + }, + { + "begin": 862, + "end": 906, + "name": "PUSH", + "source": 14, + "value": "8713A7C4465F6FBEE2B6E9D6646D1D9F83FEC929EDFC4BAF661F3C865BDD04D1" + }, + { + "begin": 1372, + "end": 1379, + "name": "PUSH", + "source": 14, + "value": "0" + }, + { + "begin": 656, + "end": 669, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "DUP2", + "source": 20 + }, + { + "begin": 656, + "end": 669, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 683, + "end": 685, + "name": "PUSH", + "source": 20, + "value": "20" + }, + { + "begin": 676, + "end": 690, + "name": "DUP3", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "SWAP1", + "source": 20 + }, + { + "begin": 676, + "end": 690, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 715, + "end": 717, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 702, + "end": 718, + "name": "DUP2", + "source": 20 + }, + { + "begin": 702, + "end": 718, + "name": "KECCAK256", + "source": 20 + }, + { + "begin": 1394, + "end": 1451, + "name": "PUSH [tag]", + "source": 14, + "value": "80" + }, + { + "begin": 543, + "end": 728, + "name": "JUMP", + "source": 20 + }, + { + "begin": 6015, + "end": 6315, + "name": "tag", + "source": 2, + "value": "238" + }, + { + "begin": 6015, + "end": 6315, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 6101, + "end": 6105, + "name": "PUSH", + "source": 2, + "value": "0" + }, + { + "begin": 6124, + "end": 6169, + "name": "PUSH", + "source": 2, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 6124, + "end": 6169, + "name": "DUP3", + "source": 2 + }, + { + "begin": 6124, + "end": 6169, + "name": "AND", + "source": 2 + }, + { + "begin": 6140, + "end": 6169, + "name": "PUSH", + "source": 2, + "value": "AC6A444E00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 6124, + "end": 6169, + "name": "EQ", + "source": 2 + }, + { + "begin": 6124, + "end": 6169, + "name": "DUP1", + "source": 2 + }, + { + "begin": 6124, + "end": 6227, + "name": "PUSH [tag]", + "source": 2, + "value": "323" + }, + { + "begin": 6124, + "end": 6227, + "name": "JUMPI", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6179, + "end": 6227, + "name": "PUSH", + "source": 2, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 6179, + "end": 6227, + "name": "DUP3", + "source": 2 + }, + { + "begin": 6179, + "end": 6227, + "name": "AND", + "source": 2 + }, + { + "begin": 6195, + "end": 6227, + "name": "PUSH", + "source": 2, + "value": "36E7817500000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 6179, + "end": 6227, + "name": "EQ", + "source": 2 + }, + { + "begin": 6124, + "end": 6227, + "name": "tag", + "source": 2, + "value": "323" + }, + { + "begin": 6124, + "end": 6227, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 6113, + "end": 6260, + "name": "ISZERO", + "source": 2 + }, + { + "begin": 6113, + "end": 6260, + "name": "PUSH [tag]", + "source": 2, + "value": "324" + }, + { + "begin": 6113, + "end": 6260, + "name": "JUMPI", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6249, + "end": 6253, + "name": "PUSH", + "source": 2, + "value": "1" + }, + { + "begin": 6249, + "end": 6253, + "name": "SWAP2", + "source": 2 + }, + { + "begin": 6015, + "end": 6315, + "name": "SWAP1", + "source": 2 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6015, + "end": 6315, + "jumpType": "[out]", + "name": "JUMP", + "source": 2 + }, + { + "begin": 6113, + "end": 6260, + "name": "tag", + "source": 2, + "value": "324" + }, + { + "begin": 6113, + "end": 6260, + "name": "JUMPDEST", + "source": 2 + }, + { + "begin": 725, + "end": 756, + "name": "PUSH", + "source": 5, + "value": "1FFC9A700000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 709, + "end": 756, + "name": "PUSH", + "source": 5, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 709, + "end": 756, + "name": "DUP4", + "source": 5 + }, + { + "begin": 709, + "end": 756, + "name": "AND", + "source": 5 + }, + { + "begin": 709, + "end": 756, + "name": "EQ", + "source": 5 + }, + { + "begin": 6273, + "end": 6310, + "name": "PUSH [tag]", + "source": 2, + "value": "80" + }, + { + "begin": 613, + "end": 761, + "name": "JUMP", + "source": 5 + }, + { + "begin": 1767, + "end": 4083, + "name": "tag", + "source": 21, + "value": "264" + }, + { + "begin": 1767, + "end": 4083, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 1867, + "end": 1881, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 1914, + "end": 1916, + "name": "PUSH", + "source": 21, + "value": "42" + }, + { + "begin": 1893, + "end": 1916, + "name": "DUP3", + "source": 21 + }, + { + "begin": 1893, + "end": 1916, + "name": "EQ", + "source": 21 + }, + { + "begin": 1889, + "end": 1959, + "name": "PUSH [tag]", + "source": 21, + "value": "331" + }, + { + "begin": 1889, + "end": 1959, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 1948, + "end": 1958, + "name": "DUP3", + "source": 21 + }, + { + "begin": 1948, + "end": 1958, + "name": "DUP3", + "source": 21 + }, + { + "begin": 1925, + "end": 1959, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 1925, + "end": 1959, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 1925, + "end": 1959, + "name": "PUSH", + "source": 21, + "value": "2EE17A3D00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1925, + "end": 1959, + "name": "DUP2", + "source": 21 + }, + { + "begin": 1925, + "end": 1959, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 1925, + "end": 1959, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 1925, + "end": 1959, + "name": "ADD", + "source": 21 + }, + { + "begin": 1925, + "end": 1959, + "name": "PUSH [tag]", + "source": 21, + "value": "93" + }, + { + "begin": 1925, + "end": 1959, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 1925, + "end": 1959, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 1925, + "end": 1959, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 1925, + "end": 1959, + "name": "PUSH [tag]", + "source": 21, + "value": "333" + }, + { + "begin": 1925, + "end": 1959, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 1889, + "end": 1959, + "name": "tag", + "source": 21, + "value": "331" + }, + { + "begin": 1889, + "end": 1959, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 1965, + "end": 1986, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 1989, + "end": 2032, + "name": "PUSH [tag]", + "source": 21, + "value": "334" + }, + { + "begin": 2010, + "end": 2031, + "name": "PUSH [tag]", + "source": 21, + "value": "335" + }, + { + "begin": 2030, + "end": 2031, + "name": "PUSH", + "source": 21, + "value": "1" + }, + { + "begin": 2010, + "end": 2020, + "name": "DUP6", + "source": 21 + }, + { + "begin": 2010, + "end": 2031, + "name": "PUSH [tag]", + "source": 21, + "value": "336" + }, + { + "begin": 2010, + "end": 2031, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 2010, + "end": 2031, + "name": "tag", + "source": 21, + "value": "335" + }, + { + "begin": 2010, + "end": 2031, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 1226, + "end": 1249, + "name": "DUP6", + "source": 18 + }, + { + "begin": 1226, + "end": 1249, + "name": "ADD", + "source": 18 + }, + { + "begin": 1213, + "end": 1250, + "name": "CALLDATALOAD", + "source": 18 + }, + { + "begin": 1266, + "end": 1269, + "name": "PUSH", + "source": 18, + "value": "F8" + }, + { + "begin": 1262, + "end": 1276, + "name": "SHR", + "source": 18 + }, + { + "begin": 1262, + "end": 1276, + "name": "SWAP1", + "source": 18 + }, + { + "begin": 1071, + "end": 1286, + "name": "JUMP", + "source": 18 + }, + { + "begin": 1989, + "end": 2032, + "name": "tag", + "source": 21, + "value": "334" + }, + { + "begin": 1989, + "end": 2032, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 1965, + "end": 2032, + "name": "PUSH", + "source": 21, + "value": "FF" + }, + { + "begin": 1965, + "end": 2032, + "name": "AND", + "source": 21 + }, + { + "begin": 1965, + "end": 2032, + "name": "SWAP1", + "source": 21 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2115, + "end": 2117, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 1226, + "end": 1249, + "name": "DUP5", + "source": 18 + }, + { + "begin": 1226, + "end": 1249, + "name": "ADD", + "source": 18 + }, + { + "begin": 1213, + "end": 1250, + "name": "CALLDATALOAD", + "source": 18 + }, + { + "begin": 1266, + "end": 1269, + "name": "PUSH", + "source": 18, + "value": "F8" + }, + { + "begin": 1262, + "end": 1276, + "name": "SHR", + "source": 18 + }, + { + "begin": 795, + "end": 832, + "name": "DUP5", + "source": 18 + }, + { + "begin": 795, + "end": 832, + "name": "CALLDATALOAD", + "source": 18 + }, + { + "begin": 2202, + "end": 2204, + "name": "PUSH", + "source": 21, + "value": "20" + }, + { + "begin": 808, + "end": 831, + "name": "DUP7", + "source": 18 + }, + { + "begin": 808, + "end": 831, + "name": "ADD", + "source": 18 + }, + { + "begin": 795, + "end": 832, + "name": "CALLDATALOAD", + "source": 18 + }, + { + "begin": 3209, + "end": 3275, + "name": "PUSH", + "source": 21, + "value": "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0" + }, + { + "begin": 3196, + "end": 3275, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3196, + "end": 3275, + "name": "GT", + "source": 21 + }, + { + "begin": 3192, + "end": 3327, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 3192, + "end": 3327, + "name": "PUSH [tag]", + "source": 21, + "value": "342" + }, + { + "begin": 3192, + "end": 3327, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 3306, + "end": 3316, + "name": "DUP7", + "source": 21 + }, + { + "begin": 3306, + "end": 3316, + "name": "DUP7", + "source": 21 + }, + { + "begin": 3318, + "end": 3319, + "name": "DUP3", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 3292, + "end": 3320, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "PUSH", + "source": 21, + "value": "AD4AAC7600000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 3292, + "end": 3320, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 3292, + "end": 3320, + "name": "ADD", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "PUSH [tag]", + "source": 21, + "value": "93" + }, + { + "begin": 3292, + "end": 3320, + "name": "SWAP4", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 3292, + "end": 3320, + "name": "PUSH [tag]", + "source": 21, + "value": "344" + }, + { + "begin": 3292, + "end": 3320, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 3192, + "end": 3327, + "name": "tag", + "source": 21, + "value": "342" + }, + { + "begin": 3192, + "end": 3327, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 3337, + "end": 3338, + "name": "DUP3", + "source": 21 + }, + { + "begin": 3337, + "end": 3344, + "name": "PUSH", + "source": 21, + "value": "FF" + }, + { + "begin": 3337, + "end": 3344, + "name": "AND", + "source": 21 + }, + { + "begin": 3342, + "end": 3344, + "name": "PUSH", + "source": 21, + "value": "1B" + }, + { + "begin": 3337, + "end": 3344, + "name": "EQ", + "source": 21 + }, + { + "begin": 3337, + "end": 3344, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 3337, + "end": 3355, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3337, + "end": 3355, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 3337, + "end": 3355, + "name": "PUSH [tag]", + "source": 21, + "value": "345" + }, + { + "begin": 3337, + "end": 3355, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 3337, + "end": 3355, + "name": "POP", + "source": 21 + }, + { + "begin": 3348, + "end": 3349, + "name": "DUP3", + "source": 21 + }, + { + "begin": 3348, + "end": 3355, + "name": "PUSH", + "source": 21, + "value": "FF" + }, + { + "begin": 3348, + "end": 3355, + "name": "AND", + "source": 21 + }, + { + "begin": 3353, + "end": 3355, + "name": "PUSH", + "source": 21, + "value": "1C" + }, + { + "begin": 3348, + "end": 3355, + "name": "EQ", + "source": 21 + }, + { + "begin": 3348, + "end": 3355, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 3337, + "end": 3355, + "name": "tag", + "source": 21, + "value": "345" + }, + { + "begin": 3337, + "end": 3355, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 3333, + "end": 3407, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 3333, + "end": 3407, + "name": "PUSH [tag]", + "source": 21, + "value": "346" + }, + { + "begin": 3333, + "end": 3407, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 3386, + "end": 3396, + "name": "DUP7", + "source": 21 + }, + { + "begin": 3386, + "end": 3396, + "name": "DUP7", + "source": 21 + }, + { + "begin": 3398, + "end": 3399, + "name": "DUP5", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 3372, + "end": 3400, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "PUSH", + "source": 21, + "value": "E578897E00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 3372, + "end": 3400, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 3372, + "end": 3400, + "name": "ADD", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "PUSH [tag]", + "source": 21, + "value": "93" + }, + { + "begin": 3372, + "end": 3400, + "name": "SWAP4", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 3372, + "end": 3400, + "name": "PUSH [tag]", + "source": 21, + "value": "348" + }, + { + "begin": 3372, + "end": 3400, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 3333, + "end": 3407, + "name": "tag", + "source": 21, + "value": "346" + }, + { + "begin": 3333, + "end": 3407, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 1253, + "end": 1254, + "name": "PUSH", + "source": 21, + "value": "1" + }, + { + "begin": 3447, + "end": 3460, + "name": "DUP5", + "source": 21 + }, + { + "begin": 3447, + "end": 3479, + "name": "SUB", + "source": 21 + }, + { + "begin": 3443, + "end": 3952, + "name": "PUSH [tag]", + "source": 21, + "value": "349" + }, + { + "begin": 3443, + "end": 3952, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "20" + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "ADD", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP4", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 18522, + "end": 18547, + "name": "DUP11", + "source": 22 + }, + { + "begin": 18522, + "end": 18547, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 18522, + "end": 18547, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 18595, + "end": 18599, + "name": "PUSH", + "source": 22, + "value": "FF" + }, + { + "begin": 18583, + "end": 18600, + "name": "DUP6", + "source": 22 + }, + { + "begin": 18583, + "end": 18600, + "name": "AND", + "source": 22 + }, + { + "begin": 18563, + "end": 18581, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 18563, + "end": 18581, + "name": "DUP2", + "source": 22 + }, + { + "begin": 18563, + "end": 18581, + "name": "ADD", + "source": 22 + }, + { + "begin": 18556, + "end": 18601, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 18556, + "end": 18601, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 18556, + "end": 18601, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 18556, + "end": 18601, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 18617, + "end": 18635, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 18617, + "end": 18635, + "name": "DUP2", + "source": 22 + }, + { + "begin": 18617, + "end": 18635, + "name": "ADD", + "source": 22 + }, + { + "begin": 18610, + "end": 18644, + "name": "DUP4", + "source": 22 + }, + { + "begin": 18610, + "end": 18644, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 18610, + "end": 18644, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 18660, + "end": 18678, + "name": "PUSH", + "source": 22, + "value": "80" + }, + { + "begin": 18660, + "end": 18678, + "name": "DUP2", + "source": 22 + }, + { + "begin": 18660, + "end": 18678, + "name": "ADD", + "source": 22 + }, + { + "begin": 18653, + "end": 18687, + "name": "DUP3", + "source": 22 + }, + { + "begin": 18653, + "end": 18687, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 18653, + "end": 18687, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "1" + }, + { + "begin": 3498, + "end": 3523, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 18494, + "end": 18513, + "name": "PUSH", + "source": 22, + "value": "A0" + }, + { + "begin": 18494, + "end": 18513, + "name": "ADD", + "source": 22 + }, + { + "begin": 3498, + "end": 3523, + "name": "tag", + "source": 21, + "value": "350" + }, + { + "begin": 3498, + "end": 3523, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "20" + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 3498, + "end": 3523, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "20" + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "SUB", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP5", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "SUB", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP6", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "GAS", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "STATICCALL", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH [tag]", + "source": 21, + "value": "353" + }, + { + "begin": 3498, + "end": 3523, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "RETURNDATASIZE", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 3498, + "end": 3523, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "RETURNDATACOPY", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "RETURNDATASIZE", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 3498, + "end": 3523, + "name": "REVERT", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "tag", + "source": 21, + "value": "353" + }, + { + "begin": 3498, + "end": 3523, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "POP", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "POP", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "POP", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "20" + }, + { + "begin": 3498, + "end": 3523, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 3498, + "end": 3523, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "SUB", + "source": 21 + }, + { + "begin": 3498, + "end": 3523, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3489, + "end": 3523, + "name": "SWAP5", + "source": 21 + }, + { + "begin": 3489, + "end": 3523, + "name": "POP", + "source": 21 + }, + { + "begin": 3443, + "end": 3952, + "name": "PUSH [tag]", + "source": 21, + "value": "361" + }, + { + "begin": 3443, + "end": 3952, + "name": "JUMP", + "source": 21 + }, + { + "begin": 3443, + "end": 3952, + "name": "tag", + "source": 21, + "value": "349" + }, + { + "begin": 3443, + "end": 3952, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 1303, + "end": 1304, + "name": "PUSH", + "source": 21, + "value": "2" + }, + { + "begin": 3608, + "end": 3621, + "name": "DUP5", + "source": 21 + }, + { + "begin": 3608, + "end": 3642, + "name": "SUB", + "source": 21 + }, + { + "begin": 3604, + "end": 3952, + "name": "PUSH [tag]", + "source": 21, + "value": "355" + }, + { + "begin": 3604, + "end": 3952, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 3690, + "end": 3749, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 18940, + "end": 19006, + "name": "PUSH", + "source": 22, + "value": "19457468657265756D205369676E6564204D6573736167653A0A333200000000" + }, + { + "begin": 3690, + "end": 3749, + "name": "PUSH", + "source": 21, + "value": "20" + }, + { + "begin": 3690, + "end": 3749, + "name": "DUP3", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "ADD", + "source": 21 + }, + { + "begin": 18928, + "end": 19007, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 19023, + "end": 19035, + "name": "PUSH", + "source": 22, + "value": "3C" + }, + { + "begin": 19023, + "end": 19035, + "name": "DUP2", + "source": 22 + }, + { + "begin": 19023, + "end": 19035, + "name": "ADD", + "source": 22 + }, + { + "begin": 19016, + "end": 19044, + "name": "DUP10", + "source": 22 + }, + { + "begin": 19016, + "end": 19044, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 19016, + "end": 19044, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 3661, + "end": 3791, + "name": "PUSH", + "source": 21, + "value": "1" + }, + { + "begin": 3661, + "end": 3791, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 19060, + "end": 19072, + "name": "PUSH", + "source": 22, + "value": "5C" + }, + { + "begin": 19060, + "end": 19072, + "name": "ADD", + "source": 22 + }, + { + "begin": 3690, + "end": 3749, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 3690, + "end": 3749, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "PUSH", + "source": 21, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0" + }, + { + "begin": 3690, + "end": 3749, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "DUP5", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "SUB", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "ADD", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "DUP3", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "DUP3", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 3680, + "end": 3750, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3680, + "end": 3750, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3690, + "end": 3749, + "name": "PUSH", + "source": 21, + "value": "20" + }, + { + "begin": 3680, + "end": 3750, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 3680, + "end": 3750, + "name": "DUP3", + "source": 21 + }, + { + "begin": 3680, + "end": 3750, + "name": "ADD", + "source": 21 + }, + { + "begin": 3680, + "end": 3750, + "name": "KECCAK256", + "source": 21 + }, + { + "begin": 3661, + "end": 3791, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 3661, + "end": 3791, + "name": "DUP5", + "source": 21 + }, + { + "begin": 3661, + "end": 3791, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 3661, + "end": 3791, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 3661, + "end": 3791, + "name": "DUP4", + "source": 21 + }, + { + "begin": 3661, + "end": 3791, + "name": "ADD", + "source": 21 + }, + { + "begin": 3661, + "end": 3791, + "name": "DUP1", + "source": 21 + }, + { + "begin": 3661, + "end": 3791, + "name": "DUP4", + "source": 21 + }, + { + "begin": 3661, + "end": 3791, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 18522, + "end": 18547, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 18595, + "end": 18599, + "name": "PUSH", + "source": 22, + "value": "FF" + }, + { + "begin": 18583, + "end": 18600, + "name": "DUP7", + "source": 22 + }, + { + "begin": 18583, + "end": 18600, + "name": "AND", + "source": 22 + }, + { + "begin": 18563, + "end": 18581, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 18563, + "end": 18581, + "name": "DUP3", + "source": 22 + }, + { + "begin": 18563, + "end": 18581, + "name": "ADD", + "source": 22 + }, + { + "begin": 18556, + "end": 18601, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 18617, + "end": 18635, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 18617, + "end": 18635, + "name": "DUP2", + "source": 22 + }, + { + "begin": 18617, + "end": 18635, + "name": "ADD", + "source": 22 + }, + { + "begin": 18610, + "end": 18644, + "name": "DUP5", + "source": 22 + }, + { + "begin": 18610, + "end": 18644, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 18610, + "end": 18644, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 18660, + "end": 18678, + "name": "PUSH", + "source": 22, + "value": "80" + }, + { + "begin": 18660, + "end": 18678, + "name": "DUP2", + "source": 22 + }, + { + "begin": 18660, + "end": 18678, + "name": "ADD", + "source": 22 + }, + { + "begin": 18653, + "end": 18687, + "name": "DUP4", + "source": 22 + }, + { + "begin": 18653, + "end": 18687, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 18653, + "end": 18687, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 18494, + "end": 18513, + "name": "PUSH", + "source": 22, + "value": "A0" + }, + { + "begin": 18494, + "end": 18513, + "name": "ADD", + "source": 22 + }, + { + "begin": 3661, + "end": 3791, + "name": "PUSH [tag]", + "source": 21, + "value": "350" + }, + { + "begin": 18295, + "end": 18693, + "name": "JUMP", + "source": 22 + }, + { + "begin": 3604, + "end": 3952, + "name": "tag", + "source": 21, + "value": "355" + }, + { + "begin": 3604, + "end": 3952, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 3913, + "end": 3923, + "name": "DUP7", + "source": 21 + }, + { + "begin": 3913, + "end": 3923, + "name": "DUP7", + "source": 21 + }, + { + "begin": 3925, + "end": 3938, + "name": "DUP6", + "source": 21 + }, + { + "begin": 3940, + "end": 3944, + "name": "PUSH", + "source": 21, + "value": "1" + }, + { + "begin": 3888, + "end": 3945, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 3888, + "end": 3945, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "PUSH", + "source": 21, + "value": "9DFBA85200000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 3888, + "end": 3945, + "name": "DUP2", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 3888, + "end": 3945, + "name": "ADD", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "PUSH [tag]", + "source": 21, + "value": "93" + }, + { + "begin": 3888, + "end": 3945, + "name": "SWAP5", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "SWAP4", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 3888, + "end": 3945, + "name": "PUSH [tag]", + "source": 21, + "value": "363" + }, + { + "begin": 3888, + "end": 3945, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 3604, + "end": 3952, + "name": "tag", + "source": 21, + "value": "361" + }, + { + "begin": 3604, + "end": 3952, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 3999, + "end": 4021, + "name": "PUSH", + "source": 21, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 3999, + "end": 4021, + "name": "DUP6", + "source": 21 + }, + { + "begin": 3999, + "end": 4021, + "name": "AND", + "source": 21 + }, + { + "begin": 3995, + "end": 4058, + "name": "PUSH [tag]", + "source": 21, + "value": "364" + }, + { + "begin": 3995, + "end": 4058, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 4047, + "end": 4057, + "name": "DUP7", + "source": 21 + }, + { + "begin": 4047, + "end": 4057, + "name": "DUP7", + "source": 21 + }, + { + "begin": 4030, + "end": 4058, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 4030, + "end": 4058, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 4030, + "end": 4058, + "name": "PUSH", + "source": 21, + "value": "6C1719D200000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 4030, + "end": 4058, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4030, + "end": 4058, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 4030, + "end": 4058, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 4030, + "end": 4058, + "name": "ADD", + "source": 21 + }, + { + "begin": 4030, + "end": 4058, + "name": "PUSH [tag]", + "source": 21, + "value": "93" + }, + { + "begin": 4030, + "end": 4058, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 4030, + "end": 4058, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 4030, + "end": 4058, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 4030, + "end": 4058, + "name": "PUSH [tag]", + "source": 21, + "value": "333" + }, + { + "begin": 4030, + "end": 4058, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 3995, + "end": 4058, + "name": "tag", + "source": 21, + "value": "364" + }, + { + "begin": 3995, + "end": 4058, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 4065, + "end": 4078, + "name": "POP", + "source": 21 + }, + { + "begin": 4065, + "end": 4078, + "name": "POP", + "source": 21 + }, + { + "begin": 4065, + "end": 4078, + "name": "POP", + "source": 21 + }, + { + "begin": 4065, + "end": 4078, + "name": "POP", + "source": 21 + }, + { + "begin": 1767, + "end": 4083, + "name": "SWAP4", + "source": 21 + }, + { + "begin": 1767, + "end": 4083, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 1767, + "end": 4083, + "name": "POP", + "source": 21 + }, + { + "begin": 1767, + "end": 4083, + "name": "POP", + "source": 21 + }, + { + "begin": 1767, + "end": 4083, + "name": "POP", + "source": 21 + }, + { + "begin": 1767, + "end": 4083, + "jumpType": "[out]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 4411, + "end": 5362, + "name": "tag", + "source": 21, + "value": "274" + }, + { + "begin": 4411, + "end": 5362, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 4535, + "end": 4545, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 4557, + "end": 4579, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4557, + "end": 4579, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4557, + "end": 4579, + "name": "SUB", + "source": 21 + }, + { + "begin": 4553, + "end": 4619, + "name": "PUSH [tag]", + "source": 21, + "value": "367" + }, + { + "begin": 4553, + "end": 4619, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 4596, + "end": 4612, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "PUSH", + "source": 21, + "value": "AC241E1100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 4596, + "end": 4612, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 4596, + "end": 4612, + "name": "ADD", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 4596, + "end": 4612, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "DUP1", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "SUB", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 4596, + "end": 4612, + "name": "REVERT", + "source": 21 + }, + { + "begin": 4553, + "end": 4619, + "name": "tag", + "source": 21, + "value": "367" + }, + { + "begin": 4553, + "end": 4619, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 4625, + "end": 4646, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 4655, + "end": 4665, + "name": "DUP4", + "source": 21 + }, + { + "begin": 4655, + "end": 4665, + "name": "DUP4", + "source": 21 + }, + { + "begin": 4666, + "end": 4687, + "name": "PUSH [tag]", + "source": 21, + "value": "368" + }, + { + "begin": 4686, + "end": 4687, + "name": "PUSH", + "source": 21, + "value": "1" + }, + { + "begin": 4655, + "end": 4665, + "name": "DUP3", + "source": 21 + }, + { + "begin": 4666, + "end": 4687, + "name": "PUSH [tag]", + "source": 21, + "value": "336" + }, + { + "begin": 4666, + "end": 4687, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 4666, + "end": 4687, + "name": "tag", + "source": 21, + "value": "368" + }, + { + "begin": 4666, + "end": 4687, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "LT", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "PUSH [tag]", + "source": 21, + "value": "370" + }, + { + "begin": 4655, + "end": 4688, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "PUSH [tag]", + "source": 21, + "value": "370" + }, + { + "begin": 4655, + "end": 4688, + "name": "PUSH [tag]", + "source": 21, + "value": "113" + }, + { + "begin": 4655, + "end": 4688, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "tag", + "source": 21, + "value": "370" + }, + { + "begin": 4655, + "end": 4688, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "ADD", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "CALLDATALOAD", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "PUSH", + "source": 21, + "value": "F8" + }, + { + "begin": 4655, + "end": 4688, + "name": "SHR", + "source": 21 + }, + { + "begin": 4655, + "end": 4688, + "name": "SWAP2", + "source": 21 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1253, + "end": 1254, + "name": "PUSH", + "source": 21, + "value": "1" + }, + { + "begin": 4699, + "end": 4731, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4699, + "end": 4731, + "name": "EQ", + "source": 21 + }, + { + "begin": 4699, + "end": 4731, + "name": "DUP1", + "source": 21 + }, + { + "begin": 4699, + "end": 4769, + "name": "PUSH [tag]", + "source": 21, + "value": "371" + }, + { + "begin": 4699, + "end": 4769, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 4699, + "end": 4769, + "name": "POP", + "source": 21 + }, + { + "begin": 1303, + "end": 1304, + "name": "PUSH", + "source": 21, + "value": "2" + }, + { + "begin": 4735, + "end": 4748, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4735, + "end": 4769, + "name": "EQ", + "source": 21 + }, + { + "begin": 4699, + "end": 4769, + "name": "tag", + "source": 21, + "value": "371" + }, + { + "begin": 4699, + "end": 4769, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 4695, + "end": 5358, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 4695, + "end": 5358, + "name": "PUSH [tag]", + "source": 21, + "value": "372" + }, + { + "begin": 4695, + "end": 5358, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 4873, + "end": 4880, + "name": "DUP5", + "source": 21 + }, + { + "begin": 4837, + "end": 4880, + "name": "PUSH", + "source": 21, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 4837, + "end": 4880, + "name": "AND", + "source": 21 + }, + { + "begin": 4837, + "end": 4869, + "name": "PUSH [tag]", + "source": 21, + "value": "373" + }, + { + "begin": 4851, + "end": 4856, + "name": "DUP8", + "source": 21 + }, + { + "begin": 4858, + "end": 4868, + "name": "DUP7", + "source": 21 + }, + { + "begin": 4858, + "end": 4868, + "name": "DUP7", + "source": 21 + }, + { + "begin": 4837, + "end": 4850, + "name": "PUSH [tag]", + "source": 21, + "value": "264" + }, + { + "begin": 4837, + "end": 4869, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 4837, + "end": 4869, + "name": "tag", + "source": 21, + "value": "373" + }, + { + "begin": 4837, + "end": 4869, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 4837, + "end": 4880, + "name": "PUSH", + "source": 21, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 4837, + "end": 4880, + "name": "AND", + "source": 21 + }, + { + "begin": 4837, + "end": 4880, + "name": "EQ", + "source": 21 + }, + { + "begin": 4829, + "end": 4880, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 4829, + "end": 4880, + "name": "POP", + "source": 21 + }, + { + "begin": 4695, + "end": 5358, + "name": "PUSH [tag]", + "source": 21, + "value": "384" + }, + { + "begin": 4695, + "end": 5358, + "name": "JUMP", + "source": 21 + }, + { + "begin": 4695, + "end": 5358, + "name": "tag", + "source": 21, + "value": "372" + }, + { + "begin": 4695, + "end": 5358, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 1359, + "end": 1360, + "name": "PUSH", + "source": 21, + "value": "3" + }, + { + "begin": 4898, + "end": 4911, + "name": "DUP2", + "source": 21 + }, + { + "begin": 4898, + "end": 4938, + "name": "SUB", + "source": 21 + }, + { + "begin": 4894, + "end": 5358, + "name": "PUSH [tag]", + "source": 21, + "value": "375" + }, + { + "begin": 4894, + "end": 5358, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 5060, + "end": 5100, + "name": "PUSH", + "source": 21, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 5060, + "end": 5100, + "name": "DUP6", + "source": 21 + }, + { + "begin": 5060, + "end": 5100, + "name": "AND", + "source": 21 + }, + { + "begin": 5060, + "end": 5100, + "name": "PUSH", + "source": 21, + "value": "1626BA7E" + }, + { + "begin": 5101, + "end": 5106, + "name": "DUP8", + "source": 21 + }, + { + "begin": 5108, + "end": 5118, + "name": "DUP7", + "source": 21 + }, + { + "begin": 5119, + "end": 5120, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 5108, + "end": 5118, + "name": "DUP8", + "source": 21 + }, + { + "begin": 5121, + "end": 5142, + "name": "PUSH [tag]", + "source": 21, + "value": "376" + }, + { + "begin": 5141, + "end": 5142, + "name": "PUSH", + "source": 21, + "value": "1" + }, + { + "begin": 5108, + "end": 5118, + "name": "DUP3", + "source": 21 + }, + { + "begin": 5121, + "end": 5142, + "name": "PUSH [tag]", + "source": 21, + "value": "336" + }, + { + "begin": 5121, + "end": 5142, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 5121, + "end": 5142, + "name": "tag", + "source": 21, + "value": "376" + }, + { + "begin": 5121, + "end": 5142, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 5108, + "end": 5143, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 5108, + "end": 5143, + "name": "PUSH [tag]", + "source": 21, + "value": "377" + }, + { + "begin": 5108, + "end": 5143, + "name": "SWAP4", + "source": 21 + }, + { + "begin": 5108, + "end": 5143, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 5108, + "end": 5143, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 5108, + "end": 5143, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 5108, + "end": 5143, + "name": "PUSH [tag]", + "source": 21, + "value": "193" + }, + { + "begin": 5108, + "end": 5143, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 5108, + "end": 5143, + "name": "tag", + "source": 21, + "value": "377" + }, + { + "begin": 5108, + "end": 5143, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 5060, + "end": 5144, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP5", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "FFFFFFFF" + }, + { + "begin": 5060, + "end": 5144, + "name": "AND", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "E0" + }, + { + "begin": 5060, + "end": 5144, + "name": "SHL", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP2", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 5060, + "end": 5144, + "name": "ADD", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH [tag]", + "source": 21, + "value": "378" + }, + { + "begin": 5060, + "end": 5144, + "name": "SWAP4", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH [tag]", + "source": 21, + "value": "379" + }, + { + "begin": 5060, + "end": 5144, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "tag", + "source": 21, + "value": "378" + }, + { + "begin": 5060, + "end": 5144, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "20" + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 5060, + "end": 5144, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP1", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP4", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "SUB", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP2", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP7", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "GAS", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "STATICCALL", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP1", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "ISZERO", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH [tag]", + "source": 21, + "value": "381" + }, + { + "begin": 5060, + "end": 5144, + "name": "JUMPI", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "RETURNDATASIZE", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP1", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "RETURNDATACOPY", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "RETURNDATASIZE", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 5060, + "end": 5144, + "name": "REVERT", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "tag", + "source": 21, + "value": "381" + }, + { + "begin": 5060, + "end": 5144, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "POP", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "POP", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "POP", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "POP", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 5060, + "end": 5144, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "RETURNDATASIZE", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "1F" + }, + { + "begin": 5060, + "end": 5144, + "name": "NOT", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "1F" + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP3", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "ADD", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "AND", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP3", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "ADD", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP1", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 5060, + "end": 5144, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "POP", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "DUP2", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "ADD", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH [tag]", + "source": 21, + "value": "382" + }, + { + "begin": 5060, + "end": 5144, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "PUSH [tag]", + "source": 21, + "value": "383" + }, + { + "begin": 5060, + "end": 5144, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 5060, + "end": 5144, + "name": "tag", + "source": 21, + "value": "382" + }, + { + "begin": 5060, + "end": 5144, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 5030, + "end": 5144, + "name": "PUSH", + "source": 21, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 5030, + "end": 5144, + "name": "AND", + "source": 21 + }, + { + "begin": 5030, + "end": 5056, + "name": "PUSH", + "source": 21, + "value": "1626BA7E00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 5030, + "end": 5144, + "name": "EQ", + "source": 21 + }, + { + "begin": 5030, + "end": 5144, + "name": "SWAP2", + "source": 21 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4894, + "end": 5358, + "name": "PUSH [tag]", + "source": 21, + "value": "384" + }, + { + "begin": 4894, + "end": 5358, + "name": "JUMP", + "source": 21 + }, + { + "begin": 4894, + "end": 5358, + "name": "tag", + "source": 21, + "value": "375" + }, + { + "begin": 4894, + "end": 5358, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 5318, + "end": 5328, + "name": "DUP4", + "source": 21 + }, + { + "begin": 5318, + "end": 5328, + "name": "DUP4", + "source": 21 + }, + { + "begin": 5330, + "end": 5343, + "name": "DUP3", + "source": 21 + }, + { + "begin": 5345, + "end": 5350, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 5293, + "end": 5351, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 5293, + "end": 5351, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "PUSH", + "source": 21, + "value": "9DFBA85200000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 5293, + "end": 5351, + "name": "DUP2", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 5293, + "end": 5351, + "name": "ADD", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "PUSH [tag]", + "source": 21, + "value": "93" + }, + { + "begin": 5293, + "end": 5351, + "name": "SWAP5", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "SWAP4", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "SWAP3", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "SWAP2", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "SWAP1", + "source": 21 + }, + { + "begin": 5293, + "end": 5351, + "name": "PUSH [tag]", + "source": 21, + "value": "363" + }, + { + "begin": 5293, + "end": 5351, + "jumpType": "[in]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 4894, + "end": 5358, + "name": "tag", + "source": 21, + "value": "384" + }, + { + "begin": 4894, + "end": 5358, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 4547, + "end": 5362, + "name": "POP", + "source": 21 + }, + { + "begin": 4411, + "end": 5362, + "name": "SWAP5", + "source": 21 + }, + { + "begin": 4411, + "end": 5362, + "name": "SWAP4", + "source": 21 + }, + { + "begin": 4411, + "end": 5362, + "name": "POP", + "source": 21 + }, + { + "begin": 4411, + "end": 5362, + "name": "POP", + "source": 21 + }, + { + "begin": 4411, + "end": 5362, + "name": "POP", + "source": 21 + }, + { + "begin": 4411, + "end": 5362, + "name": "POP", + "source": 21 + }, + { + "begin": 4411, + "end": 5362, + "jumpType": "[out]", + "name": "JUMP", + "source": 21 + }, + { + "begin": 2227, + "end": 2409, + "name": "tag", + "source": 13, + "value": "311" + }, + { + "begin": 2227, + "end": 2409, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 2346, + "end": 2403, + "name": "PUSH", + "source": 13, + "value": "40" + }, + { + "begin": 2346, + "end": 2403, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 20822, + "end": 20888, + "name": "PUSH", + "source": 22, + "value": "53657175656E636520737461746963206469676573743A0A0000000000000000" + }, + { + "begin": 2346, + "end": 2403, + "name": "PUSH", + "source": 13, + "value": "20" + }, + { + "begin": 2346, + "end": 2403, + "name": "DUP3", + "source": 13 + }, + { + "begin": 2346, + "end": 2403, + "name": "ADD", + "source": 13 + }, + { + "begin": 20810, + "end": 20889, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 20905, + "end": 20917, + "name": "PUSH", + "source": 22, + "value": "38" + }, + { + "begin": 20905, + "end": 20917, + "name": "DUP2", + "source": 22 + }, + { + "begin": 20905, + "end": 20917, + "name": "ADD", + "source": 22 + }, + { + "begin": 20898, + "end": 20926, + "name": "DUP3", + "source": 22 + }, + { + "begin": 20898, + "end": 20926, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 20898, + "end": 20926, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2314, + "end": 2321, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 2314, + "end": 2321, + "name": "SWAP1", + "source": 13 + }, + { + "begin": 20942, + "end": 20954, + "name": "PUSH", + "source": 22, + "value": "58" + }, + { + "begin": 20942, + "end": 20954, + "name": "ADD", + "source": 22 + }, + { + "begin": 2346, + "end": 2403, + "name": "PUSH [tag]", + "source": 13, + "value": "155" + }, + { + "begin": 20580, + "end": 20960, + "name": "JUMP", + "source": 22 + }, + { + "begin": 14, + "end": 191, + "name": "tag", + "source": 22, + "value": "397" + }, + { + "begin": 14, + "end": 191, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 99, + "end": 165, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 92, + "end": 97, + "name": "DUP2", + "source": 22 + }, + { + "begin": 88, + "end": 166, + "name": "AND", + "source": 22 + }, + { + "begin": 81, + "end": 86, + "name": "DUP2", + "source": 22 + }, + { + "begin": 78, + "end": 167, + "name": "EQ", + "source": 22 + }, + { + "begin": 68, + "end": 185, + "name": "PUSH [tag]", + "source": 22, + "value": "96" + }, + { + "begin": 68, + "end": 185, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 181, + "end": 182, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 178, + "end": 179, + "name": "DUP1", + "source": 22 + }, + { + "begin": 171, + "end": 183, + "name": "REVERT", + "source": 22 + }, + { + "begin": 196, + "end": 441, + "name": "tag", + "source": 22, + "value": "19" + }, + { + "begin": 196, + "end": 441, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 254, + "end": 260, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 307, + "end": 309, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 295, + "end": 304, + "name": "DUP3", + "source": 22 + }, + { + "begin": 286, + "end": 293, + "name": "DUP5", + "source": 22 + }, + { + "begin": 282, + "end": 305, + "name": "SUB", + "source": 22 + }, + { + "begin": 278, + "end": 310, + "name": "SLT", + "source": 22 + }, + { + "begin": 275, + "end": 327, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 275, + "end": 327, + "name": "PUSH [tag]", + "source": 22, + "value": "411" + }, + { + "begin": 275, + "end": 327, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 323, + "end": 324, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 320, + "end": 321, + "name": "DUP1", + "source": 22 + }, + { + "begin": 313, + "end": 325, + "name": "REVERT", + "source": 22 + }, + { + "begin": 275, + "end": 327, + "name": "tag", + "source": 22, + "value": "411" + }, + { + "begin": 275, + "end": 327, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 362, + "end": 371, + "name": "DUP2", + "source": 22 + }, + { + "begin": 349, + "end": 372, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 381, + "end": 411, + "name": "PUSH [tag]", + "source": 22, + "value": "82" + }, + { + "begin": 405, + "end": 410, + "name": "DUP2", + "source": 22 + }, + { + "begin": 381, + "end": 411, + "name": "PUSH [tag]", + "source": 22, + "value": "397" + }, + { + "begin": 381, + "end": 411, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 638, + "end": 985, + "name": "tag", + "source": 22, + "value": "398" + }, + { + "begin": 638, + "end": 985, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 689, + "end": 697, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 699, + "end": 705, + "name": "DUP1", + "source": 22 + }, + { + "begin": 753, + "end": 756, + "name": "DUP4", + "source": 22 + }, + { + "begin": 746, + "end": 750, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 738, + "end": 744, + "name": "DUP5", + "source": 22 + }, + { + "begin": 734, + "end": 751, + "name": "ADD", + "source": 22 + }, + { + "begin": 730, + "end": 757, + "name": "SLT", + "source": 22 + }, + { + "begin": 720, + "end": 775, + "name": "PUSH [tag]", + "source": 22, + "value": "415" + }, + { + "begin": 720, + "end": 775, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 771, + "end": 772, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 768, + "end": 769, + "name": "DUP1", + "source": 22 + }, + { + "begin": 761, + "end": 773, + "name": "REVERT", + "source": 22 + }, + { + "begin": 720, + "end": 775, + "name": "tag", + "source": 22, + "value": "415" + }, + { + "begin": 720, + "end": 775, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 794, + "end": 814, + "name": "DUP2", + "source": 22 + }, + { + "begin": 794, + "end": 814, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 837, + "end": 855, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 826, + "end": 856, + "name": "DUP2", + "source": 22 + }, + { + "begin": 826, + "end": 856, + "name": "GT", + "source": 22 + }, + { + "begin": 823, + "end": 873, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 823, + "end": 873, + "name": "PUSH [tag]", + "source": 22, + "value": "416" + }, + { + "begin": 823, + "end": 873, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 869, + "end": 870, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 866, + "end": 867, + "name": "DUP1", + "source": 22 + }, + { + "begin": 859, + "end": 871, + "name": "REVERT", + "source": 22 + }, + { + "begin": 823, + "end": 873, + "name": "tag", + "source": 22, + "value": "416" + }, + { + "begin": 823, + "end": 873, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 906, + "end": 910, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 898, + "end": 904, + "name": "DUP4", + "source": 22 + }, + { + "begin": 894, + "end": 911, + "name": "ADD", + "source": 22 + }, + { + "begin": 882, + "end": 911, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 882, + "end": 911, + "name": "POP", + "source": 22 + }, + { + "begin": 958, + "end": 961, + "name": "DUP4", + "source": 22 + }, + { + "begin": 951, + "end": 955, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 942, + "end": 948, + "name": "DUP3", + "source": 22 + }, + { + "begin": 934, + "end": 940, + "name": "DUP6", + "source": 22 + }, + { + "begin": 930, + "end": 949, + "name": "ADD", + "source": 22 + }, + { + "begin": 926, + "end": 956, + "name": "ADD", + "source": 22 + }, + { + "begin": 923, + "end": 962, + "name": "GT", + "source": 22 + }, + { + "begin": 920, + "end": 979, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 920, + "end": 979, + "name": "PUSH [tag]", + "source": 22, + "value": "417" + }, + { + "begin": 920, + "end": 979, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 975, + "end": 976, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 972, + "end": 973, + "name": "DUP1", + "source": 22 + }, + { + "begin": 965, + "end": 977, + "name": "REVERT", + "source": 22 + }, + { + "begin": 920, + "end": 979, + "name": "tag", + "source": 22, + "value": "417" + }, + { + "begin": 920, + "end": 979, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 638, + "end": 985, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 638, + "end": 985, + "name": "POP", + "source": 22 + }, + { + "begin": 638, + "end": 985, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 638, + "end": 985, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 638, + "end": 985, + "name": "POP", + "source": 22 + }, + { + "begin": 638, + "end": 985, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 990, + "end": 1467, + "name": "tag", + "source": 22, + "value": "26" + }, + { + "begin": 990, + "end": 1467, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1069, + "end": 1075, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1077, + "end": 1083, + "name": "DUP1", + "source": 22 + }, + { + "begin": 1085, + "end": 1091, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1138, + "end": 1140, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 1126, + "end": 1135, + "name": "DUP5", + "source": 22 + }, + { + "begin": 1117, + "end": 1124, + "name": "DUP7", + "source": 22 + }, + { + "begin": 1113, + "end": 1136, + "name": "SUB", + "source": 22 + }, + { + "begin": 1109, + "end": 1141, + "name": "SLT", + "source": 22 + }, + { + "begin": 1106, + "end": 1158, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 1106, + "end": 1158, + "name": "PUSH [tag]", + "source": 22, + "value": "419" + }, + { + "begin": 1106, + "end": 1158, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 1154, + "end": 1155, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1151, + "end": 1152, + "name": "DUP1", + "source": 22 + }, + { + "begin": 1144, + "end": 1156, + "name": "REVERT", + "source": 22 + }, + { + "begin": 1106, + "end": 1158, + "name": "tag", + "source": 22, + "value": "419" + }, + { + "begin": 1106, + "end": 1158, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1190, + "end": 1199, + "name": "DUP4", + "source": 22 + }, + { + "begin": 1177, + "end": 1200, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 1167, + "end": 1200, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 1167, + "end": 1200, + "name": "POP", + "source": 22 + }, + { + "begin": 1251, + "end": 1253, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 1240, + "end": 1249, + "name": "DUP5", + "source": 22 + }, + { + "begin": 1236, + "end": 1254, + "name": "ADD", + "source": 22 + }, + { + "begin": 1223, + "end": 1255, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 1278, + "end": 1296, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 1270, + "end": 1276, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1267, + "end": 1297, + "name": "GT", + "source": 22 + }, + { + "begin": 1264, + "end": 1314, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 1264, + "end": 1314, + "name": "PUSH [tag]", + "source": 22, + "value": "420" + }, + { + "begin": 1264, + "end": 1314, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 1310, + "end": 1311, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1307, + "end": 1308, + "name": "DUP1", + "source": 22 + }, + { + "begin": 1300, + "end": 1312, + "name": "REVERT", + "source": 22 + }, + { + "begin": 1264, + "end": 1314, + "name": "tag", + "source": 22, + "value": "420" + }, + { + "begin": 1264, + "end": 1314, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1349, + "end": 1407, + "name": "PUSH [tag]", + "source": 22, + "value": "421" + }, + { + "begin": 1399, + "end": 1406, + "name": "DUP7", + "source": 22 + }, + { + "begin": 1390, + "end": 1396, + "name": "DUP3", + "source": 22 + }, + { + "begin": 1379, + "end": 1388, + "name": "DUP8", + "source": 22 + }, + { + "begin": 1375, + "end": 1397, + "name": "ADD", + "source": 22 + }, + { + "begin": 1349, + "end": 1407, + "name": "PUSH [tag]", + "source": 22, + "value": "398" + }, + { + "begin": 1349, + "end": 1407, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 1349, + "end": 1407, + "name": "tag", + "source": 22, + "value": "421" + }, + { + "begin": 1349, + "end": 1407, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 990, + "end": 1467, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 990, + "end": 1467, + "name": "SWAP8", + "source": 22 + }, + { + "begin": 1426, + "end": 1434, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 1426, + "end": 1434, + "name": "SWAP7", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1323, + "end": 1407, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 1323, + "end": 1407, + "name": "SWAP5", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 990, + "end": 1467, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 1725, + "end": 2442, + "name": "tag", + "source": 22, + "value": "33" + }, + { + "begin": 1725, + "end": 2442, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1815, + "end": 1821, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1823, + "end": 1829, + "name": "DUP1", + "source": 22 + }, + { + "begin": 1831, + "end": 1837, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1839, + "end": 1845, + "name": "DUP1", + "source": 22 + }, + { + "begin": 1892, + "end": 1894, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 1880, + "end": 1889, + "name": "DUP6", + "source": 22 + }, + { + "begin": 1871, + "end": 1878, + "name": "DUP8", + "source": 22 + }, + { + "begin": 1867, + "end": 1890, + "name": "SUB", + "source": 22 + }, + { + "begin": 1863, + "end": 1895, + "name": "SLT", + "source": 22 + }, + { + "begin": 1860, + "end": 1912, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 1860, + "end": 1912, + "name": "PUSH [tag]", + "source": 22, + "value": "424" + }, + { + "begin": 1860, + "end": 1912, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 1908, + "end": 1909, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1905, + "end": 1906, + "name": "DUP1", + "source": 22 + }, + { + "begin": 1898, + "end": 1910, + "name": "REVERT", + "source": 22 + }, + { + "begin": 1860, + "end": 1912, + "name": "tag", + "source": 22, + "value": "424" + }, + { + "begin": 1860, + "end": 1912, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1948, + "end": 1957, + "name": "DUP5", + "source": 22 + }, + { + "begin": 1935, + "end": 1958, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 1977, + "end": 1995, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 2018, + "end": 2020, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2010, + "end": 2016, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2007, + "end": 2021, + "name": "GT", + "source": 22 + }, + { + "begin": 2004, + "end": 2038, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 2004, + "end": 2038, + "name": "PUSH [tag]", + "source": 22, + "value": "425" + }, + { + "begin": 2004, + "end": 2038, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 2034, + "end": 2035, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2031, + "end": 2032, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2024, + "end": 2036, + "name": "REVERT", + "source": 22 + }, + { + "begin": 2004, + "end": 2038, + "name": "tag", + "source": 22, + "value": "425" + }, + { + "begin": 2004, + "end": 2038, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 2073, + "end": 2131, + "name": "PUSH [tag]", + "source": 22, + "value": "426" + }, + { + "begin": 2123, + "end": 2130, + "name": "DUP9", + "source": 22 + }, + { + "begin": 2114, + "end": 2120, + "name": "DUP4", + "source": 22 + }, + { + "begin": 2103, + "end": 2112, + "name": "DUP10", + "source": 22 + }, + { + "begin": 2099, + "end": 2121, + "name": "ADD", + "source": 22 + }, + { + "begin": 2073, + "end": 2131, + "name": "PUSH [tag]", + "source": 22, + "value": "398" + }, + { + "begin": 2073, + "end": 2131, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 2073, + "end": 2131, + "name": "tag", + "source": 22, + "value": "426" + }, + { + "begin": 2073, + "end": 2131, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 2150, + "end": 2158, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 2150, + "end": 2158, + "name": "SWAP7", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2047, + "end": 2131, + "name": "SWAP5", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2238, + "end": 2240, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 2223, + "end": 2241, + "name": "DUP8", + "source": 22 + }, + { + "begin": 2223, + "end": 2241, + "name": "ADD", + "source": 22 + }, + { + "begin": 2210, + "end": 2242, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 2210, + "end": 2242, + "name": "SWAP2", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2254, + "end": 2270, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2254, + "end": 2270, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2254, + "end": 2270, + "name": "GT", + "source": 22 + }, + { + "begin": 2251, + "end": 2287, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 2251, + "end": 2287, + "name": "PUSH [tag]", + "source": 22, + "value": "427" + }, + { + "begin": 2251, + "end": 2287, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 2283, + "end": 2284, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2280, + "end": 2281, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2273, + "end": 2285, + "name": "REVERT", + "source": 22 + }, + { + "begin": 2251, + "end": 2287, + "name": "tag", + "source": 22, + "value": "427" + }, + { + "begin": 2251, + "end": 2287, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 2251, + "end": 2287, + "name": "POP", + "source": 22 + }, + { + "begin": 2322, + "end": 2382, + "name": "PUSH [tag]", + "source": 22, + "value": "428" + }, + { + "begin": 2374, + "end": 2381, + "name": "DUP8", + "source": 22 + }, + { + "begin": 2363, + "end": 2371, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2352, + "end": 2361, + "name": "DUP9", + "source": 22 + }, + { + "begin": 2348, + "end": 2372, + "name": "ADD", + "source": 22 + }, + { + "begin": 2322, + "end": 2382, + "name": "PUSH [tag]", + "source": 22, + "value": "398" + }, + { + "begin": 2322, + "end": 2382, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 2322, + "end": 2382, + "name": "tag", + "source": 22, + "value": "428" + }, + { + "begin": 2322, + "end": 2382, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1725, + "end": 2442, + "name": "SWAP6", + "source": 22 + }, + { + "begin": 1725, + "end": 2442, + "name": "SWAP9", + "source": 22 + }, + { + "begin": 1725, + "end": 2442, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 1725, + "end": 2442, + "name": "SWAP8", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2401, + "end": 2409, + "name": "SWAP6", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1725, + "end": 2442, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 2447, + "end": 2627, + "name": "tag", + "source": 22, + "value": "39" + }, + { + "begin": 2447, + "end": 2627, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 2506, + "end": 2512, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2559, + "end": 2561, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 2547, + "end": 2556, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2538, + "end": 2545, + "name": "DUP5", + "source": 22 + }, + { + "begin": 2534, + "end": 2557, + "name": "SUB", + "source": 22 + }, + { + "begin": 2530, + "end": 2562, + "name": "SLT", + "source": 22 + }, + { + "begin": 2527, + "end": 2579, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 2527, + "end": 2579, + "name": "PUSH [tag]", + "source": 22, + "value": "430" + }, + { + "begin": 2527, + "end": 2579, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 2575, + "end": 2576, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2572, + "end": 2573, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2565, + "end": 2577, + "name": "REVERT", + "source": 22 + }, + { + "begin": 2527, + "end": 2579, + "name": "tag", + "source": 22, + "value": "430" + }, + { + "begin": 2527, + "end": 2579, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2598, + "end": 2621, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 2598, + "end": 2621, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 2447, + "end": 2627, + "name": "SWAP1", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 2447, + "end": 2627, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 2814, + "end": 3201, + "name": "tag", + "source": 22, + "value": "399" + }, + { + "begin": 2814, + "end": 3201, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 2897, + "end": 2905, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2907, + "end": 2913, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2961, + "end": 2964, + "name": "DUP4", + "source": 22 + }, + { + "begin": 2954, + "end": 2958, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 2946, + "end": 2952, + "name": "DUP5", + "source": 22 + }, + { + "begin": 2942, + "end": 2959, + "name": "ADD", + "source": 22 + }, + { + "begin": 2938, + "end": 2965, + "name": "SLT", + "source": 22 + }, + { + "begin": 2928, + "end": 2983, + "name": "PUSH [tag]", + "source": 22, + "value": "433" + }, + { + "begin": 2928, + "end": 2983, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 2979, + "end": 2980, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2976, + "end": 2977, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2969, + "end": 2981, + "name": "REVERT", + "source": 22 + }, + { + "begin": 2928, + "end": 2983, + "name": "tag", + "source": 22, + "value": "433" + }, + { + "begin": 2928, + "end": 2983, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3002, + "end": 3022, + "name": "DUP2", + "source": 22 + }, + { + "begin": 3002, + "end": 3022, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 3045, + "end": 3063, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 3034, + "end": 3064, + "name": "DUP2", + "source": 22 + }, + { + "begin": 3034, + "end": 3064, + "name": "GT", + "source": 22 + }, + { + "begin": 3031, + "end": 3081, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 3031, + "end": 3081, + "name": "PUSH [tag]", + "source": 22, + "value": "434" + }, + { + "begin": 3031, + "end": 3081, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 3077, + "end": 3078, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3074, + "end": 3075, + "name": "DUP1", + "source": 22 + }, + { + "begin": 3067, + "end": 3079, + "name": "REVERT", + "source": 22 + }, + { + "begin": 3031, + "end": 3081, + "name": "tag", + "source": 22, + "value": "434" + }, + { + "begin": 3031, + "end": 3081, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 3114, + "end": 3118, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 3106, + "end": 3112, + "name": "DUP4", + "source": 22 + }, + { + "begin": 3102, + "end": 3119, + "name": "ADD", + "source": 22 + }, + { + "begin": 3090, + "end": 3119, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 3090, + "end": 3119, + "name": "POP", + "source": 22 + }, + { + "begin": 3174, + "end": 3177, + "name": "DUP4", + "source": 22 + }, + { + "begin": 3167, + "end": 3171, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 3157, + "end": 3163, + "name": "DUP3", + "source": 22 + }, + { + "begin": 3154, + "end": 3155, + "name": "PUSH", + "source": 22, + "value": "5" + }, + { + "begin": 3150, + "end": 3164, + "name": "SHL", + "source": 22 + }, + { + "begin": 3142, + "end": 3148, + "name": "DUP6", + "source": 22 + }, + { + "begin": 3138, + "end": 3165, + "name": "ADD", + "source": 22 + }, + { + "begin": 3134, + "end": 3172, + "name": "ADD", + "source": 22 + }, + { + "begin": 3131, + "end": 3178, + "name": "GT", + "source": 22 + }, + { + "begin": 3128, + "end": 3195, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 3128, + "end": 3195, + "name": "PUSH [tag]", + "source": 22, + "value": "417" + }, + { + "begin": 3128, + "end": 3195, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 3191, + "end": 3192, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3188, + "end": 3189, + "name": "DUP1", + "source": 22 + }, + { + "begin": 3181, + "end": 3193, + "name": "REVERT", + "source": 22 + }, + { + "begin": 3206, + "end": 3694, + "name": "tag", + "source": 22, + "value": "49" + }, + { + "begin": 3206, + "end": 3694, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 3323, + "end": 3329, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3331, + "end": 3337, + "name": "DUP1", + "source": 22 + }, + { + "begin": 3384, + "end": 3386, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 3372, + "end": 3381, + "name": "DUP4", + "source": 22 + }, + { + "begin": 3363, + "end": 3370, + "name": "DUP6", + "source": 22 + }, + { + "begin": 3359, + "end": 3382, + "name": "SUB", + "source": 22 + }, + { + "begin": 3355, + "end": 3387, + "name": "SLT", + "source": 22 + }, + { + "begin": 3352, + "end": 3404, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 3352, + "end": 3404, + "name": "PUSH [tag]", + "source": 22, + "value": "437" + }, + { + "begin": 3352, + "end": 3404, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 3400, + "end": 3401, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3397, + "end": 3398, + "name": "DUP1", + "source": 22 + }, + { + "begin": 3390, + "end": 3402, + "name": "REVERT", + "source": 22 + }, + { + "begin": 3352, + "end": 3404, + "name": "tag", + "source": 22, + "value": "437" + }, + { + "begin": 3352, + "end": 3404, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 3440, + "end": 3449, + "name": "DUP3", + "source": 22 + }, + { + "begin": 3427, + "end": 3450, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 3473, + "end": 3491, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 3465, + "end": 3471, + "name": "DUP2", + "source": 22 + }, + { + "begin": 3462, + "end": 3492, + "name": "GT", + "source": 22 + }, + { + "begin": 3459, + "end": 3509, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 3459, + "end": 3509, + "name": "PUSH [tag]", + "source": 22, + "value": "438" + }, + { + "begin": 3459, + "end": 3509, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 3505, + "end": 3506, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3502, + "end": 3503, + "name": "DUP1", + "source": 22 + }, + { + "begin": 3495, + "end": 3507, + "name": "REVERT", + "source": 22 + }, + { + "begin": 3459, + "end": 3509, + "name": "tag", + "source": 22, + "value": "438" + }, + { + "begin": 3459, + "end": 3509, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 3544, + "end": 3634, + "name": "PUSH [tag]", + "source": 22, + "value": "439" + }, + { + "begin": 3626, + "end": 3633, + "name": "DUP6", + "source": 22 + }, + { + "begin": 3617, + "end": 3623, + "name": "DUP3", + "source": 22 + }, + { + "begin": 3606, + "end": 3615, + "name": "DUP7", + "source": 22 + }, + { + "begin": 3602, + "end": 3624, + "name": "ADD", + "source": 22 + }, + { + "begin": 3544, + "end": 3634, + "name": "PUSH [tag]", + "source": 22, + "value": "399" + }, + { + "begin": 3544, + "end": 3634, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 3544, + "end": 3634, + "name": "tag", + "source": 22, + "value": "439" + }, + { + "begin": 3544, + "end": 3634, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 3653, + "end": 3661, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 3653, + "end": 3661, + "name": "SWAP7", + "source": 22 + }, + { + "begin": 3518, + "end": 3634, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 3518, + "end": 3634, + "name": "SWAP6", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3206, + "end": 3694, + "name": "SWAP4", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3206, + "end": 3694, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 3699, + "end": 4563, + "name": "tag", + "source": 22, + "value": "54" + }, + { + "begin": 3699, + "end": 4563, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 3845, + "end": 3851, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3853, + "end": 3859, + "name": "DUP1", + "source": 22 + }, + { + "begin": 3861, + "end": 3867, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3869, + "end": 3875, + "name": "DUP1", + "source": 22 + }, + { + "begin": 3877, + "end": 3883, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3930, + "end": 3932, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 3918, + "end": 3927, + "name": "DUP7", + "source": 22 + }, + { + "begin": 3909, + "end": 3916, + "name": "DUP9", + "source": 22 + }, + { + "begin": 3905, + "end": 3928, + "name": "SUB", + "source": 22 + }, + { + "begin": 3901, + "end": 3933, + "name": "SLT", + "source": 22 + }, + { + "begin": 3898, + "end": 3950, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 3898, + "end": 3950, + "name": "PUSH [tag]", + "source": 22, + "value": "441" + }, + { + "begin": 3898, + "end": 3950, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 3946, + "end": 3947, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 3943, + "end": 3944, + "name": "DUP1", + "source": 22 + }, + { + "begin": 3936, + "end": 3948, + "name": "REVERT", + "source": 22 + }, + { + "begin": 3898, + "end": 3950, + "name": "tag", + "source": 22, + "value": "441" + }, + { + "begin": 3898, + "end": 3950, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 3986, + "end": 3995, + "name": "DUP6", + "source": 22 + }, + { + "begin": 3973, + "end": 3996, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 4015, + "end": 4033, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 4056, + "end": 4058, + "name": "DUP1", + "source": 22 + }, + { + "begin": 4048, + "end": 4054, + "name": "DUP3", + "source": 22 + }, + { + "begin": 4045, + "end": 4059, + "name": "GT", + "source": 22 + }, + { + "begin": 4042, + "end": 4076, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 4042, + "end": 4076, + "name": "PUSH [tag]", + "source": 22, + "value": "442" + }, + { + "begin": 4042, + "end": 4076, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 4072, + "end": 4073, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 4069, + "end": 4070, + "name": "DUP1", + "source": 22 + }, + { + "begin": 4062, + "end": 4074, + "name": "REVERT", + "source": 22 + }, + { + "begin": 4042, + "end": 4076, + "name": "tag", + "source": 22, + "value": "442" + }, + { + "begin": 4042, + "end": 4076, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 4111, + "end": 4201, + "name": "PUSH [tag]", + "source": 22, + "value": "443" + }, + { + "begin": 4193, + "end": 4200, + "name": "DUP10", + "source": 22 + }, + { + "begin": 4184, + "end": 4190, + "name": "DUP4", + "source": 22 + }, + { + "begin": 4173, + "end": 4182, + "name": "DUP11", + "source": 22 + }, + { + "begin": 4169, + "end": 4191, + "name": "ADD", + "source": 22 + }, + { + "begin": 4111, + "end": 4201, + "name": "PUSH [tag]", + "source": 22, + "value": "399" + }, + { + "begin": 4111, + "end": 4201, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 4111, + "end": 4201, + "name": "tag", + "source": 22, + "value": "443" + }, + { + "begin": 4111, + "end": 4201, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 4220, + "end": 4228, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 4220, + "end": 4228, + "name": "SWAP8", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4085, + "end": 4201, + "name": "SWAP6", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4302, + "end": 4304, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 4287, + "end": 4305, + "name": "DUP9", + "source": 22 + }, + { + "begin": 4287, + "end": 4305, + "name": "ADD", + "source": 22 + }, + { + "begin": 4274, + "end": 4306, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 4274, + "end": 4306, + "name": "SWAP5", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4359, + "end": 4361, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 4344, + "end": 4362, + "name": "DUP9", + "source": 22 + }, + { + "begin": 4344, + "end": 4362, + "name": "ADD", + "source": 22 + }, + { + "begin": 4331, + "end": 4363, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 4331, + "end": 4363, + "name": "SWAP2", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4375, + "end": 4391, + "name": "DUP1", + "source": 22 + }, + { + "begin": 4375, + "end": 4391, + "name": "DUP3", + "source": 22 + }, + { + "begin": 4375, + "end": 4391, + "name": "GT", + "source": 22 + }, + { + "begin": 4372, + "end": 4408, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 4372, + "end": 4408, + "name": "PUSH [tag]", + "source": 22, + "value": "444" + }, + { + "begin": 4372, + "end": 4408, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 4404, + "end": 4405, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 4401, + "end": 4402, + "name": "DUP1", + "source": 22 + }, + { + "begin": 4394, + "end": 4406, + "name": "REVERT", + "source": 22 + }, + { + "begin": 4372, + "end": 4408, + "name": "tag", + "source": 22, + "value": "444" + }, + { + "begin": 4372, + "end": 4408, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 4372, + "end": 4408, + "name": "POP", + "source": 22 + }, + { + "begin": 4443, + "end": 4503, + "name": "PUSH [tag]", + "source": 22, + "value": "445" + }, + { + "begin": 4495, + "end": 4502, + "name": "DUP9", + "source": 22 + }, + { + "begin": 4484, + "end": 4492, + "name": "DUP3", + "source": 22 + }, + { + "begin": 4473, + "end": 4482, + "name": "DUP10", + "source": 22 + }, + { + "begin": 4469, + "end": 4493, + "name": "ADD", + "source": 22 + }, + { + "begin": 4443, + "end": 4503, + "name": "PUSH [tag]", + "source": 22, + "value": "398" + }, + { + "begin": 4443, + "end": 4503, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 4443, + "end": 4503, + "name": "tag", + "source": 22, + "value": "445" + }, + { + "begin": 4443, + "end": 4503, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 3699, + "end": 4563, + "name": "SWAP7", + "source": 22 + }, + { + "begin": 3699, + "end": 4563, + "name": "SWAP10", + "source": 22 + }, + { + "begin": 3699, + "end": 4563, + "name": "SWAP6", + "source": 22 + }, + { + "begin": 3699, + "end": 4563, + "name": "SWAP9", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3699, + "end": 4563, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 3699, + "end": 4563, + "name": "SWAP7", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 4522, + "end": 4530, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 4522, + "end": 4530, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 4417, + "end": 4503, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 3699, + "end": 4563, + "name": "SWAP3", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 3699, + "end": 4563, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 5403, + "end": 5587, + "name": "tag", + "source": 22, + "value": "400" + }, + { + "begin": 5403, + "end": 5587, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 5455, + "end": 5532, + "name": "PUSH", + "source": 22, + "value": "4E487B7100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 5452, + "end": 5453, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 5445, + "end": 5533, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 5552, + "end": 5556, + "name": "PUSH", + "source": 22, + "value": "41" + }, + { + "begin": 5549, + "end": 5550, + "name": "PUSH", + "source": 22, + "value": "4" + }, + { + "begin": 5542, + "end": 5557, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 5576, + "end": 5580, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 5573, + "end": 5574, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 5566, + "end": 5581, + "name": "REVERT", + "source": 22 + }, + { + "begin": 5592, + "end": 6572, + "name": "tag", + "source": 22, + "value": "71" + }, + { + "begin": 5592, + "end": 6572, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 5660, + "end": 5666, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 5713, + "end": 5715, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 5701, + "end": 5710, + "name": "DUP3", + "source": 22 + }, + { + "begin": 5692, + "end": 5699, + "name": "DUP5", + "source": 22 + }, + { + "begin": 5688, + "end": 5711, + "name": "SUB", + "source": 22 + }, + { + "begin": 5684, + "end": 5716, + "name": "SLT", + "source": 22 + }, + { + "begin": 5681, + "end": 5733, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 5681, + "end": 5733, + "name": "PUSH [tag]", + "source": 22, + "value": "452" + }, + { + "begin": 5681, + "end": 5733, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 5729, + "end": 5730, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 5726, + "end": 5727, + "name": "DUP1", + "source": 22 + }, + { + "begin": 5719, + "end": 5731, + "name": "REVERT", + "source": 22 + }, + { + "begin": 5681, + "end": 5733, + "name": "tag", + "source": 22, + "value": "452" + }, + { + "begin": 5681, + "end": 5733, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 5769, + "end": 5778, + "name": "DUP2", + "source": 22 + }, + { + "begin": 5756, + "end": 5779, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 5798, + "end": 5816, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 5839, + "end": 5841, + "name": "DUP1", + "source": 22 + }, + { + "begin": 5831, + "end": 5837, + "name": "DUP3", + "source": 22 + }, + { + "begin": 5828, + "end": 5842, + "name": "GT", + "source": 22 + }, + { + "begin": 5825, + "end": 5859, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 5825, + "end": 5859, + "name": "PUSH [tag]", + "source": 22, + "value": "453" + }, + { + "begin": 5825, + "end": 5859, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 5855, + "end": 5856, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 5852, + "end": 5853, + "name": "DUP1", + "source": 22 + }, + { + "begin": 5845, + "end": 5857, + "name": "REVERT", + "source": 22 + }, + { + "begin": 5825, + "end": 5859, + "name": "tag", + "source": 22, + "value": "453" + }, + { + "begin": 5825, + "end": 5859, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 5893, + "end": 5899, + "name": "DUP2", + "source": 22 + }, + { + "begin": 5882, + "end": 5891, + "name": "DUP5", + "source": 22 + }, + { + "begin": 5878, + "end": 5900, + "name": "ADD", + "source": 22 + }, + { + "begin": 5868, + "end": 5900, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 5868, + "end": 5900, + "name": "POP", + "source": 22 + }, + { + "begin": 5938, + "end": 5945, + "name": "DUP5", + "source": 22 + }, + { + "begin": 5931, + "end": 5935, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 5927, + "end": 5929, + "name": "DUP4", + "source": 22 + }, + { + "begin": 5923, + "end": 5936, + "name": "ADD", + "source": 22 + }, + { + "begin": 5919, + "end": 5946, + "name": "SLT", + "source": 22 + }, + { + "begin": 5909, + "end": 5964, + "name": "PUSH [tag]", + "source": 22, + "value": "454" + }, + { + "begin": 5909, + "end": 5964, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 5960, + "end": 5961, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 5957, + "end": 5958, + "name": "DUP1", + "source": 22 + }, + { + "begin": 5950, + "end": 5962, + "name": "REVERT", + "source": 22 + }, + { + "begin": 5909, + "end": 5964, + "name": "tag", + "source": 22, + "value": "454" + }, + { + "begin": 5909, + "end": 5964, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 5996, + "end": 5998, + "name": "DUP2", + "source": 22 + }, + { + "begin": 5983, + "end": 5999, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 6018, + "end": 6020, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6014, + "end": 6016, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6011, + "end": 6021, + "name": "GT", + "source": 22 + }, + { + "begin": 6008, + "end": 6044, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 6008, + "end": 6044, + "name": "PUSH [tag]", + "source": 22, + "value": "456" + }, + { + "begin": 6008, + "end": 6044, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 6024, + "end": 6042, + "name": "PUSH [tag]", + "source": 22, + "value": "456" + }, + { + "begin": 6024, + "end": 6042, + "name": "PUSH [tag]", + "source": 22, + "value": "400" + }, + { + "begin": 6024, + "end": 6042, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 6024, + "end": 6042, + "name": "tag", + "source": 22, + "value": "456" + }, + { + "begin": 6024, + "end": 6042, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 6158, + "end": 6160, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 6152, + "end": 6161, + "name": "MLOAD", + "source": 22 + }, + { + "begin": 6220, + "end": 6224, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 6212, + "end": 6225, + "name": "DUP3", + "source": 22 + }, + { + "begin": 6212, + "end": 6225, + "name": "ADD", + "source": 22 + }, + { + "begin": 6063, + "end": 6129, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0" + }, + { + "begin": 6208, + "end": 6230, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 6208, + "end": 6230, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6208, + "end": 6230, + "name": "AND", + "source": 22 + }, + { + "begin": 6232, + "end": 6234, + "name": "PUSH", + "source": 22, + "value": "3F" + }, + { + "begin": 6204, + "end": 6235, + "name": "ADD", + "source": 22 + }, + { + "begin": 6200, + "end": 6240, + "name": "AND", + "source": 22 + }, + { + "begin": 6188, + "end": 6241, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6188, + "end": 6241, + "name": "ADD", + "source": 22 + }, + { + "begin": 6188, + "end": 6241, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 6256, + "end": 6274, + "name": "DUP4", + "source": 22 + }, + { + "begin": 6256, + "end": 6274, + "name": "DUP3", + "source": 22 + }, + { + "begin": 6256, + "end": 6274, + "name": "GT", + "source": 22 + }, + { + "begin": 6276, + "end": 6298, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6276, + "end": 6298, + "name": "DUP4", + "source": 22 + }, + { + "begin": 6276, + "end": 6298, + "name": "LT", + "source": 22 + }, + { + "begin": 6253, + "end": 6299, + "name": "OR", + "source": 22 + }, + { + "begin": 6250, + "end": 6322, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 6250, + "end": 6322, + "name": "PUSH [tag]", + "source": 22, + "value": "458" + }, + { + "begin": 6250, + "end": 6322, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 6302, + "end": 6320, + "name": "PUSH [tag]", + "source": 22, + "value": "458" + }, + { + "begin": 6302, + "end": 6320, + "name": "PUSH [tag]", + "source": 22, + "value": "400" + }, + { + "begin": 6302, + "end": 6320, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 6302, + "end": 6320, + "name": "tag", + "source": 22, + "value": "458" + }, + { + "begin": 6302, + "end": 6320, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 6342, + "end": 6352, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6338, + "end": 6340, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 6331, + "end": 6353, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 6377, + "end": 6379, + "name": "DUP3", + "source": 22 + }, + { + "begin": 6369, + "end": 6375, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6362, + "end": 6380, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 6417, + "end": 6424, + "name": "DUP8", + "source": 22 + }, + { + "begin": 6412, + "end": 6414, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 6407, + "end": 6409, + "name": "DUP5", + "source": 22 + }, + { + "begin": 6403, + "end": 6405, + "name": "DUP8", + "source": 22 + }, + { + "begin": 6399, + "end": 6410, + "name": "ADD", + "source": 22 + }, + { + "begin": 6395, + "end": 6415, + "name": "ADD", + "source": 22 + }, + { + "begin": 6392, + "end": 6425, + "name": "GT", + "source": 22 + }, + { + "begin": 6389, + "end": 6442, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 6389, + "end": 6442, + "name": "PUSH [tag]", + "source": 22, + "value": "459" + }, + { + "begin": 6389, + "end": 6442, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 6438, + "end": 6439, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 6435, + "end": 6436, + "name": "DUP1", + "source": 22 + }, + { + "begin": 6428, + "end": 6440, + "name": "REVERT", + "source": 22 + }, + { + "begin": 6389, + "end": 6442, + "name": "tag", + "source": 22, + "value": "459" + }, + { + "begin": 6389, + "end": 6442, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 6494, + "end": 6496, + "name": "DUP3", + "source": 22 + }, + { + "begin": 6489, + "end": 6491, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 6485, + "end": 6487, + "name": "DUP7", + "source": 22 + }, + { + "begin": 6481, + "end": 6492, + "name": "ADD", + "source": 22 + }, + { + "begin": 6476, + "end": 6478, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 6468, + "end": 6474, + "name": "DUP4", + "source": 22 + }, + { + "begin": 6464, + "end": 6479, + "name": "ADD", + "source": 22 + }, + { + "begin": 6451, + "end": 6497, + "name": "CALLDATACOPY", + "source": 22 + }, + { + "begin": 6539, + "end": 6540, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 6517, + "end": 6532, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 6517, + "end": 6532, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6517, + "end": 6532, + "name": "ADD", + "source": 22 + }, + { + "begin": 6534, + "end": 6536, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 6513, + "end": 6537, + "name": "ADD", + "source": 22 + }, + { + "begin": 6506, + "end": 6541, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 6506, + "end": 6541, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 6506, + "end": 6541, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 6506, + "end": 6541, + "name": "MSTORE", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6521, + "end": 6527, + "name": "SWAP6", + "source": 22 + }, + { + "begin": 5592, + "end": 6572, + "name": "SWAP5", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 5592, + "end": 6572, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 6808, + "end": 7079, + "name": "tag", + "source": 22, + "value": "89" + }, + { + "begin": 6808, + "end": 7079, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 6991, + "end": 6997, + "name": "DUP2", + "source": 22 + }, + { + "begin": 6983, + "end": 6989, + "name": "DUP4", + "source": 22 + }, + { + "begin": 6978, + "end": 6981, + "name": "DUP3", + "source": 22 + }, + { + "begin": 6965, + "end": 6998, + "name": "CALLDATACOPY", + "source": 22 + }, + { + "begin": 6947, + "end": 6950, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 7017, + "end": 7033, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 7017, + "end": 7033, + "name": "ADD", + "source": 22 + }, + { + "begin": 7042, + "end": 7055, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 7042, + "end": 7055, + "name": "DUP2", + "source": 22 + }, + { + "begin": 7042, + "end": 7055, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 7017, + "end": 7033, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 6808, + "end": 7079, + "name": "SWAP1", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 6808, + "end": 7079, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 7416, + "end": 7576, + "name": "tag", + "source": 22, + "value": "401" + }, + { + "begin": 7416, + "end": 7576, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 7481, + "end": 7501, + "name": "DUP1", + "source": 22 + }, + { + "begin": 7481, + "end": 7501, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 7537, + "end": 7550, + "name": "DUP1", + "source": 22 + }, + { + "begin": 7537, + "end": 7550, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 7530, + "end": 7551, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 7520, + "end": 7552, + "name": "DUP2", + "source": 22 + }, + { + "begin": 7520, + "end": 7552, + "name": "EQ", + "source": 22 + }, + { + "begin": 7510, + "end": 7570, + "name": "PUSH [tag]", + "source": 22, + "value": "464" + }, + { + "begin": 7510, + "end": 7570, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 7566, + "end": 7567, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 7563, + "end": 7564, + "name": "DUP1", + "source": 22 + }, + { + "begin": 7556, + "end": 7568, + "name": "REVERT", + "source": 22 + }, + { + "begin": 7510, + "end": 7570, + "name": "tag", + "source": 22, + "value": "464" + }, + { + "begin": 7510, + "end": 7570, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 7416, + "end": 7576, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 7416, + "end": 7576, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 7416, + "end": 7576, + "name": "POP", + "source": 22 + }, + { + "begin": 7416, + "end": 7576, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 7581, + "end": 7777, + "name": "tag", + "source": 22, + "value": "402" + }, + { + "begin": 7581, + "end": 7777, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 7649, + "end": 7669, + "name": "DUP1", + "source": 22 + }, + { + "begin": 7649, + "end": 7669, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 7709, + "end": 7751, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 7698, + "end": 7752, + "name": "DUP2", + "source": 22 + }, + { + "begin": 7698, + "end": 7752, + "name": "AND", + "source": 22 + }, + { + "begin": 7688, + "end": 7753, + "name": "DUP2", + "source": 22 + }, + { + "begin": 7688, + "end": 7753, + "name": "EQ", + "source": 22 + }, + { + "begin": 7678, + "end": 7771, + "name": "PUSH [tag]", + "source": 22, + "value": "464" + }, + { + "begin": 7678, + "end": 7771, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 7767, + "end": 7768, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 7764, + "end": 7765, + "name": "DUP1", + "source": 22 + }, + { + "begin": 7757, + "end": 7769, + "name": "REVERT", + "source": 22 + }, + { + "begin": 7782, + "end": 8107, + "name": "tag", + "source": 22, + "value": "403" + }, + { + "begin": 7782, + "end": 8107, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 7870, + "end": 7876, + "name": "DUP2", + "source": 22 + }, + { + "begin": 7865, + "end": 7868, + "name": "DUP4", + "source": 22 + }, + { + "begin": 7858, + "end": 7877, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 7922, + "end": 7928, + "name": "DUP2", + "source": 22 + }, + { + "begin": 7915, + "end": 7920, + "name": "DUP2", + "source": 22 + }, + { + "begin": 7908, + "end": 7912, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 7903, + "end": 7906, + "name": "DUP6", + "source": 22 + }, + { + "begin": 7899, + "end": 7913, + "name": "ADD", + "source": 22 + }, + { + "begin": 7886, + "end": 7929, + "name": "CALLDATACOPY", + "source": 22 + }, + { + "begin": 7886, + "end": 7929, + "name": "POP", + "source": 22 + }, + { + "begin": 7974, + "end": 7975, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 7967, + "end": 7971, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 7958, + "end": 7964, + "name": "DUP3", + "source": 22 + }, + { + "begin": 7953, + "end": 7956, + "name": "DUP5", + "source": 22 + }, + { + "begin": 7949, + "end": 7965, + "name": "ADD", + "source": 22 + }, + { + "begin": 7945, + "end": 7972, + "name": "ADD", + "source": 22 + }, + { + "begin": 7938, + "end": 7976, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 7840, + "end": 7843, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 8096, + "end": 8100, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 8026, + "end": 8092, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0" + }, + { + "begin": 8021, + "end": 8023, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 8013, + "end": 8019, + "name": "DUP5", + "source": 22 + }, + { + "begin": 8009, + "end": 8024, + "name": "ADD", + "source": 22 + }, + { + "begin": 8005, + "end": 8093, + "name": "AND", + "source": 22 + }, + { + "begin": 8000, + "end": 8003, + "name": "DUP5", + "source": 22 + }, + { + "begin": 7996, + "end": 8094, + "name": "ADD", + "source": 22 + }, + { + "begin": 7992, + "end": 8101, + "name": "ADD", + "source": 22 + }, + { + "begin": 7985, + "end": 8101, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 7985, + "end": 8101, + "name": "POP", + "source": 22 + }, + { + "begin": 7782, + "end": 8107, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 7782, + "end": 8107, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 7782, + "end": 8107, + "name": "POP", + "source": 22 + }, + { + "begin": 7782, + "end": 8107, + "name": "POP", + "source": 22 + }, + { + "begin": 7782, + "end": 8107, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 8112, + "end": 10140, + "name": "tag", + "source": 22, + "value": "404" + }, + { + "begin": 8112, + "end": 10140, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 8232, + "end": 8238, + "name": "DUP2", + "source": 22 + }, + { + "begin": 8227, + "end": 8230, + "name": "DUP4", + "source": 22 + }, + { + "begin": 8220, + "end": 8239, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 8202, + "end": 8205, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 8258, + "end": 8262, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 8299, + "end": 8301, + "name": "DUP1", + "source": 22 + }, + { + "begin": 8294, + "end": 8297, + "name": "DUP6", + "source": 22 + }, + { + "begin": 8290, + "end": 8302, + "name": "ADD", + "source": 22 + }, + { + "begin": 8324, + "end": 8335, + "name": "DUP1", + "source": 22 + }, + { + "begin": 8351, + "end": 8362, + "name": "DUP2", + "source": 22 + }, + { + "begin": 8344, + "end": 8362, + "name": "SWAP7", + "source": 22 + }, + { + "begin": 8344, + "end": 8362, + "name": "POP", + "source": 22 + }, + { + "begin": 8401, + "end": 8407, + "name": "DUP6", + "source": 22 + }, + { + "begin": 8398, + "end": 8399, + "name": "PUSH", + "source": 22, + "value": "5" + }, + { + "begin": 8394, + "end": 8408, + "name": "SHL", + "source": 22 + }, + { + "begin": 8387, + "end": 8392, + "name": "DUP2", + "source": 22 + }, + { + "begin": 8383, + "end": 8409, + "name": "ADD", + "source": 22 + }, + { + "begin": 8371, + "end": 8409, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 8371, + "end": 8409, + "name": "POP", + "source": 22 + }, + { + "begin": 8432, + "end": 8437, + "name": "DUP5", + "source": 22 + }, + { + "begin": 8455, + "end": 8456, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 8465, + "end": 10114, + "name": "tag", + "source": 22, + "value": "469" + }, + { + "begin": 8465, + "end": 10114, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 8479, + "end": 8485, + "name": "DUP8", + "source": 22 + }, + { + "begin": 8476, + "end": 8477, + "name": "DUP2", + "source": 22 + }, + { + "begin": 8473, + "end": 8486, + "name": "LT", + "source": 22 + }, + { + "begin": 8465, + "end": 10114, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 8465, + "end": 10114, + "name": "PUSH [tag]", + "source": 22, + "value": "471" + }, + { + "begin": 8465, + "end": 10114, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 8550, + "end": 8555, + "name": "DUP3", + "source": 22 + }, + { + "begin": 8544, + "end": 8548, + "name": "DUP5", + "source": 22 + }, + { + "begin": 8540, + "end": 8556, + "name": "SUB", + "source": 22 + }, + { + "begin": 8535, + "end": 8538, + "name": "DUP10", + "source": 22 + }, + { + "begin": 8528, + "end": 8557, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 8609, + "end": 8615, + "name": "DUP2", + "source": 22 + }, + { + "begin": 8596, + "end": 8616, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 8695, + "end": 8761, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41" + }, + { + "begin": 8687, + "end": 8692, + "name": "DUP9", + "source": 22 + }, + { + "begin": 8671, + "end": 8685, + "name": "CALLDATASIZE", + "source": 22 + }, + { + "begin": 8667, + "end": 8693, + "name": "SUB", + "source": 22 + }, + { + "begin": 8663, + "end": 8762, + "name": "ADD", + "source": 22 + }, + { + "begin": 8643, + "end": 8661, + "name": "DUP2", + "source": 22 + }, + { + "begin": 8639, + "end": 8763, + "name": "SLT", + "source": 22 + }, + { + "begin": 8629, + "end": 8781, + "name": "PUSH [tag]", + "source": 22, + "value": "472" + }, + { + "begin": 8629, + "end": 8781, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 8777, + "end": 8778, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 8774, + "end": 8775, + "name": "DUP1", + "source": 22 + }, + { + "begin": 8767, + "end": 8779, + "name": "REVERT", + "source": 22 + }, + { + "begin": 8629, + "end": 8781, + "name": "tag", + "source": 22, + "value": "472" + }, + { + "begin": 8629, + "end": 8781, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 8809, + "end": 8839, + "name": "DUP8", + "source": 22 + }, + { + "begin": 8809, + "end": 8839, + "name": "ADD", + "source": 22 + }, + { + "begin": 8862, + "end": 8866, + "name": "PUSH", + "source": 22, + "value": "C0" + }, + { + "begin": 8906, + "end": 8930, + "name": "PUSH [tag]", + "source": 22, + "value": "473" + }, + { + "begin": 8809, + "end": 8839, + "name": "DUP3", + "source": 22 + }, + { + "begin": 8906, + "end": 8930, + "name": "PUSH [tag]", + "source": 22, + "value": "401" + }, + { + "begin": 8906, + "end": 8930, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 8906, + "end": 8930, + "name": "tag", + "source": 22, + "value": "473" + }, + { + "begin": 8906, + "end": 8930, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 8899, + "end": 8931, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 8892, + "end": 8932, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 8886, + "end": 8890, + "name": "DUP7", + "source": 22 + }, + { + "begin": 8879, + "end": 8933, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 8982, + "end": 9015, + "name": "PUSH [tag]", + "source": 22, + "value": "474" + }, + { + "begin": 9011, + "end": 9013, + "name": "DUP8", + "source": 22 + }, + { + "begin": 9002, + "end": 9009, + "name": "DUP4", + "source": 22 + }, + { + "begin": 8998, + "end": 9014, + "name": "ADD", + "source": 22 + }, + { + "begin": 8982, + "end": 9015, + "name": "PUSH [tag]", + "source": 22, + "value": "401" + }, + { + "begin": 8982, + "end": 9015, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 8982, + "end": 9015, + "name": "tag", + "source": 22, + "value": "474" + }, + { + "begin": 8982, + "end": 9015, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 8975, + "end": 9016, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 8968, + "end": 9017, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 8953, + "end": 8966, + "name": "DUP7", + "source": 22 + }, + { + "begin": 8953, + "end": 8966, + "name": "DUP9", + "source": 22 + }, + { + "begin": 8953, + "end": 8966, + "name": "ADD", + "source": 22 + }, + { + "begin": 8946, + "end": 9018, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 9041, + "end": 9045, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 9093, + "end": 9109, + "name": "DUP3", + "source": 22 + }, + { + "begin": 9093, + "end": 9109, + "name": "DUP2", + "source": 22 + }, + { + "begin": 9093, + "end": 9109, + "name": "ADD", + "source": 22 + }, + { + "begin": 9080, + "end": 9110, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 9065, + "end": 9078, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 9065, + "end": 9078, + "name": "DUP8", + "source": 22 + }, + { + "begin": 9065, + "end": 9078, + "name": "ADD", + "source": 22 + }, + { + "begin": 9058, + "end": 9111, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 9134, + "end": 9138, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 9215, + "end": 9257, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 9177, + "end": 9213, + "name": "PUSH [tag]", + "source": 22, + "value": "475" + }, + { + "begin": 9196, + "end": 9212, + "name": "DUP3", + "source": 22 + }, + { + "begin": 9196, + "end": 9212, + "name": "DUP6", + "source": 22 + }, + { + "begin": 9196, + "end": 9212, + "name": "ADD", + "source": 22 + }, + { + "begin": 9177, + "end": 9213, + "name": "PUSH [tag]", + "source": 22, + "value": "402" + }, + { + "begin": 9177, + "end": 9213, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 9177, + "end": 9213, + "name": "tag", + "source": 22, + "value": "475" + }, + { + "begin": 9177, + "end": 9213, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 9173, + "end": 9258, + "name": "AND", + "source": 22 + }, + { + "begin": 9158, + "end": 9171, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 9158, + "end": 9171, + "name": "DUP8", + "source": 22 + }, + { + "begin": 9158, + "end": 9171, + "name": "ADD", + "source": 22 + }, + { + "begin": 9151, + "end": 9259, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 9282, + "end": 9286, + "name": "PUSH", + "source": 22, + "value": "80" + }, + { + "begin": 9334, + "end": 9350, + "name": "DUP3", + "source": 22 + }, + { + "begin": 9334, + "end": 9350, + "name": "DUP2", + "source": 22 + }, + { + "begin": 9334, + "end": 9350, + "name": "ADD", + "source": 22 + }, + { + "begin": 9321, + "end": 9351, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 9306, + "end": 9319, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 9306, + "end": 9319, + "name": "DUP8", + "source": 22 + }, + { + "begin": 9306, + "end": 9319, + "name": "ADD", + "source": 22 + }, + { + "begin": 9299, + "end": 9352, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 9375, + "end": 9379, + "name": "PUSH", + "source": 22, + "value": "A0" + }, + { + "begin": 9433, + "end": 9449, + "name": "DUP1", + "source": 22 + }, + { + "begin": 9433, + "end": 9449, + "name": "DUP4", + "source": 22 + }, + { + "begin": 9433, + "end": 9449, + "name": "ADD", + "source": 22 + }, + { + "begin": 9420, + "end": 9450, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 9507, + "end": 9521, + "name": "CALLDATASIZE", + "source": 22 + }, + { + "begin": 9503, + "end": 9531, + "name": "DUP5", + "source": 22 + }, + { + "begin": 9503, + "end": 9531, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 9503, + "end": 9531, + "name": "SUB", + "source": 22 + }, + { + "begin": 9533, + "end": 9599, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1" + }, + { + "begin": 9499, + "end": 9600, + "name": "ADD", + "source": 22 + }, + { + "begin": 9473, + "end": 9601, + "name": "DUP2", + "source": 22 + }, + { + "begin": 9473, + "end": 9601, + "name": "SLT", + "source": 22 + }, + { + "begin": 9463, + "end": 9619, + "name": "PUSH [tag]", + "source": 22, + "value": "476" + }, + { + "begin": 9463, + "end": 9619, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 9615, + "end": 9616, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 9612, + "end": 9613, + "name": "DUP1", + "source": 22 + }, + { + "begin": 9605, + "end": 9617, + "name": "REVERT", + "source": 22 + }, + { + "begin": 9463, + "end": 9619, + "name": "tag", + "source": 22, + "value": "476" + }, + { + "begin": 9463, + "end": 9619, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 9647, + "end": 9681, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 9647, + "end": 9681, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 9647, + "end": 9681, + "name": "ADD", + "source": 22 + }, + { + "begin": 9759, + "end": 9775, + "name": "DUP8", + "source": 22 + }, + { + "begin": 9759, + "end": 9775, + "name": "DUP2", + "source": 22 + }, + { + "begin": 9759, + "end": 9775, + "name": "ADD", + "source": 22 + }, + { + "begin": 9759, + "end": 9775, + "name": "SWAP3", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "SWAP1", + "source": -1 + }, + { + "begin": 9710, + "end": 9731, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 9804, + "end": 9822, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 9791, + "end": 9823, + "name": "DUP2", + "source": 22 + }, + { + "begin": 9791, + "end": 9823, + "name": "GT", + "source": 22 + }, + { + "begin": 9788, + "end": 9840, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 9788, + "end": 9840, + "name": "PUSH [tag]", + "source": 22, + "value": "477" + }, + { + "begin": 9788, + "end": 9840, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 9836, + "end": 9837, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 9833, + "end": 9834, + "name": "DUP1", + "source": 22 + }, + { + "begin": 9826, + "end": 9838, + "name": "REVERT", + "source": 22 + }, + { + "begin": 9788, + "end": 9840, + "name": "tag", + "source": 22, + "value": "477" + }, + { + "begin": 9788, + "end": 9840, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 9889, + "end": 9897, + "name": "DUP1", + "source": 22 + }, + { + "begin": 9873, + "end": 9887, + "name": "CALLDATASIZE", + "source": 22 + }, + { + "begin": 9869, + "end": 9898, + "name": "SUB", + "source": 22 + }, + { + "begin": 9860, + "end": 9867, + "name": "DUP5", + "source": 22 + }, + { + "begin": 9856, + "end": 9899, + "name": "SGT", + "source": 22 + }, + { + "begin": 9853, + "end": 9916, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 9853, + "end": 9916, + "name": "PUSH [tag]", + "source": 22, + "value": "478" + }, + { + "begin": 9853, + "end": 9916, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 9912, + "end": 9913, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 9909, + "end": 9910, + "name": "DUP1", + "source": 22 + }, + { + "begin": 9902, + "end": 9914, + "name": "REVERT", + "source": 22 + }, + { + "begin": 9853, + "end": 9916, + "name": "tag", + "source": 22, + "value": "478" + }, + { + "begin": 9853, + "end": 9916, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 9951, + "end": 9953, + "name": "DUP3", + "source": 22 + }, + { + "begin": 9946, + "end": 9948, + "name": "DUP3", + "source": 22 + }, + { + "begin": 9940, + "end": 9944, + "name": "DUP10", + "source": 22 + }, + { + "begin": 9936, + "end": 9949, + "name": "ADD", + "source": 22 + }, + { + "begin": 9929, + "end": 9954, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 9975, + "end": 10034, + "name": "PUSH [tag]", + "source": 22, + "value": "479" + }, + { + "begin": 10030, + "end": 10032, + "name": "DUP4", + "source": 22 + }, + { + "begin": 10024, + "end": 10028, + "name": "DUP10", + "source": 22 + }, + { + "begin": 10020, + "end": 10033, + "name": "ADD", + "source": 22 + }, + { + "begin": 10010, + "end": 10018, + "name": "DUP3", + "source": 22 + }, + { + "begin": 10001, + "end": 10008, + "name": "DUP7", + "source": 22 + }, + { + "begin": 9975, + "end": 10034, + "name": "PUSH [tag]", + "source": 22, + "value": "403" + }, + { + "begin": 9975, + "end": 10034, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 9975, + "end": 10034, + "name": "tag", + "source": 22, + "value": "479" + }, + { + "begin": 9975, + "end": 10034, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 10092, + "end": 10104, + "name": "SWAP13", + "source": 22 + }, + { + "begin": 10092, + "end": 10104, + "name": "DUP10", + "source": 22 + }, + { + "begin": 10092, + "end": 10104, + "name": "ADD", + "source": 22 + }, + { + "begin": 10092, + "end": 10104, + "name": "SWAP13", + "source": 22 + }, + { + "begin": 9967, + "end": 10034, + "name": "SWAP8", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 10057, + "end": 10072, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 10057, + "end": 10072, + "name": "DUP7", + "source": 22 + }, + { + "begin": 10057, + "end": 10072, + "name": "ADD", + "source": 22 + }, + { + "begin": 10057, + "end": 10072, + "name": "SWAP3", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 8501, + "end": 8502, + "name": "PUSH", + "source": 22, + "value": "1" + }, + { + "begin": 8494, + "end": 8503, + "name": "ADD", + "source": 22 + }, + { + "begin": 8465, + "end": 10114, + "name": "PUSH [tag]", + "source": 22, + "value": "469" + }, + { + "begin": 8465, + "end": 10114, + "name": "JUMP", + "source": 22 + }, + { + "begin": 8465, + "end": 10114, + "name": "tag", + "source": 22, + "value": "471" + }, + { + "begin": 8465, + "end": 10114, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 10130, + "end": 10134, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 10130, + "end": 10134, + "name": "SWAP8", + "source": 22 + }, + { + "begin": 8112, + "end": 10140, + "name": "SWAP7", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 8112, + "end": 10140, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 10145, + "end": 10739, + "name": "tag", + "source": 22, + "value": "101" + }, + { + "begin": 10145, + "end": 10739, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 10495, + "end": 10497, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 10484, + "end": 10493, + "name": "DUP2", + "source": 22 + }, + { + "begin": 10477, + "end": 10498, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 10534, + "end": 10535, + "name": "PUSH", + "source": 22, + "value": "5" + }, + { + "begin": 10529, + "end": 10531, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 10518, + "end": 10527, + "name": "DUP3", + "source": 22 + }, + { + "begin": 10514, + "end": 10532, + "name": "ADD", + "source": 22 + }, + { + "begin": 10507, + "end": 10536, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 10572, + "end": 10579, + "name": "PUSH", + "source": 22, + "value": "73656C663A000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 10567, + "end": 10569, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 10556, + "end": 10565, + "name": "DUP3", + "source": 22 + }, + { + "begin": 10552, + "end": 10570, + "name": "ADD", + "source": 22 + }, + { + "begin": 10545, + "end": 10580, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 10618, + "end": 10621, + "name": "PUSH", + "source": 22, + "value": "80" + }, + { + "begin": 10611, + "end": 10615, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 10600, + "end": 10609, + "name": "DUP3", + "source": 22 + }, + { + "begin": 10596, + "end": 10616, + "name": "ADD", + "source": 22 + }, + { + "begin": 10589, + "end": 10622, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 10458, + "end": 10462, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 10639, + "end": 10733, + "name": "PUSH [tag]", + "source": 22, + "value": "86" + }, + { + "begin": 10728, + "end": 10731, + "name": "PUSH", + "source": 22, + "value": "80" + }, + { + "begin": 10717, + "end": 10726, + "name": "DUP4", + "source": 22 + }, + { + "begin": 10713, + "end": 10732, + "name": "ADD", + "source": 22 + }, + { + "begin": 10705, + "end": 10711, + "name": "DUP5", + "source": 22 + }, + { + "begin": 10697, + "end": 10703, + "name": "DUP7", + "source": 22 + }, + { + "begin": 10639, + "end": 10733, + "name": "PUSH [tag]", + "source": 22, + "value": "404" + }, + { + "begin": 10639, + "end": 10733, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 10744, + "end": 11339, + "name": "tag", + "source": 22, + "value": "108" + }, + { + "begin": 10744, + "end": 11339, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 11094, + "end": 11096, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 11083, + "end": 11092, + "name": "DUP2", + "source": 22 + }, + { + "begin": 11076, + "end": 11097, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11133, + "end": 11134, + "name": "PUSH", + "source": 22, + "value": "6" + }, + { + "begin": 11128, + "end": 11130, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 11117, + "end": 11126, + "name": "DUP3", + "source": 22 + }, + { + "begin": 11113, + "end": 11131, + "name": "ADD", + "source": 22 + }, + { + "begin": 11106, + "end": 11135, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11171, + "end": 11179, + "name": "PUSH", + "source": 22, + "value": "67756573743A0000000000000000000000000000000000000000000000000000" + }, + { + "begin": 11166, + "end": 11168, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 11155, + "end": 11164, + "name": "DUP3", + "source": 22 + }, + { + "begin": 11151, + "end": 11169, + "name": "ADD", + "source": 22 + }, + { + "begin": 11144, + "end": 11180, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11218, + "end": 11221, + "name": "PUSH", + "source": 22, + "value": "80" + }, + { + "begin": 11211, + "end": 11215, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 11200, + "end": 11209, + "name": "DUP3", + "source": 22 + }, + { + "begin": 11196, + "end": 11216, + "name": "ADD", + "source": 22 + }, + { + "begin": 11189, + "end": 11222, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11057, + "end": 11061, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 11239, + "end": 11333, + "name": "PUSH [tag]", + "source": 22, + "value": "86" + }, + { + "begin": 11328, + "end": 11331, + "name": "PUSH", + "source": 22, + "value": "80" + }, + { + "begin": 11317, + "end": 11326, + "name": "DUP4", + "source": 22 + }, + { + "begin": 11313, + "end": 11332, + "name": "ADD", + "source": 22 + }, + { + "begin": 11305, + "end": 11311, + "name": "DUP5", + "source": 22 + }, + { + "begin": 11297, + "end": 11303, + "name": "DUP7", + "source": 22 + }, + { + "begin": 11239, + "end": 11333, + "name": "PUSH [tag]", + "source": 22, + "value": "404" + }, + { + "begin": 11239, + "end": 11333, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 11344, + "end": 11528, + "name": "tag", + "source": 22, + "value": "113" + }, + { + "begin": 11344, + "end": 11528, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 11396, + "end": 11473, + "name": "PUSH", + "source": 22, + "value": "4E487B7100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 11393, + "end": 11394, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 11386, + "end": 11474, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11493, + "end": 11497, + "name": "PUSH", + "source": 22, + "value": "32" + }, + { + "begin": 11490, + "end": 11491, + "name": "PUSH", + "source": 22, + "value": "4" + }, + { + "begin": 11483, + "end": 11498, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11517, + "end": 11521, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 11514, + "end": 11515, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 11507, + "end": 11522, + "name": "REVERT", + "source": 22 + }, + { + "begin": 11786, + "end": 12267, + "name": "tag", + "source": 22, + "value": "405" + }, + { + "begin": 11786, + "end": 12267, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 11827, + "end": 11830, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 11865, + "end": 11870, + "name": "DUP2", + "source": 22 + }, + { + "begin": 11859, + "end": 11871, + "name": "MLOAD", + "source": 22 + }, + { + "begin": 11892, + "end": 11898, + "name": "DUP1", + "source": 22 + }, + { + "begin": 11887, + "end": 11890, + "name": "DUP5", + "source": 22 + }, + { + "begin": 11880, + "end": 11899, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11917, + "end": 11918, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 11927, + "end": 12089, + "name": "tag", + "source": 22, + "value": "487" + }, + { + "begin": 11927, + "end": 12089, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 11941, + "end": 11947, + "name": "DUP2", + "source": 22 + }, + { + "begin": 11938, + "end": 11939, + "name": "DUP2", + "source": 22 + }, + { + "begin": 11935, + "end": 11948, + "name": "LT", + "source": 22 + }, + { + "begin": 11927, + "end": 12089, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 11927, + "end": 12089, + "name": "PUSH [tag]", + "source": 22, + "value": "489" + }, + { + "begin": 11927, + "end": 12089, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 12003, + "end": 12007, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 12059, + "end": 12072, + "name": "DUP2", + "source": 22 + }, + { + "begin": 12059, + "end": 12072, + "name": "DUP6", + "source": 22 + }, + { + "begin": 12059, + "end": 12072, + "name": "ADD", + "source": 22 + }, + { + "begin": 12055, + "end": 12077, + "name": "DUP2", + "source": 22 + }, + { + "begin": 12055, + "end": 12077, + "name": "ADD", + "source": 22 + }, + { + "begin": 12049, + "end": 12078, + "name": "MLOAD", + "source": 22 + }, + { + "begin": 12031, + "end": 12042, + "name": "DUP7", + "source": 22 + }, + { + "begin": 12031, + "end": 12042, + "name": "DUP4", + "source": 22 + }, + { + "begin": 12031, + "end": 12042, + "name": "ADD", + "source": 22 + }, + { + "begin": 12027, + "end": 12047, + "name": "DUP3", + "source": 22 + }, + { + "begin": 12027, + "end": 12047, + "name": "ADD", + "source": 22 + }, + { + "begin": 12020, + "end": 12079, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 11956, + "end": 11968, + "name": "ADD", + "source": 22 + }, + { + "begin": 11927, + "end": 12089, + "name": "PUSH [tag]", + "source": 22, + "value": "487" + }, + { + "begin": 11927, + "end": 12089, + "name": "JUMP", + "source": 22 + }, + { + "begin": 11927, + "end": 12089, + "name": "tag", + "source": 22, + "value": "489" + }, + { + "begin": 11927, + "end": 12089, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 11931, + "end": 11934, + "name": "POP", + "source": 22 + }, + { + "begin": 12134, + "end": 12135, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 12127, + "end": 12131, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 12118, + "end": 12124, + "name": "DUP3", + "source": 22 + }, + { + "begin": 12113, + "end": 12116, + "name": "DUP7", + "source": 22 + }, + { + "begin": 12109, + "end": 12125, + "name": "ADD", + "source": 22 + }, + { + "begin": 12105, + "end": 12132, + "name": "ADD", + "source": 22 + }, + { + "begin": 12098, + "end": 12136, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 12256, + "end": 12260, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 12186, + "end": 12252, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0" + }, + { + "begin": 12181, + "end": 12183, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 12173, + "end": 12179, + "name": "DUP4", + "source": 22 + }, + { + "begin": 12169, + "end": 12184, + "name": "ADD", + "source": 22 + }, + { + "begin": 12165, + "end": 12253, + "name": "AND", + "source": 22 + }, + { + "begin": 12160, + "end": 12163, + "name": "DUP6", + "source": 22 + }, + { + "begin": 12156, + "end": 12254, + "name": "ADD", + "source": 22 + }, + { + "begin": 12152, + "end": 12261, + "name": "ADD", + "source": 22 + }, + { + "begin": 12145, + "end": 12261, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 12145, + "end": 12261, + "name": "POP", + "source": 22 + }, + { + "begin": 12145, + "end": 12261, + "name": "POP", + "source": 22 + }, + { + "begin": 11786, + "end": 12267, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 11786, + "end": 12267, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 11786, + "end": 12267, + "name": "POP", + "source": 22 + }, + { + "begin": 11786, + "end": 12267, + "name": "POP", + "source": 22 + }, + { + "begin": 11786, + "end": 12267, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 12272, + "end": 12489, + "name": "tag", + "source": 22, + "value": "140" + }, + { + "begin": 12272, + "end": 12489, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 12419, + "end": 12421, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 12408, + "end": 12417, + "name": "DUP2", + "source": 22 + }, + { + "begin": 12401, + "end": 12422, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 12382, + "end": 12386, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 12439, + "end": 12483, + "name": "PUSH [tag]", + "source": 22, + "value": "82" + }, + { + "begin": 12479, + "end": 12481, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 12468, + "end": 12477, + "name": "DUP4", + "source": 22 + }, + { + "begin": 12464, + "end": 12482, + "name": "ADD", + "source": 22 + }, + { + "begin": 12456, + "end": 12462, + "name": "DUP5", + "source": 22 + }, + { + "begin": 12439, + "end": 12483, + "name": "PUSH [tag]", + "source": 22, + "value": "405" + }, + { + "begin": 12439, + "end": 12483, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 13090, + "end": 13477, + "name": "tag", + "source": 22, + "value": "164" + }, + { + "begin": 13090, + "end": 13477, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 13187, + "end": 13191, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 13245, + "end": 13256, + "name": "DUP3", + "source": 22 + }, + { + "begin": 13232, + "end": 13257, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 13335, + "end": 13401, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41" + }, + { + "begin": 13324, + "end": 13332, + "name": "DUP4", + "source": 22 + }, + { + "begin": 13308, + "end": 13322, + "name": "CALLDATASIZE", + "source": 22 + }, + { + "begin": 13304, + "end": 13333, + "name": "SUB", + "source": 22 + }, + { + "begin": 13300, + "end": 13402, + "name": "ADD", + "source": 22 + }, + { + "begin": 13280, + "end": 13298, + "name": "DUP2", + "source": 22 + }, + { + "begin": 13276, + "end": 13403, + "name": "SLT", + "source": 22 + }, + { + "begin": 13266, + "end": 13421, + "name": "PUSH [tag]", + "source": 22, + "value": "494" + }, + { + "begin": 13266, + "end": 13421, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 13417, + "end": 13418, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 13414, + "end": 13415, + "name": "DUP1", + "source": 22 + }, + { + "begin": 13407, + "end": 13419, + "name": "REVERT", + "source": 22 + }, + { + "begin": 13266, + "end": 13421, + "name": "tag", + "source": 22, + "value": "494" + }, + { + "begin": 13266, + "end": 13421, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 13438, + "end": 13471, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 13438, + "end": 13471, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 13438, + "end": 13471, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 13438, + "end": 13471, + "name": "ADD", + "source": 22 + }, + { + "begin": 13438, + "end": 13471, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 13090, + "end": 13477, + "name": "SWAP2", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 13090, + "end": 13477, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 13482, + "end": 13662, + "name": "tag", + "source": 22, + "value": "166" + }, + { + "begin": 13482, + "end": 13662, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 13538, + "end": 13544, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 13591, + "end": 13593, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 13579, + "end": 13588, + "name": "DUP3", + "source": 22 + }, + { + "begin": 13570, + "end": 13577, + "name": "DUP5", + "source": 22 + }, + { + "begin": 13566, + "end": 13589, + "name": "SUB", + "source": 22 + }, + { + "begin": 13562, + "end": 13594, + "name": "SLT", + "source": 22 + }, + { + "begin": 13559, + "end": 13611, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 13559, + "end": 13611, + "name": "PUSH [tag]", + "source": 22, + "value": "496" + }, + { + "begin": 13559, + "end": 13611, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 13607, + "end": 13608, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 13604, + "end": 13605, + "name": "DUP1", + "source": 22 + }, + { + "begin": 13597, + "end": 13609, + "name": "REVERT", + "source": 22 + }, + { + "begin": 13559, + "end": 13611, + "name": "tag", + "source": 22, + "value": "496" + }, + { + "begin": 13559, + "end": 13611, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 13630, + "end": 13656, + "name": "PUSH [tag]", + "source": 22, + "value": "82" + }, + { + "begin": 13646, + "end": 13655, + "name": "DUP3", + "source": 22 + }, + { + "begin": 13630, + "end": 13656, + "name": "PUSH [tag]", + "source": 22, + "value": "401" + }, + { + "begin": 13630, + "end": 13656, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 13991, + "end": 14177, + "name": "tag", + "source": 22, + "value": "174" + }, + { + "begin": 13991, + "end": 14177, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 14050, + "end": 14056, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 14103, + "end": 14105, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 14091, + "end": 14100, + "name": "DUP3", + "source": 22 + }, + { + "begin": 14082, + "end": 14089, + "name": "DUP5", + "source": 22 + }, + { + "begin": 14078, + "end": 14101, + "name": "SUB", + "source": 22 + }, + { + "begin": 14074, + "end": 14106, + "name": "SLT", + "source": 22 + }, + { + "begin": 14071, + "end": 14123, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 14071, + "end": 14123, + "name": "PUSH [tag]", + "source": 22, + "value": "500" + }, + { + "begin": 14071, + "end": 14123, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 14119, + "end": 14120, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 14116, + "end": 14117, + "name": "DUP1", + "source": 22 + }, + { + "begin": 14109, + "end": 14121, + "name": "REVERT", + "source": 22 + }, + { + "begin": 14071, + "end": 14123, + "name": "tag", + "source": 22, + "value": "500" + }, + { + "begin": 14071, + "end": 14123, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 14142, + "end": 14171, + "name": "PUSH [tag]", + "source": 22, + "value": "82" + }, + { + "begin": 14161, + "end": 14170, + "name": "DUP3", + "source": 22 + }, + { + "begin": 14142, + "end": 14171, + "name": "PUSH [tag]", + "source": 22, + "value": "402" + }, + { + "begin": 14142, + "end": 14171, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 14182, + "end": 14762, + "name": "tag", + "source": 22, + "value": "178" + }, + { + "begin": 14182, + "end": 14762, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 14259, + "end": 14263, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 14265, + "end": 14271, + "name": "DUP1", + "source": 22 + }, + { + "begin": 14325, + "end": 14336, + "name": "DUP4", + "source": 22 + }, + { + "begin": 14312, + "end": 14337, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 14415, + "end": 14481, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1" + }, + { + "begin": 14404, + "end": 14412, + "name": "DUP5", + "source": 22 + }, + { + "begin": 14388, + "end": 14402, + "name": "CALLDATASIZE", + "source": 22 + }, + { + "begin": 14384, + "end": 14413, + "name": "SUB", + "source": 22 + }, + { + "begin": 14380, + "end": 14482, + "name": "ADD", + "source": 22 + }, + { + "begin": 14360, + "end": 14378, + "name": "DUP2", + "source": 22 + }, + { + "begin": 14356, + "end": 14483, + "name": "SLT", + "source": 22 + }, + { + "begin": 14346, + "end": 14501, + "name": "PUSH [tag]", + "source": 22, + "value": "503" + }, + { + "begin": 14346, + "end": 14501, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 14497, + "end": 14498, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 14494, + "end": 14495, + "name": "DUP1", + "source": 22 + }, + { + "begin": 14487, + "end": 14499, + "name": "REVERT", + "source": 22 + }, + { + "begin": 14346, + "end": 14501, + "name": "tag", + "source": 22, + "value": "503" + }, + { + "begin": 14346, + "end": 14501, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 14524, + "end": 14557, + "name": "DUP4", + "source": 22 + }, + { + "begin": 14524, + "end": 14557, + "name": "ADD", + "source": 22 + }, + { + "begin": 14576, + "end": 14596, + "name": "DUP1", + "source": 22 + }, + { + "begin": 14576, + "end": 14596, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 14576, + "end": 14596, + "name": "SWAP2", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 14619, + "end": 14637, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 14608, + "end": 14638, + "name": "DUP3", + "source": 22 + }, + { + "begin": 14608, + "end": 14638, + "name": "GT", + "source": 22 + }, + { + "begin": 14605, + "end": 14655, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 14605, + "end": 14655, + "name": "PUSH [tag]", + "source": 22, + "value": "504" + }, + { + "begin": 14605, + "end": 14655, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 14651, + "end": 14652, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 14648, + "end": 14649, + "name": "DUP1", + "source": 22 + }, + { + "begin": 14641, + "end": 14653, + "name": "REVERT", + "source": 22 + }, + { + "begin": 14605, + "end": 14655, + "name": "tag", + "source": 22, + "value": "504" + }, + { + "begin": 14605, + "end": 14655, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 14684, + "end": 14688, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 14672, + "end": 14689, + "name": "ADD", + "source": 22 + }, + { + "begin": 14672, + "end": 14689, + "name": "SWAP2", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 14715, + "end": 14729, + "name": "CALLDATASIZE", + "source": 22 + }, + { + "begin": 14711, + "end": 14738, + "name": "DUP2", + "source": 22 + }, + { + "begin": 14711, + "end": 14738, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 14711, + "end": 14738, + "name": "SUB", + "source": 22 + }, + { + "begin": 14701, + "end": 14739, + "name": "DUP3", + "source": 22 + }, + { + "begin": 14701, + "end": 14739, + "name": "SGT", + "source": 22 + }, + { + "begin": 14698, + "end": 14756, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 14698, + "end": 14756, + "name": "PUSH [tag]", + "source": 22, + "value": "417" + }, + { + "begin": 14698, + "end": 14756, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 14752, + "end": 14753, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 14749, + "end": 14750, + "name": "DUP1", + "source": 22 + }, + { + "begin": 14742, + "end": 14754, + "name": "REVERT", + "source": 22 + }, + { + "begin": 14767, + "end": 14951, + "name": "tag", + "source": 22, + "value": "406" + }, + { + "begin": 14767, + "end": 14951, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 14819, + "end": 14896, + "name": "PUSH", + "source": 22, + "value": "4E487B7100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 14816, + "end": 14817, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 14809, + "end": 14897, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 14916, + "end": 14920, + "name": "PUSH", + "source": 22, + "value": "11" + }, + { + "begin": 14913, + "end": 14914, + "name": "PUSH", + "source": 22, + "value": "4" + }, + { + "begin": 14906, + "end": 14921, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 14940, + "end": 14944, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 14937, + "end": 14938, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 14930, + "end": 14945, + "name": "REVERT", + "source": 22 + }, + { + "begin": 14956, + "end": 15151, + "name": "tag", + "source": 22, + "value": "189" + }, + { + "begin": 14956, + "end": 15151, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 14995, + "end": 14998, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 15026, + "end": 15092, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 15019, + "end": 15024, + "name": "DUP3", + "source": 22 + }, + { + "begin": 15016, + "end": 15093, + "name": "SUB", + "source": 22 + }, + { + "begin": 15013, + "end": 15116, + "name": "PUSH [tag]", + "source": 22, + "value": "509" + }, + { + "begin": 15013, + "end": 15116, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 15096, + "end": 15114, + "name": "PUSH [tag]", + "source": 22, + "value": "509" + }, + { + "begin": 15096, + "end": 15114, + "name": "PUSH [tag]", + "source": 22, + "value": "406" + }, + { + "begin": 15096, + "end": 15114, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 15096, + "end": 15114, + "name": "tag", + "source": 22, + "value": "509" + }, + { + "begin": 15096, + "end": 15114, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 15143, + "end": 15144, + "name": "PUSH", + "source": 22, + "value": "1" + }, + { + "begin": 15132, + "end": 15145, + "name": "ADD", + "source": 22 + }, + { + "begin": 15132, + "end": 15145, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 14956, + "end": 15151, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 15156, + "end": 15487, + "name": "tag", + "source": 22, + "value": "193" + }, + { + "begin": 15156, + "end": 15487, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 15261, + "end": 15270, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 15272, + "end": 15281, + "name": "DUP1", + "source": 22 + }, + { + "begin": 15314, + "end": 15322, + "name": "DUP6", + "source": 22 + }, + { + "begin": 15302, + "end": 15312, + "name": "DUP6", + "source": 22 + }, + { + "begin": 15299, + "end": 15323, + "name": "GT", + "source": 22 + }, + { + "begin": 15296, + "end": 15340, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 15296, + "end": 15340, + "name": "PUSH [tag]", + "source": 22, + "value": "511" + }, + { + "begin": 15296, + "end": 15340, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 15336, + "end": 15337, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 15333, + "end": 15334, + "name": "DUP1", + "source": 22 + }, + { + "begin": 15326, + "end": 15338, + "name": "REVERT", + "source": 22 + }, + { + "begin": 15296, + "end": 15340, + "name": "tag", + "source": 22, + "value": "511" + }, + { + "begin": 15296, + "end": 15340, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 15365, + "end": 15371, + "name": "DUP4", + "source": 22 + }, + { + "begin": 15355, + "end": 15363, + "name": "DUP7", + "source": 22 + }, + { + "begin": 15352, + "end": 15372, + "name": "GT", + "source": 22 + }, + { + "begin": 15349, + "end": 15389, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 15349, + "end": 15389, + "name": "PUSH [tag]", + "source": 22, + "value": "512" + }, + { + "begin": 15349, + "end": 15389, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 15385, + "end": 15386, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 15382, + "end": 15383, + "name": "DUP1", + "source": 22 + }, + { + "begin": 15375, + "end": 15387, + "name": "REVERT", + "source": 22 + }, + { + "begin": 15349, + "end": 15389, + "name": "tag", + "source": 22, + "value": "512" + }, + { + "begin": 15349, + "end": 15389, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 15411, + "end": 15434, + "name": "DUP3", + "source": 22 + }, + { + "begin": 15411, + "end": 15434, + "name": "ADD", + "source": 22 + }, + { + "begin": 15411, + "end": 15434, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 15456, + "end": 15481, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 15456, + "end": 15481, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 15456, + "end": 15481, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 15456, + "end": 15481, + "name": "SUB", + "source": 22 + }, + { + "begin": 15456, + "end": 15481, + "name": "SWAP2", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 15156, + "end": 15487, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 15492, + "end": 15617, + "name": "tag", + "source": 22, + "value": "211" + }, + { + "begin": 15492, + "end": 15617, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 15557, + "end": 15566, + "name": "DUP1", + "source": 22 + }, + { + "begin": 15557, + "end": 15566, + "name": "DUP3", + "source": 22 + }, + { + "begin": 15557, + "end": 15566, + "name": "ADD", + "source": 22 + }, + { + "begin": 15578, + "end": 15588, + "name": "DUP1", + "source": 22 + }, + { + "begin": 15578, + "end": 15588, + "name": "DUP3", + "source": 22 + }, + { + "begin": 15578, + "end": 15588, + "name": "GT", + "source": 22 + }, + { + "begin": 15575, + "end": 15611, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 15575, + "end": 15611, + "name": "PUSH [tag]", + "source": 22, + "value": "80" + }, + { + "begin": 15575, + "end": 15611, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 15591, + "end": 15609, + "name": "PUSH [tag]", + "source": 22, + "value": "80" + }, + { + "begin": 15591, + "end": 15609, + "name": "PUSH [tag]", + "source": 22, + "value": "406" + }, + { + "begin": 15591, + "end": 15609, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 15622, + "end": 16014, + "name": "tag", + "source": 22, + "value": "217" + }, + { + "begin": 15622, + "end": 16014, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 15841, + "end": 15843, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 15830, + "end": 15839, + "name": "DUP2", + "source": 22 + }, + { + "begin": 15823, + "end": 15844, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 15804, + "end": 15808, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 15861, + "end": 15922, + "name": "PUSH [tag]", + "source": 22, + "value": "517" + }, + { + "begin": 15918, + "end": 15920, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 15907, + "end": 15916, + "name": "DUP4", + "source": 22 + }, + { + "begin": 15903, + "end": 15921, + "name": "ADD", + "source": 22 + }, + { + "begin": 15895, + "end": 15901, + "name": "DUP7", + "source": 22 + }, + { + "begin": 15887, + "end": 15893, + "name": "DUP9", + "source": 22 + }, + { + "begin": 15861, + "end": 15922, + "name": "PUSH [tag]", + "source": 22, + "value": "403" + }, + { + "begin": 15861, + "end": 15922, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 15861, + "end": 15922, + "name": "tag", + "source": 22, + "value": "517" + }, + { + "begin": 15861, + "end": 15922, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 15953, + "end": 15955, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 15938, + "end": 15956, + "name": "DUP4", + "source": 22 + }, + { + "begin": 15938, + "end": 15956, + "name": "ADD", + "source": 22 + }, + { + "begin": 15931, + "end": 15965, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 15931, + "end": 15965, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 15931, + "end": 15965, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 15931, + "end": 15965, + "name": "MSTORE", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 15996, + "end": 15998, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 15981, + "end": 15999, + "name": "ADD", + "source": 22 + }, + { + "begin": 15974, + "end": 16008, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 15853, + "end": 15922, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 15622, + "end": 16014, + "name": "SWAP2", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 15622, + "end": 16014, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 16525, + "end": 16813, + "name": "tag", + "source": 22, + "value": "246" + }, + { + "begin": 16525, + "end": 16813, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 16700, + "end": 16706, + "name": "DUP3", + "source": 22 + }, + { + "begin": 16689, + "end": 16698, + "name": "DUP2", + "source": 22 + }, + { + "begin": 16682, + "end": 16707, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 16743, + "end": 16745, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 16738, + "end": 16740, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 16727, + "end": 16736, + "name": "DUP3", + "source": 22 + }, + { + "begin": 16723, + "end": 16741, + "name": "ADD", + "source": 22 + }, + { + "begin": 16716, + "end": 16746, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 16663, + "end": 16667, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 16763, + "end": 16807, + "name": "PUSH [tag]", + "source": 22, + "value": "86" + }, + { + "begin": 16803, + "end": 16805, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 16792, + "end": 16801, + "name": "DUP4", + "source": 22 + }, + { + "begin": 16788, + "end": 16806, + "name": "ADD", + "source": 22 + }, + { + "begin": 16780, + "end": 16786, + "name": "DUP5", + "source": 22 + }, + { + "begin": 16763, + "end": 16807, + "name": "PUSH [tag]", + "source": 22, + "value": "405" + }, + { + "begin": 16763, + "end": 16807, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 16818, + "end": 17259, + "name": "tag", + "source": 22, + "value": "278" + }, + { + "begin": 16818, + "end": 17259, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 17037, + "end": 17043, + "name": "DUP5", + "source": 22 + }, + { + "begin": 17026, + "end": 17035, + "name": "DUP2", + "source": 22 + }, + { + "begin": 17019, + "end": 17044, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 17092, + "end": 17134, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 17084, + "end": 17090, + "name": "DUP5", + "source": 22 + }, + { + "begin": 17080, + "end": 17135, + "name": "AND", + "source": 22 + }, + { + "begin": 17075, + "end": 17077, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 17064, + "end": 17073, + "name": "DUP3", + "source": 22 + }, + { + "begin": 17060, + "end": 17078, + "name": "ADD", + "source": 22 + }, + { + "begin": 17053, + "end": 17136, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 17172, + "end": 17174, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 17167, + "end": 17169, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 17156, + "end": 17165, + "name": "DUP3", + "source": 22 + }, + { + "begin": 17152, + "end": 17170, + "name": "ADD", + "source": 22 + }, + { + "begin": 17145, + "end": 17175, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 17000, + "end": 17004, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 17192, + "end": 17253, + "name": "PUSH [tag]", + "source": 22, + "value": "523" + }, + { + "begin": 17249, + "end": 17251, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 17238, + "end": 17247, + "name": "DUP4", + "source": 22 + }, + { + "begin": 17234, + "end": 17252, + "name": "ADD", + "source": 22 + }, + { + "begin": 17226, + "end": 17232, + "name": "DUP5", + "source": 22 + }, + { + "begin": 17218, + "end": 17224, + "name": "DUP7", + "source": 22 + }, + { + "begin": 17192, + "end": 17253, + "name": "PUSH [tag]", + "source": 22, + "value": "403" + }, + { + "begin": 17192, + "end": 17253, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 17192, + "end": 17253, + "name": "tag", + "source": 22, + "value": "523" + }, + { + "begin": 17192, + "end": 17253, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 17184, + "end": 17253, + "name": "SWAP7", + "source": 22 + }, + { + "begin": 16818, + "end": 17259, + "name": "SWAP6", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 16818, + "end": 17259, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 17264, + "end": 17508, + "name": "tag", + "source": 22, + "value": "333" + }, + { + "begin": 17264, + "end": 17508, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 17421, + "end": 17423, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 17410, + "end": 17419, + "name": "DUP2", + "source": 22 + }, + { + "begin": 17403, + "end": 17424, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 17384, + "end": 17388, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 17441, + "end": 17502, + "name": "PUSH [tag]", + "source": 22, + "value": "86" + }, + { + "begin": 17498, + "end": 17500, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 17487, + "end": 17496, + "name": "DUP4", + "source": 22 + }, + { + "begin": 17483, + "end": 17501, + "name": "ADD", + "source": 22 + }, + { + "begin": 17475, + "end": 17481, + "name": "DUP5", + "source": 22 + }, + { + "begin": 17467, + "end": 17473, + "name": "DUP7", + "source": 22 + }, + { + "begin": 17441, + "end": 17502, + "name": "PUSH [tag]", + "source": 22, + "value": "403" + }, + { + "begin": 17441, + "end": 17502, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 17513, + "end": 17641, + "name": "tag", + "source": 22, + "value": "336" + }, + { + "begin": 17513, + "end": 17641, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 17580, + "end": 17589, + "name": "DUP2", + "source": 22 + }, + { + "begin": 17580, + "end": 17589, + "name": "DUP2", + "source": 22 + }, + { + "begin": 17580, + "end": 17589, + "name": "SUB", + "source": 22 + }, + { + "begin": 17601, + "end": 17612, + "name": "DUP2", + "source": 22 + }, + { + "begin": 17601, + "end": 17612, + "name": "DUP2", + "source": 22 + }, + { + "begin": 17601, + "end": 17612, + "name": "GT", + "source": 22 + }, + { + "begin": 17598, + "end": 17635, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 17598, + "end": 17635, + "name": "PUSH [tag]", + "source": 22, + "value": "80" + }, + { + "begin": 17598, + "end": 17635, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 17615, + "end": 17633, + "name": "PUSH [tag]", + "source": 22, + "value": "80" + }, + { + "begin": 17615, + "end": 17633, + "name": "PUSH [tag]", + "source": 22, + "value": "406" + }, + { + "begin": 17615, + "end": 17633, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 17646, + "end": 17961, + "name": "tag", + "source": 22, + "value": "344" + }, + { + "begin": 17646, + "end": 17961, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 17831, + "end": 17833, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 17820, + "end": 17829, + "name": "DUP2", + "source": 22 + }, + { + "begin": 17813, + "end": 17834, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 17794, + "end": 17798, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 17851, + "end": 17912, + "name": "PUSH [tag]", + "source": 22, + "value": "530" + }, + { + "begin": 17908, + "end": 17910, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 17897, + "end": 17906, + "name": "DUP4", + "source": 22 + }, + { + "begin": 17893, + "end": 17911, + "name": "ADD", + "source": 22 + }, + { + "begin": 17885, + "end": 17891, + "name": "DUP6", + "source": 22 + }, + { + "begin": 17877, + "end": 17883, + "name": "DUP8", + "source": 22 + }, + { + "begin": 17851, + "end": 17912, + "name": "PUSH [tag]", + "source": 22, + "value": "403" + }, + { + "begin": 17851, + "end": 17912, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 17851, + "end": 17912, + "name": "tag", + "source": 22, + "value": "530" + }, + { + "begin": 17851, + "end": 17912, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 17843, + "end": 17912, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 17843, + "end": 17912, + "name": "POP", + "source": 22 + }, + { + "begin": 17948, + "end": 17954, + "name": "DUP3", + "source": 22 + }, + { + "begin": 17943, + "end": 17945, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 17932, + "end": 17941, + "name": "DUP4", + "source": 22 + }, + { + "begin": 17928, + "end": 17946, + "name": "ADD", + "source": 22 + }, + { + "begin": 17921, + "end": 17955, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 17646, + "end": 17961, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 17646, + "end": 17961, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 17646, + "end": 17961, + "name": "POP", + "source": 22 + }, + { + "begin": 17646, + "end": 17961, + "name": "POP", + "source": 22 + }, + { + "begin": 17646, + "end": 17961, + "name": "POP", + "source": 22 + }, + { + "begin": 17646, + "end": 17961, + "name": "POP", + "source": 22 + }, + { + "begin": 17646, + "end": 17961, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 17966, + "end": 18290, + "name": "tag", + "source": 22, + "value": "348" + }, + { + "begin": 17966, + "end": 18290, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 18149, + "end": 18151, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 18138, + "end": 18147, + "name": "DUP2", + "source": 22 + }, + { + "begin": 18131, + "end": 18152, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 18112, + "end": 18116, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 18169, + "end": 18230, + "name": "PUSH [tag]", + "source": 22, + "value": "532" + }, + { + "begin": 18226, + "end": 18228, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 18215, + "end": 18224, + "name": "DUP4", + "source": 22 + }, + { + "begin": 18211, + "end": 18229, + "name": "ADD", + "source": 22 + }, + { + "begin": 18203, + "end": 18209, + "name": "DUP6", + "source": 22 + }, + { + "begin": 18195, + "end": 18201, + "name": "DUP8", + "source": 22 + }, + { + "begin": 18169, + "end": 18230, + "name": "PUSH [tag]", + "source": 22, + "value": "403" + }, + { + "begin": 18169, + "end": 18230, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 18169, + "end": 18230, + "name": "tag", + "source": 22, + "value": "532" + }, + { + "begin": 18169, + "end": 18230, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 18161, + "end": 18230, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 18161, + "end": 18230, + "name": "POP", + "source": 22 + }, + { + "begin": 18278, + "end": 18282, + "name": "PUSH", + "source": 22, + "value": "FF" + }, + { + "begin": 18270, + "end": 18276, + "name": "DUP4", + "source": 22 + }, + { + "begin": 18266, + "end": 18283, + "name": "AND", + "source": 22 + }, + { + "begin": 18261, + "end": 18263, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 18250, + "end": 18259, + "name": "DUP4", + "source": 22 + }, + { + "begin": 18246, + "end": 18264, + "name": "ADD", + "source": 22 + }, + { + "begin": 18239, + "end": 18284, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 17966, + "end": 18290, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 17966, + "end": 18290, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 17966, + "end": 18290, + "name": "POP", + "source": 22 + }, + { + "begin": 17966, + "end": 18290, + "name": "POP", + "source": 22 + }, + { + "begin": 17966, + "end": 18290, + "name": "POP", + "source": 22 + }, + { + "begin": 17966, + "end": 18290, + "name": "POP", + "source": 22 + }, + { + "begin": 17966, + "end": 18290, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 19083, + "end": 19479, + "name": "tag", + "source": 22, + "value": "363" + }, + { + "begin": 19083, + "end": 19479, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 19290, + "end": 19292, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 19279, + "end": 19288, + "name": "DUP2", + "source": 22 + }, + { + "begin": 19272, + "end": 19293, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 19253, + "end": 19257, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 19310, + "end": 19371, + "name": "PUSH [tag]", + "source": 22, + "value": "536" + }, + { + "begin": 19367, + "end": 19369, + "name": "PUSH", + "source": 22, + "value": "60" + }, + { + "begin": 19356, + "end": 19365, + "name": "DUP4", + "source": 22 + }, + { + "begin": 19352, + "end": 19370, + "name": "ADD", + "source": 22 + }, + { + "begin": 19344, + "end": 19350, + "name": "DUP7", + "source": 22 + }, + { + "begin": 19336, + "end": 19342, + "name": "DUP9", + "source": 22 + }, + { + "begin": 19310, + "end": 19371, + "name": "PUSH [tag]", + "source": 22, + "value": "403" + }, + { + "begin": 19310, + "end": 19371, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 19310, + "end": 19371, + "name": "tag", + "source": 22, + "value": "536" + }, + { + "begin": 19310, + "end": 19371, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 19402, + "end": 19404, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 19387, + "end": 19405, + "name": "DUP4", + "source": 22 + }, + { + "begin": 19387, + "end": 19405, + "name": "ADD", + "source": 22 + }, + { + "begin": 19380, + "end": 19414, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 19380, + "end": 19414, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 19380, + "end": 19414, + "name": "SWAP5", + "source": 22 + }, + { + "begin": 19380, + "end": 19414, + "name": "MSTORE", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 19457, + "end": 19471, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 19457, + "end": 19471, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 19450, + "end": 19472, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 19445, + "end": 19447, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 19430, + "end": 19448, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 19430, + "end": 19448, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 19430, + "end": 19448, + "name": "ADD", + "source": 22 + }, + { + "begin": 19423, + "end": 19473, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 19302, + "end": 19371, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 19083, + "end": 19479, + "name": "SWAP2", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 19083, + "end": 19479, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 19484, + "end": 19805, + "name": "tag", + "source": 22, + "value": "379" + }, + { + "begin": 19484, + "end": 19805, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 19675, + "end": 19681, + "name": "DUP4", + "source": 22 + }, + { + "begin": 19664, + "end": 19673, + "name": "DUP2", + "source": 22 + }, + { + "begin": 19657, + "end": 19682, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 19718, + "end": 19720, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 19713, + "end": 19715, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 19702, + "end": 19711, + "name": "DUP3", + "source": 22 + }, + { + "begin": 19698, + "end": 19716, + "name": "ADD", + "source": 22 + }, + { + "begin": 19691, + "end": 19721, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 19638, + "end": 19642, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 19738, + "end": 19799, + "name": "PUSH [tag]", + "source": 22, + "value": "538" + }, + { + "begin": 19795, + "end": 19797, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 19784, + "end": 19793, + "name": "DUP4", + "source": 22 + }, + { + "begin": 19780, + "end": 19798, + "name": "ADD", + "source": 22 + }, + { + "begin": 19772, + "end": 19778, + "name": "DUP5", + "source": 22 + }, + { + "begin": 19764, + "end": 19770, + "name": "DUP7", + "source": 22 + }, + { + "begin": 19738, + "end": 19799, + "name": "PUSH [tag]", + "source": 22, + "value": "403" + }, + { + "begin": 19738, + "end": 19799, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 19738, + "end": 19799, + "name": "tag", + "source": 22, + "value": "538" + }, + { + "begin": 19738, + "end": 19799, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 19730, + "end": 19799, + "name": "SWAP6", + "source": 22 + }, + { + "begin": 19484, + "end": 19805, + "name": "SWAP5", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 19484, + "end": 19805, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 19810, + "end": 20059, + "name": "tag", + "source": 22, + "value": "383" + }, + { + "begin": 19810, + "end": 20059, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 19879, + "end": 19885, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 19932, + "end": 19934, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 19920, + "end": 19929, + "name": "DUP3", + "source": 22 + }, + { + "begin": 19911, + "end": 19918, + "name": "DUP5", + "source": 22 + }, + { + "begin": 19907, + "end": 19930, + "name": "SUB", + "source": 22 + }, + { + "begin": 19903, + "end": 19935, + "name": "SLT", + "source": 22 + }, + { + "begin": 19900, + "end": 19952, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 19900, + "end": 19952, + "name": "PUSH [tag]", + "source": 22, + "value": "540" + }, + { + "begin": 19900, + "end": 19952, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 19948, + "end": 19949, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 19945, + "end": 19946, + "name": "DUP1", + "source": 22 + }, + { + "begin": 19938, + "end": 19950, + "name": "REVERT", + "source": 22 + }, + { + "begin": 19900, + "end": 19952, + "name": "tag", + "source": 22, + "value": "540" + }, + { + "begin": 19900, + "end": 19952, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 19980, + "end": 19989, + "name": "DUP2", + "source": 22 + }, + { + "begin": 19974, + "end": 19990, + "name": "MLOAD", + "source": 22 + }, + { + "begin": 19999, + "end": 20029, + "name": "PUSH [tag]", + "source": 22, + "value": "82" + }, + { + "begin": 20023, + "end": 20028, + "name": "DUP2", + "source": 22 + }, + { + "begin": 19999, + "end": 20029, + "name": "PUSH [tag]", + "source": 22, + "value": "397" + }, + { + "begin": 19999, + "end": 20029, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": { + "SET_IMAGE_HASH_TYPE_HASH()": "57c56d6b", + "createContract(bytes)": "90042baf", + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": "7a9a1628", + "isValidSignature(bytes,bytes)": "20c13b0b", + "isValidSignature(bytes32,bytes)": "1626ba7e", + "nonce()": "affed0e0", + "readNonce(uint256)": "8c3f5563", + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": "61c2926c", + "signatureRecovery(bytes32,bytes)": "853c5068", + "supportsInterface(bytes4)": "01ffc9a7", + "updateImageHash(bytes32)": "29561426" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_space\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_current\",\"type\":\"uint256\"}],\"name\":\"BadNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"CreateFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"DelegateCallNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ImageHashIsZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidNestedSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"InvalidSValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_flag\",\"type\":\"uint256\"}],\"name\":\"InvalidSignatureFlag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes1\",\"name\":\"_type\",\"type\":\"bytes1\"}],\"name\":\"InvalidSignatureType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_v\",\"type\":\"uint256\"}],\"name\":\"InvalidVValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_weight\",\"type\":\"uint256\"}],\"name\":\"LowWeightChainedSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_requested\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_available\",\"type\":\"uint256\"}],\"name\":\"NotEnoughGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDelegatecall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_self\",\"type\":\"address\"}],\"name\":\"OnlySelfAuth\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"SignerIsAddress0\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_recoverMode\",\"type\":\"bool\"}],\"name\":\"UnsupportedSignatureType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_current\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prev\",\"type\":\"uint256\"}],\"name\":\"WrongChainedCheckpointOrder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"CreatedContract\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newImageHash\",\"type\":\"bytes32\"}],\"name\":\"ImageHashUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_space\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newNonce\",\"type\":\"uint256\"}],\"name\":\"NonceChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_tx\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"TxExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_tx\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_reason\",\"type\":\"bytes\"}],\"name\":\"TxFailed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SET_IMAGE_HASH_TYPE_HASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"createContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"revertOnError\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IModuleCalls.Transaction[]\",\"name\":\"_txs\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signatures\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signatures\",\"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\":\"_space\",\"type\":\"uint256\"}],\"name\":\"readNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"revertOnError\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IModuleCalls.Transaction[]\",\"name\":\"_txs\",\"type\":\"tuple[]\"}],\"name\":\"selfExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_digest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"signatureRecovery\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subdigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"checkpoint\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_imageHash\",\"type\":\"bytes32\"}],\"name\":\"updateImageHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"createContract(bytes)\":{\"params\":{\"_code\":\"Creation code of the contract\"},\"returns\":{\"addr\":\"The address of the created contract\"}},\"execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)\":{\"params\":{\"_txs\":\"Transactions to process\"}},\"isValidSignature(bytes,bytes)\":{\"details\":\"MUST return the correct magic value if the signature provided is valid for the provided data > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\"))\",\"params\":{\"_data\":\"Arbitrary length data signed on the behalf of address(this)\",\"_signatures\":\"Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)\"},\"returns\":{\"_0\":\"magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise\"}},\"isValidSignature(bytes32,bytes)\":{\"details\":\"MUST return the correct magic value if the signature provided is valid for the provided hash > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256(\\\"isValidSignature(bytes32,bytes)\\\"))\",\"params\":{\"_hash\":\"keccak256 hash that was signed\",\"_signatures\":\"Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)\"},\"returns\":{\"_0\":\"magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise\"}},\"nonce()\":{\"details\":\"The default nonce space is 0x00\",\"returns\":{\"_0\":\"The next nonce\"}},\"readNonce(uint256)\":{\"params\":{\"_space\":\"Nonce space, each space keeps an independent nonce count\"},\"returns\":{\"_0\":\"The next nonce\"}},\"selfExecute((bool,bool,uint256,address,uint256,bytes)[])\":{\"params\":{\"_txs\":\"Transactions to process\"}},\"signatureRecovery(bytes32,bytes)\":{\"details\":\"The signature must be prefixed with a type byte, which is used to determine the recovery method.\",\"params\":{\"_digest\":\"Digest of the signed data.\",\"_signature\":\"A Sequence signature.\"},\"returns\":{\"checkpoint\":\"A nonce that is incremented every time a new configuration is set.\",\"imageHash\":\"The imageHash of the configuration that signed the message.\",\"subdigest\":\"A modified version of the original digest, unique for each wallet/network.\",\"threshold\":\"The required number of signatures needed to consider the signature valid.\",\"weight\":\"The actual number of signatures collected in the signature.\"}},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceID\":\"The interface identifier, as specified in ERC-165\"},\"returns\":{\"_0\":\"`true` if the contract implements `_interfaceID`\"}},\"updateImageHash(bytes32)\":{\"params\":{\"_imageHash\":\"New required image hash of the signature\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createContract(bytes)\":{\"notice\":\"Creates a contract forwarding eth value\"},\"execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)\":{\"notice\":\"Allow any caller to execute an action\"},\"isValidSignature(bytes,bytes)\":{\"notice\":\"Verifies whether the provided signature is valid with respect to the provided data\"},\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Verifies whether the provided signature is valid with respect to the provided hash\"},\"nonce()\":{\"notice\":\"Returns the next nonce of the default nonce space\"},\"readNonce(uint256)\":{\"notice\":\"Returns the next nonce of the given nonce space\"},\"selfExecute((bool,bool,uint256,address,uint256,bytes)[])\":{\"notice\":\"Allow any caller to execute an action\"},\"signatureRecovery(bytes32,bytes)\":{\"notice\":\"Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Query if a contract implements an interface\"},\"updateImageHash(bytes32)\":{\"notice\":\"Updates the signers configuration of the wallet\"}},\"notice\":\"GuestModule implements a Sequence wallet without signatures, nonce or replay protection. executing transactions using this wallet is not an authenticated process, and can be done by any address.This contract is completely public with no security, designed to execute pre-signed transactions and use Sequence tools without using the wallets.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":\"GuestModule\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":{\"keccak256\":\"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1\",\"dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol\":{\"keccak256\":\"0x14c92b44eac100edbfea10d0d02728752a6be277c267c3776dc563ff963271b1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e440eb91039118ce26bb66fd549d5e6b59863983efbe6c2617b92e2c4f0aab66\",\"dweb:/ipfs/QmeTd2xBKEv4S4Rp9S4TSY4WwUUDjtA7xiJYiJqkVUio7d\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":{\"keccak256\":\"0x58c028f02e3517de6c39584bcf1cedd4e7b23f575c24b363cbad4960a74f8a0b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f9652fead22c9fe8510de8427e2db354ed145ff30f49f85d1c717e293e5df665\",\"dweb:/ipfs/QmSJPFQxRE5n17DNB5Bu2jwRo17yLS7igMQGt3bvKkdLAP\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":{\"keccak256\":\"0x80c0151dbd444f96c2f935e70a6d3cc57e307588fa21d7eace67e568dd3d35c1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://39a856555a5eb900e67d351e667135f245ccebd304d692b35fc8bdc83aec1b53\",\"dweb:/ipfs/QmUdWfa7GcTGM5gk7qYbNCHtsxF4o8dXHzr6HbdFng5sQm\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":{\"keccak256\":\"0x16b1400988f6b7bd4d32bdcb36ee2fbd644fb2c8ca571becc0c32e03602bd303\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4681fb4cff10f4e98e45618fbc52ed0a4c7d4fcf614f34a587ad20cd16855\",\"dweb:/ipfs/QmbA2LYBH1x8WX8CaeiFYMU5rjyLGgNCF32r9fQbXuoqwJ\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":{\"keccak256\":\"0xd4ae13a3d20fd7ab52ad16af6a06e7244daea450b796251e911091cac104d05f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8de37ec20a6b649e9fe3fb42276e4660ff546bca8b467f72beb35396ab5e62d6\",\"dweb:/ipfs/QmXT2SxBZKitkbKLbGbbNLhUbw2ataRpQ2DHafvhG953RE\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":{\"keccak256\":\"0x3b5388842f763a5347d632a0e0e8499a54b6f0b0a6eb7f7d3d848319defa042d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b36fa5a88a4e174967f850bf2bb78c787d8016ef7b5eee3e2f883fbfe9b87a7d\",\"dweb:/ipfs/QmTDZiPiQGe1fmTKKzdwzBE1xjkh8apTotW1SQRUCFXf4q\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":{\"keccak256\":\"0x32bdb1d343eee2e32fd9d0f1d6dc0e265411d0821bd908881822f0f26f0887f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1537c4f60a609751013bdc69eb1c6e6218982d91013115bc4e28cb84f816cd91\",\"dweb:/ipfs/QmSjkSTrrB4vuxECcm5cRG7YmraF53QWRgftxS827KcQLW\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":{\"keccak256\":\"0x91545de5c77cfac86c5686c4e1f338a18ee7adb689ac0234848d7a7fc8a560db\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dc89d05d8099ba4c3c2cf85737796d439899b5a04e6b87b1ea43f687ae08848a\",\"dweb:/ipfs/QmatU8gRvFkK3Yn1MYAekzi48Waw3cDLtXJpduvju9HFUu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":{\"keccak256\":\"0x876c6a40cba975df4f7dfe24e02d153b2ee758975b6d1eda494ecd4b7244aa8e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b9be3f7930476d528ce10a121701421f0fb251b7d6b7cd579917375e6b283bb4\",\"dweb:/ipfs/QmSbvbYQvTk8KYJZ7QqSKB9Y4M1X3UDhS6k765Zr1BAwK8\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol\":{\"keccak256\":\"0x24c6b05c32cb344b3b0aebd01fbd8bfc69f8c8e29fca340b262d9612c34d51e2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5f6c004946f0cbc4b3e52d45248337146bc82569da894ecff3cbdc5a0dca95c3\",\"dweb:/ipfs/QmNSgDMQ7SHL6AJuzTSRbY2kgciHF1SKWfH6MaPH1N3TpR\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol\":{\"keccak256\":\"0xde065c15e38eb009c3dc8f99dfefdd1d6d244dd12a889a8b57edd90d32fb4395\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://23608955786060457f79267795a61eb89b3910b683fc136c749548369425088f\",\"dweb:/ipfs/QmXNorcQBF1Qk21y3aEJRiiHVtwm61zP4ttA1ZzmRjyHnz\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol\":{\"keccak256\":\"0xa206dd3d424b8cd1c4f1400aa344cbc974480fea02f0fb371b872558e5ff4e6d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ea14c75f43a0008c582dcbae3ba3c900e446e28039dfdbb059d326ec5cc6a2d2\",\"dweb:/ipfs/QmRfF6BmUWiFkCgzVFbLcHsUCNz5q2XkkcwXPX57ViTK4D\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":{\"keccak256\":\"0xe0565e24e94204d4b254ace42d124d3279256090921a4818cbbf9747cbb14e04\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4293a4762b0816738511f697efd04a0e881d4c409bd15ac1c4e7261fe5e482a2\",\"dweb:/ipfs/QmcHbEBne4fvpcD7RTJHCL6q9czoLa7KHneaCeYfXuWiGu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":{\"keccak256\":\"0x755fbf6c106fe1c3c375c41c95c38269873717d8e683678b5fdbf6c8d3426306\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7c7c92e72dd94f16b5c004d38c2d92eb2b760fd29a939945ed275633b0f93fa5\",\"dweb:/ipfs/QmVdCG7Aw7aVV67z5mUKZa4VqhXHdLqy3SKxPfxaxq54p2\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":{\"keccak256\":\"0x6de353f8c7f44c4294914a4917458ce90ae2f7ecd2d84074fe12d4a4f1485ee5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://369f979b79a3d3fd0336ab14b3accadb63e4784324afc34f8db11d1988526afd\",\"dweb:/ipfs/QmavmBZ354wTaXQ6ixBd8GrC9HwtRqn4MoNhCVJcx11off\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":{\"keccak256\":\"0xa3ac8b8d31f20a8732bb4ebad53b42b334ec29041de0224bd494913ef0b2ad07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a81d4eb3f47b09a8835b2fd53e0baa2e23cb604db3b10dae82543a5bcc52fa4\",\"dweb:/ipfs/QmQ9XSSgbaagWArmZJJ366bdJ7HfxUxn9jdnWwN6SxUSeY\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol\":{\"keccak256\":\"0x98520e740b0822ec053d21f376b8be8a58e93228f3758f9228a7d00e1f60950f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://31226706c004f1a4315d6b8d37621b46f4d5807c16e1ce72675c1431ed9006a2\",\"dweb:/ipfs/QmdSSyCuPex2E2VTd6UMYy9WAq9eJNZ6vHSUomntNknzXE\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":{\"keccak256\":\"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98\",\"dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":{\"keccak256\":\"0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25\",\"dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":{\"keccak256\":\"0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335\",\"dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":{\"keccak256\":\"0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353\",\"dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "createContract(bytes)": { + "notice": "Creates a contract forwarding eth value" + }, + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": { + "notice": "Allow any caller to execute an action" + }, + "isValidSignature(bytes,bytes)": { + "notice": "Verifies whether the provided signature is valid with respect to the provided data" + }, + "isValidSignature(bytes32,bytes)": { + "notice": "Verifies whether the provided signature is valid with respect to the provided hash" + }, + "nonce()": { + "notice": "Returns the next nonce of the default nonce space" + }, + "readNonce(uint256)": { + "notice": "Returns the next nonce of the given nonce space" + }, + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": { + "notice": "Allow any caller to execute an action" + }, + "signatureRecovery(bytes32,bytes)": { + "notice": "Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature." + }, + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + }, + "updateImageHash(bytes32)": { + "notice": "Updates the signers configuration of the wallet" + } + }, + "notice": "GuestModule implements a Sequence wallet without signatures, nonce or replay protection. executing transactions using this wallet is not an authenticated process, and can be done by any address.This contract is completely public with no security, designed to execute pre-signed transactions and use Sequence tools without using the wallets.", + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol": { + "ModuleAuth": { + "abi": [ + { + "inputs": [], + "name": "EmptySignature", + "type": "error" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidNestedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "InvalidSValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_v", + "type": "uint256" + } + ], + "name": "InvalidVValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_self", + "type": "address" + } + ], + "name": "OnlySelfAuth", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "SignerIsAddress0", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_recoverMode", + "type": "bool" + } + ], + "name": "UnsupportedSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_prev", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "SET_IMAGE_HASH_TYPE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signatures", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_signatures", + "type": "bytes" + } + ], + "name": "isValidSignature", + "outputs": [ + { + "internalType": "bytes4", + "name": "", + "type": "bytes4" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "signatureRecovery", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subdigest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "isValidSignature(bytes,bytes)": { + "details": "MUST return the correct magic value if the signature provided is valid for the provided data > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\"))", + "params": { + "_data": "Arbitrary length data signed on the behalf of address(this)", + "_signatures": "Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)" + }, + "returns": { + "_0": "magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise" + } + }, + "isValidSignature(bytes32,bytes)": { + "details": "MUST return the correct magic value if the signature provided is valid for the provided hash > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))", + "params": { + "_hash": "keccak256 hash that was signed", + "_signatures": "Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)" + }, + "returns": { + "_0": "magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise" + } + }, + "signatureRecovery(bytes32,bytes)": { + "details": "The signature must be prefixed with a type byte, which is used to determine the recovery method.", + "params": { + "_digest": "Digest of the signed data.", + "_signature": "A Sequence signature." + }, + "returns": { + "checkpoint": "A nonce that is incremented every time a new configuration is set.", + "imageHash": "The imageHash of the configuration that signed the message.", + "subdigest": "A modified version of the original digest, unique for each wallet/network.", + "threshold": "The required number of signatures needed to consider the signature valid.", + "weight": "The actual number of signatures collected in the signature." + } + }, + "supportsInterface(bytes4)": { + "params": { + "_interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `_interfaceID`" + } + }, + "updateImageHash(bytes32)": { + "params": { + "_imageHash": "New required image hash of the signature" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": "", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "SET_IMAGE_HASH_TYPE_HASH()": "57c56d6b", + "isValidSignature(bytes,bytes)": "20c13b0b", + "isValidSignature(bytes32,bytes)": "1626ba7e", + "signatureRecovery(bytes32,bytes)": "853c5068", + "supportsInterface(bytes4)": "01ffc9a7", + "updateImageHash(bytes32)": "29561426" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"EmptySignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ImageHashIsZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidNestedSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"InvalidSValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_flag\",\"type\":\"uint256\"}],\"name\":\"InvalidSignatureFlag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes1\",\"name\":\"_type\",\"type\":\"bytes1\"}],\"name\":\"InvalidSignatureType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_v\",\"type\":\"uint256\"}],\"name\":\"InvalidVValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_weight\",\"type\":\"uint256\"}],\"name\":\"LowWeightChainedSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_self\",\"type\":\"address\"}],\"name\":\"OnlySelfAuth\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"SignerIsAddress0\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_recoverMode\",\"type\":\"bool\"}],\"name\":\"UnsupportedSignatureType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_current\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prev\",\"type\":\"uint256\"}],\"name\":\"WrongChainedCheckpointOrder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newImageHash\",\"type\":\"bytes32\"}],\"name\":\"ImageHashUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SET_IMAGE_HASH_TYPE_HASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signatures\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signatures\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_digest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"signatureRecovery\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subdigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"checkpoint\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_imageHash\",\"type\":\"bytes32\"}],\"name\":\"updateImageHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"isValidSignature(bytes,bytes)\":{\"details\":\"MUST return the correct magic value if the signature provided is valid for the provided data > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\\\"isValidSignature(bytes,bytes)\\\"))\",\"params\":{\"_data\":\"Arbitrary length data signed on the behalf of address(this)\",\"_signatures\":\"Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)\"},\"returns\":{\"_0\":\"magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise\"}},\"isValidSignature(bytes32,bytes)\":{\"details\":\"MUST return the correct magic value if the signature provided is valid for the provided hash > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256(\\\"isValidSignature(bytes32,bytes)\\\"))\",\"params\":{\"_hash\":\"keccak256 hash that was signed\",\"_signatures\":\"Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)\"},\"returns\":{\"_0\":\"magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise\"}},\"signatureRecovery(bytes32,bytes)\":{\"details\":\"The signature must be prefixed with a type byte, which is used to determine the recovery method.\",\"params\":{\"_digest\":\"Digest of the signed data.\",\"_signature\":\"A Sequence signature.\"},\"returns\":{\"checkpoint\":\"A nonce that is incremented every time a new configuration is set.\",\"imageHash\":\"The imageHash of the configuration that signed the message.\",\"subdigest\":\"A modified version of the original digest, unique for each wallet/network.\",\"threshold\":\"The required number of signatures needed to consider the signature valid.\",\"weight\":\"The actual number of signatures collected in the signature.\"}},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceID\":\"The interface identifier, as specified in ERC-165\"},\"returns\":{\"_0\":\"`true` if the contract implements `_interfaceID`\"}},\"updateImageHash(bytes32)\":{\"params\":{\"_imageHash\":\"New required image hash of the signature\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"isValidSignature(bytes,bytes)\":{\"notice\":\"Verifies whether the provided signature is valid with respect to the provided data\"},\"isValidSignature(bytes32,bytes)\":{\"notice\":\"Verifies whether the provided signature is valid with respect to the provided hash\"},\"signatureRecovery(bytes32,bytes)\":{\"notice\":\"Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature.\"},\"supportsInterface(bytes4)\":{\"notice\":\"Query if a contract implements an interface\"},\"updateImageHash(bytes32)\":{\"notice\":\"Updates the signers configuration of the wallet\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":\"ModuleAuth\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":{\"keccak256\":\"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1\",\"dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol\":{\"keccak256\":\"0x58c028f02e3517de6c39584bcf1cedd4e7b23f575c24b363cbad4960a74f8a0b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f9652fead22c9fe8510de8427e2db354ed145ff30f49f85d1c717e293e5df665\",\"dweb:/ipfs/QmSJPFQxRE5n17DNB5Bu2jwRo17yLS7igMQGt3bvKkdLAP\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":{\"keccak256\":\"0xd4ae13a3d20fd7ab52ad16af6a06e7244daea450b796251e911091cac104d05f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8de37ec20a6b649e9fe3fb42276e4660ff546bca8b467f72beb35396ab5e62d6\",\"dweb:/ipfs/QmXT2SxBZKitkbKLbGbbNLhUbw2ataRpQ2DHafvhG953RE\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":{\"keccak256\":\"0x91545de5c77cfac86c5686c4e1f338a18ee7adb689ac0234848d7a7fc8a560db\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dc89d05d8099ba4c3c2cf85737796d439899b5a04e6b87b1ea43f687ae08848a\",\"dweb:/ipfs/QmatU8gRvFkK3Yn1MYAekzi48Waw3cDLtXJpduvju9HFUu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":{\"keccak256\":\"0x876c6a40cba975df4f7dfe24e02d153b2ee758975b6d1eda494ecd4b7244aa8e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b9be3f7930476d528ce10a121701421f0fb251b7d6b7cd579917375e6b283bb4\",\"dweb:/ipfs/QmSbvbYQvTk8KYJZ7QqSKB9Y4M1X3UDhS6k765Zr1BAwK8\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol\":{\"keccak256\":\"0x24c6b05c32cb344b3b0aebd01fbd8bfc69f8c8e29fca340b262d9612c34d51e2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5f6c004946f0cbc4b3e52d45248337146bc82569da894ecff3cbdc5a0dca95c3\",\"dweb:/ipfs/QmNSgDMQ7SHL6AJuzTSRbY2kgciHF1SKWfH6MaPH1N3TpR\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":{\"keccak256\":\"0xe0565e24e94204d4b254ace42d124d3279256090921a4818cbbf9747cbb14e04\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4293a4762b0816738511f697efd04a0e881d4c409bd15ac1c4e7261fe5e482a2\",\"dweb:/ipfs/QmcHbEBne4fvpcD7RTJHCL6q9czoLa7KHneaCeYfXuWiGu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":{\"keccak256\":\"0x755fbf6c106fe1c3c375c41c95c38269873717d8e683678b5fdbf6c8d3426306\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7c7c92e72dd94f16b5c004d38c2d92eb2b760fd29a939945ed275633b0f93fa5\",\"dweb:/ipfs/QmVdCG7Aw7aVV67z5mUKZa4VqhXHdLqy3SKxPfxaxq54p2\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":{\"keccak256\":\"0x6de353f8c7f44c4294914a4917458ce90ae2f7ecd2d84074fe12d4a4f1485ee5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://369f979b79a3d3fd0336ab14b3accadb63e4784324afc34f8db11d1988526afd\",\"dweb:/ipfs/QmavmBZ354wTaXQ6ixBd8GrC9HwtRqn4MoNhCVJcx11off\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":{\"keccak256\":\"0xa3ac8b8d31f20a8732bb4ebad53b42b334ec29041de0224bd494913ef0b2ad07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a81d4eb3f47b09a8835b2fd53e0baa2e23cb604db3b10dae82543a5bcc52fa4\",\"dweb:/ipfs/QmQ9XSSgbaagWArmZJJ366bdJ7HfxUxn9jdnWwN6SxUSeY\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":{\"keccak256\":\"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98\",\"dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":{\"keccak256\":\"0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25\",\"dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":{\"keccak256\":\"0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335\",\"dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":{\"keccak256\":\"0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353\",\"dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "isValidSignature(bytes,bytes)": { + "notice": "Verifies whether the provided signature is valid with respect to the provided data" + }, + "isValidSignature(bytes32,bytes)": { + "notice": "Verifies whether the provided signature is valid with respect to the provided hash" + }, + "signatureRecovery(bytes32,bytes)": { + "notice": "Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature." + }, + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + }, + "updateImageHash(bytes32)": { + "notice": "Updates the signers configuration of the wallet" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol": { + "ModuleCalls": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_requested", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_available", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "inputs": [], + "name": "OnlyDelegatecall", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_self", + "type": "address" + } + ], + "name": "OnlySelfAuth", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "TxExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_reason", + "type": "bytes" + } + ], + "name": "TxFailed", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "nonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "signatureRecovery", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subdigest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": { + "details": "Relayers must ensure that the gasLimit specified for each transaction is acceptable to them. A user could specify large enough that it could consume all the gas available.", + "params": { + "_nonce": "Signature nonce (may contain an encoded space)", + "_signature": "Encoded signature", + "_txs": "Transactions to process" + } + }, + "nonce()": { + "details": "The default nonce space is 0x00", + "returns": { + "_0": "The next nonce" + } + }, + "readNonce(uint256)": { + "params": { + "_space": "Nonce space, each space keeps an independent nonce count" + }, + "returns": { + "_0": "The next nonce" + } + }, + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": { + "params": { + "_txs": "Transactions to execute" + } + }, + "supportsInterface(bytes4)": { + "params": { + "_interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `_interfaceID`" + } + }, + "updateImageHash(bytes32)": { + "params": { + "_imageHash": "New required image hash of the signature" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": "", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": "7a9a1628", + "nonce()": "affed0e0", + "readNonce(uint256)": "8c3f5563", + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": "61c2926c", + "signatureRecovery(bytes32,bytes)": "853c5068", + "supportsInterface(bytes4)": "01ffc9a7", + "updateImageHash(bytes32)": "29561426" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_space\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_current\",\"type\":\"uint256\"}],\"name\":\"BadNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ImageHashIsZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes1\",\"name\":\"_type\",\"type\":\"bytes1\"}],\"name\":\"InvalidSignatureType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_requested\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_available\",\"type\":\"uint256\"}],\"name\":\"NotEnoughGas\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDelegatecall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_self\",\"type\":\"address\"}],\"name\":\"OnlySelfAuth\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newImageHash\",\"type\":\"bytes32\"}],\"name\":\"ImageHashUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_space\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newNonce\",\"type\":\"uint256\"}],\"name\":\"NonceChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_tx\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"TxExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_tx\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_reason\",\"type\":\"bytes\"}],\"name\":\"TxFailed\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"revertOnError\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IModuleCalls.Transaction[]\",\"name\":\"_txs\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_space\",\"type\":\"uint256\"}],\"name\":\"readNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"revertOnError\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IModuleCalls.Transaction[]\",\"name\":\"_txs\",\"type\":\"tuple[]\"}],\"name\":\"selfExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_digest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"signatureRecovery\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subdigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"checkpoint\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_imageHash\",\"type\":\"bytes32\"}],\"name\":\"updateImageHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)\":{\"details\":\"Relayers must ensure that the gasLimit specified for each transaction is acceptable to them. A user could specify large enough that it could consume all the gas available.\",\"params\":{\"_nonce\":\"Signature nonce (may contain an encoded space)\",\"_signature\":\"Encoded signature\",\"_txs\":\"Transactions to process\"}},\"nonce()\":{\"details\":\"The default nonce space is 0x00\",\"returns\":{\"_0\":\"The next nonce\"}},\"readNonce(uint256)\":{\"params\":{\"_space\":\"Nonce space, each space keeps an independent nonce count\"},\"returns\":{\"_0\":\"The next nonce\"}},\"selfExecute((bool,bool,uint256,address,uint256,bytes)[])\":{\"params\":{\"_txs\":\"Transactions to execute\"}},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceID\":\"The interface identifier, as specified in ERC-165\"},\"returns\":{\"_0\":\"`true` if the contract implements `_interfaceID`\"}},\"updateImageHash(bytes32)\":{\"params\":{\"_imageHash\":\"New required image hash of the signature\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)\":{\"notice\":\"Allow wallet owner to execute an action\"},\"nonce()\":{\"notice\":\"Returns the next nonce of the default nonce space\"},\"readNonce(uint256)\":{\"notice\":\"Returns the next nonce of the given nonce space\"},\"selfExecute((bool,bool,uint256,address,uint256,bytes)[])\":{\"notice\":\"Allow wallet to execute an action without signing the message\"},\"supportsInterface(bytes4)\":{\"notice\":\"Query if a contract implements an interface\"},\"updateImageHash(bytes32)\":{\"notice\":\"Updates the signers configuration of the wallet\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":\"ModuleCalls\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":{\"keccak256\":\"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1\",\"dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol\":{\"keccak256\":\"0x80c0151dbd444f96c2f935e70a6d3cc57e307588fa21d7eace67e568dd3d35c1\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://39a856555a5eb900e67d351e667135f245ccebd304d692b35fc8bdc83aec1b53\",\"dweb:/ipfs/QmUdWfa7GcTGM5gk7qYbNCHtsxF4o8dXHzr6HbdFng5sQm\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":{\"keccak256\":\"0xd4ae13a3d20fd7ab52ad16af6a06e7244daea450b796251e911091cac104d05f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8de37ec20a6b649e9fe3fb42276e4660ff546bca8b467f72beb35396ab5e62d6\",\"dweb:/ipfs/QmXT2SxBZKitkbKLbGbbNLhUbw2ataRpQ2DHafvhG953RE\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":{\"keccak256\":\"0x3b5388842f763a5347d632a0e0e8499a54b6f0b0a6eb7f7d3d848319defa042d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b36fa5a88a4e174967f850bf2bb78c787d8016ef7b5eee3e2f883fbfe9b87a7d\",\"dweb:/ipfs/QmTDZiPiQGe1fmTKKzdwzBE1xjkh8apTotW1SQRUCFXf4q\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":{\"keccak256\":\"0x32bdb1d343eee2e32fd9d0f1d6dc0e265411d0821bd908881822f0f26f0887f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1537c4f60a609751013bdc69eb1c6e6218982d91013115bc4e28cb84f816cd91\",\"dweb:/ipfs/QmSjkSTrrB4vuxECcm5cRG7YmraF53QWRgftxS827KcQLW\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":{\"keccak256\":\"0x91545de5c77cfac86c5686c4e1f338a18ee7adb689ac0234848d7a7fc8a560db\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dc89d05d8099ba4c3c2cf85737796d439899b5a04e6b87b1ea43f687ae08848a\",\"dweb:/ipfs/QmatU8gRvFkK3Yn1MYAekzi48Waw3cDLtXJpduvju9HFUu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":{\"keccak256\":\"0x876c6a40cba975df4f7dfe24e02d153b2ee758975b6d1eda494ecd4b7244aa8e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b9be3f7930476d528ce10a121701421f0fb251b7d6b7cd579917375e6b283bb4\",\"dweb:/ipfs/QmSbvbYQvTk8KYJZ7QqSKB9Y4M1X3UDhS6k765Zr1BAwK8\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol\":{\"keccak256\":\"0x24c6b05c32cb344b3b0aebd01fbd8bfc69f8c8e29fca340b262d9612c34d51e2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5f6c004946f0cbc4b3e52d45248337146bc82569da894ecff3cbdc5a0dca95c3\",\"dweb:/ipfs/QmNSgDMQ7SHL6AJuzTSRbY2kgciHF1SKWfH6MaPH1N3TpR\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol\":{\"keccak256\":\"0xde065c15e38eb009c3dc8f99dfefdd1d6d244dd12a889a8b57edd90d32fb4395\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://23608955786060457f79267795a61eb89b3910b683fc136c749548369425088f\",\"dweb:/ipfs/QmXNorcQBF1Qk21y3aEJRiiHVtwm61zP4ttA1ZzmRjyHnz\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":{\"keccak256\":\"0xe0565e24e94204d4b254ace42d124d3279256090921a4818cbbf9747cbb14e04\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4293a4762b0816738511f697efd04a0e881d4c409bd15ac1c4e7261fe5e482a2\",\"dweb:/ipfs/QmcHbEBne4fvpcD7RTJHCL6q9czoLa7KHneaCeYfXuWiGu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol\":{\"keccak256\":\"0x98520e740b0822ec053d21f376b8be8a58e93228f3758f9228a7d00e1f60950f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://31226706c004f1a4315d6b8d37621b46f4d5807c16e1ce72675c1431ed9006a2\",\"dweb:/ipfs/QmdSSyCuPex2E2VTd6UMYy9WAq9eJNZ6vHSUomntNknzXE\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":{\"keccak256\":\"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98\",\"dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":{\"keccak256\":\"0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25\",\"dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":{\"keccak256\":\"0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335\",\"dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":{\"keccak256\":\"0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353\",\"dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": { + "notice": "Allow wallet owner to execute an action" + }, + "nonce()": { + "notice": "Returns the next nonce of the default nonce space" + }, + "readNonce(uint256)": { + "notice": "Returns the next nonce of the given nonce space" + }, + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": { + "notice": "Allow wallet to execute an action without signing the message" + }, + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + }, + "updateImageHash(bytes32)": { + "notice": "Updates the signers configuration of the wallet" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol": { + "ModuleCreator": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "CreateFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_self", + "type": "address" + } + ], + "name": "OnlySelfAuth", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "_contract", + "type": "address" + } + ], + "name": "CreatedContract", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "createContract", + "outputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "createContract(bytes)": { + "params": { + "_code": "Creation code of the contract" + }, + "returns": { + "addr": "The address of the created contract" + } + }, + "supportsInterface(bytes4)": { + "params": { + "_interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `_interfaceID`" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":169:1177 contract ModuleCreator is IModuleCreator, ModuleERC165, ModuleSelfAuth {... */\n mstore(0x40, 0x80)\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\ntag_1:\n pop\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x00\n codecopy\n 0x00\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":169:1177 contract ModuleCreator is IModuleCreator, ModuleERC165, ModuleSelfAuth {... */\n mstore(0x40, 0x80)\n jumpi(tag_1, lt(calldatasize, 0x04))\n shr(0xe0, calldataload(0x00))\n dup1\n 0x01ffc9a7\n eq\n tag_2\n jumpi\n dup1\n 0x90042baf\n eq\n tag_3\n jumpi\n tag_1:\n 0x00\n dup1\n revert\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":942:1175 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n tag_2:\n callvalue\n dup1\n iszero\n tag_4\n jumpi\n 0x00\n dup1\n revert\n tag_4:\n pop\n tag_5\n tag_6\n calldatasize\n 0x04\n tag_7\n jump\t// in\n tag_6:\n tag_8\n jump\t// in\n tag_5:\n mload(0x40)\n /* \"#utility.yul\":516:530 */\n swap1\n iszero\n /* \"#utility.yul\":509:531 */\n iszero\n /* \"#utility.yul\":491:532 */\n dup2\n mstore\n /* \"#utility.yul\":479:481 */\n 0x20\n /* \"#utility.yul\":464:482 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":942:1175 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n tag_9:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":456:732 function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {... */\n tag_3:\n tag_11\n tag_12\n calldatasize\n 0x04\n tag_13\n jump\t// in\n tag_12:\n tag_14\n jump\t// in\n tag_11:\n mload(0x40)\n /* \"#utility.yul\":1893:1935 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":1881:1936 */\n swap1\n swap2\n and\n /* \"#utility.yul\":1863:1937 */\n dup2\n mstore\n /* \"#utility.yul\":1851:1853 */\n 0x20\n /* \"#utility.yul\":1836:1854 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":456:732 function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {... */\n tag_9\n /* \"#utility.yul\":1717:1943 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":942:1175 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n tag_8:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1028:1032 bool */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1044:1092 _interfaceID == type(IModuleCreator).interfaceId */\n 0x6ffbd45100000000000000000000000000000000000000000000000000000000\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n dup4\n and\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1040:1120 if (_interfaceID == type(IModuleCreator).interfaceId) {... */\n tag_18\n jumpi\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1109:1113 true */\n 0x01\n swap2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":942:1175 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n swap1\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":1040:1120 if (_interfaceID == type(IModuleCreator).interfaceId) {... */\n tag_18:\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":709:756 _interfaceID == this.supportsInterface.selector */\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":725:756 this.supportsInterface.selector */\n 0x01ffc9a700000000000000000000000000000000000000000000000000000000\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":709:756 _interfaceID == this.supportsInterface.selector */\n eq\n swap1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":942:1175 function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {... */\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":456:732 function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {... */\n tag_14:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":550:562 address addr */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":178:188 msg.sender */\n caller\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":200:204 this */\n address\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":178:205 msg.sender != address(this) */\n eq\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":174:268 if (msg.sender != address(this)) {... */\n tag_22\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n mload(0x40)\n 0xe125889400000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":235:245 msg.sender */\n caller\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n 0x04\n dup3\n add\n /* \"#utility.yul\":2183:2217 */\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":255:259 this */\n address\n /* \"#utility.yul\":2233:2251 */\n 0x24\n dup3\n add\n /* \"#utility.yul\":2226:2269 */\n mstore\n /* \"#utility.yul\":2095:2113 */\n 0x44\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":222:261 OnlySelfAuth(msg.sender, address(this)) */\n tag_23:\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n revert\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":174:268 if (msg.sender != address(this)) {... */\n tag_22:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":631:636 _code */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":625:637 mload(_code) */\n mload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":620:622 32 */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":613:618 _code */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":609:623 add(_code, 32) */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":596:607 callvalue() */\n callvalue\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":589:638 create(callvalue(), add(_code, 32), mload(_code)) */\n create\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":581:638 addr := create(callvalue(), add(_code, 32), mload(_code)) */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":649:667 addr == address(0) */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":645:695 if (addr == address(0)) revert CreateFailed(_code) */\n tag_26\n jumpi\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":689:694 _code */\n dup2\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":676:695 CreateFailed(_code) */\n mload(0x40)\n 0x0d25719100000000000000000000000000000000000000000000000000000000\n dup2\n mstore\n 0x04\n add\n tag_23\n swap2\n swap1\n tag_28\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":645:695 if (addr == address(0)) revert CreateFailed(_code) */\n tag_26:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":706:727 CreatedContract(addr) */\n mload(0x40)\n /* \"#utility.yul\":1893:1935 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"#utility.yul\":1881:1936 */\n dup3\n and\n /* \"#utility.yul\":1863:1937 */\n dup2\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":706:727 CreatedContract(addr) */\n 0xa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c\n swap1\n /* \"#utility.yul\":1851:1853 */\n 0x20\n /* \"#utility.yul\":1836:1854 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":706:727 CreatedContract(addr) */\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":456:732 function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) {... */\n swap2\n swap1\n pop\n jump\t// out\n /* \"#utility.yul\":14:346 */\n tag_7:\n /* \"#utility.yul\":72:78 */\n 0x00\n /* \"#utility.yul\":125:127 */\n 0x20\n /* \"#utility.yul\":113:122 */\n dup3\n /* \"#utility.yul\":104:111 */\n dup5\n /* \"#utility.yul\":100:123 */\n sub\n /* \"#utility.yul\":96:128 */\n slt\n /* \"#utility.yul\":93:145 */\n iszero\n tag_34\n jumpi\n /* \"#utility.yul\":141:142 */\n 0x00\n /* \"#utility.yul\":138:139 */\n dup1\n /* \"#utility.yul\":131:143 */\n revert\n /* \"#utility.yul\":93:145 */\n tag_34:\n /* \"#utility.yul\":180:189 */\n dup2\n /* \"#utility.yul\":167:190 */\n calldataload\n /* \"#utility.yul\":230:296 */\n 0xffffffff00000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":223:228 */\n dup2\n /* \"#utility.yul\":219:297 */\n and\n /* \"#utility.yul\":212:217 */\n dup2\n /* \"#utility.yul\":209:298 */\n eq\n /* \"#utility.yul\":199:316 */\n tag_35\n jumpi\n /* \"#utility.yul\":312:313 */\n 0x00\n /* \"#utility.yul\":309:310 */\n dup1\n /* \"#utility.yul\":302:314 */\n revert\n /* \"#utility.yul\":199:316 */\n tag_35:\n /* \"#utility.yul\":335:340 */\n swap4\n /* \"#utility.yul\":14:346 */\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":543:727 */\n tag_31:\n /* \"#utility.yul\":595:672 */\n 0x4e487b7100000000000000000000000000000000000000000000000000000000\n /* \"#utility.yul\":592:593 */\n 0x00\n /* \"#utility.yul\":585:673 */\n mstore\n /* \"#utility.yul\":692:696 */\n 0x41\n /* \"#utility.yul\":689:690 */\n 0x04\n /* \"#utility.yul\":682:697 */\n mstore\n /* \"#utility.yul\":716:720 */\n 0x24\n /* \"#utility.yul\":713:714 */\n 0x00\n /* \"#utility.yul\":706:721 */\n revert\n /* \"#utility.yul\":732:1712 */\n tag_13:\n /* \"#utility.yul\":800:806 */\n 0x00\n /* \"#utility.yul\":853:855 */\n 0x20\n /* \"#utility.yul\":841:850 */\n dup3\n /* \"#utility.yul\":832:839 */\n dup5\n /* \"#utility.yul\":828:851 */\n sub\n /* \"#utility.yul\":824:856 */\n slt\n /* \"#utility.yul\":821:873 */\n iszero\n tag_39\n jumpi\n /* \"#utility.yul\":869:870 */\n 0x00\n /* \"#utility.yul\":866:867 */\n dup1\n /* \"#utility.yul\":859:871 */\n revert\n /* \"#utility.yul\":821:873 */\n tag_39:\n /* \"#utility.yul\":909:918 */\n dup2\n /* \"#utility.yul\":896:919 */\n calldataload\n /* \"#utility.yul\":938:956 */\n 0xffffffffffffffff\n /* \"#utility.yul\":979:981 */\n dup1\n /* \"#utility.yul\":971:977 */\n dup3\n /* \"#utility.yul\":968:982 */\n gt\n /* \"#utility.yul\":965:999 */\n iszero\n tag_40\n jumpi\n /* \"#utility.yul\":995:996 */\n 0x00\n /* \"#utility.yul\":992:993 */\n dup1\n /* \"#utility.yul\":985:997 */\n revert\n /* \"#utility.yul\":965:999 */\n tag_40:\n /* \"#utility.yul\":1033:1039 */\n dup2\n /* \"#utility.yul\":1022:1031 */\n dup5\n /* \"#utility.yul\":1018:1040 */\n add\n /* \"#utility.yul\":1008:1040 */\n swap2\n pop\n /* \"#utility.yul\":1078:1085 */\n dup5\n /* \"#utility.yul\":1071:1075 */\n 0x1f\n /* \"#utility.yul\":1067:1069 */\n dup4\n /* \"#utility.yul\":1063:1076 */\n add\n /* \"#utility.yul\":1059:1086 */\n slt\n /* \"#utility.yul\":1049:1104 */\n tag_41\n jumpi\n /* \"#utility.yul\":1100:1101 */\n 0x00\n /* \"#utility.yul\":1097:1098 */\n dup1\n /* \"#utility.yul\":1090:1102 */\n revert\n /* \"#utility.yul\":1049:1104 */\n tag_41:\n /* \"#utility.yul\":1136:1138 */\n dup2\n /* \"#utility.yul\":1123:1139 */\n calldataload\n /* \"#utility.yul\":1158:1160 */\n dup2\n /* \"#utility.yul\":1154:1156 */\n dup2\n /* \"#utility.yul\":1151:1161 */\n gt\n /* \"#utility.yul\":1148:1184 */\n iszero\n tag_43\n jumpi\n /* \"#utility.yul\":1164:1182 */\n tag_43\n tag_31\n jump\t// in\n tag_43:\n /* \"#utility.yul\":1298:1300 */\n 0x40\n /* \"#utility.yul\":1292:1301 */\n mload\n /* \"#utility.yul\":1360:1364 */\n 0x1f\n /* \"#utility.yul\":1352:1365 */\n dup3\n add\n /* \"#utility.yul\":1203:1269 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n /* \"#utility.yul\":1348:1370 */\n swap1\n dup2\n and\n /* \"#utility.yul\":1372:1374 */\n 0x3f\n /* \"#utility.yul\":1344:1375 */\n add\n /* \"#utility.yul\":1340:1380 */\n and\n /* \"#utility.yul\":1328:1381 */\n dup2\n add\n swap1\n /* \"#utility.yul\":1396:1414 */\n dup4\n dup3\n gt\n /* \"#utility.yul\":1416:1438 */\n dup2\n dup4\n lt\n /* \"#utility.yul\":1393:1439 */\n or\n /* \"#utility.yul\":1390:1462 */\n iszero\n tag_45\n jumpi\n /* \"#utility.yul\":1442:1460 */\n tag_45\n tag_31\n jump\t// in\n tag_45:\n /* \"#utility.yul\":1482:1492 */\n dup2\n /* \"#utility.yul\":1478:1480 */\n 0x40\n /* \"#utility.yul\":1471:1493 */\n mstore\n /* \"#utility.yul\":1517:1519 */\n dup3\n /* \"#utility.yul\":1509:1515 */\n dup2\n /* \"#utility.yul\":1502:1520 */\n mstore\n /* \"#utility.yul\":1557:1564 */\n dup8\n /* \"#utility.yul\":1552:1554 */\n 0x20\n /* \"#utility.yul\":1547:1549 */\n dup5\n /* \"#utility.yul\":1543:1545 */\n dup8\n /* \"#utility.yul\":1539:1550 */\n add\n /* \"#utility.yul\":1535:1555 */\n add\n /* \"#utility.yul\":1532:1565 */\n gt\n /* \"#utility.yul\":1529:1582 */\n iszero\n tag_46\n jumpi\n /* \"#utility.yul\":1578:1579 */\n 0x00\n /* \"#utility.yul\":1575:1576 */\n dup1\n /* \"#utility.yul\":1568:1580 */\n revert\n /* \"#utility.yul\":1529:1582 */\n tag_46:\n /* \"#utility.yul\":1634:1636 */\n dup3\n /* \"#utility.yul\":1629:1631 */\n 0x20\n /* \"#utility.yul\":1625:1627 */\n dup7\n /* \"#utility.yul\":1621:1632 */\n add\n /* \"#utility.yul\":1616:1618 */\n 0x20\n /* \"#utility.yul\":1608:1614 */\n dup4\n /* \"#utility.yul\":1604:1619 */\n add\n /* \"#utility.yul\":1591:1637 */\n calldatacopy\n /* \"#utility.yul\":1679:1680 */\n 0x00\n /* \"#utility.yul\":1657:1672 */\n swap3\n dup2\n add\n /* \"#utility.yul\":1674:1676 */\n 0x20\n /* \"#utility.yul\":1653:1677 */\n add\n /* \"#utility.yul\":1646:1681 */\n swap3\n swap1\n swap3\n mstore\n pop\n /* \"#utility.yul\":1661:1667 */\n swap6\n /* \"#utility.yul\":732:1712 */\n swap5\n pop\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":2280:2885 */\n tag_28:\n /* \"#utility.yul\":2390:2394 */\n 0x00\n /* \"#utility.yul\":2419:2421 */\n 0x20\n /* \"#utility.yul\":2448:2450 */\n dup1\n /* \"#utility.yul\":2437:2446 */\n dup4\n /* \"#utility.yul\":2430:2451 */\n mstore\n /* \"#utility.yul\":2480:2486 */\n dup4\n /* \"#utility.yul\":2474:2487 */\n mload\n /* \"#utility.yul\":2523:2529 */\n dup1\n /* \"#utility.yul\":2518:2520 */\n dup3\n /* \"#utility.yul\":2507:2516 */\n dup6\n /* \"#utility.yul\":2503:2521 */\n add\n /* \"#utility.yul\":2496:2530 */\n mstore\n /* \"#utility.yul\":2548:2549 */\n 0x00\n /* \"#utility.yul\":2558:2698 */\n tag_50:\n /* \"#utility.yul\":2572:2578 */\n dup2\n /* \"#utility.yul\":2569:2570 */\n dup2\n /* \"#utility.yul\":2566:2579 */\n lt\n /* \"#utility.yul\":2558:2698 */\n iszero\n tag_52\n jumpi\n /* \"#utility.yul\":2667:2681 */\n dup6\n dup2\n add\n /* \"#utility.yul\":2663:2686 */\n dup4\n add\n /* \"#utility.yul\":2657:2687 */\n mload\n /* \"#utility.yul\":2633:2650 */\n dup6\n dup3\n add\n /* \"#utility.yul\":2652:2654 */\n 0x40\n /* \"#utility.yul\":2629:2655 */\n add\n /* \"#utility.yul\":2622:2688 */\n mstore\n /* \"#utility.yul\":2587:2597 */\n dup3\n add\n /* \"#utility.yul\":2558:2698 */\n jump(tag_50)\n tag_52:\n /* \"#utility.yul\":2562:2565 */\n pop\n /* \"#utility.yul\":2747:2748 */\n 0x00\n /* \"#utility.yul\":2742:2744 */\n 0x40\n /* \"#utility.yul\":2733:2739 */\n dup3\n /* \"#utility.yul\":2722:2731 */\n dup7\n /* \"#utility.yul\":2718:2740 */\n add\n /* \"#utility.yul\":2714:2745 */\n add\n /* \"#utility.yul\":2707:2749 */\n mstore\n /* \"#utility.yul\":2876:2878 */\n 0x40\n /* \"#utility.yul\":2806:2872 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n /* \"#utility.yul\":2801:2803 */\n 0x1f\n /* \"#utility.yul\":2793:2799 */\n dup4\n /* \"#utility.yul\":2789:2804 */\n add\n /* \"#utility.yul\":2785:2873 */\n and\n /* \"#utility.yul\":2774:2783 */\n dup6\n /* \"#utility.yul\":2770:2874 */\n add\n /* \"#utility.yul\":2766:2879 */\n add\n /* \"#utility.yul\":2758:2879 */\n swap3\n pop\n pop\n pop\n /* \"#utility.yul\":2280:2885 */\n swap3\n swap2\n pop\n pop\n jump\t// out\n\n auxdata: 0xa264697066735822122001c76a69e8b3fef98970ac002bb7976078d0e17b12897e7965b9442691a3a58464736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b5061040e806100206000396000f3fe6080604052600436106100295760003560e01c806301ffc9a71461002e57806390042baf14610063575b600080fd5b34801561003a57600080fd5b5061004e610049366004610225565b61009b565b60405190151581526020015b60405180910390f35b61007661007136600461029d565b610136565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161005a565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016100ee57506001919050565b507fffffffff00000000000000000000000000000000000000000000000000000000167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b600033301461017e576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b81516020830134f0905073ffffffffffffffffffffffffffffffffffffffff81166101d757816040517f0d257191000000000000000000000000000000000000000000000000000000008152600401610175919061036c565b60405173ffffffffffffffffffffffffffffffffffffffff821681527fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b60006020828403121561023757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461026757600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156102af57600080fd5b813567ffffffffffffffff808211156102c757600080fd5b818401915084601f8301126102db57600080fd5b8135818111156102ed576102ed61026e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156103335761033361026e565b8160405282815287602084870101111561034c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156103995785810183015185820160400152820161037d565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509291505056fea264697066735822122001c76a69e8b3fef98970ac002bb7976078d0e17b12897e7965b9442691a3a58464736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40E DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0x90042BAF EQ PUSH2 0x63 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x225 JUMP JUMPDEST PUSH2 0x9B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x76 PUSH2 0x71 CALLDATASIZE PUSH1 0x4 PUSH2 0x29D JUMP JUMPDEST PUSH2 0x136 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x5A JUMP JUMPDEST PUSH1 0x0 PUSH32 0x6FFBD45100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0xEE JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x17E JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD CALLVALUE CREATE SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1D7 JUMPI DUP2 PUSH1 0x40 MLOAD PUSH32 0xD25719100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x175 SWAP2 SWAP1 PUSH2 0x36C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0xA506AD4E7F05ECEBA62A023C3219E5BD98A615F4FA87E2AFB08A2DA5CF62BF0C SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2ED JUMPI PUSH2 0x2ED PUSH2 0x26E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x333 JUMPI PUSH2 0x333 PUSH2 0x26E JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x34C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x399 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x37D JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADD 0xC7 PUSH11 0x69E8B3FEF98970AC002BB7 SWAP8 PUSH1 0x78 0xD0 0xE1 PUSH28 0x12897E7965B9442691A3A58464736F6C634300081200330000000000 ", + "sourceMap": "169:1008:4:-:0;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@createContract_876": { + "entryPoint": 310, + "id": 876, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_901": { + "entryPoint": 155, + "id": 901, + "parameterSlots": 1, + "returnSlots": 1 + }, + "@supportsInterface_919": { + "entryPoint": null, + "id": 919, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes4": { + "entryPoint": 549, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_bytes_memory_ptr": { + "entryPoint": 669, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed": { + "entryPoint": 876, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "panic_error_0x41": { + "entryPoint": 622, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2887:22", + "statements": [ + { + "nodeType": "YulBlock", + "src": "6:3:22", + "statements": [] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "83:263:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "129:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "138:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "141:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "131:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "131:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "131:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "104:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "113:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "100:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "100:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "125:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "96:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "96:32:22" + }, + "nodeType": "YulIf", + "src": "93:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "154:36:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "180:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "167:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "167:23:22" + }, + "variables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "158:5:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "309:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "312:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "302:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "302:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "302:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "212:5:22" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "223:5:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "230:66:22", + "type": "", + "value": "0xffffffff00000000000000000000000000000000000000000000000000000000" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "219:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "219:78:22" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "209:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "209:89:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "202:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "202:97:22" + }, + "nodeType": "YulIf", + "src": "199:117:22" + }, + { + "nodeType": "YulAssignment", + "src": "325:15:22", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "335:5:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "325:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes4", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "49:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "60:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "72:6:22", + "type": "" + } + ], + "src": "14:332:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "446:92:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "456:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "468:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "479:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "464:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "464:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "456:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "498:9:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "523:6:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "516:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "516:14:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "509:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "509:22:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "491:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "491:41:22" + }, + "nodeType": "YulExpressionStatement", + "src": "491:41:22" + } + ] + }, + "name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "415:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "426:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "437:4:22", + "type": "" + } + ], + "src": "351:187:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "575:152:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "592:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "595:77:22", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "585:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "585:88:22" + }, + "nodeType": "YulExpressionStatement", + "src": "585:88:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "689:1:22", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "692:4:22", + "type": "", + "value": "0x41" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "682:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "682:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "682:15:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "713:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "716:4:22", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "706:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "706:15:22" + }, + "nodeType": "YulExpressionStatement", + "src": "706:15:22" + } + ] + }, + "name": "panic_error_0x41", + "nodeType": "YulFunctionDefinition", + "src": "543:184:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "811:901:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "857:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "866:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "869:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "859:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "859:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "859:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "832:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "841:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "828:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "828:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "853:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "824:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "824:32:22" + }, + "nodeType": "YulIf", + "src": "821:52:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "882:37:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "909:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "896:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "896:23:22" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "886:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "928:28:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "938:18:22", + "type": "", + "value": "0xffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "932:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "983:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "992:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "995:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "985:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "985:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "985:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "971:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "979:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "968:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "968:14:22" + }, + "nodeType": "YulIf", + "src": "965:34:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1008:32:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1022:9:22" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1033:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1018:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1018:22:22" + }, + "variables": [ + { + "name": "_2", + "nodeType": "YulTypedName", + "src": "1012:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1088:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1097:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1100:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1090:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1090:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1090:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "1067:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1071:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1063:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1063:13:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1078:7:22" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1059:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1059:27:22" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "1052:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1052:35:22" + }, + "nodeType": "YulIf", + "src": "1049:55:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1113:26:22", + "value": { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "1136:2:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1123:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "1123:16:22" + }, + "variables": [ + { + "name": "_3", + "nodeType": "YulTypedName", + "src": "1117:2:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1162:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nodeType": "YulIdentifier", + "src": "1164:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "1164:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1164:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "1154:2:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "1158:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1151:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "1151:10:22" + }, + "nodeType": "YulIf", + "src": "1148:36:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1193:76:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1203:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + }, + "variables": [ + { + "name": "_4", + "nodeType": "YulTypedName", + "src": "1197:2:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1278:23:22", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1298:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "1292:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "1292:9:22" + }, + "variables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1282:6:22", + "type": "" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "1310:71:22", + "value": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1332:6:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "1356:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1360:4:22", + "type": "", + "value": "0x1f" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1352:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1352:13:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "1367:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "1348:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1348:22:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1372:2:22", + "type": "", + "value": "63" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1344:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1344:31:22" + }, + { + "name": "_4", + "nodeType": "YulIdentifier", + "src": "1377:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "1340:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1340:40:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1328:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1328:53:22" + }, + "variables": [ + { + "name": "newFreePtr", + "nodeType": "YulTypedName", + "src": "1314:10:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1440:22:22", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x41", + "nodeType": "YulIdentifier", + "src": "1442:16:22" + }, + "nodeType": "YulFunctionCall", + "src": "1442:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1442:18:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "1399:10:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "1411:2:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1396:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "1396:18:22" + }, + { + "arguments": [ + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "1419:10:22" + }, + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1431:6:22" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "1416:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "1416:22:22" + } + ], + "functionName": { + "name": "or", + "nodeType": "YulIdentifier", + "src": "1393:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "1393:46:22" + }, + "nodeType": "YulIf", + "src": "1390:72:22" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1478:2:22", + "type": "", + "value": "64" + }, + { + "name": "newFreePtr", + "nodeType": "YulIdentifier", + "src": "1482:10:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1471:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1471:22:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1471:22:22" + }, + { + "expression": { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1509:6:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "1517:2:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1502:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1502:18:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1502:18:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1566:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1575:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1578:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1568:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1568:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1568:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "1543:2:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "1547:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1539:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1539:11:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1552:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1535:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1535:20:22" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1557:7:22" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1532:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "1532:33:22" + }, + "nodeType": "YulIf", + "src": "1529:53:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1608:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1616:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1604:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1604:15:22" + }, + { + "arguments": [ + { + "name": "_2", + "nodeType": "YulIdentifier", + "src": "1625:2:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1629:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1621:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1621:11:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "1634:2:22" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "1591:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "1591:46:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1591:46:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1661:6:22" + }, + { + "name": "_3", + "nodeType": "YulIdentifier", + "src": "1669:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1657:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1657:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1674:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1653:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1653:24:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1679:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1646:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1646:35:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1646:35:22" + }, + { + "nodeType": "YulAssignment", + "src": "1690:16:22", + "value": { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1700:6:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1690:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_bytes_memory_ptr", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "777:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "788:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "800:6:22", + "type": "" + } + ], + "src": "732:980:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1818:125:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1828:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1840:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1851:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1836:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1836:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1828:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1870:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1885:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1893:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "1881:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "1881:55:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1863:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "1863:74:22" + }, + "nodeType": "YulExpressionStatement", + "src": "1863:74:22" + } + ] + }, + "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1787:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1798:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1809:4:22", + "type": "" + } + ], + "src": "1717:226:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2077:198:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2087:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2099:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2110:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2095:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2095:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2087:4:22" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2122:52:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2132:42:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "2126:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2190:9:22" + }, + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2205:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2213:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "2201:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2201:15:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2183:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2183:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2183:34:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2237:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2248:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2233:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2233:18:22" + }, + { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "2257:6:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2265:2:22" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "2253:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2253:15:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2226:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2226:43:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2226:43:22" + } + ] + }, + "name": "abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2038:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "2049:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "2057:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2068:4:22", + "type": "" + } + ], + "src": "1948:327:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2399:486:22", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "2409:12:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2419:2:22", + "type": "", + "value": "32" + }, + "variables": [ + { + "name": "_1", + "nodeType": "YulTypedName", + "src": "2413:2:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2437:9:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2448:2:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2430:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2430:21:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2430:21:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2460:27:22", + "value": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2480:6:22" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "2474:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "2474:13:22" + }, + "variables": [ + { + "name": "length", + "nodeType": "YulTypedName", + "src": "2464:6:22", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2507:9:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2518:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2503:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2503:18:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "2523:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2496:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2496:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2496:34:22" + }, + { + "nodeType": "YulVariableDeclaration", + "src": "2539:10:22", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2548:1:22", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "i", + "nodeType": "YulTypedName", + "src": "2543:1:22", + "type": "" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2608:90:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2637:9:22" + }, + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "2648:1:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2633:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2633:17:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2652:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2629:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2629:26:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2671:6:22" + }, + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "2679:1:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2667:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2667:14:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2683:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2663:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2663:23:22" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "2657:5:22" + }, + "nodeType": "YulFunctionCall", + "src": "2657:30:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2622:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2622:66:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2622:66:22" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "2569:1:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "2572:6:22" + } + ], + "functionName": { + "name": "lt", + "nodeType": "YulIdentifier", + "src": "2566:2:22" + }, + "nodeType": "YulFunctionCall", + "src": "2566:13:22" + }, + "nodeType": "YulForLoop", + "post": { + "nodeType": "YulBlock", + "src": "2580:19:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2582:15:22", + "value": { + "arguments": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "2591:1:22" + }, + { + "name": "_1", + "nodeType": "YulIdentifier", + "src": "2594:2:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2587:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2587:10:22" + }, + "variableNames": [ + { + "name": "i", + "nodeType": "YulIdentifier", + "src": "2582:1:22" + } + ] + } + ] + }, + "pre": { + "nodeType": "YulBlock", + "src": "2562:3:22", + "statements": [] + }, + "src": "2558:140:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2722:9:22" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "2733:6:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2718:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2718:22:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2742:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2714:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2714:31:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2747:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2707:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "2707:42:22" + }, + "nodeType": "YulExpressionStatement", + "src": "2707:42:22" + }, + { + "nodeType": "YulAssignment", + "src": "2758:121:22", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2774:9:22" + }, + { + "arguments": [ + { + "arguments": [ + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "2793:6:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2801:2:22", + "type": "", + "value": "31" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2789:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2789:15:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2806:66:22", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "2785:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2785:88:22" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2770:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2770:104:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2876:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2766:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "2766:113:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2758:4:22" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2368:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "2379:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2390:4:22", + "type": "" + } + ], + "src": "2280:605:22" + } + ] + }, + "contents": "{\n { }\n function abi_decode_tuple_t_bytes4(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let value := calldataload(headStart)\n if iszero(eq(value, and(value, 0xffffffff00000000000000000000000000000000000000000000000000000000))) { revert(0, 0) }\n value0 := value\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function panic_error_0x41()\n {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x41)\n revert(0, 0x24)\n }\n function abi_decode_tuple_t_bytes_memory_ptr(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n let offset := calldataload(headStart)\n let _1 := 0xffffffffffffffff\n if gt(offset, _1) { revert(0, 0) }\n let _2 := add(headStart, offset)\n if iszero(slt(add(_2, 0x1f), dataEnd)) { revert(0, 0) }\n let _3 := calldataload(_2)\n if gt(_3, _1) { panic_error_0x41() }\n let _4 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n let memPtr := mload(64)\n let newFreePtr := add(memPtr, and(add(and(add(_3, 0x1f), _4), 63), _4))\n if or(gt(newFreePtr, _1), lt(newFreePtr, memPtr)) { panic_error_0x41() }\n mstore(64, newFreePtr)\n mstore(memPtr, _3)\n if gt(add(add(_2, _3), 32), dataEnd) { revert(0, 0) }\n calldatacopy(add(memPtr, 32), add(_2, 32), _3)\n mstore(add(add(memPtr, _3), 32), 0)\n value0 := memPtr\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xffffffffffffffffffffffffffffffffffffffff))\n }\n function abi_encode_tuple_t_address_t_address__to_t_address_t_address__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n let _1 := 0xffffffffffffffffffffffffffffffffffffffff\n mstore(headStart, and(value0, _1))\n mstore(add(headStart, 32), and(value1, _1))\n }\n function abi_encode_tuple_t_bytes_memory_ptr__to_t_bytes_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := 0\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n mstore(add(add(headStart, length), 64), 0)\n tail := add(add(headStart, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 64)\n }\n}", + "id": 22, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600436106100295760003560e01c806301ffc9a71461002e57806390042baf14610063575b600080fd5b34801561003a57600080fd5b5061004e610049366004610225565b61009b565b60405190151581526020015b60405180910390f35b61007661007136600461029d565b610136565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161005a565b60007f6ffbd451000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316016100ee57506001919050565b507fffffffff00000000000000000000000000000000000000000000000000000000167f01ffc9a7000000000000000000000000000000000000000000000000000000001490565b600033301461017e576040517fe12588940000000000000000000000000000000000000000000000000000000081523360048201523060248201526044015b60405180910390fd5b81516020830134f0905073ffffffffffffffffffffffffffffffffffffffff81166101d757816040517f0d257191000000000000000000000000000000000000000000000000000000008152600401610175919061036c565b60405173ffffffffffffffffffffffffffffffffffffffff821681527fa506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c9060200160405180910390a1919050565b60006020828403121561023757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461026757600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156102af57600080fd5b813567ffffffffffffffff808211156102c757600080fd5b818401915084601f8301126102db57600080fd5b8135818111156102ed576102ed61026e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156103335761033361026e565b8160405282815287602084870101111561034c57600080fd5b826020860160208301376000928101602001929092525095945050505050565b600060208083528351808285015260005b818110156103995785810183015185820160400152820161037d565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116850101925050509291505056fea264697066735822122001c76a69e8b3fef98970ac002bb7976078d0e17b12897e7965b9442691a3a58464736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x29 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1FFC9A7 EQ PUSH2 0x2E JUMPI DUP1 PUSH4 0x90042BAF EQ PUSH2 0x63 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x225 JUMP JUMPDEST PUSH2 0x9B JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x76 PUSH2 0x71 CALLDATASIZE PUSH1 0x4 PUSH2 0x29D JUMP JUMPDEST PUSH2 0x136 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x5A JUMP JUMPDEST PUSH1 0x0 PUSH32 0x6FFBD45100000000000000000000000000000000000000000000000000000000 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP4 AND ADD PUSH2 0xEE JUMPI POP PUSH1 0x1 SWAP2 SWAP1 POP JUMP JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH32 0x1FFC9A700000000000000000000000000000000000000000000000000000000 EQ SWAP1 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x17E JUMPI PUSH1 0x40 MLOAD PUSH32 0xE125889400000000000000000000000000000000000000000000000000000000 DUP2 MSTORE CALLER PUSH1 0x4 DUP3 ADD MSTORE ADDRESS PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x44 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x20 DUP4 ADD CALLVALUE CREATE SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH2 0x1D7 JUMPI DUP2 PUSH1 0x40 MLOAD PUSH32 0xD25719100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x175 SWAP2 SWAP1 PUSH2 0x36C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND DUP2 MSTORE PUSH32 0xA506AD4E7F05ECEBA62A023C3219E5BD98A615F4FA87E2AFB08A2DA5CF62BF0C SWAP1 PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND DUP2 EQ PUSH2 0x267 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x2ED JUMPI PUSH2 0x2ED PUSH2 0x26E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x333 JUMPI PUSH2 0x333 PUSH2 0x26E JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x34C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x399 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x37D JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x40 DUP3 DUP7 ADD ADD MSTORE PUSH1 0x40 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 PUSH1 0x1F DUP4 ADD AND DUP6 ADD ADD SWAP3 POP POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ADD 0xC7 PUSH11 0x69E8B3FEF98970AC002BB7 SWAP8 PUSH1 0x78 0xD0 0xE1 PUSH28 0x12897E7965B9442691A3A58464736F6C634300081200330000000000 ", + "sourceMap": "169:1008:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;942:233;;;;;;;;;;-1:-1:-1;942:233:4;;;;;:::i;:::-;;:::i;:::-;;;516:14:22;;509:22;491:41;;479:2;464:18;942:233:4;;;;;;;;456:276;;;;;;:::i;:::-;;:::i;:::-;;;1893:42:22;1881:55;;;1863:74;;1851:2;1836:18;456:276:4;1717:226:22;942:233:4;1028:4;1044:48;;;;;1040:80;;-1:-1:-1;1109:4:4;;942:233;-1:-1:-1;942:233:4:o;1040:80::-;-1:-1:-1;709:47:5;;725:31;709:47;;942:233:4:o;456:276::-;550:12;178:10:8;200:4;178:27;174:94;;222:39;;;;;235:10;222:39;;;2183:34:22;255:4:8;2233:18:22;;;2226:43;2095:18;;222:39:8;;;;;;;;174:94;631:5:4::1;625:12;620:2;613:5;609:14;596:11;589:49;581:57:::0;-1:-1:-1;649:18:4::1;::::0;::::1;645:50;;689:5;676:19;;;;;;;;;;;:::i;645:50::-;706:21;::::0;1893:42:22;1881:55;;1863:74;;706:21:4::1;::::0;1851:2:22;1836:18;706:21:4::1;;;;;;;456:276:::0;;;:::o;14:332:22:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;199:117;335:5;14:332;-1:-1:-1;;;14:332:22:o;543:184::-;595:77;592:1;585:88;692:4;689:1;682:15;716:4;713:1;706:15;732:980;800:6;853:2;841:9;832:7;828:23;824:32;821:52;;;869:1;866;859:12;821:52;909:9;896:23;938:18;979:2;971:6;968:14;965:34;;;995:1;992;985:12;965:34;1033:6;1022:9;1018:22;1008:32;;1078:7;1071:4;1067:2;1063:13;1059:27;1049:55;;1100:1;1097;1090:12;1049:55;1136:2;1123:16;1158:2;1154;1151:10;1148:36;;;1164:18;;:::i;:::-;1298:2;1292:9;1360:4;1352:13;;1203:66;1348:22;;;1372:2;1344:31;1340:40;1328:53;;;1396:18;;;1416:22;;;1393:46;1390:72;;;1442:18;;:::i;:::-;1482:10;1478:2;1471:22;1517:2;1509:6;1502:18;1557:7;1552:2;1547;1543;1539:11;1535:20;1532:33;1529:53;;;1578:1;1575;1568:12;1529:53;1634:2;1629;1625;1621:11;1616:2;1608:6;1604:15;1591:46;1679:1;1657:15;;;1674:2;1653:24;1646:35;;;;-1:-1:-1;1661:6:22;732:980;-1:-1:-1;;;;;732:980:22:o;2280:605::-;2390:4;2419:2;2448;2437:9;2430:21;2480:6;2474:13;2523:6;2518:2;2507:9;2503:18;2496:34;2548:1;2558:140;2572:6;2569:1;2566:13;2558:140;;;2667:14;;;2663:23;;2657:30;2633:17;;;2652:2;2629:26;2622:66;2587:10;;2558:140;;;2562:3;2747:1;2742:2;2733:6;2722:9;2718:22;2714:31;2707:42;2876:2;2806:66;2801:2;2793:6;2789:15;2785:88;2774:9;2770:104;2766:113;2758:121;;;;2280:605;;;;:::o" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "207600", + "executionCost": "251", + "totalCost": "207851" + }, + "external": { + "createContract(bytes)": "infinite", + "supportsInterface(bytes4)": "334" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "80" + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 169, + "end": 1177, + "name": "MSTORE", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "CALLVALUE", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "DUP1", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "ISZERO", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH [tag]", + "source": 4, + "value": "1" + }, + { + "begin": 169, + "end": 1177, + "name": "JUMPI", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 169, + "end": 1177, + "name": "DUP1", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "REVERT", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "tag", + "source": 4, + "value": "1" + }, + { + "begin": 169, + "end": 1177, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "POP", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH #[$]", + "source": 4, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 169, + "end": 1177, + "name": "DUP1", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH [$]", + "source": 4, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 169, + "end": 1177, + "name": "CODECOPY", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 169, + "end": 1177, + "name": "RETURN", + "source": 4 + } + ], + ".data": { + "0": { + ".auxdata": "a264697066735822122001c76a69e8b3fef98970ac002bb7976078d0e17b12897e7965b9442691a3a58464736f6c63430008120033", + ".code": [ + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "80" + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 169, + "end": 1177, + "name": "MSTORE", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "4" + }, + { + "begin": 169, + "end": 1177, + "name": "CALLDATASIZE", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "LT", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH [tag]", + "source": 4, + "value": "1" + }, + { + "begin": 169, + "end": 1177, + "name": "JUMPI", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 169, + "end": 1177, + "name": "CALLDATALOAD", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "E0" + }, + { + "begin": 169, + "end": 1177, + "name": "SHR", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "DUP1", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "1FFC9A7" + }, + { + "begin": 169, + "end": 1177, + "name": "EQ", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH [tag]", + "source": 4, + "value": "2" + }, + { + "begin": 169, + "end": 1177, + "name": "JUMPI", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "DUP1", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "90042BAF" + }, + { + "begin": 169, + "end": 1177, + "name": "EQ", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH [tag]", + "source": 4, + "value": "3" + }, + { + "begin": 169, + "end": 1177, + "name": "JUMPI", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "tag", + "source": 4, + "value": "1" + }, + { + "begin": 169, + "end": 1177, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 169, + "end": 1177, + "name": "DUP1", + "source": 4 + }, + { + "begin": 169, + "end": 1177, + "name": "REVERT", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "tag", + "source": 4, + "value": "2" + }, + { + "begin": 942, + "end": 1175, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "CALLVALUE", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "DUP1", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "ISZERO", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH [tag]", + "source": 4, + "value": "4" + }, + { + "begin": 942, + "end": 1175, + "name": "JUMPI", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 942, + "end": 1175, + "name": "DUP1", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "REVERT", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "tag", + "source": 4, + "value": "4" + }, + { + "begin": 942, + "end": 1175, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH [tag]", + "source": 4, + "value": "5" + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH [tag]", + "source": 4, + "value": "6" + }, + { + "begin": 942, + "end": 1175, + "name": "CALLDATASIZE", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH", + "source": 4, + "value": "4" + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH [tag]", + "source": 4, + "value": "7" + }, + { + "begin": 942, + "end": 1175, + "jumpType": "[in]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "tag", + "source": 4, + "value": "6" + }, + { + "begin": 942, + "end": 1175, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH [tag]", + "source": 4, + "value": "8" + }, + { + "begin": 942, + "end": 1175, + "jumpType": "[in]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "tag", + "source": 4, + "value": "5" + }, + { + "begin": 942, + "end": 1175, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 942, + "end": 1175, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 516, + "end": 530, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 516, + "end": 530, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 509, + "end": 531, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 491, + "end": 532, + "name": "DUP2", + "source": 22 + }, + { + "begin": 491, + "end": 532, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 479, + "end": 481, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 464, + "end": 482, + "name": "ADD", + "source": 22 + }, + { + "begin": 942, + "end": 1175, + "name": "tag", + "source": 4, + "value": "9" + }, + { + "begin": 942, + "end": 1175, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 942, + "end": 1175, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "DUP1", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "SUB", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "RETURN", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "tag", + "source": 4, + "value": "3" + }, + { + "begin": 456, + "end": 732, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "11" + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "12" + }, + { + "begin": 456, + "end": 732, + "name": "CALLDATASIZE", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH", + "source": 4, + "value": "4" + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "13" + }, + { + "begin": 456, + "end": 732, + "jumpType": "[in]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "tag", + "source": 4, + "value": "12" + }, + { + "begin": 456, + "end": 732, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "14" + }, + { + "begin": 456, + "end": 732, + "jumpType": "[in]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "tag", + "source": 4, + "value": "11" + }, + { + "begin": 456, + "end": 732, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 456, + "end": 732, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 1893, + "end": 1935, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1881, + "end": 1936, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 1881, + "end": 1936, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 1881, + "end": 1936, + "name": "AND", + "source": 22 + }, + { + "begin": 1863, + "end": 1937, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1863, + "end": 1937, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 1851, + "end": 1853, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 1836, + "end": 1854, + "name": "ADD", + "source": 22 + }, + { + "begin": 456, + "end": 732, + "name": "PUSH [tag]", + "source": 4, + "value": "9" + }, + { + "begin": 1717, + "end": 1943, + "name": "JUMP", + "source": 22 + }, + { + "begin": 942, + "end": 1175, + "name": "tag", + "source": 4, + "value": "8" + }, + { + "begin": 942, + "end": 1175, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 1028, + "end": 1032, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 1044, + "end": 1092, + "name": "PUSH", + "source": 4, + "value": "6FFBD45100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1044, + "end": 1092, + "name": "PUSH", + "source": 4, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 1044, + "end": 1092, + "name": "DUP4", + "source": 4 + }, + { + "begin": 1044, + "end": 1092, + "name": "AND", + "source": 4 + }, + { + "begin": 1044, + "end": 1092, + "name": "ADD", + "source": 4 + }, + { + "begin": 1040, + "end": 1120, + "name": "PUSH [tag]", + "source": 4, + "value": "18" + }, + { + "begin": 1040, + "end": 1120, + "name": "JUMPI", + "source": 4 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1109, + "end": 1113, + "name": "PUSH", + "source": 4, + "value": "1" + }, + { + "begin": 1109, + "end": 1113, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 942, + "end": 1175, + "name": "SWAP1", + "source": 4 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 942, + "end": 1175, + "jumpType": "[out]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 1040, + "end": 1120, + "name": "tag", + "source": 4, + "value": "18" + }, + { + "begin": 1040, + "end": 1120, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 709, + "end": 756, + "name": "PUSH", + "source": 5, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 709, + "end": 756, + "name": "AND", + "source": 5 + }, + { + "begin": 725, + "end": 756, + "name": "PUSH", + "source": 5, + "value": "1FFC9A700000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 709, + "end": 756, + "name": "EQ", + "source": 5 + }, + { + "begin": 709, + "end": 756, + "name": "SWAP1", + "source": 5 + }, + { + "begin": 942, + "end": 1175, + "jumpType": "[out]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "tag", + "source": 4, + "value": "14" + }, + { + "begin": 456, + "end": 732, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 550, + "end": 562, + "name": "PUSH", + "source": 4, + "value": "0" + }, + { + "begin": 178, + "end": 188, + "name": "CALLER", + "source": 8 + }, + { + "begin": 200, + "end": 204, + "name": "ADDRESS", + "source": 8 + }, + { + "begin": 178, + "end": 205, + "name": "EQ", + "source": 8 + }, + { + "begin": 174, + "end": 268, + "name": "PUSH [tag]", + "source": 8, + "value": "22" + }, + { + "begin": 174, + "end": 268, + "name": "JUMPI", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "40" + }, + { + "begin": 222, + "end": 261, + "name": "MLOAD", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "E125889400000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 222, + "end": 261, + "name": "DUP2", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "MSTORE", + "source": 8 + }, + { + "begin": 235, + "end": 245, + "name": "CALLER", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "4" + }, + { + "begin": 222, + "end": 261, + "name": "DUP3", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "ADD", + "source": 8 + }, + { + "begin": 2183, + "end": 2217, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 255, + "end": 259, + "name": "ADDRESS", + "source": 8 + }, + { + "begin": 2233, + "end": 2251, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 2233, + "end": 2251, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2233, + "end": 2251, + "name": "ADD", + "source": 22 + }, + { + "begin": 2226, + "end": 2269, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2095, + "end": 2113, + "name": "PUSH", + "source": 22, + "value": "44" + }, + { + "begin": 2095, + "end": 2113, + "name": "ADD", + "source": 22 + }, + { + "begin": 222, + "end": 261, + "name": "tag", + "source": 8, + "value": "23" + }, + { + "begin": 222, + "end": 261, + "name": "JUMPDEST", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "PUSH", + "source": 8, + "value": "40" + }, + { + "begin": 222, + "end": 261, + "name": "MLOAD", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "DUP1", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "SWAP2", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "SUB", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "SWAP1", + "source": 8 + }, + { + "begin": 222, + "end": 261, + "name": "REVERT", + "source": 8 + }, + { + "begin": 174, + "end": 268, + "name": "tag", + "source": 8, + "value": "22" + }, + { + "begin": 174, + "end": 268, + "name": "JUMPDEST", + "source": 8 + }, + { + "begin": 631, + "end": 636, + "modifierDepth": 1, + "name": "DUP2", + "source": 4 + }, + { + "begin": 625, + "end": 637, + "modifierDepth": 1, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 620, + "end": 622, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "20" + }, + { + "begin": 613, + "end": 618, + "modifierDepth": 1, + "name": "DUP4", + "source": 4 + }, + { + "begin": 609, + "end": 623, + "modifierDepth": 1, + "name": "ADD", + "source": 4 + }, + { + "begin": 596, + "end": 607, + "modifierDepth": 1, + "name": "CALLVALUE", + "source": 4 + }, + { + "begin": 589, + "end": 638, + "modifierDepth": 1, + "name": "CREATE", + "source": 4 + }, + { + "begin": 581, + "end": 638, + "name": "SWAP1", + "source": 4 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 649, + "end": 667, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 649, + "end": 667, + "name": "DUP2", + "source": 4 + }, + { + "begin": 649, + "end": 667, + "modifierDepth": 1, + "name": "AND", + "source": 4 + }, + { + "begin": 645, + "end": 695, + "modifierDepth": 1, + "name": "PUSH [tag]", + "source": 4, + "value": "26" + }, + { + "begin": 645, + "end": 695, + "modifierDepth": 1, + "name": "JUMPI", + "source": 4 + }, + { + "begin": 689, + "end": 694, + "modifierDepth": 1, + "name": "DUP2", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "D25719100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "DUP2", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "MSTORE", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "4" + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "ADD", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH [tag]", + "source": 4, + "value": "23" + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 676, + "end": 695, + "modifierDepth": 1, + "name": "PUSH [tag]", + "source": 4, + "value": "28" + }, + { + "begin": 676, + "end": 695, + "jumpType": "[in]", + "modifierDepth": 1, + "name": "JUMP", + "source": 4 + }, + { + "begin": 645, + "end": 695, + "modifierDepth": 1, + "name": "tag", + "source": 4, + "value": "26" + }, + { + "begin": 645, + "end": 695, + "modifierDepth": 1, + "name": "JUMPDEST", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 706, + "end": 727, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 1893, + "end": 1935, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + }, + { + "begin": 1881, + "end": 1936, + "name": "DUP3", + "source": 22 + }, + { + "begin": 1881, + "end": 1936, + "name": "AND", + "source": 22 + }, + { + "begin": 1863, + "end": 1937, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1863, + "end": 1937, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "A506AD4E7F05ECEBA62A023C3219E5BD98A615F4FA87E2AFB08A2DA5CF62BF0C" + }, + { + "begin": 706, + "end": 727, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 1851, + "end": 1853, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 1836, + "end": 1854, + "name": "ADD", + "source": 22 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "PUSH", + "source": 4, + "value": "40" + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "MLOAD", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "DUP1", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "SUB", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 706, + "end": 727, + "modifierDepth": 1, + "name": "LOG1", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "SWAP2", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "SWAP1", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "name": "POP", + "source": 4 + }, + { + "begin": 456, + "end": 732, + "jumpType": "[out]", + "name": "JUMP", + "source": 4 + }, + { + "begin": 14, + "end": 346, + "name": "tag", + "source": 22, + "value": "7" + }, + { + "begin": 14, + "end": 346, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 72, + "end": 78, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 125, + "end": 127, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 113, + "end": 122, + "name": "DUP3", + "source": 22 + }, + { + "begin": 104, + "end": 111, + "name": "DUP5", + "source": 22 + }, + { + "begin": 100, + "end": 123, + "name": "SUB", + "source": 22 + }, + { + "begin": 96, + "end": 128, + "name": "SLT", + "source": 22 + }, + { + "begin": 93, + "end": 145, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 93, + "end": 145, + "name": "PUSH [tag]", + "source": 22, + "value": "34" + }, + { + "begin": 93, + "end": 145, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 141, + "end": 142, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 138, + "end": 139, + "name": "DUP1", + "source": 22 + }, + { + "begin": 131, + "end": 143, + "name": "REVERT", + "source": 22 + }, + { + "begin": 93, + "end": 145, + "name": "tag", + "source": 22, + "value": "34" + }, + { + "begin": 93, + "end": 145, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 180, + "end": 189, + "name": "DUP2", + "source": 22 + }, + { + "begin": 167, + "end": 190, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 230, + "end": 296, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFF00000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 223, + "end": 228, + "name": "DUP2", + "source": 22 + }, + { + "begin": 219, + "end": 297, + "name": "AND", + "source": 22 + }, + { + "begin": 212, + "end": 217, + "name": "DUP2", + "source": 22 + }, + { + "begin": 209, + "end": 298, + "name": "EQ", + "source": 22 + }, + { + "begin": 199, + "end": 316, + "name": "PUSH [tag]", + "source": 22, + "value": "35" + }, + { + "begin": 199, + "end": 316, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 312, + "end": 313, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 309, + "end": 310, + "name": "DUP1", + "source": 22 + }, + { + "begin": 302, + "end": 314, + "name": "REVERT", + "source": 22 + }, + { + "begin": 199, + "end": 316, + "name": "tag", + "source": 22, + "value": "35" + }, + { + "begin": 199, + "end": 316, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 335, + "end": 340, + "name": "SWAP4", + "source": 22 + }, + { + "begin": 14, + "end": 346, + "name": "SWAP3", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 14, + "end": 346, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 543, + "end": 727, + "name": "tag", + "source": 22, + "value": "31" + }, + { + "begin": 543, + "end": 727, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 595, + "end": 672, + "name": "PUSH", + "source": 22, + "value": "4E487B7100000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 592, + "end": 593, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 585, + "end": 673, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 692, + "end": 696, + "name": "PUSH", + "source": 22, + "value": "41" + }, + { + "begin": 689, + "end": 690, + "name": "PUSH", + "source": 22, + "value": "4" + }, + { + "begin": 682, + "end": 697, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 716, + "end": 720, + "name": "PUSH", + "source": 22, + "value": "24" + }, + { + "begin": 713, + "end": 714, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 706, + "end": 721, + "name": "REVERT", + "source": 22 + }, + { + "begin": 732, + "end": 1712, + "name": "tag", + "source": 22, + "value": "13" + }, + { + "begin": 732, + "end": 1712, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 800, + "end": 806, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 853, + "end": 855, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 841, + "end": 850, + "name": "DUP3", + "source": 22 + }, + { + "begin": 832, + "end": 839, + "name": "DUP5", + "source": 22 + }, + { + "begin": 828, + "end": 851, + "name": "SUB", + "source": 22 + }, + { + "begin": 824, + "end": 856, + "name": "SLT", + "source": 22 + }, + { + "begin": 821, + "end": 873, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 821, + "end": 873, + "name": "PUSH [tag]", + "source": 22, + "value": "39" + }, + { + "begin": 821, + "end": 873, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 869, + "end": 870, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 866, + "end": 867, + "name": "DUP1", + "source": 22 + }, + { + "begin": 859, + "end": 871, + "name": "REVERT", + "source": 22 + }, + { + "begin": 821, + "end": 873, + "name": "tag", + "source": 22, + "value": "39" + }, + { + "begin": 821, + "end": 873, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 909, + "end": 918, + "name": "DUP2", + "source": 22 + }, + { + "begin": 896, + "end": 919, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 938, + "end": 956, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFF" + }, + { + "begin": 979, + "end": 981, + "name": "DUP1", + "source": 22 + }, + { + "begin": 971, + "end": 977, + "name": "DUP3", + "source": 22 + }, + { + "begin": 968, + "end": 982, + "name": "GT", + "source": 22 + }, + { + "begin": 965, + "end": 999, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 965, + "end": 999, + "name": "PUSH [tag]", + "source": 22, + "value": "40" + }, + { + "begin": 965, + "end": 999, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 995, + "end": 996, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 992, + "end": 993, + "name": "DUP1", + "source": 22 + }, + { + "begin": 985, + "end": 997, + "name": "REVERT", + "source": 22 + }, + { + "begin": 965, + "end": 999, + "name": "tag", + "source": 22, + "value": "40" + }, + { + "begin": 965, + "end": 999, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1033, + "end": 1039, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1022, + "end": 1031, + "name": "DUP5", + "source": 22 + }, + { + "begin": 1018, + "end": 1040, + "name": "ADD", + "source": 22 + }, + { + "begin": 1008, + "end": 1040, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 1008, + "end": 1040, + "name": "POP", + "source": 22 + }, + { + "begin": 1078, + "end": 1085, + "name": "DUP5", + "source": 22 + }, + { + "begin": 1071, + "end": 1075, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 1067, + "end": 1069, + "name": "DUP4", + "source": 22 + }, + { + "begin": 1063, + "end": 1076, + "name": "ADD", + "source": 22 + }, + { + "begin": 1059, + "end": 1086, + "name": "SLT", + "source": 22 + }, + { + "begin": 1049, + "end": 1104, + "name": "PUSH [tag]", + "source": 22, + "value": "41" + }, + { + "begin": 1049, + "end": 1104, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 1100, + "end": 1101, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1097, + "end": 1098, + "name": "DUP1", + "source": 22 + }, + { + "begin": 1090, + "end": 1102, + "name": "REVERT", + "source": 22 + }, + { + "begin": 1049, + "end": 1104, + "name": "tag", + "source": 22, + "value": "41" + }, + { + "begin": 1049, + "end": 1104, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1136, + "end": 1138, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1123, + "end": 1139, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 1158, + "end": 1160, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1154, + "end": 1156, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1151, + "end": 1161, + "name": "GT", + "source": 22 + }, + { + "begin": 1148, + "end": 1184, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 1148, + "end": 1184, + "name": "PUSH [tag]", + "source": 22, + "value": "43" + }, + { + "begin": 1148, + "end": 1184, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 1164, + "end": 1182, + "name": "PUSH [tag]", + "source": 22, + "value": "43" + }, + { + "begin": 1164, + "end": 1182, + "name": "PUSH [tag]", + "source": 22, + "value": "31" + }, + { + "begin": 1164, + "end": 1182, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 1164, + "end": 1182, + "name": "tag", + "source": 22, + "value": "43" + }, + { + "begin": 1164, + "end": 1182, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1298, + "end": 1300, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 1292, + "end": 1301, + "name": "MLOAD", + "source": 22 + }, + { + "begin": 1360, + "end": 1364, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 1352, + "end": 1365, + "name": "DUP3", + "source": 22 + }, + { + "begin": 1352, + "end": 1365, + "name": "ADD", + "source": 22 + }, + { + "begin": 1203, + "end": 1269, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0" + }, + { + "begin": 1348, + "end": 1370, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 1348, + "end": 1370, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1348, + "end": 1370, + "name": "AND", + "source": 22 + }, + { + "begin": 1372, + "end": 1374, + "name": "PUSH", + "source": 22, + "value": "3F" + }, + { + "begin": 1344, + "end": 1375, + "name": "ADD", + "source": 22 + }, + { + "begin": 1340, + "end": 1380, + "name": "AND", + "source": 22 + }, + { + "begin": 1328, + "end": 1381, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1328, + "end": 1381, + "name": "ADD", + "source": 22 + }, + { + "begin": 1328, + "end": 1381, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 1396, + "end": 1414, + "name": "DUP4", + "source": 22 + }, + { + "begin": 1396, + "end": 1414, + "name": "DUP3", + "source": 22 + }, + { + "begin": 1396, + "end": 1414, + "name": "GT", + "source": 22 + }, + { + "begin": 1416, + "end": 1438, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1416, + "end": 1438, + "name": "DUP4", + "source": 22 + }, + { + "begin": 1416, + "end": 1438, + "name": "LT", + "source": 22 + }, + { + "begin": 1393, + "end": 1439, + "name": "OR", + "source": 22 + }, + { + "begin": 1390, + "end": 1462, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 1390, + "end": 1462, + "name": "PUSH [tag]", + "source": 22, + "value": "45" + }, + { + "begin": 1390, + "end": 1462, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 1442, + "end": 1460, + "name": "PUSH [tag]", + "source": 22, + "value": "45" + }, + { + "begin": 1442, + "end": 1460, + "name": "PUSH [tag]", + "source": 22, + "value": "31" + }, + { + "begin": 1442, + "end": 1460, + "jumpType": "[in]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 1442, + "end": 1460, + "name": "tag", + "source": 22, + "value": "45" + }, + { + "begin": 1442, + "end": 1460, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1482, + "end": 1492, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1478, + "end": 1480, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 1471, + "end": 1493, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 1517, + "end": 1519, + "name": "DUP3", + "source": 22 + }, + { + "begin": 1509, + "end": 1515, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1502, + "end": 1520, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 1557, + "end": 1564, + "name": "DUP8", + "source": 22 + }, + { + "begin": 1552, + "end": 1554, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 1547, + "end": 1549, + "name": "DUP5", + "source": 22 + }, + { + "begin": 1543, + "end": 1545, + "name": "DUP8", + "source": 22 + }, + { + "begin": 1539, + "end": 1550, + "name": "ADD", + "source": 22 + }, + { + "begin": 1535, + "end": 1555, + "name": "ADD", + "source": 22 + }, + { + "begin": 1532, + "end": 1565, + "name": "GT", + "source": 22 + }, + { + "begin": 1529, + "end": 1582, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 1529, + "end": 1582, + "name": "PUSH [tag]", + "source": 22, + "value": "46" + }, + { + "begin": 1529, + "end": 1582, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 1578, + "end": 1579, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1575, + "end": 1576, + "name": "DUP1", + "source": 22 + }, + { + "begin": 1568, + "end": 1580, + "name": "REVERT", + "source": 22 + }, + { + "begin": 1529, + "end": 1582, + "name": "tag", + "source": 22, + "value": "46" + }, + { + "begin": 1529, + "end": 1582, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 1634, + "end": 1636, + "name": "DUP3", + "source": 22 + }, + { + "begin": 1629, + "end": 1631, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 1625, + "end": 1627, + "name": "DUP7", + "source": 22 + }, + { + "begin": 1621, + "end": 1632, + "name": "ADD", + "source": 22 + }, + { + "begin": 1616, + "end": 1618, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 1608, + "end": 1614, + "name": "DUP4", + "source": 22 + }, + { + "begin": 1604, + "end": 1619, + "name": "ADD", + "source": 22 + }, + { + "begin": 1591, + "end": 1637, + "name": "CALLDATACOPY", + "source": 22 + }, + { + "begin": 1679, + "end": 1680, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 1657, + "end": 1672, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 1657, + "end": 1672, + "name": "DUP2", + "source": 22 + }, + { + "begin": 1657, + "end": 1672, + "name": "ADD", + "source": 22 + }, + { + "begin": 1674, + "end": 1676, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 1653, + "end": 1677, + "name": "ADD", + "source": 22 + }, + { + "begin": 1646, + "end": 1681, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 1646, + "end": 1681, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 1646, + "end": 1681, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 1646, + "end": 1681, + "name": "MSTORE", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 1661, + "end": 1667, + "name": "SWAP6", + "source": 22 + }, + { + "begin": 732, + "end": 1712, + "name": "SWAP5", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 732, + "end": 1712, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + }, + { + "begin": 2280, + "end": 2885, + "name": "tag", + "source": 22, + "value": "28" + }, + { + "begin": 2280, + "end": 2885, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 2390, + "end": 2394, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2419, + "end": 2421, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 2448, + "end": 2450, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2437, + "end": 2446, + "name": "DUP4", + "source": 22 + }, + { + "begin": 2430, + "end": 2451, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2480, + "end": 2486, + "name": "DUP4", + "source": 22 + }, + { + "begin": 2474, + "end": 2487, + "name": "MLOAD", + "source": 22 + }, + { + "begin": 2523, + "end": 2529, + "name": "DUP1", + "source": 22 + }, + { + "begin": 2518, + "end": 2520, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2507, + "end": 2516, + "name": "DUP6", + "source": 22 + }, + { + "begin": 2503, + "end": 2521, + "name": "ADD", + "source": 22 + }, + { + "begin": 2496, + "end": 2530, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2548, + "end": 2549, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2558, + "end": 2698, + "name": "tag", + "source": 22, + "value": "50" + }, + { + "begin": 2558, + "end": 2698, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 2572, + "end": 2578, + "name": "DUP2", + "source": 22 + }, + { + "begin": 2569, + "end": 2570, + "name": "DUP2", + "source": 22 + }, + { + "begin": 2566, + "end": 2579, + "name": "LT", + "source": 22 + }, + { + "begin": 2558, + "end": 2698, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 2558, + "end": 2698, + "name": "PUSH [tag]", + "source": 22, + "value": "52" + }, + { + "begin": 2558, + "end": 2698, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 2667, + "end": 2681, + "name": "DUP6", + "source": 22 + }, + { + "begin": 2667, + "end": 2681, + "name": "DUP2", + "source": 22 + }, + { + "begin": 2667, + "end": 2681, + "name": "ADD", + "source": 22 + }, + { + "begin": 2663, + "end": 2686, + "name": "DUP4", + "source": 22 + }, + { + "begin": 2663, + "end": 2686, + "name": "ADD", + "source": 22 + }, + { + "begin": 2657, + "end": 2687, + "name": "MLOAD", + "source": 22 + }, + { + "begin": 2633, + "end": 2650, + "name": "DUP6", + "source": 22 + }, + { + "begin": 2633, + "end": 2650, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2633, + "end": 2650, + "name": "ADD", + "source": 22 + }, + { + "begin": 2652, + "end": 2654, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 2629, + "end": 2655, + "name": "ADD", + "source": 22 + }, + { + "begin": 2622, + "end": 2688, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2587, + "end": 2597, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2587, + "end": 2597, + "name": "ADD", + "source": 22 + }, + { + "begin": 2558, + "end": 2698, + "name": "PUSH [tag]", + "source": 22, + "value": "50" + }, + { + "begin": 2558, + "end": 2698, + "name": "JUMP", + "source": 22 + }, + { + "begin": 2558, + "end": 2698, + "name": "tag", + "source": 22, + "value": "52" + }, + { + "begin": 2558, + "end": 2698, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 2562, + "end": 2565, + "name": "POP", + "source": 22 + }, + { + "begin": 2747, + "end": 2748, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 2742, + "end": 2744, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 2733, + "end": 2739, + "name": "DUP3", + "source": 22 + }, + { + "begin": 2722, + "end": 2731, + "name": "DUP7", + "source": 22 + }, + { + "begin": 2718, + "end": 2740, + "name": "ADD", + "source": 22 + }, + { + "begin": 2714, + "end": 2745, + "name": "ADD", + "source": 22 + }, + { + "begin": 2707, + "end": 2749, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 2876, + "end": 2878, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 2806, + "end": 2872, + "name": "PUSH", + "source": 22, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0" + }, + { + "begin": 2801, + "end": 2803, + "name": "PUSH", + "source": 22, + "value": "1F" + }, + { + "begin": 2793, + "end": 2799, + "name": "DUP4", + "source": 22 + }, + { + "begin": 2789, + "end": 2804, + "name": "ADD", + "source": 22 + }, + { + "begin": 2785, + "end": 2873, + "name": "AND", + "source": 22 + }, + { + "begin": 2774, + "end": 2783, + "name": "DUP6", + "source": 22 + }, + { + "begin": 2770, + "end": 2874, + "name": "ADD", + "source": 22 + }, + { + "begin": 2766, + "end": 2879, + "name": "ADD", + "source": 22 + }, + { + "begin": 2758, + "end": 2879, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 2758, + "end": 2879, + "name": "POP", + "source": 22 + }, + { + "begin": 2758, + "end": 2879, + "name": "POP", + "source": 22 + }, + { + "begin": 2758, + "end": 2879, + "name": "POP", + "source": 22 + }, + { + "begin": 2280, + "end": 2885, + "name": "SWAP3", + "source": 22 + }, + { + "begin": 2280, + "end": 2885, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 2280, + "end": 2885, + "name": "POP", + "source": 22 + }, + { + "begin": 2280, + "end": 2885, + "name": "POP", + "source": 22 + }, + { + "begin": 2280, + "end": 2885, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": { + "createContract(bytes)": "90042baf", + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"CreateFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_self\",\"type\":\"address\"}],\"name\":\"OnlySelfAuth\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_contract\",\"type\":\"address\"}],\"name\":\"CreatedContract\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"createContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"createContract(bytes)\":{\"params\":{\"_code\":\"Creation code of the contract\"},\"returns\":{\"addr\":\"The address of the created contract\"}},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceID\":\"The interface identifier, as specified in ERC-165\"},\"returns\":{\"_0\":\"`true` if the contract implements `_interfaceID`\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createContract(bytes)\":{\"notice\":\"Creates a contract forwarding eth value\"},\"supportsInterface(bytes4)\":{\"notice\":\"Query if a contract implements an interface\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":\"ModuleCreator\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol\":{\"keccak256\":\"0x16b1400988f6b7bd4d32bdcb36ee2fbd644fb2c8ca571becc0c32e03602bd303\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8bd4681fb4cff10f4e98e45618fbc52ed0a4c7d4fcf614f34a587ad20cd16855\",\"dweb:/ipfs/QmbA2LYBH1x8WX8CaeiFYMU5rjyLGgNCF32r9fQbXuoqwJ\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":{\"keccak256\":\"0xd4ae13a3d20fd7ab52ad16af6a06e7244daea450b796251e911091cac104d05f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8de37ec20a6b649e9fe3fb42276e4660ff546bca8b467f72beb35396ab5e62d6\",\"dweb:/ipfs/QmXT2SxBZKitkbKLbGbbNLhUbw2ataRpQ2DHafvhG953RE\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":{\"keccak256\":\"0x91545de5c77cfac86c5686c4e1f338a18ee7adb689ac0234848d7a7fc8a560db\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dc89d05d8099ba4c3c2cf85737796d439899b5a04e6b87b1ea43f687ae08848a\",\"dweb:/ipfs/QmatU8gRvFkK3Yn1MYAekzi48Waw3cDLtXJpduvju9HFUu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol\":{\"keccak256\":\"0xa206dd3d424b8cd1c4f1400aa344cbc974480fea02f0fb371b872558e5ff4e6d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ea14c75f43a0008c582dcbae3ba3c900e446e28039dfdbb059d326ec5cc6a2d2\",\"dweb:/ipfs/QmRfF6BmUWiFkCgzVFbLcHsUCNz5q2XkkcwXPX57ViTK4D\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "createContract(bytes)": { + "notice": "Creates a contract forwarding eth value" + }, + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol": { + "ModuleERC165": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes4", + "name": "_interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "supportsInterface(bytes4)": { + "details": "Adding new hooks will not lead to them being reported by this function without upgrading the wallet. In addition, developers must ensure that all inherited contracts by the main module don't conflict and are accounted to be supported by the supportsInterface method.", + "params": { + "_interfaceID": "The interface identifier, as specified in ERC-165" + }, + "returns": { + "_0": "`true` if the contract implements `_interfaceID`" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": "", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "supportsInterface(bytes4)": "01ffc9a7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"supportsInterface(bytes4)\":{\"details\":\"Adding new hooks will not lead to them being reported by this function without upgrading the wallet. In addition, developers must ensure that all inherited contracts by the main module don't conflict and are accounted to be supported by the supportsInterface method.\",\"params\":{\"_interfaceID\":\"The interface identifier, as specified in ERC-165\"},\"returns\":{\"_0\":\"`true` if the contract implements `_interfaceID`\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"supportsInterface(bytes4)\":{\"notice\":\"Query if a contract implements an interface\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":\"ModuleERC165\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol\":{\"keccak256\":\"0xd4ae13a3d20fd7ab52ad16af6a06e7244daea450b796251e911091cac104d05f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://8de37ec20a6b649e9fe3fb42276e4660ff546bca8b467f72beb35396ab5e62d6\",\"dweb:/ipfs/QmXT2SxBZKitkbKLbGbbNLhUbw2ataRpQ2DHafvhG953RE\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "supportsInterface(bytes4)": { + "notice": "Query if a contract implements an interface" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol": { + "ModuleNonce": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + } + ], + "name": "BadNonce", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_space", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_newNonce", + "type": "uint256" + } + ], + "name": "NonceChange", + "type": "event" + }, + { + "inputs": [], + "name": "nonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_space", + "type": "uint256" + } + ], + "name": "readNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "nonce()": { + "details": "The default nonce space is 0x00", + "returns": { + "_0": "The next nonce" + } + }, + "readNonce(uint256)": { + "params": { + "_space": "Nonce space, each space keeps an independent nonce count" + }, + "returns": { + "_0": "The next nonce" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":145:2076 contract ModuleNonce {... */\n mstore(0x40, 0x80)\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\ntag_1:\n pop\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x00\n codecopy\n 0x00\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":145:2076 contract ModuleNonce {... */\n mstore(0x40, 0x80)\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\n tag_1:\n pop\n jumpi(tag_2, lt(calldatasize, 0x04))\n shr(0xe0, calldataload(0x00))\n dup1\n 0x8c3f5563\n eq\n tag_3\n jumpi\n dup1\n 0xaffed0e0\n eq\n tag_4\n jumpi\n tag_2:\n 0x00\n dup1\n revert\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":938:1094 function readNonce(uint256 _space) public virtual view returns (uint256) {... */\n tag_3:\n tag_5\n tag_6\n calldatasize\n 0x04\n tag_7\n jump\t// in\n tag_6:\n tag_8\n jump\t// in\n tag_5:\n mload(0x40)\n /* \"#utility.yul\":345:370 */\n swap1\n dup2\n mstore\n /* \"#utility.yul\":333:335 */\n 0x20\n /* \"#utility.yul\":318:336 */\n add\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":938:1094 function readNonce(uint256 _space) public virtual view returns (uint256) {... */\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":670:757 function nonce() external virtual view returns (uint256) {... */\n tag_4:\n tag_5\n tag_12\n jump\t// in\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":938:1094 function readNonce(uint256 _space) public virtual view returns (uint256) {... */\n tag_8:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1002:1009 uint256 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1032:1088 ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space)) */\n tag_15\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":453:519 0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e */\n 0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1080:1086 _space */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1032:1060 ModuleStorage.readBytes32Map */\n tag_16\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1032:1088 ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space)) */\n jump\t// in\n tag_15:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":1024:1089 uint256(ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space))) */\n swap3\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":938:1094 function readNonce(uint256 _space) public virtual view returns (uint256) {... */\n swap2\n pop\n pop\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":670:757 function nonce() external virtual view returns (uint256) {... */\n tag_12:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":718:725 uint256 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":740:752 readNonce(0) */\n tag_18\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":750:751 0 */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":740:749 readNonce */\n tag_8\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":740:752 readNonce(0) */\n jump\t// in\n tag_18:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":733:752 return readNonce(0) */\n swap1\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":670:757 function nonce() external virtual view returns (uint256) {... */\n swap1\n jump\t// out\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":490:677 function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val) {... */\n tag_16:\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":568:579 bytes32 val */\n 0x00\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":587:598 bytes32 key */\n dup1\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":622:626 _key */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":628:635 _subKey */\n dup4\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":611:636 abi.encode(_key, _subKey) */\n add(0x20, mload(0x40))\n tag_20\n swap3\n swap2\n swap1\n /* \"#utility.yul\":555:580 */\n swap2\n dup3\n mstore\n /* \"#utility.yul\":611:613 */\n 0x20\n /* \"#utility.yul\":596:614 */\n dup3\n add\n /* \"#utility.yul\":589:623 */\n mstore\n /* \"#utility.yul\":543:545 */\n 0x40\n /* \"#utility.yul\":528:546 */\n add\n swap1\n /* \"#utility.yul\":381:629 */\n jump\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":611:636 abi.encode(_key, _subKey) */\n tag_20:\n 0x40\n dup1\n mload\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n dup2\n dup5\n sub\n add\n dup2\n mstore\n swap2\n swap1\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":601:637 keccak256(abi.encode(_key, _subKey)) */\n dup1\n mload\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":611:636 abi.encode(_key, _subKey) */\n 0x20\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":601:637 keccak256(abi.encode(_key, _subKey)) */\n swap1\n swap2\n add\n keccak256\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":661:671 sload(key) */\n sload\n swap5\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":490:677 function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val) {... */\n swap4\n pop\n pop\n pop\n pop\n jump\t// out\n /* \"#utility.yul\":14:194 */\n tag_7:\n /* \"#utility.yul\":73:79 */\n 0x00\n /* \"#utility.yul\":126:128 */\n 0x20\n /* \"#utility.yul\":114:123 */\n dup3\n /* \"#utility.yul\":105:112 */\n dup5\n /* \"#utility.yul\":101:124 */\n sub\n /* \"#utility.yul\":97:129 */\n slt\n /* \"#utility.yul\":94:146 */\n iszero\n tag_24\n jumpi\n /* \"#utility.yul\":142:143 */\n 0x00\n /* \"#utility.yul\":139:140 */\n dup1\n /* \"#utility.yul\":132:144 */\n revert\n /* \"#utility.yul\":94:146 */\n tag_24:\n pop\n /* \"#utility.yul\":165:188 */\n calldataload\n swap2\n /* \"#utility.yul\":14:194 */\n swap1\n pop\n jump\t// out\n\n auxdata: 0xa264697066735822122096307c37b71eb1ad75d89220df55103f539339b39b69638a2d573cf67d84ea6164736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50610158806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638c3f55631461003b578063affed0e014610060575b600080fd5b61004e610049366004610109565b610068565b60405190815260200160405180910390f35b61004e61009a565b60006100947f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e836100ab565b92915050565b60006100a66000610068565b905090565b60008083836040516020016100ca929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60006020828403121561011b57600080fd5b503591905056fea264697066735822122096307c37b71eb1ad75d89220df55103f539339b39b69638a2d573cf67d84ea6164736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x158 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8C3F5563 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x60 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x109 JUMP JUMPDEST PUSH2 0x68 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH2 0x9A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x94 PUSH32 0x8D0BF1FD623D628C741362C1289948E57B3E2905218C676D3E69ABEE36D6AE2E DUP4 PUSH2 0xAB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA6 PUSH1 0x0 PUSH2 0x68 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xCA SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP7 ADDRESS PUSH29 0x37B71EB1AD75D89220DF55103F539339B39B69638A2D573CF67D84EA61 PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "145:1931:6:-:0;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@nonce_955": { + "entryPoint": 154, + "id": 955, + "parameterSlots": 0, + "returnSlots": 1 + }, + "@readBytes32Map_1178": { + "entryPoint": 171, + "id": 1178, + "parameterSlots": 2, + "returnSlots": 1 + }, + "@readNonce_976": { + "entryPoint": 104, + "id": 976, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": 265, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": null, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:631:22", + "statements": [ + { + "nodeType": "YulBlock", + "src": "6:3:22", + "statements": [] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "84:110:22", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "130:16:22", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "139:1:22", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "142:1:22", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "132:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "132:12:22" + }, + "nodeType": "YulExpressionStatement", + "src": "132:12:22" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "105:7:22" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "114:9:22" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "101:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "101:23:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "126:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "97:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "97:32:22" + }, + "nodeType": "YulIf", + "src": "94:52:22" + }, + { + "nodeType": "YulAssignment", + "src": "155:33:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "178:9:22" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "165:12:22" + }, + "nodeType": "YulFunctionCall", + "src": "165:23:22" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "155:6:22" + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "50:9:22", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "61:7:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "73:6:22", + "type": "" + } + ], + "src": "14:180:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:76:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "310:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "322:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "333:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "318:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "318:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "310:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "352:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "363:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "345:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "345:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "345:25:22" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "269:9:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "280:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "291:4:22", + "type": "" + } + ], + "src": "199:177:22" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "510:119:22", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "520:26:22", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "532:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "543:2:22", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "528:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "528:18:22" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "520:4:22" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "562:9:22" + }, + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "573:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "555:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "555:25:22" + }, + "nodeType": "YulExpressionStatement", + "src": "555:25:22" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "600:9:22" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "611:2:22", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "596:3:22" + }, + "nodeType": "YulFunctionCall", + "src": "596:18:22" + }, + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "616:6:22" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "589:6:22" + }, + "nodeType": "YulFunctionCall", + "src": "589:34:22" + }, + "nodeType": "YulExpressionStatement", + "src": "589:34:22" + } + ] + }, + "name": "abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "471:9:22", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "482:6:22", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "490:6:22", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "501:4:22", + "type": "" + } + ], + "src": "381:248:22" + } + ] + }, + "contents": "{\n { }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_bytes32_t_bytes32__to_t_bytes32_t_bytes32__fromStack_reversed(headStart, value1, value0) -> tail\n {\n tail := add(headStart, 64)\n mstore(headStart, value0)\n mstore(add(headStart, 32), value1)\n }\n}", + "id": 22, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106100365760003560e01c80638c3f55631461003b578063affed0e014610060575b600080fd5b61004e610049366004610109565b610068565b60405190815260200160405180910390f35b61004e61009a565b60006100947f8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e836100ab565b92915050565b60006100a66000610068565b905090565b60008083836040516020016100ca929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012054949350505050565b60006020828403121561011b57600080fd5b503591905056fea264697066735822122096307c37b71eb1ad75d89220df55103f539339b39b69638a2d573cf67d84ea6164736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8C3F5563 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xAFFED0E0 EQ PUSH2 0x60 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x49 CALLDATASIZE PUSH1 0x4 PUSH2 0x109 JUMP JUMPDEST PUSH2 0x68 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x4E PUSH2 0x9A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x94 PUSH32 0x8D0BF1FD623D628C741362C1289948E57B3E2905218C676D3E69ABEE36D6AE2E DUP4 PUSH2 0xAB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA6 PUSH1 0x0 PUSH2 0x68 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0xCA SWAP3 SWAP2 SWAP1 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE DUP1 MLOAD PUSH1 0x20 SWAP1 SWAP2 ADD KECCAK256 SLOAD SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP7 ADDRESS PUSH29 0x37B71EB1AD75D89220DF55103F539339B39B69638A2D573CF67D84EA61 PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "145:1931:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;938:156;;;;;;:::i;:::-;;:::i;:::-;;;345:25:22;;;333:2;318:18;938:156:6;;;;;;;670:87;;;:::i;938:156::-;1002:7;1032:56;453:66;1080:6;1032:28;:56::i;:::-;1024:65;938:156;-1:-1:-1;;938:156:6:o;670:87::-;718:7;740:12;750:1;740:9;:12::i;:::-;733:19;;670:87;:::o;490:187:9:-;568:11;587;622:4;628:7;611:25;;;;;;;;555::22;;;611:2;596:18;;589:34;543:2;528:18;;381:248;611:25:9;;;;;;;;;;;;;;601:36;;611:25;601:36;;;;661:10;;490:187;-1:-1:-1;;;;490:187:9:o;14:180:22:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:22;;14:180;-1:-1:-1;14:180:22:o" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "68800", + "executionCost": "117", + "totalCost": "68917" + }, + "external": { + "nonce()": "2567", + "readNonce(uint256)": "2584" + }, + "internal": { + "_validateNonce(uint256)": "infinite", + "_writeNonce(uint256,uint256)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "80" + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "40" + }, + { + "begin": 145, + "end": 2076, + "name": "MSTORE", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "CALLVALUE", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "DUP1", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "ISZERO", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH [tag]", + "source": 6, + "value": "1" + }, + { + "begin": 145, + "end": 2076, + "name": "JUMPI", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 145, + "end": 2076, + "name": "DUP1", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "REVERT", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "tag", + "source": 6, + "value": "1" + }, + { + "begin": 145, + "end": 2076, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "POP", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH #[$]", + "source": 6, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 145, + "end": 2076, + "name": "DUP1", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH [$]", + "source": 6, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 145, + "end": 2076, + "name": "CODECOPY", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 145, + "end": 2076, + "name": "RETURN", + "source": 6 + } + ], + ".data": { + "0": { + ".auxdata": "a264697066735822122096307c37b71eb1ad75d89220df55103f539339b39b69638a2d573cf67d84ea6164736f6c63430008120033", + ".code": [ + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "80" + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "40" + }, + { + "begin": 145, + "end": 2076, + "name": "MSTORE", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "CALLVALUE", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "DUP1", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "ISZERO", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH [tag]", + "source": 6, + "value": "1" + }, + { + "begin": 145, + "end": 2076, + "name": "JUMPI", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 145, + "end": 2076, + "name": "DUP1", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "REVERT", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "tag", + "source": 6, + "value": "1" + }, + { + "begin": 145, + "end": 2076, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "POP", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "4" + }, + { + "begin": 145, + "end": 2076, + "name": "CALLDATASIZE", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "LT", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH [tag]", + "source": 6, + "value": "2" + }, + { + "begin": 145, + "end": 2076, + "name": "JUMPI", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 145, + "end": 2076, + "name": "CALLDATALOAD", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "E0" + }, + { + "begin": 145, + "end": 2076, + "name": "SHR", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "DUP1", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "8C3F5563" + }, + { + "begin": 145, + "end": 2076, + "name": "EQ", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH [tag]", + "source": 6, + "value": "3" + }, + { + "begin": 145, + "end": 2076, + "name": "JUMPI", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "DUP1", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "AFFED0E0" + }, + { + "begin": 145, + "end": 2076, + "name": "EQ", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH [tag]", + "source": 6, + "value": "4" + }, + { + "begin": 145, + "end": 2076, + "name": "JUMPI", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "tag", + "source": 6, + "value": "2" + }, + { + "begin": 145, + "end": 2076, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 145, + "end": 2076, + "name": "DUP1", + "source": 6 + }, + { + "begin": 145, + "end": 2076, + "name": "REVERT", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "tag", + "source": 6, + "value": "3" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "5" + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "6" + }, + { + "begin": 938, + "end": 1094, + "name": "CALLDATASIZE", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH", + "source": 6, + "value": "4" + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "7" + }, + { + "begin": 938, + "end": 1094, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "tag", + "source": 6, + "value": "6" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH [tag]", + "source": 6, + "value": "8" + }, + { + "begin": 938, + "end": 1094, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "tag", + "source": 6, + "value": "5" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH", + "source": 6, + "value": "40" + }, + { + "begin": 938, + "end": 1094, + "name": "MLOAD", + "source": 6 + }, + { + "begin": 345, + "end": 370, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 345, + "end": 370, + "name": "DUP2", + "source": 22 + }, + { + "begin": 345, + "end": 370, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 333, + "end": 335, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 318, + "end": 336, + "name": "ADD", + "source": 22 + }, + { + "begin": 938, + "end": 1094, + "name": "PUSH", + "source": 6, + "value": "40" + }, + { + "begin": 938, + "end": 1094, + "name": "MLOAD", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "DUP1", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "SWAP2", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "SUB", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "SWAP1", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "RETURN", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "tag", + "source": 6, + "value": "4" + }, + { + "begin": 670, + "end": 757, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "PUSH [tag]", + "source": 6, + "value": "5" + }, + { + "begin": 670, + "end": 757, + "name": "PUSH [tag]", + "source": 6, + "value": "12" + }, + { + "begin": 670, + "end": 757, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "tag", + "source": 6, + "value": "8" + }, + { + "begin": 938, + "end": 1094, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 1002, + "end": 1009, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 1032, + "end": 1088, + "name": "PUSH [tag]", + "source": 6, + "value": "15" + }, + { + "begin": 453, + "end": 519, + "name": "PUSH", + "source": 6, + "value": "8D0BF1FD623D628C741362C1289948E57B3E2905218C676D3E69ABEE36D6AE2E" + }, + { + "begin": 1080, + "end": 1086, + "name": "DUP4", + "source": 6 + }, + { + "begin": 1032, + "end": 1060, + "name": "PUSH [tag]", + "source": 6, + "value": "16" + }, + { + "begin": 1032, + "end": 1088, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 1032, + "end": 1088, + "name": "tag", + "source": 6, + "value": "15" + }, + { + "begin": 1032, + "end": 1088, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 1024, + "end": 1089, + "name": "SWAP3", + "source": 6 + }, + { + "begin": 938, + "end": 1094, + "name": "SWAP2", + "source": 6 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 938, + "end": 1094, + "jumpType": "[out]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "tag", + "source": 6, + "value": "12" + }, + { + "begin": 670, + "end": 757, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 718, + "end": 725, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 740, + "end": 752, + "name": "PUSH [tag]", + "source": 6, + "value": "18" + }, + { + "begin": 750, + "end": 751, + "name": "PUSH", + "source": 6, + "value": "0" + }, + { + "begin": 740, + "end": 749, + "name": "PUSH [tag]", + "source": 6, + "value": "8" + }, + { + "begin": 740, + "end": 752, + "jumpType": "[in]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 740, + "end": 752, + "name": "tag", + "source": 6, + "value": "18" + }, + { + "begin": 740, + "end": 752, + "name": "JUMPDEST", + "source": 6 + }, + { + "begin": 733, + "end": 752, + "name": "SWAP1", + "source": 6 + }, + { + "begin": 733, + "end": 752, + "name": "POP", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "name": "SWAP1", + "source": 6 + }, + { + "begin": 670, + "end": 757, + "jumpType": "[out]", + "name": "JUMP", + "source": 6 + }, + { + "begin": 490, + "end": 677, + "name": "tag", + "source": 9, + "value": "16" + }, + { + "begin": 490, + "end": 677, + "name": "JUMPDEST", + "source": 9 + }, + { + "begin": 568, + "end": 579, + "name": "PUSH", + "source": 9, + "value": "0" + }, + { + "begin": 587, + "end": 598, + "name": "DUP1", + "source": 9 + }, + { + "begin": 622, + "end": 626, + "name": "DUP4", + "source": 9 + }, + { + "begin": 628, + "end": 635, + "name": "DUP4", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "40" + }, + { + "begin": 611, + "end": 636, + "name": "MLOAD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "20" + }, + { + "begin": 611, + "end": 636, + "name": "ADD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH [tag]", + "source": 9, + "value": "20" + }, + { + "begin": 611, + "end": 636, + "name": "SWAP3", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SWAP2", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SWAP1", + "source": 9 + }, + { + "begin": 555, + "end": 580, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 555, + "end": 580, + "name": "DUP3", + "source": 22 + }, + { + "begin": 555, + "end": 580, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 611, + "end": 613, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 596, + "end": 614, + "name": "DUP3", + "source": 22 + }, + { + "begin": 596, + "end": 614, + "name": "ADD", + "source": 22 + }, + { + "begin": 589, + "end": 623, + "name": "MSTORE", + "source": 22 + }, + { + "begin": 543, + "end": 545, + "name": "PUSH", + "source": 22, + "value": "40" + }, + { + "begin": 528, + "end": 546, + "name": "ADD", + "source": 22 + }, + { + "begin": 528, + "end": 546, + "name": "SWAP1", + "source": 22 + }, + { + "begin": 381, + "end": 629, + "name": "JUMP", + "source": 22 + }, + { + "begin": 611, + "end": 636, + "name": "tag", + "source": 9, + "value": "20" + }, + { + "begin": 611, + "end": 636, + "name": "JUMPDEST", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "40" + }, + { + "begin": 611, + "end": 636, + "name": "DUP1", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "MLOAD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0" + }, + { + "begin": 611, + "end": 636, + "name": "DUP2", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "DUP5", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SUB", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "ADD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "DUP2", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "MSTORE", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SWAP2", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "SWAP1", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "MSTORE", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "DUP1", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "MLOAD", + "source": 9 + }, + { + "begin": 611, + "end": 636, + "name": "PUSH", + "source": 9, + "value": "20" + }, + { + "begin": 601, + "end": 637, + "name": "SWAP1", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "SWAP2", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "ADD", + "source": 9 + }, + { + "begin": 601, + "end": 637, + "name": "KECCAK256", + "source": 9 + }, + { + "begin": 661, + "end": 671, + "name": "SLOAD", + "source": 9 + }, + { + "begin": 661, + "end": 671, + "name": "SWAP5", + "source": 9 + }, + { + "begin": 490, + "end": 677, + "name": "SWAP4", + "source": 9 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 490, + "end": 677, + "jumpType": "[out]", + "name": "JUMP", + "source": 9 + }, + { + "begin": 14, + "end": 194, + "name": "tag", + "source": 22, + "value": "7" + }, + { + "begin": 14, + "end": 194, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": 73, + "end": 79, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 126, + "end": 128, + "name": "PUSH", + "source": 22, + "value": "20" + }, + { + "begin": 114, + "end": 123, + "name": "DUP3", + "source": 22 + }, + { + "begin": 105, + "end": 112, + "name": "DUP5", + "source": 22 + }, + { + "begin": 101, + "end": 124, + "name": "SUB", + "source": 22 + }, + { + "begin": 97, + "end": 129, + "name": "SLT", + "source": 22 + }, + { + "begin": 94, + "end": 146, + "name": "ISZERO", + "source": 22 + }, + { + "begin": 94, + "end": 146, + "name": "PUSH [tag]", + "source": 22, + "value": "24" + }, + { + "begin": 94, + "end": 146, + "name": "JUMPI", + "source": 22 + }, + { + "begin": 142, + "end": 143, + "name": "PUSH", + "source": 22, + "value": "0" + }, + { + "begin": 139, + "end": 140, + "name": "DUP1", + "source": 22 + }, + { + "begin": 132, + "end": 144, + "name": "REVERT", + "source": 22 + }, + { + "begin": 94, + "end": 146, + "name": "tag", + "source": 22, + "value": "24" + }, + { + "begin": 94, + "end": 146, + "name": "JUMPDEST", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 165, + "end": 188, + "name": "CALLDATALOAD", + "source": 22 + }, + { + "begin": 165, + "end": 188, + "name": "SWAP2", + "source": 22 + }, + { + "begin": 14, + "end": 194, + "name": "SWAP1", + "source": 22 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 14, + "end": 194, + "jumpType": "[out]", + "name": "JUMP", + "source": 22 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": { + "nonce()": "affed0e0", + "readNonce(uint256)": "8c3f5563" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_space\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_provided\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_current\",\"type\":\"uint256\"}],\"name\":\"BadNonce\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_space\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newNonce\",\"type\":\"uint256\"}],\"name\":\"NonceChange\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_space\",\"type\":\"uint256\"}],\"name\":\"readNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"nonce()\":{\"details\":\"The default nonce space is 0x00\",\"returns\":{\"_0\":\"The next nonce\"}},\"readNonce(uint256)\":{\"params\":{\"_space\":\"Nonce space, each space keeps an independent nonce count\"},\"returns\":{\"_0\":\"The next nonce\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"nonce()\":{\"notice\":\"Returns the next nonce of the default nonce space\"},\"readNonce(uint256)\":{\"notice\":\"Returns the next nonce of the given nonce space\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":\"ModuleNonce\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol\":{\"keccak256\":\"0x3b5388842f763a5347d632a0e0e8499a54b6f0b0a6eb7f7d3d848319defa042d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b36fa5a88a4e174967f850bf2bb78c787d8016ef7b5eee3e2f883fbfe9b87a7d\",\"dweb:/ipfs/QmTDZiPiQGe1fmTKKzdwzBE1xjkh8apTotW1SQRUCFXf4q\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":{\"keccak256\":\"0x876c6a40cba975df4f7dfe24e02d153b2ee758975b6d1eda494ecd4b7244aa8e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b9be3f7930476d528ce10a121701421f0fb251b7d6b7cd579917375e6b283bb4\",\"dweb:/ipfs/QmSbvbYQvTk8KYJZ7QqSKB9Y4M1X3UDhS6k765Zr1BAwK8\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol\":{\"keccak256\":\"0x98520e740b0822ec053d21f376b8be8a58e93228f3758f9228a7d00e1f60950f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://31226706c004f1a4315d6b8d37621b46f4d5807c16e1ce72675c1431ed9006a2\",\"dweb:/ipfs/QmdSSyCuPex2E2VTd6UMYy9WAq9eJNZ6vHSUomntNknzXE\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "nonce()": { + "notice": "Returns the next nonce of the default nonce space" + }, + "readNonce(uint256)": { + "notice": "Returns the next nonce of the given nonce space" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol": { + "ModuleOnlyDelegatecall": { + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "OnlyDelegatecall", + "type": "error" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":65:420 contract ModuleOnlyDelegatecall {... */\n mstore(0x40, 0xa0)\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":165:210 constructor() {... */\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\ntag_1:\n pop\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":200:204 this */\n address\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":185:205 self = address(this) */\n 0x80\n mstore\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":65:420 contract ModuleOnlyDelegatecall {... */\n mload(0x80)\n codecopy(0x00, dataOffset(sub_0), dataSize(sub_0))\n 0x00\n assignImmutable(\"0x4ffc9d227228e624d76834105f24ceb5cb9c5a8675150ad2031c88a10259e303\")\n return(0x00, dataSize(sub_0))\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":65:420 contract ModuleOnlyDelegatecall {... */\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa26469706673582212201515345980b9c882b79d269c45fcfe8e69bce35d66d1c0de8bfe8dba0fe333fc64736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": { + "@_1068": { + "entryPoint": null, + "id": 1068, + "parameterSlots": 0, + "returnSlots": 0 + } + }, + "generatedSources": [], + "linkReferences": {}, + "object": "60a0604052348015600f57600080fd5b5030608052608051603f602960003960005050603f6000f3fe6080604052600080fdfea26469706673582212201515345980b9c882b79d269c45fcfe8e69bce35d66d1c0de8bfe8dba0fe333fc64736f6c63430008120033", + "opcodes": "PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP ADDRESS PUSH1 0x80 MSTORE PUSH1 0x80 MLOAD PUSH1 0x3F PUSH1 0x29 PUSH1 0x0 CODECOPY PUSH1 0x0 POP POP PUSH1 0x3F PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ISZERO ISZERO CALLVALUE MSIZE DUP1 0xB9 0xC8 DUP3 0xB7 SWAP14 0x26 SWAP13 GASLIMIT 0xFC INVALID DUP15 PUSH10 0xBCE35D66D1C0DE8BFE8D 0xBA 0xF 0xE3 CALLER 0xFC PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "65:355:7:-:0;;;165:45;;;;;;;;;-1:-1:-1;200:4:7;185:20;;65:355;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea26469706673582212201515345980b9c882b79d269c45fcfe8e69bce35d66d1c0de8bfe8dba0fe333fc64736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 ISZERO ISZERO CALLVALUE MSIZE DUP1 0xB9 0xC8 DUP3 0xB7 SWAP14 0x26 SWAP13 GASLIMIT 0xFC INVALID DUP15 PUSH10 0xBCE35D66D1C0DE8BFE8D 0xBA 0xF 0xE3 CALLER 0xFC PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "65:355:7:-:0;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "12600", + "executionCost": "infinite", + "totalCost": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "A0" + }, + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "40" + }, + { + "begin": 65, + "end": 420, + "name": "MSTORE", + "source": 7 + }, + { + "begin": 165, + "end": 210, + "name": "CALLVALUE", + "source": 7 + }, + { + "begin": 165, + "end": 210, + "name": "DUP1", + "source": 7 + }, + { + "begin": 165, + "end": 210, + "name": "ISZERO", + "source": 7 + }, + { + "begin": 165, + "end": 210, + "name": "PUSH [tag]", + "source": 7, + "value": "1" + }, + { + "begin": 165, + "end": 210, + "name": "JUMPI", + "source": 7 + }, + { + "begin": 165, + "end": 210, + "name": "PUSH", + "source": 7, + "value": "0" + }, + { + "begin": 165, + "end": 210, + "name": "DUP1", + "source": 7 + }, + { + "begin": 165, + "end": 210, + "name": "REVERT", + "source": 7 + }, + { + "begin": 165, + "end": 210, + "name": "tag", + "source": 7, + "value": "1" + }, + { + "begin": 165, + "end": 210, + "name": "JUMPDEST", + "source": 7 + }, + { + "begin": -1, + "end": -1, + "name": "POP", + "source": -1 + }, + { + "begin": 200, + "end": 204, + "name": "ADDRESS", + "source": 7 + }, + { + "begin": 185, + "end": 205, + "name": "PUSH", + "source": 7, + "value": "80" + }, + { + "begin": 185, + "end": 205, + "name": "MSTORE", + "source": 7 + }, + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "80" + }, + { + "begin": 65, + "end": 420, + "name": "MLOAD", + "source": 7 + }, + { + "begin": 65, + "end": 420, + "name": "PUSH #[$]", + "source": 7, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 420, + "name": "PUSH [$]", + "source": 7, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "0" + }, + { + "begin": 65, + "end": 420, + "name": "CODECOPY", + "source": 7 + }, + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "0" + }, + { + "begin": 65, + "end": 420, + "name": "ASSIGNIMMUTABLE", + "source": 7, + "value": "1055" + }, + { + "begin": 65, + "end": 420, + "name": "PUSH #[$]", + "source": 7, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "0" + }, + { + "begin": 65, + "end": 420, + "name": "RETURN", + "source": 7 + } + ], + ".data": { + "0": { + ".auxdata": "a26469706673582212201515345980b9c882b79d269c45fcfe8e69bce35d66d1c0de8bfe8dba0fe333fc64736f6c63430008120033", + ".code": [ + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "80" + }, + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "40" + }, + { + "begin": 65, + "end": 420, + "name": "MSTORE", + "source": 7 + }, + { + "begin": 65, + "end": 420, + "name": "PUSH", + "source": 7, + "value": "0" + }, + { + "begin": 65, + "end": 420, + "name": "DUP1", + "source": 7 + }, + { + "begin": 65, + "end": 420, + "name": "REVERT", + "source": 7 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"OnlyDelegatecall\",\"type\":\"error\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":\"ModuleOnlyDelegatecall\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol\":{\"keccak256\":\"0x32bdb1d343eee2e32fd9d0f1d6dc0e265411d0821bd908881822f0f26f0887f8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1537c4f60a609751013bdc69eb1c6e6218982d91013115bc4e28cb84f816cd91\",\"dweb:/ipfs/QmSjkSTrrB4vuxECcm5cRG7YmraF53QWRgftxS827KcQLW\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol": { + "ModuleSelfAuth": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_self", + "type": "address" + } + ], + "name": "OnlySelfAuth", + "type": "error" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":65:281 contract ModuleSelfAuth {... */\n mstore(0x40, 0x80)\n callvalue\n dup1\n iszero\n tag_1\n jumpi\n 0x00\n dup1\n revert\ntag_1:\n pop\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x00\n codecopy\n 0x00\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":65:281 contract ModuleSelfAuth {... */\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa2646970667358221220396fc0aa947578a12e6d47ac958aa78118e45e6db5b5f8680d4fcb2019dc056664736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220396fc0aa947578a12e6d47ac958aa78118e45e6db5b5f8680d4fcb2019dc056664736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CODECOPY PUSH16 0xC0AA947578A12E6D47AC958AA78118E4 0x5E PUSH14 0xB5B5F8680D4FCB2019DC05666473 PUSH16 0x6C634300081200330000000000000000 ", + "sourceMap": "65:216:8:-:0;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220396fc0aa947578a12e6d47ac958aa78118e45e6db5b5f8680d4fcb2019dc056664736f6c63430008120033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 CODECOPY PUSH16 0xC0AA947578A12E6D47AC958AA78118E4 0x5E PUSH14 0xB5B5F8680D4FCB2019DC05666473 PUSH16 0x6C634300081200330000000000000000 ", + "sourceMap": "65:216:8:-:0;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "12600", + "executionCost": "66", + "totalCost": "12666" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 65, + "end": 281, + "name": "PUSH", + "source": 8, + "value": "80" + }, + { + "begin": 65, + "end": 281, + "name": "PUSH", + "source": 8, + "value": "40" + }, + { + "begin": 65, + "end": 281, + "name": "MSTORE", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "CALLVALUE", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "DUP1", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "ISZERO", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "PUSH [tag]", + "source": 8, + "value": "1" + }, + { + "begin": 65, + "end": 281, + "name": "JUMPI", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "PUSH", + "source": 8, + "value": "0" + }, + { + "begin": 65, + "end": 281, + "name": "DUP1", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "REVERT", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "tag", + "source": 8, + "value": "1" + }, + { + "begin": 65, + "end": 281, + "name": "JUMPDEST", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "POP", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "PUSH #[$]", + "source": 8, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 281, + "name": "DUP1", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "PUSH [$]", + "source": 8, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 281, + "name": "PUSH", + "source": 8, + "value": "0" + }, + { + "begin": 65, + "end": 281, + "name": "CODECOPY", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "PUSH", + "source": 8, + "value": "0" + }, + { + "begin": 65, + "end": 281, + "name": "RETURN", + "source": 8 + } + ], + ".data": { + "0": { + ".auxdata": "a2646970667358221220396fc0aa947578a12e6d47ac958aa78118e45e6db5b5f8680d4fcb2019dc056664736f6c63430008120033", + ".code": [ + { + "begin": 65, + "end": 281, + "name": "PUSH", + "source": 8, + "value": "80" + }, + { + "begin": 65, + "end": 281, + "name": "PUSH", + "source": 8, + "value": "40" + }, + { + "begin": 65, + "end": 281, + "name": "MSTORE", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "PUSH", + "source": 8, + "value": "0" + }, + { + "begin": 65, + "end": 281, + "name": "DUP1", + "source": 8 + }, + { + "begin": 65, + "end": 281, + "name": "REVERT", + "source": 8 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_self\",\"type\":\"address\"}],\"name\":\"OnlySelfAuth\",\"type\":\"error\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":\"ModuleSelfAuth\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":{\"keccak256\":\"0x91545de5c77cfac86c5686c4e1f338a18ee7adb689ac0234848d7a7fc8a560db\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dc89d05d8099ba4c3c2cf85737796d439899b5a04e6b87b1ea43f687ae08848a\",\"dweb:/ipfs/QmatU8gRvFkK3Yn1MYAekzi48Waw3cDLtXJpduvju9HFUu\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol": { + "ModuleStorage": { + "abi": [], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":65:679 library ModuleStorage {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":65:679 library ModuleStorage {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa264697066735822122055b5e58f321540dc1eb3c539fbeff9918a32f6db2cb889e0c660fd49a99fd80d64736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122055b5e58f321540dc1eb3c539fbeff9918a32f6db2cb889e0c660fd49a99fd80d64736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SSTORE 0xB5 0xE5 DUP16 ORIGIN ISZERO BLOCKHASH 0xDC 0x1E 0xB3 0xC5 CODECOPY 0xFB 0xEF 0xF9 SWAP2 DUP11 ORIGIN 0xF6 0xDB 0x2C 0xB8 DUP10 0xE0 0xC6 PUSH1 0xFD 0x49 0xA9 SWAP16 0xD8 0xD PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "65:614:9:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;65:614:9;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122055b5e58f321540dc1eb3c539fbeff9918a32f6db2cb889e0c660fd49a99fd80d64736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SSTORE 0xB5 0xE5 DUP16 ORIGIN ISZERO BLOCKHASH 0xDC 0x1E 0xB3 0xC5 CODECOPY 0xFB 0xEF 0xF9 SWAP2 DUP11 ORIGIN 0xF6 0xDB 0x2C 0xB8 DUP10 0xE0 0xC6 PUSH1 0xFD 0x49 0xA9 SWAP16 0xD8 0xD PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "65:614:9:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "readBytes32(bytes32)": "infinite", + "readBytes32Map(bytes32,bytes32)": "infinite", + "writeBytes32(bytes32,bytes32)": "infinite", + "writeBytes32Map(bytes32,bytes32,bytes32)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 65, + "end": 679, + "name": "PUSH #[$]", + "source": 9, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 679, + "name": "PUSH [$]", + "source": 9, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "B" + }, + { + "begin": 65, + "end": 679, + "name": "DUP3", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "DUP3", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "DUP3", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "CODECOPY", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "DUP1", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "MLOAD", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "0" + }, + { + "begin": 65, + "end": 679, + "name": "BYTE", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "73" + }, + { + "begin": 65, + "end": 679, + "name": "EQ", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH [tag]", + "source": 9, + "value": "1" + }, + { + "begin": 65, + "end": 679, + "name": "JUMPI", + "source": 9 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "0" + }, + { + "begin": 65, + "end": 679, + "name": "MSTORE", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "0" + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "4" + }, + { + "begin": 65, + "end": 679, + "name": "MSTORE", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "24" + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "0" + }, + { + "begin": 65, + "end": 679, + "name": "REVERT", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "tag", + "source": 9, + "value": "1" + }, + { + "begin": 65, + "end": 679, + "name": "JUMPDEST", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "ADDRESS", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "0" + }, + { + "begin": 65, + "end": 679, + "name": "MSTORE", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "73" + }, + { + "begin": 65, + "end": 679, + "name": "DUP2", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "MSTORE8", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "DUP3", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "DUP2", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "RETURN", + "source": 9 + } + ], + ".data": { + "0": { + ".auxdata": "a264697066735822122055b5e58f321540dc1eb3c539fbeff9918a32f6db2cb889e0c660fd49a99fd80d64736f6c63430008120033", + ".code": [ + { + "begin": 65, + "end": 679, + "name": "PUSHDEPLOYADDRESS", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "ADDRESS", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "EQ", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "80" + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "40" + }, + { + "begin": 65, + "end": 679, + "name": "MSTORE", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "PUSH", + "source": 9, + "value": "0" + }, + { + "begin": 65, + "end": 679, + "name": "DUP1", + "source": 9 + }, + { + "begin": 65, + "end": 679, + "name": "REVERT", + "source": 9 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":\"ModuleStorage\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":{\"keccak256\":\"0x876c6a40cba975df4f7dfe24e02d153b2ee758975b6d1eda494ecd4b7244aa8e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b9be3f7930476d528ce10a121701421f0fb251b7d6b7cd579917375e6b283bb4\",\"dweb:/ipfs/QmSbvbYQvTk8KYJZ7QqSKB9Y4M1X3UDhS6k765Zr1BAwK8\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol": { + "IModuleAuth": { + "abi": [ + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "signatureRecovery", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subdigest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "updateImageHash(bytes32)": { + "params": { + "_imageHash": "New required image hash of the signature" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": "", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "signatureRecovery(bytes32,bytes)": "853c5068", + "updateImageHash(bytes32)": "29561426" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ImageHashIsZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes1\",\"name\":\"_type\",\"type\":\"bytes1\"}],\"name\":\"InvalidSignatureType\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newImageHash\",\"type\":\"bytes32\"}],\"name\":\"ImageHashUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_digest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"signatureRecovery\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subdigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"checkpoint\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_imageHash\",\"type\":\"bytes32\"}],\"name\":\"updateImageHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"updateImageHash(bytes32)\":{\"params\":{\"_imageHash\":\"New required image hash of the signature\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"updateImageHash(bytes32)\":{\"notice\":\"Updates the signers configuration of the wallet\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol\":\"IModuleAuth\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol\":{\"keccak256\":\"0x24c6b05c32cb344b3b0aebd01fbd8bfc69f8c8e29fca340b262d9612c34d51e2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5f6c004946f0cbc4b3e52d45248337146bc82569da894ecff3cbdc5a0dca95c3\",\"dweb:/ipfs/QmNSgDMQ7SHL6AJuzTSRbY2kgciHF1SKWfH6MaPH1N3TpR\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "updateImageHash(bytes32)": { + "notice": "Updates the signers configuration of the wallet" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol": { + "IModuleCalls": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_requested", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_available", + "type": "uint256" + } + ], + "name": "NotEnoughGas", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + } + ], + "name": "TxExecuted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "_tx", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_index", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "_reason", + "type": "bytes" + } + ], + "name": "TxFailed", + "type": "event" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + }, + { + "internalType": "uint256", + "name": "_nonce", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "delegateCall", + "type": "bool" + }, + { + "internalType": "bool", + "name": "revertOnError", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "gasLimit", + "type": "uint256" + }, + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct IModuleCalls.Transaction[]", + "name": "_txs", + "type": "tuple[]" + } + ], + "name": "selfExecute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": { + "params": { + "_nonce": "Signature nonce (may contain an encoded space)", + "_signature": "Encoded signature", + "_txs": "Transactions to process" + } + }, + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": { + "params": { + "_txs": "Transactions to execute" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": "", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": "7a9a1628", + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": "61c2926c" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_requested\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_available\",\"type\":\"uint256\"}],\"name\":\"NotEnoughGas\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_tx\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"TxExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"_tx\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_reason\",\"type\":\"bytes\"}],\"name\":\"TxFailed\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"revertOnError\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IModuleCalls.Transaction[]\",\"name\":\"_txs\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"delegateCall\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"revertOnError\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct IModuleCalls.Transaction[]\",\"name\":\"_txs\",\"type\":\"tuple[]\"}],\"name\":\"selfExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)\":{\"params\":{\"_nonce\":\"Signature nonce (may contain an encoded space)\",\"_signature\":\"Encoded signature\",\"_txs\":\"Transactions to process\"}},\"selfExecute((bool,bool,uint256,address,uint256,bytes)[])\":{\"params\":{\"_txs\":\"Transactions to execute\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)\":{\"notice\":\"Allow wallet owner to execute an action\"},\"selfExecute((bool,bool,uint256,address,uint256,bytes)[])\":{\"notice\":\"Allow wallet to execute an action without signing the message\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol\":\"IModuleCalls\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol\":{\"keccak256\":\"0xde065c15e38eb009c3dc8f99dfefdd1d6d244dd12a889a8b57edd90d32fb4395\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://23608955786060457f79267795a61eb89b3910b683fc136c749548369425088f\",\"dweb:/ipfs/QmXNorcQBF1Qk21y3aEJRiiHVtwm61zP4ttA1ZzmRjyHnz\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "execute((bool,bool,uint256,address,uint256,bytes)[],uint256,bytes)": { + "notice": "Allow wallet owner to execute an action" + }, + "selfExecute((bool,bool,uint256,address,uint256,bytes)[])": { + "notice": "Allow wallet to execute an action without signing the message" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol": { + "IModuleCreator": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "CreateFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_code", + "type": "bytes" + } + ], + "name": "createContract", + "outputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "stateMutability": "payable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "createContract(bytes)": { + "params": { + "_code": "Creation code of the contract" + }, + "returns": { + "addr": "The address of the created contract" + } + } + }, + "version": 1 + }, + "evm": { + "assembly": "", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "createContract(bytes)": "90042baf" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"CreateFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"createContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"createContract(bytes)\":{\"params\":{\"_code\":\"Creation code of the contract\"},\"returns\":{\"addr\":\"The address of the created contract\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"createContract(bytes)\":{\"notice\":\"Creates a contract forwarding eth value\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol\":\"IModuleCreator\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol\":{\"keccak256\":\"0xa206dd3d424b8cd1c4f1400aa344cbc974480fea02f0fb371b872558e5ff4e6d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://ea14c75f43a0008c582dcbae3ba3c900e446e28039dfdbb059d326ec5cc6a2d2\",\"dweb:/ipfs/QmRfF6BmUWiFkCgzVFbLcHsUCNz5q2XkkcwXPX57ViTK4D\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "createContract(bytes)": { + "notice": "Creates a contract forwarding eth value" + } + }, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol": { + "SequenceBaseSig": { + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_hash", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_addr", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidNestedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_flag", + "type": "uint256" + } + ], + "name": "InvalidSignatureFlag", + "type": "error" + } + ], + "devdoc": { + "author": "Agustin Aguilar (aa@horizon.io)", + "kind": "dev", + "methods": {}, + "title": "SequenceBaseSig Library", + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":419:9536 library SequenceBaseSig {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":419:9536 library SequenceBaseSig {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa26469706673582212208df7fadefb88448ef7f4d3ade6c9b119a5809f9dda955b39d53d545dfcdfed0a64736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208df7fadefb88448ef7f4d3ade6c9b119a5809f9dda955b39d53d545dfcdfed0a64736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP14 0xF7 STATICCALL 0xDE 0xFB DUP9 PREVRANDAO DUP15 0xF7 DELEGATECALL 0xD3 0xAD 0xE6 0xC9 0xB1 NOT 0xA5 DUP1 SWAP16 SWAP14 0xDA SWAP6 JUMPDEST CODECOPY 0xD5 RETURNDATASIZE SLOAD 0x5D 0xFC 0xDF 0xED EXP PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "419:9117:13:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;419:9117:13;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208df7fadefb88448ef7f4d3ade6c9b119a5809f9dda955b39d53d545dfcdfed0a64736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP14 0xF7 STATICCALL 0xDE 0xFB DUP9 PREVRANDAO DUP15 0xF7 DELEGATECALL 0xD3 0xAD 0xE6 0xC9 0xB1 NOT 0xA5 DUP1 SWAP16 SWAP14 0xDA SWAP6 JUMPDEST CODECOPY 0xD5 RETURNDATASIZE SLOAD 0x5D 0xFC 0xDF 0xED EXP PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "419:9117:13:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "_leafForAddressAndWeight(address,uint96)": "infinite", + "_leafForHardcodedSubdigest(bytes32)": "infinite", + "_leafForNested(bytes32,uint256,uint256)": "infinite", + "recover(bytes32,bytes calldata)": "infinite", + "recoverBranch(bytes32,bytes calldata)": "infinite", + "subdigest(bytes32)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 419, + "end": 9536, + "name": "PUSH #[$]", + "source": 13, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH [$]", + "source": 13, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "B" + }, + { + "begin": 419, + "end": 9536, + "name": "DUP3", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "DUP3", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "DUP3", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "CODECOPY", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "DUP1", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "MLOAD", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 419, + "end": 9536, + "name": "BYTE", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "73" + }, + { + "begin": 419, + "end": 9536, + "name": "EQ", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH [tag]", + "source": 13, + "value": "1" + }, + { + "begin": 419, + "end": 9536, + "name": "JUMPI", + "source": 13 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 419, + "end": 9536, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "4" + }, + { + "begin": 419, + "end": 9536, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "24" + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 419, + "end": 9536, + "name": "REVERT", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "tag", + "source": 13, + "value": "1" + }, + { + "begin": 419, + "end": 9536, + "name": "JUMPDEST", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "ADDRESS", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 419, + "end": 9536, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "73" + }, + { + "begin": 419, + "end": 9536, + "name": "DUP2", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "MSTORE8", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "DUP3", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "DUP2", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "RETURN", + "source": 13 + } + ], + ".data": { + "0": { + ".auxdata": "a26469706673582212208df7fadefb88448ef7f4d3ade6c9b119a5809f9dda955b39d53d545dfcdfed0a64736f6c63430008120033", + ".code": [ + { + "begin": 419, + "end": 9536, + "name": "PUSHDEPLOYADDRESS", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "ADDRESS", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "EQ", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "80" + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "40" + }, + { + "begin": 419, + "end": 9536, + "name": "MSTORE", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "PUSH", + "source": 13, + "value": "0" + }, + { + "begin": 419, + "end": 9536, + "name": "DUP1", + "source": 13 + }, + { + "begin": 419, + "end": 9536, + "name": "REVERT", + "source": 13 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_hash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidNestedSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_flag\",\"type\":\"uint256\"}],\"name\":\"InvalidSignatureFlag\",\"type\":\"error\"}],\"devdoc\":{\"author\":\"Agustin Aguilar (aa@horizon.io)\",\"kind\":\"dev\",\"methods\":{},\"title\":\"SequenceBaseSig Library\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"A Solidity implementation for handling signatures in the Sequence protocol.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":\"SequenceBaseSig\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":{\"keccak256\":\"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1\",\"dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":{\"keccak256\":\"0xe0565e24e94204d4b254ace42d124d3279256090921a4818cbbf9747cbb14e04\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4293a4762b0816738511f697efd04a0e881d4c409bd15ac1c4e7261fe5e482a2\",\"dweb:/ipfs/QmcHbEBne4fvpcD7RTJHCL6q9czoLa7KHneaCeYfXuWiGu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":{\"keccak256\":\"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98\",\"dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":{\"keccak256\":\"0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25\",\"dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":{\"keccak256\":\"0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335\",\"dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":{\"keccak256\":\"0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353\",\"dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "A Solidity implementation for handling signatures in the Sequence protocol.", + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol": { + "SequenceChainedSig": { + "abi": [ + { + "inputs": [], + "name": "ImageHashIsZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes1", + "name": "_type", + "type": "bytes1" + } + ], + "name": "InvalidSignatureType", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_weight", + "type": "uint256" + } + ], + "name": "LowWeightChainedSignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_self", + "type": "address" + } + ], + "name": "OnlySelfAuth", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_current", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_prev", + "type": "uint256" + } + ], + "name": "WrongChainedCheckpointOrder", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "newImageHash", + "type": "bytes32" + } + ], + "name": "ImageHashUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "SET_IMAGE_HASH_TYPE_HASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_digest", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "signatureRecovery", + "outputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "weight", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "imageHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "subdigest", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "checkpoint", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_imageHash", + "type": "bytes32" + } + ], + "name": "updateImageHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "author": "Agustin Aguilar (aa@horizon.io)", + "details": "The delegations can be chained together, the first signature is the one that is used to validate the message, the last signature must match the current on-chain configuration of the wallet.", + "kind": "dev", + "methods": { + "updateImageHash(bytes32)": { + "params": { + "_imageHash": "New required image hash of the signature" + } + } + }, + "title": "Sequence chained auth recovery submodule", + "version": 1 + }, + "evm": { + "assembly": "", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "legacyAssembly": null, + "methodIdentifiers": { + "SET_IMAGE_HASH_TYPE_HASH()": "57c56d6b", + "signatureRecovery(bytes32,bytes)": "853c5068", + "updateImageHash(bytes32)": "29561426" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"ImageHashIsZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes1\",\"name\":\"_type\",\"type\":\"bytes1\"}],\"name\":\"InvalidSignatureType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_weight\",\"type\":\"uint256\"}],\"name\":\"LowWeightChainedSignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_self\",\"type\":\"address\"}],\"name\":\"OnlySelfAuth\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_current\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_prev\",\"type\":\"uint256\"}],\"name\":\"WrongChainedCheckpointOrder\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newImageHash\",\"type\":\"bytes32\"}],\"name\":\"ImageHashUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SET_IMAGE_HASH_TYPE_HASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_digest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"signatureRecovery\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"imageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"subdigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"checkpoint\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_imageHash\",\"type\":\"bytes32\"}],\"name\":\"updateImageHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Agustin Aguilar (aa@horizon.io)\",\"details\":\"The delegations can be chained together, the first signature is the one that is used to validate the message, the last signature must match the current on-chain configuration of the wallet.\",\"kind\":\"dev\",\"methods\":{\"updateImageHash(bytes32)\":{\"params\":{\"_imageHash\":\"New required image hash of the signature\"}}},\"title\":\"Sequence chained auth recovery submodule\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"updateImageHash(bytes32)\":{\"notice\":\"Updates the signers configuration of the wallet\"}},\"notice\":\"Defines Sequence signatures that work by delegating control to new configurations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":\"SequenceChainedSig\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":{\"keccak256\":\"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1\",\"dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol\":{\"keccak256\":\"0x91545de5c77cfac86c5686c4e1f338a18ee7adb689ac0234848d7a7fc8a560db\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://dc89d05d8099ba4c3c2cf85737796d439899b5a04e6b87b1ea43f687ae08848a\",\"dweb:/ipfs/QmatU8gRvFkK3Yn1MYAekzi48Waw3cDLtXJpduvju9HFUu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol\":{\"keccak256\":\"0x876c6a40cba975df4f7dfe24e02d153b2ee758975b6d1eda494ecd4b7244aa8e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b9be3f7930476d528ce10a121701421f0fb251b7d6b7cd579917375e6b283bb4\",\"dweb:/ipfs/QmSbvbYQvTk8KYJZ7QqSKB9Y4M1X3UDhS6k765Zr1BAwK8\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol\":{\"keccak256\":\"0x24c6b05c32cb344b3b0aebd01fbd8bfc69f8c8e29fca340b262d9612c34d51e2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5f6c004946f0cbc4b3e52d45248337146bc82569da894ecff3cbdc5a0dca95c3\",\"dweb:/ipfs/QmNSgDMQ7SHL6AJuzTSRbY2kgciHF1SKWfH6MaPH1N3TpR\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":{\"keccak256\":\"0xe0565e24e94204d4b254ace42d124d3279256090921a4818cbbf9747cbb14e04\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4293a4762b0816738511f697efd04a0e881d4c409bd15ac1c4e7261fe5e482a2\",\"dweb:/ipfs/QmcHbEBne4fvpcD7RTJHCL6q9czoLa7KHneaCeYfXuWiGu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol\":{\"keccak256\":\"0x755fbf6c106fe1c3c375c41c95c38269873717d8e683678b5fdbf6c8d3426306\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7c7c92e72dd94f16b5c004d38c2d92eb2b760fd29a939945ed275633b0f93fa5\",\"dweb:/ipfs/QmVdCG7Aw7aVV67z5mUKZa4VqhXHdLqy3SKxPfxaxq54p2\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":{\"keccak256\":\"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98\",\"dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":{\"keccak256\":\"0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25\",\"dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":{\"keccak256\":\"0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335\",\"dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":{\"keccak256\":\"0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353\",\"dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": { + "updateImageHash(bytes32)": { + "notice": "Updates the signers configuration of the wallet" + } + }, + "notice": "Defines Sequence signatures that work by delegating control to new configurations.", + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol": { + "SequenceDynamicSig": { + "abi": [], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":98:912 library SequenceDynamicSig {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":98:912 library SequenceDynamicSig {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa2646970667358221220988e7a0efd834caf932b23f5964fd75fc66e99c5c9a0302666625fa77c52b63864736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220988e7a0efd834caf932b23f5964fd75fc66e99c5c9a0302666625fa77c52b63864736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP9 DUP15 PUSH27 0xEFD834CAF932B23F5964FD75FC66E99C5C9A0302666625FA77C52 0xB6 CODESIZE PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "98:814:15:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;98:814:15;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220988e7a0efd834caf932b23f5964fd75fc66e99c5c9a0302666625fa77c52b63864736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP9 DUP15 PUSH27 0xEFD834CAF932B23F5964FD75FC66E99C5C9A0302666625FA77C52 0xB6 CODESIZE PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "98:814:15:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "recover(bytes32,bytes calldata)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 98, + "end": 912, + "name": "PUSH #[$]", + "source": 15, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 98, + "end": 912, + "name": "PUSH [$]", + "source": 15, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "B" + }, + { + "begin": 98, + "end": 912, + "name": "DUP3", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "DUP3", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "DUP3", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "CODECOPY", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "DUP1", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "MLOAD", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "0" + }, + { + "begin": 98, + "end": 912, + "name": "BYTE", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "73" + }, + { + "begin": 98, + "end": 912, + "name": "EQ", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH [tag]", + "source": 15, + "value": "1" + }, + { + "begin": 98, + "end": 912, + "name": "JUMPI", + "source": 15 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "0" + }, + { + "begin": 98, + "end": 912, + "name": "MSTORE", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "0" + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "4" + }, + { + "begin": 98, + "end": 912, + "name": "MSTORE", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "24" + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "0" + }, + { + "begin": 98, + "end": 912, + "name": "REVERT", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "tag", + "source": 15, + "value": "1" + }, + { + "begin": 98, + "end": 912, + "name": "JUMPDEST", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "ADDRESS", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "0" + }, + { + "begin": 98, + "end": 912, + "name": "MSTORE", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "73" + }, + { + "begin": 98, + "end": 912, + "name": "DUP2", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "MSTORE8", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "DUP3", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "DUP2", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "RETURN", + "source": 15 + } + ], + ".data": { + "0": { + ".auxdata": "a2646970667358221220988e7a0efd834caf932b23f5964fd75fc66e99c5c9a0302666625fa77c52b63864736f6c63430008120033", + ".code": [ + { + "begin": 98, + "end": 912, + "name": "PUSHDEPLOYADDRESS", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "ADDRESS", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "EQ", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "80" + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "40" + }, + { + "begin": 98, + "end": 912, + "name": "MSTORE", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "PUSH", + "source": 15, + "value": "0" + }, + { + "begin": 98, + "end": 912, + "name": "DUP1", + "source": 15 + }, + { + "begin": 98, + "end": 912, + "name": "REVERT", + "source": 15 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":\"SequenceDynamicSig\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":{\"keccak256\":\"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1\",\"dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol\":{\"keccak256\":\"0xe0565e24e94204d4b254ace42d124d3279256090921a4818cbbf9747cbb14e04\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4293a4762b0816738511f697efd04a0e881d4c409bd15ac1c4e7261fe5e482a2\",\"dweb:/ipfs/QmcHbEBne4fvpcD7RTJHCL6q9czoLa7KHneaCeYfXuWiGu\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol\":{\"keccak256\":\"0x6de353f8c7f44c4294914a4917458ce90ae2f7ecd2d84074fe12d4a4f1485ee5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://369f979b79a3d3fd0336ab14b3accadb63e4784324afc34f8db11d1988526afd\",\"dweb:/ipfs/QmavmBZ354wTaXQ6ixBd8GrC9HwtRqn4MoNhCVJcx11off\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":{\"keccak256\":\"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98\",\"dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":{\"keccak256\":\"0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25\",\"dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":{\"keccak256\":\"0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335\",\"dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":{\"keccak256\":\"0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353\",\"dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol": { + "SequenceNoChainIdSig": { + "abi": [], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":65:619 library SequenceNoChainIdSig {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":65:619 library SequenceNoChainIdSig {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa264697066735822122017d1b2b94cb2d25bb2c8abe419506b6917bfa14841e22660d017f50ee442141b64736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122017d1b2b94cb2d25bb2c8abe419506b6917bfa14841e22660d017f50ee442141b64736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 OR 0xD1 0xB2 0xB9 0x4C 0xB2 0xD2 JUMPDEST 0xB2 0xC8 0xAB 0xE4 NOT POP PUSH12 0x6917BFA14841E22660D017F5 0xE 0xE4 TIMESTAMP EQ SHL PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "65:554:16:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;65:554:16;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122017d1b2b94cb2d25bb2c8abe419506b6917bfa14841e22660d017f50ee442141b64736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 OR 0xD1 0xB2 0xB9 0x4C 0xB2 0xD2 JUMPDEST 0xB2 0xC8 0xAB 0xE4 NOT POP PUSH12 0x6917BFA14841E22660D017F5 0xE 0xE4 TIMESTAMP EQ SHL PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "65:554:16:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "subdigest(bytes32)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 65, + "end": 619, + "name": "PUSH #[$]", + "source": 16, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 619, + "name": "PUSH [$]", + "source": 16, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "B" + }, + { + "begin": 65, + "end": 619, + "name": "DUP3", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "DUP3", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "DUP3", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "CODECOPY", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "DUP1", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "MLOAD", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "0" + }, + { + "begin": 65, + "end": 619, + "name": "BYTE", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "73" + }, + { + "begin": 65, + "end": 619, + "name": "EQ", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH [tag]", + "source": 16, + "value": "1" + }, + { + "begin": 65, + "end": 619, + "name": "JUMPI", + "source": 16 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "0" + }, + { + "begin": 65, + "end": 619, + "name": "MSTORE", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "0" + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "4" + }, + { + "begin": 65, + "end": 619, + "name": "MSTORE", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "24" + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "0" + }, + { + "begin": 65, + "end": 619, + "name": "REVERT", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "tag", + "source": 16, + "value": "1" + }, + { + "begin": 65, + "end": 619, + "name": "JUMPDEST", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "ADDRESS", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "0" + }, + { + "begin": 65, + "end": 619, + "name": "MSTORE", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "73" + }, + { + "begin": 65, + "end": 619, + "name": "DUP2", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "MSTORE8", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "DUP3", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "DUP2", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "RETURN", + "source": 16 + } + ], + ".data": { + "0": { + ".auxdata": "a264697066735822122017d1b2b94cb2d25bb2c8abe419506b6917bfa14841e22660d017f50ee442141b64736f6c63430008120033", + ".code": [ + { + "begin": 65, + "end": 619, + "name": "PUSHDEPLOYADDRESS", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "ADDRESS", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "EQ", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "80" + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "40" + }, + { + "begin": 65, + "end": 619, + "name": "MSTORE", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "PUSH", + "source": 16, + "value": "0" + }, + { + "begin": 65, + "end": 619, + "name": "DUP1", + "source": 16 + }, + { + "begin": 65, + "end": 619, + "name": "REVERT", + "source": 16 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":\"SequenceNoChainIdSig\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol\":{\"keccak256\":\"0xa3ac8b8d31f20a8732bb4ebad53b42b334ec29041de0224bd494913ef0b2ad07\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://5a81d4eb3f47b09a8835b2fd53e0baa2e23cb604db3b10dae82543a5bcc52fa4\",\"dweb:/ipfs/QmQ9XSSgbaagWArmZJJ366bdJ7HfxUxn9jdnWwN6SxUSeY\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol": { + "SubModuleNonce": { + "abi": [], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol\":65:751 library SubModuleNonce {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol\":65:751 library SubModuleNonce {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa26469706673582212208609e09d11153aed5ba8eb4ae9c6915a536fd4523605bce53bc4a2f1e304f84264736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208609e09d11153aed5ba8eb4ae9c6915a536fd4523605bce53bc4a2f1e304f84264736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP7 MULMOD 0xE0 SWAP14 GT ISZERO GASPRICE 0xED JUMPDEST 0xA8 0xEB 0x4A 0xE9 0xC6 SWAP2 GAS MSTORE8 PUSH16 0xD4523605BCE53BC4A2F1E304F8426473 PUSH16 0x6C634300081200330000000000000000 ", + "sourceMap": "65:686:17:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;65:686:17;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208609e09d11153aed5ba8eb4ae9c6915a536fd4523605bce53bc4a2f1e304f84264736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP7 MULMOD 0xE0 SWAP14 GT ISZERO GASPRICE 0xED JUMPDEST 0xA8 0xEB 0x4A 0xE9 0xC6 SWAP2 GAS MSTORE8 PUSH16 0xD4523605BCE53BC4A2F1E304F8426473 PUSH16 0x6C634300081200330000000000000000 ", + "sourceMap": "65:686:17:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "decodeNonce(uint256)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 65, + "end": 751, + "name": "PUSH #[$]", + "source": 17, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 751, + "name": "PUSH [$]", + "source": 17, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "B" + }, + { + "begin": 65, + "end": 751, + "name": "DUP3", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "DUP3", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "DUP3", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "CODECOPY", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "DUP1", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "MLOAD", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "0" + }, + { + "begin": 65, + "end": 751, + "name": "BYTE", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "73" + }, + { + "begin": 65, + "end": 751, + "name": "EQ", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH [tag]", + "source": 17, + "value": "1" + }, + { + "begin": 65, + "end": 751, + "name": "JUMPI", + "source": 17 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "0" + }, + { + "begin": 65, + "end": 751, + "name": "MSTORE", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "0" + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "4" + }, + { + "begin": 65, + "end": 751, + "name": "MSTORE", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "24" + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "0" + }, + { + "begin": 65, + "end": 751, + "name": "REVERT", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "tag", + "source": 17, + "value": "1" + }, + { + "begin": 65, + "end": 751, + "name": "JUMPDEST", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "ADDRESS", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "0" + }, + { + "begin": 65, + "end": 751, + "name": "MSTORE", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "73" + }, + { + "begin": 65, + "end": 751, + "name": "DUP2", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "MSTORE8", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "DUP3", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "DUP2", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "RETURN", + "source": 17 + } + ], + ".data": { + "0": { + ".auxdata": "a26469706673582212208609e09d11153aed5ba8eb4ae9c6915a536fd4523605bce53bc4a2f1e304f84264736f6c63430008120033", + ".code": [ + { + "begin": 65, + "end": 751, + "name": "PUSHDEPLOYADDRESS", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "ADDRESS", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "EQ", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "80" + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "40" + }, + { + "begin": 65, + "end": 751, + "name": "MSTORE", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "PUSH", + "source": 17, + "value": "0" + }, + { + "begin": 65, + "end": 751, + "name": "DUP1", + "source": 17 + }, + { + "begin": 65, + "end": 751, + "name": "REVERT", + "source": 17 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol\":\"SubModuleNonce\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol\":{\"keccak256\":\"0x98520e740b0822ec053d21f376b8be8a58e93228f3758f9228a7d00e1f60950f\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://31226706c004f1a4315d6b8d37621b46f4d5807c16e1ce72675c1431ed9006a2\",\"dweb:/ipfs/QmdSSyCuPex2E2VTd6UMYy9WAq9eJNZ6vHSUomntNknzXE\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol": { + "LibBytes": { + "abi": [], + "devdoc": { + "author": "Agustin Aguilar (aa@horizon.io)", + "details": "These functions do not check if the input index is within the bounds of the data array. Reading out of bounds may return dirty values.", + "kind": "dev", + "methods": {}, + "title": "Library for reading data from bytes arrays", + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":405:2096 library LibBytes {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":405:2096 library LibBytes {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa2646970667358221220b00d0cee4061dc303d853fadda969d1de6324d7d0f32be48bae08404d30b621f64736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b00d0cee4061dc303d853fadda969d1de6324d7d0f32be48bae08404d30b621f64736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 0xD 0xC 0xEE BLOCKHASH PUSH2 0xDC30 RETURNDATASIZE DUP6 EXTCODEHASH 0xAD 0xDA SWAP7 SWAP14 SAR 0xE6 ORIGIN 0x4D PUSH30 0xF32BE48BAE08404D30B621F64736F6C6343000812003300000000000000 ", + "sourceMap": "405:1691:18:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;405:1691:18;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220b00d0cee4061dc303d853fadda969d1de6324d7d0f32be48bae08404d30b621f64736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xB0 0xD 0xC 0xEE BLOCKHASH PUSH2 0xDC30 RETURNDATASIZE DUP6 EXTCODEHASH 0xAD 0xDA SWAP7 SWAP14 SAR 0xE6 ORIGIN 0x4D PUSH30 0xF32BE48BAE08404D30B621F64736F6C6343000812003300000000000000 ", + "sourceMap": "405:1691:18:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "readBytes32(bytes calldata,uint256)": "infinite", + "readFirstUint16(bytes calldata)": "infinite", + "readUint32(bytes calldata,uint256)": "infinite", + "readUint8(bytes calldata,uint256)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 405, + "end": 2096, + "name": "PUSH #[$]", + "source": 18, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH [$]", + "source": 18, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "B" + }, + { + "begin": 405, + "end": 2096, + "name": "DUP3", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "DUP3", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "DUP3", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "CODECOPY", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "DUP1", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "MLOAD", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "0" + }, + { + "begin": 405, + "end": 2096, + "name": "BYTE", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "73" + }, + { + "begin": 405, + "end": 2096, + "name": "EQ", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH [tag]", + "source": 18, + "value": "1" + }, + { + "begin": 405, + "end": 2096, + "name": "JUMPI", + "source": 18 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "0" + }, + { + "begin": 405, + "end": 2096, + "name": "MSTORE", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "0" + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "4" + }, + { + "begin": 405, + "end": 2096, + "name": "MSTORE", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "24" + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "0" + }, + { + "begin": 405, + "end": 2096, + "name": "REVERT", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "tag", + "source": 18, + "value": "1" + }, + { + "begin": 405, + "end": 2096, + "name": "JUMPDEST", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "ADDRESS", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "0" + }, + { + "begin": 405, + "end": 2096, + "name": "MSTORE", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "73" + }, + { + "begin": 405, + "end": 2096, + "name": "DUP2", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "MSTORE8", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "DUP3", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "DUP2", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "RETURN", + "source": 18 + } + ], + ".data": { + "0": { + ".auxdata": "a2646970667358221220b00d0cee4061dc303d853fadda969d1de6324d7d0f32be48bae08404d30b621f64736f6c63430008120033", + ".code": [ + { + "begin": 405, + "end": 2096, + "name": "PUSHDEPLOYADDRESS", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "ADDRESS", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "EQ", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "80" + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "40" + }, + { + "begin": 405, + "end": 2096, + "name": "MSTORE", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "PUSH", + "source": 18, + "value": "0" + }, + { + "begin": 405, + "end": 2096, + "name": "DUP1", + "source": 18 + }, + { + "begin": 405, + "end": 2096, + "name": "REVERT", + "source": 18 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Agustin Aguilar (aa@horizon.io)\",\"details\":\"These functions do not check if the input index is within the bounds of the data array. Reading out of bounds may return dirty values.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Library for reading data from bytes arrays\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"This library contains functions for reading data from bytes arrays.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":\"LibBytes\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":{\"keccak256\":\"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98\",\"dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "This library contains functions for reading data from bytes arrays.", + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol": { + "LibBytesPointer": { + "abi": [], + "devdoc": { + "author": "Agustin Aguilar (aa@horizon.io)", + "details": "These functions do not check if the input index is within the bounds of the data array. Reading out of bounds may return dirty values.", + "kind": "dev", + "methods": {}, + "title": "Library for reading data from bytes arrays with a pointer", + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":435:4565 library LibBytesPointer {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":435:4565 library LibBytesPointer {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa2646970667358221220d0f4a33b1bd37a24b174a2b3b0b481e96309d638af5db4e4de3ac1de1aa243ff64736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220d0f4a33b1bd37a24b174a2b3b0b481e96309d638af5db4e4de3ac1de1aa243ff64736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD0 DELEGATECALL LOG3 EXTCODESIZE SHL 0xD3 PUSH27 0x24B174A2B3B0B481E96309D638AF5DB4E4DE3AC1DE1AA243FF6473 PUSH16 0x6C634300081200330000000000000000 ", + "sourceMap": "435:4130:19:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;435:4130:19;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220d0f4a33b1bd37a24b174a2b3b0b481e96309d638af5db4e4de3ac1de1aa243ff64736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD0 DELEGATECALL LOG3 EXTCODESIZE SHL 0xD3 PUSH27 0x24B174A2B3B0B481E96309D638AF5DB4E4DE3AC1DE1AA243FF6473 PUSH16 0x6C634300081200330000000000000000 ", + "sourceMap": "435:4130:19:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "readBytes32(bytes calldata,uint256)": "infinite", + "readFirstUint16(bytes calldata)": "infinite", + "readUint16(bytes calldata,uint256)": "infinite", + "readUint24(bytes calldata,uint256)": "infinite", + "readUint64(bytes calldata,uint256)": "infinite", + "readUint8(bytes calldata,uint256)": "infinite", + "readUint8Address(bytes calldata,uint256)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 435, + "end": 4565, + "name": "PUSH #[$]", + "source": 19, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH [$]", + "source": 19, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "B" + }, + { + "begin": 435, + "end": 4565, + "name": "DUP3", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "DUP3", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "DUP3", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "CODECOPY", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "DUP1", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "MLOAD", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "0" + }, + { + "begin": 435, + "end": 4565, + "name": "BYTE", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "73" + }, + { + "begin": 435, + "end": 4565, + "name": "EQ", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH [tag]", + "source": 19, + "value": "1" + }, + { + "begin": 435, + "end": 4565, + "name": "JUMPI", + "source": 19 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "0" + }, + { + "begin": 435, + "end": 4565, + "name": "MSTORE", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "0" + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "4" + }, + { + "begin": 435, + "end": 4565, + "name": "MSTORE", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "24" + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "0" + }, + { + "begin": 435, + "end": 4565, + "name": "REVERT", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "tag", + "source": 19, + "value": "1" + }, + { + "begin": 435, + "end": 4565, + "name": "JUMPDEST", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "ADDRESS", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "0" + }, + { + "begin": 435, + "end": 4565, + "name": "MSTORE", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "73" + }, + { + "begin": 435, + "end": 4565, + "name": "DUP2", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "MSTORE8", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "DUP3", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "DUP2", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "RETURN", + "source": 19 + } + ], + ".data": { + "0": { + ".auxdata": "a2646970667358221220d0f4a33b1bd37a24b174a2b3b0b481e96309d638af5db4e4de3ac1de1aa243ff64736f6c63430008120033", + ".code": [ + { + "begin": 435, + "end": 4565, + "name": "PUSHDEPLOYADDRESS", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "ADDRESS", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "EQ", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "80" + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "40" + }, + { + "begin": 435, + "end": 4565, + "name": "MSTORE", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "PUSH", + "source": 19, + "value": "0" + }, + { + "begin": 435, + "end": 4565, + "name": "DUP1", + "source": 19 + }, + { + "begin": 435, + "end": 4565, + "name": "REVERT", + "source": 19 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Agustin Aguilar (aa@horizon.io)\",\"details\":\"These functions do not check if the input index is within the bounds of the data array. Reading out of bounds may return dirty values.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Library for reading data from bytes arrays with a pointer\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"This library contains functions for reading data from bytes arrays with a pointer.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":\"LibBytesPointer\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol\":{\"keccak256\":\"0xbda56396592db18a248d4062cd36abd586a11d92a2d25483d8c597f890859b15\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a6ee93bcb7ccd1d1b8979c9530b1ca452d0757794995b62793b6e197670b9f25\",\"dweb:/ipfs/QmbNkhTPzF1YgU4Qgu4SRFXZ8AwFjyG18EzuMZ32anrQ4Y\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "This library contains functions for reading data from bytes arrays with a pointer.", + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol": { + "LibOptim": { + "abi": [], + "devdoc": { + "author": "Agustin Aguilar (aa@horizon.io)", + "kind": "dev", + "methods": {}, + "title": "Library for optimized EVM operations", + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":244:2587 library LibOptim {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":244:2587 library LibOptim {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa26469706673582212205f4f74640fb3a38d4d73f90f221f7f681ee2035d59f6b9d140c2e9aad1ae2bac64736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205f4f74640fb3a38d4d73f90f221f7f681ee2035d59f6b9d140c2e9aad1ae2bac64736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5F 0x4F PUSH21 0x640FB3A38D4D73F90F221F7F681EE2035D59F6B9D1 BLOCKHASH 0xC2 0xE9 0xAA 0xD1 0xAE 0x2B 0xAC PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "244:2343:20:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;244:2343:20;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212205f4f74640fb3a38d4d73f90f221f7f681ee2035d59f6b9d140c2e9aad1ae2bac64736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x5F 0x4F PUSH21 0x640FB3A38D4D73F90F221F7F681EE2035D59F6B9D1 BLOCKHASH 0xC2 0xE9 0xAA 0xD1 0xAE 0x2B 0xAC PUSH5 0x736F6C6343 STOP ADDMOD SLT STOP CALLER ", + "sourceMap": "244:2343:20:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "call(address,uint256,uint256,bytes calldata)": "infinite", + "delegatecall(address,uint256,bytes calldata)": "infinite", + "fkeccak256(bytes32,bytes32)": "infinite", + "returnData()": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 244, + "end": 2587, + "name": "PUSH #[$]", + "source": 20, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH [$]", + "source": 20, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "B" + }, + { + "begin": 244, + "end": 2587, + "name": "DUP3", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "DUP3", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "DUP3", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "CODECOPY", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "DUP1", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "MLOAD", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 244, + "end": 2587, + "name": "BYTE", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "73" + }, + { + "begin": 244, + "end": 2587, + "name": "EQ", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH [tag]", + "source": 20, + "value": "1" + }, + { + "begin": 244, + "end": 2587, + "name": "JUMPI", + "source": 20 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 244, + "end": 2587, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "4" + }, + { + "begin": 244, + "end": 2587, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "24" + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 244, + "end": 2587, + "name": "REVERT", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "tag", + "source": 20, + "value": "1" + }, + { + "begin": 244, + "end": 2587, + "name": "JUMPDEST", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "ADDRESS", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 244, + "end": 2587, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "73" + }, + { + "begin": 244, + "end": 2587, + "name": "DUP2", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "MSTORE8", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "DUP3", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "DUP2", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "RETURN", + "source": 20 + } + ], + ".data": { + "0": { + ".auxdata": "a26469706673582212205f4f74640fb3a38d4d73f90f221f7f681ee2035d59f6b9d140c2e9aad1ae2bac64736f6c63430008120033", + ".code": [ + { + "begin": 244, + "end": 2587, + "name": "PUSHDEPLOYADDRESS", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "ADDRESS", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "EQ", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "80" + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "40" + }, + { + "begin": 244, + "end": 2587, + "name": "MSTORE", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "PUSH", + "source": 20, + "value": "0" + }, + { + "begin": 244, + "end": 2587, + "name": "DUP1", + "source": 20 + }, + { + "begin": 244, + "end": 2587, + "name": "REVERT", + "source": 20 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Agustin Aguilar (aa@horizon.io)\",\"kind\":\"dev\",\"methods\":{},\"title\":\"Library for optimized EVM operations\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"This library contains functions for optimizing certain EVM operations.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":\"LibOptim\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol\":{\"keccak256\":\"0x4c558b8c9d0dff2322d5d812e83a3abe25a9e60c8f646507f8a9c7fa2a2453af\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://6f0796c75d117770e220c136b60d96b5cf1d4875ccbbd0afb564ed27aa220335\",\"dweb:/ipfs/QmQxYm6CMCqJiKsB3sguqWu8rggmaQgpuq8BZhAEveqNAM\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "notice": "This library contains functions for optimizing certain EVM operations.", + "version": 1 + } + } + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol": { + "SignatureValidator": { + "abi": [ + { + "inputs": [], + "name": "EmptySignature", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_s", + "type": "bytes32" + } + ], + "name": "InvalidSValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "InvalidSignatureLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_v", + "type": "uint256" + } + ], + "name": "InvalidVValue", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "SignerIsAddress0", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_type", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "_recoverMode", + "type": "bool" + } + ], + "name": "UnsupportedSignatureType", + "type": "error" + } + ], + "devdoc": { + "details": "Contains logic for signature validation. Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md) Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/", + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "assembly": " /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":430:5364 library SignatureValidator {... */\n dataSize(sub_0)\n dataOffset(sub_0)\n 0x0b\n dup3\n dup3\n dup3\n codecopy\n dup1\n mload\n 0x00\n byte\n 0x73\n eq\n tag_1\n jumpi\n mstore(0x00, shl(0xe0, 0x4e487b71))\n mstore(0x04, 0x00)\n revert(0x00, 0x24)\ntag_1:\n mstore(0x00, address)\n 0x73\n dup2\n mstore8\n dup3\n dup2\n return\nstop\n\nsub_0: assembly {\n /* \"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":430:5364 library SignatureValidator {... */\n eq(address, deployTimeAddress())\n mstore(0x40, 0x80)\n 0x00\n dup1\n revert\n\n auxdata: 0xa26469706673582212207a75fc4c1f66fe757bfffc4be7a9fe45a8e63a8665fbf6a76ca76ea37740ce0c64736f6c63430008120033\n}\n", + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212207a75fc4c1f66fe757bfffc4be7a9fe45a8e63a8665fbf6a76ca76ea37740ce0c64736f6c63430008120033", + "opcodes": "PUSH1 0x56 PUSH1 0x37 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x2A JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH27 0x75FC4C1F66FE757BFFFC4BE7A9FE45A8E63A8665FBF6A76CA76EA3 PUSH24 0x40CE0C64736F6C6343000812003300000000000000000000 ", + "sourceMap": "430:4934:21:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;430:4934:21;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212207a75fc4c1f66fe757bfffc4be7a9fe45a8e63a8665fbf6a76ca76ea37740ce0c64736f6c63430008120033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH27 0x75FC4C1F66FE757BFFFC4BE7A9FE45A8E63A8665FBF6A76CA76EA3 PUSH24 0x40CE0C64736F6C6343000812003300000000000000000000 ", + "sourceMap": "430:4934:21:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "103", + "totalCost": "17303" + }, + "internal": { + "isValidSignature(bytes32,address,bytes calldata)": "infinite", + "recoverSigner(bytes32,bytes calldata)": "infinite" + } + }, + "legacyAssembly": { + ".code": [ + { + "begin": 430, + "end": 5364, + "name": "PUSH #[$]", + "source": 21, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH [$]", + "source": 21, + "value": "0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "B" + }, + { + "begin": 430, + "end": 5364, + "name": "DUP3", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "DUP3", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "DUP3", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "CODECOPY", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "DUP1", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "MLOAD", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 430, + "end": 5364, + "name": "BYTE", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "73" + }, + { + "begin": 430, + "end": 5364, + "name": "EQ", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH [tag]", + "source": 21, + "value": "1" + }, + { + "begin": 430, + "end": 5364, + "name": "JUMPI", + "source": 21 + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "4E487B71" + }, + { + "begin": -1, + "end": -1, + "name": "PUSH", + "source": -1, + "value": "E0" + }, + { + "begin": -1, + "end": -1, + "name": "SHL", + "source": -1 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 430, + "end": 5364, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "4" + }, + { + "begin": 430, + "end": 5364, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "24" + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 430, + "end": 5364, + "name": "REVERT", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "tag", + "source": 21, + "value": "1" + }, + { + "begin": 430, + "end": 5364, + "name": "JUMPDEST", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "ADDRESS", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 430, + "end": 5364, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "73" + }, + { + "begin": 430, + "end": 5364, + "name": "DUP2", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "MSTORE8", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "DUP3", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "DUP2", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "RETURN", + "source": 21 + } + ], + ".data": { + "0": { + ".auxdata": "a26469706673582212207a75fc4c1f66fe757bfffc4be7a9fe45a8e63a8665fbf6a76ca76ea37740ce0c64736f6c63430008120033", + ".code": [ + { + "begin": 430, + "end": 5364, + "name": "PUSHDEPLOYADDRESS", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "ADDRESS", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "EQ", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "80" + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "40" + }, + { + "begin": 430, + "end": 5364, + "name": "MSTORE", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "PUSH", + "source": 21, + "value": "0" + }, + { + "begin": 430, + "end": 5364, + "name": "DUP1", + "source": 21 + }, + { + "begin": 430, + "end": 5364, + "name": "REVERT", + "source": 21 + } + ] + } + }, + "sourceList": [ + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "#utility.yul" + ] + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"EmptySignature\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_s\",\"type\":\"bytes32\"}],\"name\":\"InvalidSValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"InvalidSignatureLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_v\",\"type\":\"uint256\"}],\"name\":\"InvalidVValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"SignerIsAddress0\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_type\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_recoverMode\",\"type\":\"bool\"}],\"name\":\"UnsupportedSignatureType\",\"type\":\"error\"}],\"devdoc\":{\"details\":\"Contains logic for signature validation. Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md) Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":\"SignatureValidator\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":500000},\"remappings\":[\":@0xsequence/contracts-library/=src/\",\":@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/\",\":@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/\",\":@openzeppelin/=lib/openzeppelin/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/\",\":erc721a/=lib/chiru-labs/erc721a/\",\":forge-std/=lib/forge-std/src/\",\":murky/=lib/murky/src/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol\":{\"keccak256\":\"0x2d7881bca678833feb385fd59e5d8ad6d596160ab51daa7030372654b3dbc38c\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://010f44c05b7285a55de939f9989727d53dfb87fd2d2534a832a70e0e081bb5f1\",\"dweb:/ipfs/QmQcujWErxjktsKyyiTySaFuR7Vaq6fUA9SUzPkde2txVK\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol\":{\"keccak256\":\"0xd780faf34527a323c96577c57370d175a2b6149db7ebea0937592eb389e52805\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://7a41a47e72f5761d912367c041ddab41620175d63059ad71ff681a87d8cf0e98\",\"dweb:/ipfs/QmfEFuLaVyx9vQc83dS48wTcLtbBiWTNMdHSi5hAWA379i\"]},\"sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol\":{\"keccak256\":\"0x7ac5dd35cbc776693eecfd8e7e86af139c7b054c43be4f97e6c8929417c17dba\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4a452d8acad5246538ac352887081d732098dcab869c79a43a5f916e7e76f353\",\"dweb:/ipfs/QmeazDSxfKBSGyCGjmk7G79UbvYMRcbr2eUU9ThyqSvNhv\"]}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + } + }, + "sources": { + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "exportedSymbols": { + "IERC1271Wallet": [ + 22 + ] + }, + "id": 23, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IERC1271Wallet", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 22, + "linearizedBaseContracts": [ + 22 + ], + "name": "IERC1271Wallet", + "nameLocation": "75:14:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "documentation": { + "id": 2, + "nodeType": "StructuredDocumentation", + "src": "95:633:0", + "text": " @notice Verifies whether the provided signature is valid with respect to the provided data\n @dev MUST return the correct magic value if the signature provided is valid for the provided data\n > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\")\n > This function MAY modify Ethereum's state\n @param _data Arbitrary length data signed on the behalf of address(this)\n @param _signature Signature byte array associated with _data\n @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise" + }, + "functionSelector": "20c13b0b", + "id": 11, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isValidSignature", + "nameLocation": "740:16:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 7, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 4, + "mutability": "mutable", + "name": "_data", + "nameLocation": "777:5:0", + "nodeType": "VariableDeclaration", + "scope": 11, + "src": "762:20:0", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 3, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "762:5:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 6, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "803:10:0", + "nodeType": "VariableDeclaration", + "scope": 11, + "src": "788:25:0", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 5, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "788:5:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "756:58:0" + }, + "returnParameters": { + "id": 10, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9, + "mutability": "mutable", + "name": "magicValue", + "nameLocation": "857:10:0", + "nodeType": "VariableDeclaration", + "scope": 11, + "src": "850:17:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 8, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "850:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "849:19:0" + }, + "scope": 22, + "src": "731:138:0", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 12, + "nodeType": "StructuredDocumentation", + "src": "873:604:0", + "text": " @notice Verifies whether the provided signature is valid with respect to the provided hash\n @dev MUST return the correct magic value if the signature provided is valid for the provided hash\n > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\")\n > This function MAY modify Ethereum's state\n @param _hash keccak256 hash that was signed\n @param _signature Signature byte array associated with _data\n @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise" + }, + "functionSelector": "1626ba7e", + "id": 21, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "isValidSignature", + "nameLocation": "1489:16:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 17, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 14, + "mutability": "mutable", + "name": "_hash", + "nameLocation": "1519:5:0", + "nodeType": "VariableDeclaration", + "scope": 21, + "src": "1511:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 13, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1511:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 16, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "1545:10:0", + "nodeType": "VariableDeclaration", + "scope": 21, + "src": "1530:25:0", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 15, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1530:5:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1505:51:0" + }, + "returnParameters": { + "id": 20, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 19, + "mutability": "mutable", + "name": "magicValue", + "nameLocation": "1599:10:0", + "nodeType": "VariableDeclaration", + "scope": 21, + "src": "1592:17:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 18, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "1592:6:0", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "1591:19:0" + }, + "scope": 22, + "src": "1480:131:0", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + } + ], + "scope": 23, + "src": "65:1548:0", + "usedErrors": [] + } + ], + "src": "39:1574:0" + }, + "id": 0 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/GuestModule.sol", + "exportedSymbols": { + "GuestModule": [ + 241 + ], + "IERC1271Wallet": [ + 22 + ], + "IModuleAuth": [ + 1249 + ], + "IModuleCalls": [ + 1313 + ], + "IModuleCreator": [ + 1328 + ], + "LibBytes": [ + 2374 + ], + "LibBytesPointer": [ + 2476 + ], + "LibOptim": [ + 2530 + ], + "ModuleAuth": [ + 564 + ], + "ModuleCalls": [ + 833 + ], + "ModuleCreator": [ + 902 + ], + "ModuleERC165": [ + 920 + ], + "ModuleNonce": [ + 1051 + ], + "ModuleOnlyDelegatecall": [ + 1085 + ], + "ModuleSelfAuth": [ + 1116 + ], + "ModuleStorage": [ + 1179 + ], + "SequenceBaseSig": [ + 2021 + ], + "SequenceChainedSig": [ + 2218 + ], + "SequenceDynamicSig": [ + 2247 + ], + "SequenceNoChainIdSig": [ + 2275 + ], + "SignatureValidator": [ + 2798 + ], + "SubModuleNonce": [ + 2324 + ] + }, + "id": 242, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 24, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:1" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "file": "../utils/LibOptim.sol", + "id": 25, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 242, + "sourceUnit": 2531, + "src": "64:31:1", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "file": "./commons/submodules/auth/SequenceBaseSig.sol", + "id": 26, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 242, + "sourceUnit": 2022, + "src": "97:55:1", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "file": "./commons/ModuleAuth.sol", + "id": 27, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 242, + "sourceUnit": 565, + "src": "154:34:1", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "file": "./commons/ModuleCalls.sol", + "id": 28, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 242, + "sourceUnit": 834, + "src": "189:35:1", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "file": "./commons/ModuleCreator.sol", + "id": 29, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 242, + "sourceUnit": 903, + "src": "225:37:1", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 31, + "name": "ModuleAuth", + "nameLocations": [ + "666:10:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 564, + "src": "666:10:1" + }, + "id": 32, + "nodeType": "InheritanceSpecifier", + "src": "666:10:1" + }, + { + "baseName": { + "id": 33, + "name": "ModuleCalls", + "nameLocations": [ + "680:11:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 833, + "src": "680:11:1" + }, + "id": 34, + "nodeType": "InheritanceSpecifier", + "src": "680:11:1" + }, + { + "baseName": { + "id": 35, + "name": "ModuleCreator", + "nameLocations": [ + "695:13:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 902, + "src": "695:13:1" + }, + "id": 36, + "nodeType": "InheritanceSpecifier", + "src": "695:13:1" + } + ], + "canonicalName": "GuestModule", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 30, + "nodeType": "StructuredDocumentation", + "src": "265:374:1", + "text": " GuestModule implements a Sequence wallet without signatures, nonce or replay protection.\n executing transactions using this wallet is not an authenticated process, and can be done by any address.\n @notice This contract is completely public with no security, designed to execute pre-signed transactions\n and use Sequence tools without using the wallets." + }, + "fullyImplemented": true, + "id": 241, + "linearizedBaseContracts": [ + 241, + 902, + 833, + 1051, + 564, + 2218, + 1116, + 1085, + 22, + 920, + 1328, + 1249, + 1313 + ], + "name": "GuestModule", + "nameLocation": "649:11:1", + "nodeType": "ContractDefinition", + "nodes": [ + { + "errorSelector": "230d1ccc", + "id": 40, + "name": "DelegateCallNotAllowed", + "nameLocation": "719:22:1", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 39, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 38, + "mutability": "mutable", + "name": "_index", + "nameLocation": "750:6:1", + "nodeType": "VariableDeclaration", + "scope": 40, + "src": "742:14:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 37, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "742:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "741:16:1" + }, + "src": "713:45:1" + }, + { + "errorSelector": "a0387940", + "id": 42, + "name": "NotSupported", + "nameLocation": "767:12:1", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 41, + "nodeType": "ParameterList", + "parameters": [], + "src": "779:2:1" + }, + "src": "761:21:1" + }, + { + "baseFunctions": [ + 637 + ], + "body": { + "id": 73, + "nodeType": "Block", + "src": "993:189:1", + "statements": [ + { + "assignments": [ + 56 + ], + "declarations": [ + { + "constant": false, + "id": 56, + "mutability": "mutable", + "name": "txHash", + "nameLocation": "1038:6:1", + "nodeType": "VariableDeclaration", + "scope": 73, + "src": "1030:14:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 55, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1030:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 67, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "hexValue": "67756573743a", + "id": 62, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1094:8:1", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_4dfa0bed92fb5c2df0b47ce555e6e6b89f746e856aa9783c634a4987edcbf682", + "typeString": "literal_string \"guest:\"" + }, + "value": "guest:" + }, + { + "id": 63, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 47, + "src": "1104:4:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_4dfa0bed92fb5c2df0b47ce555e6e6b89f746e856aa9783c634a4987edcbf682", + "typeString": "literal_string \"guest:\"" + }, + { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + ], + "expression": { + "id": 60, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "1083:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1087:6:1", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "1083:10:1", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 64, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1083:26:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 59, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "1073:9:1", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 65, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1073:37:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 57, + "name": "SequenceBaseSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2021, + "src": "1047:15:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceBaseSig_$2021_$", + "typeString": "type(library SequenceBaseSig)" + } + }, + "id": 58, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1063:9:1", + "memberName": "subdigest", + "nodeType": "MemberAccess", + "referencedDeclaration": 1394, + "src": "1047:25:1", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + "id": 66, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1047:64:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1030:81:1" + }, + { + "expression": { + "arguments": [ + { + "id": 69, + "name": "txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 56, + "src": "1164:6:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 70, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 47, + "src": "1172:4:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + ], + "id": 68, + "name": "_executeGuest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 199, + "src": "1150:13:1", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr_$returns$__$", + "typeString": "function (bytes32,struct IModuleCalls.Transaction calldata[] calldata)" + } + }, + "id": 71, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1150:27:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 72, + "nodeType": "ExpressionStatement", + "src": "1150:27:1" + } + ] + }, + "documentation": { + "id": 43, + "nodeType": "StructuredDocumentation", + "src": "786:101:1", + "text": " @notice Allow any caller to execute an action\n @param _txs Transactions to process" + }, + "functionSelector": "7a9a1628", + "id": 74, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "execute", + "nameLocation": "899:7:1", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 53, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "984:8:1" + }, + "parameters": { + "id": 52, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 47, + "mutability": "mutable", + "name": "_txs", + "nameLocation": "935:4:1", + "nodeType": "VariableDeclaration", + "scope": 74, + "src": "912:27:1", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + }, + "typeName": { + "baseType": { + "id": 45, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 44, + "name": "Transaction", + "nameLocations": [ + "912:11:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "912:11:1" + }, + "referencedDeclaration": 1292, + "src": "912:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "id": 46, + "nodeType": "ArrayTypeName", + "src": "912:13:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_storage_$dyn_storage_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 49, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 74, + "src": "945:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 48, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "945:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 51, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 74, + "src": "958:14:1", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 50, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "958:5:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "906:70:1" + }, + "returnParameters": { + "id": 54, + "nodeType": "ParameterList", + "parameters": [], + "src": "993:0:1" + }, + "scope": 241, + "src": "890:292:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "baseFunctions": [ + 667 + ], + "body": { + "id": 101, + "nodeType": "Block", + "src": "1364:188:1", + "statements": [ + { + "assignments": [ + 84 + ], + "declarations": [ + { + "constant": false, + "id": 84, + "mutability": "mutable", + "name": "txHash", + "nameLocation": "1409:6:1", + "nodeType": "VariableDeclaration", + "scope": 101, + "src": "1401:14:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 83, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1401:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 95, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "hexValue": "73656c663a", + "id": 90, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1465:7:1", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845", + "typeString": "literal_string \"self:\"" + }, + "value": "self:" + }, + { + "id": 91, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 79, + "src": "1474:4:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845", + "typeString": "literal_string \"self:\"" + }, + { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + ], + "expression": { + "id": 88, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "1454:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 89, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1458:6:1", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "1454:10:1", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 92, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1454:25:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 87, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "1444:9:1", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 93, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1444:36:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 85, + "name": "SequenceBaseSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2021, + "src": "1418:15:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceBaseSig_$2021_$", + "typeString": "type(library SequenceBaseSig)" + } + }, + "id": 86, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1434:9:1", + "memberName": "subdigest", + "nodeType": "MemberAccess", + "referencedDeclaration": 1394, + "src": "1418:25:1", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + "id": 94, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1418:63:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1401:80:1" + }, + { + "expression": { + "arguments": [ + { + "id": 97, + "name": "txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 84, + "src": "1534:6:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 98, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 79, + "src": "1542:4:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + ], + "id": 96, + "name": "_executeGuest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 199, + "src": "1520:13:1", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr_$returns$__$", + "typeString": "function (bytes32,struct IModuleCalls.Transaction calldata[] calldata)" + } + }, + "id": 99, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1520:27:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 100, + "nodeType": "ExpressionStatement", + "src": "1520:27:1" + } + ] + }, + "documentation": { + "id": 75, + "nodeType": "StructuredDocumentation", + "src": "1186:101:1", + "text": " @notice Allow any caller to execute an action\n @param _txs Transactions to process" + }, + "functionSelector": "61c2926c", + "id": 102, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "selfExecute", + "nameLocation": "1299:11:1", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 81, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "1355:8:1" + }, + "parameters": { + "id": 80, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 79, + "mutability": "mutable", + "name": "_txs", + "nameLocation": "1339:4:1", + "nodeType": "VariableDeclaration", + "scope": 102, + "src": "1316:27:1", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + }, + "typeName": { + "baseType": { + "id": 77, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 76, + "name": "Transaction", + "nameLocations": [ + "1316:11:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "1316:11:1" + }, + "referencedDeclaration": 1292, + "src": "1316:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "id": 78, + "nodeType": "ArrayTypeName", + "src": "1316:13:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_storage_$dyn_storage_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + } + }, + "visibility": "internal" + } + ], + "src": "1310:37:1" + }, + "returnParameters": { + "id": 82, + "nodeType": "ParameterList", + "parameters": [], + "src": "1364:0:1" + }, + "scope": 241, + "src": "1290:262:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 198, + "nodeType": "Block", + "src": "1799:745:1", + "statements": [ + { + "assignments": [ + 113 + ], + "declarations": [ + { + "constant": false, + "id": 113, + "mutability": "mutable", + "name": "size", + "nameLocation": "1840:4:1", + "nodeType": "VariableDeclaration", + "scope": 198, + "src": "1832:12:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 112, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1832:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 116, + "initialValue": { + "expression": { + "id": 114, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 109, + "src": "1847:4:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + }, + "id": 115, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1852:6:1", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "1847:11:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1832:26:1" + }, + { + "body": { + "id": 196, + "nodeType": "Block", + "src": "1899:641:1", + "statements": [ + { + "assignments": [ + 129 + ], + "declarations": [ + { + "constant": false, + "id": 129, + "mutability": "mutable", + "name": "transaction", + "nameLocation": "1928:11:1", + "nodeType": "VariableDeclaration", + "scope": 196, + "src": "1907:32:1", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction" + }, + "typeName": { + "id": 128, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 127, + "name": "Transaction", + "nameLocations": [ + "1907:11:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "1907:11:1" + }, + "referencedDeclaration": 1292, + "src": "1907:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "visibility": "internal" + } + ], + "id": 133, + "initialValue": { + "baseExpression": { + "id": 130, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 109, + "src": "1942:4:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + }, + "id": 132, + "indexExpression": { + "id": 131, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 118, + "src": "1947:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1942:7:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1907:42:1" + }, + { + "condition": { + "expression": { + "id": 134, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 129, + "src": "1962:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 135, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1974:12:1", + "memberName": "delegateCall", + "nodeType": "MemberAccess", + "referencedDeclaration": 1281, + "src": "1962:24:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 140, + "nodeType": "IfStatement", + "src": "1958:62:1", + "trueBody": { + "errorCall": { + "arguments": [ + { + "id": 137, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 118, + "src": "2018:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 136, + "name": "DelegateCallNotAllowed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 40, + "src": "1995:22:1", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$__$", + "typeString": "function (uint256) pure" + } + }, + "id": 138, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1995:25:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 139, + "nodeType": "RevertStatement", + "src": "1988:32:1" + } + }, + { + "assignments": [ + 142 + ], + "declarations": [ + { + "constant": false, + "id": 142, + "mutability": "mutable", + "name": "gasLimit", + "nameLocation": "2037:8:1", + "nodeType": "VariableDeclaration", + "scope": 196, + "src": "2029:16:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 141, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2029:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 145, + "initialValue": { + "expression": { + "id": 143, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 129, + "src": "2048:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 144, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2060:8:1", + "memberName": "gasLimit", + "nodeType": "MemberAccess", + "referencedDeclaration": 1285, + "src": "2048:20:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2029:39:1" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 149, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 146, + "name": "gasleft", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967289, + "src": "2080:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 147, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2080:9:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 148, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 142, + "src": "2092:8:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2080:20:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 157, + "nodeType": "IfStatement", + "src": "2076:69:1", + "trueBody": { + "errorCall": { + "arguments": [ + { + "id": 151, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 118, + "src": "2122:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 152, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 142, + "src": "2125:8:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 153, + "name": "gasleft", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967289, + "src": "2135:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 154, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2135:9:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 150, + "name": "NotEnoughGas", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1273, + "src": "2109:12:1", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256,uint256) pure" + } + }, + "id": 155, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2109:36:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 156, + "nodeType": "RevertStatement", + "src": "2102:43:1" + } + }, + { + "assignments": [ + 159 + ], + "declarations": [ + { + "constant": false, + "id": 159, + "mutability": "mutable", + "name": "success", + "nameLocation": "2159:7:1", + "nodeType": "VariableDeclaration", + "scope": 196, + "src": "2154:12:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 158, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2154:4:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 176, + "initialValue": { + "arguments": [ + { + "expression": { + "id": 162, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 129, + "src": "2192:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 163, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2204:6:1", + "memberName": "target", + "nodeType": "MemberAccess", + "referencedDeclaration": 1287, + "src": "2192:18:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 164, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 129, + "src": "2220:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 165, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2232:5:1", + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": 1289, + "src": "2220:17:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 166, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 142, + "src": "2247:8:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 167, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2259:1:1", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2247:13:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 171, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 142, + "src": "2275:8:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 172, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "2247:36:1", + "trueExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 169, + "name": "gasleft", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967289, + "src": "2263:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 170, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2263:9:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 173, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 129, + "src": "2293:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2305:4:1", + "memberName": "data", + "nodeType": "MemberAccess", + "referencedDeclaration": 1291, + "src": "2293:16:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 160, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "2169:8:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 161, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2178:4:1", + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": 2515, + "src": "2169:13:1", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bool_$", + "typeString": "function (address,uint256,uint256,bytes calldata) returns (bool)" + } + }, + "id": 175, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2169:148:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2154:163:1" + }, + { + "condition": { + "id": 177, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 159, + "src": "2330:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 194, + "nodeType": "Block", + "src": "2391:143:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 185, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 129, + "src": "2425:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 186, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2437:13:1", + "memberName": "revertOnError", + "nodeType": "MemberAccess", + "referencedDeclaration": 1283, + "src": "2425:25:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 187, + "name": "_txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 105, + "src": "2462:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 188, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 118, + "src": "2481:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 189, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "2494:8:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 190, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2503:10:1", + "memberName": "returnData", + "nodeType": "MemberAccess", + "referencedDeclaration": 2499, + "src": "2494:19:1", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 191, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2494:21:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 184, + "name": "_revertBytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 807, + "src": "2401:12:1", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bool_$_t_bytes32_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bool,bytes32,uint256,bytes memory)" + } + }, + "id": 192, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2401:124:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 193, + "nodeType": "ExpressionStatement", + "src": "2401:124:1" + } + ] + }, + "id": 195, + "nodeType": "IfStatement", + "src": "2326:208:1", + "trueBody": { + "id": 183, + "nodeType": "Block", + "src": "2339:46:1", + "statements": [ + { + "eventCall": { + "arguments": [ + { + "id": 179, + "name": "_txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 105, + "src": "2365:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 180, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 118, + "src": "2374:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 178, + "name": "TxExecuted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1265, + "src": "2354:10:1", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,uint256)" + } + }, + "id": 181, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2354:22:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 182, + "nodeType": "EmitStatement", + "src": "2349:27:1" + } + ] + } + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 123, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 121, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 118, + "src": "1884:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 122, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 113, + "src": "1888:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1884:8:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 197, + "initializationExpression": { + "assignments": [ + 118 + ], + "declarations": [ + { + "constant": false, + "id": 118, + "mutability": "mutable", + "name": "i", + "nameLocation": "1877:1:1", + "nodeType": "VariableDeclaration", + "scope": 197, + "src": "1869:9:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 117, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1869:7:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 120, + "initialValue": { + "hexValue": "30", + "id": 119, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1881:1:1", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "1869:13:1" + }, + "loopExpression": { + "expression": { + "id": 125, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "1894:3:1", + "subExpression": { + "id": 124, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 118, + "src": "1894:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 126, + "nodeType": "ExpressionStatement", + "src": "1894:3:1" + }, + "nodeType": "ForStatement", + "src": "1864:676:1" + } + ] + }, + "documentation": { + "id": 103, + "nodeType": "StructuredDocumentation", + "src": "1556:151:1", + "text": " @notice Executes a list of transactions\n @param _txHash Hash of the batch of transactions\n @param _txs Transactions to execute" + }, + "id": 199, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_executeGuest", + "nameLocation": "1719:13:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 110, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 105, + "mutability": "mutable", + "name": "_txHash", + "nameLocation": "1746:7:1", + "nodeType": "VariableDeclaration", + "scope": 199, + "src": "1738:15:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 104, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1738:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 109, + "mutability": "mutable", + "name": "_txs", + "nameLocation": "1782:4:1", + "nodeType": "VariableDeclaration", + "scope": 199, + "src": "1759:27:1", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + }, + "typeName": { + "baseType": { + "id": 107, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 106, + "name": "Transaction", + "nameLocations": [ + "1759:11:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "1759:11:1" + }, + "referencedDeclaration": 1292, + "src": "1759:11:1", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "id": 108, + "nodeType": "ArrayTypeName", + "src": "1759:13:1", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_storage_$dyn_storage_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + } + }, + "visibility": "internal" + } + ], + "src": "1732:58:1" + }, + "returnParameters": { + "id": 111, + "nodeType": "ParameterList", + "parameters": [], + "src": "1799:0:1" + }, + "scope": 241, + "src": "1710:834:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "baseFunctions": [ + 1236 + ], + "body": { + "id": 210, + "nodeType": "Block", + "src": "2766:22:1", + "statements": [ + { + "expression": { + "hexValue": "74727565", + "id": 208, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2779:4:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 207, + "id": 209, + "nodeType": "Return", + "src": "2772:11:1" + } + ] + }, + "documentation": { + "id": 200, + "nodeType": "StructuredDocumentation", + "src": "2548:145:1", + "text": " @notice Validates any signature image, because the wallet is public and has no owner.\n @return true, all signatures are valid." + }, + "id": 211, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_isValidImage", + "nameLocation": "2705:13:1", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 204, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "2737:8:1" + }, + "parameters": { + "id": 203, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 202, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 211, + "src": "2719:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 201, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2719:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2718:9:1" + }, + "returnParameters": { + "id": 207, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 206, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 211, + "src": "2760:4:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 205, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2760:4:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2759:6:1" + }, + "scope": 241, + "src": "2696:92:1", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "baseFunctions": [ + 1248 + ], + "body": { + "id": 221, + "nodeType": "Block", + "src": "2885:32:1", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 218, + "name": "NotSupported", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 42, + "src": "2898:12:1", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 219, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2898:14:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 220, + "nodeType": "RevertStatement", + "src": "2891:21:1" + } + ] + }, + "documentation": { + "id": 212, + "nodeType": "StructuredDocumentation", + "src": "2792:29:1", + "text": " Not supported." + }, + "id": 222, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_updateImageHash", + "nameLocation": "2833:16:1", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 216, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "2868:8:1" + }, + "parameters": { + "id": 215, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 214, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 222, + "src": "2850:7:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 213, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2850:7:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2849:9:1" + }, + "returnParameters": { + "id": 217, + "nodeType": "ParameterList", + "parameters": [], + "src": "2885:0:1" + }, + "scope": 241, + "src": "2824:93:1", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + }, + { + "baseFunctions": [ + 549, + 832, + 901 + ], + "body": { + "id": 239, + "nodeType": "Block", + "src": "3276:55:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 236, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 225, + "src": "3313:12:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + ], + "expression": { + "id": 234, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967271, + "src": "3289:5:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_super$_GuestModule_$241_$", + "typeString": "type(contract super GuestModule)" + } + }, + "id": 235, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3295:17:1", + "memberName": "supportsInterface", + "nodeType": "MemberAccess", + "referencedDeclaration": 901, + "src": "3289:23:1", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes4_$returns$_t_bool_$", + "typeString": "function (bytes4) pure returns (bool)" + } + }, + "id": 237, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3289:37:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 233, + "id": 238, + "nodeType": "Return", + "src": "3282:44:1" + } + ] + }, + "documentation": { + "id": 223, + "nodeType": "StructuredDocumentation", + "src": "2921:203:1", + "text": " @notice Query if a contract implements an interface\n @param _interfaceID The interface identifier, as specified in ERC-165\n @return `true` if the contract implements `_interfaceID`" + }, + "functionSelector": "01ffc9a7", + "id": 240, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "supportsInterface", + "nameLocation": "3136:17:1", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 230, + "nodeType": "OverrideSpecifier", + "overrides": [ + { + "id": 227, + "name": "ModuleAuth", + "nameLocations": [ + "3205:10:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 564, + "src": "3205:10:1" + }, + { + "id": 228, + "name": "ModuleCalls", + "nameLocations": [ + "3221:11:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 833, + "src": "3221:11:1" + }, + { + "id": 229, + "name": "ModuleCreator", + "nameLocations": [ + "3238:13:1" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 902, + "src": "3238:13:1" + } + ], + "src": "3190:65:1" + }, + "parameters": { + "id": 226, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 225, + "mutability": "mutable", + "name": "_interfaceID", + "nameLocation": "3166:12:1", + "nodeType": "VariableDeclaration", + "scope": 240, + "src": "3159:19:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 224, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "3159:6:1", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "3153:29:1" + }, + "returnParameters": { + "id": 233, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 232, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 240, + "src": "3270:4:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 231, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3270:4:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "3269:6:1" + }, + "scope": 241, + "src": "3127:204:1", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + } + ], + "scope": 242, + "src": "640:2693:1", + "usedErrors": [ + 40, + 42, + 938, + 1057, + 1093, + 1193, + 1197, + 1273, + 1279, + 1319, + 1367, + 1371, + 2050, + 2056, + 2539, + 2541, + 2547, + 2553, + 2561, + 2565 + ] + } + ], + "src": "39:3295:1" + }, + "id": 1 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleAuth.sol", + "exportedSymbols": { + "IERC1271Wallet": [ + 22 + ], + "IModuleAuth": [ + 1249 + ], + "LibBytes": [ + 2374 + ], + "LibBytesPointer": [ + 2476 + ], + "LibOptim": [ + 2530 + ], + "ModuleAuth": [ + 564 + ], + "ModuleERC165": [ + 920 + ], + "ModuleSelfAuth": [ + 1116 + ], + "ModuleStorage": [ + 1179 + ], + "SequenceBaseSig": [ + 2021 + ], + "SequenceChainedSig": [ + 2218 + ], + "SequenceDynamicSig": [ + 2247 + ], + "SequenceNoChainIdSig": [ + 2275 + ], + "SignatureValidator": [ + 2798 + ] + }, + "id": 565, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 243, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:2" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "file": "../../utils/LibBytes.sol", + "id": 244, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 565, + "sourceUnit": 2375, + "src": "64:34:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "file": "../../interfaces/IERC1271Wallet.sol", + "id": 245, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 565, + "sourceUnit": 23, + "src": "99:45:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "file": "./interfaces/IModuleAuth.sol", + "id": 246, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 565, + "sourceUnit": 1250, + "src": "146:38:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "file": "./ModuleERC165.sol", + "id": 247, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 565, + "sourceUnit": 921, + "src": "186:28:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "file": "./submodules/auth/SequenceBaseSig.sol", + "id": 248, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 565, + "sourceUnit": 2022, + "src": "216:47:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "file": "./submodules/auth/SequenceDynamicSig.sol", + "id": 249, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 565, + "sourceUnit": 2248, + "src": "264:50:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "file": "./submodules/auth/SequenceNoChainIdSig.sol", + "id": 250, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 565, + "sourceUnit": 2276, + "src": "315:52:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "file": "./submodules/auth/SequenceChainedSig.sol", + "id": 251, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 565, + "sourceUnit": 2219, + "src": "368:50:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 252, + "name": "IModuleAuth", + "nameLocations": [ + "455:11:2" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1249, + "src": "455:11:2" + }, + "id": 253, + "nodeType": "InheritanceSpecifier", + "src": "455:11:2" + }, + { + "baseName": { + "id": 254, + "name": "ModuleERC165", + "nameLocations": [ + "470:12:2" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 920, + "src": "470:12:2" + }, + "id": 255, + "nodeType": "InheritanceSpecifier", + "src": "470:12:2" + }, + { + "baseName": { + "id": 256, + "name": "IERC1271Wallet", + "nameLocations": [ + "486:14:2" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 22, + "src": "486:14:2" + }, + "id": 257, + "nodeType": "InheritanceSpecifier", + "src": "486:14:2" + }, + { + "baseName": { + "id": 258, + "name": "SequenceChainedSig", + "nameLocations": [ + "504:18:2" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2218, + "src": "504:18:2" + }, + "id": 259, + "nodeType": "InheritanceSpecifier", + "src": "504:18:2" + } + ], + "canonicalName": "ModuleAuth", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": false, + "id": 564, + "linearizedBaseContracts": [ + 564, + 2218, + 1116, + 22, + 920, + 1249 + ], + "name": "ModuleAuth", + "nameLocation": "439:10:2", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 262, + "libraryName": { + "id": 260, + "name": "LibBytes", + "nameLocations": [ + "533:8:2" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2374, + "src": "533:8:2" + }, + "nodeType": "UsingForDirective", + "src": "527:25:2", + "typeName": { + "id": 261, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "546:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + } + }, + { + "constant": true, + "id": 265, + "mutability": "constant", + "name": "LEGACY_TYPE", + "nameLocation": "581:11:2", + "nodeType": "VariableDeclaration", + "scope": 564, + "src": "556:46:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 263, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "556:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "value": { + "hexValue": "00", + "id": 264, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "hexString", + "lValueRequested": false, + "nodeType": "Literal", + "src": "595:7:2", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a", + "typeString": "literal_string hex\"00\"" + }, + "value": "\u0000" + }, + "visibility": "internal" + }, + { + "constant": true, + "id": 268, + "mutability": "constant", + "name": "DYNAMIC_TYPE", + "nameLocation": "631:12:2", + "nodeType": "VariableDeclaration", + "scope": 564, + "src": "606:47:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 266, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "606:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "value": { + "hexValue": "01", + "id": 267, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "hexString", + "lValueRequested": false, + "nodeType": "Literal", + "src": "646:7:2", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd2", + "typeString": "literal_string hex\"01\"" + }, + "value": "\u0001" + }, + "visibility": "internal" + }, + { + "constant": true, + "id": 271, + "mutability": "constant", + "name": "NO_CHAIN_ID_TYPE", + "nameLocation": "682:16:2", + "nodeType": "VariableDeclaration", + "scope": 564, + "src": "657:51:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 269, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "657:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "value": { + "hexValue": "02", + "id": 270, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "hexString", + "lValueRequested": false, + "nodeType": "Literal", + "src": "701:7:2", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_f2ee15ea639b73fa3db9b34a245bdfa015c260c598b211bf05a1ecc4b3e3b4f2", + "typeString": "literal_string hex\"02\"" + }, + "value": "\u0002" + }, + "visibility": "internal" + }, + { + "constant": true, + "id": 274, + "mutability": "constant", + "name": "CHAINED_TYPE", + "nameLocation": "737:12:2", + "nodeType": "VariableDeclaration", + "scope": 564, + "src": "712:47:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 272, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "712:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "value": { + "hexValue": "03", + "id": 273, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "hexString", + "lValueRequested": false, + "nodeType": "Literal", + "src": "752:7:2", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_69c322e3248a5dfc29d73c5b0553b0185a35cd5bb6386747517ef7e53b15e287", + "typeString": "literal_string hex\"03\"" + }, + "value": "\u0003" + }, + "visibility": "internal" + }, + { + "constant": true, + "id": 277, + "mutability": "constant", + "name": "SELECTOR_ERC1271_BYTES_BYTES", + "nameLocation": "789:28:2", + "nodeType": "VariableDeclaration", + "scope": 564, + "src": "764:66:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 275, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "764:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "value": { + "hexValue": "30783230633133623062", + "id": 276, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "820:10:2", + "typeDescriptions": { + "typeIdentifier": "t_rational_549534475_by_1", + "typeString": "int_const 549534475" + }, + "value": "0x20c13b0b" + }, + "visibility": "internal" + }, + { + "constant": true, + "id": 280, + "mutability": "constant", + "name": "SELECTOR_ERC1271_BYTES32_BYTES", + "nameLocation": "859:30:2", + "nodeType": "VariableDeclaration", + "scope": 564, + "src": "834:68:2", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 278, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "834:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "value": { + "hexValue": "30783136323662613765", + "id": 279, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "892:10:2", + "typeDescriptions": { + "typeIdentifier": "t_rational_371636862_by_1", + "typeString": "int_const 371636862" + }, + "value": "0x1626ba7e" + }, + "visibility": "internal" + }, + { + "baseFunctions": [ + 1225 + ], + "body": { + "id": 412, + "nodeType": "Block", + "src": "1913:1248:2", + "statements": [ + { + "assignments": [ + 300 + ], + "declarations": [ + { + "constant": false, + "id": 300, + "mutability": "mutable", + "name": "signatureType", + "nameLocation": "1926:13:2", + "nodeType": "VariableDeclaration", + "scope": 412, + "src": "1919:20:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 299, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "1919:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "visibility": "internal" + } + ], + "id": 304, + "initialValue": { + "baseExpression": { + "id": 301, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 285, + "src": "1942:10:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 303, + "indexExpression": { + "hexValue": "30", + "id": 302, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1953:1:2", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "1942:13:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1919:36:2" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 307, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 305, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 300, + "src": "1966:13:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 306, + "name": "LEGACY_TYPE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 265, + "src": "1983:11:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "src": "1966:28:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 335, + "nodeType": "IfStatement", + "src": "1962:303:2", + "trueBody": { + "id": 334, + "nodeType": "Block", + "src": "1996:269:2", + "statements": [ + { + "expression": { + "id": 313, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 308, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2045:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 311, + "name": "_digest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 283, + "src": "2083:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 309, + "name": "SequenceBaseSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2021, + "src": "2057:15:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceBaseSig_$2021_$", + "typeString": "type(library SequenceBaseSig)" + } + }, + "id": 310, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2073:9:2", + "memberName": "subdigest", + "nodeType": "MemberAccess", + "referencedDeclaration": 1394, + "src": "2057:25:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + "id": 312, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2057:34:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "2045:46:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 314, + "nodeType": "ExpressionStatement", + "src": "2045:46:2" + }, + { + "expression": { + "id": 325, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 315, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 289, + "src": "2100:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 316, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 291, + "src": "2111:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 317, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 293, + "src": "2119:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 318, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 297, + "src": "2130:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 319, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "2099:42:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 322, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2168:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 323, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 285, + "src": "2179:10:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 320, + "name": "SequenceBaseSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2021, + "src": "2144:15:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceBaseSig_$2021_$", + "typeString": "type(library SequenceBaseSig)" + } + }, + "id": 321, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2160:7:2", + "memberName": "recover", + "nodeType": "MemberAccess", + "referencedDeclaration": 2020, + "src": "2144:23:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,uint256,bytes32,uint256)" + } + }, + "id": 324, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2144:46:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,uint256)" + } + }, + "src": "2099:91:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 326, + "nodeType": "ExpressionStatement", + "src": "2099:91:2" + }, + { + "expression": { + "components": [ + { + "id": 327, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 289, + "src": "2206:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 328, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 291, + "src": "2217:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 329, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 293, + "src": "2225:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 330, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2236:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 331, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 297, + "src": "2247:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 332, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2205:53:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "functionReturnParameters": 298, + "id": 333, + "nodeType": "Return", + "src": "2198:60:2" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 338, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 336, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 300, + "src": "2275:13:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 337, + "name": "DYNAMIC_TYPE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 268, + "src": "2292:12:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "src": "2275:29:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 366, + "nodeType": "IfStatement", + "src": "2271:310:2", + "trueBody": { + "id": 365, + "nodeType": "Block", + "src": "2306:275:2", + "statements": [ + { + "expression": { + "id": 344, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 339, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2358:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 342, + "name": "_digest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 283, + "src": "2396:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 340, + "name": "SequenceBaseSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2021, + "src": "2370:15:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceBaseSig_$2021_$", + "typeString": "type(library SequenceBaseSig)" + } + }, + "id": 341, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2386:9:2", + "memberName": "subdigest", + "nodeType": "MemberAccess", + "referencedDeclaration": 1394, + "src": "2370:25:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + "id": 343, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2370:34:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "2358:46:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 345, + "nodeType": "ExpressionStatement", + "src": "2358:46:2" + }, + { + "expression": { + "id": 356, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 346, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 289, + "src": "2413:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 347, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 291, + "src": "2424:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 348, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 293, + "src": "2432:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 349, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 297, + "src": "2443:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 350, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "2412:42:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 353, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2484:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 354, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 285, + "src": "2495:10:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 351, + "name": "SequenceDynamicSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2247, + "src": "2457:18:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceDynamicSig_$2247_$", + "typeString": "type(library SequenceDynamicSig)" + } + }, + "id": 352, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2476:7:2", + "memberName": "recover", + "nodeType": "MemberAccess", + "referencedDeclaration": 2246, + "src": "2457:26:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,uint256,bytes32,uint256)" + } + }, + "id": 355, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2457:49:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,uint256)" + } + }, + "src": "2412:94:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 357, + "nodeType": "ExpressionStatement", + "src": "2412:94:2" + }, + { + "expression": { + "components": [ + { + "id": 358, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 289, + "src": "2522:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 359, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 291, + "src": "2533:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 360, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 293, + "src": "2541:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 361, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2552:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 362, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 297, + "src": "2563:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 363, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2521:53:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "functionReturnParameters": 298, + "id": 364, + "nodeType": "Return", + "src": "2514:60:2" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 369, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 367, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 300, + "src": "2591:13:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 368, + "name": "NO_CHAIN_ID_TYPE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 271, + "src": "2608:16:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "src": "2591:33:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 397, + "nodeType": "IfStatement", + "src": "2587:319:2", + "trueBody": { + "id": 396, + "nodeType": "Block", + "src": "2626:280:2", + "statements": [ + { + "expression": { + "id": 375, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 370, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2678:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 373, + "name": "_digest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 283, + "src": "2721:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 371, + "name": "SequenceNoChainIdSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2275, + "src": "2690:20:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceNoChainIdSig_$2275_$", + "typeString": "type(library SequenceNoChainIdSig)" + } + }, + "id": 372, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2711:9:2", + "memberName": "subdigest", + "nodeType": "MemberAccess", + "referencedDeclaration": 2274, + "src": "2690:30:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + "id": 374, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2690:39:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "2678:51:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 376, + "nodeType": "ExpressionStatement", + "src": "2678:51:2" + }, + { + "expression": { + "id": 387, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 377, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 289, + "src": "2738:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 378, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 291, + "src": "2749:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 379, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 293, + "src": "2757:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 380, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 297, + "src": "2768:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 381, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "2737:42:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 384, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2809:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 385, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 285, + "src": "2820:10:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 382, + "name": "SequenceDynamicSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2247, + "src": "2782:18:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceDynamicSig_$2247_$", + "typeString": "type(library SequenceDynamicSig)" + } + }, + "id": 383, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2801:7:2", + "memberName": "recover", + "nodeType": "MemberAccess", + "referencedDeclaration": 2246, + "src": "2782:26:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,uint256,bytes32,uint256)" + } + }, + "id": 386, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2782:49:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,uint256)" + } + }, + "src": "2737:94:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 388, + "nodeType": "ExpressionStatement", + "src": "2737:94:2" + }, + { + "expression": { + "components": [ + { + "id": 389, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 289, + "src": "2847:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 390, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 291, + "src": "2858:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 391, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 293, + "src": "2866:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 392, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 295, + "src": "2877:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 393, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 297, + "src": "2888:10:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 394, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2846:53:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "functionReturnParameters": 298, + "id": 395, + "nodeType": "Return", + "src": "2839:60:2" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "id": 400, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 398, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 300, + "src": "2916:13:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 399, + "name": "CHAINED_TYPE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 274, + "src": "2933:12:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "src": "2916:29:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 407, + "nodeType": "IfStatement", + "src": "2912:196:2", + "trueBody": { + "id": 406, + "nodeType": "Block", + "src": "2947:161:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 402, + "name": "_digest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 283, + "src": "3081:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 403, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 285, + "src": "3090:10:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 401, + "name": "chainedRecover", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2217, + "src": "3066:14:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "id": 404, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3066:35:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "functionReturnParameters": 298, + "id": 405, + "nodeType": "Return", + "src": "3059:42:2" + } + ] + } + }, + { + "errorCall": { + "arguments": [ + { + "id": 409, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 300, + "src": "3142:13:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + ], + "id": 408, + "name": "InvalidSignatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1197, + "src": "3121:20:2", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes1_$returns$__$", + "typeString": "function (bytes1) pure" + } + }, + "id": 410, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3121:35:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 411, + "nodeType": "RevertStatement", + "src": "3114:42:2" + } + ] + }, + "documentation": { + "id": 281, + "nodeType": "StructuredDocumentation", + "src": "907:765:2", + "text": " @notice Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature.\n @dev The signature must be prefixed with a type byte, which is used to determine the recovery method.\n @param _digest Digest of the signed data.\n @param _signature A Sequence signature.\n @return threshold The required number of signatures needed to consider the signature valid.\n @return weight The actual number of signatures collected in the signature.\n @return imageHash The imageHash of the configuration that signed the message.\n @return subdigest A modified version of the original digest, unique for each wallet/network.\n @return checkpoint A nonce that is incremented every time a new configuration is set." + }, + "functionSelector": "853c5068", + "id": 413, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "signatureRecovery", + "nameLocation": "1684:17:2", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 287, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "1765:8:2" + }, + "parameters": { + "id": 286, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 283, + "mutability": "mutable", + "name": "_digest", + "nameLocation": "1715:7:2", + "nodeType": "VariableDeclaration", + "scope": 413, + "src": "1707:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 282, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1707:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 285, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "1743:10:2", + "nodeType": "VariableDeclaration", + "scope": 413, + "src": "1728:25:2", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 284, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1728:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1701:56:2" + }, + "returnParameters": { + "id": 298, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 289, + "mutability": "mutable", + "name": "threshold", + "nameLocation": "1809:9:2", + "nodeType": "VariableDeclaration", + "scope": 413, + "src": "1801:17:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 288, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1801:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 291, + "mutability": "mutable", + "name": "weight", + "nameLocation": "1832:6:2", + "nodeType": "VariableDeclaration", + "scope": 413, + "src": "1824:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 290, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1824:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 293, + "mutability": "mutable", + "name": "imageHash", + "nameLocation": "1852:9:2", + "nodeType": "VariableDeclaration", + "scope": 413, + "src": "1844:17:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 292, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1844:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 295, + "mutability": "mutable", + "name": "subdigest", + "nameLocation": "1875:9:2", + "nodeType": "VariableDeclaration", + "scope": 413, + "src": "1867:17:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 294, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1867:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 297, + "mutability": "mutable", + "name": "checkpoint", + "nameLocation": "1898:10:2", + "nodeType": "VariableDeclaration", + "scope": 413, + "src": "1890:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 296, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1890:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1795:117:2" + }, + "scope": 564, + "src": "1675:1486:2", + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "baseFunctions": [ + 1208 + ], + "body": { + "id": 456, + "nodeType": "Block", + "src": "3651:215:2", + "statements": [ + { + "assignments": [ + 427 + ], + "declarations": [ + { + "constant": false, + "id": 427, + "mutability": "mutable", + "name": "threshold", + "nameLocation": "3665:9:2", + "nodeType": "VariableDeclaration", + "scope": 456, + "src": "3657:17:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 426, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3657:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 428, + "nodeType": "VariableDeclarationStatement", + "src": "3657:17:2" + }, + { + "assignments": [ + 430 + ], + "declarations": [ + { + "constant": false, + "id": 430, + "mutability": "mutable", + "name": "weight", + "nameLocation": "3684:6:2", + "nodeType": "VariableDeclaration", + "scope": 456, + "src": "3676:14:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 429, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3676:7:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 431, + "nodeType": "VariableDeclarationStatement", + "src": "3676:14:2" + }, + { + "assignments": [ + 433 + ], + "declarations": [ + { + "constant": false, + "id": 433, + "mutability": "mutable", + "name": "imageHash", + "nameLocation": "3700:9:2", + "nodeType": "VariableDeclaration", + "scope": 456, + "src": "3692:17:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 432, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3692:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 434, + "nodeType": "VariableDeclarationStatement", + "src": "3692:17:2" + }, + { + "expression": { + "id": 444, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 435, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 427, + "src": "3716:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 436, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 430, + "src": "3727:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 437, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 433, + "src": "3735:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 438, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 424, + "src": "3746:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + null + ], + "id": 439, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "3715:42:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$__$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 441, + "name": "_digest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 416, + "src": "3778:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 442, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 418, + "src": "3787:10:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 440, + "name": "signatureRecovery", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 413 + ], + "referencedDeclaration": 413, + "src": "3760:17:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "id": 443, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3760:38:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "src": "3715:83:2", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 445, + "nodeType": "ExpressionStatement", + "src": "3715:83:2" + }, + { + "expression": { + "id": 454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 446, + "name": "isValid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 422, + "src": "3804:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 453, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 449, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 447, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 430, + "src": "3814:6:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 448, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 427, + "src": "3824:9:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3814:19:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "arguments": [ + { + "id": 451, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 433, + "src": "3851:9:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 450, + "name": "_isValidImage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1236, + "src": "3837:13:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bool_$", + "typeString": "function (bytes32) view returns (bool)" + } + }, + "id": 452, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3837:24:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3814:47:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3804:57:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 455, + "nodeType": "ExpressionStatement", + "src": "3804:57:2" + } + ] + }, + "documentation": { + "id": 414, + "nodeType": "StructuredDocumentation", + "src": "3165:312:2", + "text": " @dev Validates a signature.\n @param _digest Digest of the signed data.\n @param _signature A Sequence signature.\n @return isValid Indicates whether the signature is valid or not.\n @return subdigest A modified version of the original digest, unique for each wallet/network." + }, + "id": 457, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_signatureValidation", + "nameLocation": "3489:20:2", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 420, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "3575:8:2" + }, + "parameters": { + "id": 419, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 416, + "mutability": "mutable", + "name": "_digest", + "nameLocation": "3523:7:2", + "nodeType": "VariableDeclaration", + "scope": 457, + "src": "3515:15:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 415, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3515:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 418, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "3551:10:2", + "nodeType": "VariableDeclaration", + "scope": 457, + "src": "3536:25:2", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 417, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3536:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3509:56:2" + }, + "returnParameters": { + "id": 425, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 422, + "mutability": "mutable", + "name": "isValid", + "nameLocation": "3616:7:2", + "nodeType": "VariableDeclaration", + "scope": 457, + "src": "3611:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 421, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3611:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 424, + "mutability": "mutable", + "name": "subdigest", + "nameLocation": "3637:9:2", + "nodeType": "VariableDeclaration", + "scope": 457, + "src": "3629:17:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 423, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3629:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3605:45:2" + }, + "scope": 564, + "src": "3480:386:2", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "baseFunctions": [ + 11 + ], + "body": { + "id": 487, + "nodeType": "Block", + "src": "4659:198:2", + "statements": [ + { + "assignments": [ + 469, + null + ], + "declarations": [ + { + "constant": false, + "id": 469, + "mutability": "mutable", + "name": "isValid", + "nameLocation": "4698:7:2", + "nodeType": "VariableDeclaration", + "scope": 487, + "src": "4693:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 468, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4693:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + null + ], + "id": 476, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 472, + "name": "_data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 460, + "src": "4741:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 471, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "4731:9:2", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 473, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4731:16:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 474, + "name": "_signatures", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 462, + "src": "4749:11:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 470, + "name": "_signatureValidation", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 457 + ], + "referencedDeclaration": 457, + "src": "4710:20:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_bool_$_t_bytes32_$", + "typeString": "function (bytes32,bytes calldata) view returns (bool,bytes32)" + } + }, + "id": 475, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4710:51:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes32_$", + "typeString": "tuple(bool,bytes32)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4692:69:2" + }, + { + "condition": { + "id": 477, + "name": "isValid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 469, + "src": "4771:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 481, + "nodeType": "IfStatement", + "src": "4767:63:2", + "trueBody": { + "id": 480, + "nodeType": "Block", + "src": "4780:50:2", + "statements": [ + { + "expression": { + "id": 478, + "name": "SELECTOR_ERC1271_BYTES_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 277, + "src": "4795:28:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "functionReturnParameters": 467, + "id": 479, + "nodeType": "Return", + "src": "4788:35:2" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "hexValue": "30", + "id": 484, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4850:1:2", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 483, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4843:6:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes4_$", + "typeString": "type(bytes4)" + }, + "typeName": { + "id": 482, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "4843:6:2", + "typeDescriptions": {} + } + }, + "id": 485, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4843:9:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "functionReturnParameters": 467, + "id": 486, + "nodeType": "Return", + "src": "4836:16:2" + } + ] + }, + "documentation": { + "id": 458, + "nodeType": "StructuredDocumentation", + "src": "3870:652:2", + "text": " @notice Verifies whether the provided signature is valid with respect to the provided data\n @dev MUST return the correct magic value if the signature provided is valid for the provided data\n > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256(\"isValidSignature(bytes,bytes)\"))\n @param _data Arbitrary length data signed on the behalf of address(this)\n @param _signatures Signature byte array associated with _data.\n Encoded as abi.encode(Signature[], Configs)\n @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise" + }, + "functionSelector": "20c13b0b", + "id": 488, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isValidSignature", + "nameLocation": "4534:16:2", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 464, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "4620:8:2" + }, + "parameters": { + "id": 463, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 460, + "mutability": "mutable", + "name": "_data", + "nameLocation": "4571:5:2", + "nodeType": "VariableDeclaration", + "scope": 488, + "src": "4556:20:2", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 459, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4556:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 462, + "mutability": "mutable", + "name": "_signatures", + "nameLocation": "4597:11:2", + "nodeType": "VariableDeclaration", + "scope": 488, + "src": "4582:26:2", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 461, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4582:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4550:62:2" + }, + "returnParameters": { + "id": 467, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 466, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 488, + "src": "4651:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 465, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "4651:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "4650:8:2" + }, + "scope": 564, + "src": "4525:332:2", + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "baseFunctions": [ + 21 + ], + "body": { + "id": 516, + "nodeType": "Block", + "src": "5616:189:2", + "statements": [ + { + "assignments": [ + 500, + null + ], + "declarations": [ + { + "constant": false, + "id": 500, + "mutability": "mutable", + "name": "isValid", + "nameLocation": "5655:7:2", + "nodeType": "VariableDeclaration", + "scope": 516, + "src": "5650:12:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 499, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "5650:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + null + ], + "id": 505, + "initialValue": { + "arguments": [ + { + "id": 502, + "name": "_hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 491, + "src": "5688:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 503, + "name": "_signatures", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 493, + "src": "5695:11:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 501, + "name": "_signatureValidation", + "nodeType": "Identifier", + "overloadedDeclarations": [ + 457 + ], + "referencedDeclaration": 457, + "src": "5667:20:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_bool_$_t_bytes32_$", + "typeString": "function (bytes32,bytes calldata) view returns (bool,bytes32)" + } + }, + "id": 504, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5667:40:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes32_$", + "typeString": "tuple(bool,bytes32)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5649:58:2" + }, + { + "condition": { + "id": 506, + "name": "isValid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 500, + "src": "5717:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 510, + "nodeType": "IfStatement", + "src": "5713:65:2", + "trueBody": { + "id": 509, + "nodeType": "Block", + "src": "5726:52:2", + "statements": [ + { + "expression": { + "id": 507, + "name": "SELECTOR_ERC1271_BYTES32_BYTES", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 280, + "src": "5741:30:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "functionReturnParameters": 498, + "id": 508, + "nodeType": "Return", + "src": "5734:37:2" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "hexValue": "30", + "id": 513, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5798:1:2", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 512, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5791:6:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes4_$", + "typeString": "type(bytes4)" + }, + "typeName": { + "id": 511, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "5791:6:2", + "typeDescriptions": {} + } + }, + "id": 514, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5791:9:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "functionReturnParameters": 498, + "id": 515, + "nodeType": "Return", + "src": "5784:16:2" + } + ] + }, + "documentation": { + "id": 489, + "nodeType": "StructuredDocumentation", + "src": "4861:625:2", + "text": " @notice Verifies whether the provided signature is valid with respect to the provided hash\n @dev MUST return the correct magic value if the signature provided is valid for the provided hash\n > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256(\"isValidSignature(bytes32,bytes)\"))\n @param _hash keccak256 hash that was signed\n @param _signatures Signature byte array associated with _data.\n Encoded as abi.encode(Signature[], Configs)\n @return magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise" + }, + "functionSelector": "1626ba7e", + "id": 517, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isValidSignature", + "nameLocation": "5498:16:2", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 495, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "5577:8:2" + }, + "parameters": { + "id": 494, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 491, + "mutability": "mutable", + "name": "_hash", + "nameLocation": "5528:5:2", + "nodeType": "VariableDeclaration", + "scope": 517, + "src": "5520:13:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 490, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5520:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 493, + "mutability": "mutable", + "name": "_signatures", + "nameLocation": "5554:11:2", + "nodeType": "VariableDeclaration", + "scope": 517, + "src": "5539:26:2", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 492, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "5539:5:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "5514:55:2" + }, + "returnParameters": { + "id": 498, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 497, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 517, + "src": "5608:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 496, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "5608:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "5607:8:2" + }, + "scope": 564, + "src": "5489:316:2", + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "baseFunctions": [ + 919 + ], + "body": { + "id": 548, + "nodeType": "Block", + "src": "6107:208:2", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 538, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "id": 531, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 526, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 520, + "src": "6124:12:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 528, + "name": "IModuleAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1249, + "src": "6145:11:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IModuleAuth_$1249_$", + "typeString": "type(contract IModuleAuth)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_contract$_IModuleAuth_$1249_$", + "typeString": "type(contract IModuleAuth)" + } + ], + "id": 527, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967269, + "src": "6140:4:2", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 529, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6140:17:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_contract$_IModuleAuth_$1249", + "typeString": "type(contract IModuleAuth)" + } + }, + "id": 530, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6158:11:2", + "memberName": "interfaceId", + "nodeType": "MemberAccess", + "src": "6140:29:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "src": "6124:45:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "id": 537, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 532, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 520, + "src": "6179:12:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 534, + "name": "IERC1271Wallet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "6200:14:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IERC1271Wallet_$22_$", + "typeString": "type(contract IERC1271Wallet)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_contract$_IERC1271Wallet_$22_$", + "typeString": "type(contract IERC1271Wallet)" + } + ], + "id": 533, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967269, + "src": "6195:4:2", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 535, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6195:20:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_contract$_IERC1271Wallet_$22", + "typeString": "type(contract IERC1271Wallet)" + } + }, + "id": 536, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "6216:11:2", + "memberName": "interfaceId", + "nodeType": "MemberAccess", + "src": "6195:32:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "src": "6179:48:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "6124:103:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 542, + "nodeType": "IfStatement", + "src": "6113:147:2", + "trueBody": { + "id": 541, + "nodeType": "Block", + "src": "6234:26:2", + "statements": [ + { + "expression": { + "hexValue": "74727565", + "id": 539, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6249:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 525, + "id": 540, + "nodeType": "Return", + "src": "6242:11:2" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 545, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 520, + "src": "6297:12:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + ], + "expression": { + "id": 543, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967271, + "src": "6273:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_super$_ModuleAuth_$564_$", + "typeString": "type(contract super ModuleAuth)" + } + }, + "id": 544, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6279:17:2", + "memberName": "supportsInterface", + "nodeType": "MemberAccess", + "referencedDeclaration": 919, + "src": "6273:23:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes4_$returns$_t_bool_$", + "typeString": "function (bytes4) pure returns (bool)" + } + }, + "id": 546, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6273:37:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 525, + "id": 547, + "nodeType": "Return", + "src": "6266:44:2" + } + ] + }, + "documentation": { + "id": 518, + "nodeType": "StructuredDocumentation", + "src": "5809:203:2", + "text": " @notice Query if a contract implements an interface\n @param _interfaceID The interface identifier, as specified in ERC-165\n @return `true` if the contract implements `_interfaceID`" + }, + "functionSelector": "01ffc9a7", + "id": 549, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "supportsInterface", + "nameLocation": "6024:17:2", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 522, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "6070:8:2" + }, + "parameters": { + "id": 521, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 520, + "mutability": "mutable", + "name": "_interfaceID", + "nameLocation": "6049:12:2", + "nodeType": "VariableDeclaration", + "scope": 549, + "src": "6042:19:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 519, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "6042:6:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "6041:21:2" + }, + "returnParameters": { + "id": 525, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 524, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 549, + "src": "6101:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 523, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "6101:4:2", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "6100:6:2" + }, + "scope": 564, + "src": "6015:300:2", + "stateMutability": "pure", + "virtual": true, + "visibility": "public" + }, + { + "baseFunctions": [ + 1242 + ], + "body": { + "id": 562, + "nodeType": "Block", + "src": "6536:39:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 559, + "name": "_imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 552, + "src": "6559:10:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 558, + "name": "_updateImageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1248, + "src": "6542:16:2", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$returns$__$", + "typeString": "function (bytes32)" + } + }, + "id": 560, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6542:28:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 561, + "nodeType": "ExpressionStatement", + "src": "6542:28:2" + } + ] + }, + "documentation": { + "id": 550, + "nodeType": "StructuredDocumentation", + "src": "6319:134:2", + "text": " @notice Updates the signers configuration of the wallet\n @param _imageHash New required image hash of the signature" + }, + "functionSelector": "29561426", + "id": 563, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 556, + "kind": "modifierInvocation", + "modifierName": { + "id": 555, + "name": "onlySelf", + "nameLocations": [ + "6527:8:2" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1115, + "src": "6527:8:2" + }, + "nodeType": "ModifierInvocation", + "src": "6527:8:2" + } + ], + "name": "updateImageHash", + "nameLocation": "6465:15:2", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 554, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "6510:8:2" + }, + "parameters": { + "id": 553, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 552, + "mutability": "mutable", + "name": "_imageHash", + "nameLocation": "6489:10:2", + "nodeType": "VariableDeclaration", + "scope": 563, + "src": "6481:18:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 551, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6481:7:2", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "6480:20:2" + }, + "returnParameters": { + "id": 557, + "nodeType": "ParameterList", + "parameters": [], + "src": "6536:0:2" + }, + "scope": 564, + "src": "6456:119:2", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "external" + } + ], + "scope": 565, + "src": "421:6156:2", + "usedErrors": [ + 1093, + 1193, + 1197, + 1367, + 1371, + 2050, + 2056, + 2539, + 2541, + 2547, + 2553, + 2561, + 2565 + ] + } + ], + "src": "39:6539:2" + }, + "id": 2 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCalls.sol", + "exportedSymbols": { + "IERC1271Wallet": [ + 22 + ], + "IModuleAuth": [ + 1249 + ], + "IModuleCalls": [ + 1313 + ], + "LibBytes": [ + 2374 + ], + "LibBytesPointer": [ + 2476 + ], + "LibOptim": [ + 2530 + ], + "ModuleCalls": [ + 833 + ], + "ModuleERC165": [ + 920 + ], + "ModuleNonce": [ + 1051 + ], + "ModuleOnlyDelegatecall": [ + 1085 + ], + "ModuleSelfAuth": [ + 1116 + ], + "ModuleStorage": [ + 1179 + ], + "SequenceBaseSig": [ + 2021 + ], + "SignatureValidator": [ + 2798 + ], + "SubModuleNonce": [ + 2324 + ] + }, + "id": 834, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 566, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:3" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "file": "./ModuleSelfAuth.sol", + "id": 567, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 1117, + "src": "64:30:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "file": "./ModuleStorage.sol", + "id": 568, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 1180, + "src": "95:29:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "file": "./ModuleERC165.sol", + "id": 569, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 921, + "src": "125:28:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "file": "./ModuleNonce.sol", + "id": 570, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 1052, + "src": "154:27:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "file": "./ModuleOnlyDelegatecall.sol", + "id": 571, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 1086, + "src": "182:38:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "file": "./interfaces/IModuleCalls.sol", + "id": 572, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 1314, + "src": "222:39:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "file": "./interfaces/IModuleAuth.sol", + "id": 573, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 1250, + "src": "262:38:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "file": "./submodules/nonce/SubModuleNonce.sol", + "id": 574, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 2325, + "src": "302:47:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "file": "./submodules/auth/SequenceBaseSig.sol", + "id": 575, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 2022, + "src": "350:47:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "file": "../../utils/LibOptim.sol", + "id": 576, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 834, + "sourceUnit": 2531, + "src": "399:34:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 577, + "name": "IModuleCalls", + "nameLocations": [ + "469:12:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1313, + "src": "469:12:3" + }, + "id": 578, + "nodeType": "InheritanceSpecifier", + "src": "469:12:3" + }, + { + "baseName": { + "id": 579, + "name": "IModuleAuth", + "nameLocations": [ + "483:11:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1249, + "src": "483:11:3" + }, + "id": 580, + "nodeType": "InheritanceSpecifier", + "src": "483:11:3" + }, + { + "baseName": { + "id": 581, + "name": "ModuleERC165", + "nameLocations": [ + "496:12:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 920, + "src": "496:12:3" + }, + "id": 582, + "nodeType": "InheritanceSpecifier", + "src": "496:12:3" + }, + { + "baseName": { + "id": 583, + "name": "ModuleOnlyDelegatecall", + "nameLocations": [ + "510:22:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1085, + "src": "510:22:3" + }, + "id": 584, + "nodeType": "InheritanceSpecifier", + "src": "510:22:3" + }, + { + "baseName": { + "id": 585, + "name": "ModuleSelfAuth", + "nameLocations": [ + "534:14:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1116, + "src": "534:14:3" + }, + "id": 586, + "nodeType": "InheritanceSpecifier", + "src": "534:14:3" + }, + { + "baseName": { + "id": 587, + "name": "ModuleNonce", + "nameLocations": [ + "550:11:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1051, + "src": "550:11:3" + }, + "id": 588, + "nodeType": "InheritanceSpecifier", + "src": "550:11:3" + } + ], + "canonicalName": "ModuleCalls", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": false, + "id": 833, + "linearizedBaseContracts": [ + 833, + 1051, + 1116, + 1085, + 920, + 1249, + 1313 + ], + "name": "ModuleCalls", + "nameLocation": "454:11:3", + "nodeType": "ContractDefinition", + "nodes": [ + { + "baseFunctions": [ + 1304 + ], + "body": { + "id": 636, + "nodeType": "Block", + "src": "1142:420:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 604, + "name": "_nonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 595, + "src": "1196:6:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 603, + "name": "_validateNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1050, + "src": "1181:14:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 605, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1181:22:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 606, + "nodeType": "ExpressionStatement", + "src": "1181:22:3" + }, + { + "assignments": [ + 608, + 610 + ], + "declarations": [ + { + "constant": false, + "id": 608, + "mutability": "mutable", + "name": "isValid", + "nameLocation": "1258:7:3", + "nodeType": "VariableDeclaration", + "scope": 636, + "src": "1253:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 607, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1253:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 610, + "mutability": "mutable", + "name": "txHash", + "nameLocation": "1275:6:3", + "nodeType": "VariableDeclaration", + "scope": 636, + "src": "1267:14:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 609, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1267:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 621, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "id": 615, + "name": "_nonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 595, + "src": "1354:6:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 616, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 593, + "src": "1372:4:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + ], + "expression": { + "id": 613, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "1332:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 614, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1336:6:3", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "1332:10:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1332:54:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 612, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "1313:9:3", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 618, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1313:81:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 619, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 597, + "src": "1402:10:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 611, + "name": "_signatureValidation", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1208, + "src": "1285:20:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_bool_$_t_bytes32_$", + "typeString": "function (bytes32,bytes calldata) view returns (bool,bytes32)" + } + }, + "id": 620, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1285:133:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes32_$", + "typeString": "tuple(bool,bytes32)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1252:166:3" + }, + { + "condition": { + "id": 623, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "1429:8:3", + "subExpression": { + "id": 622, + "name": "isValid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 608, + "src": "1430:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 630, + "nodeType": "IfStatement", + "src": "1425:72:3", + "trueBody": { + "id": 629, + "nodeType": "Block", + "src": "1439:58:3", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 625, + "name": "txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 610, + "src": "1471:6:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 626, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 597, + "src": "1479:10:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 624, + "name": "InvalidSignature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1279, + "src": "1454:16:3", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes32,bytes memory) pure" + } + }, + "id": 627, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1454:36:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 628, + "nodeType": "RevertStatement", + "src": "1447:43:3" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 632, + "name": "txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 610, + "src": "1544:6:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 633, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 593, + "src": "1552:4:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + ], + "id": 631, + "name": "_execute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 783, + "src": "1535:8:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr_$returns$__$", + "typeString": "function (bytes32,struct IModuleCalls.Transaction calldata[] calldata)" + } + }, + "id": 634, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1535:22:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 635, + "nodeType": "ExpressionStatement", + "src": "1535:22:3" + } + ] + }, + "documentation": { + "id": 589, + "nodeType": "StructuredDocumentation", + "src": "566:425:3", + "text": " @notice Allow wallet owner to execute an action\n @dev Relayers must ensure that the gasLimit specified for each transaction\n is acceptable to them. A user could specify large enough that it could\n consume all the gas available.\n @param _txs Transactions to process\n @param _nonce Signature nonce (may contain an encoded space)\n @param _signature Encoded signature" + }, + "functionSelector": "7a9a1628", + "id": 637, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 601, + "kind": "modifierInvocation", + "modifierName": { + "id": 600, + "name": "onlyDelegatecall", + "nameLocations": [ + "1125:16:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1084, + "src": "1125:16:3" + }, + "nodeType": "ModifierInvocation", + "src": "1125:16:3" + } + ], + "name": "execute", + "nameLocation": "1003:7:3", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 599, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "1108:8:3" + }, + "parameters": { + "id": 598, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 593, + "mutability": "mutable", + "name": "_txs", + "nameLocation": "1039:4:3", + "nodeType": "VariableDeclaration", + "scope": 637, + "src": "1016:27:3", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + }, + "typeName": { + "baseType": { + "id": 591, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 590, + "name": "Transaction", + "nameLocations": [ + "1016:11:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "1016:11:3" + }, + "referencedDeclaration": 1292, + "src": "1016:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "id": 592, + "nodeType": "ArrayTypeName", + "src": "1016:13:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_storage_$dyn_storage_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 595, + "mutability": "mutable", + "name": "_nonce", + "nameLocation": "1057:6:3", + "nodeType": "VariableDeclaration", + "scope": 637, + "src": "1049:14:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 594, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1049:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 597, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "1084:10:3", + "nodeType": "VariableDeclaration", + "scope": 637, + "src": "1069:25:3", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 596, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1069:5:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1010:88:3" + }, + "returnParameters": { + "id": 602, + "nodeType": "ParameterList", + "parameters": [], + "src": "1142:0:3" + }, + "scope": 833, + "src": "994:568:3", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "external" + }, + { + "baseFunctions": [ + 1312 + ], + "body": { + "id": 666, + "nodeType": "Block", + "src": "1795:211:3", + "statements": [ + { + "assignments": [ + 649 + ], + "declarations": [ + { + "constant": false, + "id": 649, + "mutability": "mutable", + "name": "txHash", + "nameLocation": "1840:6:3", + "nodeType": "VariableDeclaration", + "scope": 666, + "src": "1832:14:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 648, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1832:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 660, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "hexValue": "73656c663a", + "id": 655, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1912:7:3", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845", + "typeString": "literal_string \"self:\"" + }, + "value": "self:" + }, + { + "id": 656, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 642, + "src": "1921:4:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_bf9461da9f9c0123d3a54c61147a274d8fdb5d5c1e488665fb11b9edbbc32845", + "typeString": "literal_string \"self:\"" + }, + { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + ], + "expression": { + "id": 653, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "1901:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 654, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1905:6:3", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "1901:10:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1901:25:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 652, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "1882:9:3", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 658, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1882:52:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 650, + "name": "SequenceBaseSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2021, + "src": "1849:15:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceBaseSig_$2021_$", + "typeString": "type(library SequenceBaseSig)" + } + }, + "id": 651, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1865:9:3", + "memberName": "subdigest", + "nodeType": "MemberAccess", + "referencedDeclaration": 1394, + "src": "1849:25:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) view returns (bytes32)" + } + }, + "id": 659, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1849:91:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1832:108:3" + }, + { + "expression": { + "arguments": [ + { + "id": 662, + "name": "txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 649, + "src": "1988:6:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 663, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 642, + "src": "1996:4:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + ], + "id": 661, + "name": "_execute", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 783, + "src": "1979:8:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr_$returns$__$", + "typeString": "function (bytes32,struct IModuleCalls.Transaction calldata[] calldata)" + } + }, + "id": 664, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1979:22:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 665, + "nodeType": "ExpressionStatement", + "src": "1979:22:3" + } + ] + }, + "documentation": { + "id": 638, + "nodeType": "StructuredDocumentation", + "src": "1566:133:3", + "text": " @notice Allow wallet to execute an action\n without signing the message\n @param _txs Transactions to execute" + }, + "functionSelector": "61c2926c", + "id": 667, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 646, + "kind": "modifierInvocation", + "modifierName": { + "id": 645, + "name": "onlySelf", + "nameLocations": [ + "1786:8:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1115, + "src": "1786:8:3" + }, + "nodeType": "ModifierInvocation", + "src": "1786:8:3" + } + ], + "name": "selfExecute", + "nameLocation": "1711:11:3", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 644, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "1769:8:3" + }, + "parameters": { + "id": 643, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 642, + "mutability": "mutable", + "name": "_txs", + "nameLocation": "1751:4:3", + "nodeType": "VariableDeclaration", + "scope": 667, + "src": "1728:27:3", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + }, + "typeName": { + "baseType": { + "id": 640, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 639, + "name": "Transaction", + "nameLocations": [ + "1728:11:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "1728:11:3" + }, + "referencedDeclaration": 1292, + "src": "1728:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "id": 641, + "nodeType": "ArrayTypeName", + "src": "1728:13:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_storage_$dyn_storage_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + } + }, + "visibility": "internal" + } + ], + "src": "1722:37:3" + }, + "returnParameters": { + "id": 647, + "nodeType": "ParameterList", + "parameters": [], + "src": "1795:0:3" + }, + "scope": 833, + "src": "1702:304:3", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "external" + }, + { + "body": { + "id": 782, + "nodeType": "Block", + "src": "2248:1060:3", + "statements": [ + { + "id": 781, + "nodeType": "UncheckedBlock", + "src": "2254:1050:3", + "statements": [ + { + "assignments": [ + 678 + ], + "declarations": [ + { + "constant": false, + "id": 678, + "mutability": "mutable", + "name": "size", + "nameLocation": "2309:4:3", + "nodeType": "VariableDeclaration", + "scope": 781, + "src": "2301:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 677, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2301:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 681, + "initialValue": { + "expression": { + "id": 679, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 674, + "src": "2316:4:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + }, + "id": 680, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2321:6:3", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "2316:11:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2301:26:3" + }, + { + "body": { + "id": 779, + "nodeType": "Block", + "src": "2370:928:3", + "statements": [ + { + "assignments": [ + 694 + ], + "declarations": [ + { + "constant": false, + "id": 694, + "mutability": "mutable", + "name": "transaction", + "nameLocation": "2401:11:3", + "nodeType": "VariableDeclaration", + "scope": 779, + "src": "2380:32:3", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction" + }, + "typeName": { + "id": 693, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 692, + "name": "Transaction", + "nameLocations": [ + "2380:11:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "2380:11:3" + }, + "referencedDeclaration": 1292, + "src": "2380:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "visibility": "internal" + } + ], + "id": 698, + "initialValue": { + "baseExpression": { + "id": 695, + "name": "_txs", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 674, + "src": "2415:4:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata[] calldata" + } + }, + "id": 697, + "indexExpression": { + "id": 696, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 683, + "src": "2420:1:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2415:7:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2380:42:3" + }, + { + "assignments": [ + 700 + ], + "declarations": [ + { + "constant": false, + "id": 700, + "mutability": "mutable", + "name": "gasLimit", + "nameLocation": "2440:8:3", + "nodeType": "VariableDeclaration", + "scope": 779, + "src": "2432:16:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 699, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2432:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 703, + "initialValue": { + "expression": { + "id": 701, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 694, + "src": "2451:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 702, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2463:8:3", + "memberName": "gasLimit", + "nodeType": "MemberAccess", + "referencedDeclaration": 1285, + "src": "2451:20:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2432:39:3" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 704, + "name": "gasleft", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967289, + "src": "2486:7:3", + "typeDescriptions": { + "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 705, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2486:9:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 706, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 700, + "src": "2498:8:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2486:20:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 715, + "nodeType": "IfStatement", + "src": "2482:69:3", + "trueBody": { + "errorCall": { + "arguments": [ + { + "id": 709, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 683, + "src": "2528:1:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 710, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 700, + "src": "2531:8:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 711, + "name": "gasleft", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967289, + "src": "2541:7:3", + "typeDescriptions": { + "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 712, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2541:9:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 708, + "name": "NotEnoughGas", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1273, + "src": "2515:12:3", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256,uint256) pure" + } + }, + "id": 713, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2515:36:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 714, + "nodeType": "RevertStatement", + "src": "2508:43:3" + } + }, + { + "assignments": [ + 717 + ], + "declarations": [ + { + "constant": false, + "id": 717, + "mutability": "mutable", + "name": "success", + "nameLocation": "2567:7:3", + "nodeType": "VariableDeclaration", + "scope": 779, + "src": "2562:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 716, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2562:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "id": 718, + "nodeType": "VariableDeclarationStatement", + "src": "2562:12:3" + }, + { + "condition": { + "expression": { + "id": 719, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 694, + "src": "2588:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 720, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2600:12:3", + "memberName": "delegateCall", + "nodeType": "MemberAccess", + "referencedDeclaration": 1281, + "src": "2588:24:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 758, + "nodeType": "Block", + "src": "2798:201:3", + "statements": [ + { + "expression": { + "id": 756, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 739, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 717, + "src": "2810:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 742, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 694, + "src": "2847:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 743, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2859:6:3", + "memberName": "target", + "nodeType": "MemberAccess", + "referencedDeclaration": 1287, + "src": "2847:18:3", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "expression": { + "id": 744, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 694, + "src": "2879:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 745, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2891:5:3", + "memberName": "value", + "nodeType": "MemberAccess", + "referencedDeclaration": 1289, + "src": "2879:17:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 748, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 746, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 700, + "src": "2910:8:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 747, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2922:1:3", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2910:13:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 751, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 700, + "src": "2938:8:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 752, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "2910:36:3", + "trueExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 749, + "name": "gasleft", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967289, + "src": "2926:7:3", + "typeDescriptions": { + "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 750, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2926:9:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 753, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 694, + "src": "2960:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2972:4:3", + "memberName": "data", + "nodeType": "MemberAccess", + "referencedDeclaration": 1291, + "src": "2960:16:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 740, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "2820:8:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 741, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2829:4:3", + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": 2515, + "src": "2820:13:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bool_$", + "typeString": "function (address,uint256,uint256,bytes calldata) returns (bool)" + } + }, + "id": 755, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2820:168:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2810:178:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 757, + "nodeType": "ExpressionStatement", + "src": "2810:178:3" + } + ] + }, + "id": 759, + "nodeType": "IfStatement", + "src": "2584:415:3", + "trueBody": { + "id": 738, + "nodeType": "Block", + "src": "2614:178:3", + "statements": [ + { + "expression": { + "id": 736, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 721, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 717, + "src": "2626:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 724, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 694, + "src": "2671:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 725, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2683:6:3", + "memberName": "target", + "nodeType": "MemberAccess", + "referencedDeclaration": 1287, + "src": "2671:18:3", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 728, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 726, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 700, + "src": "2703:8:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 727, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2715:1:3", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2703:13:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 731, + "name": "gasLimit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 700, + "src": "2731:8:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "2703:36:3", + "trueExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 729, + "name": "gasleft", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967289, + "src": "2719:7:3", + "typeDescriptions": { + "typeIdentifier": "t_function_gasleft_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 730, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2719:9:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 733, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 694, + "src": "2753:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2765:4:3", + "memberName": "data", + "nodeType": "MemberAccess", + "referencedDeclaration": 1291, + "src": "2753:16:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 722, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "2636:8:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 723, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2645:12:3", + "memberName": "delegatecall", + "nodeType": "MemberAccess", + "referencedDeclaration": 2529, + "src": "2636:21:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_bytes_calldata_ptr_$returns$_t_bool_$", + "typeString": "function (address,uint256,bytes calldata) returns (bool)" + } + }, + "id": 735, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2636:145:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2626:155:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 737, + "nodeType": "ExpressionStatement", + "src": "2626:155:3" + } + ] + } + }, + { + "condition": { + "id": 760, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 717, + "src": "3013:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 777, + "nodeType": "Block", + "src": "3078:212:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "expression": { + "id": 768, + "name": "transaction", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 694, + "src": "3171:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction calldata" + } + }, + "id": 769, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3183:13:3", + "memberName": "revertOnError", + "nodeType": "MemberAccess", + "referencedDeclaration": 1283, + "src": "3171:25:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "id": 770, + "name": "_txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 670, + "src": "3210:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 771, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 683, + "src": "3231:1:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 772, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "3246:8:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3255:10:3", + "memberName": "returnData", + "nodeType": "MemberAccess", + "referencedDeclaration": 2499, + "src": "3246:19:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 774, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3246:21:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 767, + "name": "_revertBytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 807, + "src": "3145:12:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bool_$_t_bytes32_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bool,bytes32,uint256,bytes memory)" + } + }, + "id": 775, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3145:134:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 776, + "nodeType": "ExpressionStatement", + "src": "3145:134:3" + } + ] + }, + "id": 778, + "nodeType": "IfStatement", + "src": "3009:281:3", + "trueBody": { + "id": 766, + "nodeType": "Block", + "src": "3022:50:3", + "statements": [ + { + "eventCall": { + "arguments": [ + { + "id": 762, + "name": "_txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 670, + "src": "3050:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 763, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 683, + "src": "3059:1:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 761, + "name": "TxExecuted", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1265, + "src": "3039:10:3", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_uint256_$returns$__$", + "typeString": "function (bytes32,uint256)" + } + }, + "id": 764, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3039:22:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 765, + "nodeType": "EmitStatement", + "src": "3034:27:3" + } + ] + } + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 688, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 686, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 683, + "src": "2355:1:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 687, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 678, + "src": "2359:4:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2355:8:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 780, + "initializationExpression": { + "assignments": [ + 683 + ], + "declarations": [ + { + "constant": false, + "id": 683, + "mutability": "mutable", + "name": "i", + "nameLocation": "2348:1:3", + "nodeType": "VariableDeclaration", + "scope": 780, + "src": "2340:9:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 682, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2340:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 685, + "initialValue": { + "hexValue": "30", + "id": 684, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2352:1:3", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "2340:13:3" + }, + "loopExpression": { + "expression": { + "id": 690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": false, + "src": "2365:3:3", + "subExpression": { + "id": 689, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 683, + "src": "2365:1:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 691, + "nodeType": "ExpressionStatement", + "src": "2365:3:3" + }, + "nodeType": "ForStatement", + "src": "2335:963:3" + } + ] + } + ] + }, + "documentation": { + "id": 668, + "nodeType": "StructuredDocumentation", + "src": "2010:151:3", + "text": " @notice Executes a list of transactions\n @param _txHash Hash of the batch of transactions\n @param _txs Transactions to execute" + }, + "id": 783, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_execute", + "nameLocation": "2173:8:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 675, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 670, + "mutability": "mutable", + "name": "_txHash", + "nameLocation": "2195:7:3", + "nodeType": "VariableDeclaration", + "scope": 783, + "src": "2187:15:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 669, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2187:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 674, + "mutability": "mutable", + "name": "_txs", + "nameLocation": "2231:4:3", + "nodeType": "VariableDeclaration", + "scope": 783, + "src": "2208:27:3", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + }, + "typeName": { + "baseType": { + "id": 672, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 671, + "name": "Transaction", + "nameLocations": [ + "2208:11:3" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "2208:11:3" + }, + "referencedDeclaration": 1292, + "src": "2208:11:3", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "id": 673, + "nodeType": "ArrayTypeName", + "src": "2208:13:3", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_storage_$dyn_storage_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + } + }, + "visibility": "internal" + } + ], + "src": "2181:58:3" + }, + "returnParameters": { + "id": 676, + "nodeType": "ParameterList", + "parameters": [], + "src": "2248:0:3" + }, + "scope": 833, + "src": "2164:1144:3", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 806, + "nodeType": "Block", + "src": "3771:159:3", + "statements": [ + { + "condition": { + "id": 795, + "name": "_revertOnError", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 786, + "src": "3781:14:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 804, + "nodeType": "Block", + "src": "3872:54:3", + "statements": [ + { + "eventCall": { + "arguments": [ + { + "id": 799, + "name": "_txHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 788, + "src": "3894:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 800, + "name": "_index", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 790, + "src": "3903:6:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 801, + "name": "_reason", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 792, + "src": "3911:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 798, + "name": "TxFailed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1259, + "src": "3885:8:3", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_bytes32_$_t_uint256_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes32,uint256,bytes memory)" + } + }, + "id": 802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3885:34:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 803, + "nodeType": "EmitStatement", + "src": "3880:39:3" + } + ] + }, + "id": 805, + "nodeType": "IfStatement", + "src": "3777:149:3", + "trueBody": { + "id": 797, + "nodeType": "Block", + "src": "3797:69:3", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "3814:46:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "_reason", + "nodeType": "YulIdentifier", + "src": "3827:7:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3836:4:3", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3823:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "3823:18:3" + }, + { + "arguments": [ + { + "name": "_reason", + "nodeType": "YulIdentifier", + "src": "3849:7:3" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "3843:5:3" + }, + "nodeType": "YulFunctionCall", + "src": "3843:14:3" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "3816:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "3816:42:3" + }, + "nodeType": "YulExpressionStatement", + "src": "3816:42:3" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 792, + "isOffset": false, + "isSlot": false, + "src": "3827:7:3", + "valueSize": 1 + }, + { + "declaration": 792, + "isOffset": false, + "isSlot": false, + "src": "3849:7:3", + "valueSize": 1 + } + ], + "id": 796, + "nodeType": "InlineAssembly", + "src": "3805:55:3" + } + ] + } + } + ] + }, + "documentation": { + "id": 784, + "nodeType": "StructuredDocumentation", + "src": "3312:329:3", + "text": " @notice Logs a failed transaction, reverts if the transaction is not optional\n @param _revertOnError Signals if it should revert or just log\n @param _txHash Hash of the transaction\n @param _index Index of the transaction in the batch\n @param _reason Encoded revert message" + }, + "id": 807, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_revertBytes", + "nameLocation": "3653:12:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 793, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 786, + "mutability": "mutable", + "name": "_revertOnError", + "nameLocation": "3676:14:3", + "nodeType": "VariableDeclaration", + "scope": 807, + "src": "3671:19:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 785, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3671:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 788, + "mutability": "mutable", + "name": "_txHash", + "nameLocation": "3704:7:3", + "nodeType": "VariableDeclaration", + "scope": 807, + "src": "3696:15:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 787, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3696:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 790, + "mutability": "mutable", + "name": "_index", + "nameLocation": "3725:6:3", + "nodeType": "VariableDeclaration", + "scope": 807, + "src": "3717:14:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 789, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3717:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 792, + "mutability": "mutable", + "name": "_reason", + "nameLocation": "3750:7:3", + "nodeType": "VariableDeclaration", + "scope": 807, + "src": "3737:20:3", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 791, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3737:5:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3665:96:3" + }, + "returnParameters": { + "id": 794, + "nodeType": "ParameterList", + "parameters": [], + "src": "3771:0:3" + }, + "scope": 833, + "src": "3644:286:3", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "baseFunctions": [ + 919 + ], + "body": { + "id": 831, + "nodeType": "Block", + "src": "4232:139:3", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "id": 821, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 816, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 810, + "src": "4242:12:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 818, + "name": "IModuleCalls", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1313, + "src": "4263:12:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IModuleCalls_$1313_$", + "typeString": "type(contract IModuleCalls)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_contract$_IModuleCalls_$1313_$", + "typeString": "type(contract IModuleCalls)" + } + ], + "id": 817, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967269, + "src": "4258:4:3", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 819, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4258:18:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_contract$_IModuleCalls_$1313", + "typeString": "type(contract IModuleCalls)" + } + }, + "id": 820, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "4277:11:3", + "memberName": "interfaceId", + "nodeType": "MemberAccess", + "src": "4258:30:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "src": "4242:46:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 825, + "nodeType": "IfStatement", + "src": "4238:78:3", + "trueBody": { + "id": 824, + "nodeType": "Block", + "src": "4290:26:3", + "statements": [ + { + "expression": { + "hexValue": "74727565", + "id": 822, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4305:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 815, + "id": 823, + "nodeType": "Return", + "src": "4298:11:3" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 828, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 810, + "src": "4353:12:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + ], + "expression": { + "id": 826, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967271, + "src": "4329:5:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_super$_ModuleCalls_$833_$", + "typeString": "type(contract super ModuleCalls)" + } + }, + "id": 827, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4335:17:3", + "memberName": "supportsInterface", + "nodeType": "MemberAccess", + "referencedDeclaration": 919, + "src": "4329:23:3", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes4_$returns$_t_bool_$", + "typeString": "function (bytes4) pure returns (bool)" + } + }, + "id": 829, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4329:37:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 815, + "id": 830, + "nodeType": "Return", + "src": "4322:44:3" + } + ] + }, + "documentation": { + "id": 808, + "nodeType": "StructuredDocumentation", + "src": "3934:203:3", + "text": " @notice Query if a contract implements an interface\n @param _interfaceID The interface identifier, as specified in ERC-165\n @return `true` if the contract implements `_interfaceID`" + }, + "functionSelector": "01ffc9a7", + "id": 832, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "supportsInterface", + "nameLocation": "4149:17:3", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 812, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "4195:8:3" + }, + "parameters": { + "id": 811, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 810, + "mutability": "mutable", + "name": "_interfaceID", + "nameLocation": "4174:12:3", + "nodeType": "VariableDeclaration", + "scope": 832, + "src": "4167:19:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 809, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "4167:6:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "4166:21:3" + }, + "returnParameters": { + "id": 815, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 814, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 832, + "src": "4226:4:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 813, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4226:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "4225:6:3" + }, + "scope": 833, + "src": "4140:231:3", + "stateMutability": "pure", + "virtual": true, + "visibility": "public" + } + ], + "scope": 834, + "src": "436:3937:3", + "usedErrors": [ + 938, + 1057, + 1093, + 1193, + 1197, + 1273, + 1279 + ] + } + ], + "src": "39:4335:3" + }, + "id": 3 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleCreator.sol", + "exportedSymbols": { + "IModuleCreator": [ + 1328 + ], + "ModuleCreator": [ + 902 + ], + "ModuleERC165": [ + 920 + ], + "ModuleSelfAuth": [ + 1116 + ] + }, + "id": 903, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 835, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:4" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "file": "./interfaces/IModuleCreator.sol", + "id": 836, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 903, + "sourceUnit": 1329, + "src": "64:41:4", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "file": "./ModuleSelfAuth.sol", + "id": 837, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 903, + "sourceUnit": 1117, + "src": "107:30:4", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "file": "./ModuleERC165.sol", + "id": 838, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 903, + "sourceUnit": 921, + "src": "138:28:4", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "baseName": { + "id": 839, + "name": "IModuleCreator", + "nameLocations": [ + "195:14:4" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1328, + "src": "195:14:4" + }, + "id": 840, + "nodeType": "InheritanceSpecifier", + "src": "195:14:4" + }, + { + "baseName": { + "id": 841, + "name": "ModuleERC165", + "nameLocations": [ + "211:12:4" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 920, + "src": "211:12:4" + }, + "id": 842, + "nodeType": "InheritanceSpecifier", + "src": "211:12:4" + }, + { + "baseName": { + "id": 843, + "name": "ModuleSelfAuth", + "nameLocations": [ + "225:14:4" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1116, + "src": "225:14:4" + }, + "id": 844, + "nodeType": "InheritanceSpecifier", + "src": "225:14:4" + } + ], + "canonicalName": "ModuleCreator", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 902, + "linearizedBaseContracts": [ + 902, + 1116, + 920, + 1328 + ], + "name": "ModuleCreator", + "nameLocation": "178:13:4", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "eventSelector": "a506ad4e7f05eceba62a023c3219e5bd98a615f4fa87e2afb08a2da5cf62bf0c", + "id": 848, + "name": "CreatedContract", + "nameLocation": "250:15:4", + "nodeType": "EventDefinition", + "parameters": { + "id": 847, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 846, + "indexed": false, + "mutability": "mutable", + "name": "_contract", + "nameLocation": "274:9:4", + "nodeType": "VariableDeclaration", + "scope": 848, + "src": "266:17:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 845, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "266:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "265:19:4" + }, + "src": "244:41:4" + }, + { + "baseFunctions": [ + 1327 + ], + "body": { + "id": 875, + "nodeType": "Block", + "src": "564:168:4", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "579:61:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "581:57:4", + "value": { + "arguments": [ + { + "arguments": [], + "functionName": { + "name": "callvalue", + "nodeType": "YulIdentifier", + "src": "596:9:4" + }, + "nodeType": "YulFunctionCall", + "src": "596:11:4" + }, + { + "arguments": [ + { + "name": "_code", + "nodeType": "YulIdentifier", + "src": "613:5:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "620:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "609:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "609:14:4" + }, + { + "arguments": [ + { + "name": "_code", + "nodeType": "YulIdentifier", + "src": "631:5:4" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "625:5:4" + }, + "nodeType": "YulFunctionCall", + "src": "625:12:4" + } + ], + "functionName": { + "name": "create", + "nodeType": "YulIdentifier", + "src": "589:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "589:49:4" + }, + "variableNames": [ + { + "name": "addr", + "nodeType": "YulIdentifier", + "src": "581:4:4" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 851, + "isOffset": false, + "isSlot": false, + "src": "613:5:4", + "valueSize": 1 + }, + { + "declaration": 851, + "isOffset": false, + "isSlot": false, + "src": "631:5:4", + "valueSize": 1 + }, + { + "declaration": 857, + "isOffset": false, + "isSlot": false, + "src": "581:4:4", + "valueSize": 1 + } + ], + "id": 859, + "nodeType": "InlineAssembly", + "src": "570:70:4" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 865, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 860, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 857, + "src": "649:4:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 863, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "665:1:4", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 862, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "657:7:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 861, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "657:7:4", + "typeDescriptions": {} + } + }, + "id": 864, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "657:10:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "649:18:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 870, + "nodeType": "IfStatement", + "src": "645:50:4", + "trueBody": { + "errorCall": { + "arguments": [ + { + "id": 867, + "name": "_code", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 851, + "src": "689:5:4", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 866, + "name": "CreateFailed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1319, + "src": "676:12:4", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes memory) pure" + } + }, + "id": 868, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "676:19:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 869, + "nodeType": "RevertStatement", + "src": "669:26:4" + } + }, + { + "eventCall": { + "arguments": [ + { + "id": 872, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 857, + "src": "722:4:4", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 871, + "name": "CreatedContract", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 848, + "src": "706:15:4", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$", + "typeString": "function (address)" + } + }, + "id": 873, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "706:21:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 874, + "nodeType": "EmitStatement", + "src": "701:26:4" + } + ] + }, + "documentation": { + "id": 849, + "nodeType": "StructuredDocumentation", + "src": "289:164:4", + "text": " @notice Creates a contract forwarding eth value\n @param _code Creation code of the contract\n @return addr The address of the created contract" + }, + "functionSelector": "90042baf", + "id": 876, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "id": 855, + "kind": "modifierInvocation", + "modifierName": { + "id": 854, + "name": "onlySelf", + "nameLocations": [ + "532:8:4" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1115, + "src": "532:8:4" + }, + "nodeType": "ModifierInvocation", + "src": "532:8:4" + } + ], + "name": "createContract", + "nameLocation": "465:14:4", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 853, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "507:8:4" + }, + "parameters": { + "id": 852, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 851, + "mutability": "mutable", + "name": "_code", + "nameLocation": "493:5:4", + "nodeType": "VariableDeclaration", + "scope": 876, + "src": "480:18:4", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 850, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "480:5:4", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "479:20:4" + }, + "returnParameters": { + "id": 858, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 857, + "mutability": "mutable", + "name": "addr", + "nameLocation": "558:4:4", + "nodeType": "VariableDeclaration", + "scope": 876, + "src": "550:12:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 856, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "550:7:4", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "549:14:4" + }, + "scope": 902, + "src": "456:276:4", + "stateMutability": "payable", + "virtual": true, + "visibility": "public" + }, + { + "baseFunctions": [ + 919 + ], + "body": { + "id": 900, + "nodeType": "Block", + "src": "1034:141:4", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "id": 890, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 885, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 879, + "src": "1044:12:4", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "arguments": [ + { + "id": 887, + "name": "IModuleCreator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1328, + "src": "1065:14:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IModuleCreator_$1328_$", + "typeString": "type(contract IModuleCreator)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_contract$_IModuleCreator_$1328_$", + "typeString": "type(contract IModuleCreator)" + } + ], + "id": 886, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967269, + "src": "1060:4:4", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 888, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1060:20:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_contract$_IModuleCreator_$1328", + "typeString": "type(contract IModuleCreator)" + } + }, + "id": 889, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1081:11:4", + "memberName": "interfaceId", + "nodeType": "MemberAccess", + "src": "1060:32:4", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "src": "1044:48:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 894, + "nodeType": "IfStatement", + "src": "1040:80:4", + "trueBody": { + "id": 893, + "nodeType": "Block", + "src": "1094:26:4", + "statements": [ + { + "expression": { + "hexValue": "74727565", + "id": 891, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1109:4:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + }, + "functionReturnParameters": 884, + "id": 892, + "nodeType": "Return", + "src": "1102:11:4" + } + ] + } + }, + { + "expression": { + "arguments": [ + { + "id": 897, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 879, + "src": "1157:12:4", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + ], + "expression": { + "id": 895, + "name": "super", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967271, + "src": "1133:5:4", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_super$_ModuleCreator_$902_$", + "typeString": "type(contract super ModuleCreator)" + } + }, + "id": 896, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1139:17:4", + "memberName": "supportsInterface", + "nodeType": "MemberAccess", + "referencedDeclaration": 919, + "src": "1133:23:4", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes4_$returns$_t_bool_$", + "typeString": "function (bytes4) pure returns (bool)" + } + }, + "id": 898, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1133:37:4", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 884, + "id": 899, + "nodeType": "Return", + "src": "1126:44:4" + } + ] + }, + "documentation": { + "id": 877, + "nodeType": "StructuredDocumentation", + "src": "736:203:4", + "text": " @notice Query if a contract implements an interface\n @param _interfaceID The interface identifier, as specified in ERC-165\n @return `true` if the contract implements `_interfaceID`" + }, + "functionSelector": "01ffc9a7", + "id": 901, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "supportsInterface", + "nameLocation": "951:17:4", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 881, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "997:8:4" + }, + "parameters": { + "id": 880, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 879, + "mutability": "mutable", + "name": "_interfaceID", + "nameLocation": "976:12:4", + "nodeType": "VariableDeclaration", + "scope": 901, + "src": "969:19:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 878, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "969:6:4", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "968:21:4" + }, + "returnParameters": { + "id": 884, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 883, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 901, + "src": "1028:4:4", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 882, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1028:4:4", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1027:6:4" + }, + "scope": 902, + "src": "942:233:4", + "stateMutability": "pure", + "virtual": true, + "visibility": "public" + } + ], + "scope": 903, + "src": "169:1008:4", + "usedErrors": [ + 1093, + 1319 + ] + } + ], + "src": "39:1139:4" + }, + "id": 4 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleERC165.sol", + "exportedSymbols": { + "ModuleERC165": [ + 920 + ] + }, + "id": 921, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 904, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:5" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "ModuleERC165", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 920, + "linearizedBaseContracts": [ + 920 + ], + "name": "ModuleERC165", + "nameLocation": "83:12:5", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 918, + "nodeType": "Block", + "src": "696:65:5", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "id": 916, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 912, + "name": "_interfaceID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 907, + "src": "709:12:5", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "expression": { + "expression": { + "id": 913, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967268, + "src": "725:4:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ModuleERC165_$920", + "typeString": "contract ModuleERC165" + } + }, + "id": 914, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "730:17:5", + "memberName": "supportsInterface", + "nodeType": "MemberAccess", + "referencedDeclaration": 919, + "src": "725:22:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_pure$_t_bytes4_$returns$_t_bool_$", + "typeString": "function (bytes4) pure external returns (bool)" + } + }, + "id": 915, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "748:8:5", + "memberName": "selector", + "nodeType": "MemberAccess", + "src": "725:31:5", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "src": "709:47:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "functionReturnParameters": 911, + "id": 917, + "nodeType": "Return", + "src": "702:54:5" + } + ] + }, + "documentation": { + "id": 905, + "nodeType": "StructuredDocumentation", + "src": "100:510:5", + "text": " @notice Query if a contract implements an interface\n @param _interfaceID The interface identifier, as specified in ERC-165\n @dev Adding new hooks will not lead to them being reported by this function\n without upgrading the wallet. In addition, developers must ensure that\n all inherited contracts by the main module don't conflict and are accounted\n to be supported by the supportsInterface method.\n @return `true` if the contract implements `_interfaceID`" + }, + "functionSelector": "01ffc9a7", + "id": 919, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "supportsInterface", + "nameLocation": "622:17:5", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 908, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 907, + "mutability": "mutable", + "name": "_interfaceID", + "nameLocation": "647:12:5", + "nodeType": "VariableDeclaration", + "scope": 919, + "src": "640:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 906, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "640:6:5", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "visibility": "internal" + } + ], + "src": "639:21:5" + }, + "returnParameters": { + "id": 911, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 910, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 919, + "src": "690:4:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 909, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "690:4:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "689:6:5" + }, + "scope": 920, + "src": "613:148:5", + "stateMutability": "pure", + "virtual": true, + "visibility": "public" + } + ], + "scope": 921, + "src": "65:698:5", + "usedErrors": [] + } + ], + "src": "39:725:5" + }, + "id": 5 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleNonce.sol", + "exportedSymbols": { + "ModuleNonce": [ + 1051 + ], + "ModuleStorage": [ + 1179 + ], + "SubModuleNonce": [ + 2324 + ] + }, + "id": 1052, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 922, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:6" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "file": "./ModuleStorage.sol", + "id": 923, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1052, + "sourceUnit": 1180, + "src": "64:29:6", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "file": "./submodules/nonce/SubModuleNonce.sol", + "id": 924, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 1052, + "sourceUnit": 2325, + "src": "95:47:6", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ModuleNonce", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 1051, + "linearizedBaseContracts": [ + 1051 + ], + "name": "ModuleNonce", + "nameLocation": "154:11:6", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "eventSelector": "1f180c27086c7a39ea2a7b25239d1ab92348f07ca7bb59d1438fcf527568f881", + "id": 930, + "name": "NonceChange", + "nameLocation": "188:11:6", + "nodeType": "EventDefinition", + "parameters": { + "id": 929, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 926, + "indexed": false, + "mutability": "mutable", + "name": "_space", + "nameLocation": "208:6:6", + "nodeType": "VariableDeclaration", + "scope": 930, + "src": "200:14:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 925, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "200:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 928, + "indexed": false, + "mutability": "mutable", + "name": "_newNonce", + "nameLocation": "224:9:6", + "nodeType": "VariableDeclaration", + "scope": 930, + "src": "216:17:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 927, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "216:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "199:35:6" + }, + "src": "182:53:6" + }, + { + "errorSelector": "9b6514f4", + "id": 938, + "name": "BadNonce", + "nameLocation": "257:8:6", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 937, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 932, + "mutability": "mutable", + "name": "_space", + "nameLocation": "274:6:6", + "nodeType": "VariableDeclaration", + "scope": 938, + "src": "266:14:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 931, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "266:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 934, + "mutability": "mutable", + "name": "_provided", + "nameLocation": "290:9:6", + "nodeType": "VariableDeclaration", + "scope": 938, + "src": "282:17:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 933, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "282:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 936, + "mutability": "mutable", + "name": "_current", + "nameLocation": "309:8:6", + "nodeType": "VariableDeclaration", + "scope": 938, + "src": "301:16:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 935, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "301:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "265:53:6" + }, + "src": "251:68:6" + }, + { + "constant": true, + "id": 944, + "mutability": "constant", + "name": "NONCE_KEY", + "nameLocation": "433:9:6", + "nodeType": "VariableDeclaration", + "scope": 1051, + "src": "408:112:6", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 939, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "408:7:6", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "307838643062663166643632336436323863373431333632633132383939343865353762336532393035323138633637366433653639616265653336643661653265", + "id": 942, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "453:66:6", + "typeDescriptions": { + "typeIdentifier": "t_rational_63797217120035063192835264220719863994123296260065566452921212441289018486318_by_1", + "typeString": "int_const 6379...(69 digits omitted)...6318" + }, + "value": "0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_63797217120035063192835264220719863994123296260065566452921212441289018486318_by_1", + "typeString": "int_const 6379...(69 digits omitted)...6318" + } + ], + "id": 941, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "445:7:6", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 940, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "445:7:6", + "typeDescriptions": {} + } + }, + "id": 943, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "445:75:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "private" + }, + { + "body": { + "id": 954, + "nodeType": "Block", + "src": "727:30:6", + "statements": [ + { + "expression": { + "arguments": [ + { + "hexValue": "30", + "id": 951, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "750:1:6", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 950, + "name": "readNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 976, + "src": "740:9:6", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 952, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "740:12:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 949, + "id": 953, + "nodeType": "Return", + "src": "733:19:6" + } + ] + }, + "documentation": { + "id": 945, + "nodeType": "StructuredDocumentation", + "src": "525:142:6", + "text": " @notice Returns the next nonce of the default nonce space\n @dev The default nonce space is 0x00\n @return The next nonce" + }, + "functionSelector": "affed0e0", + "id": 955, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "nonce", + "nameLocation": "679:5:6", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 946, + "nodeType": "ParameterList", + "parameters": [], + "src": "684:2:6" + }, + "returnParameters": { + "id": 949, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 948, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 955, + "src": "718:7:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 947, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "718:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "717:9:6" + }, + "scope": 1051, + "src": "670:87:6", + "stateMutability": "view", + "virtual": true, + "visibility": "external" + }, + { + "body": { + "id": 975, + "nodeType": "Block", + "src": "1011:83:6", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "id": 967, + "name": "NONCE_KEY", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 944, + "src": "1061:9:6", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "id": 970, + "name": "_space", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 958, + "src": "1080:6:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 969, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1072:7:6", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 968, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1072:7:6", + "typeDescriptions": {} + } + }, + "id": 971, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1072:15:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 965, + "name": "ModuleStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1179, + "src": "1032:13:6", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ModuleStorage_$1179_$", + "typeString": "type(library ModuleStorage)" + } + }, + "id": 966, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1046:14:6", + "memberName": "readBytes32Map", + "nodeType": "MemberAccess", + "referencedDeclaration": 1178, + "src": "1032:28:6", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) view returns (bytes32)" + } + }, + "id": 972, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1032:56:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 964, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1024:7:6", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 963, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1024:7:6", + "typeDescriptions": {} + } + }, + "id": 973, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1024:65:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 962, + "id": 974, + "nodeType": "Return", + "src": "1017:72:6" + } + ] + }, + "documentation": { + "id": 956, + "nodeType": "StructuredDocumentation", + "src": "761:174:6", + "text": " @notice Returns the next nonce of the given nonce space\n @param _space Nonce space, each space keeps an independent nonce count\n @return The next nonce" + }, + "functionSelector": "8c3f5563", + "id": 976, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readNonce", + "nameLocation": "947:9:6", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 959, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 958, + "mutability": "mutable", + "name": "_space", + "nameLocation": "965:6:6", + "nodeType": "VariableDeclaration", + "scope": 976, + "src": "957:14:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 957, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "957:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "956:16:6" + }, + "returnParameters": { + "id": 962, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 961, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 976, + "src": "1002:7:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 960, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1002:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1001:9:6" + }, + "scope": 1051, + "src": "938:156:6", + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "body": { + "id": 998, + "nodeType": "Block", + "src": "1356:85:6", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 987, + "name": "NONCE_KEY", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 944, + "src": "1392:9:6", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "id": 990, + "name": "_space", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 979, + "src": "1411:6:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 989, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1403:7:6", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 988, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1403:7:6", + "typeDescriptions": {} + } + }, + "id": 991, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1403:15:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "id": 994, + "name": "_nonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 981, + "src": "1428:6:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 993, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1420:7:6", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 992, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1420:7:6", + "typeDescriptions": {} + } + }, + "id": 995, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1420:15:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 984, + "name": "ModuleStorage", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1179, + "src": "1362:13:6", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_ModuleStorage_$1179_$", + "typeString": "type(library ModuleStorage)" + } + }, + "id": 986, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1376:15:6", + "memberName": "writeBytes32Map", + "nodeType": "MemberAccess", + "referencedDeclaration": 1157, + "src": "1362:29:6", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$__$", + "typeString": "function (bytes32,bytes32,bytes32)" + } + }, + "id": 996, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1362:74:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 997, + "nodeType": "ExpressionStatement", + "src": "1362:74:6" + } + ] + }, + "documentation": { + "id": 977, + "nodeType": "StructuredDocumentation", + "src": "1098:193:6", + "text": " @notice Changes the next nonce of the given nonce space\n @param _space Nonce space, each space keeps an independent nonce count\n @param _nonce Nonce to write on the space" + }, + "id": 999, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_writeNonce", + "nameLocation": "1303:11:6", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 982, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 979, + "mutability": "mutable", + "name": "_space", + "nameLocation": "1323:6:6", + "nodeType": "VariableDeclaration", + "scope": 999, + "src": "1315:14:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 978, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1315:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 981, + "mutability": "mutable", + "name": "_nonce", + "nameLocation": "1339:6:6", + "nodeType": "VariableDeclaration", + "scope": 999, + "src": "1331:14:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 980, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1331:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1314:32:6" + }, + "returnParameters": { + "id": 983, + "nodeType": "ParameterList", + "parameters": [], + "src": "1356:0:6" + }, + "scope": 1051, + "src": "1294:147:6", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1049, + "nodeType": "Block", + "src": "1628:446:6", + "statements": [ + { + "assignments": [ + 1006, + 1008 + ], + "declarations": [ + { + "constant": false, + "id": 1006, + "mutability": "mutable", + "name": "space", + "nameLocation": "1689:5:6", + "nodeType": "VariableDeclaration", + "scope": 1049, + "src": "1681:13:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1005, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1681:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1008, + "mutability": "mutable", + "name": "providedNonce", + "nameLocation": "1704:13:6", + "nodeType": "VariableDeclaration", + "scope": 1049, + "src": "1696:21:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1007, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1696:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1013, + "initialValue": { + "arguments": [ + { + "id": 1011, + "name": "_rawNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1002, + "src": "1748:9:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1009, + "name": "SubModuleNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2324, + "src": "1721:14:6", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SubModuleNonce_$2324_$", + "typeString": "type(library SubModuleNonce)" + } + }, + "id": 1010, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1736:11:6", + "memberName": "decodeNonce", + "nodeType": "MemberAccess", + "referencedDeclaration": 2323, + "src": "1721:26:6", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint256_$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256,uint256)" + } + }, + "id": 1012, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1721:37:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1680:78:6" + }, + { + "assignments": [ + 1015 + ], + "declarations": [ + { + "constant": false, + "id": 1015, + "mutability": "mutable", + "name": "currentNonce", + "nameLocation": "1773:12:6", + "nodeType": "VariableDeclaration", + "scope": 1049, + "src": "1765:20:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1014, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1765:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1019, + "initialValue": { + "arguments": [ + { + "id": 1017, + "name": "space", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1006, + "src": "1798:5:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1016, + "name": "readNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 976, + "src": "1788:9:6", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256) view returns (uint256)" + } + }, + "id": 1018, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1788:16:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1765:39:6" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1022, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1020, + "name": "currentNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1015, + "src": "1814:12:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "id": 1021, + "name": "providedNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1008, + "src": "1830:13:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1814:29:6", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1030, + "nodeType": "IfStatement", + "src": "1810:101:6", + "trueBody": { + "id": 1029, + "nodeType": "Block", + "src": "1845:66:6", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 1024, + "name": "space", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1006, + "src": "1869:5:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1025, + "name": "providedNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1008, + "src": "1876:13:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1026, + "name": "currentNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1015, + "src": "1891:12:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1023, + "name": "BadNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 938, + "src": "1860:8:6", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256,uint256) pure" + } + }, + "id": 1027, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1860:44:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1028, + "nodeType": "RevertStatement", + "src": "1853:51:6" + } + ] + } + }, + { + "id": 1048, + "nodeType": "UncheckedBlock", + "src": "1917:153:6", + "statements": [ + { + "assignments": [ + 1032 + ], + "declarations": [ + { + "constant": false, + "id": 1032, + "mutability": "mutable", + "name": "newNonce", + "nameLocation": "1943:8:6", + "nodeType": "VariableDeclaration", + "scope": 1048, + "src": "1935:16:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1031, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1935:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1036, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1035, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1033, + "name": "providedNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1008, + "src": "1954:13:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "31", + "id": 1034, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1970:1:6", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "1954:17:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1935:36:6" + }, + { + "expression": { + "arguments": [ + { + "id": 1038, + "name": "space", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1006, + "src": "1992:5:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1039, + "name": "newNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1032, + "src": "1999:8:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1037, + "name": "_writeNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 999, + "src": "1980:11:6", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 1040, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1980:28:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1041, + "nodeType": "ExpressionStatement", + "src": "1980:28:6" + }, + { + "eventCall": { + "arguments": [ + { + "id": 1043, + "name": "space", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1006, + "src": "2033:5:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1044, + "name": "newNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1032, + "src": "2040:8:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1042, + "name": "NonceChange", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 930, + "src": "2021:11:6", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 1045, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2021:28:6", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1046, + "nodeType": "EmitStatement", + "src": "2016:33:6" + }, + { + "functionReturnParameters": 1004, + "id": 1047, + "nodeType": "Return", + "src": "2057:7:6" + } + ] + } + ] + }, + "documentation": { + "id": 1000, + "nodeType": "StructuredDocumentation", + "src": "1445:120:6", + "text": " @notice Verify if a nonce is valid\n @param _rawNonce Nonce to validate (may contain an encoded space)" + }, + "id": 1050, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_validateNonce", + "nameLocation": "1577:14:6", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1003, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1002, + "mutability": "mutable", + "name": "_rawNonce", + "nameLocation": "1600:9:6", + "nodeType": "VariableDeclaration", + "scope": 1050, + "src": "1592:17:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1001, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1592:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1591:19:6" + }, + "returnParameters": { + "id": 1004, + "nodeType": "ParameterList", + "parameters": [], + "src": "1628:0:6" + }, + "scope": 1051, + "src": "1568:506:6", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + } + ], + "scope": 1052, + "src": "145:1931:6", + "usedErrors": [ + 938 + ] + } + ], + "src": "39:2038:6" + }, + "id": 6 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol", + "exportedSymbols": { + "ModuleOnlyDelegatecall": [ + 1085 + ] + }, + "id": 1086, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1053, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:7" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ModuleOnlyDelegatecall", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 1085, + "linearizedBaseContracts": [ + 1085 + ], + "name": "ModuleOnlyDelegatecall", + "nameLocation": "74:22:7", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "id": 1055, + "mutability": "immutable", + "name": "self", + "nameLocation": "127:4:7", + "nodeType": "VariableDeclaration", + "scope": 1085, + "src": "101:30:7", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1054, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "101:7:7", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "private" + }, + { + "errorSelector": "0a57d61d", + "id": 1057, + "name": "OnlyDelegatecall", + "nameLocation": "142:16:7", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1056, + "nodeType": "ParameterList", + "parameters": [], + "src": "158:2:7" + }, + "src": "136:25:7" + }, + { + "body": { + "id": 1067, + "nodeType": "Block", + "src": "179:31:7", + "statements": [ + { + "expression": { + "id": 1065, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1060, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1055, + "src": "185:4:7", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1063, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967268, + "src": "200:4:7", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ModuleOnlyDelegatecall_$1085", + "typeString": "contract ModuleOnlyDelegatecall" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ModuleOnlyDelegatecall_$1085", + "typeString": "contract ModuleOnlyDelegatecall" + } + ], + "id": 1062, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "192:7:7", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1061, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "192:7:7", + "typeDescriptions": {} + } + }, + "id": 1064, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "192:13:7", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "185:20:7", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 1066, + "nodeType": "ExpressionStatement", + "src": "185:20:7" + } + ] + }, + "id": 1068, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1058, + "nodeType": "ParameterList", + "parameters": [], + "src": "176:2:7" + }, + "returnParameters": { + "id": 1059, + "nodeType": "ParameterList", + "parameters": [], + "src": "179:0:7" + }, + "scope": 1085, + "src": "165:45:7", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1083, + "nodeType": "Block", + "src": "334:84:7", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 1076, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 1073, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967268, + "src": "352:4:7", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ModuleOnlyDelegatecall_$1085", + "typeString": "contract ModuleOnlyDelegatecall" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ModuleOnlyDelegatecall_$1085", + "typeString": "contract ModuleOnlyDelegatecall" + } + ], + "id": 1072, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "344:7:7", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1071, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "344:7:7", + "typeDescriptions": {} + } + }, + "id": 1074, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "344:13:7", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1075, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1055, + "src": "361:4:7", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "344:21:7", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1081, + "nodeType": "IfStatement", + "src": "340:67:7", + "trueBody": { + "id": 1080, + "nodeType": "Block", + "src": "367:40:7", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1077, + "name": "OnlyDelegatecall", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1057, + "src": "382:16:7", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1078, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "382:18:7", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1079, + "nodeType": "RevertStatement", + "src": "375:25:7" + } + ] + } + }, + { + "id": 1082, + "nodeType": "PlaceholderStatement", + "src": "412:1:7" + } + ] + }, + "documentation": { + "id": 1069, + "nodeType": "StructuredDocumentation", + "src": "214:89:7", + "text": " @notice Modifier that only allows functions to be called via delegatecall." + }, + "id": 1084, + "name": "onlyDelegatecall", + "nameLocation": "315:16:7", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 1070, + "nodeType": "ParameterList", + "parameters": [], + "src": "331:2:7" + }, + "src": "306:112:7", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 1086, + "src": "65:355:7", + "usedErrors": [ + 1057 + ] + } + ], + "src": "39:382:7" + }, + "id": 7 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "exportedSymbols": { + "ModuleSelfAuth": [ + 1116 + ] + }, + "id": 1117, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1087, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:8" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ModuleSelfAuth", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 1116, + "linearizedBaseContracts": [ + 1116 + ], + "name": "ModuleSelfAuth", + "nameLocation": "74:14:8", + "nodeType": "ContractDefinition", + "nodes": [ + { + "errorSelector": "e1258894", + "id": 1093, + "name": "OnlySelfAuth", + "nameLocation": "99:12:8", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1092, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1089, + "mutability": "mutable", + "name": "_sender", + "nameLocation": "120:7:8", + "nodeType": "VariableDeclaration", + "scope": 1093, + "src": "112:15:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1088, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "112:7:8", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1091, + "mutability": "mutable", + "name": "_self", + "nameLocation": "137:5:8", + "nodeType": "VariableDeclaration", + "scope": 1093, + "src": "129:13:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1090, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "129:7:8", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "111:32:8" + }, + "src": "93:51:8" + }, + { + "body": { + "id": 1114, + "nodeType": "Block", + "src": "168:111:8", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 1101, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 1095, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967281, + "src": "178:3:8", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1096, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "182:6:8", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "178:10:8", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "id": 1099, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967268, + "src": "200:4:8", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ModuleSelfAuth_$1116", + "typeString": "contract ModuleSelfAuth" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ModuleSelfAuth_$1116", + "typeString": "contract ModuleSelfAuth" + } + ], + "id": 1098, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "192:7:8", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1097, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "192:7:8", + "typeDescriptions": {} + } + }, + "id": 1100, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "192:13:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "178:27:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1112, + "nodeType": "IfStatement", + "src": "174:94:8", + "trueBody": { + "id": 1111, + "nodeType": "Block", + "src": "207:61:8", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "expression": { + "id": 1103, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967281, + "src": "235:3:8", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1104, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "239:6:8", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "235:10:8", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "arguments": [ + { + "id": 1107, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967268, + "src": "255:4:8", + "typeDescriptions": { + "typeIdentifier": "t_contract$_ModuleSelfAuth_$1116", + "typeString": "contract ModuleSelfAuth" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_ModuleSelfAuth_$1116", + "typeString": "contract ModuleSelfAuth" + } + ], + "id": 1106, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "247:7:8", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1105, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "247:7:8", + "typeDescriptions": {} + } + }, + "id": 1108, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "247:13:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 1102, + "name": "OnlySelfAuth", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1093, + "src": "222:12:8", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_address_$_t_address_$returns$__$", + "typeString": "function (address,address) pure" + } + }, + "id": 1109, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "222:39:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1110, + "nodeType": "RevertStatement", + "src": "215:46:8" + } + ] + } + }, + { + "id": 1113, + "nodeType": "PlaceholderStatement", + "src": "273:1:8" + } + ] + }, + "id": 1115, + "name": "onlySelf", + "nameLocation": "157:8:8", + "nodeType": "ModifierDefinition", + "parameters": { + "id": 1094, + "nodeType": "ParameterList", + "parameters": [], + "src": "165:2:8" + }, + "src": "148:131:8", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 1117, + "src": "65:216:8", + "usedErrors": [ + 1093 + ] + } + ], + "src": "39:243:8" + }, + "id": 8 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "exportedSymbols": { + "ModuleStorage": [ + 1179 + ] + }, + "id": 1180, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1118, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:9" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ModuleStorage", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 1179, + "linearizedBaseContracts": [ + 1179 + ], + "name": "ModuleStorage", + "nameLocation": "73:13:9", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 1126, + "nodeType": "Block", + "src": "150:41:9", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "165:22:9", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "_key", + "nodeType": "YulIdentifier", + "src": "174:4:9" + }, + { + "name": "_val", + "nodeType": "YulIdentifier", + "src": "180:4:9" + } + ], + "functionName": { + "name": "sstore", + "nodeType": "YulIdentifier", + "src": "167:6:9" + }, + "nodeType": "YulFunctionCall", + "src": "167:18:9" + }, + "nodeType": "YulExpressionStatement", + "src": "167:18:9" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 1120, + "isOffset": false, + "isSlot": false, + "src": "174:4:9", + "valueSize": 1 + }, + { + "declaration": 1122, + "isOffset": false, + "isSlot": false, + "src": "180:4:9", + "valueSize": 1 + } + ], + "id": 1125, + "nodeType": "InlineAssembly", + "src": "156:31:9" + } + ] + }, + "id": 1127, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "writeBytes32", + "nameLocation": "100:12:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1123, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1120, + "mutability": "mutable", + "name": "_key", + "nameLocation": "121:4:9", + "nodeType": "VariableDeclaration", + "scope": 1127, + "src": "113:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1119, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "113:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1122, + "mutability": "mutable", + "name": "_val", + "nameLocation": "135:4:9", + "nodeType": "VariableDeclaration", + "scope": 1127, + "src": "127:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1121, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "127:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "112:28:9" + }, + "returnParameters": { + "id": 1124, + "nodeType": "ParameterList", + "parameters": [], + "src": "150:0:9" + }, + "scope": 1179, + "src": "91:100:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1135, + "nodeType": "Block", + "src": "266:41:9", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "281:22:9", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "283:18:9", + "value": { + "arguments": [ + { + "name": "_key", + "nodeType": "YulIdentifier", + "src": "296:4:9" + } + ], + "functionName": { + "name": "sload", + "nodeType": "YulIdentifier", + "src": "290:5:9" + }, + "nodeType": "YulFunctionCall", + "src": "290:11:9" + }, + "variableNames": [ + { + "name": "val", + "nodeType": "YulIdentifier", + "src": "283:3:9" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 1129, + "isOffset": false, + "isSlot": false, + "src": "296:4:9", + "valueSize": 1 + }, + { + "declaration": 1132, + "isOffset": false, + "isSlot": false, + "src": "283:3:9", + "valueSize": 1 + } + ], + "id": 1134, + "nodeType": "InlineAssembly", + "src": "272:31:9" + } + ] + }, + "id": 1136, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readBytes32", + "nameLocation": "204:11:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1130, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1129, + "mutability": "mutable", + "name": "_key", + "nameLocation": "224:4:9", + "nodeType": "VariableDeclaration", + "scope": 1136, + "src": "216:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1128, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "216:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "215:14:9" + }, + "returnParameters": { + "id": 1133, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1132, + "mutability": "mutable", + "name": "val", + "nameLocation": "261:3:9", + "nodeType": "VariableDeclaration", + "scope": 1136, + "src": "253:11:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1131, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "253:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "252:13:9" + }, + "scope": 1179, + "src": "195:112:9", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1156, + "nodeType": "Block", + "src": "390:96:9", + "statements": [ + { + "assignments": [ + 1146 + ], + "declarations": [ + { + "constant": false, + "id": 1146, + "mutability": "mutable", + "name": "key", + "nameLocation": "404:3:9", + "nodeType": "VariableDeclaration", + "scope": 1156, + "src": "396:11:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1145, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "396:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1154, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 1150, + "name": "_key", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1138, + "src": "431:4:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1151, + "name": "_subKey", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1140, + "src": "437:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1148, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "420:3:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1149, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "424:6:9", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "420:10:9", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 1152, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "420:25:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 1147, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "410:9:9", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 1153, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "410:36:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "396:50:9" + }, + { + "AST": { + "nodeType": "YulBlock", + "src": "461:21:9", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "key", + "nodeType": "YulIdentifier", + "src": "470:3:9" + }, + { + "name": "_val", + "nodeType": "YulIdentifier", + "src": "475:4:9" + } + ], + "functionName": { + "name": "sstore", + "nodeType": "YulIdentifier", + "src": "463:6:9" + }, + "nodeType": "YulFunctionCall", + "src": "463:17:9" + }, + "nodeType": "YulExpressionStatement", + "src": "463:17:9" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 1142, + "isOffset": false, + "isSlot": false, + "src": "475:4:9", + "valueSize": 1 + }, + { + "declaration": 1146, + "isOffset": false, + "isSlot": false, + "src": "470:3:9", + "valueSize": 1 + } + ], + "id": 1155, + "nodeType": "InlineAssembly", + "src": "452:30:9" + } + ] + }, + "id": 1157, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "writeBytes32Map", + "nameLocation": "320:15:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1143, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1138, + "mutability": "mutable", + "name": "_key", + "nameLocation": "344:4:9", + "nodeType": "VariableDeclaration", + "scope": 1157, + "src": "336:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1137, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "336:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1140, + "mutability": "mutable", + "name": "_subKey", + "nameLocation": "358:7:9", + "nodeType": "VariableDeclaration", + "scope": 1157, + "src": "350:15:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1139, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "350:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1142, + "mutability": "mutable", + "name": "_val", + "nameLocation": "375:4:9", + "nodeType": "VariableDeclaration", + "scope": 1157, + "src": "367:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1141, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "367:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "335:45:9" + }, + "returnParameters": { + "id": 1144, + "nodeType": "ParameterList", + "parameters": [], + "src": "390:0:9" + }, + "scope": 1179, + "src": "311:175:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1177, + "nodeType": "Block", + "src": "581:96:9", + "statements": [ + { + "assignments": [ + 1167 + ], + "declarations": [ + { + "constant": false, + "id": 1167, + "mutability": "mutable", + "name": "key", + "nameLocation": "595:3:9", + "nodeType": "VariableDeclaration", + "scope": 1177, + "src": "587:11:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1166, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "587:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1175, + "initialValue": { + "arguments": [ + { + "arguments": [ + { + "id": 1171, + "name": "_key", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1159, + "src": "622:4:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1172, + "name": "_subKey", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1161, + "src": "628:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1169, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "611:3:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1170, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "615:6:9", + "memberName": "encode", + "nodeType": "MemberAccess", + "src": "611:10:9", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencode_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 1173, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "611:25:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 1168, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "601:9:9", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 1174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "601:36:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "587:50:9" + }, + { + "AST": { + "nodeType": "YulBlock", + "src": "652:21:9", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "654:17:9", + "value": { + "arguments": [ + { + "name": "key", + "nodeType": "YulIdentifier", + "src": "667:3:9" + } + ], + "functionName": { + "name": "sload", + "nodeType": "YulIdentifier", + "src": "661:5:9" + }, + "nodeType": "YulFunctionCall", + "src": "661:10:9" + }, + "variableNames": [ + { + "name": "val", + "nodeType": "YulIdentifier", + "src": "654:3:9" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 1167, + "isOffset": false, + "isSlot": false, + "src": "667:3:9", + "valueSize": 1 + }, + { + "declaration": 1164, + "isOffset": false, + "isSlot": false, + "src": "654:3:9", + "valueSize": 1 + } + ], + "id": 1176, + "nodeType": "InlineAssembly", + "src": "643:30:9" + } + ] + }, + "id": 1178, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readBytes32Map", + "nameLocation": "499:14:9", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1162, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1159, + "mutability": "mutable", + "name": "_key", + "nameLocation": "522:4:9", + "nodeType": "VariableDeclaration", + "scope": 1178, + "src": "514:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1158, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "514:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1161, + "mutability": "mutable", + "name": "_subKey", + "nameLocation": "536:7:9", + "nodeType": "VariableDeclaration", + "scope": 1178, + "src": "528:15:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1160, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "528:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "513:31:9" + }, + "returnParameters": { + "id": 1165, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1164, + "mutability": "mutable", + "name": "val", + "nameLocation": "576:3:9", + "nodeType": "VariableDeclaration", + "scope": 1178, + "src": "568:11:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1163, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "568:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "567:13:9" + }, + "scope": 1179, + "src": "490:187:9", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 1180, + "src": "65:614:9", + "usedErrors": [] + } + ], + "src": "39:641:9" + }, + "id": 9 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "exportedSymbols": { + "IModuleAuth": [ + 1249 + ] + }, + "id": 1250, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1181, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:10" + }, + { + "abstract": true, + "baseContracts": [], + "canonicalName": "IModuleAuth", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": false, + "id": 1249, + "linearizedBaseContracts": [ + 1249 + ], + "name": "IModuleAuth", + "nameLocation": "83:11:10", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": true, + "id": 1187, + "mutability": "constant", + "name": "IMAGE_HASH_KEY", + "nameLocation": "231:14:10", + "nodeType": "VariableDeclaration", + "scope": 1249, + "src": "205:118:10", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1182, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "205:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "307865613731353766613235653361613137643061653264353238306661346532346434323163363138343261613835653435313934653131343561613732626638", + "id": 1185, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "256:66:10", + "typeDescriptions": { + "typeIdentifier": "t_rational_106041467482713340379632507891644215435067329692436463218523020519418825747448_by_1", + "typeString": "int_const 1060...(70 digits omitted)...7448" + }, + "value": "0xea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_106041467482713340379632507891644215435067329692436463218523020519418825747448_by_1", + "typeString": "int_const 1060...(70 digits omitted)...7448" + } + ], + "id": 1184, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "248:7:10", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1183, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "248:7:10", + "typeDescriptions": {} + } + }, + "id": 1186, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "248:75:10", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "anonymous": false, + "eventSelector": "307ed6bd941ee9fc80f369c94af5fa11e25bab5102a6140191756c5474a30bfa", + "id": 1191, + "name": "ImageHashUpdated", + "nameLocation": "334:16:10", + "nodeType": "EventDefinition", + "parameters": { + "id": 1190, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1189, + "indexed": false, + "mutability": "mutable", + "name": "newImageHash", + "nameLocation": "359:12:10", + "nodeType": "VariableDeclaration", + "scope": 1191, + "src": "351:20:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1188, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "351:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "350:22:10" + }, + "src": "328:45:10" + }, + { + "errorSelector": "4294d127", + "id": 1193, + "name": "ImageHashIsZero", + "nameLocation": "395:15:10", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1192, + "nodeType": "ParameterList", + "parameters": [], + "src": "410:2:10" + }, + "src": "389:24:10" + }, + { + "errorSelector": "6085cd82", + "id": 1197, + "name": "InvalidSignatureType", + "nameLocation": "422:20:10", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1196, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1195, + "mutability": "mutable", + "name": "_type", + "nameLocation": "450:5:10", + "nodeType": "VariableDeclaration", + "scope": 1197, + "src": "443:12:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + }, + "typeName": { + "id": 1194, + "name": "bytes1", + "nodeType": "ElementaryTypeName", + "src": "443:6:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + }, + "visibility": "internal" + } + ], + "src": "442:14:10" + }, + "src": "416:41:10" + }, + { + "id": 1208, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "_signatureValidation", + "nameLocation": "470:20:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1202, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1199, + "mutability": "mutable", + "name": "_digest", + "nameLocation": "504:7:10", + "nodeType": "VariableDeclaration", + "scope": 1208, + "src": "496:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1198, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "496:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1201, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "532:10:10", + "nodeType": "VariableDeclaration", + "scope": 1208, + "src": "517:25:10", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1200, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "517:5:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "490:56:10" + }, + "returnParameters": { + "id": 1207, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1204, + "mutability": "mutable", + "name": "isValid", + "nameLocation": "588:7:10", + "nodeType": "VariableDeclaration", + "scope": 1208, + "src": "583:12:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1203, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "583:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1206, + "mutability": "mutable", + "name": "subdigest", + "nameLocation": "609:9:10", + "nodeType": "VariableDeclaration", + "scope": 1208, + "src": "601:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1205, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "601:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "577:45:10" + }, + "scope": 1249, + "src": "461:162:10", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "functionSelector": "853c5068", + "id": 1225, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "signatureRecovery", + "nameLocation": "636:17:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1213, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1210, + "mutability": "mutable", + "name": "_digest", + "nameLocation": "667:7:10", + "nodeType": "VariableDeclaration", + "scope": 1225, + "src": "659:15:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1209, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "659:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1212, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "695:10:10", + "nodeType": "VariableDeclaration", + "scope": 1225, + "src": "680:25:10", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1211, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "680:5:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "653:56:10" + }, + "returnParameters": { + "id": 1224, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1215, + "mutability": "mutable", + "name": "threshold", + "nameLocation": "752:9:10", + "nodeType": "VariableDeclaration", + "scope": 1225, + "src": "744:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1214, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "744:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1217, + "mutability": "mutable", + "name": "weight", + "nameLocation": "775:6:10", + "nodeType": "VariableDeclaration", + "scope": 1225, + "src": "767:14:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1216, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "767:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1219, + "mutability": "mutable", + "name": "imageHash", + "nameLocation": "795:9:10", + "nodeType": "VariableDeclaration", + "scope": 1225, + "src": "787:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1218, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "787:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1221, + "mutability": "mutable", + "name": "subdigest", + "nameLocation": "818:9:10", + "nodeType": "VariableDeclaration", + "scope": 1225, + "src": "810:17:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1220, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "810:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1223, + "mutability": "mutable", + "name": "checkpoint", + "nameLocation": "841:10:10", + "nodeType": "VariableDeclaration", + "scope": 1225, + "src": "833:18:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1222, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "833:7:10", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "738:117:10" + }, + "scope": 1249, + "src": "627:229:10", + "stateMutability": "view", + "virtual": true, + "visibility": "public" + }, + { + "body": { + "id": 1235, + "nodeType": "Block", + "src": "1034:23:10", + "statements": [ + { + "expression": { + "hexValue": "66616c7365", + "id": 1233, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1047:5:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + }, + "functionReturnParameters": 1232, + "id": 1234, + "nodeType": "Return", + "src": "1040:12:10" + } + ] + }, + "documentation": { + "id": 1226, + "nodeType": "StructuredDocumentation", + "src": "860:102:10", + "text": " @notice Validates the signature image\n @return true if the signature image is valid" + }, + "id": 1236, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_isValidImage", + "nameLocation": "974:13:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1229, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1228, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1236, + "src": "988:7:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1227, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "988:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "987:9:10" + }, + "returnParameters": { + "id": 1232, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1231, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1236, + "src": "1028:4:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1230, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1028:4:10", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1027:6:10" + }, + "scope": 1249, + "src": "965:92:10", + "stateMutability": "view", + "virtual": true, + "visibility": "internal" + }, + { + "documentation": { + "id": 1237, + "nodeType": "StructuredDocumentation", + "src": "1061:134:10", + "text": " @notice Updates the signers configuration of the wallet\n @param _imageHash New required image hash of the signature" + }, + "functionSelector": "29561426", + "id": 1242, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "updateImageHash", + "nameLocation": "1207:15:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1240, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1239, + "mutability": "mutable", + "name": "_imageHash", + "nameLocation": "1231:10:10", + "nodeType": "VariableDeclaration", + "scope": 1242, + "src": "1223:18:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1238, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1223:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1222:20:10" + }, + "returnParameters": { + "id": 1241, + "nodeType": "ParameterList", + "parameters": [], + "src": "1259:0:10" + }, + "scope": 1249, + "src": "1198:62:10", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "external" + }, + { + "documentation": { + "id": 1243, + "nodeType": "StructuredDocumentation", + "src": "1264:134:10", + "text": " @notice Updates the signers configuration of the wallet\n @param _imageHash New required image hash of the signature" + }, + "id": 1248, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "_updateImageHash", + "nameLocation": "1410:16:10", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1246, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1245, + "mutability": "mutable", + "name": "_imageHash", + "nameLocation": "1435:10:10", + "nodeType": "VariableDeclaration", + "scope": 1248, + "src": "1427:18:10", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1244, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1427:7:10", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1426:20:10" + }, + "returnParameters": { + "id": 1247, + "nodeType": "ParameterList", + "parameters": [], + "src": "1463:0:10" + }, + "scope": 1249, + "src": "1401:63:10", + "stateMutability": "nonpayable", + "virtual": true, + "visibility": "internal" + } + ], + "scope": 1250, + "src": "65:1401:10", + "usedErrors": [ + 1193, + 1197 + ] + } + ], + "src": "39:1428:10" + }, + "id": 10 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCalls.sol", + "exportedSymbols": { + "IModuleCalls": [ + 1313 + ] + }, + "id": 1314, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1251, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:11" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IModuleCalls", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 1313, + "linearizedBaseContracts": [ + 1313 + ], + "name": "IModuleCalls", + "nameLocation": "75:12:11", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "eventSelector": "ab46c69f7f32e1bf09b0725853da82a211e5402a0600296ab499a2fb5ea3b419", + "id": 1259, + "name": "TxFailed", + "nameLocation": "110:8:11", + "nodeType": "EventDefinition", + "parameters": { + "id": 1258, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1253, + "indexed": true, + "mutability": "mutable", + "name": "_tx", + "nameLocation": "135:3:11", + "nodeType": "VariableDeclaration", + "scope": 1259, + "src": "119:19:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1252, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "119:7:11", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1255, + "indexed": false, + "mutability": "mutable", + "name": "_index", + "nameLocation": "148:6:11", + "nodeType": "VariableDeclaration", + "scope": 1259, + "src": "140:14:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1254, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "140:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1257, + "indexed": false, + "mutability": "mutable", + "name": "_reason", + "nameLocation": "162:7:11", + "nodeType": "VariableDeclaration", + "scope": 1259, + "src": "156:13:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1256, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "156:5:11", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "118:52:11" + }, + "src": "104:67:11" + }, + { + "anonymous": false, + "eventSelector": "5c4eeb02dabf8976016ab414d617f9a162936dcace3cdef8c69ef6e262ad5ae7", + "id": 1265, + "name": "TxExecuted", + "nameLocation": "180:10:11", + "nodeType": "EventDefinition", + "parameters": { + "id": 1264, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1261, + "indexed": true, + "mutability": "mutable", + "name": "_tx", + "nameLocation": "207:3:11", + "nodeType": "VariableDeclaration", + "scope": 1265, + "src": "191:19:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1260, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "191:7:11", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1263, + "indexed": false, + "mutability": "mutable", + "name": "_index", + "nameLocation": "220:6:11", + "nodeType": "VariableDeclaration", + "scope": 1265, + "src": "212:14:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1262, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "212:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "190:37:11" + }, + "src": "174:54:11" + }, + { + "errorSelector": "2bb3e3ba", + "id": 1273, + "name": "NotEnoughGas", + "nameLocation": "250:12:11", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1272, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1267, + "mutability": "mutable", + "name": "_index", + "nameLocation": "271:6:11", + "nodeType": "VariableDeclaration", + "scope": 1273, + "src": "263:14:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1266, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "263:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1269, + "mutability": "mutable", + "name": "_requested", + "nameLocation": "287:10:11", + "nodeType": "VariableDeclaration", + "scope": 1273, + "src": "279:18:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1268, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "279:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1271, + "mutability": "mutable", + "name": "_available", + "nameLocation": "307:10:11", + "nodeType": "VariableDeclaration", + "scope": 1273, + "src": "299:18:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1270, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "299:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "262:56:11" + }, + "src": "244:75:11" + }, + { + "errorSelector": "8f4a234f", + "id": 1279, + "name": "InvalidSignature", + "nameLocation": "328:16:11", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1278, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1275, + "mutability": "mutable", + "name": "_hash", + "nameLocation": "353:5:11", + "nodeType": "VariableDeclaration", + "scope": 1279, + "src": "345:13:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1274, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "345:7:11", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1277, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "366:10:11", + "nodeType": "VariableDeclaration", + "scope": 1279, + "src": "360:16:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1276, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "360:5:11", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "344:33:11" + }, + "src": "322:56:11" + }, + { + "canonicalName": "IModuleCalls.Transaction", + "id": 1292, + "members": [ + { + "constant": false, + "id": 1281, + "mutability": "mutable", + "name": "delegateCall", + "nameLocation": "439:12:11", + "nodeType": "VariableDeclaration", + "scope": 1292, + "src": "434:17:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1280, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "434:4:11", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1283, + "mutability": "mutable", + "name": "revertOnError", + "nameLocation": "489:13:11", + "nodeType": "VariableDeclaration", + "scope": 1292, + "src": "484:18:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1282, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "484:4:11", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1285, + "mutability": "mutable", + "name": "gasLimit", + "nameLocation": "559:8:11", + "nodeType": "VariableDeclaration", + "scope": 1292, + "src": "551:16:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1284, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "551:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1287, + "mutability": "mutable", + "name": "target", + "nameLocation": "615:6:11", + "nodeType": "VariableDeclaration", + "scope": 1292, + "src": "607:14:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1286, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "607:7:11", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1289, + "mutability": "mutable", + "name": "value", + "nameLocation": "675:5:11", + "nodeType": "VariableDeclaration", + "scope": 1292, + "src": "667:13:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1288, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "667:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1291, + "mutability": "mutable", + "name": "data", + "nameLocation": "737:4:11", + "nodeType": "VariableDeclaration", + "scope": 1292, + "src": "731:10:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1290, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "731:5:11", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "name": "Transaction", + "nameLocation": "416:11:11", + "nodeType": "StructDefinition", + "scope": 1313, + "src": "409:366:11", + "visibility": "public" + }, + { + "documentation": { + "id": 1293, + "nodeType": "StructuredDocumentation", + "src": "779:223:11", + "text": " @notice Allow wallet owner to execute an action\n @param _txs Transactions to process\n @param _nonce Signature nonce (may contain an encoded space)\n @param _signature Encoded signature" + }, + "functionSelector": "7a9a1628", + "id": 1304, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "execute", + "nameLocation": "1014:7:11", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1302, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1297, + "mutability": "mutable", + "name": "_txs", + "nameLocation": "1050:4:11", + "nodeType": "VariableDeclaration", + "scope": 1304, + "src": "1027:27:11", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + }, + "typeName": { + "baseType": { + "id": 1295, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1294, + "name": "Transaction", + "nameLocations": [ + "1027:11:11" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "1027:11:11" + }, + "referencedDeclaration": 1292, + "src": "1027:11:11", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "id": 1296, + "nodeType": "ArrayTypeName", + "src": "1027:13:11", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_storage_$dyn_storage_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1299, + "mutability": "mutable", + "name": "_nonce", + "nameLocation": "1068:6:11", + "nodeType": "VariableDeclaration", + "scope": 1304, + "src": "1060:14:11", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1298, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1060:7:11", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1301, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "1095:10:11", + "nodeType": "VariableDeclaration", + "scope": 1304, + "src": "1080:25:11", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1300, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1080:5:11", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1021:88:11" + }, + "returnParameters": { + "id": 1303, + "nodeType": "ParameterList", + "parameters": [], + "src": "1118:0:11" + }, + "scope": 1313, + "src": "1005:114:11", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "documentation": { + "id": 1305, + "nodeType": "StructuredDocumentation", + "src": "1123:133:11", + "text": " @notice Allow wallet to execute an action\n without signing the message\n @param _txs Transactions to execute" + }, + "functionSelector": "61c2926c", + "id": 1312, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "selfExecute", + "nameLocation": "1268:11:11", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1310, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1309, + "mutability": "mutable", + "name": "_txs", + "nameLocation": "1308:4:11", + "nodeType": "VariableDeclaration", + "scope": 1312, + "src": "1285:27:11", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_calldata_ptr_$dyn_calldata_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + }, + "typeName": { + "baseType": { + "id": 1307, + "nodeType": "UserDefinedTypeName", + "pathNode": { + "id": 1306, + "name": "Transaction", + "nameLocations": [ + "1285:11:11" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1292, + "src": "1285:11:11" + }, + "referencedDeclaration": 1292, + "src": "1285:11:11", + "typeDescriptions": { + "typeIdentifier": "t_struct$_Transaction_$1292_storage_ptr", + "typeString": "struct IModuleCalls.Transaction" + } + }, + "id": 1308, + "nodeType": "ArrayTypeName", + "src": "1285:13:11", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_Transaction_$1292_storage_$dyn_storage_ptr", + "typeString": "struct IModuleCalls.Transaction[]" + } + }, + "visibility": "internal" + } + ], + "src": "1279:37:11" + }, + "returnParameters": { + "id": 1311, + "nodeType": "ParameterList", + "parameters": [], + "src": "1325:0:11" + }, + "scope": 1313, + "src": "1259:67:11", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 1314, + "src": "65:1263:11", + "usedErrors": [ + 1273, + 1279 + ] + } + ], + "src": "39:1290:11" + }, + "id": 11 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleCreator.sol", + "exportedSymbols": { + "IModuleCreator": [ + 1328 + ] + }, + "id": 1329, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1315, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:12" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "IModuleCreator", + "contractDependencies": [], + "contractKind": "interface", + "fullyImplemented": false, + "id": 1328, + "linearizedBaseContracts": [ + 1328 + ], + "name": "IModuleCreator", + "nameLocation": "75:14:12", + "nodeType": "ContractDefinition", + "nodes": [ + { + "errorSelector": "0d257191", + "id": 1319, + "name": "CreateFailed", + "nameLocation": "100:12:12", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1318, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1317, + "mutability": "mutable", + "name": "_code", + "nameLocation": "119:5:12", + "nodeType": "VariableDeclaration", + "scope": 1319, + "src": "113:11:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1316, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "113:5:12", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "112:13:12" + }, + "src": "94:32:12" + }, + { + "documentation": { + "id": 1320, + "nodeType": "StructuredDocumentation", + "src": "130:164:12", + "text": " @notice Creates a contract forwarding eth value\n @param _code Creation code of the contract\n @return addr The address of the created contract" + }, + "functionSelector": "90042baf", + "id": 1327, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "createContract", + "nameLocation": "306:14:12", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1323, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1322, + "mutability": "mutable", + "name": "_code", + "nameLocation": "336:5:12", + "nodeType": "VariableDeclaration", + "scope": 1327, + "src": "321:20:12", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1321, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "321:5:12", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "320:22:12" + }, + "returnParameters": { + "id": 1326, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1325, + "mutability": "mutable", + "name": "addr", + "nameLocation": "377:4:12", + "nodeType": "VariableDeclaration", + "scope": 1327, + "src": "369:12:12", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1324, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "369:7:12", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "368:14:12" + }, + "scope": 1328, + "src": "297:86:12", + "stateMutability": "payable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 1329, + "src": "65:320:12", + "usedErrors": [ + 1319 + ] + } + ], + "src": "39:347:12" + }, + "id": 12 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "exportedSymbols": { + "IERC1271Wallet": [ + 22 + ], + "LibBytes": [ + 2374 + ], + "LibBytesPointer": [ + 2476 + ], + "LibOptim": [ + 2530 + ], + "SequenceBaseSig": [ + 2021 + ], + "SignatureValidator": [ + 2798 + ] + }, + "id": 2022, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1330, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:13" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "file": "../../../../utils/SignatureValidator.sol", + "id": 1331, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2022, + "sourceUnit": 2799, + "src": "64:50:13", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "file": "../../../../utils/LibBytesPointer.sol", + "id": 1332, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2022, + "sourceUnit": 2477, + "src": "115:47:13", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "file": "../../../../utils/LibBytes.sol", + "id": 1333, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2022, + "sourceUnit": 2375, + "src": "163:40:13", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "file": "../../../../utils/LibOptim.sol", + "id": 1334, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2022, + "sourceUnit": 2531, + "src": "204:40:13", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "SequenceBaseSig", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 1335, + "nodeType": "StructuredDocumentation", + "src": "247:171:13", + "text": " @title SequenceBaseSig Library\n @author Agustin Aguilar (aa@horizon.io)\n @notice A Solidity implementation for handling signatures in the Sequence protocol." + }, + "fullyImplemented": true, + "id": 2021, + "linearizedBaseContracts": [ + 2021 + ], + "name": "SequenceBaseSig", + "nameLocation": "427:15:13", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 1338, + "libraryName": { + "id": 1336, + "name": "LibBytesPointer", + "nameLocations": [ + "453:15:13" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2476, + "src": "453:15:13" + }, + "nodeType": "UsingForDirective", + "src": "447:32:13", + "typeName": { + "id": 1337, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "473:5:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + } + }, + { + "constant": true, + "id": 1341, + "mutability": "constant", + "name": "FLAG_SIGNATURE", + "nameLocation": "508:14:13", + "nodeType": "VariableDeclaration", + "scope": 2021, + "src": "483:43:13", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1339, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "483:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "30", + "id": 1340, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "525:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 1344, + "mutability": "constant", + "name": "FLAG_ADDRESS", + "nameLocation": "555:12:13", + "nodeType": "VariableDeclaration", + "scope": 2021, + "src": "530:41:13", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1342, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "530:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "31", + "id": 1343, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "570:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 1347, + "mutability": "constant", + "name": "FLAG_DYNAMIC_SIGNATURE", + "nameLocation": "600:22:13", + "nodeType": "VariableDeclaration", + "scope": 2021, + "src": "575:51:13", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1345, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "575:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "32", + "id": 1346, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "625:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 1350, + "mutability": "constant", + "name": "FLAG_NODE", + "nameLocation": "655:9:13", + "nodeType": "VariableDeclaration", + "scope": 2021, + "src": "630:38:13", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1348, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "630:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "33", + "id": 1349, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "667:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 1353, + "mutability": "constant", + "name": "FLAG_BRANCH", + "nameLocation": "697:11:13", + "nodeType": "VariableDeclaration", + "scope": 2021, + "src": "672:40:13", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1351, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "672:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "34", + "id": 1352, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "711:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_4_by_1", + "typeString": "int_const 4" + }, + "value": "4" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 1356, + "mutability": "constant", + "name": "FLAG_SUBDIGEST", + "nameLocation": "741:14:13", + "nodeType": "VariableDeclaration", + "scope": 2021, + "src": "716:43:13", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1354, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "716:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "35", + "id": 1355, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "758:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_5_by_1", + "typeString": "int_const 5" + }, + "value": "5" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 1359, + "mutability": "constant", + "name": "FLAG_NESTED", + "nameLocation": "788:11:13", + "nodeType": "VariableDeclaration", + "scope": 2021, + "src": "763:40:13", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1357, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "763:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "36", + "id": 1358, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "802:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_6_by_1", + "typeString": "int_const 6" + }, + "value": "6" + }, + "visibility": "private" + }, + { + "errorSelector": "9a946232", + "id": 1367, + "name": "InvalidNestedSignature", + "nameLocation": "814:22:13", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1366, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1361, + "mutability": "mutable", + "name": "_hash", + "nameLocation": "845:5:13", + "nodeType": "VariableDeclaration", + "scope": 1367, + "src": "837:13:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1360, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "837:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1363, + "mutability": "mutable", + "name": "_addr", + "nameLocation": "860:5:13", + "nodeType": "VariableDeclaration", + "scope": 1367, + "src": "852:13:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1362, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "852:7:13", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1365, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "873:10:13", + "nodeType": "VariableDeclaration", + "scope": 1367, + "src": "867:16:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1364, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "867:5:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "836:48:13" + }, + "src": "808:77:13" + }, + { + "errorSelector": "b2505f7c", + "id": 1371, + "name": "InvalidSignatureFlag", + "nameLocation": "894:20:13", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 1370, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1369, + "mutability": "mutable", + "name": "_flag", + "nameLocation": "923:5:13", + "nodeType": "VariableDeclaration", + "scope": 1371, + "src": "915:13:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1368, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "915:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "914:15:13" + }, + "src": "888:42:13" + }, + { + "body": { + "id": 1393, + "nodeType": "Block", + "src": "1249:148:13", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "1901", + "id": 1382, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1305:10:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541", + "typeString": "literal_string hex\"1901\"" + }, + "value": "\u0019\u0001" + }, + { + "expression": { + "id": 1383, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967292, + "src": "1325:5:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1384, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1331:7:13", + "memberName": "chainid", + "nodeType": "MemberAccess", + "src": "1325:13:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 1387, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967268, + "src": "1356:4:13", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SequenceBaseSig_$2021", + "typeString": "library SequenceBaseSig" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_SequenceBaseSig_$2021", + "typeString": "library SequenceBaseSig" + } + ], + "id": 1386, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1348:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1385, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1348:7:13", + "typeDescriptions": {} + } + }, + "id": 1388, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1348:13:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1389, + "name": "_digest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1374, + "src": "1371:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541", + "typeString": "literal_string hex\"1901\"" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1380, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "1279:3:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1381, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "1283:12:13", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "1279:16:13", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 1390, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1279:107:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 1379, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "1262:9:13", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 1391, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1262:130:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 1378, + "id": 1392, + "nodeType": "Return", + "src": "1255:137:13" + } + ] + }, + "documentation": { + "id": 1372, + "nodeType": "StructuredDocumentation", + "src": "934:236:13", + "text": " @notice Generates a subdigest for the input digest (unique for this wallet and network).\n @param _digest The input digest to generate the subdigest from.\n @return bytes32 The subdigest generated from the input digest." + }, + "id": 1394, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "subdigest", + "nameLocation": "1182:9:13", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1375, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1374, + "mutability": "mutable", + "name": "_digest", + "nameLocation": "1205:7:13", + "nodeType": "VariableDeclaration", + "scope": 1394, + "src": "1197:15:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1373, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1197:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1191:25:13" + }, + "returnParameters": { + "id": 1378, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1377, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1394, + "src": "1240:7:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1376, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1240:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1239:9:13" + }, + "scope": 2021, + "src": "1173:224:13", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1423, + "nodeType": "Block", + "src": "1834:100:13", + "statements": [ + { + "id": 1422, + "nodeType": "UncheckedBlock", + "src": "1840:90:13", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1419, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1411, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 1408, + "name": "_weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1399, + "src": "1881:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + } + ], + "id": 1407, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1873:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 1406, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1873:7:13", + "typeDescriptions": {} + } + }, + "id": 1409, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1873:16:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<<", + "rightExpression": { + "hexValue": "313630", + "id": 1410, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1893:3:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_160_by_1", + "typeString": "int_const 160" + }, + "value": "160" + }, + "src": "1873:23:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "|", + "rightExpression": { + "arguments": [ + { + "arguments": [ + { + "id": 1416, + "name": "_addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1397, + "src": "1915:5:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 1415, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1907:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint160_$", + "typeString": "type(uint160)" + }, + "typeName": { + "id": 1414, + "name": "uint160", + "nodeType": "ElementaryTypeName", + "src": "1907:7:13", + "typeDescriptions": {} + } + }, + "id": 1417, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1907:14:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint160", + "typeString": "uint160" + } + ], + "id": 1413, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1899:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 1412, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1899:7:13", + "typeDescriptions": {} + } + }, + "id": 1418, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1899:23:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "1873:49:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1405, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1865:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1404, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1865:7:13", + "typeDescriptions": {} + } + }, + "id": 1420, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1865:58:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 1403, + "id": 1421, + "nodeType": "Return", + "src": "1858:65:13" + } + ] + } + ] + }, + "documentation": { + "id": 1395, + "nodeType": "StructuredDocumentation", + "src": "1401:321:13", + "text": " @notice Generates the leaf for an address and weight.\n @dev The leaf is generated by concatenating the address and weight.\n @param _addr The address to generate the leaf for.\n @param _weight The weight to generate the leaf for.\n @return bytes32 The leaf generated from the address and weight." + }, + "id": 1424, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_leafForAddressAndWeight", + "nameLocation": "1734:24:13", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1400, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1397, + "mutability": "mutable", + "name": "_addr", + "nameLocation": "1772:5:13", + "nodeType": "VariableDeclaration", + "scope": 1424, + "src": "1764:13:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1396, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1764:7:13", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1399, + "mutability": "mutable", + "name": "_weight", + "nameLocation": "1790:7:13", + "nodeType": "VariableDeclaration", + "scope": 1424, + "src": "1783:14:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + }, + "typeName": { + "id": 1398, + "name": "uint96", + "nodeType": "ElementaryTypeName", + "src": "1783:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + } + }, + "visibility": "internal" + } + ], + "src": "1758:43:13" + }, + "returnParameters": { + "id": 1403, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1402, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1424, + "src": "1825:7:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1401, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1825:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1824:9:13" + }, + "scope": 2021, + "src": "1725:209:13", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1440, + "nodeType": "Block", + "src": "2323:86:13", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "53657175656e636520737461746963206469676573743a0a", + "id": 1435, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2363:27:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_583557e68bca91e5400591dbc9ae31043113c95e3cd985463ae532f51d706f8c", + "typeString": "literal_string hex\"53657175656e636520737461746963206469676573743a0a\"" + }, + "value": "Sequence static digest:\n" + }, + { + "id": 1436, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1427, + "src": "2392:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_583557e68bca91e5400591dbc9ae31043113c95e3cd985463ae532f51d706f8c", + "typeString": "literal_string hex\"53657175656e636520737461746963206469676573743a0a\"" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1433, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "2346:3:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1434, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2350:12:13", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "2346:16:13", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 1437, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2346:57:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 1432, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "2336:9:13", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 1438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2336:68:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 1431, + "id": 1439, + "nodeType": "Return", + "src": "2329:75:13" + } + ] + }, + "documentation": { + "id": 1425, + "nodeType": "StructuredDocumentation", + "src": "1938:286:13", + "text": " @notice Generates the leaf for a hardcoded subdigest.\n @dev The leaf is generated by hashing 'Sequence static digest:\\n' and the subdigest.\n @param _subdigest The subdigest to generate the leaf for.\n @return bytes32 The leaf generated from the hardcoded subdigest." + }, + "id": 1441, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_leafForHardcodedSubdigest", + "nameLocation": "2236:26:13", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1428, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1427, + "mutability": "mutable", + "name": "_subdigest", + "nameLocation": "2276:10:13", + "nodeType": "VariableDeclaration", + "scope": 1441, + "src": "2268:18:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1426, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2268:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2262:28:13" + }, + "returnParameters": { + "id": 1431, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1430, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1441, + "src": "2314:7:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1429, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2314:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2313:9:13" + }, + "scope": 2021, + "src": "2227:182:13", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1463, + "nodeType": "Block", + "src": "2953:102:13", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "53657175656e6365206e657374656420636f6e6669673a0a", + "id": 1456, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2993:27:13", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_58d1832f15932b40f8da147bd99ac98efab990f25a786a2229b05ee5f5be41a7", + "typeString": "literal_string hex\"53657175656e6365206e657374656420636f6e6669673a0a\"" + }, + "value": "Sequence nested config:\n" + }, + { + "id": 1457, + "name": "_node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1444, + "src": "3022:5:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1458, + "name": "_threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1446, + "src": "3029:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1459, + "name": "_weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1448, + "src": "3041:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_58d1832f15932b40f8da147bd99ac98efab990f25a786a2229b05ee5f5be41a7", + "typeString": "literal_string hex\"53657175656e6365206e657374656420636f6e6669673a0a\"" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1454, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "2976:3:13", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 1455, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "2980:12:13", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "2976:16:13", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 1460, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2976:73:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 1453, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "2966:9:13", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 1461, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2966:84:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 1452, + "id": 1462, + "nodeType": "Return", + "src": "2959:91:13" + } + ] + }, + "documentation": { + "id": 1442, + "nodeType": "StructuredDocumentation", + "src": "2413:413:13", + "text": " @notice Generates the leaf for a nested tree node.\n @dev The leaf is generated by hashing 'Sequence nested config:\\n', the node, the threshold and the weight.\n @param _node The root of the node to generate the leaf for.\n @param _threshold The internal threshold of the tree.\n @param _weight The external weight of the tree.\n @return bytes32 The leaf generated from the nested tree." + }, + "id": 1464, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_leafForNested", + "nameLocation": "2838:14:13", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1449, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1444, + "mutability": "mutable", + "name": "_node", + "nameLocation": "2866:5:13", + "nodeType": "VariableDeclaration", + "scope": 1464, + "src": "2858:13:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1443, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2858:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1446, + "mutability": "mutable", + "name": "_threshold", + "nameLocation": "2885:10:13", + "nodeType": "VariableDeclaration", + "scope": 1464, + "src": "2877:18:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1445, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2877:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1448, + "mutability": "mutable", + "name": "_weight", + "nameLocation": "2909:7:13", + "nodeType": "VariableDeclaration", + "scope": 1464, + "src": "2901:15:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1447, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2901:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2852:68:13" + }, + "returnParameters": { + "id": 1452, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1451, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 1464, + "src": "2944:7:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1450, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2944:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "2943:9:13" + }, + "scope": 2021, + "src": "2829:226:13", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 1953, + "nodeType": "Block", + "src": "3672:4561:13", + "statements": [ + { + "id": 1952, + "nodeType": "UncheckedBlock", + "src": "3678:4551:13", + "statements": [ + { + "assignments": [ + 1477 + ], + "declarations": [ + { + "constant": false, + "id": 1477, + "mutability": "mutable", + "name": "rindex", + "nameLocation": "3704:6:13", + "nodeType": "VariableDeclaration", + "scope": 1952, + "src": "3696:14:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1476, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3696:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1478, + "nodeType": "VariableDeclarationStatement", + "src": "3696:14:13" + }, + { + "body": { + "id": 1950, + "nodeType": "Block", + "src": "3800:4423:13", + "statements": [ + { + "assignments": [ + 1484 + ], + "declarations": [ + { + "constant": false, + "id": 1484, + "mutability": "mutable", + "name": "flag", + "nameLocation": "3849:4:13", + "nodeType": "VariableDeclaration", + "scope": 1950, + "src": "3841:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1483, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3841:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1485, + "nodeType": "VariableDeclarationStatement", + "src": "3841:12:13" + }, + { + "expression": { + "id": 1493, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1486, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "3864:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1487, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "3870:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1488, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "3863:14:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1491, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "3901:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1489, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "3880:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1490, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3891:9:13", + "memberName": "readUint8", + "nodeType": "MemberAccess", + "referencedDeclaration": 2403, + "src": "3880:20:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint8_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint8,uint256)" + } + }, + "id": 1492, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3880:28:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint8_$_t_uint256_$", + "typeString": "tuple(uint8,uint256)" + } + }, + "src": "3863:45:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1494, + "nodeType": "ExpressionStatement", + "src": "3863:45:13" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1497, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1495, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "3923:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1496, + "name": "FLAG_ADDRESS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1344, + "src": "3931:12:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3923:20:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1539, + "nodeType": "IfStatement", + "src": "3919:402:13", + "trueBody": { + "id": 1538, + "nodeType": "Block", + "src": "3945:376:13", + "statements": [ + { + "assignments": [ + 1499 + ], + "declarations": [ + { + "constant": false, + "id": 1499, + "mutability": "mutable", + "name": "addrWeight", + "nameLocation": "3995:10:13", + "nodeType": "VariableDeclaration", + "scope": 1538, + "src": "3989:16:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 1498, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "3989:5:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 1500, + "nodeType": "VariableDeclarationStatement", + "src": "3989:16:13" + }, + { + "assignments": [ + 1502 + ], + "declarations": [ + { + "constant": false, + "id": 1502, + "mutability": "mutable", + "name": "addr", + "nameLocation": "4015:4:13", + "nodeType": "VariableDeclaration", + "scope": 1538, + "src": "4007:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1501, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4007:7:13", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 1503, + "nodeType": "VariableDeclarationStatement", + "src": "4007:12:13" + }, + { + "expression": { + "id": 1512, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1504, + "name": "addrWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1499, + "src": "4032:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 1505, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1502, + "src": "4044:4:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1506, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "4050:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1507, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "4031:26:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint8_$_t_address_$_t_uint256_$", + "typeString": "tuple(uint8,address,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1510, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "4088:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1508, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "4060:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1509, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4071:16:13", + "memberName": "readUint8Address", + "nodeType": "MemberAccess", + "referencedDeclaration": 2419, + "src": "4060:27:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint8_$_t_address_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint8,address,uint256)" + } + }, + "id": 1511, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4060:35:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint8_$_t_address_$_t_uint256_$", + "typeString": "tuple(uint8,address,uint256)" + } + }, + "src": "4031:64:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1513, + "nodeType": "ExpressionStatement", + "src": "4031:64:13" + }, + { + "assignments": [ + 1515 + ], + "declarations": [ + { + "constant": false, + "id": 1515, + "mutability": "mutable", + "name": "node", + "nameLocation": "4163:4:13", + "nodeType": "VariableDeclaration", + "scope": 1538, + "src": "4155:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1514, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4155:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1520, + "initialValue": { + "arguments": [ + { + "id": 1517, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1502, + "src": "4195:4:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1518, + "name": "addrWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1499, + "src": "4201:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + ], + "id": 1516, + "name": "_leafForAddressAndWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1424, + "src": "4170:24:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_address_$_t_uint96_$returns$_t_bytes32_$", + "typeString": "function (address,uint96) pure returns (bytes32)" + } + }, + "id": 1519, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4170:42:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4155:57:13" + }, + { + "expression": { + "id": 1535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1521, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "4224:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 1527, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1522, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "4231:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 1525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4247:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1524, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4239:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1523, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4239:7:13", + "typeDescriptions": {} + } + }, + "id": 1526, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4239:10:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "4231:18:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 1533, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1515, + "src": "4286:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1534, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "4231:59:13", + "trueExpression": { + "arguments": [ + { + "id": 1530, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "4272:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1531, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1515, + "src": "4278:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1528, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "4252:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 1529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4261:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "4252:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 1532, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4252:31:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "4224:66:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1536, + "nodeType": "ExpressionStatement", + "src": "4224:66:13" + }, + { + "id": 1537, + "nodeType": "Continue", + "src": "4302:8:13" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1542, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1540, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "4335:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1541, + "name": "FLAG_SIGNATURE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1341, + "src": "4343:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4335:22:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1605, + "nodeType": "IfStatement", + "src": "4331:679:13", + "trueBody": { + "id": 1604, + "nodeType": "Block", + "src": "4359:651:13", + "statements": [ + { + "assignments": [ + 1544 + ], + "declarations": [ + { + "constant": false, + "id": 1544, + "mutability": "mutable", + "name": "addrWeight", + "nameLocation": "4402:10:13", + "nodeType": "VariableDeclaration", + "scope": 1604, + "src": "4396:16:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 1543, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "4396:5:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 1545, + "nodeType": "VariableDeclarationStatement", + "src": "4396:16:13" + }, + { + "expression": { + "id": 1553, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1546, + "name": "addrWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1544, + "src": "4425:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 1547, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "4437:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1548, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "4424:20:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint8_$_t_uint256_$", + "typeString": "tuple(uint8,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1551, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "4468:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1549, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "4447:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1550, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4458:9:13", + "memberName": "readUint8", + "nodeType": "MemberAccess", + "referencedDeclaration": 2403, + "src": "4447:20:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint8_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint8,uint256)" + } + }, + "id": 1552, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4447:28:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint8_$_t_uint256_$", + "typeString": "tuple(uint8,uint256)" + } + }, + "src": "4424:51:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1554, + "nodeType": "ExpressionStatement", + "src": "4424:51:13" + }, + { + "assignments": [ + 1556 + ], + "declarations": [ + { + "constant": false, + "id": 1556, + "mutability": "mutable", + "name": "nrindex", + "nameLocation": "4550:7:13", + "nodeType": "VariableDeclaration", + "scope": 1604, + "src": "4542:15:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1555, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4542:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1560, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1557, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "4560:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "3636", + "id": 1558, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4569:2:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_66_by_1", + "typeString": "int_const 66" + }, + "value": "66" + }, + "src": "4560:11:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4542:29:13" + }, + { + "assignments": [ + 1562 + ], + "declarations": [ + { + "constant": false, + "id": 1562, + "mutability": "mutable", + "name": "addr", + "nameLocation": "4591:4:13", + "nodeType": "VariableDeclaration", + "scope": 1604, + "src": "4583:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1561, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4583:7:13", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 1571, + "initialValue": { + "arguments": [ + { + "id": 1565, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1467, + "src": "4631:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 1566, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "4643:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 1568, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1556, + "src": "4661:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1569, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "4643:26:13", + "startExpression": { + "id": 1567, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "4654:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "expression": { + "id": 1563, + "name": "SignatureValidator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2798, + "src": "4598:18:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SignatureValidator_$2798_$", + "typeString": "type(library SignatureValidator)" + } + }, + "id": 1564, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4617:13:13", + "memberName": "recoverSigner", + "nodeType": "MemberAccess", + "referencedDeclaration": 2715, + "src": "4598:32:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_address_$", + "typeString": "function (bytes32,bytes calldata) pure returns (address)" + } + }, + "id": 1570, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4598:72:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4583:87:13" + }, + { + "expression": { + "id": 1574, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1572, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "4682:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 1573, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1556, + "src": "4691:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4682:16:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1575, + "nodeType": "ExpressionStatement", + "src": "4682:16:13" + }, + { + "expression": { + "id": 1578, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1576, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1472, + "src": "4764:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "id": 1577, + "name": "addrWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1544, + "src": "4774:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "4764:20:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1579, + "nodeType": "ExpressionStatement", + "src": "4764:20:13" + }, + { + "assignments": [ + 1581 + ], + "declarations": [ + { + "constant": false, + "id": 1581, + "mutability": "mutable", + "name": "node", + "nameLocation": "4852:4:13", + "nodeType": "VariableDeclaration", + "scope": 1604, + "src": "4844:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1580, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4844:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1586, + "initialValue": { + "arguments": [ + { + "id": 1583, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1562, + "src": "4884:4:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1584, + "name": "addrWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1544, + "src": "4890:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + ], + "id": 1582, + "name": "_leafForAddressAndWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1424, + "src": "4859:24:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_address_$_t_uint96_$returns$_t_bytes32_$", + "typeString": "function (address,uint96) pure returns (bytes32)" + } + }, + "id": 1585, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4859:42:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4844:57:13" + }, + { + "expression": { + "id": 1601, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1587, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "4913:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 1593, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1588, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "4920:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 1591, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4936:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1590, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4928:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1589, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4928:7:13", + "typeDescriptions": {} + } + }, + "id": 1592, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4928:10:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "4920:18:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 1599, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1581, + "src": "4975:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1600, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "4920:59:13", + "trueExpression": { + "arguments": [ + { + "id": 1596, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "4961:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1597, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1581, + "src": "4967:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1594, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "4941:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 1595, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4950:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "4941:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 1598, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4941:31:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "4913:66:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1602, + "nodeType": "ExpressionStatement", + "src": "4913:66:13" + }, + { + "id": 1603, + "nodeType": "Continue", + "src": "4991:8:13" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1608, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1606, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "5024:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1607, + "name": "FLAG_DYNAMIC_SIGNATURE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1347, + "src": "5032:22:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5024:30:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1697, + "nodeType": "IfStatement", + "src": "5020:932:13", + "trueBody": { + "id": 1696, + "nodeType": "Block", + "src": "5056:896:13", + "statements": [ + { + "assignments": [ + 1610 + ], + "declarations": [ + { + "constant": false, + "id": 1610, + "mutability": "mutable", + "name": "addrWeight", + "nameLocation": "5110:10:13", + "nodeType": "VariableDeclaration", + "scope": 1696, + "src": "5104:16:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 1609, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "5104:5:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 1611, + "nodeType": "VariableDeclarationStatement", + "src": "5104:16:13" + }, + { + "assignments": [ + 1613 + ], + "declarations": [ + { + "constant": false, + "id": 1613, + "mutability": "mutable", + "name": "addr", + "nameLocation": "5130:4:13", + "nodeType": "VariableDeclaration", + "scope": 1696, + "src": "5122:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1612, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5122:7:13", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "id": 1614, + "nodeType": "VariableDeclarationStatement", + "src": "5122:12:13" + }, + { + "expression": { + "id": 1623, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1615, + "name": "addrWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1610, + "src": "5147:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 1616, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1613, + "src": "5159:4:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1617, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "5165:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1618, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "5146:26:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint8_$_t_address_$_t_uint256_$", + "typeString": "tuple(uint8,address,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1621, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "5203:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1619, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "5175:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1620, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5186:16:13", + "memberName": "readUint8Address", + "nodeType": "MemberAccess", + "referencedDeclaration": 2419, + "src": "5175:27:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint8_$_t_address_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint8,address,uint256)" + } + }, + "id": 1622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5175:35:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint8_$_t_address_$_t_uint256_$", + "typeString": "tuple(uint8,address,uint256)" + } + }, + "src": "5146:64:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1624, + "nodeType": "ExpressionStatement", + "src": "5146:64:13" + }, + { + "assignments": [ + 1626 + ], + "declarations": [ + { + "constant": false, + "id": 1626, + "mutability": "mutable", + "name": "size", + "nameLocation": "5264:4:13", + "nodeType": "VariableDeclaration", + "scope": 1696, + "src": "5256:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1625, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5256:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1627, + "nodeType": "VariableDeclarationStatement", + "src": "5256:12:13" + }, + { + "expression": { + "id": 1635, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1628, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1626, + "src": "5281:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1629, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "5287:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1630, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "5280:14:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1633, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "5319:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1631, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "5297:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1632, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5308:10:13", + "memberName": "readUint24", + "nodeType": "MemberAccess", + "referencedDeclaration": 2447, + "src": "5297:21:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint24_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint24,uint256)" + } + }, + "id": 1634, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5297:29:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint24_$_t_uint256_$", + "typeString": "tuple(uint24,uint256)" + } + }, + "src": "5280:46:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1636, + "nodeType": "ExpressionStatement", + "src": "5280:46:13" + }, + { + "assignments": [ + 1638 + ], + "declarations": [ + { + "constant": false, + "id": 1638, + "mutability": "mutable", + "name": "nrindex", + "nameLocation": "5388:7:13", + "nodeType": "VariableDeclaration", + "scope": 1696, + "src": "5380:15:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1637, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5380:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1642, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1641, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1639, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "5398:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 1640, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1626, + "src": "5407:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5398:13:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5380:31:13" + }, + { + "condition": { + "id": 1652, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "5427:82:13", + "subExpression": { + "arguments": [ + { + "id": 1645, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1467, + "src": "5464:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1646, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1613, + "src": "5476:4:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "baseExpression": { + "id": 1647, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "5482:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 1649, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1638, + "src": "5500:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1650, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "5482:26:13", + "startExpression": { + "id": 1648, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "5493:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "expression": { + "id": 1643, + "name": "SignatureValidator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2798, + "src": "5428:18:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SignatureValidator_$2798_$", + "typeString": "type(library SignatureValidator)" + } + }, + "id": 1644, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5447:16:13", + "memberName": "isValidSignature", + "nodeType": "MemberAccess", + "referencedDeclaration": 2797, + "src": "5428:35:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_address_$_t_bytes_calldata_ptr_$returns$_t_bool_$", + "typeString": "function (bytes32,address,bytes calldata) view returns (bool)" + } + }, + "id": 1651, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5428:81:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1663, + "nodeType": "IfStatement", + "src": "5423:190:13", + "trueBody": { + "id": 1662, + "nodeType": "Block", + "src": "5511:102:13", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 1654, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1467, + "src": "5555:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1655, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1613, + "src": "5567:4:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "baseExpression": { + "id": 1656, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "5573:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 1658, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1638, + "src": "5591:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1659, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "5573:26:13", + "startExpression": { + "id": 1657, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "5584:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "id": 1653, + "name": "InvalidNestedSignature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1367, + "src": "5532:22:13", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes32_$_t_address_$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes32,address,bytes memory) pure" + } + }, + "id": 1660, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5532:68:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1661, + "nodeType": "RevertStatement", + "src": "5525:75:13" + } + ] + } + }, + { + "expression": { + "id": 1666, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1664, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "5624:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 1665, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1638, + "src": "5633:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5624:16:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1667, + "nodeType": "ExpressionStatement", + "src": "5624:16:13" + }, + { + "expression": { + "id": 1670, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1668, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1472, + "src": "5706:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "id": 1669, + "name": "addrWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1610, + "src": "5716:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "5706:20:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1671, + "nodeType": "ExpressionStatement", + "src": "5706:20:13" + }, + { + "assignments": [ + 1673 + ], + "declarations": [ + { + "constant": false, + "id": 1673, + "mutability": "mutable", + "name": "node", + "nameLocation": "5794:4:13", + "nodeType": "VariableDeclaration", + "scope": 1696, + "src": "5786:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1672, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5786:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1678, + "initialValue": { + "arguments": [ + { + "id": 1675, + "name": "addr", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1613, + "src": "5826:4:13", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 1676, + "name": "addrWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1610, + "src": "5832:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + ], + "id": 1674, + "name": "_leafForAddressAndWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1424, + "src": "5801:24:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_address_$_t_uint96_$returns$_t_bytes32_$", + "typeString": "function (address,uint96) pure returns (bytes32)" + } + }, + "id": 1677, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5801:42:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5786:57:13" + }, + { + "expression": { + "id": 1693, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1679, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "5855:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 1685, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1680, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "5862:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 1683, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5878:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1682, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "5870:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1681, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "5870:7:13", + "typeDescriptions": {} + } + }, + "id": 1684, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5870:10:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "5862:18:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 1691, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1673, + "src": "5917:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1692, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "5862:59:13", + "trueExpression": { + "arguments": [ + { + "id": 1688, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "5903:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1689, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1673, + "src": "5909:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1686, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "5883:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 1687, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5892:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "5883:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 1690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5883:31:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "5855:66:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1694, + "nodeType": "ExpressionStatement", + "src": "5855:66:13" + }, + { + "id": 1695, + "nodeType": "Continue", + "src": "5933:8:13" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1700, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1698, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "5966:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1699, + "name": "FLAG_NODE", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1350, + "src": "5974:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5966:17:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1731, + "nodeType": "IfStatement", + "src": "5962:243:13", + "trueBody": { + "id": 1730, + "nodeType": "Block", + "src": "5985:220:13", + "statements": [ + { + "assignments": [ + 1702 + ], + "declarations": [ + { + "constant": false, + "id": 1702, + "mutability": "mutable", + "name": "node", + "nameLocation": "6033:4:13", + "nodeType": "VariableDeclaration", + "scope": 1730, + "src": "6025:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1701, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6025:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1703, + "nodeType": "VariableDeclarationStatement", + "src": "6025:12:13" + }, + { + "expression": { + "id": 1711, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1704, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1702, + "src": "6050:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1705, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6056:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1706, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "6049:14:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(bytes32,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1709, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6089:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1707, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "6066:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1708, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6077:11:13", + "memberName": "readBytes32", + "nodeType": "MemberAccess", + "referencedDeclaration": 2475, + "src": "6066:22:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_bytes32_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (bytes32,uint256)" + } + }, + "id": 1710, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6066:30:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(bytes32,uint256)" + } + }, + "src": "6049:47:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1712, + "nodeType": "ExpressionStatement", + "src": "6049:47:13" + }, + { + "expression": { + "id": 1727, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1713, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "6108:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 1719, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1714, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "6115:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 1717, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6131:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1716, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "6123:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1715, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6123:7:13", + "typeDescriptions": {} + } + }, + "id": 1718, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6123:10:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "6115:18:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 1725, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1702, + "src": "6170:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1726, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "6115:59:13", + "trueExpression": { + "arguments": [ + { + "id": 1722, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "6156:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1723, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1702, + "src": "6162:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1720, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "6136:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 1721, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6145:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "6136:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 1724, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6136:31:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "6108:66:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1728, + "nodeType": "ExpressionStatement", + "src": "6108:66:13" + }, + { + "id": 1729, + "nodeType": "Continue", + "src": "6186:8:13" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1732, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "6219:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1733, + "name": "FLAG_BRANCH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1353, + "src": "6227:11:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6219:19:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1789, + "nodeType": "IfStatement", + "src": "6215:472:13", + "trueBody": { + "id": 1788, + "nodeType": "Block", + "src": "6240:447:13", + "statements": [ + { + "assignments": [ + 1736 + ], + "declarations": [ + { + "constant": false, + "id": 1736, + "mutability": "mutable", + "name": "size", + "nameLocation": "6317:4:13", + "nodeType": "VariableDeclaration", + "scope": 1788, + "src": "6309:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1735, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6309:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1737, + "nodeType": "VariableDeclarationStatement", + "src": "6309:12:13" + }, + { + "expression": { + "id": 1745, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1738, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1736, + "src": "6334:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1739, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6340:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1740, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "6333:14:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1743, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6372:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1741, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "6350:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1742, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6361:10:13", + "memberName": "readUint24", + "nodeType": "MemberAccess", + "referencedDeclaration": 2447, + "src": "6350:21:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint24_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint24,uint256)" + } + }, + "id": 1744, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6350:29:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint24_$_t_uint256_$", + "typeString": "tuple(uint24,uint256)" + } + }, + "src": "6333:46:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1746, + "nodeType": "ExpressionStatement", + "src": "6333:46:13" + }, + { + "assignments": [ + 1748 + ], + "declarations": [ + { + "constant": false, + "id": 1748, + "mutability": "mutable", + "name": "nrindex", + "nameLocation": "6399:7:13", + "nodeType": "VariableDeclaration", + "scope": 1788, + "src": "6391:15:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1747, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6391:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1752, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1751, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1749, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6409:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 1750, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1736, + "src": "6418:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6409:13:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6391:31:13" + }, + { + "assignments": [ + 1754 + ], + "declarations": [ + { + "constant": false, + "id": 1754, + "mutability": "mutable", + "name": "nweight", + "nameLocation": "6443:7:13", + "nodeType": "VariableDeclaration", + "scope": 1788, + "src": "6435:15:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1753, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6435:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1755, + "nodeType": "VariableDeclarationStatement", + "src": "6435:15:13" + }, + { + "assignments": [ + 1757 + ], + "declarations": [ + { + "constant": false, + "id": 1757, + "mutability": "mutable", + "name": "node", + "nameLocation": "6460:4:13", + "nodeType": "VariableDeclaration", + "scope": 1788, + "src": "6452:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1756, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "6452:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1758, + "nodeType": "VariableDeclarationStatement", + "src": "6452:12:13" + }, + { + "expression": { + "id": 1769, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1759, + "name": "nweight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1754, + "src": "6477:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1760, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1757, + "src": "6486:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 1761, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "6476:15:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes32_$", + "typeString": "tuple(uint256,bytes32)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1763, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1467, + "src": "6508:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 1764, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "6520:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 1766, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1748, + "src": "6538:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1767, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "6520:26:13", + "startExpression": { + "id": 1765, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6531:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "id": 1762, + "name": "recoverBranch", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1954, + "src": "6494:13:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_bytes32_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,bytes32)" + } + }, + "id": 1768, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6494:53:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes32_$", + "typeString": "tuple(uint256,bytes32)" + } + }, + "src": "6476:71:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1770, + "nodeType": "ExpressionStatement", + "src": "6476:71:13" + }, + { + "expression": { + "id": 1773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1771, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1472, + "src": "6560:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "id": 1772, + "name": "nweight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1754, + "src": "6570:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6560:17:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1774, + "nodeType": "ExpressionStatement", + "src": "6560:17:13" + }, + { + "expression": { + "id": 1781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1775, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "6589:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1778, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "6616:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1779, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1757, + "src": "6622:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1776, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "6596:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 1777, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6605:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "6596:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 1780, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6596:31:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "6589:38:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1782, + "nodeType": "ExpressionStatement", + "src": "6589:38:13" + }, + { + "expression": { + "id": 1785, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1783, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6640:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 1784, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1748, + "src": "6649:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6640:16:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1786, + "nodeType": "ExpressionStatement", + "src": "6640:16:13" + }, + { + "id": 1787, + "nodeType": "Continue", + "src": "6668:8:13" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1790, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "6701:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1791, + "name": "FLAG_NESTED", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1359, + "src": "6709:11:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6701:19:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1892, + "nodeType": "IfStatement", + "src": "6697:979:13", + "trueBody": { + "id": 1891, + "nodeType": "Block", + "src": "6722:954:13", + "statements": [ + { + "assignments": [ + 1794 + ], + "declarations": [ + { + "constant": false, + "id": 1794, + "mutability": "mutable", + "name": "externalWeight", + "nameLocation": "6872:14:13", + "nodeType": "VariableDeclaration", + "scope": 1891, + "src": "6864:22:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1793, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6864:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1795, + "nodeType": "VariableDeclarationStatement", + "src": "6864:22:13" + }, + { + "expression": { + "id": 1803, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1796, + "name": "externalWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1794, + "src": "6899:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1797, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6915:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1798, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "6898:24:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1801, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "6946:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1799, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "6925:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1800, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "6936:9:13", + "memberName": "readUint8", + "nodeType": "MemberAccess", + "referencedDeclaration": 2403, + "src": "6925:20:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint8_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint8,uint256)" + } + }, + "id": 1802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "6925:28:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint8_$_t_uint256_$", + "typeString": "tuple(uint8,uint256)" + } + }, + "src": "6898:55:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1804, + "nodeType": "ExpressionStatement", + "src": "6898:55:13" + }, + { + "assignments": [ + 1806 + ], + "declarations": [ + { + "constant": false, + "id": 1806, + "mutability": "mutable", + "name": "internalThreshold", + "nameLocation": "6974:17:13", + "nodeType": "VariableDeclaration", + "scope": 1891, + "src": "6966:25:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1805, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6966:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1807, + "nodeType": "VariableDeclarationStatement", + "src": "6966:25:13" + }, + { + "expression": { + "id": 1815, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1808, + "name": "internalThreshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1806, + "src": "7004:17:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1809, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7023:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1810, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "7003:27:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1813, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7055:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1811, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "7033:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1812, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7044:10:13", + "memberName": "readUint16", + "nodeType": "MemberAccess", + "referencedDeclaration": 2433, + "src": "7033:21:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint16_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint16,uint256)" + } + }, + "id": 1814, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7033:29:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint16_$_t_uint256_$", + "typeString": "tuple(uint16,uint256)" + } + }, + "src": "7003:59:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1816, + "nodeType": "ExpressionStatement", + "src": "7003:59:13" + }, + { + "assignments": [ + 1818 + ], + "declarations": [ + { + "constant": false, + "id": 1818, + "mutability": "mutable", + "name": "size", + "nameLocation": "7083:4:13", + "nodeType": "VariableDeclaration", + "scope": 1891, + "src": "7075:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1817, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7075:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1819, + "nodeType": "VariableDeclarationStatement", + "src": "7075:12:13" + }, + { + "expression": { + "id": 1827, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1820, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1818, + "src": "7100:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1821, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7106:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1822, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "7099:14:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1825, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7138:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1823, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "7116:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1824, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7127:10:13", + "memberName": "readUint24", + "nodeType": "MemberAccess", + "referencedDeclaration": 2447, + "src": "7116:21:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint24_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint24,uint256)" + } + }, + "id": 1826, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7116:29:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint24_$_t_uint256_$", + "typeString": "tuple(uint24,uint256)" + } + }, + "src": "7099:46:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1828, + "nodeType": "ExpressionStatement", + "src": "7099:46:13" + }, + { + "assignments": [ + 1830 + ], + "declarations": [ + { + "constant": false, + "id": 1830, + "mutability": "mutable", + "name": "nrindex", + "nameLocation": "7165:7:13", + "nodeType": "VariableDeclaration", + "scope": 1891, + "src": "7157:15:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1829, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7157:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1834, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1833, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1831, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7175:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 1832, + "name": "size", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1818, + "src": "7184:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7175:13:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7157:31:13" + }, + { + "assignments": [ + 1836 + ], + "declarations": [ + { + "constant": false, + "id": 1836, + "mutability": "mutable", + "name": "internalWeight", + "nameLocation": "7209:14:13", + "nodeType": "VariableDeclaration", + "scope": 1891, + "src": "7201:22:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1835, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7201:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 1837, + "nodeType": "VariableDeclarationStatement", + "src": "7201:22:13" + }, + { + "assignments": [ + 1839 + ], + "declarations": [ + { + "constant": false, + "id": 1839, + "mutability": "mutable", + "name": "internalRoot", + "nameLocation": "7233:12:13", + "nodeType": "VariableDeclaration", + "scope": 1891, + "src": "7225:20:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1838, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7225:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1840, + "nodeType": "VariableDeclarationStatement", + "src": "7225:20:13" + }, + { + "expression": { + "id": 1851, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1841, + "name": "internalWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1836, + "src": "7258:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1842, + "name": "internalRoot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1839, + "src": "7274:12:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 1843, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "7257:30:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes32_$", + "typeString": "tuple(uint256,bytes32)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1845, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1467, + "src": "7304:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 1846, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "7316:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 1848, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1830, + "src": "7334:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1849, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "7316:26:13", + "startExpression": { + "id": 1847, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7327:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "id": 1844, + "name": "recoverBranch", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1954, + "src": "7290:13:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_bytes32_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,bytes32)" + } + }, + "id": 1850, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7290:53:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes32_$", + "typeString": "tuple(uint256,bytes32)" + } + }, + "src": "7257:86:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1852, + "nodeType": "ExpressionStatement", + "src": "7257:86:13" + }, + { + "expression": { + "id": 1855, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1853, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7355:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 1854, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1830, + "src": "7364:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7355:16:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1856, + "nodeType": "ExpressionStatement", + "src": "7355:16:13" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1859, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1857, + "name": "internalWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1836, + "src": "7388:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 1858, + "name": "internalThreshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1806, + "src": "7406:17:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7388:35:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1865, + "nodeType": "IfStatement", + "src": "7384:92:13", + "trueBody": { + "id": 1864, + "nodeType": "Block", + "src": "7425:51:13", + "statements": [ + { + "expression": { + "id": 1862, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1860, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1472, + "src": "7439:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "+=", + "rightHandSide": { + "id": 1861, + "name": "externalWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1794, + "src": "7449:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7439:24:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1863, + "nodeType": "ExpressionStatement", + "src": "7439:24:13" + } + ] + } + }, + { + "assignments": [ + 1867 + ], + "declarations": [ + { + "constant": false, + "id": 1867, + "mutability": "mutable", + "name": "node", + "nameLocation": "7496:4:13", + "nodeType": "VariableDeclaration", + "scope": 1891, + "src": "7488:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1866, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7488:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1873, + "initialValue": { + "arguments": [ + { + "id": 1869, + "name": "internalRoot", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1839, + "src": "7518:12:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1870, + "name": "internalThreshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1806, + "src": "7532:17:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1871, + "name": "externalWeight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1794, + "src": "7551:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1868, + "name": "_leafForNested", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1464, + "src": "7503:14:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint256_$_t_uint256_$returns$_t_bytes32_$", + "typeString": "function (bytes32,uint256,uint256) pure returns (bytes32)" + } + }, + "id": 1872, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7503:63:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7488:78:13" + }, + { + "expression": { + "id": 1888, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1874, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "7578:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 1880, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1875, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "7585:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 1878, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7601:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1877, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7593:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1876, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7593:7:13", + "typeDescriptions": {} + } + }, + "id": 1879, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7593:10:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "7585:18:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 1886, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1867, + "src": "7640:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1887, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "7585:59:13", + "trueExpression": { + "arguments": [ + { + "id": 1883, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "7626:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1884, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1867, + "src": "7632:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1881, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "7606:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 1882, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7615:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "7606:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 1885, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7606:31:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "7578:66:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1889, + "nodeType": "ExpressionStatement", + "src": "7578:66:13" + }, + { + "id": 1890, + "nodeType": "Continue", + "src": "7657:8:13" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1895, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1893, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "7690:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1894, + "name": "FLAG_SUBDIGEST", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1356, + "src": "7698:14:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7690:22:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1945, + "nodeType": "IfStatement", + "src": "7686:485:13", + "trueBody": { + "id": 1944, + "nodeType": "Block", + "src": "7714:457:13", + "statements": [ + { + "assignments": [ + 1897 + ], + "declarations": [ + { + "constant": false, + "id": 1897, + "mutability": "mutable", + "name": "hardcoded", + "nameLocation": "7831:9:13", + "nodeType": "VariableDeclaration", + "scope": 1944, + "src": "7823:17:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1896, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "7823:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1898, + "nodeType": "VariableDeclarationStatement", + "src": "7823:17:13" + }, + { + "expression": { + "id": 1906, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1899, + "name": "hardcoded", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1897, + "src": "7853:9:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1900, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7864:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1901, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "7852:19:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(bytes32,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1904, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "7897:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 1902, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "7874:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1903, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "7885:11:13", + "memberName": "readBytes32", + "nodeType": "MemberAccess", + "referencedDeclaration": 2475, + "src": "7874:22:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_bytes32_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (bytes32,uint256)" + } + }, + "id": 1905, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7874:30:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(bytes32,uint256)" + } + }, + "src": "7852:52:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1907, + "nodeType": "ExpressionStatement", + "src": "7852:52:13" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 1910, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1908, + "name": "hardcoded", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1897, + "src": "7920:9:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 1909, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1467, + "src": "7933:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "7920:23:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1920, + "nodeType": "IfStatement", + "src": "7916:82:13", + "trueBody": { + "id": 1919, + "nodeType": "Block", + "src": "7945:53:13", + "statements": [ + { + "expression": { + "id": 1917, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1911, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1472, + "src": "7959:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "expression": { + "arguments": [ + { + "id": 1914, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7973:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 1913, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7973:7:13", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + } + ], + "id": 1912, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967269, + "src": "7968:4:13", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 1915, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "7968:13:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint256", + "typeString": "type(uint256)" + } + }, + "id": 1916, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "7982:3:13", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "7968:17:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7959:26:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1918, + "nodeType": "ExpressionStatement", + "src": "7959:26:13" + } + ] + } + }, + { + "assignments": [ + 1922 + ], + "declarations": [ + { + "constant": false, + "id": 1922, + "mutability": "mutable", + "name": "node", + "nameLocation": "8018:4:13", + "nodeType": "VariableDeclaration", + "scope": 1944, + "src": "8010:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1921, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8010:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 1926, + "initialValue": { + "arguments": [ + { + "id": 1924, + "name": "hardcoded", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1897, + "src": "8052:9:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 1923, + "name": "_leafForHardcodedSubdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1441, + "src": "8025:26:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) pure returns (bytes32)" + } + }, + "id": 1925, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8025:37:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8010:52:13" + }, + { + "expression": { + "id": 1941, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1927, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "8074:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "condition": { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 1933, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1928, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "8081:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "arguments": [ + { + "hexValue": "30", + "id": 1931, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8097:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1930, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8089:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 1929, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8089:7:13", + "typeDescriptions": {} + } + }, + "id": 1932, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8089:10:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "8081:18:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "id": 1939, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1922, + "src": "8136:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1940, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "8081:59:13", + "trueExpression": { + "arguments": [ + { + "id": 1936, + "name": "root", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1474, + "src": "8122:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 1937, + "name": "node", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1922, + "src": "8128:4:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1934, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "8102:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 1935, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "8111:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "8102:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 1938, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8102:31:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "8074:66:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 1942, + "nodeType": "ExpressionStatement", + "src": "8074:66:13" + }, + { + "id": 1943, + "nodeType": "Continue", + "src": "8152:8:13" + } + ] + } + }, + { + "errorCall": { + "arguments": [ + { + "id": 1947, + "name": "flag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1484, + "src": "8209:4:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1946, + "name": "InvalidSignatureFlag", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1371, + "src": "8188:20:13", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$returns$__$", + "typeString": "function (uint256) pure" + } + }, + "id": 1948, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "8188:26:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1949, + "nodeType": "RevertStatement", + "src": "8181:33:13" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1482, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 1479, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1477, + "src": "3772:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "expression": { + "id": 1480, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1469, + "src": "3781:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1481, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3792:6:13", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "3781:17:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3772:26:13", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1951, + "nodeType": "WhileStatement", + "src": "3765:4458:13" + } + ] + } + ] + }, + "documentation": { + "id": 1465, + "nodeType": "StructuredDocumentation", + "src": "3059:463:13", + "text": " @notice Returns the weight and root of a signature branch.\n @dev If the signature contains a hardcoded subdigest, and it matches the input digest, then the weight is set to 2 ** 256 - 1.\n @param _subdigest The digest to verify the signature against.\n @param _signature The signature branch to recover.\n @return weight The total weight of the recovered signatures.\n @return root The root hash of the recovered configuration." + }, + "id": 1954, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "recoverBranch", + "nameLocation": "3534:13:13", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1470, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1467, + "mutability": "mutable", + "name": "_subdigest", + "nameLocation": "3561:10:13", + "nodeType": "VariableDeclaration", + "scope": 1954, + "src": "3553:18:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1466, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3553:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1469, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "3592:10:13", + "nodeType": "VariableDeclaration", + "scope": 1954, + "src": "3577:25:13", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1468, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3577:5:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "3547:59:13" + }, + "returnParameters": { + "id": 1475, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1472, + "mutability": "mutable", + "name": "weight", + "nameLocation": "3643:6:13", + "nodeType": "VariableDeclaration", + "scope": 1954, + "src": "3635:14:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1471, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3635:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1474, + "mutability": "mutable", + "name": "root", + "nameLocation": "3663:4:13", + "nodeType": "VariableDeclaration", + "scope": 1954, + "src": "3655:12:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1473, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "3655:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "3629:42:13" + }, + "scope": 2021, + "src": "3525:4708:13", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2019, + "nodeType": "Block", + "src": "9085:449:13", + "statements": [ + { + "id": 2018, + "nodeType": "UncheckedBlock", + "src": "9091:439:13", + "statements": [ + { + "expression": { + "id": 1979, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 1970, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1964, + "src": "9110:6:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 1971, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1966, + "src": "9118:9:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "id": 1972, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "9109:19:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes32_$", + "typeString": "tuple(uint256,bytes32)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1974, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1957, + "src": "9145:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 1975, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1959, + "src": "9157:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 1977, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "9157:14:13", + "startExpression": { + "hexValue": "36", + "id": 1976, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9168:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_6_by_1", + "typeString": "int_const 6" + }, + "value": "6" + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "id": 1973, + "name": "recoverBranch", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1954, + "src": "9131:13:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_bytes32_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,bytes32)" + } + }, + "id": 1978, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9131:41:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_bytes32_$", + "typeString": "tuple(uint256,bytes32)" + } + }, + "src": "9109:63:13", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1980, + "nodeType": "ExpressionStatement", + "src": "9109:63:13" + }, + { + "expression": { + "id": 1986, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1981, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1962, + "src": "9278:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1984, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1959, + "src": "9315:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "expression": { + "id": 1982, + "name": "LibBytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2374, + "src": "9290:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibBytes_$2374_$", + "typeString": "type(library LibBytes)" + } + }, + "id": 1983, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9299:15:13", + "memberName": "readFirstUint16", + "nodeType": "MemberAccess", + "referencedDeclaration": 2361, + "src": "9290:24:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$returns$_t_uint16_$", + "typeString": "function (bytes calldata) pure returns (uint16)" + } + }, + "id": 1985, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9290:36:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + }, + "src": "9278:48:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1987, + "nodeType": "ExpressionStatement", + "src": "9278:48:13" + }, + { + "expression": { + "id": 1994, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1988, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1968, + "src": "9334:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1991, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1959, + "src": "9367:10:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "hexValue": "32", + "id": 1992, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9379:1:13", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + } + ], + "expression": { + "id": 1989, + "name": "LibBytes", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2374, + "src": "9347:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibBytes_$2374_$", + "typeString": "type(library LibBytes)" + } + }, + "id": 1990, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9356:10:13", + "memberName": "readUint32", + "nodeType": "MemberAccess", + "referencedDeclaration": 2373, + "src": "9347:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint32_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint32)" + } + }, + "id": 1993, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9347:34:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "src": "9334:47:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1995, + "nodeType": "ExpressionStatement", + "src": "9334:47:13" + }, + { + "expression": { + "id": 2005, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 1996, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1966, + "src": "9390:9:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 1999, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1966, + "src": "9422:9:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "id": 2002, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1962, + "src": "9441:9:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2001, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9433:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 2000, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "9433:7:13", + "typeDescriptions": {} + } + }, + "id": 2003, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9433:18:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 1997, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "9402:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 1998, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9411:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "9402:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 2004, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9402:50:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "9390:62:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 2006, + "nodeType": "ExpressionStatement", + "src": "9390:62:13" + }, + { + "expression": { + "id": 2016, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2007, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1966, + "src": "9460:9:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2010, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1966, + "src": "9492:9:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "arguments": [ + { + "id": 2013, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1968, + "src": "9511:10:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2012, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9503:7:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 2011, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "9503:7:13", + "typeDescriptions": {} + } + }, + "id": 2014, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9503:19:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 2008, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "9472:8:13", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 2009, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "9481:10:13", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "9472:19:13", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 2015, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "9472:51:13", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "9460:63:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "id": 2017, + "nodeType": "ExpressionStatement", + "src": "9460:63:13" + } + ] + } + ] + }, + "documentation": { + "id": 1955, + "nodeType": "StructuredDocumentation", + "src": "8237:652:13", + "text": " @notice Returns the threshold, weight, root, and checkpoint of a signature.\n @dev To verify the signature, the weight must be greater than or equal to the threshold, and the root\n must match the expected `imageHash` of the wallet.\n @param _subdigest The digest to verify the signature against.\n @param _signature The signature to recover.\n @return threshold The minimum weight required for the signature to be valid.\n @return weight The total weight of the recovered signatures.\n @return imageHash The root hash of the recovered configuration\n @return checkpoint The checkpoint of the signature." + }, + "id": 2020, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "recover", + "nameLocation": "8901:7:13", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 1960, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1957, + "mutability": "mutable", + "name": "_subdigest", + "nameLocation": "8922:10:13", + "nodeType": "VariableDeclaration", + "scope": 2020, + "src": "8914:18:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1956, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "8914:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1959, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "8953:10:13", + "nodeType": "VariableDeclaration", + "scope": 2020, + "src": "8938:25:13", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 1958, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "8938:5:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "8908:59:13" + }, + "returnParameters": { + "id": 1969, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1962, + "mutability": "mutable", + "name": "threshold", + "nameLocation": "9004:9:13", + "nodeType": "VariableDeclaration", + "scope": 2020, + "src": "8996:17:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1961, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8996:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1964, + "mutability": "mutable", + "name": "weight", + "nameLocation": "9027:6:13", + "nodeType": "VariableDeclaration", + "scope": 2020, + "src": "9019:14:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1963, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9019:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1966, + "mutability": "mutable", + "name": "imageHash", + "nameLocation": "9047:9:13", + "nodeType": "VariableDeclaration", + "scope": 2020, + "src": "9039:17:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 1965, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "9039:7:13", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 1968, + "mutability": "mutable", + "name": "checkpoint", + "nameLocation": "9070:10:13", + "nodeType": "VariableDeclaration", + "scope": 2020, + "src": "9062:18:13", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1967, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9062:7:13", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "8990:94:13" + }, + "scope": 2021, + "src": "8892:642:13", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2022, + "src": "419:9117:13", + "usedErrors": [ + 1367, + 1371 + ] + } + ], + "src": "39:9498:13" + }, + "id": 13 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol", + "exportedSymbols": { + "IERC1271Wallet": [ + 22 + ], + "IModuleAuth": [ + 1249 + ], + "LibBytes": [ + 2374 + ], + "LibBytesPointer": [ + 2476 + ], + "LibOptim": [ + 2530 + ], + "ModuleSelfAuth": [ + 1116 + ], + "ModuleStorage": [ + 1179 + ], + "SequenceBaseSig": [ + 2021 + ], + "SequenceChainedSig": [ + 2218 + ], + "SignatureValidator": [ + 2798 + ] + }, + "id": 2219, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2023, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:14" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "file": "./SequenceBaseSig.sol", + "id": 2024, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2219, + "sourceUnit": 2022, + "src": "64:31:14", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/interfaces/IModuleAuth.sol", + "file": "../../interfaces/IModuleAuth.sol", + "id": 2025, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2219, + "sourceUnit": 1250, + "src": "97:42:14", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleSelfAuth.sol", + "file": "../../ModuleSelfAuth.sol", + "id": 2026, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2219, + "sourceUnit": 1117, + "src": "141:34:14", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/ModuleStorage.sol", + "file": "../../ModuleStorage.sol", + "id": 2027, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2219, + "sourceUnit": 1180, + "src": "176:33:14", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "file": "../../../../utils/LibBytesPointer.sol", + "id": 2028, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2219, + "sourceUnit": 2477, + "src": "211:47:14", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "file": "../../../../utils/LibOptim.sol", + "id": 2029, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2219, + "sourceUnit": 2531, + "src": "259:40:14", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": true, + "baseContracts": [ + { + "baseName": { + "id": 2031, + "name": "IModuleAuth", + "nameLocations": [ + "743:11:14" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1249, + "src": "743:11:14" + }, + "id": 2032, + "nodeType": "InheritanceSpecifier", + "src": "743:11:14" + }, + { + "baseName": { + "id": 2033, + "name": "ModuleSelfAuth", + "nameLocations": [ + "756:14:14" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 1116, + "src": "756:14:14" + }, + "id": 2034, + "nodeType": "InheritanceSpecifier", + "src": "756:14:14" + } + ], + "canonicalName": "SequenceChainedSig", + "contractDependencies": [], + "contractKind": "contract", + "documentation": { + "id": 2030, + "nodeType": "StructuredDocumentation", + "src": "301:401:14", + "text": " @title Sequence chained auth recovery submodule\n @author Agustin Aguilar (aa@horizon.io)\n @notice Defines Sequence signatures that work by delegating control to new configurations.\n @dev The delegations can be chained together, the first signature is the one that is used to validate\n the message, the last signature must match the current on-chain configuration of the wallet." + }, + "fullyImplemented": false, + "id": 2218, + "linearizedBaseContracts": [ + 2218, + 1116, + 1249 + ], + "name": "SequenceChainedSig", + "nameLocation": "721:18:14", + "nodeType": "ContractDefinition", + "nodes": [ + { + "global": false, + "id": 2037, + "libraryName": { + "id": 2035, + "name": "LibBytesPointer", + "nameLocations": [ + "781:15:14" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2476, + "src": "781:15:14" + }, + "nodeType": "UsingForDirective", + "src": "775:32:14", + "typeName": { + "id": 2036, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "801:5:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + } + }, + { + "constant": true, + "functionSelector": "57c56d6b", + "id": 2042, + "mutability": "constant", + "name": "SET_IMAGE_HASH_TYPE_HASH", + "nameLocation": "835:24:14", + "nodeType": "VariableDeclaration", + "scope": 2218, + "src": "811:95:14", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2038, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "811:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "hexValue": "536574496d61676548617368286279746573333220696d6167654861736829", + "id": 2040, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "872:33:14", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d1", + "typeString": "literal_string \"SetImageHash(bytes32 imageHash)\"" + }, + "value": "SetImageHash(bytes32 imageHash)" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_8713a7c4465f6fbee2b6e9d6646d1d9f83fec929edfc4baf661f3c865bdd04d1", + "typeString": "literal_string \"SetImageHash(bytes32 imageHash)\"" + } + ], + "id": 2039, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "862:9:14", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 2041, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "862:44:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "public" + }, + { + "errorSelector": "b006aba0", + "id": 2050, + "name": "LowWeightChainedSignature", + "nameLocation": "917:25:14", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2049, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2044, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "949:10:14", + "nodeType": "VariableDeclaration", + "scope": 2050, + "src": "943:16:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2043, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "943:5:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2046, + "mutability": "mutable", + "name": "threshold", + "nameLocation": "969:9:14", + "nodeType": "VariableDeclaration", + "scope": 2050, + "src": "961:17:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2045, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "961:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2048, + "mutability": "mutable", + "name": "_weight", + "nameLocation": "988:7:14", + "nodeType": "VariableDeclaration", + "scope": 2050, + "src": "980:15:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2047, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "980:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "942:54:14" + }, + "src": "911:86:14" + }, + { + "errorSelector": "37daf62b", + "id": 2056, + "name": "WrongChainedCheckpointOrder", + "nameLocation": "1006:27:14", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2055, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2052, + "mutability": "mutable", + "name": "_current", + "nameLocation": "1042:8:14", + "nodeType": "VariableDeclaration", + "scope": 2056, + "src": "1034:16:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2051, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1034:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2054, + "mutability": "mutable", + "name": "_prev", + "nameLocation": "1060:5:14", + "nodeType": "VariableDeclaration", + "scope": 2056, + "src": "1052:13:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2053, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1052:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1033:33:14" + }, + "src": "1000:67:14" + }, + { + "body": { + "id": 2070, + "nodeType": "Block", + "src": "1381:75:14", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 2066, + "name": "SET_IMAGE_HASH_TYPE_HASH", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2042, + "src": "1414:24:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 2067, + "name": "_imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2059, + "src": "1440:10:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 2064, + "name": "LibOptim", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2530, + "src": "1394:8:14", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_LibOptim_$2530_$", + "typeString": "type(library LibOptim)" + } + }, + "id": 2065, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1403:10:14", + "memberName": "fkeccak256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2491, + "src": "1394:19:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32,bytes32) pure returns (bytes32)" + } + }, + "id": 2068, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1394:57:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 2063, + "id": 2069, + "nodeType": "Return", + "src": "1387:64:14" + } + ] + }, + "documentation": { + "id": 2057, + "nodeType": "StructuredDocumentation", + "src": "1071:222:14", + "text": " @notice Defined the special token that must be signed to delegate control to a new configuration.\n @param _imageHash The hash of the new configuration.\n @return bytes32 The message hash to be signed." + }, + "id": 2071, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_hashSetImageHashStruct", + "nameLocation": "1305:23:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2060, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2059, + "mutability": "mutable", + "name": "_imageHash", + "nameLocation": "1337:10:14", + "nodeType": "VariableDeclaration", + "scope": 2071, + "src": "1329:18:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2058, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1329:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1328:20:14" + }, + "returnParameters": { + "id": 2063, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2062, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2071, + "src": "1372:7:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2061, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1372:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "1371:9:14" + }, + "scope": 2218, + "src": "1296:160:14", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2216, + "nodeType": "Block", + "src": "2540:1839:14", + "statements": [ + { + "assignments": [ + 2090 + ], + "declarations": [ + { + "constant": false, + "id": 2090, + "mutability": "mutable", + "name": "rindex", + "nameLocation": "2554:6:14", + "nodeType": "VariableDeclaration", + "scope": 2216, + "src": "2546:14:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2089, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2546:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2092, + "initialValue": { + "hexValue": "31", + "id": 2091, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2563:1:14", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "nodeType": "VariableDeclarationStatement", + "src": "2546:18:14" + }, + { + "assignments": [ + 2094 + ], + "declarations": [ + { + "constant": false, + "id": 2094, + "mutability": "mutable", + "name": "sigSize", + "nameLocation": "2578:7:14", + "nodeType": "VariableDeclaration", + "scope": 2216, + "src": "2570:15:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2093, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2570:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2095, + "nodeType": "VariableDeclarationStatement", + "src": "2570:15:14" + }, + { + "expression": { + "id": 2103, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 2096, + "name": "sigSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "2696:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2097, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "2705:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2098, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "2695:17:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2101, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "2737:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2099, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2076, + "src": "2715:10:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2100, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2726:10:14", + "memberName": "readUint24", + "nodeType": "MemberAccess", + "referencedDeclaration": 2447, + "src": "2715:21:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint24_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint24,uint256)" + } + }, + "id": 2102, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2715:29:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint24_$_t_uint256_$", + "typeString": "tuple(uint24,uint256)" + } + }, + "src": "2695:49:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2104, + "nodeType": "ExpressionStatement", + "src": "2695:49:14" + }, + { + "assignments": [ + 2106 + ], + "declarations": [ + { + "constant": false, + "id": 2106, + "mutability": "mutable", + "name": "nrindex", + "nameLocation": "2758:7:14", + "nodeType": "VariableDeclaration", + "scope": 2216, + "src": "2750:15:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2105, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2750:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2110, + "initialValue": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2109, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2107, + "name": "sigSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "2768:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 2108, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "2778:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2768:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2750:34:14" + }, + { + "expression": { + "id": 2124, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 2111, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2079, + "src": "2799:9:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2112, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2081, + "src": "2816:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2113, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2083, + "src": "2830:9:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 2114, + "name": "subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2085, + "src": "2847:9:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 2115, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2087, + "src": "2864:10:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2116, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "2791:89:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2118, + "name": "_digest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2074, + "src": "2908:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 2119, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2076, + "src": "2923:10:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 2121, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2106, + "src": "2941:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2122, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "2923:26:14", + "startExpression": { + "id": 2120, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "2934:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "id": 2117, + "name": "signatureRecovery", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1225, + "src": "2883:17:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "id": 2123, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2883:72:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "src": "2791:164:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2125, + "nodeType": "ExpressionStatement", + "src": "2791:164:14" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2128, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2126, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2081, + "src": "2966:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 2127, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2079, + "src": "2975:9:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2966:18:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2139, + "nodeType": "IfStatement", + "src": "2962:118:14", + "trueBody": { + "id": 2138, + "nodeType": "Block", + "src": "2986:94:14", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "baseExpression": { + "id": 2130, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2076, + "src": "3027:10:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 2132, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2106, + "src": "3045:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2133, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "3027:26:14", + "startExpression": { + "id": 2131, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "3038:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + }, + { + "id": 2134, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2079, + "src": "3055:9:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2135, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2081, + "src": "3066:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2129, + "name": "LowWeightChainedSignature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2050, + "src": "3001:25:14", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (bytes memory,uint256,uint256) pure" + } + }, + "id": 2136, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3001:72:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2137, + "nodeType": "RevertStatement", + "src": "2994:79:14" + } + ] + } + }, + { + "expression": { + "id": 2142, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2140, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "3086:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2141, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2106, + "src": "3095:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3086:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2143, + "nodeType": "ExpressionStatement", + "src": "3086:16:14" + }, + { + "body": { + "id": 2214, + "nodeType": "Block", + "src": "3318:1057:14", + "statements": [ + { + "expression": { + "id": 2155, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 2148, + "name": "sigSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "3378:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2149, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "3387:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2150, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "3377:17:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$", + "typeString": "tuple(uint256,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2153, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "3419:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2151, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2076, + "src": "3397:10:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2152, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3408:10:14", + "memberName": "readUint24", + "nodeType": "MemberAccess", + "referencedDeclaration": 2447, + "src": "3397:21:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint24_$_t_uint256_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint24,uint256)" + } + }, + "id": 2154, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3397:29:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint24_$_t_uint256_$", + "typeString": "tuple(uint24,uint256)" + } + }, + "src": "3377:49:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2156, + "nodeType": "ExpressionStatement", + "src": "3377:49:14" + }, + { + "expression": { + "id": 2161, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2157, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2106, + "src": "3434:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2160, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2158, + "name": "sigSize", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2094, + "src": "3444:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 2159, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "3454:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3444:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3434:26:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2162, + "nodeType": "ExpressionStatement", + "src": "3434:26:14" + }, + { + "assignments": [ + 2164 + ], + "declarations": [ + { + "constant": false, + "id": 2164, + "mutability": "mutable", + "name": "nextCheckpoint", + "nameLocation": "3477:14:14", + "nodeType": "VariableDeclaration", + "scope": 2214, + "src": "3469:22:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2163, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3469:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2165, + "nodeType": "VariableDeclarationStatement", + "src": "3469:22:14" + }, + { + "expression": { + "id": 2180, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "components": [ + { + "id": 2166, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2079, + "src": "3510:9:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2167, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2081, + "src": "3529:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2168, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2083, + "src": "3545:9:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + null, + { + "id": 2169, + "name": "nextCheckpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2164, + "src": "3662:14:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2170, + "isConstant": false, + "isInlineArray": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "TupleExpression", + "src": "3500:184:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$__$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,,uint256)" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "id": 2173, + "name": "imageHash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2083, + "src": "3738:9:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 2172, + "name": "_hashSetImageHashStruct", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2071, + "src": "3714:23:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$returns$_t_bytes32_$", + "typeString": "function (bytes32) pure returns (bytes32)" + } + }, + "id": 2174, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3714:34:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 2175, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2076, + "src": "3758:10:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 2177, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2106, + "src": "3776:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2178, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "3758:26:14", + "startExpression": { + "id": 2176, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "3769:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "id": 2171, + "name": "signatureRecovery", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1225, + "src": "3687:17:14", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "id": 2179, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3687:105:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,bytes32,uint256)" + } + }, + "src": "3500:292:14", + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2181, + "nodeType": "ExpressionStatement", + "src": "3500:292:14" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2184, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2182, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2081, + "src": "3833:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 2183, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2079, + "src": "3842:9:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3833:18:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2195, + "nodeType": "IfStatement", + "src": "3829:122:14", + "trueBody": { + "id": 2194, + "nodeType": "Block", + "src": "3853:98:14", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "baseExpression": { + "id": 2186, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2076, + "src": "3896:10:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "id": 2188, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2106, + "src": "3914:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2189, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "3896:26:14", + "startExpression": { + "id": 2187, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "3907:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + }, + { + "id": 2190, + "name": "threshold", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2079, + "src": "3924:9:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2191, + "name": "weight", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2081, + "src": "3935:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2185, + "name": "LowWeightChainedSignature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2050, + "src": "3870:25:14", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (bytes memory,uint256,uint256) pure" + } + }, + "id": 2192, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3870:72:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2193, + "nodeType": "RevertStatement", + "src": "3863:79:14" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2198, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2196, + "name": "nextCheckpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2164, + "src": "4198:14:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 2197, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2087, + "src": "4216:10:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4198:28:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2205, + "nodeType": "IfStatement", + "src": "4194:115:14", + "trueBody": { + "id": 2204, + "nodeType": "Block", + "src": "4228:81:14", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 2200, + "name": "nextCheckpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2164, + "src": "4273:14:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 2201, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2087, + "src": "4289:10:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2199, + "name": "WrongChainedCheckpointOrder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2056, + "src": "4245:27:14", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256) pure" + } + }, + "id": 2202, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4245:55:14", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2203, + "nodeType": "RevertStatement", + "src": "4238:62:14" + } + ] + } + }, + { + "expression": { + "id": 2208, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2206, + "name": "checkpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2087, + "src": "4317:10:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2207, + "name": "nextCheckpoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2164, + "src": "4330:14:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4317:27:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2209, + "nodeType": "ExpressionStatement", + "src": "4317:27:14" + }, + { + "expression": { + "id": 2212, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2210, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "4352:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 2211, + "name": "nrindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2106, + "src": "4361:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4352:16:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2213, + "nodeType": "ExpressionStatement", + "src": "4352:16:14" + } + ] + }, + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2147, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2144, + "name": "rindex", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2090, + "src": "3290:6:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "expression": { + "id": 2145, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2076, + "src": "3299:10:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2146, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "3310:6:14", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "3299:17:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3290:26:14", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2215, + "nodeType": "WhileStatement", + "src": "3283:1092:14" + } + ] + }, + "documentation": { + "id": 2072, + "nodeType": "StructuredDocumentation", + "src": "1460:857:14", + "text": " @notice Returns the threshold, weight, root, and checkpoint of a (chained) signature.\n \n @dev This method return the `threshold`, `weight` and `imageHash` of the last signature in the chain.\n Intermediate signatures are validated directly in this method. The `subdigest` is the one of the\n first signature in the chain (since that's the one that is used to validate the message).\n @param _digest The digest to recover the signature from.\n @param _signature The signature to recover.\n @return threshold The threshold of the (last) signature.\n @return weight The weight of the (last) signature.\n @return imageHash The image hash of the (last) signature.\n @return subdigest The subdigest of the (first) signature in the chain.\n @return checkpoint The checkpoint of the (last) signature." + }, + "id": 2217, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "chainedRecover", + "nameLocation": "2329:14:14", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2077, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2074, + "mutability": "mutable", + "name": "_digest", + "nameLocation": "2357:7:14", + "nodeType": "VariableDeclaration", + "scope": 2217, + "src": "2349:15:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2073, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2349:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2076, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "2385:10:14", + "nodeType": "VariableDeclaration", + "scope": 2217, + "src": "2370:25:14", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2075, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2370:5:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2343:56:14" + }, + "returnParameters": { + "id": 2088, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2079, + "mutability": "mutable", + "name": "threshold", + "nameLocation": "2436:9:14", + "nodeType": "VariableDeclaration", + "scope": 2217, + "src": "2428:17:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2078, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2428:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2081, + "mutability": "mutable", + "name": "weight", + "nameLocation": "2459:6:14", + "nodeType": "VariableDeclaration", + "scope": 2217, + "src": "2451:14:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2080, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2451:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2083, + "mutability": "mutable", + "name": "imageHash", + "nameLocation": "2479:9:14", + "nodeType": "VariableDeclaration", + "scope": 2217, + "src": "2471:17:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2082, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2471:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2085, + "mutability": "mutable", + "name": "subdigest", + "nameLocation": "2502:9:14", + "nodeType": "VariableDeclaration", + "scope": 2217, + "src": "2494:17:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2084, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2494:7:14", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2087, + "mutability": "mutable", + "name": "checkpoint", + "nameLocation": "2525:10:14", + "nodeType": "VariableDeclaration", + "scope": 2217, + "src": "2517:18:14", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2086, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2517:7:14", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2422:117:14" + }, + "scope": 2218, + "src": "2320:2059:14", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2219, + "src": "703:3678:14", + "usedErrors": [ + 1093, + 1193, + 1197, + 2050, + 2056 + ] + } + ], + "src": "39:4343:14" + }, + "id": 14 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol", + "exportedSymbols": { + "IERC1271Wallet": [ + 22 + ], + "LibBytes": [ + 2374 + ], + "LibBytesPointer": [ + 2476 + ], + "LibOptim": [ + 2530 + ], + "SequenceBaseSig": [ + 2021 + ], + "SequenceDynamicSig": [ + 2247 + ], + "SignatureValidator": [ + 2798 + ] + }, + "id": 2248, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2220, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:15" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol", + "file": "./SequenceBaseSig.sol", + "id": 2221, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2248, + "sourceUnit": 2022, + "src": "64:31:15", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "SequenceDynamicSig", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 2247, + "linearizedBaseContracts": [ + 2247 + ], + "name": "SequenceDynamicSig", + "nameLocation": "106:18:15", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 2245, + "nodeType": "Block", + "src": "841:69:15", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 2239, + "name": "_subdigest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2224, + "src": "878:10:15", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 2240, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2226, + "src": "890:10:15", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2242, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "890:14:15", + "startExpression": { + "hexValue": "31", + "id": 2241, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "901:1:15", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "expression": { + "id": 2237, + "name": "SequenceBaseSig", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2021, + "src": "854:15:15", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_SequenceBaseSig_$2021_$", + "typeString": "type(library SequenceBaseSig)" + } + }, + "id": 2238, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "870:7:15", + "memberName": "recover", + "nodeType": "MemberAccess", + "referencedDeclaration": 2020, + "src": "854:23:15", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "function (bytes32,bytes calldata) view returns (uint256,uint256,bytes32,uint256)" + } + }, + "id": 2243, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "854:51:15", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$_t_bytes32_$_t_uint256_$", + "typeString": "tuple(uint256,uint256,bytes32,uint256)" + } + }, + "functionReturnParameters": 2236, + "id": 2244, + "nodeType": "Return", + "src": "847:58:15" + } + ] + }, + "documentation": { + "id": 2222, + "nodeType": "StructuredDocumentation", + "src": "130:515:15", + "text": " @notice Recover a \"dynamically encoded\" Sequence signature.\n @dev The Signature is stripped of the first byte, which is the encoding flag.\n @param _subdigest The digest of the signature.\n @param _signature The Sequence signature.\n @return threshold The threshold weight required to validate the signature.\n @return weight The weight of the signature.\n @return imageHash The hash of the recovered configuration.\n @return checkpoint The checkpoint of the configuration." + }, + "id": 2246, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "recover", + "nameLocation": "657:7:15", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2227, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2224, + "mutability": "mutable", + "name": "_subdigest", + "nameLocation": "678:10:15", + "nodeType": "VariableDeclaration", + "scope": 2246, + "src": "670:18:15", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2223, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "670:7:15", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2226, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "709:10:15", + "nodeType": "VariableDeclaration", + "scope": 2246, + "src": "694:25:15", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2225, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "694:5:15", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "664:59:15" + }, + "returnParameters": { + "id": 2236, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2229, + "mutability": "mutable", + "name": "threshold", + "nameLocation": "760:9:15", + "nodeType": "VariableDeclaration", + "scope": 2246, + "src": "752:17:15", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2228, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "752:7:15", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2231, + "mutability": "mutable", + "name": "weight", + "nameLocation": "783:6:15", + "nodeType": "VariableDeclaration", + "scope": 2246, + "src": "775:14:15", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2230, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "775:7:15", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2233, + "mutability": "mutable", + "name": "imageHash", + "nameLocation": "803:9:15", + "nodeType": "VariableDeclaration", + "scope": 2246, + "src": "795:17:15", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2232, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "795:7:15", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2235, + "mutability": "mutable", + "name": "checkpoint", + "nameLocation": "826:10:15", + "nodeType": "VariableDeclaration", + "scope": 2246, + "src": "818:18:15", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2234, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "818:7:15", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "746:94:15" + }, + "scope": 2247, + "src": "648:262:15", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2248, + "src": "98:814:15", + "usedErrors": [] + } + ], + "src": "39:874:15" + }, + "id": 15 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol", + "exportedSymbols": { + "SequenceNoChainIdSig": [ + 2275 + ] + }, + "id": 2276, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2249, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:16" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "SequenceNoChainIdSig", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 2275, + "linearizedBaseContracts": [ + 2275 + ], + "name": "SequenceNoChainIdSig", + "nameLocation": "73:20:16", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 2273, + "nodeType": "Block", + "src": "472:145:16", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "hexValue": "1901", + "id": 2260, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "528:10:16", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541", + "typeString": "literal_string hex\"1901\"" + }, + "value": "\u0019\u0001" + }, + { + "arguments": [ + { + "hexValue": "30", + "id": 2263, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "556:1:16", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 2262, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "548:7:16", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2261, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "548:7:16", + "typeDescriptions": {} + } + }, + "id": 2264, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "548:10:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 2267, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967268, + "src": "576:4:16", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SequenceNoChainIdSig_$2275", + "typeString": "library SequenceNoChainIdSig" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_SequenceNoChainIdSig_$2275", + "typeString": "library SequenceNoChainIdSig" + } + ], + "id": 2266, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "568:7:16", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 2265, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "568:7:16", + "typeDescriptions": {} + } + }, + "id": 2268, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "568:13:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "id": 2269, + "name": "_digest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2252, + "src": "591:7:16", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541", + "typeString": "literal_string hex\"1901\"" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 2258, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "502:3:16", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 2259, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "506:12:16", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "502:16:16", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 2270, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "502:104:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 2257, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "485:9:16", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 2271, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "485:127:16", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "functionReturnParameters": 2256, + "id": 2272, + "nodeType": "Return", + "src": "478:134:16" + } + ] + }, + "documentation": { + "id": 2250, + "nodeType": "StructuredDocumentation", + "src": "99:302:16", + "text": " @notice Computes a subdigest for a Sequence signature that works on all chains.\n @dev The subdigest is computed by removing the chain ID from the digest (using 0 instead).\n @param _digest The digest of the chain of signatures.\n @return bytes32 The subdigest with no chain ID." + }, + "id": 2274, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "subdigest", + "nameLocation": "413:9:16", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2253, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2252, + "mutability": "mutable", + "name": "_digest", + "nameLocation": "431:7:16", + "nodeType": "VariableDeclaration", + "scope": 2274, + "src": "423:15:16", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2251, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "423:7:16", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "422:17:16" + }, + "returnParameters": { + "id": 2256, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2255, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 2274, + "src": "463:7:16", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2254, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "463:7:16", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "462:9:16" + }, + "scope": 2275, + "src": "404:213:16", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2276, + "src": "65:554:16", + "usedErrors": [] + } + ], + "src": "39:581:16" + }, + "id": 16 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol", + "exportedSymbols": { + "SubModuleNonce": [ + 2324 + ] + }, + "id": 2325, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2277, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:17" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "SubModuleNonce", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 2324, + "linearizedBaseContracts": [ + 2324 + ], + "name": "SubModuleNonce", + "nameLocation": "73:14:17", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": true, + "id": 2280, + "mutability": "constant", + "name": "NONCE_BITS", + "nameLocation": "174:10:17", + "nodeType": "VariableDeclaration", + "scope": 2324, + "src": "148:41:17", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2278, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "148:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "3936", + "id": 2279, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "187:2:17", + "typeDescriptions": { + "typeIdentifier": "t_rational_96_by_1", + "typeString": "int_const 96" + }, + "value": "96" + }, + "visibility": "internal" + }, + { + "constant": true, + "id": 2293, + "mutability": "constant", + "name": "NONCE_MASK", + "nameLocation": "219:10:17", + "nodeType": "VariableDeclaration", + "scope": 2324, + "src": "193:73:17", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2281, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "193:7:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "value": { + "arguments": [ + { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 2288, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "253:6:17", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint96_$", + "typeString": "type(uint96)" + }, + "typeName": { + "id": 2287, + "name": "uint96", + "nodeType": "ElementaryTypeName", + "src": "253:6:17", + "typeDescriptions": {} + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_type$_t_uint96_$", + "typeString": "type(uint96)" + } + ], + "id": 2286, + "name": "type", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967269, + "src": "248:4:17", + "typeDescriptions": { + "typeIdentifier": "t_function_metatype_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 2289, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "248:12:17", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_magic_meta_type_t_uint96", + "typeString": "type(uint96)" + } + }, + "id": 2290, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "261:3:17", + "memberName": "max", + "nodeType": "MemberAccess", + "src": "248:16:17", + "typeDescriptions": { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint96", + "typeString": "uint96" + } + ], + "id": 2285, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "240:7:17", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2284, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "240:7:17", + "typeDescriptions": {} + } + }, + "id": 2291, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "240:25:17", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2283, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "232:7:17", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 2282, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "232:7:17", + "typeDescriptions": {} + } + }, + "id": 2292, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "232:34:17", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "body": { + "id": 2322, + "nodeType": "Block", + "src": "603:146:17", + "statements": [ + { + "id": 2321, + "nodeType": "UncheckedBlock", + "src": "609:136:17", + "statements": [ + { + "expression": { + "id": 2307, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2303, + "name": "_space", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2299, + "src": "649:6:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2306, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2304, + "name": "_rawNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2296, + "src": "658:9:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">>", + "rightExpression": { + "id": 2305, + "name": "NONCE_BITS", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2280, + "src": "671:10:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "658:23:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "649:32:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2308, + "nodeType": "ExpressionStatement", + "src": "649:32:17" + }, + { + "expression": { + "id": 2319, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2309, + "name": "_nonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2301, + "src": "689:6:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "id": 2317, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 2314, + "name": "_rawNonce", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2296, + "src": "714:9:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2313, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "706:7:17", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bytes32_$", + "typeString": "type(bytes32)" + }, + "typeName": { + "id": 2312, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "706:7:17", + "typeDescriptions": {} + } + }, + "id": 2315, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "706:18:17", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "BinaryOperation", + "operator": "&", + "rightExpression": { + "id": 2316, + "name": "NONCE_MASK", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2293, + "src": "727:10:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "src": "706:31:17", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 2311, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "698:7:17", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2310, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "698:7:17", + "typeDescriptions": {} + } + }, + "id": 2318, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "698:40:17", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "689:49:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2320, + "nodeType": "ExpressionStatement", + "src": "689:49:17" + } + ] + } + ] + }, + "documentation": { + "id": 2294, + "nodeType": "StructuredDocumentation", + "src": "271:222:17", + "text": " @notice Decodes a raw nonce\n @dev Schema: space[160]:type[96]\n @param _rawNonce Nonce to be decoded\n @return _space The nonce space of the raw nonce\n @return _nonce The nonce of the raw nonce" + }, + "id": 2323, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "decodeNonce", + "nameLocation": "505:11:17", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2297, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2296, + "mutability": "mutable", + "name": "_rawNonce", + "nameLocation": "525:9:17", + "nodeType": "VariableDeclaration", + "scope": 2323, + "src": "517:17:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2295, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "517:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "516:19:17" + }, + "returnParameters": { + "id": 2302, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2299, + "mutability": "mutable", + "name": "_space", + "nameLocation": "572:6:17", + "nodeType": "VariableDeclaration", + "scope": 2323, + "src": "564:14:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2298, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "564:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2301, + "mutability": "mutable", + "name": "_nonce", + "nameLocation": "592:6:17", + "nodeType": "VariableDeclaration", + "scope": 2323, + "src": "584:14:17", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2300, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "584:7:17", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "558:44:17" + }, + "scope": 2324, + "src": "496:253:17", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2325, + "src": "65:686:17", + "usedErrors": [] + } + ], + "src": "39:713:17" + }, + "id": 17 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "exportedSymbols": { + "LibBytes": [ + 2374 + ] + }, + "id": 2375, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2326, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:18" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "LibBytes", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 2327, + "nodeType": "StructuredDocumentation", + "src": "65:339:18", + "text": " @title Library for reading data from bytes arrays\n @author Agustin Aguilar (aa@horizon.io)\n @notice This library contains functions for reading data from bytes arrays.\n @dev These functions do not check if the input index is within the bounds of the data array.\n Reading out of bounds may return dirty values." + }, + "fullyImplemented": true, + "id": 2374, + "linearizedBaseContracts": [ + 2374 + ], + "name": "LibBytes", + "nameLocation": "413:8:18", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 2338, + "nodeType": "Block", + "src": "767:75:18", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "782:56:18", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "790:42:18", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "data.offset", + "nodeType": "YulIdentifier", + "src": "812:11:18" + }, + { + "name": "index", + "nodeType": "YulIdentifier", + "src": "825:5:18" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "808:3:18" + }, + "nodeType": "YulFunctionCall", + "src": "808:23:18" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "795:12:18" + }, + "nodeType": "YulFunctionCall", + "src": "795:37:18" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "790:1:18" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2335, + "isOffset": false, + "isSlot": false, + "src": "790:1:18", + "valueSize": 1 + }, + { + "declaration": 2330, + "isOffset": true, + "isSlot": false, + "src": "812:11:18", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2332, + "isOffset": false, + "isSlot": false, + "src": "825:5:18", + "valueSize": 1 + } + ], + "id": 2337, + "nodeType": "InlineAssembly", + "src": "773:65:18" + } + ] + }, + "documentation": { + "id": 2328, + "nodeType": "StructuredDocumentation", + "src": "427:226:18", + "text": " @notice Returns the bytes32 value at the given index in the input data.\n @param data The input data.\n @param index The index of the value to retrieve.\n @return a The bytes32 value at the given index." + }, + "id": 2339, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readBytes32", + "nameLocation": "665:11:18", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2333, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2330, + "mutability": "mutable", + "name": "data", + "nameLocation": "697:4:18", + "nodeType": "VariableDeclaration", + "scope": 2339, + "src": "682:19:18", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2329, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "682:5:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2332, + "mutability": "mutable", + "name": "index", + "nameLocation": "715:5:18", + "nodeType": "VariableDeclaration", + "scope": 2339, + "src": "707:13:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2331, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "707:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "676:48:18" + }, + "returnParameters": { + "id": 2336, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2335, + "mutability": "mutable", + "name": "a", + "nameLocation": "761:1:18", + "nodeType": "VariableDeclaration", + "scope": 2339, + "src": "753:9:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2334, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "753:7:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "747:19:18" + }, + "scope": 2374, + "src": "656:186:18", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2350, + "nodeType": "Block", + "src": "1178:108:18", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "1193:89:18", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1201:49:18", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "index", + "nodeType": "YulIdentifier", + "src": "1230:5:18" + }, + { + "name": "data.offset", + "nodeType": "YulIdentifier", + "src": "1237:11:18" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1226:3:18" + }, + "nodeType": "YulFunctionCall", + "src": "1226:23:18" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1213:12:18" + }, + "nodeType": "YulFunctionCall", + "src": "1213:37:18" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "1205:4:18", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1257:19:18", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1266:3:18", + "type": "", + "value": "248" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "1271:4:18" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "1262:3:18" + }, + "nodeType": "YulFunctionCall", + "src": "1262:14:18" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "1257:1:18" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2347, + "isOffset": false, + "isSlot": false, + "src": "1257:1:18", + "valueSize": 1 + }, + { + "declaration": 2342, + "isOffset": true, + "isSlot": false, + "src": "1237:11:18", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2344, + "isOffset": false, + "isSlot": false, + "src": "1230:5:18", + "valueSize": 1 + } + ], + "id": 2349, + "nodeType": "InlineAssembly", + "src": "1184:98:18" + } + ] + }, + "documentation": { + "id": 2340, + "nodeType": "StructuredDocumentation", + "src": "846:222:18", + "text": " @notice Returns the uint8 value at the given index in the input data.\n @param data The input data.\n @param index The index of the value to retrieve.\n @return a The uint8 value at the given index." + }, + "id": 2351, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readUint8", + "nameLocation": "1080:9:18", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2345, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2342, + "mutability": "mutable", + "name": "data", + "nameLocation": "1110:4:18", + "nodeType": "VariableDeclaration", + "scope": 2351, + "src": "1095:19:18", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2341, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1095:5:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2344, + "mutability": "mutable", + "name": "index", + "nameLocation": "1128:5:18", + "nodeType": "VariableDeclaration", + "scope": 2351, + "src": "1120:13:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2343, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1120:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1089:48:18" + }, + "returnParameters": { + "id": 2348, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2347, + "mutability": "mutable", + "name": "a", + "nameLocation": "1172:1:18", + "nodeType": "VariableDeclaration", + "scope": 2351, + "src": "1166:7:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 2346, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "1166:5:18", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "src": "1160:17:18" + }, + "scope": 2374, + "src": "1071:215:18", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2360, + "nodeType": "Block", + "src": "1550:96:18", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "1565:77:18", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1573:37:18", + "value": { + "arguments": [ + { + "name": "data.offset", + "nodeType": "YulIdentifier", + "src": "1598:11:18" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1585:12:18" + }, + "nodeType": "YulFunctionCall", + "src": "1585:25:18" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "1577:4:18", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1617:19:18", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1626:3:18", + "type": "", + "value": "240" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "1631:4:18" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "1622:3:18" + }, + "nodeType": "YulFunctionCall", + "src": "1622:14:18" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "1617:1:18" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2357, + "isOffset": false, + "isSlot": false, + "src": "1617:1:18", + "valueSize": 1 + }, + { + "declaration": 2354, + "isOffset": true, + "isSlot": false, + "src": "1598:11:18", + "suffix": "offset", + "valueSize": 1 + } + ], + "id": 2359, + "nodeType": "InlineAssembly", + "src": "1556:86:18" + } + ] + }, + "documentation": { + "id": 2352, + "nodeType": "StructuredDocumentation", + "src": "1290:162:18", + "text": " @notice Returns the first uint16 value in the input data.\n @param data The input data.\n @return a The first uint16 value in the input data." + }, + "id": 2361, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readFirstUint16", + "nameLocation": "1464:15:18", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2355, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2354, + "mutability": "mutable", + "name": "data", + "nameLocation": "1500:4:18", + "nodeType": "VariableDeclaration", + "scope": 2361, + "src": "1485:19:18", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2353, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1485:5:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1479:29:18" + }, + "returnParameters": { + "id": 2358, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2357, + "mutability": "mutable", + "name": "a", + "nameLocation": "1544:1:18", + "nodeType": "VariableDeclaration", + "scope": 2361, + "src": "1537:8:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + }, + "typeName": { + "id": 2356, + "name": "uint16", + "nodeType": "ElementaryTypeName", + "src": "1537:6:18", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + }, + "visibility": "internal" + } + ], + "src": "1531:18:18" + }, + "scope": 2374, + "src": "1455:191:18", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2372, + "nodeType": "Block", + "src": "1986:108:18", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "2001:89:18", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "2009:49:18", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "index", + "nodeType": "YulIdentifier", + "src": "2038:5:18" + }, + { + "name": "data.offset", + "nodeType": "YulIdentifier", + "src": "2045:11:18" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2034:3:18" + }, + "nodeType": "YulFunctionCall", + "src": "2034:23:18" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2021:12:18" + }, + "nodeType": "YulFunctionCall", + "src": "2021:37:18" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "2013:4:18", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2065:19:18", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2074:3:18", + "type": "", + "value": "224" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "2079:4:18" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "2070:3:18" + }, + "nodeType": "YulFunctionCall", + "src": "2070:14:18" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "2065:1:18" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2369, + "isOffset": false, + "isSlot": false, + "src": "2065:1:18", + "valueSize": 1 + }, + { + "declaration": 2364, + "isOffset": true, + "isSlot": false, + "src": "2045:11:18", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2366, + "isOffset": false, + "isSlot": false, + "src": "2038:5:18", + "valueSize": 1 + } + ], + "id": 2371, + "nodeType": "InlineAssembly", + "src": "1992:98:18" + } + ] + }, + "documentation": { + "id": 2362, + "nodeType": "StructuredDocumentation", + "src": "1650:224:18", + "text": " @notice Returns the uint32 value at the given index in the input data.\n @param data The input data.\n @param index The index of the value to retrieve.\n @return a The uint32 value at the given index." + }, + "id": 2373, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readUint32", + "nameLocation": "1886:10:18", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2367, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2364, + "mutability": "mutable", + "name": "data", + "nameLocation": "1917:4:18", + "nodeType": "VariableDeclaration", + "scope": 2373, + "src": "1902:19:18", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2363, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1902:5:18", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2366, + "mutability": "mutable", + "name": "index", + "nameLocation": "1935:5:18", + "nodeType": "VariableDeclaration", + "scope": 2373, + "src": "1927:13:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2365, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1927:7:18", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1896:48:18" + }, + "returnParameters": { + "id": 2370, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2369, + "mutability": "mutable", + "name": "a", + "nameLocation": "1980:1:18", + "nodeType": "VariableDeclaration", + "scope": 2373, + "src": "1973:8:18", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + }, + "typeName": { + "id": 2368, + "name": "uint32", + "nodeType": "ElementaryTypeName", + "src": "1973:6:18", + "typeDescriptions": { + "typeIdentifier": "t_uint32", + "typeString": "uint32" + } + }, + "visibility": "internal" + } + ], + "src": "1967:18:18" + }, + "scope": 2374, + "src": "1877:217:18", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2375, + "src": "405:1691:18", + "usedErrors": [] + } + ], + "src": "39:2058:18" + }, + "id": 18 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytesPointer.sol", + "exportedSymbols": { + "LibBytesPointer": [ + 2476 + ] + }, + "id": 2477, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2376, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:19" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "LibBytesPointer", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 2377, + "nodeType": "StructuredDocumentation", + "src": "65:369:19", + "text": " @title Library for reading data from bytes arrays with a pointer\n @author Agustin Aguilar (aa@horizon.io)\n @notice This library contains functions for reading data from bytes arrays with a pointer.\n @dev These functions do not check if the input index is within the bounds of the data array.\n Reading out of bounds may return dirty values." + }, + "fullyImplemented": true, + "id": 2476, + "linearizedBaseContracts": [ + 2476 + ], + "name": "LibBytesPointer", + "nameLocation": "443:15:19", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 2388, + "nodeType": "Block", + "src": "794:119:19", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "809:100:19", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "817:38:19", + "value": { + "arguments": [ + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "842:12:19" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "829:12:19" + }, + "nodeType": "YulFunctionCall", + "src": "829:26:19" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "821:4:19", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "862:19:19", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "871:3:19", + "type": "", + "value": "240" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "876:4:19" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "867:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "867:14:19" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "862:1:19" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "888:15:19", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "902:1:19", + "type": "", + "value": "2" + }, + "variableNames": [ + { + "name": "newPointer", + "nodeType": "YulIdentifier", + "src": "888:10:19" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2380, + "isOffset": true, + "isSlot": false, + "src": "842:12:19", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2383, + "isOffset": false, + "isSlot": false, + "src": "862:1:19", + "valueSize": 1 + }, + { + "declaration": 2385, + "isOffset": false, + "isSlot": false, + "src": "888:10:19", + "valueSize": 1 + } + ], + "id": 2387, + "nodeType": "InlineAssembly", + "src": "800:109:19" + } + ] + }, + "documentation": { + "id": 2378, + "nodeType": "StructuredDocumentation", + "src": "464:207:19", + "text": " @dev Returns the first uint16 value in the input data and updates the pointer.\n @param _data The input data.\n @return a The first uint16 value.\n @return newPointer The new pointer." + }, + "id": 2389, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readFirstUint16", + "nameLocation": "683:15:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2381, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2380, + "mutability": "mutable", + "name": "_data", + "nameLocation": "719:5:19", + "nodeType": "VariableDeclaration", + "scope": 2389, + "src": "704:20:19", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2379, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "704:5:19", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "698:30:19" + }, + "returnParameters": { + "id": 2386, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2383, + "mutability": "mutable", + "name": "a", + "nameLocation": "764:1:19", + "nodeType": "VariableDeclaration", + "scope": 2389, + "src": "757:8:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + }, + "typeName": { + "id": 2382, + "name": "uint16", + "nodeType": "ElementaryTypeName", + "src": "757:6:19", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2385, + "mutability": "mutable", + "name": "newPointer", + "nameLocation": "779:10:19", + "nodeType": "VariableDeclaration", + "scope": 2389, + "src": "771:18:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2384, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "771:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "751:42:19" + }, + "scope": 2476, + "src": "674:239:19", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2402, + "nodeType": "Block", + "src": "1342:145:19", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "1357:126:19", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1365:51:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "1394:6:19" + }, + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "1402:12:19" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1390:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "1390:25:19" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "1377:12:19" + }, + "nodeType": "YulFunctionCall", + "src": "1377:39:19" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "1369:4:19", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1423:19:19", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1432:3:19", + "type": "", + "value": "248" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "1437:4:19" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "1428:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "1428:14:19" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "1423:1:19" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1449:28:19", + "value": { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "1467:6:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1475:1:19", + "type": "", + "value": "1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1463:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "1463:14:19" + }, + "variableNames": [ + { + "name": "newPointer", + "nodeType": "YulIdentifier", + "src": "1449:10:19" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2392, + "isOffset": true, + "isSlot": false, + "src": "1402:12:19", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2394, + "isOffset": false, + "isSlot": false, + "src": "1394:6:19", + "valueSize": 1 + }, + { + "declaration": 2394, + "isOffset": false, + "isSlot": false, + "src": "1467:6:19", + "valueSize": 1 + }, + { + "declaration": 2397, + "isOffset": false, + "isSlot": false, + "src": "1423:1:19", + "valueSize": 1 + }, + { + "declaration": 2399, + "isOffset": false, + "isSlot": false, + "src": "1449:10:19", + "valueSize": 1 + } + ], + "id": 2401, + "nodeType": "InlineAssembly", + "src": "1348:135:19" + } + ] + }, + "documentation": { + "id": 2390, + "nodeType": "StructuredDocumentation", + "src": "917:289:19", + "text": " @notice Returns the uint8 value at the given index in the input data and updates the pointer.\n @param _data The input data.\n @param _index The index of the value to retrieve.\n @return a The uint8 value at the given index.\n @return newPointer The new pointer." + }, + "id": 2403, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readUint8", + "nameLocation": "1218:9:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2395, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2392, + "mutability": "mutable", + "name": "_data", + "nameLocation": "1248:5:19", + "nodeType": "VariableDeclaration", + "scope": 2403, + "src": "1233:20:19", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2391, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1233:5:19", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2394, + "mutability": "mutable", + "name": "_index", + "nameLocation": "1267:6:19", + "nodeType": "VariableDeclaration", + "scope": 2403, + "src": "1259:14:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2393, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1259:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1227:50:19" + }, + "returnParameters": { + "id": 2400, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2397, + "mutability": "mutable", + "name": "a", + "nameLocation": "1312:1:19", + "nodeType": "VariableDeclaration", + "scope": 2403, + "src": "1306:7:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 2396, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "1306:5:19", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2399, + "mutability": "mutable", + "name": "newPointer", + "nameLocation": "1327:10:19", + "nodeType": "VariableDeclaration", + "scope": 2403, + "src": "1319:18:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2398, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1319:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1300:41:19" + }, + "scope": 2476, + "src": "1209:278:19", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2418, + "nodeType": "Block", + "src": "1998:220:19", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "2013:201:19", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "2021:51:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "2050:6:19" + }, + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "2058:12:19" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2046:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2046:25:19" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2033:12:19" + }, + "nodeType": "YulFunctionCall", + "src": "2033:39:19" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "2025:4:19", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2079:19:19", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2088:3:19", + "type": "", + "value": "248" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "2093:4:19" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "2084:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2084:14:19" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "2079:1:19" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2105:67:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2118:2:19", + "type": "", + "value": "88" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "2122:4:19" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "2114:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2114:13:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2129:42:19", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "2110:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2110:62:19" + }, + "variableNames": [ + { + "name": "b", + "nodeType": "YulIdentifier", + "src": "2105:1:19" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2179:29:19", + "value": { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "2197:6:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2205:2:19", + "type": "", + "value": "21" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2193:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2193:15:19" + }, + "variableNames": [ + { + "name": "newPointer", + "nodeType": "YulIdentifier", + "src": "2179:10:19" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2406, + "isOffset": true, + "isSlot": false, + "src": "2058:12:19", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2408, + "isOffset": false, + "isSlot": false, + "src": "2050:6:19", + "valueSize": 1 + }, + { + "declaration": 2408, + "isOffset": false, + "isSlot": false, + "src": "2197:6:19", + "valueSize": 1 + }, + { + "declaration": 2411, + "isOffset": false, + "isSlot": false, + "src": "2079:1:19", + "valueSize": 1 + }, + { + "declaration": 2413, + "isOffset": false, + "isSlot": false, + "src": "2105:1:19", + "valueSize": 1 + }, + { + "declaration": 2415, + "isOffset": false, + "isSlot": false, + "src": "2179:10:19", + "valueSize": 1 + } + ], + "id": 2417, + "nodeType": "InlineAssembly", + "src": "2004:210:19" + } + ] + }, + "documentation": { + "id": 2404, + "nodeType": "StructuredDocumentation", + "src": "1491:349:19", + "text": " @notice Returns the uint8 value and the address at the given index in the input data and updates the pointer.\n @param _data The input data.\n @param _index The index of the value to retrieve.\n @return a The uint8 value at the given index.\n @return b The following address value.\n @return newPointer The new pointer." + }, + "id": 2419, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readUint8Address", + "nameLocation": "1852:16:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2409, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2406, + "mutability": "mutable", + "name": "_data", + "nameLocation": "1889:5:19", + "nodeType": "VariableDeclaration", + "scope": 2419, + "src": "1874:20:19", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2405, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1874:5:19", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2408, + "mutability": "mutable", + "name": "_index", + "nameLocation": "1908:6:19", + "nodeType": "VariableDeclaration", + "scope": 2419, + "src": "1900:14:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2407, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1900:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1868:50:19" + }, + "returnParameters": { + "id": 2416, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2411, + "mutability": "mutable", + "name": "a", + "nameLocation": "1953:1:19", + "nodeType": "VariableDeclaration", + "scope": 2419, + "src": "1947:7:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 2410, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "1947:5:19", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2413, + "mutability": "mutable", + "name": "b", + "nameLocation": "1968:1:19", + "nodeType": "VariableDeclaration", + "scope": 2419, + "src": "1960:9:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2412, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1960:7:19", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2415, + "mutability": "mutable", + "name": "newPointer", + "nameLocation": "1983:10:19", + "nodeType": "VariableDeclaration", + "scope": 2419, + "src": "1975:18:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2414, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1975:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "1941:56:19" + }, + "scope": 2476, + "src": "1843:375:19", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2432, + "nodeType": "Block", + "src": "2651:158:19", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "2666:139:19", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "2674:51:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "2703:6:19" + }, + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "2711:12:19" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2699:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2699:25:19" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "2686:12:19" + }, + "nodeType": "YulFunctionCall", + "src": "2686:39:19" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "2678:4:19", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2732:32:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2745:3:19", + "type": "", + "value": "240" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "2750:4:19" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "2741:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2741:14:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2757:6:19", + "type": "", + "value": "0xffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "2737:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2737:27:19" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "2732:1:19" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2771:28:19", + "value": { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "2789:6:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2797:1:19", + "type": "", + "value": "2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2785:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "2785:14:19" + }, + "variableNames": [ + { + "name": "newPointer", + "nodeType": "YulIdentifier", + "src": "2771:10:19" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2422, + "isOffset": true, + "isSlot": false, + "src": "2711:12:19", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2424, + "isOffset": false, + "isSlot": false, + "src": "2703:6:19", + "valueSize": 1 + }, + { + "declaration": 2424, + "isOffset": false, + "isSlot": false, + "src": "2789:6:19", + "valueSize": 1 + }, + { + "declaration": 2427, + "isOffset": false, + "isSlot": false, + "src": "2732:1:19", + "valueSize": 1 + }, + { + "declaration": 2429, + "isOffset": false, + "isSlot": false, + "src": "2771:10:19", + "valueSize": 1 + } + ], + "id": 2431, + "nodeType": "InlineAssembly", + "src": "2657:148:19" + } + ] + }, + "documentation": { + "id": 2420, + "nodeType": "StructuredDocumentation", + "src": "2222:291:19", + "text": " @notice Returns the uint16 value at the given index in the input data and updates the pointer.\n @param _data The input data.\n @param _index The index of the value to retrieve.\n @return a The uint16 value at the given index.\n @return newPointer The new pointer." + }, + "id": 2433, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readUint16", + "nameLocation": "2525:10:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2425, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2422, + "mutability": "mutable", + "name": "_data", + "nameLocation": "2556:5:19", + "nodeType": "VariableDeclaration", + "scope": 2433, + "src": "2541:20:19", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2421, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2541:5:19", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2424, + "mutability": "mutable", + "name": "_index", + "nameLocation": "2575:6:19", + "nodeType": "VariableDeclaration", + "scope": 2433, + "src": "2567:14:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2423, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2567:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2535:50:19" + }, + "returnParameters": { + "id": 2430, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2427, + "mutability": "mutable", + "name": "a", + "nameLocation": "2621:1:19", + "nodeType": "VariableDeclaration", + "scope": 2433, + "src": "2614:8:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + }, + "typeName": { + "id": 2426, + "name": "uint16", + "nodeType": "ElementaryTypeName", + "src": "2614:6:19", + "typeDescriptions": { + "typeIdentifier": "t_uint16", + "typeString": "uint16" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2429, + "mutability": "mutable", + "name": "newPointer", + "nameLocation": "2636:10:19", + "nodeType": "VariableDeclaration", + "scope": 2433, + "src": "2628:18:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2428, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2628:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "2608:42:19" + }, + "scope": 2476, + "src": "2516:293:19", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2446, + "nodeType": "Block", + "src": "3242:160:19", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "3257:141:19", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "3265:51:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "3294:6:19" + }, + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "3302:12:19" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3290:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "3290:25:19" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3277:12:19" + }, + "nodeType": "YulFunctionCall", + "src": "3277:39:19" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "3269:4:19", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3323:34:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3336:3:19", + "type": "", + "value": "232" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "3341:4:19" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "3332:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "3332:14:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3348:8:19", + "type": "", + "value": "0xffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "3328:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "3328:29:19" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "3323:1:19" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3364:28:19", + "value": { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "3382:6:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3390:1:19", + "type": "", + "value": "3" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3378:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "3378:14:19" + }, + "variableNames": [ + { + "name": "newPointer", + "nodeType": "YulIdentifier", + "src": "3364:10:19" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2436, + "isOffset": true, + "isSlot": false, + "src": "3302:12:19", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2438, + "isOffset": false, + "isSlot": false, + "src": "3294:6:19", + "valueSize": 1 + }, + { + "declaration": 2438, + "isOffset": false, + "isSlot": false, + "src": "3382:6:19", + "valueSize": 1 + }, + { + "declaration": 2441, + "isOffset": false, + "isSlot": false, + "src": "3323:1:19", + "valueSize": 1 + }, + { + "declaration": 2443, + "isOffset": false, + "isSlot": false, + "src": "3364:10:19", + "valueSize": 1 + } + ], + "id": 2445, + "nodeType": "InlineAssembly", + "src": "3248:150:19" + } + ] + }, + "documentation": { + "id": 2434, + "nodeType": "StructuredDocumentation", + "src": "2813:291:19", + "text": " @notice Returns the uint24 value at the given index in the input data and updates the pointer.\n @param _data The input data.\n @param _index The index of the value to retrieve.\n @return a The uint24 value at the given index.\n @return newPointer The new pointer." + }, + "id": 2447, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readUint24", + "nameLocation": "3116:10:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2439, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2436, + "mutability": "mutable", + "name": "_data", + "nameLocation": "3147:5:19", + "nodeType": "VariableDeclaration", + "scope": 2447, + "src": "3132:20:19", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2435, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3132:5:19", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2438, + "mutability": "mutable", + "name": "_index", + "nameLocation": "3166:6:19", + "nodeType": "VariableDeclaration", + "scope": 2447, + "src": "3158:14:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2437, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3158:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3126:50:19" + }, + "returnParameters": { + "id": 2444, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2441, + "mutability": "mutable", + "name": "a", + "nameLocation": "3212:1:19", + "nodeType": "VariableDeclaration", + "scope": 2447, + "src": "3205:8:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint24", + "typeString": "uint24" + }, + "typeName": { + "id": 2440, + "name": "uint24", + "nodeType": "ElementaryTypeName", + "src": "3205:6:19", + "typeDescriptions": { + "typeIdentifier": "t_uint24", + "typeString": "uint24" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2443, + "mutability": "mutable", + "name": "newPointer", + "nameLocation": "3227:10:19", + "nodeType": "VariableDeclaration", + "scope": 2447, + "src": "3219:18:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2442, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3219:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3199:42:19" + }, + "scope": 2476, + "src": "3107:295:19", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2460, + "nodeType": "Block", + "src": "3835:170:19", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "3850:151:19", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "3858:51:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "3887:6:19" + }, + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "3895:12:19" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3883:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "3883:25:19" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "3870:12:19" + }, + "nodeType": "YulFunctionCall", + "src": "3870:39:19" + }, + "variables": [ + { + "name": "word", + "nodeType": "YulTypedName", + "src": "3862:4:19", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3916:44:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3929:3:19", + "type": "", + "value": "192" + }, + { + "name": "word", + "nodeType": "YulIdentifier", + "src": "3934:4:19" + } + ], + "functionName": { + "name": "shr", + "nodeType": "YulIdentifier", + "src": "3925:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "3925:14:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3941:18:19", + "type": "", + "value": "0xffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "3921:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "3921:39:19" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "3916:1:19" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "3967:28:19", + "value": { + "arguments": [ + { + "name": "_index", + "nodeType": "YulIdentifier", + "src": "3985:6:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3993:1:19", + "type": "", + "value": "8" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3981:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "3981:14:19" + }, + "variableNames": [ + { + "name": "newPointer", + "nodeType": "YulIdentifier", + "src": "3967:10:19" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2450, + "isOffset": true, + "isSlot": false, + "src": "3895:12:19", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2452, + "isOffset": false, + "isSlot": false, + "src": "3887:6:19", + "valueSize": 1 + }, + { + "declaration": 2452, + "isOffset": false, + "isSlot": false, + "src": "3985:6:19", + "valueSize": 1 + }, + { + "declaration": 2455, + "isOffset": false, + "isSlot": false, + "src": "3916:1:19", + "valueSize": 1 + }, + { + "declaration": 2457, + "isOffset": false, + "isSlot": false, + "src": "3967:10:19", + "valueSize": 1 + } + ], + "id": 2459, + "nodeType": "InlineAssembly", + "src": "3841:160:19" + } + ] + }, + "documentation": { + "id": 2448, + "nodeType": "StructuredDocumentation", + "src": "3406:291:19", + "text": " @notice Returns the uint64 value at the given index in the input data and updates the pointer.\n @param _data The input data.\n @param _index The index of the value to retrieve.\n @return a The uint64 value at the given index.\n @return newPointer The new pointer." + }, + "id": 2461, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readUint64", + "nameLocation": "3709:10:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2453, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2450, + "mutability": "mutable", + "name": "_data", + "nameLocation": "3740:5:19", + "nodeType": "VariableDeclaration", + "scope": 2461, + "src": "3725:20:19", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2449, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "3725:5:19", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2452, + "mutability": "mutable", + "name": "_index", + "nameLocation": "3759:6:19", + "nodeType": "VariableDeclaration", + "scope": 2461, + "src": "3751:14:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2451, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3751:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3719:50:19" + }, + "returnParameters": { + "id": 2458, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2455, + "mutability": "mutable", + "name": "a", + "nameLocation": "3805:1:19", + "nodeType": "VariableDeclaration", + "scope": 2461, + "src": "3798:8:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2454, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "3798:6:19", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2457, + "mutability": "mutable", + "name": "newPointer", + "nameLocation": "3820:10:19", + "nodeType": "VariableDeclaration", + "scope": 2461, + "src": "3812:18:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2456, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3812:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "3792:42:19" + }, + "scope": 2476, + "src": "3700:305:19", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2474, + "nodeType": "Block", + "src": "4446:117:19", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "4461:98:19", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "4469:46:19", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "_pointer", + "nodeType": "YulIdentifier", + "src": "4491:8:19" + }, + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "4501:12:19" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4487:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "4487:27:19" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "4474:12:19" + }, + "nodeType": "YulFunctionCall", + "src": "4474:41:19" + }, + "variableNames": [ + { + "name": "a", + "nodeType": "YulIdentifier", + "src": "4469:1:19" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "4522:31:19", + "value": { + "arguments": [ + { + "name": "_pointer", + "nodeType": "YulIdentifier", + "src": "4540:8:19" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "4550:2:19", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "4536:3:19" + }, + "nodeType": "YulFunctionCall", + "src": "4536:17:19" + }, + "variableNames": [ + { + "name": "newPointer", + "nodeType": "YulIdentifier", + "src": "4522:10:19" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2464, + "isOffset": true, + "isSlot": false, + "src": "4501:12:19", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2466, + "isOffset": false, + "isSlot": false, + "src": "4491:8:19", + "valueSize": 1 + }, + { + "declaration": 2466, + "isOffset": false, + "isSlot": false, + "src": "4540:8:19", + "valueSize": 1 + }, + { + "declaration": 2469, + "isOffset": false, + "isSlot": false, + "src": "4469:1:19", + "valueSize": 1 + }, + { + "declaration": 2471, + "isOffset": false, + "isSlot": false, + "src": "4522:10:19", + "valueSize": 1 + } + ], + "id": 2473, + "nodeType": "InlineAssembly", + "src": "4452:107:19" + } + ] + }, + "documentation": { + "id": 2462, + "nodeType": "StructuredDocumentation", + "src": "4009:295:19", + "text": " @notice Returns the bytes32 value at the given index in the input data and updates the pointer.\n @param _data The input data.\n @param _pointer The index of the value to retrieve.\n @return a The bytes32 value at the given index.\n @return newPointer The new pointer." + }, + "id": 2475, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readBytes32", + "nameLocation": "4316:11:19", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2467, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2464, + "mutability": "mutable", + "name": "_data", + "nameLocation": "4348:5:19", + "nodeType": "VariableDeclaration", + "scope": 2475, + "src": "4333:20:19", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2463, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4333:5:19", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2466, + "mutability": "mutable", + "name": "_pointer", + "nameLocation": "4367:8:19", + "nodeType": "VariableDeclaration", + "scope": 2475, + "src": "4359:16:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2465, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4359:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4327:52:19" + }, + "returnParameters": { + "id": 2472, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2469, + "mutability": "mutable", + "name": "a", + "nameLocation": "4416:1:19", + "nodeType": "VariableDeclaration", + "scope": 2475, + "src": "4408:9:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2468, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4408:7:19", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2471, + "mutability": "mutable", + "name": "newPointer", + "nameLocation": "4431:10:19", + "nodeType": "VariableDeclaration", + "scope": 2475, + "src": "4423:18:19", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2470, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4423:7:19", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "4402:43:19" + }, + "scope": 2476, + "src": "4307:256:19", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2477, + "src": "435:4130:19", + "usedErrors": [] + } + ], + "src": "39:4527:19" + }, + "id": 19 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibOptim.sol", + "exportedSymbols": { + "LibOptim": [ + 2530 + ] + }, + "id": 2531, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2478, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:20" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "LibOptim", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 2479, + "nodeType": "StructuredDocumentation", + "src": "64:179:20", + "text": " @title Library for optimized EVM operations\n @author Agustin Aguilar (aa@horizon.io)\n @notice This library contains functions for optimizing certain EVM operations." + }, + "fullyImplemented": true, + "id": 2530, + "linearizedBaseContracts": [ + 2530 + ], + "name": "LibOptim", + "nameLocation": "252:8:20", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 2490, + "nodeType": "Block", + "src": "633:95:20", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "648:76:20", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "663:1:20", + "type": "", + "value": "0" + }, + { + "name": "_a", + "nodeType": "YulIdentifier", + "src": "666:2:20" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "656:6:20" + }, + "nodeType": "YulFunctionCall", + "src": "656:13:20" + }, + "nodeType": "YulExpressionStatement", + "src": "656:13:20" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "683:2:20", + "type": "", + "value": "32" + }, + { + "name": "_b", + "nodeType": "YulIdentifier", + "src": "687:2:20" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "676:6:20" + }, + "nodeType": "YulFunctionCall", + "src": "676:14:20" + }, + "nodeType": "YulExpressionStatement", + "src": "676:14:20" + }, + { + "nodeType": "YulAssignment", + "src": "697:21:20", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "712:1:20", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "715:2:20", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "keccak256", + "nodeType": "YulIdentifier", + "src": "702:9:20" + }, + "nodeType": "YulFunctionCall", + "src": "702:16:20" + }, + "variableNames": [ + { + "name": "c", + "nodeType": "YulIdentifier", + "src": "697:1:20" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2482, + "isOffset": false, + "isSlot": false, + "src": "666:2:20", + "valueSize": 1 + }, + { + "declaration": 2484, + "isOffset": false, + "isSlot": false, + "src": "687:2:20", + "valueSize": 1 + }, + { + "declaration": 2487, + "isOffset": false, + "isSlot": false, + "src": "697:1:20", + "valueSize": 1 + } + ], + "id": 2489, + "nodeType": "InlineAssembly", + "src": "639:85:20" + } + ] + }, + "documentation": { + "id": 2480, + "nodeType": "StructuredDocumentation", + "src": "266:274:20", + "text": " @notice Computes the keccak256 hash of two 32-byte inputs.\n @dev It uses only scratch memory space.\n @param _a The first 32 bytes of the hash.\n @param _b The second 32 bytes of the hash.\n @return c The keccak256 hash of the two 32-byte inputs." + }, + "id": 2491, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "fkeccak256", + "nameLocation": "552:10:20", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2485, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2482, + "mutability": "mutable", + "name": "_a", + "nameLocation": "576:2:20", + "nodeType": "VariableDeclaration", + "scope": 2491, + "src": "568:10:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2481, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "568:7:20", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2484, + "mutability": "mutable", + "name": "_b", + "nameLocation": "592:2:20", + "nodeType": "VariableDeclaration", + "scope": 2491, + "src": "584:10:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2483, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "584:7:20", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "562:36:20" + }, + "returnParameters": { + "id": 2488, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2487, + "mutability": "mutable", + "name": "c", + "nameLocation": "630:1:20", + "nodeType": "VariableDeclaration", + "scope": 2491, + "src": "622:9:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2486, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "622:7:20", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "621:11:20" + }, + "scope": 2530, + "src": "543:185:20", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2498, + "nodeType": "Block", + "src": "913:210:20", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "928:191:20", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "936:28:20", + "value": { + "arguments": [], + "functionName": { + "name": "returndatasize", + "nodeType": "YulIdentifier", + "src": "948:14:20" + }, + "nodeType": "YulFunctionCall", + "src": "948:16:20" + }, + "variables": [ + { + "name": "size", + "nodeType": "YulTypedName", + "src": "940:4:20", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "971:16:20", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "982:4:20", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "976:5:20" + }, + "nodeType": "YulFunctionCall", + "src": "976:11:20" + }, + "variableNames": [ + { + "name": "r", + "nodeType": "YulIdentifier", + "src": "971:1:20" + } + ] + }, + { + "nodeType": "YulVariableDeclaration", + "src": "994:23:20", + "value": { + "arguments": [ + { + "name": "r", + "nodeType": "YulIdentifier", + "src": "1011:1:20" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1014:2:20", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1007:3:20" + }, + "nodeType": "YulFunctionCall", + "src": "1007:10:20" + }, + "variables": [ + { + "name": "start", + "nodeType": "YulTypedName", + "src": "998:5:20", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1031:4:20", + "type": "", + "value": "0x40" + }, + { + "arguments": [ + { + "name": "start", + "nodeType": "YulIdentifier", + "src": "1041:5:20" + }, + { + "name": "size", + "nodeType": "YulIdentifier", + "src": "1048:4:20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1037:3:20" + }, + "nodeType": "YulFunctionCall", + "src": "1037:16:20" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1024:6:20" + }, + "nodeType": "YulFunctionCall", + "src": "1024:30:20" + }, + "nodeType": "YulExpressionStatement", + "src": "1024:30:20" + }, + { + "expression": { + "arguments": [ + { + "name": "r", + "nodeType": "YulIdentifier", + "src": "1068:1:20" + }, + { + "name": "size", + "nodeType": "YulIdentifier", + "src": "1071:4:20" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1061:6:20" + }, + "nodeType": "YulFunctionCall", + "src": "1061:15:20" + }, + "nodeType": "YulExpressionStatement", + "src": "1061:15:20" + }, + { + "expression": { + "arguments": [ + { + "name": "start", + "nodeType": "YulIdentifier", + "src": "1098:5:20" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1105:1:20", + "type": "", + "value": "0" + }, + { + "name": "size", + "nodeType": "YulIdentifier", + "src": "1108:4:20" + } + ], + "functionName": { + "name": "returndatacopy", + "nodeType": "YulIdentifier", + "src": "1083:14:20" + }, + "nodeType": "YulFunctionCall", + "src": "1083:30:20" + }, + "nodeType": "YulExpressionStatement", + "src": "1083:30:20" + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2495, + "isOffset": false, + "isSlot": false, + "src": "1011:1:20", + "valueSize": 1 + }, + { + "declaration": 2495, + "isOffset": false, + "isSlot": false, + "src": "1068:1:20", + "valueSize": 1 + }, + { + "declaration": 2495, + "isOffset": false, + "isSlot": false, + "src": "971:1:20", + "valueSize": 1 + } + ], + "id": 2497, + "nodeType": "InlineAssembly", + "src": "919:200:20" + } + ] + }, + "documentation": { + "id": 2492, + "nodeType": "StructuredDocumentation", + "src": "732:117:20", + "text": " @notice Returns the return data from the last call.\n @return r The return data from the last call." + }, + "id": 2499, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "returnData", + "nameLocation": "861:10:20", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2493, + "nodeType": "ParameterList", + "parameters": [], + "src": "871:2:20" + }, + "returnParameters": { + "id": 2496, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2495, + "mutability": "mutable", + "name": "r", + "nameLocation": "910:1:20", + "nodeType": "VariableDeclaration", + "scope": 2499, + "src": "897:14:20", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2494, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "897:5:20", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "896:16:20" + }, + "scope": 2530, + "src": "852:271:20", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2514, + "nodeType": "Block", + "src": "1648:230:20", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "1663:211:20", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1671:22:20", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1688:4:20", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "1682:5:20" + }, + "nodeType": "YulFunctionCall", + "src": "1682:11:20" + }, + "variables": [ + { + "name": "tmp", + "nodeType": "YulTypedName", + "src": "1675:3:20", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "tmp", + "nodeType": "YulIdentifier", + "src": "1713:3:20" + }, + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "1718:12:20" + }, + { + "name": "_data.length", + "nodeType": "YulIdentifier", + "src": "1732:12:20" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "1700:12:20" + }, + "nodeType": "YulFunctionCall", + "src": "1700:45:20" + }, + "nodeType": "YulExpressionStatement", + "src": "1700:45:20" + }, + { + "nodeType": "YulAssignment", + "src": "1753:115:20", + "value": { + "arguments": [ + { + "name": "_gas", + "nodeType": "YulIdentifier", + "src": "1772:4:20" + }, + { + "name": "_to", + "nodeType": "YulIdentifier", + "src": "1786:3:20" + }, + { + "name": "_val", + "nodeType": "YulIdentifier", + "src": "1799:4:20" + }, + { + "name": "tmp", + "nodeType": "YulIdentifier", + "src": "1813:3:20" + }, + { + "name": "_data.length", + "nodeType": "YulIdentifier", + "src": "1826:12:20" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1848:1:20", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1859:1:20", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "call", + "nodeType": "YulIdentifier", + "src": "1758:4:20" + }, + "nodeType": "YulFunctionCall", + "src": "1758:110:20" + }, + "variableNames": [ + { + "name": "r", + "nodeType": "YulIdentifier", + "src": "1753:1:20" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2508, + "isOffset": false, + "isSlot": false, + "src": "1732:12:20", + "suffix": "length", + "valueSize": 1 + }, + { + "declaration": 2508, + "isOffset": false, + "isSlot": false, + "src": "1826:12:20", + "suffix": "length", + "valueSize": 1 + }, + { + "declaration": 2508, + "isOffset": true, + "isSlot": false, + "src": "1718:12:20", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2506, + "isOffset": false, + "isSlot": false, + "src": "1772:4:20", + "valueSize": 1 + }, + { + "declaration": 2502, + "isOffset": false, + "isSlot": false, + "src": "1786:3:20", + "valueSize": 1 + }, + { + "declaration": 2504, + "isOffset": false, + "isSlot": false, + "src": "1799:4:20", + "valueSize": 1 + }, + { + "declaration": 2511, + "isOffset": false, + "isSlot": false, + "src": "1753:1:20", + "valueSize": 1 + } + ], + "id": 2513, + "nodeType": "InlineAssembly", + "src": "1654:220:20" + } + ] + }, + "documentation": { + "id": 2500, + "nodeType": "StructuredDocumentation", + "src": "1127:395:20", + "text": " @notice Calls another contract with the given parameters.\n @dev This method doesn't increase the memory pointer.\n @param _to The address of the contract to call.\n @param _val The value to send to the contract.\n @param _gas The amount of gas to provide for the call.\n @param _data The data to send to the contract.\n @return r The success status of the call." + }, + "id": 2515, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "call", + "nameLocation": "1534:4:20", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2509, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2502, + "mutability": "mutable", + "name": "_to", + "nameLocation": "1552:3:20", + "nodeType": "VariableDeclaration", + "scope": 2515, + "src": "1544:11:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2501, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1544:7:20", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2504, + "mutability": "mutable", + "name": "_val", + "nameLocation": "1569:4:20", + "nodeType": "VariableDeclaration", + "scope": 2515, + "src": "1561:12:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2503, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1561:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2506, + "mutability": "mutable", + "name": "_gas", + "nameLocation": "1587:4:20", + "nodeType": "VariableDeclaration", + "scope": 2515, + "src": "1579:12:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2505, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1579:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2508, + "mutability": "mutable", + "name": "_data", + "nameLocation": "1612:5:20", + "nodeType": "VariableDeclaration", + "scope": 2515, + "src": "1597:20:20", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2507, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1597:5:20", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1538:83:20" + }, + "returnParameters": { + "id": 2512, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2511, + "mutability": "mutable", + "name": "r", + "nameLocation": "1645:1:20", + "nodeType": "VariableDeclaration", + "scope": 2515, + "src": "1640:6:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 2510, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1640:4:20", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "1639:8:20" + }, + "scope": 2530, + "src": "1525:353:20", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2528, + "nodeType": "Block", + "src": "2361:224:20", + "statements": [ + { + "AST": { + "nodeType": "YulBlock", + "src": "2376:205:20", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "2384:22:20", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2401:4:20", + "type": "", + "value": "0x40" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "2395:5:20" + }, + "nodeType": "YulFunctionCall", + "src": "2395:11:20" + }, + "variables": [ + { + "name": "tmp", + "nodeType": "YulTypedName", + "src": "2388:3:20", + "type": "" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "tmp", + "nodeType": "YulIdentifier", + "src": "2426:3:20" + }, + { + "name": "_data.offset", + "nodeType": "YulIdentifier", + "src": "2431:12:20" + }, + { + "name": "_data.length", + "nodeType": "YulIdentifier", + "src": "2445:12:20" + } + ], + "functionName": { + "name": "calldatacopy", + "nodeType": "YulIdentifier", + "src": "2413:12:20" + }, + "nodeType": "YulFunctionCall", + "src": "2413:45:20" + }, + "nodeType": "YulExpressionStatement", + "src": "2413:45:20" + }, + { + "nodeType": "YulAssignment", + "src": "2466:109:20", + "value": { + "arguments": [ + { + "name": "_gas", + "nodeType": "YulIdentifier", + "src": "2493:4:20" + }, + { + "name": "_to", + "nodeType": "YulIdentifier", + "src": "2507:3:20" + }, + { + "name": "tmp", + "nodeType": "YulIdentifier", + "src": "2520:3:20" + }, + { + "name": "_data.length", + "nodeType": "YulIdentifier", + "src": "2533:12:20" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2555:1:20", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2566:1:20", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "delegatecall", + "nodeType": "YulIdentifier", + "src": "2471:12:20" + }, + "nodeType": "YulFunctionCall", + "src": "2471:104:20" + }, + "variableNames": [ + { + "name": "r", + "nodeType": "YulIdentifier", + "src": "2466:1:20" + } + ] + } + ] + }, + "evmVersion": "paris", + "externalReferences": [ + { + "declaration": 2522, + "isOffset": false, + "isSlot": false, + "src": "2445:12:20", + "suffix": "length", + "valueSize": 1 + }, + { + "declaration": 2522, + "isOffset": false, + "isSlot": false, + "src": "2533:12:20", + "suffix": "length", + "valueSize": 1 + }, + { + "declaration": 2522, + "isOffset": true, + "isSlot": false, + "src": "2431:12:20", + "suffix": "offset", + "valueSize": 1 + }, + { + "declaration": 2520, + "isOffset": false, + "isSlot": false, + "src": "2493:4:20", + "valueSize": 1 + }, + { + "declaration": 2518, + "isOffset": false, + "isSlot": false, + "src": "2507:3:20", + "valueSize": 1 + }, + { + "declaration": 2525, + "isOffset": false, + "isSlot": false, + "src": "2466:1:20", + "valueSize": 1 + } + ], + "id": 2527, + "nodeType": "InlineAssembly", + "src": "2367:214:20" + } + ] + }, + "documentation": { + "id": 2516, + "nodeType": "StructuredDocumentation", + "src": "1882:363:20", + "text": " @notice Calls another contract with the given parameters, using delegatecall.\n @dev This method doesn't increase the memory pointer.\n @param _to The address of the contract to call.\n @param _gas The amount of gas to provide for the call.\n @param _data The data to send to the contract.\n @return r The success status of the call." + }, + "id": 2529, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "delegatecall", + "nameLocation": "2257:12:20", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2523, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2518, + "mutability": "mutable", + "name": "_to", + "nameLocation": "2283:3:20", + "nodeType": "VariableDeclaration", + "scope": 2529, + "src": "2275:11:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2517, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2275:7:20", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2520, + "mutability": "mutable", + "name": "_gas", + "nameLocation": "2300:4:20", + "nodeType": "VariableDeclaration", + "scope": 2529, + "src": "2292:12:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2519, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2292:7:20", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2522, + "mutability": "mutable", + "name": "_data", + "nameLocation": "2325:5:20", + "nodeType": "VariableDeclaration", + "scope": 2529, + "src": "2310:20:20", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2521, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "2310:5:20", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "2269:65:20" + }, + "returnParameters": { + "id": 2526, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2525, + "mutability": "mutable", + "name": "r", + "nameLocation": "2358:1:20", + "nodeType": "VariableDeclaration", + "scope": 2529, + "src": "2353:6:20", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 2524, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "2353:4:20", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "2352:8:20" + }, + "scope": 2530, + "src": "2248:337:20", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2531, + "src": "244:2343:20", + "usedErrors": [] + } + ], + "src": "39:2549:20" + }, + "id": 20 + }, + "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol": { + "ast": { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/SignatureValidator.sol", + "exportedSymbols": { + "IERC1271Wallet": [ + 22 + ], + "LibBytes": [ + 2374 + ], + "SignatureValidator": [ + 2798 + ] + }, + "id": 2799, + "license": "Apache-2.0", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2532, + "literals": [ + "solidity", + "0.8", + ".18" + ], + "nodeType": "PragmaDirective", + "src": "39:23:21" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/interfaces/IERC1271Wallet.sol", + "file": "../interfaces/IERC1271Wallet.sol", + "id": 2533, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2799, + "sourceUnit": 23, + "src": "64:42:21", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "sourcify-verified/1/0xfea230Ee243f88BC698dD8f1aE93F8301B6cdfaE/sources/contracts/utils/LibBytes.sol", + "file": "./LibBytes.sol", + "id": 2534, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 2799, + "sourceUnit": 2375, + "src": "108:24:21", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "SignatureValidator", + "contractDependencies": [], + "contractKind": "library", + "documentation": { + "id": 2535, + "nodeType": "StructuredDocumentation", + "src": "134:295:21", + "text": " @dev Contains logic for signature validation.\n Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md)\n Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/" + }, + "fullyImplemented": true, + "id": 2798, + "linearizedBaseContracts": [ + 2798 + ], + "name": "SignatureValidator", + "nameLocation": "438:18:21", + "nodeType": "ContractDefinition", + "nodes": [ + { + "errorSelector": "2ee17a3d", + "id": 2539, + "name": "InvalidSignatureLength", + "nameLocation": "479:22:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2538, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2537, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "508:10:21", + "nodeType": "VariableDeclaration", + "scope": 2539, + "src": "502:16:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2536, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "502:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "501:18:21" + }, + "src": "473:47:21" + }, + { + "errorSelector": "ac241e11", + "id": 2541, + "name": "EmptySignature", + "nameLocation": "529:14:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2540, + "nodeType": "ParameterList", + "parameters": [], + "src": "543:2:21" + }, + "src": "523:23:21" + }, + { + "errorSelector": "ad4aac76", + "id": 2547, + "name": "InvalidSValue", + "nameLocation": "555:13:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2546, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2543, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "575:10:21", + "nodeType": "VariableDeclaration", + "scope": 2547, + "src": "569:16:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2542, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "569:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2545, + "mutability": "mutable", + "name": "_s", + "nameLocation": "595:2:21", + "nodeType": "VariableDeclaration", + "scope": 2547, + "src": "587:10:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2544, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "587:7:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "src": "568:30:21" + }, + "src": "549:50:21" + }, + { + "errorSelector": "e578897e", + "id": 2553, + "name": "InvalidVValue", + "nameLocation": "608:13:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2552, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2549, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "628:10:21", + "nodeType": "VariableDeclaration", + "scope": 2553, + "src": "622:16:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2548, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "622:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2551, + "mutability": "mutable", + "name": "_v", + "nameLocation": "648:2:21", + "nodeType": "VariableDeclaration", + "scope": 2553, + "src": "640:10:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2550, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "640:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "621:30:21" + }, + "src": "602:50:21" + }, + { + "errorSelector": "9dfba852", + "id": 2561, + "name": "UnsupportedSignatureType", + "nameLocation": "661:24:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2560, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2555, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "692:10:21", + "nodeType": "VariableDeclaration", + "scope": 2561, + "src": "686:16:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2554, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "686:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2557, + "mutability": "mutable", + "name": "_type", + "nameLocation": "712:5:21", + "nodeType": "VariableDeclaration", + "scope": 2561, + "src": "704:13:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2556, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "704:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2559, + "mutability": "mutable", + "name": "_recoverMode", + "nameLocation": "724:12:21", + "nodeType": "VariableDeclaration", + "scope": 2561, + "src": "719:17:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 2558, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "719:4:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "685:52:21" + }, + "src": "655:83:21" + }, + { + "errorSelector": "6c1719d2", + "id": 2565, + "name": "SignerIsAddress0", + "nameLocation": "747:16:21", + "nodeType": "ErrorDefinition", + "parameters": { + "id": 2564, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2563, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "770:10:21", + "nodeType": "VariableDeclaration", + "scope": 2565, + "src": "764:16:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2562, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "764:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "763:18:21" + }, + "src": "741:41:21" + }, + { + "global": false, + "id": 2568, + "libraryName": { + "id": 2566, + "name": "LibBytes", + "nameLocations": [ + "792:8:21" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 2374, + "src": "792:8:21" + }, + "nodeType": "UsingForDirective", + "src": "786:25:21", + "typeName": { + "id": 2567, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "805:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + } + }, + { + "constant": true, + "id": 2571, + "mutability": "constant", + "name": "ERC1271_MAGICVALUE", + "nameLocation": "1017:18:21", + "nodeType": "VariableDeclaration", + "scope": 2798, + "src": "992:56:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 2569, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "992:6:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "value": { + "hexValue": "30783230633133623062", + "id": 2570, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1038:10:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_549534475_by_1", + "typeString": "int_const 549534475" + }, + "value": "0x20c13b0b" + }, + "visibility": "internal" + }, + { + "constant": true, + "id": 2574, + "mutability": "constant", + "name": "ERC1271_MAGICVALUE_BYTES32", + "nameLocation": "1136:26:21", + "nodeType": "VariableDeclaration", + "scope": 2798, + "src": "1111:64:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "typeName": { + "id": 2572, + "name": "bytes4", + "nodeType": "ElementaryTypeName", + "src": "1111:6:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "value": { + "hexValue": "30783136323662613765", + "id": 2573, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1165:10:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_371636862_by_1", + "typeString": "int_const 371636862" + }, + "value": "0x1626ba7e" + }, + "visibility": "internal" + }, + { + "constant": true, + "id": 2577, + "mutability": "constant", + "name": "SIG_TYPE_EIP712", + "nameLocation": "1235:15:21", + "nodeType": "VariableDeclaration", + "scope": 2798, + "src": "1210:44:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2575, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1210:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "31", + "id": 2576, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1253:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 2580, + "mutability": "constant", + "name": "SIG_TYPE_ETH_SIGN", + "nameLocation": "1283:17:21", + "nodeType": "VariableDeclaration", + "scope": 2798, + "src": "1258:46:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2578, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1258:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "32", + "id": 2579, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1303:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 2583, + "mutability": "constant", + "name": "SIG_TYPE_WALLET_BYTES32", + "nameLocation": "1333:23:21", + "nodeType": "VariableDeclaration", + "scope": 2798, + "src": "1308:52:21", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2581, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1308:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "hexValue": "33", + "id": 2582, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1359:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "visibility": "private" + }, + { + "body": { + "id": 2714, + "nodeType": "Block", + "src": "1883:2200:21", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2596, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2593, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "1893:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2594, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "1904:6:21", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "1893:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "3636", + "id": 2595, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1914:2:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_66_by_1", + "typeString": "int_const 66" + }, + "value": "66" + }, + "src": "1893:23:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2601, + "nodeType": "IfStatement", + "src": "1889:70:21", + "trueBody": { + "errorCall": { + "arguments": [ + { + "id": 2598, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "1948:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 2597, + "name": "InvalidSignatureLength", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2539, + "src": "1925:22:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes memory) pure" + } + }, + "id": 2599, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1925:34:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2600, + "nodeType": "RevertStatement", + "src": "1918:41:21" + } + }, + { + "assignments": [ + 2603 + ], + "declarations": [ + { + "constant": false, + "id": 2603, + "mutability": "mutable", + "name": "signatureType", + "nameLocation": "1973:13:21", + "nodeType": "VariableDeclaration", + "scope": 2714, + "src": "1965:21:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2602, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1965:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2611, + "initialValue": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2609, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2606, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "2010:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2607, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2021:6:21", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "2010:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "hexValue": "31", + "id": 2608, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2030:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "2010:21:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 2604, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "1989:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2605, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2000:9:21", + "memberName": "readUint8", + "nodeType": "MemberAccess", + "referencedDeclaration": 2351, + "src": "1989:20:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint8_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint8)" + } + }, + "id": 2610, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "1989:43:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1965:67:21" + }, + { + "assignments": [ + 2613 + ], + "declarations": [ + { + "constant": false, + "id": 2613, + "mutability": "mutable", + "name": "v", + "nameLocation": "2090:1:21", + "nodeType": "VariableDeclaration", + "scope": 2714, + "src": "2084:7:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 2612, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "2084:5:21", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "visibility": "internal" + } + ], + "id": 2618, + "initialValue": { + "arguments": [ + { + "hexValue": "3634", + "id": 2616, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2115:2:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + }, + "value": "64" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_64_by_1", + "typeString": "int_const 64" + } + ], + "expression": { + "id": 2614, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "2094:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2615, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2105:9:21", + "memberName": "readUint8", + "nodeType": "MemberAccess", + "referencedDeclaration": 2351, + "src": "2094:20:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_uint8_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (uint8)" + } + }, + "id": 2617, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2094:24:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2084:34:21" + }, + { + "assignments": [ + 2620 + ], + "declarations": [ + { + "constant": false, + "id": 2620, + "mutability": "mutable", + "name": "r", + "nameLocation": "2132:1:21", + "nodeType": "VariableDeclaration", + "scope": 2714, + "src": "2124:9:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2619, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2124:7:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 2625, + "initialValue": { + "arguments": [ + { + "hexValue": "30", + "id": 2623, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2159:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "expression": { + "id": 2621, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "2136:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2622, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2147:11:21", + "memberName": "readBytes32", + "nodeType": "MemberAccess", + "referencedDeclaration": 2339, + "src": "2136:22:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_bytes32_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (bytes32)" + } + }, + "id": 2624, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2136:25:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2124:37:21" + }, + { + "assignments": [ + 2627 + ], + "declarations": [ + { + "constant": false, + "id": 2627, + "mutability": "mutable", + "name": "s", + "nameLocation": "2175:1:21", + "nodeType": "VariableDeclaration", + "scope": 2714, + "src": "2167:9:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2626, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "2167:7:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + } + ], + "id": 2632, + "initialValue": { + "arguments": [ + { + "hexValue": "3332", + "id": 2630, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2202:2:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + } + ], + "expression": { + "id": 2628, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "2179:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2629, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "2190:11:21", + "memberName": "readBytes32", + "nodeType": "MemberAccess", + "referencedDeclaration": 2339, + "src": "2179:22:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes_calldata_ptr_$_t_uint256_$returns$_t_bytes32_$attached_to$_t_bytes_calldata_ptr_$", + "typeString": "function (bytes calldata,uint256) pure returns (bytes32)" + } + }, + "id": 2631, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "2179:26:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2167:38:21" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2638, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 2635, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2627, + "src": "3204:1:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 2634, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "3196:7:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2633, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3196:7:21", + "typeDescriptions": {} + } + }, + "id": 2636, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3196:10:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "hexValue": "307837464646464646464646464646464646464646464646464646464646464646463544353736453733353741343530314444464539324634363638314232304130", + "id": 2637, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3209:66:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_57896044618658097711785492504343953926418782139537452191302581570759080747168_by_1", + "typeString": "int_const 5789...(69 digits omitted)...7168" + }, + "value": "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0" + }, + "src": "3196:79:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2645, + "nodeType": "IfStatement", + "src": "3192:135:21", + "trueBody": { + "id": 2644, + "nodeType": "Block", + "src": "3277:50:21", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 2640, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "3306:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "id": 2641, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2627, + "src": "3318:1:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 2639, + "name": "InvalidSValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2547, + "src": "3292:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$_t_bytes32_$returns$__$", + "typeString": "function (bytes memory,bytes32) pure" + } + }, + "id": 2642, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3292:28:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2643, + "nodeType": "RevertStatement", + "src": "3285:35:21" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2652, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 2648, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2646, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2613, + "src": "3337:1:21", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "3237", + "id": 2647, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3342:2:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_27_by_1", + "typeString": "int_const 27" + }, + "value": "27" + }, + "src": "3337:7:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "id": 2651, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2649, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2613, + "src": "3348:1:21", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "hexValue": "3238", + "id": 2650, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3353:2:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_28_by_1", + "typeString": "int_const 28" + }, + "value": "28" + }, + "src": "3348:7:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "3337:18:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2659, + "nodeType": "IfStatement", + "src": "3333:74:21", + "trueBody": { + "id": 2658, + "nodeType": "Block", + "src": "3357:50:21", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 2654, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "3386:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "id": 2655, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2613, + "src": "3398:1:21", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + ], + "id": 2653, + "name": "InvalidVValue", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2553, + "src": "3372:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$_t_uint256_$returns$__$", + "typeString": "function (bytes memory,uint256) pure" + } + }, + "id": 2656, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3372:28:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2657, + "nodeType": "RevertStatement", + "src": "3365:35:21" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2662, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2660, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2603, + "src": "3447:13:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 2661, + "name": "SIG_TYPE_EIP712", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2577, + "src": "3464:15:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3447:32:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2675, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2673, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2603, + "src": "3608:13:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 2674, + "name": "SIG_TYPE_ETH_SIGN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2580, + "src": "3625:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3608:34:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 2698, + "nodeType": "Block", + "src": "3805:147:21", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 2693, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "3913:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "id": 2694, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2603, + "src": "3925:13:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "hexValue": "74727565", + "id": 2695, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3940:4:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "true" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 2692, + "name": "UnsupportedSignatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2561, + "src": "3888:24:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_bool_$returns$__$", + "typeString": "function (bytes memory,uint256,bool) pure" + } + }, + "id": 2696, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3888:57:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2697, + "nodeType": "RevertStatement", + "src": "3881:64:21" + } + ] + }, + "id": 2699, + "nodeType": "IfStatement", + "src": "3604:348:21", + "trueBody": { + "id": 2691, + "nodeType": "Block", + "src": "3644:155:21", + "statements": [ + { + "expression": { + "id": 2689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2676, + "name": "signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2591, + "src": "3652:6:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "arguments": [ + { + "arguments": [ + { + "hexValue": "19457468657265756d205369676e6564204d6573736167653a0a3332", + "id": 2681, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3707:34:21", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73", + "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\"" + }, + "value": "\u0019Ethereum Signed Message:\n32" + }, + { + "id": 2682, + "name": "_hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2586, + "src": "3743:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73", + "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\"" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "expression": { + "id": 2679, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967295, + "src": "3690:3:21", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 2680, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberLocation": "3694:12:21", + "memberName": "encodePacked", + "nodeType": "MemberAccess", + "src": "3690:16:21", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$", + "typeString": "function () pure returns (bytes memory)" + } + }, + "id": 2683, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3690:59:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "id": 2678, + "name": "keccak256", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967288, + "src": "3680:9:21", + "typeDescriptions": { + "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", + "typeString": "function (bytes memory) pure returns (bytes32)" + } + }, + "id": 2684, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3680:70:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 2685, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2613, + "src": "3760:1:21", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 2686, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2620, + "src": "3771:1:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 2687, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2627, + "src": "3782:1:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 2677, + "name": "ecrecover", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967290, + "src": "3661:9:21", + "typeDescriptions": { + "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$", + "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)" + } + }, + "id": 2688, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3661:130:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3652:139:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 2690, + "nodeType": "ExpressionStatement", + "src": "3652:139:21" + } + ] + } + }, + "id": 2700, + "nodeType": "IfStatement", + "src": "3443:509:21", + "trueBody": { + "id": 2672, + "nodeType": "Block", + "src": "3481:117:21", + "statements": [ + { + "expression": { + "id": 2670, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2663, + "name": "signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2591, + "src": "3489:6:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 2665, + "name": "_hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2586, + "src": "3508:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 2666, + "name": "v", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2613, + "src": "3515:1:21", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + { + "id": 2667, + "name": "r", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2620, + "src": "3518:1:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 2668, + "name": "s", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2627, + "src": "3521:1:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + ], + "id": 2664, + "name": "ecrecover", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 4294967290, + "src": "3498:9:21", + "typeDescriptions": { + "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$", + "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)" + } + }, + "id": 2669, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "3498:25:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3489:34:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 2671, + "nodeType": "ExpressionStatement", + "src": "3489:34:21" + } + ] + } + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 2706, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2701, + "name": "signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2591, + "src": "3999:6:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "hexValue": "307830", + "id": 2704, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4017:3:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0x0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 2703, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4009:7:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 2702, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4009:7:21", + "typeDescriptions": {} + } + }, + "id": 2705, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4009:12:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3999:22:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2711, + "nodeType": "IfStatement", + "src": "3995:63:21", + "trueBody": { + "errorCall": { + "arguments": [ + { + "id": 2708, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2588, + "src": "4047:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 2707, + "name": "SignerIsAddress0", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2565, + "src": "4030:16:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$returns$__$", + "typeString": "function (bytes memory) pure" + } + }, + "id": 2709, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4030:28:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2710, + "nodeType": "RevertStatement", + "src": "4023:35:21" + } + }, + { + "expression": { + "id": 2712, + "name": "signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2591, + "src": "4072:6:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "functionReturnParameters": 2592, + "id": 2713, + "nodeType": "Return", + "src": "4065:13:21" + } + ] + }, + "documentation": { + "id": 2584, + "nodeType": "StructuredDocumentation", + "src": "1485:279:21", + "text": " @notice Recover the signer of hash, assuming it's an EOA account\n @dev Only for SignatureType.EIP712 and SignatureType.EthSign signatures\n @param _hash Hash that was signed\n encoded as (bytes32 r, bytes32 s, uint8 v, ... , SignatureType sigType)" + }, + "id": 2715, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "recoverSigner", + "nameLocation": "1776:13:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2589, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2586, + "mutability": "mutable", + "name": "_hash", + "nameLocation": "1803:5:21", + "nodeType": "VariableDeclaration", + "scope": 2715, + "src": "1795:13:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2585, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "1795:7:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2588, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "1829:10:21", + "nodeType": "VariableDeclaration", + "scope": 2715, + "src": "1814:25:21", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2587, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1814:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "1789:54:21" + }, + "returnParameters": { + "id": 2592, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2591, + "mutability": "mutable", + "name": "signer", + "nameLocation": "1875:6:21", + "nodeType": "VariableDeclaration", + "scope": 2715, + "src": "1867:14:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2590, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1867:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "1866:16:21" + }, + "scope": 2798, + "src": "1767:2316:21", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2796, + "nodeType": "Block", + "src": "4547:815:21", + "statements": [ + { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2730, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2727, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2722, + "src": "4557:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2728, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4568:6:21", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4557:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "hexValue": "30", + "id": 2729, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4578:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "4557:22:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2735, + "nodeType": "IfStatement", + "src": "4553:66:21", + "trueBody": { + "id": 2734, + "nodeType": "Block", + "src": "4581:38:21", + "statements": [ + { + "errorCall": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 2731, + "name": "EmptySignature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2541, + "src": "4596:14:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 2732, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4596:16:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2733, + "nodeType": "RevertStatement", + "src": "4589:23:21" + } + ] + } + }, + { + "assignments": [ + 2737 + ], + "declarations": [ + { + "constant": false, + "id": 2737, + "mutability": "mutable", + "name": "signatureType", + "nameLocation": "4633:13:21", + "nodeType": "VariableDeclaration", + "scope": 2796, + "src": "4625:21:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2736, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4625:7:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "id": 2747, + "initialValue": { + "arguments": [ + { + "baseExpression": { + "id": 2740, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2722, + "src": "4655:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2745, + "indexExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2744, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2741, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2722, + "src": "4666:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2742, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "4677:6:21", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "4666:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "hexValue": "31", + "id": 2743, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4686:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "4666:21:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4655:33:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes1", + "typeString": "bytes1" + } + ], + "id": 2739, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4649:5:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 2738, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "4649:5:21", + "typeDescriptions": {} + } + }, + "id": 2746, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4649:40:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4625:64:21" + }, + { + "condition": { + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2754, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2750, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2748, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2737, + "src": "4699:13:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 2749, + "name": "SIG_TYPE_EIP712", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2577, + "src": "4716:15:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4699:32:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2753, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2751, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2737, + "src": "4735:13:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 2752, + "name": "SIG_TYPE_ETH_SIGN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2580, + "src": "4752:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4735:34:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4699:70:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "condition": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2767, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2765, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2737, + "src": "4898:13:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 2766, + "name": "SIG_TYPE_WALLET_BYTES32", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2583, + "src": "4915:23:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4898:40:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": { + "id": 2793, + "nodeType": "Block", + "src": "5158:200:21", + "statements": [ + { + "errorCall": { + "arguments": [ + { + "id": 2788, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2722, + "src": "5318:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + { + "id": 2789, + "name": "signatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2737, + "src": "5330:13:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "hexValue": "66616c7365", + "id": 2790, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5345:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 2787, + "name": "UnsupportedSignatureType", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2561, + "src": "5293:24:21", + "typeDescriptions": { + "typeIdentifier": "t_function_error_pure$_t_bytes_memory_ptr_$_t_uint256_$_t_bool_$returns$__$", + "typeString": "function (bytes memory,uint256,bool) pure" + } + }, + "id": 2791, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5293:58:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2792, + "nodeType": "RevertStatement", + "src": "5286:65:21" + } + ] + }, + "id": 2794, + "nodeType": "IfStatement", + "src": "4894:464:21", + "trueBody": { + "id": 2786, + "nodeType": "Block", + "src": "4940:212:21", + "statements": [ + { + "expression": { + "id": 2784, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2768, + "name": "valid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2725, + "src": "5022:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + }, + "id": 2783, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 2769, + "name": "ERC1271_MAGICVALUE_BYTES32", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2574, + "src": "5030:26:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "arguments": [ + { + "id": 2774, + "name": "_hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2718, + "src": "5101:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "baseExpression": { + "id": 2775, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2722, + "src": "5108:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "endExpression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2780, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 2777, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2722, + "src": "5121:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + }, + "id": 2778, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5132:6:21", + "memberName": "length", + "nodeType": "MemberAccess", + "src": "5121:17:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "hexValue": "31", + "id": 2779, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5141:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "src": "5121:21:21", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexRangeAccess", + "src": "5108:35:21", + "startExpression": { + "hexValue": "30", + "id": 2776, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5119:1:21", + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr_slice", + "typeString": "bytes calldata slice" + } + ], + "expression": { + "arguments": [ + { + "id": 2771, + "name": "_signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2720, + "src": "5075:7:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2770, + "name": "IERC1271Wallet", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "5060:14:21", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_IERC1271Wallet_$22_$", + "typeString": "type(contract IERC1271Wallet)" + } + }, + "id": 2772, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5060:23:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC1271Wallet_$22", + "typeString": "contract IERC1271Wallet" + } + }, + "id": 2773, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "5084:16:21", + "memberName": "isValidSignature", + "nodeType": "MemberAccess", + "referencedDeclaration": 21, + "src": "5060:40:21", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_bytes4_$", + "typeString": "function (bytes32,bytes memory) view external returns (bytes4)" + } + }, + "id": 2782, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "5060:84:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes4", + "typeString": "bytes4" + } + }, + "src": "5030:114:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "5022:122:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2785, + "nodeType": "ExpressionStatement", + "src": "5022:122:21" + } + ] + } + }, + "id": 2795, + "nodeType": "IfStatement", + "src": "4695:663:21", + "trueBody": { + "id": 2764, + "nodeType": "Block", + "src": "4771:117:21", + "statements": [ + { + "expression": { + "id": 2762, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 2755, + "name": "valid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2725, + "src": "4829:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 2761, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "arguments": [ + { + "id": 2757, + "name": "_hash", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2718, + "src": "4851:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + { + "id": 2758, + "name": "_signature", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2722, + "src": "4858:10:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes calldata" + } + ], + "id": 2756, + "name": "recoverSigner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2715, + "src": "4837:13:21", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_calldata_ptr_$returns$_t_address_$", + "typeString": "function (bytes32,bytes calldata) pure returns (address)" + } + }, + "id": 2759, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "4837:32:21", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 2760, + "name": "_signer", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2720, + "src": "4873:7:21", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "4837:43:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "4829:51:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2763, + "nodeType": "ExpressionStatement", + "src": "4829:51:21" + } + ] + } + } + ] + }, + "documentation": { + "id": 2716, + "nodeType": "StructuredDocumentation", + "src": "4086:322:21", + "text": " @notice Returns true if the provided signature is valid for the given signer.\n @dev Supports SignatureType.EIP712, SignatureType.EthSign, and ERC1271 signatures\n @param _hash Hash that was signed\n @param _signer Address of the signer candidate\n @param _signature Signature byte array" + }, + "id": 2797, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "isValidSignature", + "nameLocation": "4420:16:21", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 2723, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2718, + "mutability": "mutable", + "name": "_hash", + "nameLocation": "4450:5:21", + "nodeType": "VariableDeclaration", + "scope": 2797, + "src": "4442:13:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + }, + "typeName": { + "id": 2717, + "name": "bytes32", + "nodeType": "ElementaryTypeName", + "src": "4442:7:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes32", + "typeString": "bytes32" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2720, + "mutability": "mutable", + "name": "_signer", + "nameLocation": "4469:7:21", + "nodeType": "VariableDeclaration", + "scope": 2797, + "src": "4461:15:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2719, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4461:7:21", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 2722, + "mutability": "mutable", + "name": "_signature", + "nameLocation": "4497:10:21", + "nodeType": "VariableDeclaration", + "scope": 2797, + "src": "4482:25:21", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_bytes_calldata_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 2721, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "4482:5:21", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "visibility": "internal" + } + ], + "src": "4436:75:21" + }, + "returnParameters": { + "id": 2726, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2725, + "mutability": "mutable", + "name": "valid", + "nameLocation": "4540:5:21", + "nodeType": "VariableDeclaration", + "scope": 2797, + "src": "4535:10:21", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 2724, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "4535:4:21", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "visibility": "internal" + } + ], + "src": "4534:12:21" + }, + "scope": 2798, + "src": "4411:951:21", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2799, + "src": "430:4934:21", + "usedErrors": [ + 2539, + 2541, + 2547, + 2553, + 2561, + 2565 + ] + } + ], + "src": "39:5326:21" + }, + "id": 21 + } + } + } +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleAuth.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleAuth.sol new file mode 100644 index 000000000..f696777ca --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleAuth.sol @@ -0,0 +1,176 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../../utils/LibBytes.sol"; +import "../../interfaces/IERC1271Wallet.sol"; + +import "./interfaces/IModuleAuth.sol"; + +import "./ModuleERC165.sol"; + +import "./submodules/auth/SequenceBaseSig.sol"; +import "./submodules/auth/SequenceDynamicSig.sol"; +import "./submodules/auth/SequenceNoChainIdSig.sol"; +import "./submodules/auth/SequenceChainedSig.sol"; + + +abstract contract ModuleAuth is + IModuleAuth, + ModuleERC165, + IERC1271Wallet, + SequenceChainedSig +{ + using LibBytes for bytes; + + bytes1 internal constant LEGACY_TYPE = hex"00"; + bytes1 internal constant DYNAMIC_TYPE = hex"01"; + bytes1 internal constant NO_CHAIN_ID_TYPE = hex"02"; + bytes1 internal constant CHAINED_TYPE = hex"03"; + + bytes4 internal constant SELECTOR_ERC1271_BYTES_BYTES = 0x20c13b0b; + bytes4 internal constant SELECTOR_ERC1271_BYTES32_BYTES = 0x1626ba7e; + + /** + * @notice Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature. + * @dev The signature must be prefixed with a type byte, which is used to determine the recovery method. + * + * @param _digest Digest of the signed data. + * @param _signature A Sequence signature. + * + * @return threshold The required number of signatures needed to consider the signature valid. + * @return weight The actual number of signatures collected in the signature. + * @return imageHash The imageHash of the configuration that signed the message. + * @return subdigest A modified version of the original digest, unique for each wallet/network. + * @return checkpoint A nonce that is incremented every time a new configuration is set. + */ + function signatureRecovery( + bytes32 _digest, + bytes calldata _signature + ) public override virtual view returns ( + uint256 threshold, + uint256 weight, + bytes32 imageHash, + bytes32 subdigest, + uint256 checkpoint + ) { + bytes1 signatureType = _signature[0]; + + if (signatureType == LEGACY_TYPE) { + // networkId digest + base recover + subdigest = SequenceBaseSig.subdigest(_digest); + (threshold, weight, imageHash, checkpoint) = SequenceBaseSig.recover(subdigest, _signature); + return (threshold, weight, imageHash, subdigest, checkpoint); + } + + if (signatureType == DYNAMIC_TYPE) { + // networkId digest + dynamic recover + subdigest = SequenceBaseSig.subdigest(_digest); + (threshold, weight, imageHash, checkpoint) = SequenceDynamicSig.recover(subdigest, _signature); + return (threshold, weight, imageHash, subdigest, checkpoint); + } + + if (signatureType == NO_CHAIN_ID_TYPE) { + // noChainId digest + dynamic recover + subdigest = SequenceNoChainIdSig.subdigest(_digest); + (threshold, weight, imageHash, checkpoint) = SequenceDynamicSig.recover(subdigest, _signature); + return (threshold, weight, imageHash, subdigest, checkpoint); + } + + if (signatureType == CHAINED_TYPE) { + // original digest + chained recover + // (subdigest will be computed in the chained recover) + return chainedRecover(_digest, _signature); + } + + revert InvalidSignatureType(signatureType); + } + + /** + * @dev Validates a signature. + * + * @param _digest Digest of the signed data. + * @param _signature A Sequence signature. + * + * @return isValid Indicates whether the signature is valid or not. + * @return subdigest A modified version of the original digest, unique for each wallet/network. + */ + function _signatureValidation( + bytes32 _digest, + bytes calldata _signature + ) internal override virtual view returns ( + bool isValid, + bytes32 subdigest + ) { + uint256 threshold; uint256 weight; bytes32 imageHash; + (threshold, weight, imageHash, subdigest,) = signatureRecovery(_digest, _signature); + isValid = weight >= threshold && _isValidImage(imageHash); + } + + /** + * @notice Verifies whether the provided signature is valid with respect to the provided data + * @dev MUST return the correct magic value if the signature provided is valid for the provided data + * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)")) + * @param _data Arbitrary length data signed on the behalf of address(this) + * @param _signatures Signature byte array associated with _data. + * Encoded as abi.encode(Signature[], Configs) + * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise + */ + function isValidSignature( + bytes calldata _data, + bytes calldata _signatures + ) public override virtual view returns (bytes4) { + // Validate signatures + (bool isValid,) = _signatureValidation(keccak256(_data), _signatures); + if (isValid) { + return SELECTOR_ERC1271_BYTES_BYTES; + } + + return bytes4(0); + } + + /** + * @notice Verifies whether the provided signature is valid with respect to the provided hash + * @dev MUST return the correct magic value if the signature provided is valid for the provided hash + * > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256("isValidSignature(bytes32,bytes)")) + * @param _hash keccak256 hash that was signed + * @param _signatures Signature byte array associated with _data. + * Encoded as abi.encode(Signature[], Configs) + * @return magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise + */ + function isValidSignature( + bytes32 _hash, + bytes calldata _signatures + ) public override virtual view returns (bytes4) { + // Validate signatures + (bool isValid,) = _signatureValidation(_hash, _signatures); + if (isValid) { + return SELECTOR_ERC1271_BYTES32_BYTES; + } + + return bytes4(0); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) { + if ( + _interfaceID == type(IModuleAuth).interfaceId || + _interfaceID == type(IERC1271Wallet).interfaceId + ) { + return true; + } + + return super.supportsInterface(_interfaceID); + } + + /** + * @notice Updates the signers configuration of the wallet + * @param _imageHash New required image hash of the signature + */ + function updateImageHash(bytes32 _imageHash) external override virtual onlySelf { + _updateImageHash(_imageHash); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleCalls.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleCalls.sol new file mode 100644 index 000000000..c90e0c403 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleCalls.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleSelfAuth.sol"; +import "./ModuleStorage.sol"; +import "./ModuleERC165.sol"; +import "./ModuleNonce.sol"; +import "./ModuleOnlyDelegatecall.sol"; + +import "./interfaces/IModuleCalls.sol"; +import "./interfaces/IModuleAuth.sol"; + +import "./submodules/nonce/SubModuleNonce.sol"; +import "./submodules/auth/SequenceBaseSig.sol"; + +import "../../utils/LibOptim.sol"; + + +abstract contract ModuleCalls is IModuleCalls, IModuleAuth, ModuleERC165, ModuleOnlyDelegatecall, ModuleSelfAuth, ModuleNonce { + /** + * @notice Allow wallet owner to execute an action + * @dev Relayers must ensure that the gasLimit specified for each transaction + * is acceptable to them. A user could specify large enough that it could + * consume all the gas available. + * @param _txs Transactions to process + * @param _nonce Signature nonce (may contain an encoded space) + * @param _signature Encoded signature + */ + function execute( + Transaction[] calldata _txs, + uint256 _nonce, + bytes calldata _signature + ) external override virtual onlyDelegatecall { + // Validate and update nonce + _validateNonce(_nonce); + + // Hash and verify transaction bundle + (bool isValid, bytes32 txHash) = _signatureValidation( + keccak256( + abi.encode( + _nonce, + _txs + ) + ), + _signature + ); + + if (!isValid) { + revert InvalidSignature(txHash, _signature); + } + + // Execute the transactions + _execute(txHash, _txs); + } + + /** + * @notice Allow wallet to execute an action + * without signing the message + * @param _txs Transactions to execute + */ + function selfExecute( + Transaction[] calldata _txs + ) external override virtual onlySelf { + // Hash transaction bundle + bytes32 txHash = SequenceBaseSig.subdigest( + keccak256( + abi.encode('self:', _txs) + ) + ); + + // Execute the transactions + _execute(txHash, _txs); + } + + /** + * @notice Executes a list of transactions + * @param _txHash Hash of the batch of transactions + * @param _txs Transactions to execute + */ + function _execute( + bytes32 _txHash, + Transaction[] calldata _txs + ) private { + unchecked { + // Execute transaction + uint256 size = _txs.length; + for (uint256 i = 0; i < size; i++) { + Transaction calldata transaction = _txs[i]; + uint256 gasLimit = transaction.gasLimit; + + if (gasleft() < gasLimit) revert NotEnoughGas(i, gasLimit, gasleft()); + + bool success; + if (transaction.delegateCall) { + success = LibOptim.delegatecall( + transaction.target, + gasLimit == 0 ? gasleft() : gasLimit, + transaction.data + ); + } else { + success = LibOptim.call( + transaction.target, + transaction.value, + gasLimit == 0 ? gasleft() : gasLimit, + transaction.data + ); + } + + if (success) { + emit TxExecuted(_txHash, i); + } else { + // Avoid copy of return data until neccesary + _revertBytes( + transaction.revertOnError, + _txHash, + i, + LibOptim.returnData() + ); + } + } + } + } + + /** + * @notice Logs a failed transaction, reverts if the transaction is not optional + * @param _revertOnError Signals if it should revert or just log + * @param _txHash Hash of the transaction + * @param _index Index of the transaction in the batch + * @param _reason Encoded revert message + */ + function _revertBytes( + bool _revertOnError, + bytes32 _txHash, + uint256 _index, + bytes memory _reason + ) internal { + if (_revertOnError) { + assembly { revert(add(_reason, 0x20), mload(_reason)) } + } else { + emit TxFailed(_txHash, _index, _reason); + } + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) { + if (_interfaceID == type(IModuleCalls).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleCreator.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleCreator.sol new file mode 100644 index 000000000..deec8e261 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleCreator.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./interfaces/IModuleCreator.sol"; + +import "./ModuleSelfAuth.sol"; +import "./ModuleERC165.sol"; + + +contract ModuleCreator is IModuleCreator, ModuleERC165, ModuleSelfAuth { + event CreatedContract(address _contract); + + /** + * @notice Creates a contract forwarding eth value + * @param _code Creation code of the contract + * @return addr The address of the created contract + */ + function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) { + assembly { addr := create(callvalue(), add(_code, 32), mload(_code)) } + if (addr == address(0)) revert CreateFailed(_code); + emit CreatedContract(addr); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) { + if (_interfaceID == type(IModuleCreator).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleERC165.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleERC165.sol new file mode 100644 index 000000000..2e10bed9a --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleERC165.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +abstract contract ModuleERC165 { + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @dev Adding new hooks will not lead to them being reported by this function + * without upgrading the wallet. In addition, developers must ensure that + * all inherited contracts by the main module don't conflict and are accounted + * to be supported by the supportsInterface method. + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) { + return _interfaceID == this.supportsInterface.selector; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleNonce.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleNonce.sol new file mode 100644 index 000000000..561f5c5f7 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleNonce.sol @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleStorage.sol"; + +import "./submodules/nonce/SubModuleNonce.sol"; + + +contract ModuleNonce { + // Events + event NonceChange(uint256 _space, uint256 _newNonce); + + // Errors + error BadNonce(uint256 _space, uint256 _provided, uint256 _current); + + // NONCE_KEY = keccak256("org.arcadeum.module.calls.nonce"); + bytes32 private constant NONCE_KEY = bytes32(0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e); + + /** + * @notice Returns the next nonce of the default nonce space + * @dev The default nonce space is 0x00 + * @return The next nonce + */ + function nonce() external virtual view returns (uint256) { + return readNonce(0); + } + + /** + * @notice Returns the next nonce of the given nonce space + * @param _space Nonce space, each space keeps an independent nonce count + * @return The next nonce + */ + function readNonce(uint256 _space) public virtual view returns (uint256) { + return uint256(ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space))); + } + + /** + * @notice Changes the next nonce of the given nonce space + * @param _space Nonce space, each space keeps an independent nonce count + * @param _nonce Nonce to write on the space + */ + function _writeNonce(uint256 _space, uint256 _nonce) internal { + ModuleStorage.writeBytes32Map(NONCE_KEY, bytes32(_space), bytes32(_nonce)); + } + + /** + * @notice Verify if a nonce is valid + * @param _rawNonce Nonce to validate (may contain an encoded space) + */ + function _validateNonce(uint256 _rawNonce) internal virtual { + // Retrieve current nonce for this wallet + (uint256 space, uint256 providedNonce) = SubModuleNonce.decodeNonce(_rawNonce); + + uint256 currentNonce = readNonce(space); + if (currentNonce != providedNonce) { + revert BadNonce(space, providedNonce, currentNonce); + } + + unchecked { + uint256 newNonce = providedNonce + 1; + + _writeNonce(space, newNonce); + emit NonceChange(space, newNonce); + return; + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol new file mode 100644 index 000000000..cc33f51de --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleOnlyDelegatecall.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +contract ModuleOnlyDelegatecall { + address private immutable self; + + error OnlyDelegatecall(); + + constructor() { + self = address(this); + } + + /** + * @notice Modifier that only allows functions to be called via delegatecall. + */ + modifier onlyDelegatecall() { + if (address(this) == self) { + revert OnlyDelegatecall(); + } + _; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleSelfAuth.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleSelfAuth.sol new file mode 100644 index 000000000..4492d5082 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleSelfAuth.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +contract ModuleSelfAuth { + error OnlySelfAuth(address _sender, address _self); + + modifier onlySelf() { + if (msg.sender != address(this)) { + revert OnlySelfAuth(msg.sender, address(this)); + } + _; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleStorage.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleStorage.sol new file mode 100644 index 000000000..b61422066 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/ModuleStorage.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +library ModuleStorage { + function writeBytes32(bytes32 _key, bytes32 _val) internal { + assembly { sstore(_key, _val) } + } + + function readBytes32(bytes32 _key) internal view returns (bytes32 val) { + assembly { val := sload(_key) } + } + + function writeBytes32Map(bytes32 _key, bytes32 _subKey, bytes32 _val) internal { + bytes32 key = keccak256(abi.encode(_key, _subKey)); + assembly { sstore(key, _val) } + } + + function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val) { + bytes32 key = keccak256(abi.encode(_key, _subKey)); + assembly { val := sload(key) } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleAuth.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleAuth.sol new file mode 100644 index 000000000..46ae4a76e --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleAuth.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +abstract contract IModuleAuth { + // IMAGE_HASH_KEY = keccak256("org.arcadeum.module.auth.upgradable.image.hash"); + bytes32 internal constant IMAGE_HASH_KEY = bytes32(0xea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8); + + event ImageHashUpdated(bytes32 newImageHash); + + // Errors + error ImageHashIsZero(); + error InvalidSignatureType(bytes1 _type); + + function _signatureValidation( + bytes32 _digest, + bytes calldata _signature + ) internal virtual view returns ( + bool isValid, + bytes32 subdigest + ); + + function signatureRecovery( + bytes32 _digest, + bytes calldata _signature + ) public virtual view returns ( + uint256 threshold, + uint256 weight, + bytes32 imageHash, + bytes32 subdigest, + uint256 checkpoint + ); + + /** + * @notice Validates the signature image + * @return true if the signature image is valid + */ + function _isValidImage(bytes32) internal virtual view returns (bool) { + return false; + } + + /** + * @notice Updates the signers configuration of the wallet + * @param _imageHash New required image hash of the signature + */ + function updateImageHash(bytes32 _imageHash) external virtual; + + /** + * @notice Updates the signers configuration of the wallet + * @param _imageHash New required image hash of the signature + */ + function _updateImageHash(bytes32 _imageHash) internal virtual; +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleCalls.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleCalls.sol new file mode 100644 index 000000000..9030ae7cd --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleCalls.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +interface IModuleCalls { + // Events + event TxFailed(bytes32 indexed _tx, uint256 _index, bytes _reason); + event TxExecuted(bytes32 indexed _tx, uint256 _index); + + // Errors + error NotEnoughGas(uint256 _index, uint256 _requested, uint256 _available); + error InvalidSignature(bytes32 _hash, bytes _signature); + + // Transaction structure + struct Transaction { + bool delegateCall; // Performs delegatecall + bool revertOnError; // Reverts transaction bundle if tx fails + uint256 gasLimit; // Maximum gas to be forwarded + address target; // Address of the contract to call + uint256 value; // Amount of ETH to pass with the call + bytes data; // calldata to pass + } + + /** + * @notice Allow wallet owner to execute an action + * @param _txs Transactions to process + * @param _nonce Signature nonce (may contain an encoded space) + * @param _signature Encoded signature + */ + function execute( + Transaction[] calldata _txs, + uint256 _nonce, + bytes calldata _signature + ) external; + + /** + * @notice Allow wallet to execute an action + * without signing the message + * @param _txs Transactions to execute + */ + function selfExecute( + Transaction[] calldata _txs + ) external; +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleCreator.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleCreator.sol new file mode 100644 index 000000000..fcf18d219 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/interfaces/IModuleCreator.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +interface IModuleCreator { + error CreateFailed(bytes _code); + + /** + * @notice Creates a contract forwarding eth value + * @param _code Creation code of the contract + * @return addr The address of the created contract + */ + function createContract(bytes calldata _code) external payable returns (address addr); +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol new file mode 100644 index 000000000..fbf5c1052 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../../../../utils/SignatureValidator.sol"; +import "../../../../utils/LibBytesPointer.sol"; +import "../../../../utils/LibBytes.sol"; +import "../../../../utils/LibOptim.sol"; + + +/** + * @title SequenceBaseSig Library + * @author Agustin Aguilar (aa@horizon.io) + * @notice A Solidity implementation for handling signatures in the Sequence protocol. + */ +library SequenceBaseSig { + using LibBytesPointer for bytes; + + uint256 private constant FLAG_SIGNATURE = 0; + uint256 private constant FLAG_ADDRESS = 1; + uint256 private constant FLAG_DYNAMIC_SIGNATURE = 2; + uint256 private constant FLAG_NODE = 3; + uint256 private constant FLAG_BRANCH = 4; + uint256 private constant FLAG_SUBDIGEST = 5; + uint256 private constant FLAG_NESTED = 6; + + error InvalidNestedSignature(bytes32 _hash, address _addr, bytes _signature); + error InvalidSignatureFlag(uint256 _flag); + + /** + * @notice Generates a subdigest for the input digest (unique for this wallet and network). + * @param _digest The input digest to generate the subdigest from. + * @return bytes32 The subdigest generated from the input digest. + */ + function subdigest( + bytes32 _digest + ) internal view returns (bytes32) { + return keccak256( + abi.encodePacked( + "\x19\x01", + block.chainid, + address(this), + _digest + ) + ); + } + + /** + * @notice Generates the leaf for an address and weight. + * @dev The leaf is generated by concatenating the address and weight. + * + * @param _addr The address to generate the leaf for. + * @param _weight The weight to generate the leaf for. + * @return bytes32 The leaf generated from the address and weight. + */ + function _leafForAddressAndWeight( + address _addr, + uint96 _weight + ) internal pure returns (bytes32) { + unchecked { + return bytes32(uint256(_weight) << 160 | uint256(uint160(_addr))); + } + } + + /** + * @notice Generates the leaf for a hardcoded subdigest. + * @dev The leaf is generated by hashing 'Sequence static digest:\n' and the subdigest. + * @param _subdigest The subdigest to generate the leaf for. + * @return bytes32 The leaf generated from the hardcoded subdigest. + */ + function _leafForHardcodedSubdigest( + bytes32 _subdigest + ) internal pure returns (bytes32) { + return keccak256(abi.encodePacked('Sequence static digest:\n', _subdigest)); + } + + /** + * @notice Generates the leaf for a nested tree node. + * @dev The leaf is generated by hashing 'Sequence nested config:\n', the node, the threshold and the weight. + * + * @param _node The root of the node to generate the leaf for. + * @param _threshold The internal threshold of the tree. + * @param _weight The external weight of the tree. + * @return bytes32 The leaf generated from the nested tree. + */ + function _leafForNested( + bytes32 _node, + uint256 _threshold, + uint256 _weight + ) internal pure returns (bytes32) { + return keccak256(abi.encodePacked('Sequence nested config:\n', _node, _threshold, _weight)); + } + + /** + * @notice Returns the weight and root of a signature branch. + * @dev If the signature contains a hardcoded subdigest, and it matches the input digest, then the weight is set to 2 ** 256 - 1. + * + * @param _subdigest The digest to verify the signature against. + * @param _signature The signature branch to recover. + * @return weight The total weight of the recovered signatures. + * @return root The root hash of the recovered configuration. + */ + function recoverBranch( + bytes32 _subdigest, + bytes calldata _signature + ) internal view returns ( + uint256 weight, + bytes32 root + ) { + unchecked { + uint256 rindex; + + // Iterate until the image is completed + while (rindex < _signature.length) { + // Read next item type + uint256 flag; + (flag, rindex) = _signature.readUint8(rindex); + + if (flag == FLAG_ADDRESS) { + // Read plain address + uint8 addrWeight; address addr; + (addrWeight, addr, rindex) = _signature.readUint8Address(rindex); + + // Write weight and address to image + bytes32 node = _leafForAddressAndWeight(addr, addrWeight); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + if (flag == FLAG_SIGNATURE) { + // Read weight + uint8 addrWeight; + (addrWeight, rindex) = _signature.readUint8(rindex); + + // Read single signature and recover signer + uint256 nrindex = rindex + 66; + address addr = SignatureValidator.recoverSigner(_subdigest, _signature[rindex:nrindex]); + rindex = nrindex; + + // Acumulate total weight of the signature + weight += addrWeight; + + // Write weight and address to image + bytes32 node = _leafForAddressAndWeight(addr, addrWeight); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + if (flag == FLAG_DYNAMIC_SIGNATURE) { + // Read signer and weight + uint8 addrWeight; address addr; + (addrWeight, addr, rindex) = _signature.readUint8Address(rindex); + + // Read signature size + uint256 size; + (size, rindex) = _signature.readUint24(rindex); + + // Read dynamic size signature + uint256 nrindex = rindex + size; + if (!SignatureValidator.isValidSignature(_subdigest, addr, _signature[rindex:nrindex])) { + revert InvalidNestedSignature(_subdigest, addr, _signature[rindex:nrindex]); + } + rindex = nrindex; + + // Acumulate total weight of the signature + weight += addrWeight; + + // Write weight and address to image + bytes32 node = _leafForAddressAndWeight(addr, addrWeight); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + if (flag == FLAG_NODE) { + // Read node hash + bytes32 node; + (node, rindex) = _signature.readBytes32(rindex); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + if (flag == FLAG_BRANCH) { + // Enter a branch of the signature merkle tree + uint256 size; + (size, rindex) = _signature.readUint24(rindex); + uint256 nrindex = rindex + size; + + uint256 nweight; bytes32 node; + (nweight, node) = recoverBranch(_subdigest, _signature[rindex:nrindex]); + + weight += nweight; + root = LibOptim.fkeccak256(root, node); + + rindex = nrindex; + continue; + } + + if (flag == FLAG_NESTED) { + // Enter a branch of the signature merkle tree + // but with an internal threshold and an external fixed weight + uint256 externalWeight; + (externalWeight, rindex) = _signature.readUint8(rindex); + + uint256 internalThreshold; + (internalThreshold, rindex) = _signature.readUint16(rindex); + + uint256 size; + (size, rindex) = _signature.readUint24(rindex); + uint256 nrindex = rindex + size; + + uint256 internalWeight; bytes32 internalRoot; + (internalWeight, internalRoot) = recoverBranch(_subdigest, _signature[rindex:nrindex]); + rindex = nrindex; + + if (internalWeight >= internalThreshold) { + weight += externalWeight; + } + + bytes32 node = _leafForNested(internalRoot, internalThreshold, externalWeight); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + + continue; + } + + if (flag == FLAG_SUBDIGEST) { + // A hardcoded always accepted digest + // it pushes the weight to the maximum + bytes32 hardcoded; + (hardcoded, rindex) = _signature.readBytes32(rindex); + if (hardcoded == _subdigest) { + weight = type(uint256).max; + } + + bytes32 node = _leafForHardcodedSubdigest(hardcoded); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + revert InvalidSignatureFlag(flag); + } + } + } + + /** + * @notice Returns the threshold, weight, root, and checkpoint of a signature. + * @dev To verify the signature, the weight must be greater than or equal to the threshold, and the root + * must match the expected `imageHash` of the wallet. + * + * @param _subdigest The digest to verify the signature against. + * @param _signature The signature to recover. + * @return threshold The minimum weight required for the signature to be valid. + * @return weight The total weight of the recovered signatures. + * @return imageHash The root hash of the recovered configuration + * @return checkpoint The checkpoint of the signature. + */ + function recover( + bytes32 _subdigest, + bytes calldata _signature + ) internal view returns ( + uint256 threshold, + uint256 weight, + bytes32 imageHash, + uint256 checkpoint + ) { + unchecked { + (weight, imageHash) = recoverBranch(_subdigest, _signature[6:]); + + // Threshold & checkpoint are the top nodes + // (but they are first on the signature) + threshold = LibBytes.readFirstUint16(_signature); + checkpoint = LibBytes.readUint32(_signature, 2); + + imageHash = LibOptim.fkeccak256(imageHash, bytes32(threshold)); + imageHash = LibOptim.fkeccak256(imageHash, bytes32(checkpoint)); + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol new file mode 100644 index 000000000..e8ad0913f --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./SequenceBaseSig.sol"; + +import "../../interfaces/IModuleAuth.sol"; + +import "../../ModuleSelfAuth.sol"; +import "../../ModuleStorage.sol"; + +import "../../../../utils/LibBytesPointer.sol"; +import "../../../../utils/LibOptim.sol"; + +/** + * @title Sequence chained auth recovery submodule + * @author Agustin Aguilar (aa@horizon.io) + * @notice Defines Sequence signatures that work by delegating control to new configurations. + * @dev The delegations can be chained together, the first signature is the one that is used to validate + * the message, the last signature must match the current on-chain configuration of the wallet. + */ +abstract contract SequenceChainedSig is IModuleAuth, ModuleSelfAuth { + using LibBytesPointer for bytes; + + bytes32 public constant SET_IMAGE_HASH_TYPE_HASH = keccak256("SetImageHash(bytes32 imageHash)"); + + error LowWeightChainedSignature(bytes _signature, uint256 threshold, uint256 _weight); + error WrongChainedCheckpointOrder(uint256 _current, uint256 _prev); + + /** + * @notice Defined the special token that must be signed to delegate control to a new configuration. + * @param _imageHash The hash of the new configuration. + * @return bytes32 The message hash to be signed. + */ + function _hashSetImageHashStruct(bytes32 _imageHash) internal pure returns (bytes32) { + return LibOptim.fkeccak256(SET_IMAGE_HASH_TYPE_HASH, _imageHash); + } + + /** + * @notice Returns the threshold, weight, root, and checkpoint of a (chained) signature. + * + * @dev This method return the `threshold`, `weight` and `imageHash` of the last signature in the chain. + * Intermediate signatures are validated directly in this method. The `subdigest` is the one of the + * first signature in the chain (since that's the one that is used to validate the message). + * + * @param _digest The digest to recover the signature from. + * @param _signature The signature to recover. + * @return threshold The threshold of the (last) signature. + * @return weight The weight of the (last) signature. + * @return imageHash The image hash of the (last) signature. + * @return subdigest The subdigest of the (first) signature in the chain. + * @return checkpoint The checkpoint of the (last) signature. + */ + function chainedRecover( + bytes32 _digest, + bytes calldata _signature + ) internal view returns ( + uint256 threshold, + uint256 weight, + bytes32 imageHash, + bytes32 subdigest, + uint256 checkpoint + ) { + uint256 rindex = 1; + uint256 sigSize; + + // + // First signature out of the loop + // + + // First uint24 is the size of the signature + (sigSize, rindex) = _signature.readUint24(rindex); + uint256 nrindex = sigSize + rindex; + + ( + threshold, + weight, + imageHash, + subdigest, + checkpoint + ) = signatureRecovery( + _digest, + _signature[rindex:nrindex] + ); + + if (weight < threshold) { + revert LowWeightChainedSignature(_signature[rindex:nrindex], threshold, weight); + } + + rindex = nrindex; + + // The following signatures are handled by this loop. + // This is done this way because the first signature does not have a + // checkpoint to be validated against. + while (rindex < _signature.length) { + // First uint24 is the size of the signature + (sigSize, rindex) = _signature.readUint24(rindex); + nrindex = sigSize + rindex; + + uint256 nextCheckpoint; + + ( + threshold, + weight, + imageHash,, + // Do not change the subdigest; + // it should remain that of the first signature. + nextCheckpoint + ) = signatureRecovery( + _hashSetImageHashStruct(imageHash), + _signature[rindex:nrindex] + ); + + // Validate signature + if (weight < threshold) { + revert LowWeightChainedSignature(_signature[rindex:nrindex], threshold, weight); + } + + // Checkpoints must be provided in descending order + // since the first signature is the one that is used to validate the message + // and the last signature is the one that is used to validate the current configuration + if (nextCheckpoint >= checkpoint) { + revert WrongChainedCheckpointOrder(nextCheckpoint, checkpoint); + } + + checkpoint = nextCheckpoint; + rindex = nrindex; + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol new file mode 100644 index 000000000..c8b64a9aa --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./SequenceBaseSig.sol"; + + +library SequenceDynamicSig { + + /** + * @notice Recover a "dynamically encoded" Sequence signature. + * @dev The Signature is stripped of the first byte, which is the encoding flag. + * + * @param _subdigest The digest of the signature. + * @param _signature The Sequence signature. + * @return threshold The threshold weight required to validate the signature. + * @return weight The weight of the signature. + * @return imageHash The hash of the recovered configuration. + * @return checkpoint The checkpoint of the configuration. + */ + function recover( + bytes32 _subdigest, + bytes calldata _signature + ) internal view returns ( + uint256 threshold, + uint256 weight, + bytes32 imageHash, + uint256 checkpoint + ) { + return SequenceBaseSig.recover(_subdigest, _signature[1:]); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol new file mode 100644 index 000000000..4b21bd505 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +library SequenceNoChainIdSig { + + /** + * @notice Computes a subdigest for a Sequence signature that works on all chains. + * @dev The subdigest is computed by removing the chain ID from the digest (using 0 instead). + * @param _digest The digest of the chain of signatures. + * @return bytes32 The subdigest with no chain ID. + */ + function subdigest(bytes32 _digest) internal view returns (bytes32) { + return keccak256( + abi.encodePacked( + "\x19\x01", + uint256(0), + address(this), + _digest + ) + ); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol new file mode 100644 index 000000000..71eb8ae5e --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +library SubModuleNonce { + // Nonce schema + // + // - space[160]:nonce[96] + // + uint256 internal constant NONCE_BITS = 96; + bytes32 internal constant NONCE_MASK = bytes32(uint256(type(uint96).max)); + + /** + * @notice Decodes a raw nonce + * @dev Schema: space[160]:type[96] + * @param _rawNonce Nonce to be decoded + * @return _space The nonce space of the raw nonce + * @return _nonce The nonce of the raw nonce + */ + function decodeNonce(uint256 _rawNonce) internal pure returns ( + uint256 _space, + uint256 _nonce + ) { + unchecked { + // Decode nonce + _space = _rawNonce >> NONCE_BITS; + _nonce = uint256(bytes32(_rawNonce) & NONCE_MASK); + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibBytes.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibBytes.sol new file mode 100644 index 000000000..3452c8db5 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibBytes.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +/** + * @title Library for reading data from bytes arrays + * @author Agustin Aguilar (aa@horizon.io) + * @notice This library contains functions for reading data from bytes arrays. + * + * @dev These functions do not check if the input index is within the bounds of the data array. + * Reading out of bounds may return dirty values. + */ +library LibBytes { + + /** + * @notice Returns the bytes32 value at the given index in the input data. + * @param data The input data. + * @param index The index of the value to retrieve. + * @return a The bytes32 value at the given index. + */ + function readBytes32( + bytes calldata data, + uint256 index + ) internal pure returns ( + bytes32 a + ) { + assembly { + a := calldataload(add(data.offset, index)) + } + } + + /** + * @notice Returns the uint8 value at the given index in the input data. + * @param data The input data. + * @param index The index of the value to retrieve. + * @return a The uint8 value at the given index. + */ + function readUint8( + bytes calldata data, + uint256 index + ) internal pure returns ( + uint8 a + ) { + assembly { + let word := calldataload(add(index, data.offset)) + a := shr(248, word) + } + } + + /** + * @notice Returns the first uint16 value in the input data. + * @param data The input data. + * @return a The first uint16 value in the input data. + */ + function readFirstUint16( + bytes calldata data + ) internal pure returns ( + uint16 a + ) { + assembly { + let word := calldataload(data.offset) + a := shr(240, word) + } + } + + /** + * @notice Returns the uint32 value at the given index in the input data. + * @param data The input data. + * @param index The index of the value to retrieve. + * @return a The uint32 value at the given index. + */ + function readUint32( + bytes calldata data, + uint256 index + ) internal pure returns ( + uint32 a + ) { + assembly { + let word := calldataload(add(index, data.offset)) + a := shr(224, word) + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibBytesPointer.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibBytesPointer.sol new file mode 100644 index 000000000..b731a6cd0 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibBytesPointer.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + + +/** + * @title Library for reading data from bytes arrays with a pointer + * @author Agustin Aguilar (aa@horizon.io) + * @notice This library contains functions for reading data from bytes arrays with a pointer. + * + * @dev These functions do not check if the input index is within the bounds of the data array. + * Reading out of bounds may return dirty values. + */ +library LibBytesPointer { + + /** + * @dev Returns the first uint16 value in the input data and updates the pointer. + * @param _data The input data. + * @return a The first uint16 value. + * @return newPointer The new pointer. + */ + function readFirstUint16( + bytes calldata _data + ) internal pure returns ( + uint16 a, + uint256 newPointer + ) { + assembly { + let word := calldataload(_data.offset) + a := shr(240, word) + newPointer := 2 + } + } + + /** + * @notice Returns the uint8 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint8 value at the given index. + * @return newPointer The new pointer. + */ + function readUint8( + bytes calldata _data, + uint256 _index + ) internal pure returns ( + uint8 a, + uint256 newPointer + ) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := shr(248, word) + newPointer := add(_index, 1) + } + } + + /** + * @notice Returns the uint8 value and the address at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint8 value at the given index. + * @return b The following address value. + * @return newPointer The new pointer. + */ + function readUint8Address( + bytes calldata _data, + uint256 _index + ) internal pure returns ( + uint8 a, + address b, + uint256 newPointer + ) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := shr(248, word) + b := and(shr(88, word), 0xffffffffffffffffffffffffffffffffffffffff) + newPointer := add(_index, 21) + } + } + + /** + * @notice Returns the uint16 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint16 value at the given index. + * @return newPointer The new pointer. + */ + function readUint16( + bytes calldata _data, + uint256 _index + ) internal pure returns ( + uint16 a, + uint256 newPointer + ) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := and(shr(240, word), 0xffff) + newPointer := add(_index, 2) + } + } + + /** + * @notice Returns the uint24 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint24 value at the given index. + * @return newPointer The new pointer. + */ + function readUint24( + bytes calldata _data, + uint256 _index + ) internal pure returns ( + uint24 a, + uint256 newPointer + ) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := and(shr(232, word), 0xffffff) + newPointer := add(_index, 3) + } + } + + /** + * @notice Returns the uint64 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint64 value at the given index. + * @return newPointer The new pointer. + */ + function readUint64( + bytes calldata _data, + uint256 _index + ) internal pure returns ( + uint64 a, + uint256 newPointer + ) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := and(shr(192, word), 0xffffffffffffffff) + newPointer := add(_index, 8) + } + } + + /** + * @notice Returns the bytes32 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _pointer The index of the value to retrieve. + * @return a The bytes32 value at the given index. + * @return newPointer The new pointer. + */ + function readBytes32( + bytes calldata _data, + uint256 _pointer + ) internal pure returns ( + bytes32 a, + uint256 newPointer + ) { + assembly { + a := calldataload(add(_pointer, _data.offset)) + newPointer := add(_pointer, 32) + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibOptim.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibOptim.sol new file mode 100644 index 000000000..fb5cf0dcd --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/LibOptim.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +/** + * @title Library for optimized EVM operations + * @author Agustin Aguilar (aa@horizon.io) + * @notice This library contains functions for optimizing certain EVM operations. + */ +library LibOptim { + + /** + * @notice Computes the keccak256 hash of two 32-byte inputs. + * @dev It uses only scratch memory space. + * @param _a The first 32 bytes of the hash. + * @param _b The second 32 bytes of the hash. + * @return c The keccak256 hash of the two 32-byte inputs. + */ + function fkeccak256( + bytes32 _a, + bytes32 _b + ) internal pure returns (bytes32 c) { + assembly { + mstore(0, _a) + mstore(32, _b) + c := keccak256(0, 64) + } + } + + /** + * @notice Returns the return data from the last call. + * @return r The return data from the last call. + */ + function returnData() internal pure returns (bytes memory r) { + assembly { + let size := returndatasize() + r := mload(0x40) + let start := add(r, 32) + mstore(0x40, add(start, size)) + mstore(r, size) + returndatacopy(start, 0, size) + } + } + + /** + * @notice Calls another contract with the given parameters. + * @dev This method doesn't increase the memory pointer. + * @param _to The address of the contract to call. + * @param _val The value to send to the contract. + * @param _gas The amount of gas to provide for the call. + * @param _data The data to send to the contract. + * @return r The success status of the call. + */ + function call( + address _to, + uint256 _val, + uint256 _gas, + bytes calldata _data + ) internal returns (bool r) { + assembly { + let tmp := mload(0x40) + calldatacopy(tmp, _data.offset, _data.length) + + r := call( + _gas, + _to, + _val, + tmp, + _data.length, + 0, + 0 + ) + } + } + + /** + * @notice Calls another contract with the given parameters, using delegatecall. + * @dev This method doesn't increase the memory pointer. + * @param _to The address of the contract to call. + * @param _gas The amount of gas to provide for the call. + * @param _data The data to send to the contract. + * @return r The success status of the call. + */ + function delegatecall( + address _to, + uint256 _gas, + bytes calldata _data + ) internal returns (bool r) { + assembly { + let tmp := mload(0x40) + calldatacopy(tmp, _data.offset, _data.length) + + r := delegatecall( + _gas, + _to, + tmp, + _data.length, + 0, + 0 + ) + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/SignatureValidator.sol b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/SignatureValidator.sol new file mode 100644 index 000000000..23433a4e1 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/GuestModule-wallet/sources/contracts/utils/SignatureValidator.sol @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../interfaces/IERC1271Wallet.sol"; + +import "./LibBytes.sol"; + +/** + * @dev Contains logic for signature validation. + * Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md) + * Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/ + */ +library SignatureValidator { + // Errors + error InvalidSignatureLength(bytes _signature); + error EmptySignature(); + error InvalidSValue(bytes _signature, bytes32 _s); + error InvalidVValue(bytes _signature, uint256 _v); + error UnsupportedSignatureType(bytes _signature, uint256 _type, bool _recoverMode); + error SignerIsAddress0(bytes _signature); + + using LibBytes for bytes; + + /***********************************| + | Variables | + |__________________________________*/ + + // bytes4(keccak256("isValidSignature(bytes,bytes)")) + bytes4 constant internal ERC1271_MAGICVALUE = 0x20c13b0b; + + // bytes4(keccak256("isValidSignature(bytes32,bytes)")) + bytes4 constant internal ERC1271_MAGICVALUE_BYTES32 = 0x1626ba7e; + + // Allowed signature types. + uint256 private constant SIG_TYPE_EIP712 = 1; + uint256 private constant SIG_TYPE_ETH_SIGN = 2; + uint256 private constant SIG_TYPE_WALLET_BYTES32 = 3; + + /***********************************| + | Signature Functions | + |__________________________________*/ + + /** + * @notice Recover the signer of hash, assuming it's an EOA account + * @dev Only for SignatureType.EIP712 and SignatureType.EthSign signatures + * @param _hash Hash that was signed + * encoded as (bytes32 r, bytes32 s, uint8 v, ... , SignatureType sigType) + */ + function recoverSigner( + bytes32 _hash, + bytes calldata _signature + ) internal pure returns (address signer) { + if (_signature.length != 66) revert InvalidSignatureLength(_signature); + uint256 signatureType = _signature.readUint8(_signature.length - 1); + + // Variables are not scoped in Solidity. + uint8 v = _signature.readUint8(64); + bytes32 r = _signature.readBytes32(0); + bytes32 s = _signature.readBytes32(32); + + // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature + // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines + // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most + // signatures from current libraries generate a unique signature with an s-value in the lower half order. + // + // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value + // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or + // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept + // these malleable signatures as well. + // + // Source OpenZeppelin + // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol + + if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { + revert InvalidSValue(_signature, s); + } + + if (v != 27 && v != 28) { + revert InvalidVValue(_signature, v); + } + + // Signature using EIP712 + if (signatureType == SIG_TYPE_EIP712) { + signer = ecrecover(_hash, v, r, s); + + // Signed using web3.eth_sign() or Ethers wallet.signMessage() + } else if (signatureType == SIG_TYPE_ETH_SIGN) { + signer = ecrecover( + keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)), + v, + r, + s + ); + + } else { + // We cannot recover the signer for any other signature type. + revert UnsupportedSignatureType(_signature, signatureType, true); + } + + // Prevent signer from being 0x0 + if (signer == address(0x0)) revert SignerIsAddress0(_signature); + + return signer; + } + + /** + * @notice Returns true if the provided signature is valid for the given signer. + * @dev Supports SignatureType.EIP712, SignatureType.EthSign, and ERC1271 signatures + * @param _hash Hash that was signed + * @param _signer Address of the signer candidate + * @param _signature Signature byte array + */ + function isValidSignature( + bytes32 _hash, + address _signer, + bytes calldata _signature + ) internal view returns (bool valid) { + if (_signature.length == 0) { + revert EmptySignature(); + } + + uint256 signatureType = uint8(_signature[_signature.length - 1]); + if (signatureType == SIG_TYPE_EIP712 || signatureType == SIG_TYPE_ETH_SIGN) { + // Recover signer and compare with provided + valid = recoverSigner(_hash, _signature) == _signer; + + } else if (signatureType == SIG_TYPE_WALLET_BYTES32) { + // Remove signature type before calling ERC1271, restore after call + valid = ERC1271_MAGICVALUE_BYTES32 == IERC1271Wallet(_signer).isValidSignature(_hash, _signature[0:_signature.length - 1]); + + } else { + // We cannot validate any other signature type. + // We revert because we can say nothing about its validity. + revert UnsupportedSignatureType(_signature, signatureType, false); + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/Wallet.sol b/packages/wallet/wallet-contracts/contracts/Wallet.sol new file mode 100644 index 000000000..aaeb5e61e --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/Wallet.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +/** + * Minimal upgradeable proxy implementation, delegates all calls to the address + * defined by the storage slot matching the wallet address. + * + * Inspired by EIP-1167 Implementation (https://eips.ethereum.org/EIPS/eip-1167) + * + * deployed code: + * + * 0x00 0x36 0x36 CALLDATASIZE cds + * 0x01 0x3d 0x3d RETURNDATASIZE 0 cds + * 0x02 0x3d 0x3d RETURNDATASIZE 0 0 cds + * 0x03 0x37 0x37 CALLDATACOPY + * 0x04 0x3d 0x3d RETURNDATASIZE 0 + * 0x05 0x3d 0x3d RETURNDATASIZE 0 0 + * 0x06 0x3d 0x3d RETURNDATASIZE 0 0 0 + * 0x07 0x36 0x36 CALLDATASIZE cds 0 0 0 + * 0x08 0x3d 0x3d RETURNDATASIZE 0 cds 0 0 0 + * 0x09 0x30 0x30 ADDRESS addr 0 cds 0 0 0 + * 0x0A 0x54 0x54 SLOAD imp 0 cds 0 0 0 + * 0x0B 0x5a 0x5a GAS gas imp 0 cds 0 0 0 + * 0x0C 0xf4 0xf4 DELEGATECALL suc 0 + * 0x0D 0x3d 0x3d RETURNDATASIZE rds suc 0 + * 0x0E 0x82 0x82 DUP3 0 rds suc 0 + * 0x0F 0x80 0x80 DUP1 0 0 rds suc 0 + * 0x10 0x3e 0x3e RETURNDATACOPY suc 0 + * 0x11 0x90 0x90 SWAP1 0 suc + * 0x12 0x3d 0x3d RETURNDATASIZE rds 0 suc + * 0x13 0x91 0x91 SWAP2 suc 0 rds + * 0x14 0x60 0x18 0x6018 PUSH1 0x18 suc 0 rds + * /-- 0x16 0x57 0x57 JUMPI 0 rds + * | 0x17 0xfd 0xfd REVERT + * \-> 0x18 0x5b 0x5b JUMPDEST 0 rds + * 0x19 0xf3 0xf3 RETURN + * + * flat deployed code: 0x363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3 + * + * deploy function: + * + * 0x00 0x60 0x3a 0x603a PUSH1 0x3a + * 0x02 0x60 0x0e 0x600e PUSH1 0x0e 0x3a + * 0x04 0x3d 0x3d RETURNDATASIZE 0 0x0e 0x3a + * 0x05 0x39 0x39 CODECOPY + * 0x06 0x60 0x1a 0x601a PUSH1 0x1a + * 0x08 0x80 0x80 DUP1 0x1a 0x1a + * 0x09 0x51 0x51 MLOAD imp 0x1a + * 0x0A 0x30 0x30 ADDRESS addr imp 0x1a + * 0x0B 0x55 0x55 SSTORE 0x1a + * 0x0C 0x3d 0x3d RETURNDATASIZE 0 0x1a + * 0x0D 0xf3 0xf3 RETURN + * [...deployed code] + * + * flat deploy function: 0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3 + */ +library Wallet { + bytes internal constant creationCode = + hex"603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3"; +} diff --git a/packages/wallet/wallet-contracts/contracts/hooks/WalletProxyHook.sol b/packages/wallet/wallet-contracts/contracts/hooks/WalletProxyHook.sol new file mode 100644 index 000000000..ae1ad4d83 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/hooks/WalletProxyHook.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import {IWalletProxy} from "./interfaces/IWalletProxy.sol"; +import {Implementation} from "../modules/commons/Implementation.sol"; + +contract WalletProxyHook is IWalletProxy, Implementation { + /// @inheritdoc IWalletProxy + function PROXY_getImplementation() public view returns (address) { + return _getImplementation(); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/hooks/interfaces/IWalletProxy.sol b/packages/wallet/wallet-contracts/contracts/hooks/interfaces/IWalletProxy.sol new file mode 100644 index 000000000..385de7cf0 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/hooks/interfaces/IWalletProxy.sol @@ -0,0 +1,12 @@ +// Copyright Immutable Pty Ltd 2018 - 2023 +// SPDX-License-Identifier: Apache 2.0 +// https://github.com/immutable/contracts/blob/a04f7ecb8a79ad8f1b67f73f770e0545deb6cba2/contracts/allowlist/IWalletProxy.sol +pragma solidity 0.8.18; + +// Interface to retrieve the implemention stored inside the Proxy contract +/// Interface for Passport Wallet's proxy contract. +interface IWalletProxy { + // Returns the current implementation address used by the proxy contract + // solhint-disable-next-line func-name-mixedcase + function PROXY_getImplementation() external view returns (address); +} diff --git a/packages/wallet/wallet-contracts/contracts/interfaces/IERC1271Wallet.sol b/packages/wallet/wallet-contracts/contracts/interfaces/IERC1271Wallet.sol new file mode 100644 index 000000000..169d17b43 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/interfaces/IERC1271Wallet.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IERC1271Wallet { + /** + * @notice Verifies whether the provided signature is valid with respect to the provided data + * @dev MUST return the correct magic value if the signature provided is valid for the provided data + * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") + * > This function MAY modify Ethereum's state + * @param _data Arbitrary length data signed on the behalf of address(this) + * @param _signature Signature byte array associated with _data + * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise + */ + function isValidSignature(bytes calldata _data, bytes calldata _signature) external view returns (bytes4 magicValue); + + /** + * @notice Verifies whether the provided signature is valid with respect to the provided hash + * @dev MUST return the correct magic value if the signature provided is valid for the provided hash + * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") + * > This function MAY modify Ethereum's state + * @param _hash keccak256 hash that was signed + * @param _signature Signature byte array associated with _data + * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise + */ + function isValidSignature(bytes32 _hash, bytes calldata _signature) external view returns (bytes4 magicValue); +} diff --git a/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC1155Receiver.sol b/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC1155Receiver.sol new file mode 100644 index 000000000..ae7a8c03f --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC1155Receiver.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IERC1155Receiver { + function onERC1155Received(address, address, uint256, uint256, bytes calldata) external returns (bytes4); + function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) + external + returns (bytes4); +} diff --git a/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC223Receiver.sol b/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC223Receiver.sol new file mode 100644 index 000000000..2cbbc218a --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC223Receiver.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IERC223Receiver { + function tokenFallback(address, uint256, bytes calldata) external; +} diff --git a/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC721Receiver.sol b/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC721Receiver.sol new file mode 100644 index 000000000..cfca58422 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC721Receiver.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IERC721Receiver { + function onERC721Received(address, address, uint256, bytes calldata) external returns (bytes4); +} diff --git a/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC777Receiver.sol b/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC777Receiver.sol new file mode 100644 index 000000000..054c93d5a --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/interfaces/receivers/IERC777Receiver.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IERC777Receiver { + function tokensReceived(address, address, address, uint256, bytes calldata, bytes calldata) external; +} diff --git a/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC1155.sol b/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC1155.sol new file mode 100644 index 000000000..3e4a428e6 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC1155.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +interface IERC1155 { + function balanceOf(address account, uint256 id) external view returns (uint256); + function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) + external + view + returns (uint256[] memory); + function setApprovalForAll(address operator, bool approved) external; + function isApprovedForAll(address account, address operator) external view returns (bool); + function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; + function safeBatchTransferFrom( + address from, + address to, + uint256[] calldata ids, + uint256[] calldata amounts, + bytes calldata data + ) external; + + event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); + event TransferBatch( + address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values + ); + event ApprovalForAll(address indexed account, address indexed operator, bool approved); + event URI(string value, uint256 indexed id); +} diff --git a/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC20.sol b/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC20.sol new file mode 100644 index 000000000..5dddb36be --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC20.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +interface IERC20 { + function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function transfer(address recipient, uint256 amount) external returns (bool); + function allowance(address owner, address spender) external view returns (uint256); + function approve(address spender, uint256 amount) external returns (bool); + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC721.sol b/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC721.sol new file mode 100644 index 000000000..dbeb299df --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/interfaces/tokens/IERC721.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +interface IERC721 { + function balanceOf(address owner) external view returns (uint256 balance); + function ownerOf(uint256 tokenId) external view returns (address owner); + function safeTransferFrom(address from, address to, uint256 tokenId) external; + function transferFrom(address from, address to, uint256 tokenId) external; + function approve(address to, uint256 tokenId) external; + function getApproved(uint256 tokenId) external view returns (address operator); + function setApprovalForAll(address operator, bool approved) external; + function isApprovedForAll(address owner, address operator) external view returns (bool); + function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; + + event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); + event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); + event ApprovalForAll(address indexed owner, address indexed operator, bool approved); +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/AlwaysRevertMock.sol b/packages/wallet/wallet-contracts/contracts/mocks/AlwaysRevertMock.sol new file mode 100644 index 000000000..8cfcbecf2 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/AlwaysRevertMock.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract AlwaysRevertMock { + fallback() external payable { + revert("AlwaysRevertMock#fallback: ALWAYS_REVERT"); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/CallReceiverMock.sol b/packages/wallet/wallet-contracts/contracts/mocks/CallReceiverMock.sol new file mode 100644 index 000000000..dcfec945e --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/CallReceiverMock.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract CallReceiverMock { + uint256 public lastValA; + bytes public lastValB; + + bool revertFlag; + + constructor() payable {} + + function setRevertFlag(bool _revertFlag) external { + revertFlag = _revertFlag; + } + + function testCall(uint256 _valA, bytes calldata _valB) external payable { + require(!revertFlag, "CallReceiverMock#testCall: REVERT_FLAG"); + + lastValA = _valA; + lastValB = _valB; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/DelegateCallMock.sol b/packages/wallet/wallet-contracts/contracts/mocks/DelegateCallMock.sol new file mode 100644 index 000000000..f610ab8e9 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/DelegateCallMock.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract DelegateCallMock { + event Readed(uint256 _val); + + uint256 private constant REVERT_SLOT = uint256(keccak256("revert-flag")); + + mapping(uint256 => uint256) private store; + + function setRevertFlag(bool _revertFlag) external { + store[REVERT_SLOT] = _revertFlag ? 1 : 0; + } + + function write(uint256 _key, uint256 _val) external { + require(store[REVERT_SLOT] == 0, "DelegateCallMock#write: REVERT_FLAG"); + store[_key] = _val; + } + + function read(uint256 _key) external { + emit Readed(store[_key]); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/ERC1155Mock.sol b/packages/wallet/wallet-contracts/contracts/mocks/ERC1155Mock.sol new file mode 100644 index 000000000..8122a14e1 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/ERC1155Mock.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +contract ERC1155Mock { + string public name = "Mock ERC1155 Token"; + string public symbol = "MERC1155"; + address public owner; + + mapping(uint256 => mapping(address => uint256)) public balances; + mapping(address => mapping(address => bool)) public operatorApprovals; + + constructor() { + owner = msg.sender; + } + + modifier onlyOwner() { + require(msg.sender == owner, "Only owner can mint"); + _; + } + + function balanceOf(address account, uint256 id) public view returns (uint256) { + return balances[id][account]; + } + + function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view returns (uint256[] memory) { + require(accounts.length == ids.length, "Accounts and ids length mismatch"); + + uint256[] memory batchBalances = new uint256[](accounts.length); + for (uint256 i = 0; i < accounts.length; ++i) { + batchBalances[i] = balances[ids[i]][accounts[i]]; + } + return batchBalances; + } + + function mint(address to, uint256 id, uint256 amount) public onlyOwner { + require(to != address(0), "Cannot mint to zero address"); + + balances[id][to] += amount; + emit TransferSingle(msg.sender, address(0), to, id, amount); + } + + function safeTransferFrom(address from, address to, uint256 id, uint256 amount) public { + require(from == msg.sender || isApprovedForAll(from, msg.sender), "Not approved to transfer"); + + require(balances[id][from] >= amount, "Insufficient balance"); + balances[id][from] -= amount; + balances[id][to] += amount; + + emit TransferSingle(msg.sender, from, to, id, amount); + } + + function setApprovalForAll(address operator, bool approved) public { + operatorApprovals[msg.sender][operator] = approved; + emit ApprovalForAll(msg.sender, operator, approved); + } + + function isApprovedForAll(address account, address operator) public view returns (bool) { + return operatorApprovals[account][operator]; + } + + event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); + event ApprovalForAll(address indexed account, address indexed operator, bool approved); +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/ERC165CheckerMock.sol b/packages/wallet/wallet-contracts/contracts/mocks/ERC165CheckerMock.sol new file mode 100644 index 000000000..f233001ff --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/ERC165CheckerMock.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract ERC165CheckerMock { + bytes4 constant InvalidID = 0xffffffff; + bytes4 constant ERC165ID = 0x01ffc9a7; + + function doesContractImplementInterface(address _contract, bytes4 _interfaceId) external view returns (bool) { + uint256 success; + uint256 result; + + (success, result) = noThrowCall(_contract, ERC165ID); + if (success == 0 || result == 0) { + return false; + } + + (success, result) = noThrowCall(_contract, InvalidID); + if (success == 0 || result != 0) { + return false; + } + + (success, result) = noThrowCall(_contract, _interfaceId); + if (success == 1 && result == 1) { + return true; + } + return false; + } + + function noThrowCall(address _contract, bytes4 _interfaceId) + private + view + returns (uint256 success, uint256 result) + { + bytes4 erc165ID = ERC165ID; + + assembly { + let x := mload(0x40) // Find empty storage location using "free memory pointer" + mstore(x, erc165ID) // Place signature at beginning of empty storage + mstore(add(x, 0x04), _interfaceId) // Place first argument directly next to signature + + success := staticcall( + 30000, // 30k gas + _contract, // To addr + x, // Inputs are stored at location x + 0x24, // Inputs are 36 bytes long + x, // Store output over input (saves space) + 0x20 // Outputs are 32 bytes long + ) + + result := mload(x) // Load the result + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/ERC20Mock.sol b/packages/wallet/wallet-contracts/contracts/mocks/ERC20Mock.sol new file mode 100644 index 000000000..f2c7125a0 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/ERC20Mock.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +contract ERC20Mock { + string public name = "Mock ERC20 Token"; + string public symbol = "MERC20"; + uint8 public decimals = 18; + uint256 public totalSupply; + mapping(address => uint256) public balances; + mapping(address => mapping(address => uint256)) public allowances; + + constructor(uint256 initialSupply) { + totalSupply = initialSupply; + balances[msg.sender] = initialSupply; + } + + function balanceOf(address account) public view returns (uint256) { + return balances[account]; + } + + function transfer(address recipient, uint256 amount) public returns (bool) { + require(balances[msg.sender] >= amount, "Insufficient balance"); + balances[msg.sender] -= amount; + balances[recipient] += amount; + emit Transfer(msg.sender, recipient, amount); + return true; + } + + function allowance(address owner, address spender) public view returns (uint256) { + return allowances[owner][spender]; + } + + function approve(address spender, uint256 amount) public returns (bool) { + allowances[msg.sender][spender] = amount; + emit Approval(msg.sender, spender, amount); + return true; + } + + function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { + require(balances[sender] >= amount, "Insufficient balance"); + require(allowances[sender][msg.sender] >= amount, "Allowance exceeded"); + balances[sender] -= amount; + balances[recipient] += amount; + allowances[sender][msg.sender] -= amount; + emit Transfer(sender, recipient, amount); + return true; + } + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/ERC721Mock.sol b/packages/wallet/wallet-contracts/contracts/mocks/ERC721Mock.sol new file mode 100644 index 000000000..1ca70952d --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/ERC721Mock.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +contract ERC721Mock { + string public name = "Mock ERC721 Token"; + string public symbol = "MERC721"; + uint256 public totalSupply; + address public owner; + + mapping(address => uint256) public balances; + mapping(uint256 => address) public owners; + mapping(address => mapping(address => bool)) public operatorApprovals; + mapping(uint256 => address) public tokenApprovals; + + constructor() { + owner = msg.sender; + } + + modifier onlyOwner() { + require(msg.sender == owner, "Only owner can mint"); + _; + } + + function balanceOf(address _owner) public view returns (uint256) { + return balances[_owner]; + } + + function ownerOf(uint256 tokenId) public view returns (address) { + address tokenOwner = owners[tokenId]; + require(tokenOwner != address(0), "Token does not exist"); + return tokenOwner; + } + + function mint(address to, uint256 tokenId) public onlyOwner { + require(to != address(0), "Cannot mint to zero address"); + require(owners[tokenId] == address(0), "Token already minted"); + + owners[tokenId] = to; + balances[to] += 1; + totalSupply += 1; + + emit Transfer(address(0), to, tokenId); + } + + function transferFrom(address from, address to, uint256 tokenId) public { + require(ownerOf(tokenId) == from, "Not the owner of the token"); + require(to != address(0), "Cannot transfer to zero address"); + + require( + msg.sender == from || getApproved(tokenId) == msg.sender || isApprovedForAll(from, msg.sender), + "Not approved to transfer" + ); + + balances[from] -= 1; + balances[to] += 1; + owners[tokenId] = to; + + emit Transfer(from, to, tokenId); + } + + function approve(address to, uint256 tokenId) public { + address tokenOwner = ownerOf(tokenId); + require(to != tokenOwner, "Cannot approve current owner"); + require(msg.sender == tokenOwner || isApprovedForAll(tokenOwner, msg.sender), "Not approved"); + + tokenApprovals[tokenId] = to; + emit Approval(tokenOwner, to, tokenId); + } + + function getApproved(uint256 tokenId) public view returns (address) { + return tokenApprovals[tokenId]; + } + + function setApprovalForAll(address operator, bool approved) public { + operatorApprovals[msg.sender][operator] = approved; + emit ApprovalForAll(msg.sender, operator, approved); + } + + function isApprovedForAll(address _owner, address operator) public view returns (bool) { + return operatorApprovals[_owner][operator]; + } + + event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); + event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); + event ApprovalForAll(address indexed owner, address indexed operator, bool approved); +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/GasBurnerMock.sol b/packages/wallet/wallet-contracts/contracts/mocks/GasBurnerMock.sol new file mode 100644 index 000000000..9407fdc09 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/GasBurnerMock.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract GasBurnerMock { + event ProvidedGas(uint256 _val); + + function burnGas(uint256 _burn) external { + emit ProvidedGas(gasleft()); + + bytes32 stub; + uint256 initial = gasleft(); + + while (initial - gasleft() < _burn) { + stub = keccak256(abi.encode(stub)); + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/HookCallerMock.sol b/packages/wallet/wallet-contracts/contracts/mocks/HookCallerMock.sol new file mode 100644 index 000000000..c7befffd7 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/HookCallerMock.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../interfaces/receivers/IERC1155Receiver.sol"; +import "../interfaces/receivers/IERC721Receiver.sol"; +import "../interfaces/receivers/IERC223Receiver.sol"; + +import "../interfaces/IERC1271Wallet.sol"; + +contract HookCallerMock { + function callERC1155Received(address _addr) external { + bytes4 result = IERC1155Receiver(_addr).onERC1155Received(address(this), msg.sender, 1, 2, msg.data); + + require(result == 0xf23a6e61, "HookCallerMock#callERC1155Received: INVALID_RETURN"); + } + + function callERC1155BatchReceived(address _addr) external { + uint256[] memory ids = new uint256[](3); + ids[0] = 1; + ids[1] = 2; + ids[2] = 3; + + uint256[] memory values = new uint256[](3); + values[0] = 200; + values[1] = 300; + values[2] = 400; + + bytes4 result = IERC1155Receiver(_addr).onERC1155BatchReceived(address(this), msg.sender, ids, values, msg.data); + + require(result == 0xbc197c81, "HookCallerMock#callERC1155BatchReceived: INVALID_RETURN"); + } + + function callERC721Received(address _addr) external { + bytes4 result = IERC721Receiver(_addr).onERC721Received(address(this), msg.sender, 1, msg.data); + + require(result == 0x150b7a02, "HookCallerMock#callERC721Received: INVALID_RETURN"); + } + + function callERC223Received(address _addr) external { + IERC223Receiver(_addr).tokenFallback(msg.sender, 1, msg.data); + } + + function callERC1271isValidSignatureData(address _addr, bytes calldata _data, bytes calldata _signature) + external + view + { + bytes4 result = IERC1271Wallet(_addr).isValidSignature(_data, _signature); + require(result == 0x20c13b0b, "HookCallerMock#callERC1271isValidSignatureData: INVALID_RETURN"); + } + + function callERC1271isValidSignatureHash(address _addr, bytes32 _hash, bytes calldata _signature) external view { + bytes4 result = IERC1271Wallet(_addr).isValidSignature(_hash, _signature); + require(result == 0x1626ba7e, "HookCallerMock#callERC1271isValidSignatureHash: INVALID_RETURN"); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/HookMock.sol b/packages/wallet/wallet-contracts/contracts/mocks/HookMock.sol new file mode 100644 index 000000000..3d77b8440 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/HookMock.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract HookMock { + function onHookMockCall(uint256 _num) external pure returns (uint256) { + return _num * 2; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/LibBytesImpl.sol b/packages/wallet/wallet-contracts/contracts/mocks/LibBytesImpl.sol new file mode 100644 index 000000000..cd676602f --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/LibBytesImpl.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../utils/LibBytes.sol"; + +contract LibBytesImpl { + using LibBytes for bytes; + + function readBytes32(bytes calldata data, uint256 index) external pure returns (bytes32 a) { + return LibBytes.readBytes32(data, index); + } + + function readUint8(bytes calldata data, uint256 index) external pure returns (uint8 a) { + return LibBytes.readUint8(data, index); + } + + function readUint32(bytes calldata data, uint256 index) external pure returns (uint32 a) { + return LibBytes.readUint32(data, index); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/LibBytesPointerImpl.sol b/packages/wallet/wallet-contracts/contracts/mocks/LibBytesPointerImpl.sol new file mode 100644 index 000000000..583b38839 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/LibBytesPointerImpl.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../utils/LibBytesPointer.sol"; + +contract LibBytesPointerImpl { + using LibBytesPointer for bytes; + + function readFirstUint16(bytes calldata data) external pure returns (uint16 a, uint256 newPointer) { + return LibBytesPointer.readFirstUint16(data); + } + + function readUint16(bytes calldata data, uint256 index) external pure returns (uint16 a, uint256 newPointer) { + return LibBytesPointer.readUint16(data, index); + } + + function readUint24(bytes calldata data, uint256 index) external pure returns (uint24 a, uint256 newPointer) { + return LibBytesPointer.readUint24(data, index); + } + + function readUint64(bytes calldata data, uint256 index) external pure returns (uint64 a, uint256 newPointer) { + return LibBytesPointer.readUint64(data, index); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/LibStringImp.sol b/packages/wallet/wallet-contracts/contracts/mocks/LibStringImp.sol new file mode 100644 index 000000000..54db366be --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/LibStringImp.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../utils/LibString.sol"; + +contract LibStringImp { + using LibString for string; + + function prefixBase32(string calldata data) external pure returns (string memory) { + return LibString.prefixBase32(data); + } + + function prefixHexadecimal(string calldata data) external pure returns (string memory) { + return LibString.prefixHexadecimal(data); + } + + function bytesToBase32(bytes calldata data) external pure returns (string memory) { + return LibString.bytesToBase32(data); + } + + function bytesToHexadecimal(bytes calldata data) external pure returns (string memory) { + return LibString.bytesToHexadecimal(data); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/mocks/ModuleMock.sol b/packages/wallet/wallet-contracts/contracts/mocks/ModuleMock.sol new file mode 100644 index 000000000..5032d31ec --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/mocks/ModuleMock.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract ModuleMock { + event Pong(); + + function ping() external { + emit Pong(); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/GuestModule.sol b/packages/wallet/wallet-contracts/contracts/modules/GuestModule.sol new file mode 100644 index 000000000..924fa359e --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/GuestModule.sol @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../utils/LibOptim.sol"; + +import "./commons/submodules/auth/SequenceBaseSig.sol"; + +import "./commons/ModuleAuth.sol"; +import "./commons/ModuleCalls.sol"; +import "./commons/ModuleCreator.sol"; + +/** + * GuestModule implements a Sequence wallet without signatures, nonce or replay protection. + * executing transactions using this wallet is not an authenticated process, and can be done by any address. + * + * @notice This contract is completely public with no security, designed to execute pre-signed transactions + * and use Sequence tools without using the wallets. + */ +contract GuestModule is ModuleAuth, ModuleCalls, ModuleCreator { + error DelegateCallNotAllowed(uint256 _index); + error NotSupported(); + + /** + * @notice Allow any caller to execute an action + * @param _txs Transactions to process + */ + function execute(Transaction[] calldata _txs, uint256, bytes calldata) public override { + // Hash transaction bundle + bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode("guest:", _txs))); + + // Execute the transactions + _executeGuest(txHash, _txs); + } + + /** + * @notice Allow any caller to execute an action + * @param _txs Transactions to process + */ + function selfExecute(Transaction[] calldata _txs) public override { + // Hash transaction bundle + bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode("self:", _txs))); + + // Execute the transactions + _executeGuest(txHash, _txs); + } + + /** + * @notice Executes a list of transactions + * @param _txHash Hash of the batch of transactions + * @param _txs Transactions to execute + */ + function _executeGuest(bytes32 _txHash, Transaction[] calldata _txs) private { + // Execute transaction + uint256 size = _txs.length; + for (uint256 i = 0; i < size; i++) { + Transaction calldata transaction = _txs[i]; + + if (transaction.delegateCall) revert DelegateCallNotAllowed(i); + + uint256 gasLimit = transaction.gasLimit; + if (gasleft() < gasLimit) revert NotEnoughGas(i, gasLimit, gasleft()); + + bool success = LibOptim.call( + transaction.target, transaction.value, gasLimit == 0 ? gasleft() : gasLimit, transaction.data + ); + + if (success) { + emit TxExecuted(_txHash, i); + } else { + _revertBytes(transaction.revertOnError, _txHash, i, LibOptim.returnData()); + } + } + } + + /** + * @notice Validates any signature image, because the wallet is public and has no owner. + * @return true, all signatures are valid. + */ + function _isValidImage(bytes32) internal pure override returns (bool) { + return true; + } + + /** + * Not supported. + */ + function _updateImageHash(bytes32) internal virtual override { + revert NotSupported(); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) + public + pure + override(ModuleAuth, ModuleCalls, ModuleCreator) + returns (bool) + { + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/MainModule.sol b/packages/wallet/wallet-contracts/contracts/modules/MainModule.sol new file mode 100644 index 000000000..f6d87dafb --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/MainModule.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./commons/ModuleAuthFixed.sol"; +import "./commons/ModuleHooks.sol"; +import "./commons/ModuleCalls.sol"; +import "./commons/ModuleCreator.sol"; +import "./commons/ModuleExtraAuth.sol"; +import "./commons/ModuleAuthConvenience.sol"; + +/** + * @notice Contains the core functionality Sequence wallets will inherit. + * @dev If using a new main module, developers must ensure that all inherited + * contracts by the main module don't conflict and are accounted for to be + * supported by the supportsInterface method. + */ +contract MainModule is + ModuleAuthFixed, + ModuleExtraAuth, + ModuleCalls, + ModuleHooks, + ModuleCreator, + ModuleAuthConvenience +{ + constructor(address _factory, address _mainModuleUpgradable) ModuleAuthFixed(_factory, _mainModuleUpgradable) {} + + function _isValidImage(bytes32 _imageHash) + internal + view + override(IModuleAuth, ModuleAuthFixed, ModuleExtraAuth) + returns (bool) + { + return super._isValidImage(_imageHash); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) + public + pure + override(ModuleAuthFixed, ModuleAuthConvenience, ModuleCalls, ModuleExtraAuth, ModuleHooks, ModuleCreator) + returns (bool) + { + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/MainModuleGasEstimation.sol b/packages/wallet/wallet-contracts/contracts/modules/MainModuleGasEstimation.sol new file mode 100644 index 000000000..60938779b --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/MainModuleGasEstimation.sol @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol"; +import "./commons/gas-estimation/ModuleIgnoreNonceCalls.sol"; +import "./commons/ModuleHooks.sol"; +import "./commons/ModuleUpdate.sol"; +import "./commons/ModuleCreator.sol"; + +/** + * @notice Contains an alternative implementation of the MainModules that skips validation of + * signatures, this implementation SHOULD NOT be used directly on a wallet. + * + * Intended to be used only for gas estimation, using eth_call and overrides. + */ +contract MainModuleGasEstimation is + ModuleIgnoreAuthUpgradable, + ModuleIgnoreNonceCalls, + ModuleUpdate, + ModuleHooks, + ModuleCreator +{ + struct SimulateResult { + bool executed; + bool succeeded; + bytes result; + uint256 gasUsed; + } + + /** + * @notice Simulate each transaction in a bundle for gas usage and execution result + * @param _txs Transactions to process + * @return The gas used and execution result for each transaction in the bundle + */ + function simulateExecute(Transaction[] calldata _txs) public virtual returns (SimulateResult[] memory) { + unchecked { + SimulateResult[] memory results = new SimulateResult[](_txs.length); + + // Execute transaction + uint256 size = _txs.length; + for (uint256 i = 0; i < size; i++) { + Transaction calldata transaction = _txs[i]; + uint256 gasLimit = transaction.gasLimit; + + results[i].executed = true; + + if (gasleft() < gasLimit) { + results[i].succeeded = false; + results[i].result = + abi.encodeWithSelector(IModuleCalls.NotEnoughGas.selector, i, gasLimit, gasleft()); + break; + } + + if (transaction.delegateCall) { + uint256 initialGas = gasleft(); + + (results[i].succeeded, results[i].result) = + transaction.target.delegatecall{gas: gasLimit == 0 ? gasleft() : gasLimit}(transaction.data); + + results[i].gasUsed = initialGas - gasleft(); + } else { + uint256 initialGas = gasleft(); + + (results[i].succeeded, results[i].result) = transaction.target + .call{value: transaction.value, gas: gasLimit == 0 ? gasleft() : gasLimit}(transaction.data); + + results[i].gasUsed = initialGas - gasleft(); + } + + if (!results[i].succeeded && transaction.revertOnError) { + break; + } + } + + return results; + } + } + + function _isValidImage(bytes32 _imageHash) + internal + view + override(IModuleAuth, ModuleIgnoreAuthUpgradable) + returns (bool) + { + return super._isValidImage(_imageHash); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @dev If using a new main module, developers must ensure that all inherited + * contracts by the main module don't conflict and are accounted for to be + * supported by the supportsInterface method. + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) + public + pure + override(ModuleAuthUpgradable, ModuleCalls, ModuleUpdate, ModuleHooks, ModuleCreator) + returns (bool) + { + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/MainModuleUpgradable.sol b/packages/wallet/wallet-contracts/contracts/modules/MainModuleUpgradable.sol new file mode 100644 index 000000000..5c83d4c5e --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/MainModuleUpgradable.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./commons/ModuleAuthUpgradable.sol"; +import "./commons/ModuleHooks.sol"; +import "./commons/ModuleCalls.sol"; +import "./commons/ModuleUpdate.sol"; +import "./commons/ModuleCreator.sol"; +import "./commons/ModuleExtraAuth.sol"; +import "./commons/ModuleAuthConvenience.sol"; + +/** + * @notice Contains the core functionality Sequence wallets will inherit with + * the added functionality that the main module can be changed. + * @dev If using a new main module, developers must ensure that all inherited + * contracts by the main module don't conflict and are accounted for to be + * supported by the supportsInterface method. + */ +contract MainModuleUpgradable is + ModuleAuthUpgradable, + ModuleExtraAuth, + ModuleCalls, + ModuleUpdate, + ModuleHooks, + ModuleCreator, + ModuleAuthConvenience +{ + function _isValidImage(bytes32 _imageHash) + internal + view + override(IModuleAuth, ModuleAuthUpgradable, ModuleExtraAuth) + returns (bool) + { + return super._isValidImage(_imageHash); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @dev If using a new main module, developers must ensure that all inherited + * contracts by the main module don't conflict and are accounted for to be + * supported by the supportsInterface method. + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) + public + pure + override( + ModuleAuthUpgradable, + ModuleAuthConvenience, + ModuleCalls, + ModuleExtraAuth, + ModuleUpdate, + ModuleHooks, + ModuleCreator + ) + returns (bool) + { + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/Implementation.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/Implementation.sol new file mode 100644 index 000000000..e517e2188 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/Implementation.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +/** + * @dev Allows modules to access the implementation slot + */ +contract Implementation { + /** + * @notice Updates the Wallet implementation + * @param _imp New implementation address + * @dev The wallet implementation is stored on the storage slot + * defined by the address of the wallet itself + * WARNING updating this value may break the wallet and users + * must be confident that the new implementation is safe. + */ + function _setImplementation(address _imp) internal { + assembly { + sstore(address(), _imp) + } + } + + /** + * @notice Returns the Wallet implementation + * @return _imp The address of the current Wallet implementation + */ + function _getImplementation() internal view returns (address _imp) { + assembly { + _imp := sload(address()) + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuth.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuth.sol new file mode 100644 index 000000000..f4cd03fef --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuth.sol @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../../utils/LibBytes.sol"; +import "../../interfaces/IERC1271Wallet.sol"; + +import "./interfaces/IModuleAuth.sol"; + +import "./ModuleERC165.sol"; + +import "./submodules/auth/SequenceBaseSig.sol"; +import "./submodules/auth/SequenceDynamicSig.sol"; +import "./submodules/auth/SequenceNoChainIdSig.sol"; +import "./submodules/auth/SequenceChainedSig.sol"; + +abstract contract ModuleAuth is IModuleAuth, ModuleERC165, IERC1271Wallet, SequenceChainedSig { + using LibBytes for bytes; + + bytes1 internal constant LEGACY_TYPE = hex"00"; + bytes1 internal constant DYNAMIC_TYPE = hex"01"; + bytes1 internal constant NO_CHAIN_ID_TYPE = hex"02"; + bytes1 internal constant CHAINED_TYPE = hex"03"; + + bytes4 internal constant SELECTOR_ERC1271_BYTES_BYTES = 0x20c13b0b; + bytes4 internal constant SELECTOR_ERC1271_BYTES32_BYTES = 0x1626ba7e; + + /** + * @notice Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature. + * @dev The signature must be prefixed with a type byte, which is used to determine the recovery method. + * + * @param _digest Digest of the signed data. + * @param _signature A Sequence signature. + * + * @return threshold The required number of signatures needed to consider the signature valid. + * @return weight The actual number of signatures collected in the signature. + * @return imageHash The imageHash of the configuration that signed the message. + * @return subdigest A modified version of the original digest, unique for each wallet/network. + * @return checkpoint A nonce that is incremented every time a new configuration is set. + */ + function signatureRecovery(bytes32 _digest, bytes calldata _signature) + public + view + virtual + override + returns (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 checkpoint) + { + bytes1 signatureType = _signature[0]; + + if (signatureType == LEGACY_TYPE) { + // networkId digest + base recover + subdigest = SequenceBaseSig.subdigest(_digest); + (threshold, weight, imageHash, checkpoint) = SequenceBaseSig.recover(subdigest, _signature); + return (threshold, weight, imageHash, subdigest, checkpoint); + } + + if (signatureType == DYNAMIC_TYPE) { + // networkId digest + dynamic recover + subdigest = SequenceBaseSig.subdigest(_digest); + (threshold, weight, imageHash, checkpoint) = SequenceDynamicSig.recover(subdigest, _signature); + return (threshold, weight, imageHash, subdigest, checkpoint); + } + + if (signatureType == NO_CHAIN_ID_TYPE) { + // noChainId digest + dynamic recover + subdigest = SequenceNoChainIdSig.subdigest(_digest); + (threshold, weight, imageHash, checkpoint) = SequenceDynamicSig.recover(subdigest, _signature); + return (threshold, weight, imageHash, subdigest, checkpoint); + } + + if (signatureType == CHAINED_TYPE) { + // original digest + chained recover + // (subdigest will be computed in the chained recover) + return chainedRecover(_digest, _signature); + } + + revert InvalidSignatureType(signatureType); + } + + /** + * @dev Validates a signature. + * + * @param _digest Digest of the signed data. + * @param _signature A Sequence signature. + * + * @return isValid Indicates whether the signature is valid or not. + * @return subdigest A modified version of the original digest, unique for each wallet/network. + */ + function _signatureValidation(bytes32 _digest, bytes calldata _signature) + internal + view + virtual + override + returns (bool isValid, bytes32 subdigest) + { + uint256 threshold; + uint256 weight; + bytes32 imageHash; + (threshold, weight, imageHash, subdigest,) = signatureRecovery(_digest, _signature); + isValid = weight >= threshold && _isValidImage(imageHash); + } + + /** + * @notice Verifies whether the provided signature is valid with respect to the provided data + * @dev MUST return the correct magic value if the signature provided is valid for the provided data + * > The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)")) + * @param _data Arbitrary length data signed on the behalf of address(this) + * @param _signatures Signature byte array associated with _data. + * Encoded as abi.encode(Signature[], Configs) + * @return magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise + */ + function isValidSignature(bytes calldata _data, bytes calldata _signatures) + public + view + virtual + override + returns (bytes4) + { + // Validate signatures + (bool isValid,) = _signatureValidation(keccak256(_data), _signatures); + if (isValid) { + return SELECTOR_ERC1271_BYTES_BYTES; + } + + return bytes4(0); + } + + /** + * @notice Verifies whether the provided signature is valid with respect to the provided hash + * @dev MUST return the correct magic value if the signature provided is valid for the provided hash + * > The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256("isValidSignature(bytes32,bytes)")) + * @param _hash keccak256 hash that was signed + * @param _signatures Signature byte array associated with _data. + * Encoded as abi.encode(Signature[], Configs) + * @return magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise + */ + function isValidSignature(bytes32 _hash, bytes calldata _signatures) public view virtual override returns (bytes4) { + // Validate signatures + (bool isValid,) = _signatureValidation(_hash, _signatures); + if (isValid) { + return SELECTOR_ERC1271_BYTES32_BYTES; + } + + return bytes4(0); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool) { + if (_interfaceID == type(IModuleAuth).interfaceId || _interfaceID == type(IERC1271Wallet).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } + + /** + * @notice Updates the signers configuration of the wallet + * @param _imageHash New required image hash of the signature + */ + function updateImageHash(bytes32 _imageHash) external virtual override onlySelf { + _updateImageHash(_imageHash); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthConvenience.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthConvenience.sol new file mode 100644 index 000000000..5ffc11523 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthConvenience.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleSelfAuth.sol"; +import "./ModuleAuth.sol"; +import "./ModuleIPFS.sol"; +import "./ModuleERC165.sol"; + +import "../../utils/LibString.sol"; + +abstract contract ModuleAuthConvenience is ModuleERC165, ModuleSelfAuth, ModuleAuth, ModuleIPFS { + /** + * @notice Updates the image hash and the IPFS root in a single operation. + * @dev These two operations are often performed together, so this function + * allows to save some gas by performing them in a single step. + * + * @param _imageHash The new image hash to be set. + * @param _ipfsRoot The new IPFS root to be set. + */ + function updateImageHashAndIPFS(bytes32 _imageHash, bytes32 _ipfsRoot) external onlySelf { + _updateImageHash(_imageHash); + _updateIPFSRoot(_ipfsRoot); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) + public + pure + virtual + override(ModuleERC165, ModuleAuth) + returns (bool) + { + if (_interfaceID == type(ModuleAuthConvenience).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthFixed.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthFixed.sol new file mode 100644 index 000000000..80160dc4c --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthFixed.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleAuth.sol"; +import "./ModuleUpdate.sol"; +import "./ModuleSelfAuth.sol"; +import "./ModuleStorage.sol"; + +import "../../Wallet.sol"; + +/** + * Implements ModuleAuth by validating the signature image against + * the salt used to deploy the contract + * + * This module allows wallets to be deployed with a default configuration + * without using any aditional contract storage + */ +abstract contract ModuleAuthFixed is ModuleSelfAuth, ModuleAuth, ModuleUpdate { + bytes32 public immutable INIT_CODE_HASH; + address public immutable FACTORY; + address public immutable UPGRADEABLE_IMPLEMENTATION; + + constructor(address _factory, address _mainModuleUpgradeable) { + // Build init code hash of the deployed wallets using that module + bytes32 initCodeHash = keccak256(abi.encodePacked(Wallet.creationCode, uint256(uint160(address(this))))); + + INIT_CODE_HASH = initCodeHash; + FACTORY = _factory; + UPGRADEABLE_IMPLEMENTATION = _mainModuleUpgradeable; + } + + /** + * @notice Updates the configuration of the wallet + * @dev In the process of updating the configuration, the wallet implementation + * is updated to the mainModuleUpgradeable, this only happens once in the + * lifetime of the wallet. + * + * @param _imageHash New required image hash of the signature + */ + function _updateImageHash(bytes32 _imageHash) internal virtual override { + // Update imageHash in storage + if (_imageHash == bytes32(0)) revert ImageHashIsZero(); + ModuleStorage.writeBytes32(IMAGE_HASH_KEY, _imageHash); + emit ImageHashUpdated(_imageHash); + + // Update wallet implementation to mainModuleUpgradeable + _updateImplementation(UPGRADEABLE_IMPLEMENTATION); + } + + /** + * @notice Validates the signature image with the salt used to deploy the contract + * @param _imageHash Hash image of signature + * @return true if the signature image is valid + */ + function _isValidImage(bytes32 _imageHash) internal view virtual override returns (bool) { + return address(uint160(uint256(keccak256(abi.encodePacked(hex"ff", FACTORY, _imageHash, INIT_CODE_HASH))))) + == address(this); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) + public + pure + virtual + override(ModuleAuth, ModuleUpdate) + returns (bool) + { + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthUpgradable.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthUpgradable.sol new file mode 100644 index 000000000..c0585b4a1 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleAuthUpgradable.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./interfaces/IModuleAuthUpgradable.sol"; + +import "./ModuleSelfAuth.sol"; +import "./ModuleAuth.sol"; +import "./ModuleStorage.sol"; + +abstract contract ModuleAuthUpgradable is IModuleAuthUpgradable, ModuleSelfAuth, ModuleAuth { + /** + * @notice Updates the signers configuration of the wallet + * @param _imageHash New required image hash of the signature + */ + function _updateImageHash(bytes32 _imageHash) internal virtual override { + if (_imageHash == bytes32(0)) revert ImageHashIsZero(); + ModuleStorage.writeBytes32(IMAGE_HASH_KEY, _imageHash); + emit ImageHashUpdated(_imageHash); + } + + /** + * @notice Returns the current image hash of the wallet + */ + function imageHash() external view virtual override returns (bytes32) { + return ModuleStorage.readBytes32(IMAGE_HASH_KEY); + } + + /** + * @notice Validates the signature image with a valid image hash defined + * in the contract storage + * @param _imageHash Hash image of signature + * @return true if the signature image is valid + */ + function _isValidImage(bytes32 _imageHash) internal view virtual override returns (bool) { + return _imageHash != bytes32(0) && _imageHash == ModuleStorage.readBytes32(IMAGE_HASH_KEY); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool) { + if (_interfaceID == type(IModuleAuthUpgradable).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleCalls.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleCalls.sol new file mode 100644 index 000000000..44221fa61 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleCalls.sol @@ -0,0 +1,131 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleSelfAuth.sol"; +import "./ModuleStorage.sol"; +import "./ModuleERC165.sol"; +import "./ModuleNonce.sol"; +import "./ModuleOnlyDelegatecall.sol"; + +import "./interfaces/IModuleCalls.sol"; +import "./interfaces/IModuleAuth.sol"; + +import "./submodules/nonce/SubModuleNonce.sol"; +import "./submodules/auth/SequenceBaseSig.sol"; + +import "../../utils/LibOptim.sol"; + +abstract contract ModuleCalls is + IModuleCalls, + IModuleAuth, + ModuleERC165, + ModuleOnlyDelegatecall, + ModuleSelfAuth, + ModuleNonce +{ + /** + * @notice Allow wallet owner to execute an action + * @dev Relayers must ensure that the gasLimit specified for each transaction + * is acceptable to them. A user could specify large enough that it could + * consume all the gas available. + * @param _txs Transactions to process + * @param _nonce Signature nonce (may contain an encoded space) + * @param _signature Encoded signature + */ + function execute(Transaction[] calldata _txs, uint256 _nonce, bytes calldata _signature) + external + virtual + override + onlyDelegatecall + { + // Validate and update nonce + _validateNonce(_nonce); + + // Hash and verify transaction bundle + (bool isValid, bytes32 txHash) = _signatureValidation(keccak256(abi.encode(_nonce, _txs)), _signature); + + if (!isValid) { + revert InvalidSignature(txHash, _signature); + } + + // Execute the transactions + _execute(txHash, _txs); + } + + /** + * @notice Allow wallet to execute an action + * without signing the message + * @param _txs Transactions to execute + */ + function selfExecute(Transaction[] calldata _txs) external virtual override onlySelf { + // Hash transaction bundle + bytes32 txHash = SequenceBaseSig.subdigest(keccak256(abi.encode("self:", _txs))); + + // Execute the transactions + _execute(txHash, _txs); + } + + /** + * @notice Executes a list of transactions + * @param _txHash Hash of the batch of transactions + * @param _txs Transactions to execute + */ + function _execute(bytes32 _txHash, Transaction[] calldata _txs) private { + unchecked { + // Execute transaction + uint256 size = _txs.length; + for (uint256 i = 0; i < size; i++) { + Transaction calldata transaction = _txs[i]; + uint256 gasLimit = transaction.gasLimit; + + if (gasleft() < gasLimit) revert NotEnoughGas(i, gasLimit, gasleft()); + + bool success; + if (transaction.delegateCall) { + success = LibOptim.delegatecall( + transaction.target, gasLimit == 0 ? gasleft() : gasLimit, transaction.data + ); + } else { + success = LibOptim.call( + transaction.target, transaction.value, gasLimit == 0 ? gasleft() : gasLimit, transaction.data + ); + } + + if (success) { + emit TxExecuted(_txHash, i); + } else { + // Avoid copy of return data until neccesary + _revertBytes(transaction.revertOnError, _txHash, i, LibOptim.returnData()); + } + } + } + } + + /** + * @notice Logs a failed transaction, reverts if the transaction is not optional + * @param _revertOnError Signals if it should revert or just log + * @param _txHash Hash of the transaction + * @param _index Index of the transaction in the batch + * @param _reason Encoded revert message + */ + function _revertBytes(bool _revertOnError, bytes32 _txHash, uint256 _index, bytes memory _reason) internal { + if (_revertOnError) { + assembly { revert(add(_reason, 0x20), mload(_reason)) } + } else { + emit TxFailed(_txHash, _index, _reason); + } + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool) { + if (_interfaceID == type(IModuleCalls).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleCreator.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleCreator.sol new file mode 100644 index 000000000..2e75ce1ae --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleCreator.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./interfaces/IModuleCreator.sol"; + +import "./ModuleSelfAuth.sol"; +import "./ModuleERC165.sol"; + +contract ModuleCreator is IModuleCreator, ModuleERC165, ModuleSelfAuth { + event CreatedContract(address _contract); + + /** + * @notice Creates a contract forwarding eth value + * @param _code Creation code of the contract + * @return addr The address of the created contract + */ + function createContract(bytes memory _code) public payable virtual override onlySelf returns (address addr) { + assembly { addr := create(callvalue(), add(_code, 32), mload(_code)) } + if (addr == address(0)) revert CreateFailed(_code); + emit CreatedContract(addr); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool) { + if (_interfaceID == type(IModuleCreator).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleERC165.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleERC165.sol new file mode 100644 index 000000000..8cf8eaad0 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleERC165.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +abstract contract ModuleERC165 { + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @dev Adding new hooks will not lead to them being reported by this function + * without upgrading the wallet. In addition, developers must ensure that + * all inherited contracts by the main module don't conflict and are accounted + * to be supported by the supportsInterface method. + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public pure virtual returns (bool) { + return _interfaceID == this.supportsInterface.selector; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleERC5719.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleERC5719.sol new file mode 100644 index 000000000..669e86d62 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleERC5719.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleIPFS.sol"; + +import "../../utils/LibString.sol"; + +contract ModuleERC5719 is ModuleIPFS { + function getAlternativeSignature(bytes32 _digest) external view returns (string memory) { + return string( + abi.encodePacked( + ipfsRoot(), + "/ERC5719/", + LibString.prefixHexadecimal(LibString.bytesToHexadecimal(abi.encodePacked(_digest))) + ) + ); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleExtraAuth.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleExtraAuth.sol new file mode 100644 index 000000000..f7642fc60 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleExtraAuth.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleAuth.sol"; +import "./ModuleStorage.sol"; +import "./ModuleSelfAuth.sol"; +import "./ModuleERC165.sol"; + +abstract contract ModuleExtraAuth is ModuleERC165, ModuleSelfAuth, ModuleAuth { + // EXTRA_IMAGE_HASH_KEY = keccak256("org.sequence.module.static.auth.extra.image.hash"); + bytes32 private constant EXTRA_IMAGE_HASH_KEY = + bytes32(0x849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de); + + event SetExtraImageHash(bytes32 indexed _imageHash, uint256 _expiration); + + function _writeExpirationForImageHash(bytes32 _imageHash, uint256 _expiration) internal { + ModuleStorage.writeBytes32Map(EXTRA_IMAGE_HASH_KEY, _imageHash, bytes32(_expiration)); + } + + function _readExpirationForImageHash(bytes32 _imageHash) internal view returns (uint256 _expiration) { + return uint256(ModuleStorage.readBytes32Map(EXTRA_IMAGE_HASH_KEY, _imageHash)); + } + + function _isValidImage(bytes32 _imageHash) internal view virtual override returns (bool) { + if (super._isValidImage(_imageHash)) { + return true; + } + + uint256 expiration = _readExpirationForImageHash(_imageHash); + + // solhint-disable-next-line not-rely-on-time + return expiration != 0 && expiration > block.timestamp; + } + + function extraImageHash(bytes32 _imageHash) public view returns (uint256) { + return _readExpirationForImageHash(_imageHash); + } + + function setExtraImageHash(bytes32 _imageHash, uint256 _expiration) external onlySelf { + _writeExpirationForImageHash(_imageHash, _expiration); + + emit SetExtraImageHash(_imageHash, _expiration); + } + + function clearExtraImageHashes(bytes32[] calldata _imageHashes) external onlySelf { + unchecked { + uint256 imageHashesLength = _imageHashes.length; + for (uint256 i = 0; i < imageHashesLength; i++) { + bytes32 imageHash = _imageHashes[i]; + _writeExpirationForImageHash(imageHash, 0); + + emit SetExtraImageHash(imageHash, 0); + } + } + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) + public + pure + virtual + override(ModuleERC165, ModuleAuth) + returns (bool) + { + if (_interfaceID == type(ModuleExtraAuth).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleHooks.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleHooks.sol new file mode 100644 index 000000000..f0fb61b28 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleHooks.sol @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./interfaces/IModuleHooks.sol"; + +import "./ModuleSelfAuth.sol"; +import "./ModuleStorage.sol"; +import "./ModuleERC165.sol"; + +import "../../interfaces/receivers/IERC1155Receiver.sol"; +import "../../interfaces/receivers/IERC721Receiver.sol"; +import "../../interfaces/receivers/IERC223Receiver.sol"; + +contract ModuleHooks is IERC1155Receiver, IERC721Receiver, IModuleHooks, ModuleERC165, ModuleSelfAuth { + // HOOKS_KEY = keccak256("org.arcadeum.module.hooks.hooks"); + bytes32 private constant HOOKS_KEY = bytes32(0xbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a120); + + /** + * @notice Reads the implementation hook of a signature + * @param _signature Signature function + * @return The address of the implementation hook, address(0) if none + */ + function readHook(bytes4 _signature) external view virtual override returns (address) { + return _readHook(_signature); + } + + /** + * @notice Adds a new hook to handle a given function selector + * @param _signature Signature function linked to the hook + * @param _implementation Hook implementation contract + * @dev Can't overwrite hooks that are part of the main module (those defined below) + */ + function addHook(bytes4 _signature, address _implementation) external virtual override onlySelf { + if (_readHook(_signature) != address(0)) revert HookAlreadyExists(_signature); + _writeHook(_signature, _implementation); + } + + /** + * @notice Removes a registered hook + * @param _signature Signature function linked to the hook + * @dev Can't remove hooks that are part of the main module (those defined below) + * without upgrading the wallet + */ + function removeHook(bytes4 _signature) external virtual override onlySelf { + if (_readHook(_signature) == address(0)) revert HookDoesNotExist(_signature); + _writeHook(_signature, address(0)); + } + + /** + * @notice Reads the implementation hook of a signature + * @param _signature Signature function + * @return The address of the implementation hook, address(0) if none + */ + function _readHook(bytes4 _signature) private view returns (address) { + return address(uint160(uint256(ModuleStorage.readBytes32Map(HOOKS_KEY, _signature)))); + } + + /** + * @notice Writes the implementation hook of a signature + * @param _signature Signature function + * @param _implementation Hook implementation contract + */ + function _writeHook(bytes4 _signature, address _implementation) private { + ModuleStorage.writeBytes32Map(HOOKS_KEY, _signature, bytes32(uint256(uint160(_implementation)))); + emit DefinedHook(_signature, _implementation); + } + + /** + * @notice Handle the receipt of a single ERC1155 token type. + * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` + */ + function onERC1155Received(address, address, uint256, uint256, bytes calldata) + external + virtual + override + returns (bytes4) + { + return ModuleHooks.onERC1155Received.selector; + } + + /** + * @notice Handle the receipt of multiple ERC1155 token types. + * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` + */ + function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) + external + virtual + override + returns (bytes4) + { + return ModuleHooks.onERC1155BatchReceived.selector; + } + + /** + * @notice Handle the receipt of a single ERC721 token. + * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` + */ + function onERC721Received(address, address, uint256, bytes calldata) external virtual override returns (bytes4) { + return ModuleHooks.onERC721Received.selector; + } + + /** + * @notice Routes fallback calls through hooks + */ + fallback() external payable { + if (msg.data.length >= 4) { + address target = _readHook(msg.sig); + if (target != address(0)) { + (bool success, bytes memory result) = target.delegatecall(msg.data); + assembly { + if iszero(success) { + revert(add(result, 0x20), mload(result)) + } + + return(add(result, 0x20), mload(result)) + } + } + } + } + + /** + * @notice Allows the wallet to receive ETH + */ + receive() external payable {} + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool) { + if ( + _interfaceID == type(IModuleHooks).interfaceId || _interfaceID == type(IERC1155Receiver).interfaceId + || _interfaceID == type(IERC721Receiver).interfaceId + || _interfaceID == type(IERC223Receiver).interfaceId + ) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleIPFS.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleIPFS.sol new file mode 100644 index 000000000..7241db83e --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleIPFS.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleSelfAuth.sol"; +import "./ModuleStorage.sol"; + +import "../../utils/LibString.sol"; + +contract ModuleIPFS is ModuleSelfAuth { + event IPFSRootUpdated(bytes32 _hash); + + // IPFS_ROOT_KEY = keccak256("sequence.ipfs.root") + bytes32 private constant IPFS_ROOT_KEY = + bytes32(0x0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d033); + + function ipfsRootBytes32() public view returns (bytes32) { + return ModuleStorage.readBytes32(IPFS_ROOT_KEY); + } + + function ipfsRoot() public view returns (string memory) { + return string( + abi.encodePacked( + "ipfs://", + LibString.prefixBase32(LibString.bytesToBase32(abi.encodePacked(hex"01701220", ipfsRootBytes32()))) + ) + ); + } + + function updateIPFSRoot(bytes32 _hash) external onlySelf { + _updateIPFSRoot(_hash); + } + + function _updateIPFSRoot(bytes32 _hash) internal { + ModuleStorage.writeBytes32(IPFS_ROOT_KEY, _hash); + emit IPFSRootUpdated(_hash); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleNonce.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleNonce.sol new file mode 100644 index 000000000..ebdbaa31a --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleNonce.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./ModuleStorage.sol"; + +import "./submodules/nonce/SubModuleNonce.sol"; + +contract ModuleNonce { + // Events + event NonceChange(uint256 _space, uint256 _newNonce); + + // Errors + error BadNonce(uint256 _space, uint256 _provided, uint256 _current); + + // NONCE_KEY = keccak256("org.arcadeum.module.calls.nonce"); + bytes32 private constant NONCE_KEY = bytes32(0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e); + + /** + * @notice Returns the next nonce of the default nonce space + * @dev The default nonce space is 0x00 + * @return The next nonce + */ + function nonce() external view virtual returns (uint256) { + return readNonce(0); + } + + /** + * @notice Returns the next nonce of the given nonce space + * @param _space Nonce space, each space keeps an independent nonce count + * @return The next nonce + */ + function readNonce(uint256 _space) public view virtual returns (uint256) { + return uint256(ModuleStorage.readBytes32Map(NONCE_KEY, bytes32(_space))); + } + + /** + * @notice Changes the next nonce of the given nonce space + * @param _space Nonce space, each space keeps an independent nonce count + * @param _nonce Nonce to write on the space + */ + function _writeNonce(uint256 _space, uint256 _nonce) internal { + ModuleStorage.writeBytes32Map(NONCE_KEY, bytes32(_space), bytes32(_nonce)); + } + + /** + * @notice Verify if a nonce is valid + * @param _rawNonce Nonce to validate (may contain an encoded space) + */ + function _validateNonce(uint256 _rawNonce) internal virtual { + // Retrieve current nonce for this wallet + (uint256 space, uint256 providedNonce) = SubModuleNonce.decodeNonce(_rawNonce); + + uint256 currentNonce = readNonce(space); + if (currentNonce != providedNonce) { + revert BadNonce(space, providedNonce, currentNonce); + } + + unchecked { + uint256 newNonce = providedNonce + 1; + + _writeNonce(space, newNonce); + emit NonceChange(space, newNonce); + return; + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleOnlyDelegatecall.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleOnlyDelegatecall.sol new file mode 100644 index 000000000..6d4113a93 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleOnlyDelegatecall.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract ModuleOnlyDelegatecall { + address private immutable self; + + error OnlyDelegatecall(); + + constructor() { + self = address(this); + } + + /** + * @notice Modifier that only allows functions to be called via delegatecall. + */ + modifier onlyDelegatecall() { + if (address(this) == self) { + revert OnlyDelegatecall(); + } + _; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleSelfAuth.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleSelfAuth.sol new file mode 100644 index 000000000..42bfde533 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleSelfAuth.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract ModuleSelfAuth { + error OnlySelfAuth(address _sender, address _self); + + modifier onlySelf() { + if (msg.sender != address(this)) { + revert OnlySelfAuth(msg.sender, address(this)); + } + _; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleStorage.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleStorage.sol new file mode 100644 index 000000000..61230a10a --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleStorage.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +library ModuleStorage { + function writeBytes32(bytes32 _key, bytes32 _val) internal { + assembly { sstore(_key, _val) } + } + + function readBytes32(bytes32 _key) internal view returns (bytes32 val) { + assembly { val := sload(_key) } + } + + function writeBytes32Map(bytes32 _key, bytes32 _subKey, bytes32 _val) internal { + bytes32 key = keccak256(abi.encode(_key, _subKey)); + assembly { sstore(key, _val) } + } + + function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val) { + bytes32 key = keccak256(abi.encode(_key, _subKey)); + assembly { val := sload(key) } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleUpdate.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleUpdate.sol new file mode 100644 index 000000000..cc8cb7abd --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/ModuleUpdate.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./interfaces/IModuleUpdate.sol"; + +import "./Implementation.sol"; +import "./ModuleSelfAuth.sol"; +import "./ModuleERC165.sol"; + +import "../../utils/LibAddress.sol"; + +contract ModuleUpdate is IModuleUpdate, ModuleERC165, ModuleSelfAuth, Implementation { + using LibAddress for address; + + event ImplementationUpdated(address newImplementation); + + /** + * @notice Updates the implementation of the base wallet + * @param _implementation New main module implementation + * @dev WARNING Updating the implementation can brick the wallet + */ + function updateImplementation(address _implementation) external virtual override onlySelf { + _updateImplementation(_implementation); + } + + /** + * @notice Updates the implementation of the base wallet, used internally. + * @param _implementation New main module implementation + * @dev WARNING Updating the implementation can brick the wallet + */ + function _updateImplementation(address _implementation) internal virtual override { + if (!_implementation.isContract()) revert InvalidImplementation(_implementation); + _setImplementation(_implementation); + emit ImplementationUpdated(_implementation); + } + + /** + * @notice Query if a contract implements an interface + * @param _interfaceID The interface identifier, as specified in ERC-165 + * @return `true` if the contract implements `_interfaceID` + */ + function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool) { + if (_interfaceID == type(IModuleUpdate).interfaceId) { + return true; + } + + return super.supportsInterface(_interfaceID); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol new file mode 100644 index 000000000..300ebaaa9 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./../ModuleAuthUpgradable.sol"; + +/** + * @notice Implements ModuleAuthUpgradable but ignores the validity of the signature + * should only be used during gas estimation. + */ +abstract contract ModuleIgnoreAuthUpgradable is ModuleAuthUpgradable { + /** + * @notice Removes the signature validation from the module, by returning true for any _imageHash + * @param _imageHash Hash image of signature + * @return true always + */ + function _isValidImage(bytes32 _imageHash) internal view virtual override(ModuleAuthUpgradable) returns (bool) { + // Still validates the imageHash using the original mechanism for a more acurate estimation + return super._isValidImage(_imageHash) || true; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol new file mode 100644 index 000000000..86447adfe --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./../ModuleCalls.sol"; + +import "./../submodules/nonce/SubModuleNonce.sol"; + +/** + * @notice Implements ModuleCalls but ignores the validity of the nonce + * should only be used during gas estimation. + */ +abstract contract ModuleIgnoreNonceCalls is ModuleCalls { + /** + * @notice Verify if a nonce is valid + * @param _rawNonce Nonce to validate (may contain an encoded space) + */ + function _validateNonce(uint256 _rawNonce) internal virtual override { + // Retrieve current nonce for this wallet + (uint256 space, uint256 providedNonce) = SubModuleNonce.decodeNonce(_rawNonce); + + uint256 currentNonce = readNonce(space); + if (currentNonce != providedNonce && false) { + revert BadNonce(space, providedNonce, currentNonce); + } + + unchecked { + uint256 newNonce = providedNonce + 1; + + _writeNonce(space, newNonce); + emit NonceChange(space, newNonce); + return; + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleAuth.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleAuth.sol new file mode 100644 index 000000000..1311b0941 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleAuth.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +abstract contract IModuleAuth { + // IMAGE_HASH_KEY = keccak256("org.arcadeum.module.auth.upgradable.image.hash"); + bytes32 internal constant IMAGE_HASH_KEY = + bytes32(0xea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8); + + event ImageHashUpdated(bytes32 newImageHash); + + // Errors + error ImageHashIsZero(); + error InvalidSignatureType(bytes1 _type); + + function _signatureValidation(bytes32 _digest, bytes calldata _signature) + internal + view + virtual + returns (bool isValid, bytes32 subdigest); + + function signatureRecovery(bytes32 _digest, bytes calldata _signature) + public + view + virtual + returns (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 checkpoint); + + /** + * @notice Validates the signature image + * @return true if the signature image is valid + */ + function _isValidImage(bytes32) internal view virtual returns (bool) { + return false; + } + + /** + * @notice Updates the signers configuration of the wallet + * @param _imageHash New required image hash of the signature + */ + function updateImageHash(bytes32 _imageHash) external virtual; + + /** + * @notice Updates the signers configuration of the wallet + * @param _imageHash New required image hash of the signature + */ + function _updateImageHash(bytes32 _imageHash) internal virtual; +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol new file mode 100644 index 000000000..c782a7b89 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IModuleAuthUpgradable { + /** + * @notice Returns the current image hash of the wallet + */ + function imageHash() external view returns (bytes32); +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleCalls.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleCalls.sol new file mode 100644 index 000000000..259130ea1 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleCalls.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IModuleCalls { + // Events + event TxFailed(bytes32 indexed _tx, uint256 _index, bytes _reason); + event TxExecuted(bytes32 indexed _tx, uint256 _index); + + // Errors + error NotEnoughGas(uint256 _index, uint256 _requested, uint256 _available); + error InvalidSignature(bytes32 _hash, bytes _signature); + + // Transaction structure + struct Transaction { + bool delegateCall; // Performs delegatecall + bool revertOnError; // Reverts transaction bundle if tx fails + uint256 gasLimit; // Maximum gas to be forwarded + address target; // Address of the contract to call + uint256 value; // Amount of ETH to pass with the call + bytes data; // calldata to pass + } + + /** + * @notice Allow wallet owner to execute an action + * @param _txs Transactions to process + * @param _nonce Signature nonce (may contain an encoded space) + * @param _signature Encoded signature + */ + function execute(Transaction[] calldata _txs, uint256 _nonce, bytes calldata _signature) external; + + /** + * @notice Allow wallet to execute an action + * without signing the message + * @param _txs Transactions to execute + */ + function selfExecute(Transaction[] calldata _txs) external; +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleCreator.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleCreator.sol new file mode 100644 index 000000000..f658425bd --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleCreator.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IModuleCreator { + error CreateFailed(bytes _code); + + /** + * @notice Creates a contract forwarding eth value + * @param _code Creation code of the contract + * @return addr The address of the created contract + */ + function createContract(bytes calldata _code) external payable returns (address addr); +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleHooks.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleHooks.sol new file mode 100644 index 000000000..3c38c6081 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleHooks.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +interface IModuleHooks { + // Errors + error HookAlreadyExists(bytes4 _signature); + error HookDoesNotExist(bytes4 _signature); + + // Events + event DefinedHook(bytes4 _signature, address _implementation); + + /** + * @notice Reads the implementation hook of a signature + * @param _signature Signature function + * @return The address of the implementation hook, address(0) if none + */ + function readHook(bytes4 _signature) external view returns (address); + + /** + * @notice Adds a new hook to handle a given function selector + * @param _signature Signature function linked to the hook + * @param _implementation Hook implementation contract + */ + function addHook(bytes4 _signature, address _implementation) external; + + /** + * @notice Removes a registered hook + * @param _signature Signature function linked to the hook + */ + function removeHook(bytes4 _signature) external; +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleUpdate.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleUpdate.sol new file mode 100644 index 000000000..881893752 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/interfaces/IModuleUpdate.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +abstract contract IModuleUpdate { + // Errors + error InvalidImplementation(address _implementation); + + /** + * @notice Updates the implementation of the base wallet + * @param _implementation New main module implementation + * @dev WARNING Updating the implementation can brick the wallet + */ + function updateImplementation(address _implementation) external virtual; + + /** + * @notice Updates the implementation of the base wallet, used internally. + * @param _implementation New main module implementation + * @dev WARNING Updating the implementation can brick the wallet + */ + function _updateImplementation(address _implementation) internal virtual; +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol new file mode 100644 index 000000000..ea62144d0 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../../../../utils/SignatureValidator.sol"; +import "../../../../utils/LibBytesPointer.sol"; +import "../../../../utils/LibBytes.sol"; +import "../../../../utils/LibOptim.sol"; + +/** + * @title SequenceBaseSig Library + * @author Agustin Aguilar (aa@horizon.io) + * @notice A Solidity implementation for handling signatures in the Sequence protocol. + */ +library SequenceBaseSig { + using LibBytesPointer for bytes; + + uint256 internal constant FLAG_SIGNATURE = 0; + uint256 internal constant FLAG_ADDRESS = 1; + uint256 internal constant FLAG_DYNAMIC_SIGNATURE = 2; + uint256 internal constant FLAG_NODE = 3; + uint256 internal constant FLAG_BRANCH = 4; + uint256 internal constant FLAG_SUBDIGEST = 5; + uint256 internal constant FLAG_NESTED = 6; + + error InvalidNestedSignature(bytes32 _hash, address _addr, bytes _signature); + error InvalidSignatureFlag(uint256 _flag); + + /** + * @notice Generates a subdigest for the input digest (unique for this wallet and network). + * @param _digest The input digest to generate the subdigest from. + * @return bytes32 The subdigest generated from the input digest. + */ + function subdigest(bytes32 _digest) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", block.chainid, address(this), _digest)); + } + + /** + * @notice Generates the leaf for an address and weight. + * @dev The leaf is generated by concatenating the address and weight. + * + * @param _addr The address to generate the leaf for. + * @param _weight The weight to generate the leaf for. + * @return bytes32 The leaf generated from the address and weight. + */ + function _leafForAddressAndWeight(address _addr, uint96 _weight) internal pure returns (bytes32) { + unchecked { + return bytes32(uint256(_weight) << 160 | uint256(uint160(_addr))); + } + } + + /** + * @notice Generates the leaf for a hardcoded subdigest. + * @dev The leaf is generated by hashing 'Sequence static digest:\n' and the subdigest. + * @param _subdigest The subdigest to generate the leaf for. + * @return bytes32 The leaf generated from the hardcoded subdigest. + */ + function _leafForHardcodedSubdigest(bytes32 _subdigest) internal pure returns (bytes32) { + return keccak256(abi.encodePacked("Sequence static digest:\n", _subdigest)); + } + + /** + * @notice Generates the leaf for a nested tree node. + * @dev The leaf is generated by hashing 'Sequence nested config:\n', the node, the threshold and the weight. + * + * @param _node The root of the node to generate the leaf for. + * @param _threshold The internal threshold of the tree. + * @param _weight The external weight of the tree. + * @return bytes32 The leaf generated from the nested tree. + */ + function _leafForNested(bytes32 _node, uint256 _threshold, uint256 _weight) internal pure returns (bytes32) { + return keccak256(abi.encodePacked("Sequence nested config:\n", _node, _threshold, _weight)); + } + + /** + * @notice Returns the weight and root of a signature branch. + * @dev If the signature contains a hardcoded subdigest, and it matches the input digest, then the weight is set to 2 ** 256 - 1. + * + * @param _subdigest The digest to verify the signature against. + * @param _signature The signature branch to recover. + * @return weight The total weight of the recovered signatures. + * @return root The root hash of the recovered configuration. + */ + function recoverBranch(bytes32 _subdigest, bytes calldata _signature) + internal + view + returns (uint256 weight, bytes32 root) + { + unchecked { + uint256 rindex; + + // Iterate until the image is completed + while (rindex < _signature.length) { + // Read next item type + uint256 flag; + (flag, rindex) = _signature.readUint8(rindex); + + if (flag == FLAG_ADDRESS) { + // Read plain address + uint8 addrWeight; + address addr; + (addrWeight, addr, rindex) = _signature.readUint8Address(rindex); + + // Write weight and address to image + bytes32 node = _leafForAddressAndWeight(addr, addrWeight); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + if (flag == FLAG_SIGNATURE) { + // Read weight + uint8 addrWeight; + (addrWeight, rindex) = _signature.readUint8(rindex); + + // Read single signature and recover signer + uint256 nrindex = rindex + 66; + address addr = SignatureValidator.recoverSigner(_subdigest, _signature[rindex:nrindex]); + rindex = nrindex; + + // Acumulate total weight of the signature + weight += addrWeight; + + // Write weight and address to image + bytes32 node = _leafForAddressAndWeight(addr, addrWeight); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + if (flag == FLAG_DYNAMIC_SIGNATURE) { + // Read signer and weight + uint8 addrWeight; + address addr; + (addrWeight, addr, rindex) = _signature.readUint8Address(rindex); + + // Read signature size + uint256 size; + (size, rindex) = _signature.readUint24(rindex); + + // Read dynamic size signature + uint256 nrindex = rindex + size; + if (!SignatureValidator.isValidSignature(_subdigest, addr, _signature[rindex:nrindex])) { + revert InvalidNestedSignature(_subdigest, addr, _signature[rindex:nrindex]); + } + rindex = nrindex; + + // Acumulate total weight of the signature + weight += addrWeight; + + // Write weight and address to image + bytes32 node = _leafForAddressAndWeight(addr, addrWeight); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + if (flag == FLAG_NODE) { + // Read node hash + bytes32 node; + (node, rindex) = _signature.readBytes32(rindex); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + if (flag == FLAG_BRANCH) { + // Enter a branch of the signature merkle tree + uint256 size; + (size, rindex) = _signature.readUint24(rindex); + uint256 nrindex = rindex + size; + + uint256 nweight; + bytes32 node; + (nweight, node) = recoverBranch(_subdigest, _signature[rindex:nrindex]); + + weight += nweight; + root = LibOptim.fkeccak256(root, node); + + rindex = nrindex; + continue; + } + + if (flag == FLAG_NESTED) { + // Enter a branch of the signature merkle tree + // but with an internal threshold and an external fixed weight + uint256 externalWeight; + (externalWeight, rindex) = _signature.readUint8(rindex); + + uint256 internalThreshold; + (internalThreshold, rindex) = _signature.readUint16(rindex); + + uint256 size; + (size, rindex) = _signature.readUint24(rindex); + uint256 nrindex = rindex + size; + + uint256 internalWeight; + bytes32 internalRoot; + (internalWeight, internalRoot) = recoverBranch(_subdigest, _signature[rindex:nrindex]); + rindex = nrindex; + + if (internalWeight >= internalThreshold) { + weight += externalWeight; + } + + bytes32 node = _leafForNested(internalRoot, internalThreshold, externalWeight); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + + continue; + } + + if (flag == FLAG_SUBDIGEST) { + // A hardcoded always accepted digest + // it pushes the weight to the maximum + bytes32 hardcoded; + (hardcoded, rindex) = _signature.readBytes32(rindex); + if (hardcoded == _subdigest) { + weight = type(uint256).max; + } + + bytes32 node = _leafForHardcodedSubdigest(hardcoded); + root = root != bytes32(0) ? LibOptim.fkeccak256(root, node) : node; + continue; + } + + revert InvalidSignatureFlag(flag); + } + } + } + + /** + * @notice Returns the threshold, weight, root, and checkpoint of a signature. + * @dev To verify the signature, the weight must be greater than or equal to the threshold, and the root + * must match the expected `imageHash` of the wallet. + * + * @param _subdigest The digest to verify the signature against. + * @param _signature The signature to recover. + * @return threshold The minimum weight required for the signature to be valid. + * @return weight The total weight of the recovered signatures. + * @return imageHash The root hash of the recovered configuration + * @return checkpoint The checkpoint of the signature. + */ + function recover(bytes32 _subdigest, bytes calldata _signature) + internal + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, uint256 checkpoint) + { + unchecked { + (weight, imageHash) = recoverBranch(_subdigest, _signature[6:]); + + // Threshold & checkpoint are the top nodes + // (but they are first on the signature) + threshold = LibBytes.readFirstUint16(_signature); + checkpoint = LibBytes.readUint32(_signature, 2); + + imageHash = LibOptim.fkeccak256(imageHash, bytes32(threshold)); + imageHash = LibOptim.fkeccak256(imageHash, bytes32(checkpoint)); + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol new file mode 100644 index 000000000..cfa2486c8 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./SequenceBaseSig.sol"; + +import "../../interfaces/IModuleAuth.sol"; + +import "../../ModuleSelfAuth.sol"; +import "../../ModuleStorage.sol"; + +import "../../../../utils/LibBytesPointer.sol"; +import "../../../../utils/LibOptim.sol"; + +/** + * @title Sequence chained auth recovery submodule + * @author Agustin Aguilar (aa@horizon.io) + * @notice Defines Sequence signatures that work by delegating control to new configurations. + * @dev The delegations can be chained together, the first signature is the one that is used to validate + * the message, the last signature must match the current on-chain configuration of the wallet. + */ +abstract contract SequenceChainedSig is IModuleAuth, ModuleSelfAuth { + using LibBytesPointer for bytes; + + bytes32 public constant SET_IMAGE_HASH_TYPE_HASH = keccak256("SetImageHash(bytes32 imageHash)"); + + error LowWeightChainedSignature(bytes _signature, uint256 threshold, uint256 _weight); + error WrongChainedCheckpointOrder(uint256 _current, uint256 _prev); + + /** + * @notice Defined the special token that must be signed to delegate control to a new configuration. + * @param _imageHash The hash of the new configuration. + * @return bytes32 The message hash to be signed. + */ + function _hashSetImageHashStruct(bytes32 _imageHash) internal pure returns (bytes32) { + return LibOptim.fkeccak256(SET_IMAGE_HASH_TYPE_HASH, _imageHash); + } + + /** + * @notice Returns the threshold, weight, root, and checkpoint of a (chained) signature. + * + * @dev This method return the `threshold`, `weight` and `imageHash` of the last signature in the chain. + * Intermediate signatures are validated directly in this method. The `subdigest` is the one of the + * first signature in the chain (since that's the one that is used to validate the message). + * + * @param _digest The digest to recover the signature from. + * @param _signature The signature to recover. + * @return threshold The threshold of the (last) signature. + * @return weight The weight of the (last) signature. + * @return imageHash The image hash of the (last) signature. + * @return subdigest The subdigest of the (first) signature in the chain. + * @return checkpoint The checkpoint of the (last) signature. + */ + function chainedRecover(bytes32 _digest, bytes calldata _signature) + internal + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 checkpoint) + { + uint256 rindex = 1; + uint256 sigSize; + + // + // First signature out of the loop + // + + // First uint24 is the size of the signature + (sigSize, rindex) = _signature.readUint24(rindex); + uint256 nrindex = sigSize + rindex; + + (threshold, weight, imageHash, subdigest, checkpoint) = signatureRecovery(_digest, _signature[rindex:nrindex]); + + if (weight < threshold) { + revert LowWeightChainedSignature(_signature[rindex:nrindex], threshold, weight); + } + + rindex = nrindex; + + // The following signatures are handled by this loop. + // This is done this way because the first signature does not have a + // checkpoint to be validated against. + while (rindex < _signature.length) { + // First uint24 is the size of the signature + (sigSize, rindex) = _signature.readUint24(rindex); + nrindex = sigSize + rindex; + + uint256 nextCheckpoint; + + ( + threshold, + weight, + imageHash,, + // Do not change the subdigest; + // it should remain that of the first signature. + nextCheckpoint + ) = signatureRecovery(_hashSetImageHashStruct(imageHash), _signature[rindex:nrindex]); + + // Validate signature + if (weight < threshold) { + revert LowWeightChainedSignature(_signature[rindex:nrindex], threshold, weight); + } + + // Checkpoints must be provided in descending order + // since the first signature is the one that is used to validate the message + // and the last signature is the one that is used to validate the current configuration + if (nextCheckpoint >= checkpoint) { + revert WrongChainedCheckpointOrder(nextCheckpoint, checkpoint); + } + + checkpoint = nextCheckpoint; + rindex = nrindex; + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol new file mode 100644 index 000000000..a4704cac0 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./SequenceBaseSig.sol"; + +library SequenceDynamicSig { + /** + * @notice Recover a "dynamically encoded" Sequence signature. + * @dev The Signature is stripped of the first byte, which is the encoding flag. + * + * @param _subdigest The digest of the signature. + * @param _signature The Sequence signature. + * @return threshold The threshold weight required to validate the signature. + * @return weight The weight of the signature. + * @return imageHash The hash of the recovered configuration. + * @return checkpoint The checkpoint of the configuration. + */ + function recover(bytes32 _subdigest, bytes calldata _signature) + internal + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, uint256 checkpoint) + { + return SequenceBaseSig.recover(_subdigest, _signature[1:]); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol new file mode 100644 index 000000000..d8fd0a9dc --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +library SequenceNoChainIdSig { + /** + * @notice Computes a subdigest for a Sequence signature that works on all chains. + * @dev The subdigest is computed by removing the chain ID from the digest (using 0 instead). + * @param _digest The digest of the chain of signatures. + * @return bytes32 The subdigest with no chain ID. + */ + function subdigest(bytes32 _digest) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", uint256(0), address(this), _digest)); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol new file mode 100644 index 000000000..6ecee90e8 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +library SubModuleNonce { + // Nonce schema + // + // - space[160]:nonce[96] + // + uint256 internal constant NONCE_BITS = 96; + bytes32 internal constant NONCE_MASK = bytes32(uint256(type(uint96).max)); + + /** + * @notice Decodes a raw nonce + * @dev Schema: space[160]:type[96] + * @param _rawNonce Nonce to be decoded + * @return _space The nonce space of the raw nonce + * @return _nonce The nonce of the raw nonce + */ + function decodeNonce(uint256 _rawNonce) internal pure returns (uint256 _space, uint256 _nonce) { + unchecked { + // Decode nonce + _space = _rawNonce >> NONCE_BITS; + _nonce = uint256(bytes32(_rawNonce) & NONCE_MASK); + } + } + + function encodeNonce(uint256 _space, uint256 _nonce) internal pure returns (uint256) { + unchecked { + // Combine space and nonce + return (_space << NONCE_BITS) | _nonce; + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/utils/GasEstimator.sol b/packages/wallet/wallet-contracts/contracts/modules/utils/GasEstimator.sol new file mode 100644 index 000000000..fe1b1c5ef --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/utils/GasEstimator.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +contract GasEstimator { + function estimate(address _to, bytes calldata _data) + external + returns (bool success, bytes memory result, uint256 gas) + { + // solhint-disable + uint256 initialGas = gasleft(); + (success, result) = _to.call(_data); + gas = initialGas - gasleft(); + // solhint-enable + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/utils/MultiCallUtils.sol b/packages/wallet/wallet-contracts/contracts/modules/utils/MultiCallUtils.sol new file mode 100644 index 000000000..7ad33e6c7 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/utils/MultiCallUtils.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../commons/interfaces/IModuleCalls.sol"; + +contract MultiCallUtils { + // Errors + error DelegateCallNotAllowed(uint256 _index); + error CallReverted(uint256 _index, bytes _result); + + function multiCall(IModuleCalls.Transaction[] memory _txs) + public + payable + returns (bool[] memory _successes, bytes[] memory _results) + { + _successes = new bool[](_txs.length); + _results = new bytes[](_txs.length); + + for (uint256 i = 0; i < _txs.length; i++) { + IModuleCalls.Transaction memory transaction = _txs[i]; + + if (transaction.delegateCall) revert DelegateCallNotAllowed(i); + if (gasleft() < transaction.gasLimit) revert IModuleCalls.NotEnoughGas(i, transaction.gasLimit, gasleft()); + + // solhint-disable + (_successes[i], _results[i]) = transaction.target + .call{ + value: transaction.value, gas: transaction.gasLimit == 0 ? gasleft() : transaction.gasLimit + }(transaction.data); + // solhint-enable + + if (!_successes[i] && _txs[i].revertOnError) revert CallReverted(i, _results[i]); + } + } + + // /// + // Globals + // /// + + function callBlockhash(uint256 _i) external view returns (bytes32) { + return blockhash(_i); + } + + function callCoinbase() external view returns (address) { + return block.coinbase; + } + + function callDifficulty() external view returns (uint256) { + return block.prevrandao; // old block.difficulty + } + + function callPrevrandao() external view returns (uint256) { + return block.prevrandao; + } + + function callGasLimit() external view returns (uint256) { + return block.gaslimit; + } + + function callBlockNumber() external view returns (uint256) { + return block.number; + } + + function callTimestamp() external view returns (uint256) { + return block.timestamp; + } + + function callGasLeft() external view returns (uint256) { + return gasleft(); + } + + function callGasPrice() external view returns (uint256) { + return tx.gasprice; + } + + function callOrigin() external view returns (address) { + return tx.origin; + } + + function callBalanceOf(address _addr) external view returns (uint256) { + return _addr.balance; + } + + function callCodeSize(address _addr) external view returns (uint256 size) { + assembly { size := extcodesize(_addr) } + } + + function callCode(address _addr) external view returns (bytes memory code) { + assembly { + let size := extcodesize(_addr) + code := mload(0x40) + mstore(0x40, add(code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) + mstore(code, size) + extcodecopy(_addr, add(code, 0x20), 0, size) + } + } + + function callCodeHash(address _addr) external view returns (bytes32 codeHash) { + assembly { codeHash := extcodehash(_addr) } + } + + function callChainId() external view returns (uint256 id) { + assembly { id := chainid() } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/utils/RequireUtils.sol b/packages/wallet/wallet-contracts/contracts/modules/utils/RequireUtils.sol new file mode 100644 index 000000000..e89f77321 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/utils/RequireUtils.sol @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../commons/ModuleNonce.sol"; +import "../commons/submodules/nonce/SubModuleNonce.sol"; + +import "../../interfaces/tokens/IERC20.sol"; +import "../../interfaces/tokens/IERC721.sol"; +import "../../interfaces/tokens/IERC1155.sol"; + +contract RequireUtils { + /** + * @notice Validates that a given expiration hasn't expired + * @dev Used as an optional transaction on a Sequence batch, to create expirable transactions. + * + * @param _expiration Expiration to check + */ + function requireNonExpired(uint256 _expiration) external view { + require(block.timestamp < _expiration, "RequireUtils#requireNonExpired: EXPIRED"); + } + + /** + * @notice Validates that a given wallet has reached a given nonce + * @dev Used as an optional transaction on a Sequence batch, to define transaction execution order + * + * @param _wallet Sequence wallet + * @param _nonce Required nonce + */ + function requireMinNonce(address _wallet, uint256 _nonce) external view { + (uint256 space, uint256 nonce) = SubModuleNonce.decodeNonce(_nonce); + uint256 currentNonce = ModuleNonce(_wallet).readNonce(space); + require(currentNonce >= nonce, "RequireUtils#requireMinNonce: NONCE_BELOW_REQUIRED"); + } + + /** + * @notice Validates that a wallet has a minimum ERC20 token balance + * @param _token ERC20 token address + * @param _wallet Sequence wallet + * @param _minBalance Minimum required balance + */ + function requireMinERC20Balance(address _token, address _wallet, uint256 _minBalance) external view { + uint256 balance = IERC20(_token).balanceOf(_wallet); + require(balance >= _minBalance, "RequireUtils#requireMinERC20Balance: BALANCE_TOO_LOW"); + } + + /** + * @notice Validates that a wallet has a minimum ERC20 allowance for a spender + * @param _token ERC20 token address + * @param _owner Sequence wallet + * @param _spender Address allowed to spend the tokens + * @param _minAllowance Minimum required allowance + */ + function requireMinERC20Allowance(address _token, address _owner, address _spender, uint256 _minAllowance) + external + view + { + uint256 allowance = IERC20(_token).allowance(_owner, _spender); + require(allowance >= _minAllowance, "RequireUtils#requireMinERC20Allowance: ALLOWANCE_TOO_LOW"); + } + + /** + * @notice Validates that a wallet owns a specific ERC721 token + * @param _token ERC721 token address + * @param _wallet Sequence wallet + * @param _tokenId Token ID to check for ownership + */ + function requireERC721Ownership(address _token, address _wallet, uint256 _tokenId) external view { + address owner = IERC721(_token).ownerOf(_tokenId); + require(owner == _wallet, "RequireUtils#requireERC721Ownership: NOT_OWNER"); + } + + /** + * @notice Validates that an ERC721 token is approved for a specific spender + * @param _token ERC721 token address + * @param _owner Sequence wallet + * @param _spender Address that should have approval + * @param _tokenId Token ID to check for approval + */ + function requireERC721Approval(address _token, address _owner, address _spender, uint256 _tokenId) external view { + address approved = IERC721(_token).getApproved(_tokenId); + require( + approved == _spender || IERC721(_token).isApprovedForAll(_owner, _spender), + "RequireUtils#requireERC721Approval: NOT_APPROVED" + ); + } + + /** + * @notice Validates that a wallet has a minimum balance of an ERC1155 token + * @param _token ERC1155 token address + * @param _wallet Sequence wallet + * @param _tokenId Token ID to check + * @param _minBalance Minimum required balance + */ + function requireMinERC1155Balance(address _token, address _wallet, uint256 _tokenId, uint256 _minBalance) + external + view + { + uint256 balance = IERC1155(_token).balanceOf(_wallet, _tokenId); + require(balance >= _minBalance, "RequireUtils#requireMinERC1155Balance: BALANCE_TOO_LOW"); + } + + /** + * @notice Validates that an ERC1155 token is approved for a specific operator + * @param _token ERC1155 token address + * @param _owner Sequence wallet + * @param _operator Address that should have operator approval + */ + function requireERC1155Approval(address _token, address _owner, address _operator) external view { + bool isApproved = IERC1155(_token).isApprovedForAll(_owner, _operator); + require(isApproved, "RequireUtils#requireERC1155Approval: NOT_APPROVED"); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/modules/utils/SequenceUtils.sol b/packages/wallet/wallet-contracts/contracts/modules/utils/SequenceUtils.sol new file mode 100644 index 000000000..6e9f294fa --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/modules/utils/SequenceUtils.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./MultiCallUtils.sol"; +import "./RequireUtils.sol"; + +contract SequenceUtils is MultiCallUtils, RequireUtils {} diff --git a/packages/wallet/wallet-contracts/contracts/trust/Trust.sol b/packages/wallet/wallet-contracts/contracts/trust/Trust.sol new file mode 100644 index 000000000..3bdfc359a --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/trust/Trust.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../interfaces/IERC1271Wallet.sol"; +import "../utils/SignatureValidator.sol"; + +function absDiff(uint256 a, uint256 b) pure returns (bool, uint256) { + if (a > b) { + return (true, a - b); + } + + return (false, b - a); +} + +contract Trust is IERC1271Wallet { + error UnlockInThePast(uint256 _unlocksAt, uint256 _elapsed); + error UnlockTooEarly(uint256 _unlocksAt, uint256 _diff); + + error NotOwner(address _sender); + error NotUnlocked(uint256 _unlocksAt); + error FailedTransaction(address payable _to, uint256 _value, bytes _data, bytes _result); + + error EmptySignature(); + error InvalidSignatureFlag(bytes _signature, bytes1 _flag); + error InvalidSignature(bytes32 _hash, bytes32 _rehash, address _signer, bytes _signature); + + event SetUnlocksAt(uint256 _unlocksAt); + event SentTransaction(address payable _to, uint256 _value, bytes _data, bytes _result); + + address public immutable owner; + address public immutable beneficiary; + uint256 public immutable duration; + + uint256 public unlocksAt = type(uint256).max; + + constructor(address _owner, address _beneficiary, uint256 _duration) { + owner = _owner; + beneficiary = _beneficiary; + duration = _duration; + } + + modifier onlyAllowed() { + if (msg.sender != owner) { + if (msg.sender != beneficiary) { + revert NotOwner(msg.sender); + } + + if (isLocked()) { + revert NotUnlocked(unlocksAt); + } + } + + _; + } + + modifier onlyMember() { + if (msg.sender != owner && msg.sender != beneficiary) { + revert NotOwner(msg.sender); + } + + _; + } + + function isLocked() public view returns (bool) { + return block.timestamp < unlocksAt; + } + + function setUnlocksAt(uint256 _unlocksAt) external onlyMember { + // Diff between the current time and the unlock time must be + // greater than the duration of the trust + (bool isPast, uint256 elapsed) = absDiff(block.timestamp, _unlocksAt); + if (isPast) { + revert UnlockInThePast(_unlocksAt, elapsed); + } + + if (elapsed < duration) { + revert UnlockTooEarly(_unlocksAt, elapsed); + } + + emit SetUnlocksAt(_unlocksAt); + unlocksAt = _unlocksAt; + } + + function sendTransaction(address payable _to, uint256 _value, bytes calldata _data) + external + onlyAllowed + returns (bytes memory) + { + (bool success, bytes memory result) = _to.call{value: _value}(_data); + + if (!success) { + revert FailedTransaction(_to, _value, _data, result); + } + + emit SentTransaction(_to, _value, _data, result); + return result; + } + + bytes4 internal constant SELECTOR_ERC1271_BYTES_BYTES = 0x20c13b0b; + bytes4 internal constant SELECTOR_ERC1271_BYTES32_BYTES = 0x1626ba7e; + + function isValidSignature(bytes calldata _data, bytes calldata _signature) external view returns (bytes4) { + bytes4 res = Trust(payable(address((this)))).isValidSignature(keccak256(_data), _signature); + + assert(res == SELECTOR_ERC1271_BYTES32_BYTES); + return SELECTOR_ERC1271_BYTES_BYTES; + } + + function isValidSignature(bytes32 _hash, bytes calldata _signature) external view returns (bytes4) { + if (_signature.length == 0) { + revert EmptySignature(); + } + + // The last byte determines how the signature is going to be interpreted + // 0x00 -> Signed by the owner + // 0x01 -> Signed by the beneficiary + // 0x02 -> Signed by the owner for any network + // 0x03 -> Signed by the beneficiary for any network + address signer; + uint256 chainId; + + { + bytes1 flag = _signature[_signature.length - 1]; + + if (flag == 0x00) { + signer = owner; + chainId = block.chainid; + } else if (flag == 0x01) { + signer = beneficiary; + chainId = block.chainid; + } else if (flag == 0x02) { + signer = owner; + chainId = 0; + } else if (flag == 0x03) { + signer = beneficiary; + chainId = 0; + } else { + revert InvalidSignatureFlag(_signature, flag); + } + } + + if (signer != owner && isLocked()) { + revert NotUnlocked(unlocksAt); + } + + // Re-hash the hash adding the address of the trust + // otherwise the signature will be valid for any trust + bytes32 rehash = keccak256(abi.encode(address(this), _hash, chainId)); + + // Validate the signature + if (!SignatureValidator.isValidSignature(rehash, signer, _signature[0:_signature.length - 1])) { + revert InvalidSignature(_hash, rehash, signer, _signature[0:_signature.length - 1]); + } + + return SELECTOR_ERC1271_BYTES32_BYTES; + } + + receive() external payable {} + fallback() external payable {} +} diff --git a/packages/wallet/wallet-contracts/contracts/trust/TrustFactory.sol b/packages/wallet/wallet-contracts/contracts/trust/TrustFactory.sol new file mode 100644 index 000000000..1dd900efc --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/trust/TrustFactory.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "./Trust.sol"; + +contract TrustFactory { + function trustCreationCode() external pure returns (bytes memory) { + return type(Trust).creationCode; + } + + function addressOf(address _owner, address _beneficiary, uint256 _duration) external view returns (address) { + return address( + uint160( + uint256( + keccak256( + abi.encodePacked( + bytes1(0xff), + address(this), + bytes32(0), + keccak256( + abi.encodePacked(type(Trust).creationCode, abi.encode(_owner, _beneficiary, _duration)) + ) + ) + ) + ) + ) + ); + } + + function deploy(address _owner, address _beneficiary, uint256 _duration) external returns (Trust) { + return new Trust{salt: bytes32(0)}(_owner, _beneficiary, _duration); + } +} diff --git a/packages/wallet/wallet-contracts/contracts/utils/LibAddress.sol b/packages/wallet/wallet-contracts/contracts/utils/LibAddress.sol new file mode 100644 index 000000000..9095dc64a --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/utils/LibAddress.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +library LibAddress { + /** + * @notice Will return true if provided address is a contract + * @param account Address to verify if contract or not + * @dev This contract will return false if called within the constructor of + * a contract's deployment, as the code is not yet stored on-chain. + */ + function isContract(address account) internal view returns (bool) { + uint256 csize; + // solhint-disable-next-line no-inline-assembly + assembly { csize := extcodesize(account) } + return csize != 0; + } +} diff --git a/packages/wallet/wallet-contracts/contracts/utils/LibBytes.sol b/packages/wallet/wallet-contracts/contracts/utils/LibBytes.sol new file mode 100644 index 000000000..20860e754 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/utils/LibBytes.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +/** + * @title Library for reading data from bytes arrays + * @author Agustin Aguilar (aa@horizon.io) + * @notice This library contains functions for reading data from bytes arrays. + * + * @dev These functions do not check if the input index is within the bounds of the data array. + * Reading out of bounds may return dirty values. + */ +library LibBytes { + /** + * @notice Returns the bytes32 value at the given index in the input data. + * @param data The input data. + * @param index The index of the value to retrieve. + * @return a The bytes32 value at the given index. + */ + function readBytes32(bytes calldata data, uint256 index) internal pure returns (bytes32 a) { + assembly { + a := calldataload(add(data.offset, index)) + } + } + + /** + * @notice Returns the uint8 value at the given index in the input data. + * @param data The input data. + * @param index The index of the value to retrieve. + * @return a The uint8 value at the given index. + */ + function readUint8(bytes calldata data, uint256 index) internal pure returns (uint8 a) { + assembly { + let word := calldataload(add(index, data.offset)) + a := shr(248, word) + } + } + + /** + * @notice Returns the first uint16 value in the input data. + * @param data The input data. + * @return a The first uint16 value in the input data. + */ + function readFirstUint16(bytes calldata data) internal pure returns (uint16 a) { + assembly { + let word := calldataload(data.offset) + a := shr(240, word) + } + } + + /** + * @notice Returns the uint32 value at the given index in the input data. + * @param data The input data. + * @param index The index of the value to retrieve. + * @return a The uint32 value at the given index. + */ + function readUint32(bytes calldata data, uint256 index) internal pure returns (uint32 a) { + assembly { + let word := calldataload(add(index, data.offset)) + a := shr(224, word) + } + } + + function readMBytes4(bytes memory data, uint256 index) internal pure returns (bytes4 a) { + assembly { + let word := mload(add(add(data, 0x20), index)) + a := and(word, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000) + } + } + + function readMBytes32(bytes memory data, uint256 index) internal pure returns (bytes32 a) { + assembly { + a := mload(add(add(data, 0x20), index)) + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/utils/LibBytesPointer.sol b/packages/wallet/wallet-contracts/contracts/utils/LibBytesPointer.sol new file mode 100644 index 000000000..021f9b249 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/utils/LibBytesPointer.sol @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +/** + * @title Library for reading data from bytes arrays with a pointer + * @author Agustin Aguilar (aa@horizon.io) + * @notice This library contains functions for reading data from bytes arrays with a pointer. + * + * @dev These functions do not check if the input index is within the bounds of the data array. + * Reading out of bounds may return dirty values. + */ +library LibBytesPointer { + /** + * @dev Returns the first uint16 value in the input data and updates the pointer. + * @param _data The input data. + * @return a The first uint16 value. + * @return newPointer The new pointer. + */ + function readFirstUint16(bytes calldata _data) internal pure returns (uint16 a, uint256 newPointer) { + assembly { + let word := calldataload(_data.offset) + a := shr(240, word) + newPointer := 2 + } + } + + /** + * @notice Returns the uint8 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint8 value at the given index. + * @return newPointer The new pointer. + */ + function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := shr(248, word) + newPointer := add(_index, 1) + } + } + + function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := and(shr(96, word), 0xffffffffffffffffffffffffffffffffffffffff) + newPointer := add(_index, 20) + } + } + + /** + * @notice Returns the uint8 value and the address at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint8 value at the given index. + * @return b The following address value. + * @return newPointer The new pointer. + */ + function readUint8Address(bytes calldata _data, uint256 _index) + internal + pure + returns (uint8 a, address b, uint256 newPointer) + { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := shr(248, word) + b := and(shr(88, word), 0xffffffffffffffffffffffffffffffffffffffff) + newPointer := add(_index, 21) + } + } + + /** + * @notice Returns the uint16 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint16 value at the given index. + * @return newPointer The new pointer. + */ + function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := and(shr(240, word), 0xffff) + newPointer := add(_index, 2) + } + } + + function readUintX(bytes calldata _data, uint256 _bytes, uint256 _index) + internal + pure + returns (uint256 a, uint256 newPointer) + { + assembly { + let word := calldataload(add(_index, _data.offset)) + let shift := sub(256, mul(_bytes, 8)) + a := and(shr(shift, word), sub(shl(mul(8, _bytes), 1), 1)) + newPointer := add(_index, _bytes) + } + } + + /** + * @notice Returns the uint24 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint24 value at the given index. + * @return newPointer The new pointer. + */ + function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := and(shr(232, word), 0xffffff) + newPointer := add(_index, 3) + } + } + + /** + * @notice Returns the uint64 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _index The index of the value to retrieve. + * @return a The uint64 value at the given index. + * @return newPointer The new pointer. + */ + function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer) { + assembly { + let word := calldataload(add(_index, _data.offset)) + a := and(shr(192, word), 0xffffffffffffffff) + newPointer := add(_index, 8) + } + } + + function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer) { + assembly { + a := calldataload(add(_pointer, _data.offset)) + a := and(a, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000) + newPointer := add(_pointer, 4) + } + } + + /** + * @notice Returns the bytes32 value at the given index in the input data and updates the pointer. + * @param _data The input data. + * @param _pointer The index of the value to retrieve. + * @return a The bytes32 value at the given index. + * @return newPointer The new pointer. + */ + function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer) { + assembly { + a := calldataload(add(_pointer, _data.offset)) + newPointer := add(_pointer, 32) + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/utils/LibOptim.sol b/packages/wallet/wallet-contracts/contracts/utils/LibOptim.sol new file mode 100644 index 000000000..1a8674083 --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/utils/LibOptim.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +/** + * @title Library for optimized EVM operations + * @author Agustin Aguilar (aa@horizon.io) + * @notice This library contains functions for optimizing certain EVM operations. + */ +library LibOptim { + /** + * @notice Computes the keccak256 hash of two 32-byte inputs. + * @dev It uses only scratch memory space. + * @param _a The first 32 bytes of the hash. + * @param _b The second 32 bytes of the hash. + * @return c The keccak256 hash of the two 32-byte inputs. + */ + function fkeccak256(bytes32 _a, bytes32 _b) internal pure returns (bytes32 c) { + assembly { + mstore(0, _a) + mstore(32, _b) + c := keccak256(0, 64) + } + } + + /** + * @notice Returns the return data from the last call. + * @return r The return data from the last call. + */ + function returnData() internal pure returns (bytes memory r) { + assembly { + let size := returndatasize() + r := mload(0x40) + let start := add(r, 32) + mstore(0x40, add(start, size)) + mstore(r, size) + returndatacopy(start, 0, size) + } + } + + /** + * @notice Calls another contract with the given parameters. + * @dev This method doesn't increase the memory pointer. + * @param _to The address of the contract to call. + * @param _val The value to send to the contract. + * @param _gas The amount of gas to provide for the call. + * @param _data The data to send to the contract. + * @return r The success status of the call. + */ + function call(address _to, uint256 _val, uint256 _gas, bytes calldata _data) internal returns (bool r) { + assembly { + let tmp := mload(0x40) + calldatacopy(tmp, _data.offset, _data.length) + + r := call(_gas, _to, _val, tmp, _data.length, 0, 0) + } + } + + /** + * @notice Calls another contract with the given parameters, using delegatecall. + * @dev This method doesn't increase the memory pointer. + * @param _to The address of the contract to call. + * @param _gas The amount of gas to provide for the call. + * @param _data The data to send to the contract. + * @return r The success status of the call. + */ + function delegatecall(address _to, uint256 _gas, bytes calldata _data) internal returns (bool r) { + assembly { + let tmp := mload(0x40) + calldatacopy(tmp, _data.offset, _data.length) + + r := delegatecall(_gas, _to, tmp, _data.length, 0, 0) + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/utils/LibString.sol b/packages/wallet/wallet-contracts/contracts/utils/LibString.sol new file mode 100644 index 000000000..be352c5ad --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/utils/LibString.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +/** + * @title Library for string manipulation operations + * @notice This library contains functions for manipulating strings in Solidity. + */ +library LibString { + bytes private constant ALPHABET_HEX_16 = "0123456789abcdef"; + bytes private constant ALPHABET_32 = "abcdefghijklmnopqrstuvwxyz234567"; + + /** + * @notice Prefixes a hexadecimal string with "0x". + * @param _hex The hexadecimal string to prefix. + * @return The prefixed hexadecimal string. + */ + function prefixHexadecimal(string memory _hex) internal pure returns (string memory) { + return string(abi.encodePacked("0x", _hex)); + } + + /** + * @notice Prefixes a base32 string with "b". + * @param _base32 The base32 string to prefix. + * @return The prefixed base32 string. + */ + function prefixBase32(string memory _base32) internal pure returns (string memory) { + return string(abi.encodePacked("b", _base32)); + } + + /** + * @notice Converts a byte array to a hexadecimal string. + * @param _bytes The byte array to convert. + * @return The resulting hexadecimal string. + */ + function bytesToHexadecimal(bytes memory _bytes) internal pure returns (string memory) { + uint256 bytesLength = _bytes.length; + bytes memory bytesArray = new bytes(bytesLength << 1); + + unchecked { + for (uint256 i = 0; i < bytesLength; i++) { + uint256 word = uint8(_bytes[i]); + uint256 ib = i << 1; + bytesArray[ib] = bytes1(ALPHABET_HEX_16[word >> 4]); + bytesArray[ib + 1] = bytes1(ALPHABET_HEX_16[word & 0xf]); + } + } + + return string(bytesArray); + } + + /** + * @notice Converts a byte array to a base32 string. + * @param _bytes The byte array to convert. + * @return The resulting base32 string. + */ + function bytesToBase32(bytes memory _bytes) internal pure returns (string memory) { + uint256 bytesLength = _bytes.length; + + uint256 t1 = bytesLength << 3; + + unchecked { + // base32-encoded length = ceil(# of bits / 5) + bytes memory bytesArray = new bytes((t1 + 4) / 5); + + uint256 bits = 0; + uint256 buffer = 0; + uint256 pointer = 0; + + for (uint256 i = 0; i < bytesLength; i++) { + buffer = (buffer << 8) | uint8(_bytes[i]); + bits += 8; + + while (bits >= 5) { + bits -= 5; + bytesArray[pointer] = bytes1(ALPHABET_32[(buffer >> bits) & 0x1f]); + pointer++; + } + } + + if (bits > 0) { + bytesArray[pointer] = bytes1(ALPHABET_32[(buffer << (5 - bits)) & 0x1f]); + } + + return string(bytesArray); + } + } +} diff --git a/packages/wallet/wallet-contracts/contracts/utils/SignatureValidator.sol b/packages/wallet/wallet-contracts/contracts/utils/SignatureValidator.sol new file mode 100644 index 000000000..5af4e5bac --- /dev/null +++ b/packages/wallet/wallet-contracts/contracts/utils/SignatureValidator.sol @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "../interfaces/IERC1271Wallet.sol"; + +import "./LibBytes.sol"; + +/** + * @dev Contains logic for signature validation. + * Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md) + * Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/ + */ +library SignatureValidator { + // Errors + error InvalidSignatureLength(bytes _signature); + error EmptySignature(); + error InvalidSValue(bytes _signature, bytes32 _s); + error InvalidVValue(bytes _signature, uint256 _v); + error UnsupportedSignatureType(bytes _signature, uint256 _type, bool _recoverMode); + error SignerIsAddress0(bytes _signature); + + using LibBytes for bytes; + + /***********************************| + | Variables | + |__________________________________*/ + + // bytes4(keccak256("isValidSignature(bytes,bytes)")) + bytes4 internal constant ERC1271_MAGICVALUE = 0x20c13b0b; + + // bytes4(keccak256("isValidSignature(bytes32,bytes)")) + bytes4 internal constant ERC1271_MAGICVALUE_BYTES32 = 0x1626ba7e; + + // Allowed signature types. + uint256 private constant SIG_TYPE_EIP712 = 1; + uint256 private constant SIG_TYPE_ETH_SIGN = 2; + uint256 private constant SIG_TYPE_WALLET_BYTES32 = 3; + + /***********************************| + | Signature Functions | + |__________________________________*/ + + /** + * @notice Recover the signer of hash, assuming it's an EOA account + * @dev Only for SignatureType.EIP712 and SignatureType.EthSign signatures + * @param _hash Hash that was signed + * encoded as (bytes32 r, bytes32 s, uint8 v, ... , SignatureType sigType) + */ + function recoverSigner(bytes32 _hash, bytes calldata _signature) internal pure returns (address signer) { + if (_signature.length != 66) revert InvalidSignatureLength(_signature); + uint256 signatureType = _signature.readUint8(_signature.length - 1); + + // Variables are not scoped in Solidity. + uint8 v = _signature.readUint8(64); + bytes32 r = _signature.readBytes32(0); + bytes32 s = _signature.readBytes32(32); + + // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature + // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines + // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most + // signatures from current libraries generate a unique signature with an s-value in the lower half order. + // + // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value + // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or + // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept + // these malleable signatures as well. + // + // Source OpenZeppelin + // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol + + if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { + revert InvalidSValue(_signature, s); + } + + if (v != 27 && v != 28) { + revert InvalidVValue(_signature, v); + } + + // Signature using EIP712 + if (signatureType == SIG_TYPE_EIP712) { + signer = ecrecover(_hash, v, r, s); + + // Signed using web3.eth_sign() or Ethers wallet.signMessage() + } else if (signatureType == SIG_TYPE_ETH_SIGN) { + signer = ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)), v, r, s); + } else { + // We cannot recover the signer for any other signature type. + revert UnsupportedSignatureType(_signature, signatureType, true); + } + + // Prevent signer from being 0x0 + if (signer == address(0x0)) revert SignerIsAddress0(_signature); + + return signer; + } + + /** + * @notice Returns true if the provided signature is valid for the given signer. + * @dev Supports SignatureType.EIP712, SignatureType.EthSign, and ERC1271 signatures + * @param _hash Hash that was signed + * @param _signer Address of the signer candidate + * @param _signature Signature byte array + */ + function isValidSignature(bytes32 _hash, address _signer, bytes calldata _signature) + internal + view + returns (bool valid) + { + if (_signature.length == 0) { + revert EmptySignature(); + } + + uint256 signatureType = uint8(_signature[_signature.length - 1]); + if (signatureType == SIG_TYPE_EIP712 || signatureType == SIG_TYPE_ETH_SIGN) { + // Recover signer and compare with provided + valid = recoverSigner(_hash, _signature) == _signer; + } else if (signatureType == SIG_TYPE_WALLET_BYTES32) { + // Remove signature type before calling ERC1271, restore after call + valid = ERC1271_MAGICVALUE_BYTES32 + == IERC1271Wallet(_signer).isValidSignature(_hash, _signature[0:_signature.length - 1]); + } else { + // We cannot validate any other signature type. + // We revert because we can say nothing about its validity. + revert UnsupportedSignatureType(_signature, signatureType, false); + } + } +} diff --git a/packages/wallet/wallet-contracts/docs/book.css b/packages/wallet/wallet-contracts/docs/book.css new file mode 100644 index 000000000..b5ce903f9 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/book.css @@ -0,0 +1,13 @@ +table { + margin: 0 auto; + border-collapse: collapse; + width: 100%; +} + +table td:first-child { + width: 15%; +} + +table td:nth-child(2) { + width: 25%; +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/docs/book.toml b/packages/wallet/wallet-contracts/docs/book.toml new file mode 100644 index 000000000..22d0b1db7 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/book.toml @@ -0,0 +1,13 @@ +[book] +src = "src" +title = "" + +[output.html] +no-section-label = true +additional-js = ["solidity.min.js"] +additional-css = ["book.css"] +mathjax-support = true +git-repository-url = "https://github.com/0xsequence/wallet-contracts" + +[output.html.fold] +enable = true diff --git a/packages/wallet/wallet-contracts/docs/solidity.min.js b/packages/wallet/wallet-contracts/docs/solidity.min.js new file mode 100644 index 000000000..192493291 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/solidity.min.js @@ -0,0 +1,74 @@ +hljs.registerLanguage("solidity",(()=>{"use strict";function e(){try{return!0 +}catch(e){return!1}} +var a=/-?(\b0[xX]([a-fA-F0-9]_?)*[a-fA-F0-9]|(\b[1-9](_?\d)*(\.((\d_?)*\d)?)?|\.\d(_?\d)*)([eE][-+]?\d(_?\d)*)?|\b0)(?!\w|\$)/ +;e()&&(a=a.source.replace(/\\b/g,"(?{ +var a=r(e),o=l(e),c=/[A-Za-z_$][A-Za-z_$0-9.]*/,d=e.inherit(e.TITLE_MODE,{ +begin:/[A-Za-z$_][0-9A-Za-z$_]*/,lexemes:c,keywords:n}),u={className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,lexemes:c,keywords:n, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,o,s]},_={ +className:"operator",begin:/:=|->/};return{keywords:n,lexemes:c, +contains:[a,o,i,t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,_,{ +className:"function",lexemes:c,beginKeywords:"function",end:"{",excludeEnd:!0, +contains:[d,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,_]}]}}, +solAposStringMode:r,solQuoteStringMode:l,HEX_APOS_STRING_MODE:i, +HEX_QUOTE_STRING_MODE:t,SOL_NUMBER:s,isNegativeLookbehindAvailable:e} +;const{baseAssembly:c,solAposStringMode:d,solQuoteStringMode:u,HEX_APOS_STRING_MODE:_,HEX_QUOTE_STRING_MODE:m,SOL_NUMBER:b,isNegativeLookbehindAvailable:E}=o +;return e=>{for(var a=d(e),s=u(e),n=[],i=0;i<32;i++)n[i]=i+1 +;var t=n.map((e=>8*e)),r=[];for(i=0;i<=80;i++)r[i]=i +;var l=n.map((e=>"bytes"+e)).join(" ")+" ",o=t.map((e=>"uint"+e)).join(" ")+" ",g=t.map((e=>"int"+e)).join(" ")+" ",M=[].concat.apply([],t.map((e=>r.map((a=>e+"x"+a))))),p={ +keyword:"var bool string int uint "+g+o+"byte bytes "+l+"fixed ufixed "+M.map((e=>"fixed"+e)).join(" ")+" "+M.map((e=>"ufixed"+e)).join(" ")+" enum struct mapping address new delete if else for while continue break return throw emit try catch revert unchecked _ function modifier event constructor fallback receive error virtual override constant immutable anonymous indexed storage memory calldata external public internal payable pure view private returns import from as using pragma contract interface library is abstract type assembly", +literal:"true false wei gwei szabo finney ether seconds minutes hours days weeks years", +built_in:"self this super selfdestruct suicide now msg block tx abi blockhash gasleft assert require Error Panic sha3 sha256 keccak256 ripemd160 ecrecover addmod mulmod log0 log1 log2 log3 log4" +},O={className:"operator",begin:/[+\-!~*\/%<>&^|=]/ +},C=/[A-Za-z_$][A-Za-z_$0-9]*/,N={className:"params",begin:/\(/,end:/\)/, +excludeBegin:!0,excludeEnd:!0,lexemes:C,keywords:p, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,s,b,"self"]},f={ +begin:/\.\s*/,end:/[^A-Za-z0-9$_\.]/,excludeBegin:!0,excludeEnd:!0,keywords:{ +built_in:"gas value selector address length push pop send transfer call callcode delegatecall staticcall balance code codehash wrap unwrap name creationCode runtimeCode interfaceId min max" +},relevance:2},y=e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/, +lexemes:C,keywords:p}),w={className:"built_in", +begin:(E()?"(? 0x18 0x5b 0x5b JUMPDEST 0 rds +0x19 0xf3 0xf3 RETURN +flat deployed code: 0x363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3 +deploy function: +0x00 0x60 0x3a 0x603a PUSH1 0x3a +0x02 0x60 0x0e 0x600e PUSH1 0x0e 0x3a +0x04 0x3d 0x3d RETURNDATASIZE 0 0x0e 0x3a +0x05 0x39 0x39 CODECOPY +0x06 0x60 0x1a 0x601a PUSH1 0x1a +0x08 0x80 0x80 DUP1 0x1a 0x1a +0x09 0x51 0x51 MLOAD imp 0x1a +0x0A 0x30 0x30 ADDRESS addr imp 0x1a +0x0B 0x55 0x55 SSTORE 0x1a +0x0C 0x3d 0x3d RETURNDATASIZE 0 0x1a +0x0D 0xf3 0xf3 RETURN +[...deployed code] +flat deploy function: 0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3 + + +## State Variables +### creationCode + +```solidity +bytes internal constant creationCode = + hex"603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3" +``` + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/hooks/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/hooks/README.md new file mode 100644 index 000000000..388d4a0a5 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/hooks/README.md @@ -0,0 +1,5 @@ + + +# Contents +- [interfaces](/contracts/hooks/interfaces) +- [WalletProxyHook](WalletProxyHook.sol/contract.WalletProxyHook.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/hooks/WalletProxyHook.sol/contract.WalletProxyHook.md b/packages/wallet/wallet-contracts/docs/src/contracts/hooks/WalletProxyHook.sol/contract.WalletProxyHook.md new file mode 100644 index 000000000..070736509 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/hooks/WalletProxyHook.sol/contract.WalletProxyHook.md @@ -0,0 +1,15 @@ +# WalletProxyHook +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/hooks/WalletProxyHook.sol) + +**Inherits:** +[IWalletProxy](/home/dargon789/wallet-contracts/docs/src/contracts/hooks/interfaces/IWalletProxy.sol/interface.IWalletProxy.md), [Implementation](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/Implementation.sol/contract.Implementation.md) + + +## Functions +### PROXY_getImplementation + + +```solidity +function PROXY_getImplementation() public view returns (address); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/hooks/interfaces/IWalletProxy.sol/interface.IWalletProxy.md b/packages/wallet/wallet-contracts/docs/src/contracts/hooks/interfaces/IWalletProxy.sol/interface.IWalletProxy.md new file mode 100644 index 000000000..46775f431 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/hooks/interfaces/IWalletProxy.sol/interface.IWalletProxy.md @@ -0,0 +1,14 @@ +# IWalletProxy +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/hooks/interfaces/IWalletProxy.sol) + +Interface for Passport Wallet's proxy contract. + + +## Functions +### PROXY_getImplementation + + +```solidity +function PROXY_getImplementation() external view returns (address); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/hooks/interfaces/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/hooks/interfaces/README.md new file mode 100644 index 000000000..d294d7392 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/hooks/interfaces/README.md @@ -0,0 +1,4 @@ + + +# Contents +- [IWalletProxy](IWalletProxy.sol/interface.IWalletProxy.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/IERC1271Wallet.sol/interface.IERC1271Wallet.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/IERC1271Wallet.sol/interface.IERC1271Wallet.md new file mode 100644 index 000000000..90fe5b6c0 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/IERC1271Wallet.sol/interface.IERC1271Wallet.md @@ -0,0 +1,57 @@ +# IERC1271Wallet +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/interfaces/IERC1271Wallet.sol) + + +## Functions +### isValidSignature + +Verifies whether the provided signature is valid with respect to the provided data + +MUST return the correct magic value if the signature provided is valid for the provided data +> The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") +> This function MAY modify Ethereum's state + + +```solidity +function isValidSignature(bytes calldata _data, bytes calldata _signature) external view returns (bytes4 magicValue); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`| Arbitrary length data signed on the behalf of address(this)| +|`_signature`|`bytes`| Signature byte array associated with _data| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`magicValue`|`bytes4`|Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise| + + +### isValidSignature + +Verifies whether the provided signature is valid with respect to the provided hash + +MUST return the correct magic value if the signature provided is valid for the provided hash +> The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)") +> This function MAY modify Ethereum's state + + +```solidity +function isValidSignature(bytes32 _hash, bytes calldata _signature) external view returns (bytes4 magicValue); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_hash`|`bytes32`| keccak256 hash that was signed| +|`_signature`|`bytes`| Signature byte array associated with _data| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`magicValue`|`bytes4`|Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/README.md new file mode 100644 index 000000000..482732f11 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/README.md @@ -0,0 +1,6 @@ + + +# Contents +- [receivers](/contracts/interfaces/receivers) +- [tokens](/contracts/interfaces/tokens) +- [IERC1271Wallet](IERC1271Wallet.sol/interface.IERC1271Wallet.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC1155Receiver.sol/interface.IERC1155Receiver.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC1155Receiver.sol/interface.IERC1155Receiver.md new file mode 100644 index 000000000..15ae7d6f4 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC1155Receiver.sol/interface.IERC1155Receiver.md @@ -0,0 +1,21 @@ +# IERC1155Receiver +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/interfaces/receivers/IERC1155Receiver.sol) + + +## Functions +### onERC1155Received + + +```solidity +function onERC1155Received(address, address, uint256, uint256, bytes calldata) external returns (bytes4); +``` + +### onERC1155BatchReceived + + +```solidity +function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) + external + returns (bytes4); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC223Receiver.sol/interface.IERC223Receiver.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC223Receiver.sol/interface.IERC223Receiver.md new file mode 100644 index 000000000..0cd75e79e --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC223Receiver.sol/interface.IERC223Receiver.md @@ -0,0 +1,12 @@ +# IERC223Receiver +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/interfaces/receivers/IERC223Receiver.sol) + + +## Functions +### tokenFallback + + +```solidity +function tokenFallback(address, uint256, bytes calldata) external; +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC721Receiver.sol/interface.IERC721Receiver.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC721Receiver.sol/interface.IERC721Receiver.md new file mode 100644 index 000000000..bb3179c87 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC721Receiver.sol/interface.IERC721Receiver.md @@ -0,0 +1,12 @@ +# IERC721Receiver +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/interfaces/receivers/IERC721Receiver.sol) + + +## Functions +### onERC721Received + + +```solidity +function onERC721Received(address, address, uint256, bytes calldata) external returns (bytes4); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC777Receiver.sol/interface.IERC777Receiver.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC777Receiver.sol/interface.IERC777Receiver.md new file mode 100644 index 000000000..0ce16e2bb --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC777Receiver.sol/interface.IERC777Receiver.md @@ -0,0 +1,12 @@ +# IERC777Receiver +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/interfaces/receivers/IERC777Receiver.sol) + + +## Functions +### tokensReceived + + +```solidity +function tokensReceived(address, address, address, uint256, bytes calldata, bytes calldata) external; +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/README.md new file mode 100644 index 000000000..b825f22b3 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/receivers/README.md @@ -0,0 +1,7 @@ + + +# Contents +- [IERC1155Receiver](IERC1155Receiver.sol/interface.IERC1155Receiver.md) +- [IERC223Receiver](IERC223Receiver.sol/interface.IERC223Receiver.md) +- [IERC721Receiver](IERC721Receiver.sol/interface.IERC721Receiver.md) +- [IERC777Receiver](IERC777Receiver.sol/interface.IERC777Receiver.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC1155.sol/interface.IERC1155.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC1155.sol/interface.IERC1155.md new file mode 100644 index 000000000..963349901 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC1155.sol/interface.IERC1155.md @@ -0,0 +1,83 @@ +# IERC1155 +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/interfaces/tokens/IERC1155.sol) + + +## Functions +### balanceOf + + +```solidity +function balanceOf(address account, uint256 id) external view returns (uint256); +``` + +### balanceOfBatch + + +```solidity +function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) + external + view + returns (uint256[] memory); +``` + +### setApprovalForAll + + +```solidity +function setApprovalForAll(address operator, bool approved) external; +``` + +### isApprovedForAll + + +```solidity +function isApprovedForAll(address account, address operator) external view returns (bool); +``` + +### safeTransferFrom + + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; +``` + +### safeBatchTransferFrom + + +```solidity +function safeBatchTransferFrom( + address from, + address to, + uint256[] calldata ids, + uint256[] calldata amounts, + bytes calldata data +) external; +``` + +## Events +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); +``` + +### TransferBatch + +```solidity +event TransferBatch( + address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values +); +``` + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved); +``` + +### URI + +```solidity +event URI(string value, uint256 indexed id); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC20.sol/interface.IERC20.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC20.sol/interface.IERC20.md new file mode 100644 index 000000000..b725da485 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC20.sol/interface.IERC20.md @@ -0,0 +1,60 @@ +# IERC20 +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/interfaces/tokens/IERC20.sol) + + +## Functions +### totalSupply + + +```solidity +function totalSupply() external view returns (uint256); +``` + +### balanceOf + + +```solidity +function balanceOf(address account) external view returns (uint256); +``` + +### transfer + + +```solidity +function transfer(address recipient, uint256 amount) external returns (bool); +``` + +### allowance + + +```solidity +function allowance(address owner, address spender) external view returns (uint256); +``` + +### approve + + +```solidity +function approve(address spender, uint256 amount) external returns (bool); +``` + +### transferFrom + + +```solidity +function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); +``` + +## Events +### Transfer + +```solidity +event Transfer(address indexed from, address indexed to, uint256 value); +``` + +### Approval + +```solidity +event Approval(address indexed owner, address indexed spender, uint256 value); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC721.sol/interface.IERC721.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC721.sol/interface.IERC721.md new file mode 100644 index 000000000..04afa1fca --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/IERC721.sol/interface.IERC721.md @@ -0,0 +1,87 @@ +# IERC721 +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/interfaces/tokens/IERC721.sol) + + +## Functions +### balanceOf + + +```solidity +function balanceOf(address owner) external view returns (uint256 balance); +``` + +### ownerOf + + +```solidity +function ownerOf(uint256 tokenId) external view returns (address owner); +``` + +### safeTransferFrom + + +```solidity +function safeTransferFrom(address from, address to, uint256 tokenId) external; +``` + +### transferFrom + + +```solidity +function transferFrom(address from, address to, uint256 tokenId) external; +``` + +### approve + + +```solidity +function approve(address to, uint256 tokenId) external; +``` + +### getApproved + + +```solidity +function getApproved(uint256 tokenId) external view returns (address operator); +``` + +### setApprovalForAll + + +```solidity +function setApprovalForAll(address operator, bool approved) external; +``` + +### isApprovedForAll + + +```solidity +function isApprovedForAll(address owner, address operator) external view returns (bool); +``` + +### safeTransferFrom + + +```solidity +function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; +``` + +## Events +### Transfer + +```solidity +event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); +``` + +### Approval + +```solidity +event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); +``` + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed owner, address indexed operator, bool approved); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/README.md new file mode 100644 index 000000000..b3210e36c --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/interfaces/tokens/README.md @@ -0,0 +1,6 @@ + + +# Contents +- [IERC1155](IERC1155.sol/interface.IERC1155.md) +- [IERC20](IERC20.sol/interface.IERC20.md) +- [IERC721](IERC721.sol/interface.IERC721.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/AlwaysRevertMock.sol/contract.AlwaysRevertMock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/AlwaysRevertMock.sol/contract.AlwaysRevertMock.md new file mode 100644 index 000000000..cbc78e73a --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/AlwaysRevertMock.sol/contract.AlwaysRevertMock.md @@ -0,0 +1,12 @@ +# AlwaysRevertMock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/AlwaysRevertMock.sol) + + +## Functions +### fallback + + +```solidity +fallback() external payable; +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/CallReceiverMock.sol/contract.CallReceiverMock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/CallReceiverMock.sol/contract.CallReceiverMock.md new file mode 100644 index 000000000..971bcd495 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/CallReceiverMock.sol/contract.CallReceiverMock.md @@ -0,0 +1,48 @@ +# CallReceiverMock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/CallReceiverMock.sol) + + +## State Variables +### lastValA + +```solidity +uint256 public lastValA +``` + + +### lastValB + +```solidity +bytes public lastValB +``` + + +### revertFlag + +```solidity +bool revertFlag +``` + + +## Functions +### constructor + + +```solidity +constructor() payable; +``` + +### setRevertFlag + + +```solidity +function setRevertFlag(bool _revertFlag) external; +``` + +### testCall + + +```solidity +function testCall(uint256 _valA, bytes calldata _valB) external payable; +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/DelegateCallMock.sol/contract.DelegateCallMock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/DelegateCallMock.sol/contract.DelegateCallMock.md new file mode 100644 index 000000000..27c803167 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/DelegateCallMock.sol/contract.DelegateCallMock.md @@ -0,0 +1,48 @@ +# DelegateCallMock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/DelegateCallMock.sol) + + +## State Variables +### REVERT_SLOT + +```solidity +uint256 private constant REVERT_SLOT = uint256(keccak256("revert-flag")) +``` + + +### store + +```solidity +mapping(uint256 => uint256) private store +``` + + +## Functions +### setRevertFlag + + +```solidity +function setRevertFlag(bool _revertFlag) external; +``` + +### write + + +```solidity +function write(uint256 _key, uint256 _val) external; +``` + +### read + + +```solidity +function read(uint256 _key) external; +``` + +## Events +### Readed + +```solidity +event Readed(uint256 _val); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC1155Mock.sol/contract.ERC1155Mock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC1155Mock.sol/contract.ERC1155Mock.md new file mode 100644 index 000000000..07439ae1a --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC1155Mock.sol/contract.ERC1155Mock.md @@ -0,0 +1,110 @@ +# ERC1155Mock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/ERC1155Mock.sol) + + +## State Variables +### name + +```solidity +string public name = "Mock ERC1155 Token" +``` + + +### symbol + +```solidity +string public symbol = "MERC1155" +``` + + +### owner + +```solidity +address public owner +``` + + +### balances + +```solidity +mapping(uint256 => mapping(address => uint256)) public balances +``` + + +### operatorApprovals + +```solidity +mapping(address => mapping(address => bool)) public operatorApprovals +``` + + +## Functions +### constructor + + +```solidity +constructor() ; +``` + +### onlyOwner + + +```solidity +modifier onlyOwner() ; +``` + +### balanceOf + + +```solidity +function balanceOf(address account, uint256 id) public view returns (uint256); +``` + +### balanceOfBatch + + +```solidity +function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view returns (uint256[] memory); +``` + +### mint + + +```solidity +function mint(address to, uint256 id, uint256 amount) public onlyOwner; +``` + +### safeTransferFrom + + +```solidity +function safeTransferFrom(address from, address to, uint256 id, uint256 amount) public; +``` + +### setApprovalForAll + + +```solidity +function setApprovalForAll(address operator, bool approved) public; +``` + +### isApprovedForAll + + +```solidity +function isApprovedForAll(address account, address operator) public view returns (bool); +``` + +## Events +### TransferSingle + +```solidity +event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); +``` + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed account, address indexed operator, bool approved); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC165CheckerMock.sol/contract.ERC165CheckerMock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC165CheckerMock.sol/contract.ERC165CheckerMock.md new file mode 100644 index 000000000..15df064f0 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC165CheckerMock.sol/contract.ERC165CheckerMock.md @@ -0,0 +1,37 @@ +# ERC165CheckerMock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/ERC165CheckerMock.sol) + + +## State Variables +### InvalidID + +```solidity +bytes4 constant InvalidID = 0xffffffff +``` + + +### ERC165ID + +```solidity +bytes4 constant ERC165ID = 0x01ffc9a7 +``` + + +## Functions +### doesContractImplementInterface + + +```solidity +function doesContractImplementInterface(address _contract, bytes4 _interfaceId) external view returns (bool); +``` + +### noThrowCall + + +```solidity +function noThrowCall(address _contract, bytes4 _interfaceId) + private + view + returns (uint256 success, uint256 result); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC20Mock.sol/contract.ERC20Mock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC20Mock.sol/contract.ERC20Mock.md new file mode 100644 index 000000000..986bf48af --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC20Mock.sol/contract.ERC20Mock.md @@ -0,0 +1,103 @@ +# ERC20Mock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/ERC20Mock.sol) + + +## State Variables +### name + +```solidity +string public name = "Mock ERC20 Token" +``` + + +### symbol + +```solidity +string public symbol = "MERC20" +``` + + +### decimals + +```solidity +uint8 public decimals = 18 +``` + + +### totalSupply + +```solidity +uint256 public totalSupply +``` + + +### balances + +```solidity +mapping(address => uint256) public balances +``` + + +### allowances + +```solidity +mapping(address => mapping(address => uint256)) public allowances +``` + + +## Functions +### constructor + + +```solidity +constructor(uint256 initialSupply) ; +``` + +### balanceOf + + +```solidity +function balanceOf(address account) public view returns (uint256); +``` + +### transfer + + +```solidity +function transfer(address recipient, uint256 amount) public returns (bool); +``` + +### allowance + + +```solidity +function allowance(address owner, address spender) public view returns (uint256); +``` + +### approve + + +```solidity +function approve(address spender, uint256 amount) public returns (bool); +``` + +### transferFrom + + +```solidity +function transferFrom(address sender, address recipient, uint256 amount) public returns (bool); +``` + +## Events +### Transfer + +```solidity +event Transfer(address indexed from, address indexed to, uint256 value); +``` + +### Approval + +```solidity +event Approval(address indexed owner, address indexed spender, uint256 value); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC721Mock.sol/contract.ERC721Mock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC721Mock.sol/contract.ERC721Mock.md new file mode 100644 index 000000000..e8da713f0 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ERC721Mock.sol/contract.ERC721Mock.md @@ -0,0 +1,151 @@ +# ERC721Mock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/ERC721Mock.sol) + + +## State Variables +### name + +```solidity +string public name = "Mock ERC721 Token" +``` + + +### symbol + +```solidity +string public symbol = "MERC721" +``` + + +### totalSupply + +```solidity +uint256 public totalSupply +``` + + +### owner + +```solidity +address public owner +``` + + +### balances + +```solidity +mapping(address => uint256) public balances +``` + + +### owners + +```solidity +mapping(uint256 => address) public owners +``` + + +### operatorApprovals + +```solidity +mapping(address => mapping(address => bool)) public operatorApprovals +``` + + +### tokenApprovals + +```solidity +mapping(uint256 => address) public tokenApprovals +``` + + +## Functions +### constructor + + +```solidity +constructor() ; +``` + +### onlyOwner + + +```solidity +modifier onlyOwner() ; +``` + +### balanceOf + + +```solidity +function balanceOf(address _owner) public view returns (uint256); +``` + +### ownerOf + + +```solidity +function ownerOf(uint256 tokenId) public view returns (address); +``` + +### mint + + +```solidity +function mint(address to, uint256 tokenId) public onlyOwner; +``` + +### transferFrom + + +```solidity +function transferFrom(address from, address to, uint256 tokenId) public; +``` + +### approve + + +```solidity +function approve(address to, uint256 tokenId) public; +``` + +### getApproved + + +```solidity +function getApproved(uint256 tokenId) public view returns (address); +``` + +### setApprovalForAll + + +```solidity +function setApprovalForAll(address operator, bool approved) public; +``` + +### isApprovedForAll + + +```solidity +function isApprovedForAll(address _owner, address operator) public view returns (bool); +``` + +## Events +### Transfer + +```solidity +event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); +``` + +### Approval + +```solidity +event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); +``` + +### ApprovalForAll + +```solidity +event ApprovalForAll(address indexed owner, address indexed operator, bool approved); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/GasBurnerMock.sol/contract.GasBurnerMock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/GasBurnerMock.sol/contract.GasBurnerMock.md new file mode 100644 index 000000000..4b29aa335 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/GasBurnerMock.sol/contract.GasBurnerMock.md @@ -0,0 +1,19 @@ +# GasBurnerMock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/GasBurnerMock.sol) + + +## Functions +### burnGas + + +```solidity +function burnGas(uint256 _burn) external; +``` + +## Events +### ProvidedGas + +```solidity +event ProvidedGas(uint256 _val); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/HookCallerMock.sol/contract.HookCallerMock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/HookCallerMock.sol/contract.HookCallerMock.md new file mode 100644 index 000000000..31228f830 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/HookCallerMock.sol/contract.HookCallerMock.md @@ -0,0 +1,49 @@ +# HookCallerMock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/HookCallerMock.sol) + + +## Functions +### callERC1155Received + + +```solidity +function callERC1155Received(address _addr) external; +``` + +### callERC1155BatchReceived + + +```solidity +function callERC1155BatchReceived(address _addr) external; +``` + +### callERC721Received + + +```solidity +function callERC721Received(address _addr) external; +``` + +### callERC223Received + + +```solidity +function callERC223Received(address _addr) external; +``` + +### callERC1271isValidSignatureData + + +```solidity +function callERC1271isValidSignatureData(address _addr, bytes calldata _data, bytes calldata _signature) + external + view; +``` + +### callERC1271isValidSignatureHash + + +```solidity +function callERC1271isValidSignatureHash(address _addr, bytes32 _hash, bytes calldata _signature) external view; +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/HookMock.sol/contract.HookMock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/HookMock.sol/contract.HookMock.md new file mode 100644 index 000000000..cbbeaef8a --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/HookMock.sol/contract.HookMock.md @@ -0,0 +1,12 @@ +# HookMock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/HookMock.sol) + + +## Functions +### onHookMockCall + + +```solidity +function onHookMockCall(uint256 _num) external pure returns (uint256); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibBytesImpl.sol/contract.LibBytesImpl.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibBytesImpl.sol/contract.LibBytesImpl.md new file mode 100644 index 000000000..4e4c03e92 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibBytesImpl.sol/contract.LibBytesImpl.md @@ -0,0 +1,26 @@ +# LibBytesImpl +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/LibBytesImpl.sol) + + +## Functions +### readBytes32 + + +```solidity +function readBytes32(bytes calldata data, uint256 index) external pure returns (bytes32 a); +``` + +### readUint8 + + +```solidity +function readUint8(bytes calldata data, uint256 index) external pure returns (uint8 a); +``` + +### readUint32 + + +```solidity +function readUint32(bytes calldata data, uint256 index) external pure returns (uint32 a); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibBytesPointerImpl.sol/contract.LibBytesPointerImpl.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibBytesPointerImpl.sol/contract.LibBytesPointerImpl.md new file mode 100644 index 000000000..dcc906b54 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibBytesPointerImpl.sol/contract.LibBytesPointerImpl.md @@ -0,0 +1,33 @@ +# LibBytesPointerImpl +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/LibBytesPointerImpl.sol) + + +## Functions +### readFirstUint16 + + +```solidity +function readFirstUint16(bytes calldata data) external pure returns (uint16 a, uint256 newPointer); +``` + +### readUint16 + + +```solidity +function readUint16(bytes calldata data, uint256 index) external pure returns (uint16 a, uint256 newPointer); +``` + +### readUint24 + + +```solidity +function readUint24(bytes calldata data, uint256 index) external pure returns (uint24 a, uint256 newPointer); +``` + +### readUint64 + + +```solidity +function readUint64(bytes calldata data, uint256 index) external pure returns (uint64 a, uint256 newPointer); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibStringImp.sol/contract.LibStringImp.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibStringImp.sol/contract.LibStringImp.md new file mode 100644 index 000000000..dbe4b943e --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/LibStringImp.sol/contract.LibStringImp.md @@ -0,0 +1,33 @@ +# LibStringImp +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/LibStringImp.sol) + + +## Functions +### prefixBase32 + + +```solidity +function prefixBase32(string calldata data) external pure returns (string memory); +``` + +### prefixHexadecimal + + +```solidity +function prefixHexadecimal(string calldata data) external pure returns (string memory); +``` + +### bytesToBase32 + + +```solidity +function bytesToBase32(bytes calldata data) external pure returns (string memory); +``` + +### bytesToHexadecimal + + +```solidity +function bytesToHexadecimal(bytes calldata data) external pure returns (string memory); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ModuleMock.sol/contract.ModuleMock.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ModuleMock.sol/contract.ModuleMock.md new file mode 100644 index 000000000..1f7091182 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/ModuleMock.sol/contract.ModuleMock.md @@ -0,0 +1,19 @@ +# ModuleMock +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/mocks/ModuleMock.sol) + + +## Functions +### ping + + +```solidity +function ping() external; +``` + +## Events +### Pong + +```solidity +event Pong(); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/mocks/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/README.md new file mode 100644 index 000000000..c96d7e081 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/mocks/README.md @@ -0,0 +1,17 @@ + + +# Contents +- [AlwaysRevertMock](AlwaysRevertMock.sol/contract.AlwaysRevertMock.md) +- [CallReceiverMock](CallReceiverMock.sol/contract.CallReceiverMock.md) +- [DelegateCallMock](DelegateCallMock.sol/contract.DelegateCallMock.md) +- [ERC1155Mock](ERC1155Mock.sol/contract.ERC1155Mock.md) +- [ERC165CheckerMock](ERC165CheckerMock.sol/contract.ERC165CheckerMock.md) +- [ERC20Mock](ERC20Mock.sol/contract.ERC20Mock.md) +- [ERC721Mock](ERC721Mock.sol/contract.ERC721Mock.md) +- [GasBurnerMock](GasBurnerMock.sol/contract.GasBurnerMock.md) +- [HookCallerMock](HookCallerMock.sol/contract.HookCallerMock.md) +- [HookMock](HookMock.sol/contract.HookMock.md) +- [LibBytesImpl](LibBytesImpl.sol/contract.LibBytesImpl.md) +- [LibBytesPointerImpl](LibBytesPointerImpl.sol/contract.LibBytesPointerImpl.md) +- [LibStringImp](LibStringImp.sol/contract.LibStringImp.md) +- [ModuleMock](ModuleMock.sol/contract.ModuleMock.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/GuestModule.sol/contract.GuestModule.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/GuestModule.sol/contract.GuestModule.md new file mode 100644 index 000000000..3c4bd106b --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/GuestModule.sol/contract.GuestModule.md @@ -0,0 +1,124 @@ +# GuestModule +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/GuestModule.sol) + +**Inherits:** +[ModuleAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md), [ModuleCalls](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleCalls.sol/abstract.ModuleCalls.md), [ModuleCreator](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleCreator.sol/contract.ModuleCreator.md) + +GuestModule implements a Sequence wallet without signatures, nonce or replay protection. +executing transactions using this wallet is not an authenticated process, and can be done by any address. + +This contract is completely public with no security, designed to execute pre-signed transactions +and use Sequence tools without using the wallets. + + +## Functions +### execute + +Allow any caller to execute an action + + +```solidity +function execute(Transaction[] calldata _txs, uint256, bytes calldata) public override; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txs`|`Transaction[]`|Transactions to process| +|``|`uint256`|| +|``|`bytes`|| + + +### selfExecute + +Allow any caller to execute an action + + +```solidity +function selfExecute(Transaction[] calldata _txs) public override; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txs`|`Transaction[]`|Transactions to process| + + +### _executeGuest + +Executes a list of transactions + + +```solidity +function _executeGuest(bytes32 _txHash, Transaction[] calldata _txs) private; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txHash`|`bytes32`| Hash of the batch of transactions| +|`_txs`|`Transaction[]`| Transactions to execute| + + +### _isValidImage + +Validates any signature image, because the wallet is public and has no owner. + + +```solidity +function _isValidImage(bytes32) internal pure override returns (bool); +``` +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|true, all signatures are valid.| + + +### _updateImageHash + +Not supported. + + +```solidity +function _updateImageHash(bytes32) internal virtual override; +``` + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) + public + pure + override(ModuleAuth, ModuleCalls, ModuleCreator) + returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + +## Errors +### DelegateCallNotAllowed + +```solidity +error DelegateCallNotAllowed(uint256 _index); +``` + +### NotSupported + +```solidity +error NotSupported(); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModule.sol/contract.MainModule.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModule.sol/contract.MainModule.md new file mode 100644 index 000000000..3518e4456 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModule.sol/contract.MainModule.md @@ -0,0 +1,57 @@ +# MainModule +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/MainModule.sol) + +**Inherits:** +[ModuleAuthFixed](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthFixed.sol/abstract.ModuleAuthFixed.md), [ModuleExtraAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleExtraAuth.sol/abstract.ModuleExtraAuth.md), [ModuleCalls](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleCalls.sol/abstract.ModuleCalls.md), [ModuleHooks](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleHooks.sol/contract.ModuleHooks.md), [ModuleCreator](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleCreator.sol/contract.ModuleCreator.md), [ModuleAuthConvenience](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthConvenience.sol/abstract.ModuleAuthConvenience.md) + +Contains the core functionality Sequence wallets will inherit. + +If using a new main module, developers must ensure that all inherited +contracts by the main module don't conflict and are accounted for to be +supported by the supportsInterface method. + + +## Functions +### constructor + + +```solidity +constructor(address _factory, address _mainModuleUpgradable) ModuleAuthFixed(_factory, _mainModuleUpgradable); +``` + +### _isValidImage + + +```solidity +function _isValidImage(bytes32 _imageHash) + internal + view + override(IModuleAuth, ModuleAuthFixed, ModuleExtraAuth) + returns (bool); +``` + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) + public + pure + override(ModuleAuthFixed, ModuleAuthConvenience, ModuleCalls, ModuleExtraAuth, ModuleHooks, ModuleCreator) + returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModuleGasEstimation.sol/contract.MainModuleGasEstimation.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModuleGasEstimation.sol/contract.MainModuleGasEstimation.md new file mode 100644 index 000000000..1faeb0395 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModuleGasEstimation.sol/contract.MainModuleGasEstimation.md @@ -0,0 +1,85 @@ +# MainModuleGasEstimation +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/MainModuleGasEstimation.sol) + +**Inherits:** +[ModuleIgnoreAuthUpgradable](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol/abstract.ModuleIgnoreAuthUpgradable.md), [ModuleIgnoreNonceCalls](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol/abstract.ModuleIgnoreNonceCalls.md), [ModuleUpdate](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleUpdate.sol/contract.ModuleUpdate.md), [ModuleHooks](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleHooks.sol/contract.ModuleHooks.md), [ModuleCreator](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleCreator.sol/contract.ModuleCreator.md) + +Contains an alternative implementation of the MainModules that skips validation of +signatures, this implementation SHOULD NOT be used directly on a wallet. +Intended to be used only for gas estimation, using eth_call and overrides. + + +## Functions +### simulateExecute + +Simulate each transaction in a bundle for gas usage and execution result + + +```solidity +function simulateExecute(Transaction[] calldata _txs) public virtual returns (SimulateResult[] memory); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txs`|`Transaction[]`|Transactions to process| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`SimulateResult[]`|The gas used and execution result for each transaction in the bundle| + + +### _isValidImage + + +```solidity +function _isValidImage(bytes32 _imageHash) + internal + view + override(IModuleAuth, ModuleIgnoreAuthUpgradable) + returns (bool); +``` + +### supportsInterface + +Query if a contract implements an interface + +If using a new main module, developers must ensure that all inherited +contracts by the main module don't conflict and are accounted for to be +supported by the supportsInterface method. + + +```solidity +function supportsInterface(bytes4 _interfaceID) + public + pure + override(ModuleAuthUpgradable, ModuleCalls, ModuleUpdate, ModuleHooks, ModuleCreator) + returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + +## Structs +### SimulateResult + +```solidity +struct SimulateResult { + bool executed; + bool succeeded; + bytes result; + uint256 gasUsed; +} +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModuleUpgradable.sol/contract.MainModuleUpgradable.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModuleUpgradable.sol/contract.MainModuleUpgradable.md new file mode 100644 index 000000000..6d6d84d91 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/MainModuleUpgradable.sol/contract.MainModuleUpgradable.md @@ -0,0 +1,63 @@ +# MainModuleUpgradable +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/MainModuleUpgradable.sol) + +**Inherits:** +[ModuleAuthUpgradable](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthUpgradable.sol/abstract.ModuleAuthUpgradable.md), [ModuleExtraAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleExtraAuth.sol/abstract.ModuleExtraAuth.md), [ModuleCalls](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleCalls.sol/abstract.ModuleCalls.md), [ModuleUpdate](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleUpdate.sol/contract.ModuleUpdate.md), [ModuleHooks](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleHooks.sol/contract.ModuleHooks.md), [ModuleCreator](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleCreator.sol/contract.ModuleCreator.md), [ModuleAuthConvenience](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthConvenience.sol/abstract.ModuleAuthConvenience.md) + +Contains the core functionality Sequence wallets will inherit with +the added functionality that the main module can be changed. + +If using a new main module, developers must ensure that all inherited +contracts by the main module don't conflict and are accounted for to be +supported by the supportsInterface method. + + +## Functions +### _isValidImage + + +```solidity +function _isValidImage(bytes32 _imageHash) + internal + view + override(IModuleAuth, ModuleAuthUpgradable, ModuleExtraAuth) + returns (bool); +``` + +### supportsInterface + +Query if a contract implements an interface + +If using a new main module, developers must ensure that all inherited +contracts by the main module don't conflict and are accounted for to be +supported by the supportsInterface method. + + +```solidity +function supportsInterface(bytes4 _interfaceID) + public + pure + override( + ModuleAuthUpgradable, + ModuleAuthConvenience, + ModuleCalls, + ModuleExtraAuth, + ModuleUpdate, + ModuleHooks, + ModuleCreator + ) + returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/README.md new file mode 100644 index 000000000..4aea181ed --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/README.md @@ -0,0 +1,9 @@ + + +# Contents +- [commons](/contracts/modules/commons) +- [utils](/contracts/modules/utils) +- [GuestModule](GuestModule.sol/contract.GuestModule.md) +- [MainModule](MainModule.sol/contract.MainModule.md) +- [MainModuleGasEstimation](MainModuleGasEstimation.sol/contract.MainModuleGasEstimation.md) +- [MainModuleUpgradable](MainModuleUpgradable.sol/contract.MainModuleUpgradable.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/Implementation.sol/contract.Implementation.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/Implementation.sol/contract.Implementation.md new file mode 100644 index 000000000..48ffca756 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/Implementation.sol/contract.Implementation.md @@ -0,0 +1,42 @@ +# Implementation +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/Implementation.sol) + +Allows modules to access the implementation slot + + +## Functions +### _setImplementation + +Updates the Wallet implementation + +The wallet implementation is stored on the storage slot +defined by the address of the wallet itself +WARNING updating this value may break the wallet and users +must be confident that the new implementation is safe. + + +```solidity +function _setImplementation(address _imp) internal; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imp`|`address`|New implementation address| + + +### _getImplementation + +Returns the Wallet implementation + + +```solidity +function _getImplementation() internal view returns (address _imp); +``` +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`_imp`|`address`|The address of the current Wallet implementation| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md new file mode 100644 index 000000000..08b9d690a --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md @@ -0,0 +1,203 @@ +# ModuleAuth +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleAuth.sol) + +**Inherits:** +[IModuleAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuth.sol/abstract.IModuleAuth.md), [ModuleERC165](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md), [IERC1271Wallet](/home/dargon789/wallet-contracts/docs/src/contracts/interfaces/IERC1271Wallet.sol/interface.IERC1271Wallet.md), [SequenceChainedSig](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol/abstract.SequenceChainedSig.md) + + +## State Variables +### LEGACY_TYPE + +```solidity +bytes1 internal constant LEGACY_TYPE = hex"00" +``` + + +### DYNAMIC_TYPE + +```solidity +bytes1 internal constant DYNAMIC_TYPE = hex"01" +``` + + +### NO_CHAIN_ID_TYPE + +```solidity +bytes1 internal constant NO_CHAIN_ID_TYPE = hex"02" +``` + + +### CHAINED_TYPE + +```solidity +bytes1 internal constant CHAINED_TYPE = hex"03" +``` + + +### SELECTOR_ERC1271_BYTES_BYTES + +```solidity +bytes4 internal constant SELECTOR_ERC1271_BYTES_BYTES = 0x20c13b0b +``` + + +### SELECTOR_ERC1271_BYTES32_BYTES + +```solidity +bytes4 internal constant SELECTOR_ERC1271_BYTES32_BYTES = 0x1626ba7e +``` + + +## Functions +### signatureRecovery + +Recovers the threshold, weight, imageHash, subdigest, and checkpoint of a signature. + +The signature must be prefixed with a type byte, which is used to determine the recovery method. + + +```solidity +function signatureRecovery(bytes32 _digest, bytes calldata _signature) + public + view + virtual + override + returns (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 checkpoint); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_digest`|`bytes32`|Digest of the signed data.| +|`_signature`|`bytes`|A Sequence signature.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`threshold`|`uint256`|The required number of signatures needed to consider the signature valid.| +|`weight`|`uint256`|The actual number of signatures collected in the signature.| +|`imageHash`|`bytes32`|The imageHash of the configuration that signed the message.| +|`subdigest`|`bytes32`|A modified version of the original digest, unique for each wallet/network.| +|`checkpoint`|`uint256`|A nonce that is incremented every time a new configuration is set.| + + +### _signatureValidation + +Validates a signature. + + +```solidity +function _signatureValidation(bytes32 _digest, bytes calldata _signature) + internal + view + virtual + override + returns (bool isValid, bytes32 subdigest); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_digest`|`bytes32`|Digest of the signed data.| +|`_signature`|`bytes`|A Sequence signature.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`isValid`|`bool`|Indicates whether the signature is valid or not.| +|`subdigest`|`bytes32`|A modified version of the original digest, unique for each wallet/network.| + + +### isValidSignature + +Verifies whether the provided signature is valid with respect to the provided data + +MUST return the correct magic value if the signature provided is valid for the provided data +> The bytes4 magic value to return when signature is valid is 0x20c13b0b : bytes4(keccak256("isValidSignature(bytes,bytes)")) + + +```solidity +function isValidSignature(bytes calldata _data, bytes calldata _signatures) + public + view + virtual + override + returns (bytes4); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`| Arbitrary length data signed on the behalf of address(this)| +|`_signatures`|`bytes`|Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes4`|magicValue Magic value 0x20c13b0b if the signature is valid and 0x0 otherwise| + + +### isValidSignature + +Verifies whether the provided signature is valid with respect to the provided hash + +MUST return the correct magic value if the signature provided is valid for the provided hash +> The bytes4 magic value to return when signature is valid is 0x1626ba7e : bytes4(keccak256("isValidSignature(bytes32,bytes)")) + + +```solidity +function isValidSignature(bytes32 _hash, bytes calldata _signatures) public view virtual override returns (bytes4); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_hash`|`bytes32`| keccak256 hash that was signed| +|`_signatures`|`bytes`|Signature byte array associated with _data. Encoded as abi.encode(Signature[], Configs)| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes4`|magicValue Magic value 0x1626ba7e if the signature is valid and 0x0 otherwise| + + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + +### updateImageHash + +Updates the signers configuration of the wallet + + +```solidity +function updateImageHash(bytes32 _imageHash) external virtual override onlySelf; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|New required image hash of the signature| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthConvenience.sol/abstract.ModuleAuthConvenience.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthConvenience.sol/abstract.ModuleAuthConvenience.md new file mode 100644 index 000000000..19295f352 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthConvenience.sol/abstract.ModuleAuthConvenience.md @@ -0,0 +1,53 @@ +# ModuleAuthConvenience +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleAuthConvenience.sol) + +**Inherits:** +[ModuleERC165](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md), [ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md), [ModuleAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md), [ModuleIPFS](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleIPFS.sol/contract.ModuleIPFS.md) + + +## Functions +### updateImageHashAndIPFS + +Updates the image hash and the IPFS root in a single operation. + +These two operations are often performed together, so this function +allows to save some gas by performing them in a single step. + + +```solidity +function updateImageHashAndIPFS(bytes32 _imageHash, bytes32 _ipfsRoot) external onlySelf; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|The new image hash to be set.| +|`_ipfsRoot`|`bytes32`|The new IPFS root to be set.| + + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) + public + pure + virtual + override(ModuleERC165, ModuleAuth) + returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthFixed.sol/abstract.ModuleAuthFixed.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthFixed.sol/abstract.ModuleAuthFixed.md new file mode 100644 index 000000000..06b88e89f --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthFixed.sol/abstract.ModuleAuthFixed.md @@ -0,0 +1,108 @@ +# ModuleAuthFixed +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleAuthFixed.sol) + +**Inherits:** +[ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md), [ModuleAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md), [ModuleUpdate](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleUpdate.sol/contract.ModuleUpdate.md) + +Implements ModuleAuth by validating the signature image against +the salt used to deploy the contract +This module allows wallets to be deployed with a default configuration +without using any aditional contract storage + + +## State Variables +### INIT_CODE_HASH + +```solidity +bytes32 public immutable INIT_CODE_HASH +``` + + +### FACTORY + +```solidity +address public immutable FACTORY +``` + + +### UPGRADEABLE_IMPLEMENTATION + +```solidity +address public immutable UPGRADEABLE_IMPLEMENTATION +``` + + +## Functions +### constructor + + +```solidity +constructor(address _factory, address _mainModuleUpgradeable) ; +``` + +### _updateImageHash + +Updates the configuration of the wallet + +In the process of updating the configuration, the wallet implementation +is updated to the mainModuleUpgradeable, this only happens once in the +lifetime of the wallet. + + +```solidity +function _updateImageHash(bytes32 _imageHash) internal virtual override; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|New required image hash of the signature| + + +### _isValidImage + +Validates the signature image with the salt used to deploy the contract + + +```solidity +function _isValidImage(bytes32 _imageHash) internal view virtual override returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|Hash image of signature| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|true if the signature image is valid| + + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) + public + pure + virtual + override(ModuleAuth, ModuleUpdate) + returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthUpgradable.sol/abstract.ModuleAuthUpgradable.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthUpgradable.sol/abstract.ModuleAuthUpgradable.md new file mode 100644 index 000000000..f89410fe4 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthUpgradable.sol/abstract.ModuleAuthUpgradable.md @@ -0,0 +1,75 @@ +# ModuleAuthUpgradable +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleAuthUpgradable.sol) + +**Inherits:** +[IModuleAuthUpgradable](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol/interface.IModuleAuthUpgradable.md), [ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md), [ModuleAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md) + + +## Functions +### _updateImageHash + +Updates the signers configuration of the wallet + + +```solidity +function _updateImageHash(bytes32 _imageHash) internal virtual override; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|New required image hash of the signature| + + +### imageHash + +Returns the current image hash of the wallet + + +```solidity +function imageHash() external view virtual override returns (bytes32); +``` + +### _isValidImage + +Validates the signature image with a valid image hash defined +in the contract storage + + +```solidity +function _isValidImage(bytes32 _imageHash) internal view virtual override returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|Hash image of signature| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|true if the signature image is valid| + + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleCalls.sol/abstract.ModuleCalls.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleCalls.sol/abstract.ModuleCalls.md new file mode 100644 index 000000000..a2d9ebc10 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleCalls.sol/abstract.ModuleCalls.md @@ -0,0 +1,104 @@ +# ModuleCalls +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleCalls.sol) + +**Inherits:** +[IModuleCalls](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCalls.sol/interface.IModuleCalls.md), [IModuleAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuth.sol/abstract.IModuleAuth.md), [ModuleERC165](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md), [ModuleOnlyDelegatecall](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleOnlyDelegatecall.sol/contract.ModuleOnlyDelegatecall.md), [ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md), [ModuleNonce](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleNonce.sol/contract.ModuleNonce.md) + + +## Functions +### execute + +Allow wallet owner to execute an action + +Relayers must ensure that the gasLimit specified for each transaction +is acceptable to them. A user could specify large enough that it could +consume all the gas available. + + +```solidity +function execute(Transaction[] calldata _txs, uint256 _nonce, bytes calldata _signature) + external + virtual + override + onlyDelegatecall; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txs`|`Transaction[]`| Transactions to process| +|`_nonce`|`uint256`| Signature nonce (may contain an encoded space)| +|`_signature`|`bytes`| Encoded signature| + + +### selfExecute + +Allow wallet to execute an action +without signing the message + + +```solidity +function selfExecute(Transaction[] calldata _txs) external virtual override onlySelf; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txs`|`Transaction[]`| Transactions to execute| + + +### _execute + +Executes a list of transactions + + +```solidity +function _execute(bytes32 _txHash, Transaction[] calldata _txs) private; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txHash`|`bytes32`| Hash of the batch of transactions| +|`_txs`|`Transaction[]`| Transactions to execute| + + +### _revertBytes + +Logs a failed transaction, reverts if the transaction is not optional + + +```solidity +function _revertBytes(bool _revertOnError, bytes32 _txHash, uint256 _index, bytes memory _reason) internal; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_revertOnError`|`bool`| Signals if it should revert or just log| +|`_txHash`|`bytes32`| Hash of the transaction| +|`_index`|`uint256`| Index of the transaction in the batch| +|`_reason`|`bytes`| Encoded revert message| + + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleCreator.sol/contract.ModuleCreator.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleCreator.sol/contract.ModuleCreator.md new file mode 100644 index 000000000..9ba53c075 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleCreator.sol/contract.ModuleCreator.md @@ -0,0 +1,57 @@ +# ModuleCreator +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleCreator.sol) + +**Inherits:** +[IModuleCreator](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCreator.sol/interface.IModuleCreator.md), [ModuleERC165](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md), [ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md) + + +## Functions +### createContract + +Creates a contract forwarding eth value + + +```solidity +function createContract(bytes memory _code) public payable virtual override onlySelf returns (address addr); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_code`|`bytes`|Creation code of the contract| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`addr`|`address`|The address of the created contract| + + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + +## Events +### CreatedContract + +```solidity +event CreatedContract(address _contract); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md new file mode 100644 index 000000000..be2e7f2a4 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md @@ -0,0 +1,31 @@ +# ModuleERC165 +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleERC165.sol) + + +## Functions +### supportsInterface + +Query if a contract implements an interface + +Adding new hooks will not lead to them being reported by this function +without upgrading the wallet. In addition, developers must ensure that +all inherited contracts by the main module don't conflict and are accounted +to be supported by the supportsInterface method. + + +```solidity +function supportsInterface(bytes4 _interfaceID) public pure virtual returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC5719.sol/contract.ModuleERC5719.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC5719.sol/contract.ModuleERC5719.md new file mode 100644 index 000000000..85502e378 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC5719.sol/contract.ModuleERC5719.md @@ -0,0 +1,15 @@ +# ModuleERC5719 +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleERC5719.sol) + +**Inherits:** +[ModuleIPFS](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleIPFS.sol/contract.ModuleIPFS.md) + + +## Functions +### getAlternativeSignature + + +```solidity +function getAlternativeSignature(bytes32 _digest) external view returns (string memory); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleExtraAuth.sol/abstract.ModuleExtraAuth.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleExtraAuth.sol/abstract.ModuleExtraAuth.md new file mode 100644 index 000000000..754cdce9e --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleExtraAuth.sol/abstract.ModuleExtraAuth.md @@ -0,0 +1,92 @@ +# ModuleExtraAuth +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleExtraAuth.sol) + +**Inherits:** +[ModuleERC165](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md), [ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md), [ModuleAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuth.sol/abstract.ModuleAuth.md) + + +## State Variables +### EXTRA_IMAGE_HASH_KEY + +```solidity +bytes32 private constant EXTRA_IMAGE_HASH_KEY = + bytes32(0x849e7bdc245db17e50b9f43086f1914d70eb4dab6dd89af4d541d53353ad97de) +``` + + +## Functions +### _writeExpirationForImageHash + + +```solidity +function _writeExpirationForImageHash(bytes32 _imageHash, uint256 _expiration) internal; +``` + +### _readExpirationForImageHash + + +```solidity +function _readExpirationForImageHash(bytes32 _imageHash) internal view returns (uint256 _expiration); +``` + +### _isValidImage + + +```solidity +function _isValidImage(bytes32 _imageHash) internal view virtual override returns (bool); +``` + +### extraImageHash + + +```solidity +function extraImageHash(bytes32 _imageHash) public view returns (uint256); +``` + +### setExtraImageHash + + +```solidity +function setExtraImageHash(bytes32 _imageHash, uint256 _expiration) external onlySelf; +``` + +### clearExtraImageHashes + + +```solidity +function clearExtraImageHashes(bytes32[] calldata _imageHashes) external onlySelf; +``` + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) + public + pure + virtual + override(ModuleERC165, ModuleAuth) + returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + +## Events +### SetExtraImageHash + +```solidity +event SetExtraImageHash(bytes32 indexed _imageHash, uint256 _expiration); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleHooks.sol/contract.ModuleHooks.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleHooks.sol/contract.ModuleHooks.md new file mode 100644 index 000000000..ba8fc7c12 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleHooks.sol/contract.ModuleHooks.md @@ -0,0 +1,202 @@ +# ModuleHooks +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleHooks.sol) + +**Inherits:** +[IERC1155Receiver](/home/dargon789/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC1155Receiver.sol/interface.IERC1155Receiver.md), [IERC721Receiver](/home/dargon789/wallet-contracts/docs/src/contracts/interfaces/receivers/IERC721Receiver.sol/interface.IERC721Receiver.md), [IModuleHooks](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleHooks.sol/interface.IModuleHooks.md), [ModuleERC165](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md), [ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md) + + +## State Variables +### HOOKS_KEY + +```solidity +bytes32 private constant HOOKS_KEY = bytes32(0xbe27a319efc8734e89e26ba4bc95f5c788584163b959f03fa04e2d7ab4b9a120) +``` + + +## Functions +### readHook + +Reads the implementation hook of a signature + + +```solidity +function readHook(bytes4 _signature) external view virtual override returns (address); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_signature`|`bytes4`|Signature function| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`address`|The address of the implementation hook, address(0) if none| + + +### addHook + +Adds a new hook to handle a given function selector + +Can't overwrite hooks that are part of the main module (those defined below) + + +```solidity +function addHook(bytes4 _signature, address _implementation) external virtual override onlySelf; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_signature`|`bytes4`|Signature function linked to the hook| +|`_implementation`|`address`|Hook implementation contract| + + +### removeHook + +Removes a registered hook + +Can't remove hooks that are part of the main module (those defined below) +without upgrading the wallet + + +```solidity +function removeHook(bytes4 _signature) external virtual override onlySelf; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_signature`|`bytes4`|Signature function linked to the hook| + + +### _readHook + +Reads the implementation hook of a signature + + +```solidity +function _readHook(bytes4 _signature) private view returns (address); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_signature`|`bytes4`|Signature function| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`address`|The address of the implementation hook, address(0) if none| + + +### _writeHook + +Writes the implementation hook of a signature + + +```solidity +function _writeHook(bytes4 _signature, address _implementation) private; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_signature`|`bytes4`|Signature function| +|`_implementation`|`address`|Hook implementation contract| + + +### onERC1155Received + +Handle the receipt of a single ERC1155 token type. + + +```solidity +function onERC1155Received(address, address, uint256, uint256, bytes calldata) + external + virtual + override + returns (bytes4); +``` +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes4`|`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`| + + +### onERC1155BatchReceived + +Handle the receipt of multiple ERC1155 token types. + + +```solidity +function onERC1155BatchReceived(address, address, uint256[] calldata, uint256[] calldata, bytes calldata) + external + virtual + override + returns (bytes4); +``` +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes4`|`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`| + + +### onERC721Received + +Handle the receipt of a single ERC721 token. + + +```solidity +function onERC721Received(address, address, uint256, bytes calldata) external virtual override returns (bytes4); +``` +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes4`|`bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`| + + +### fallback + +Routes fallback calls through hooks + + +```solidity +fallback() external payable; +``` + +### receive + +Allows the wallet to receive ETH + + +```solidity +receive() external payable; +``` + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleIPFS.sol/contract.ModuleIPFS.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleIPFS.sol/contract.ModuleIPFS.md new file mode 100644 index 000000000..d871bd84c --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleIPFS.sol/contract.ModuleIPFS.md @@ -0,0 +1,52 @@ +# ModuleIPFS +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleIPFS.sol) + +**Inherits:** +[ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md) + + +## State Variables +### IPFS_ROOT_KEY + +```solidity +bytes32 private constant IPFS_ROOT_KEY = + bytes32(0x0eecac93ced8722d209199364cda3bc33da3bc3a23daef6be49ebd780511d033) +``` + + +## Functions +### ipfsRootBytes32 + + +```solidity +function ipfsRootBytes32() public view returns (bytes32); +``` + +### ipfsRoot + + +```solidity +function ipfsRoot() public view returns (string memory); +``` + +### updateIPFSRoot + + +```solidity +function updateIPFSRoot(bytes32 _hash) external onlySelf; +``` + +### _updateIPFSRoot + + +```solidity +function _updateIPFSRoot(bytes32 _hash) internal; +``` + +## Events +### IPFSRootUpdated + +```solidity +event IPFSRootUpdated(bytes32 _hash); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleNonce.sol/contract.ModuleNonce.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleNonce.sol/contract.ModuleNonce.md new file mode 100644 index 000000000..a10e72eac --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleNonce.sol/contract.ModuleNonce.md @@ -0,0 +1,96 @@ +# ModuleNonce +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleNonce.sol) + + +## State Variables +### NONCE_KEY + +```solidity +bytes32 private constant NONCE_KEY = bytes32(0x8d0bf1fd623d628c741362c1289948e57b3e2905218c676d3e69abee36d6ae2e) +``` + + +## Functions +### nonce + +Returns the next nonce of the default nonce space + +The default nonce space is 0x00 + + +```solidity +function nonce() external view virtual returns (uint256); +``` +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`uint256`|The next nonce| + + +### readNonce + +Returns the next nonce of the given nonce space + + +```solidity +function readNonce(uint256 _space) public view virtual returns (uint256); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_space`|`uint256`|Nonce space, each space keeps an independent nonce count| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`uint256`|The next nonce| + + +### _writeNonce + +Changes the next nonce of the given nonce space + + +```solidity +function _writeNonce(uint256 _space, uint256 _nonce) internal; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_space`|`uint256`|Nonce space, each space keeps an independent nonce count| +|`_nonce`|`uint256`|Nonce to write on the space| + + +### _validateNonce + +Verify if a nonce is valid + + +```solidity +function _validateNonce(uint256 _rawNonce) internal virtual; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_rawNonce`|`uint256`|Nonce to validate (may contain an encoded space)| + + +## Events +### NonceChange + +```solidity +event NonceChange(uint256 _space, uint256 _newNonce); +``` + +## Errors +### BadNonce + +```solidity +error BadNonce(uint256 _space, uint256 _provided, uint256 _current); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleOnlyDelegatecall.sol/contract.ModuleOnlyDelegatecall.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleOnlyDelegatecall.sol/contract.ModuleOnlyDelegatecall.md new file mode 100644 index 000000000..3704b9fbd --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleOnlyDelegatecall.sol/contract.ModuleOnlyDelegatecall.md @@ -0,0 +1,36 @@ +# ModuleOnlyDelegatecall +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleOnlyDelegatecall.sol) + + +## State Variables +### self + +```solidity +address private immutable self +``` + + +## Functions +### constructor + + +```solidity +constructor() ; +``` + +### onlyDelegatecall + +Modifier that only allows functions to be called via delegatecall. + + +```solidity +modifier onlyDelegatecall() ; +``` + +## Errors +### OnlyDelegatecall + +```solidity +error OnlyDelegatecall(); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md new file mode 100644 index 000000000..03e4b8244 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md @@ -0,0 +1,19 @@ +# ModuleSelfAuth +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleSelfAuth.sol) + + +## Functions +### onlySelf + + +```solidity +modifier onlySelf() ; +``` + +## Errors +### OnlySelfAuth + +```solidity +error OnlySelfAuth(address _sender, address _self); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleStorage.sol/library.ModuleStorage.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleStorage.sol/library.ModuleStorage.md new file mode 100644 index 000000000..ecd0209c3 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleStorage.sol/library.ModuleStorage.md @@ -0,0 +1,33 @@ +# ModuleStorage +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleStorage.sol) + + +## Functions +### writeBytes32 + + +```solidity +function writeBytes32(bytes32 _key, bytes32 _val) internal; +``` + +### readBytes32 + + +```solidity +function readBytes32(bytes32 _key) internal view returns (bytes32 val); +``` + +### writeBytes32Map + + +```solidity +function writeBytes32Map(bytes32 _key, bytes32 _subKey, bytes32 _val) internal; +``` + +### readBytes32Map + + +```solidity +function readBytes32Map(bytes32 _key, bytes32 _subKey) internal view returns (bytes32 val); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleUpdate.sol/contract.ModuleUpdate.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleUpdate.sol/contract.ModuleUpdate.md new file mode 100644 index 000000000..91abdfdde --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/ModuleUpdate.sol/contract.ModuleUpdate.md @@ -0,0 +1,70 @@ +# ModuleUpdate +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/ModuleUpdate.sol) + +**Inherits:** +[IModuleUpdate](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleUpdate.sol/abstract.IModuleUpdate.md), [ModuleERC165](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleERC165.sol/abstract.ModuleERC165.md), [ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md), [Implementation](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/Implementation.sol/contract.Implementation.md) + + +## Functions +### updateImplementation + +Updates the implementation of the base wallet + +WARNING Updating the implementation can brick the wallet + + +```solidity +function updateImplementation(address _implementation) external virtual override onlySelf; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_implementation`|`address`|New main module implementation| + + +### _updateImplementation + +Updates the implementation of the base wallet, used internally. + +WARNING Updating the implementation can brick the wallet + + +```solidity +function _updateImplementation(address _implementation) internal virtual override; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_implementation`|`address`|New main module implementation| + + +### supportsInterface + +Query if a contract implements an interface + + +```solidity +function supportsInterface(bytes4 _interfaceID) public pure virtual override returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_interfaceID`|`bytes4`|The interface identifier, as specified in ERC-165| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|`true` if the contract implements `_interfaceID`| + + +## Events +### ImplementationUpdated + +```solidity +event ImplementationUpdated(address newImplementation); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/README.md new file mode 100644 index 000000000..59da91137 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/README.md @@ -0,0 +1,23 @@ + + +# Contents +- [gas-estimation](/contracts/modules/commons/gas-estimation) +- [interfaces](/contracts/modules/commons/interfaces) +- [submodules](/contracts/modules/commons/submodules) +- [Implementation](Implementation.sol/contract.Implementation.md) +- [ModuleAuth](ModuleAuth.sol/abstract.ModuleAuth.md) +- [ModuleAuthConvenience](ModuleAuthConvenience.sol/abstract.ModuleAuthConvenience.md) +- [ModuleAuthFixed](ModuleAuthFixed.sol/abstract.ModuleAuthFixed.md) +- [ModuleAuthUpgradable](ModuleAuthUpgradable.sol/abstract.ModuleAuthUpgradable.md) +- [ModuleCalls](ModuleCalls.sol/abstract.ModuleCalls.md) +- [ModuleCreator](ModuleCreator.sol/contract.ModuleCreator.md) +- [ModuleERC165](ModuleERC165.sol/abstract.ModuleERC165.md) +- [ModuleERC5719](ModuleERC5719.sol/contract.ModuleERC5719.md) +- [ModuleExtraAuth](ModuleExtraAuth.sol/abstract.ModuleExtraAuth.md) +- [ModuleHooks](ModuleHooks.sol/contract.ModuleHooks.md) +- [ModuleIPFS](ModuleIPFS.sol/contract.ModuleIPFS.md) +- [ModuleNonce](ModuleNonce.sol/contract.ModuleNonce.md) +- [ModuleOnlyDelegatecall](ModuleOnlyDelegatecall.sol/contract.ModuleOnlyDelegatecall.md) +- [ModuleSelfAuth](ModuleSelfAuth.sol/contract.ModuleSelfAuth.md) +- [ModuleStorage](ModuleStorage.sol/library.ModuleStorage.md) +- [ModuleUpdate](ModuleUpdate.sol/contract.ModuleUpdate.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol/abstract.ModuleIgnoreAuthUpgradable.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol/abstract.ModuleIgnoreAuthUpgradable.md new file mode 100644 index 000000000..d3da287bf --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol/abstract.ModuleIgnoreAuthUpgradable.md @@ -0,0 +1,32 @@ +# ModuleIgnoreAuthUpgradable +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/gas-estimation/ModuleIgnoreAuthUpgradable.sol) + +**Inherits:** +[ModuleAuthUpgradable](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleAuthUpgradable.sol/abstract.ModuleAuthUpgradable.md) + +Implements ModuleAuthUpgradable but ignores the validity of the signature +should only be used during gas estimation. + + +## Functions +### _isValidImage + +Removes the signature validation from the module, by returning true for any _imageHash + + +```solidity +function _isValidImage(bytes32 _imageHash) internal view virtual override(ModuleAuthUpgradable) returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|Hash image of signature| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|true always| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol/abstract.ModuleIgnoreNonceCalls.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol/abstract.ModuleIgnoreNonceCalls.md new file mode 100644 index 000000000..3895b32b2 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol/abstract.ModuleIgnoreNonceCalls.md @@ -0,0 +1,26 @@ +# ModuleIgnoreNonceCalls +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/gas-estimation/ModuleIgnoreNonceCalls.sol) + +**Inherits:** +[ModuleCalls](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleCalls.sol/abstract.ModuleCalls.md) + +Implements ModuleCalls but ignores the validity of the nonce +should only be used during gas estimation. + + +## Functions +### _validateNonce + +Verify if a nonce is valid + + +```solidity +function _validateNonce(uint256 _rawNonce) internal virtual override; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_rawNonce`|`uint256`|Nonce to validate (may contain an encoded space)| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/README.md new file mode 100644 index 000000000..5a5ea3ddc --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/gas-estimation/README.md @@ -0,0 +1,5 @@ + + +# Contents +- [ModuleIgnoreAuthUpgradable](ModuleIgnoreAuthUpgradable.sol/abstract.ModuleIgnoreAuthUpgradable.md) +- [ModuleIgnoreNonceCalls](ModuleIgnoreNonceCalls.sol/abstract.ModuleIgnoreNonceCalls.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuth.sol/abstract.IModuleAuth.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuth.sol/abstract.IModuleAuth.md new file mode 100644 index 000000000..7b62d2f9c --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuth.sol/abstract.IModuleAuth.md @@ -0,0 +1,101 @@ +# IModuleAuth +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/interfaces/IModuleAuth.sol) + + +## State Variables +### IMAGE_HASH_KEY + +```solidity +bytes32 internal constant IMAGE_HASH_KEY = + bytes32(0xea7157fa25e3aa17d0ae2d5280fa4e24d421c61842aa85e45194e1145aa72bf8) +``` + + +## Functions +### _signatureValidation + + +```solidity +function _signatureValidation(bytes32 _digest, bytes calldata _signature) + internal + view + virtual + returns (bool isValid, bytes32 subdigest); +``` + +### signatureRecovery + + +```solidity +function signatureRecovery(bytes32 _digest, bytes calldata _signature) + public + view + virtual + returns (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 checkpoint); +``` + +### _isValidImage + +Validates the signature image + + +```solidity +function _isValidImage(bytes32) internal view virtual returns (bool); +``` +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bool`|true if the signature image is valid| + + +### updateImageHash + +Updates the signers configuration of the wallet + + +```solidity +function updateImageHash(bytes32 _imageHash) external virtual; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|New required image hash of the signature| + + +### _updateImageHash + +Updates the signers configuration of the wallet + + +```solidity +function _updateImageHash(bytes32 _imageHash) internal virtual; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|New required image hash of the signature| + + +## Events +### ImageHashUpdated + +```solidity +event ImageHashUpdated(bytes32 newImageHash); +``` + +## Errors +### ImageHashIsZero + +```solidity +error ImageHashIsZero(); +``` + +### InvalidSignatureType + +```solidity +error InvalidSignatureType(bytes1 _type); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol/interface.IModuleAuthUpgradable.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol/interface.IModuleAuthUpgradable.md new file mode 100644 index 000000000..00f2551a1 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol/interface.IModuleAuthUpgradable.md @@ -0,0 +1,14 @@ +# IModuleAuthUpgradable +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/interfaces/IModuleAuthUpgradable.sol) + + +## Functions +### imageHash + +Returns the current image hash of the wallet + + +```solidity +function imageHash() external view returns (bytes32); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCalls.sol/interface.IModuleCalls.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCalls.sol/interface.IModuleCalls.md new file mode 100644 index 000000000..c27a52b38 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCalls.sol/interface.IModuleCalls.md @@ -0,0 +1,78 @@ +# IModuleCalls +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/interfaces/IModuleCalls.sol) + + +## Functions +### execute + +Allow wallet owner to execute an action + + +```solidity +function execute(Transaction[] calldata _txs, uint256 _nonce, bytes calldata _signature) external; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txs`|`Transaction[]`| Transactions to process| +|`_nonce`|`uint256`| Signature nonce (may contain an encoded space)| +|`_signature`|`bytes`| Encoded signature| + + +### selfExecute + +Allow wallet to execute an action +without signing the message + + +```solidity +function selfExecute(Transaction[] calldata _txs) external; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_txs`|`Transaction[]`| Transactions to execute| + + +## Events +### TxFailed + +```solidity +event TxFailed(bytes32 indexed _tx, uint256 _index, bytes _reason); +``` + +### TxExecuted + +```solidity +event TxExecuted(bytes32 indexed _tx, uint256 _index); +``` + +## Errors +### NotEnoughGas + +```solidity +error NotEnoughGas(uint256 _index, uint256 _requested, uint256 _available); +``` + +### InvalidSignature + +```solidity +error InvalidSignature(bytes32 _hash, bytes _signature); +``` + +## Structs +### Transaction + +```solidity +struct Transaction { + bool delegateCall; // Performs delegatecall + bool revertOnError; // Reverts transaction bundle if tx fails + uint256 gasLimit; // Maximum gas to be forwarded + address target; // Address of the contract to call + uint256 value; // Amount of ETH to pass with the call + bytes data; // calldata to pass +} +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCreator.sol/interface.IModuleCreator.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCreator.sol/interface.IModuleCreator.md new file mode 100644 index 000000000..1b9319007 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleCreator.sol/interface.IModuleCreator.md @@ -0,0 +1,33 @@ +# IModuleCreator +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/interfaces/IModuleCreator.sol) + + +## Functions +### createContract + +Creates a contract forwarding eth value + + +```solidity +function createContract(bytes calldata _code) external payable returns (address addr); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_code`|`bytes`|Creation code of the contract| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`addr`|`address`|The address of the created contract| + + +## Errors +### CreateFailed + +```solidity +error CreateFailed(bytes _code); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleHooks.sol/interface.IModuleHooks.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleHooks.sol/interface.IModuleHooks.md new file mode 100644 index 000000000..a1cc8907d --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleHooks.sol/interface.IModuleHooks.md @@ -0,0 +1,77 @@ +# IModuleHooks +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/interfaces/IModuleHooks.sol) + + +## Functions +### readHook + +Reads the implementation hook of a signature + + +```solidity +function readHook(bytes4 _signature) external view returns (address); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_signature`|`bytes4`|Signature function| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`address`|The address of the implementation hook, address(0) if none| + + +### addHook + +Adds a new hook to handle a given function selector + + +```solidity +function addHook(bytes4 _signature, address _implementation) external; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_signature`|`bytes4`|Signature function linked to the hook| +|`_implementation`|`address`|Hook implementation contract| + + +### removeHook + +Removes a registered hook + + +```solidity +function removeHook(bytes4 _signature) external; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_signature`|`bytes4`|Signature function linked to the hook| + + +## Events +### DefinedHook + +```solidity +event DefinedHook(bytes4 _signature, address _implementation); +``` + +## Errors +### HookAlreadyExists + +```solidity +error HookAlreadyExists(bytes4 _signature); +``` + +### HookDoesNotExist + +```solidity +error HookDoesNotExist(bytes4 _signature); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleUpdate.sol/abstract.IModuleUpdate.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleUpdate.sol/abstract.IModuleUpdate.md new file mode 100644 index 000000000..5a8be6f24 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleUpdate.sol/abstract.IModuleUpdate.md @@ -0,0 +1,46 @@ +# IModuleUpdate +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/interfaces/IModuleUpdate.sol) + + +## Functions +### updateImplementation + +Updates the implementation of the base wallet + +WARNING Updating the implementation can brick the wallet + + +```solidity +function updateImplementation(address _implementation) external virtual; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_implementation`|`address`|New main module implementation| + + +### _updateImplementation + +Updates the implementation of the base wallet, used internally. + +WARNING Updating the implementation can brick the wallet + + +```solidity +function _updateImplementation(address _implementation) internal virtual; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_implementation`|`address`|New main module implementation| + + +## Errors +### InvalidImplementation + +```solidity +error InvalidImplementation(address _implementation); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/README.md new file mode 100644 index 000000000..c23c87411 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/interfaces/README.md @@ -0,0 +1,9 @@ + + +# Contents +- [IModuleAuth](IModuleAuth.sol/abstract.IModuleAuth.md) +- [IModuleAuthUpgradable](IModuleAuthUpgradable.sol/interface.IModuleAuthUpgradable.md) +- [IModuleCalls](IModuleCalls.sol/interface.IModuleCalls.md) +- [IModuleCreator](IModuleCreator.sol/interface.IModuleCreator.md) +- [IModuleHooks](IModuleHooks.sol/interface.IModuleHooks.md) +- [IModuleUpdate](IModuleUpdate.sol/abstract.IModuleUpdate.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/README.md new file mode 100644 index 000000000..86110985f --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/README.md @@ -0,0 +1,5 @@ + + +# Contents +- [auth](/contracts/modules/commons/submodules/auth) +- [nonce](/contracts/modules/commons/submodules/nonce) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/README.md new file mode 100644 index 000000000..c19a5f59a --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/README.md @@ -0,0 +1,7 @@ + + +# Contents +- [SequenceBaseSig](SequenceBaseSig.sol/library.SequenceBaseSig.md) +- [SequenceChainedSig](SequenceChainedSig.sol/abstract.SequenceChainedSig.md) +- [SequenceDynamicSig](SequenceDynamicSig.sol/library.SequenceDynamicSig.md) +- [SequenceNoChainIdSig](SequenceNoChainIdSig.sol/library.SequenceNoChainIdSig.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol/library.SequenceBaseSig.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol/library.SequenceBaseSig.md new file mode 100644 index 000000000..73d8121a1 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol/library.SequenceBaseSig.md @@ -0,0 +1,225 @@ +# SequenceBaseSig +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/submodules/auth/SequenceBaseSig.sol) + +**Author:** +Agustin Aguilar (aa@horizon.io) + +A Solidity implementation for handling signatures in the Sequence protocol. + + +## State Variables +### FLAG_SIGNATURE + +```solidity +uint256 internal constant FLAG_SIGNATURE = 0 +``` + + +### FLAG_ADDRESS + +```solidity +uint256 internal constant FLAG_ADDRESS = 1 +``` + + +### FLAG_DYNAMIC_SIGNATURE + +```solidity +uint256 internal constant FLAG_DYNAMIC_SIGNATURE = 2 +``` + + +### FLAG_NODE + +```solidity +uint256 internal constant FLAG_NODE = 3 +``` + + +### FLAG_BRANCH + +```solidity +uint256 internal constant FLAG_BRANCH = 4 +``` + + +### FLAG_SUBDIGEST + +```solidity +uint256 internal constant FLAG_SUBDIGEST = 5 +``` + + +### FLAG_NESTED + +```solidity +uint256 internal constant FLAG_NESTED = 6 +``` + + +## Functions +### subdigest + +Generates a subdigest for the input digest (unique for this wallet and network). + + +```solidity +function subdigest(bytes32 _digest) internal view returns (bytes32); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_digest`|`bytes32`|The input digest to generate the subdigest from.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes32`|bytes32 The subdigest generated from the input digest.| + + +### _leafForAddressAndWeight + +Generates the leaf for an address and weight. + +The leaf is generated by concatenating the address and weight. + + +```solidity +function _leafForAddressAndWeight(address _addr, uint96 _weight) internal pure returns (bytes32); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_addr`|`address`|The address to generate the leaf for.| +|`_weight`|`uint96`|The weight to generate the leaf for.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes32`|bytes32 The leaf generated from the address and weight.| + + +### _leafForHardcodedSubdigest + +Generates the leaf for a hardcoded subdigest. + +The leaf is generated by hashing 'Sequence static digest:\n' and the subdigest. + + +```solidity +function _leafForHardcodedSubdigest(bytes32 _subdigest) internal pure returns (bytes32); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_subdigest`|`bytes32`|The subdigest to generate the leaf for.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes32`|bytes32 The leaf generated from the hardcoded subdigest.| + + +### _leafForNested + +Generates the leaf for a nested tree node. + +The leaf is generated by hashing 'Sequence nested config:\n', the node, the threshold and the weight. + + +```solidity +function _leafForNested(bytes32 _node, uint256 _threshold, uint256 _weight) internal pure returns (bytes32); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_node`|`bytes32`|The root of the node to generate the leaf for.| +|`_threshold`|`uint256`|The internal threshold of the tree.| +|`_weight`|`uint256`|The external weight of the tree.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes32`|bytes32 The leaf generated from the nested tree.| + + +### recoverBranch + +Returns the weight and root of a signature branch. + +If the signature contains a hardcoded subdigest, and it matches the input digest, then the weight is set to 2 ** 256 - 1. + + +```solidity +function recoverBranch(bytes32 _subdigest, bytes calldata _signature) + internal + view + returns (uint256 weight, bytes32 root); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_subdigest`|`bytes32`|The digest to verify the signature against.| +|`_signature`|`bytes`|The signature branch to recover.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`weight`|`uint256`|The total weight of the recovered signatures.| +|`root`|`bytes32`|The root hash of the recovered configuration.| + + +### recover + +Returns the threshold, weight, root, and checkpoint of a signature. + +To verify the signature, the weight must be greater than or equal to the threshold, and the root +must match the expected `imageHash` of the wallet. + + +```solidity +function recover(bytes32 _subdigest, bytes calldata _signature) + internal + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, uint256 checkpoint); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_subdigest`|`bytes32`|The digest to verify the signature against.| +|`_signature`|`bytes`|The signature to recover.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`threshold`|`uint256`|The minimum weight required for the signature to be valid.| +|`weight`|`uint256`|The total weight of the recovered signatures.| +|`imageHash`|`bytes32`|The root hash of the recovered configuration| +|`checkpoint`|`uint256`|The checkpoint of the signature.| + + +## Errors +### InvalidNestedSignature + +```solidity +error InvalidNestedSignature(bytes32 _hash, address _addr, bytes _signature); +``` + +### InvalidSignatureFlag + +```solidity +error InvalidSignatureFlag(uint256 _flag); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol/abstract.SequenceChainedSig.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol/abstract.SequenceChainedSig.md new file mode 100644 index 000000000..299493ce3 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol/abstract.SequenceChainedSig.md @@ -0,0 +1,91 @@ +# SequenceChainedSig +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/submodules/auth/SequenceChainedSig.sol) + +**Inherits:** +[IModuleAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/interfaces/IModuleAuth.sol/abstract.IModuleAuth.md), [ModuleSelfAuth](/home/dargon789/wallet-contracts/docs/src/contracts/modules/commons/ModuleSelfAuth.sol/contract.ModuleSelfAuth.md) + +**Author:** +Agustin Aguilar (aa@horizon.io) + +Defines Sequence signatures that work by delegating control to new configurations. + +The delegations can be chained together, the first signature is the one that is used to validate +the message, the last signature must match the current on-chain configuration of the wallet. + + +## State Variables +### SET_IMAGE_HASH_TYPE_HASH + +```solidity +bytes32 public constant SET_IMAGE_HASH_TYPE_HASH = keccak256("SetImageHash(bytes32 imageHash)") +``` + + +## Functions +### _hashSetImageHashStruct + +Defined the special token that must be signed to delegate control to a new configuration. + + +```solidity +function _hashSetImageHashStruct(bytes32 _imageHash) internal pure returns (bytes32); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_imageHash`|`bytes32`|The hash of the new configuration.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes32`|bytes32 The message hash to be signed.| + + +### chainedRecover + +Returns the threshold, weight, root, and checkpoint of a (chained) signature. + +This method return the `threshold`, `weight` and `imageHash` of the last signature in the chain. +Intermediate signatures are validated directly in this method. The `subdigest` is the one of the +first signature in the chain (since that's the one that is used to validate the message). + + +```solidity +function chainedRecover(bytes32 _digest, bytes calldata _signature) + internal + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 checkpoint); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_digest`|`bytes32`|The digest to recover the signature from.| +|`_signature`|`bytes`|The signature to recover.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`threshold`|`uint256`|The threshold of the (last) signature.| +|`weight`|`uint256`|The weight of the (last) signature.| +|`imageHash`|`bytes32`|The image hash of the (last) signature.| +|`subdigest`|`bytes32`|The subdigest of the (first) signature in the chain.| +|`checkpoint`|`uint256`|The checkpoint of the (last) signature.| + + +## Errors +### LowWeightChainedSignature + +```solidity +error LowWeightChainedSignature(bytes _signature, uint256 threshold, uint256 _weight); +``` + +### WrongChainedCheckpointOrder + +```solidity +error WrongChainedCheckpointOrder(uint256 _current, uint256 _prev); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol/library.SequenceDynamicSig.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol/library.SequenceDynamicSig.md new file mode 100644 index 000000000..9fe9b4a99 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol/library.SequenceDynamicSig.md @@ -0,0 +1,35 @@ +# SequenceDynamicSig +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol) + + +## Functions +### recover + +Recover a "dynamically encoded" Sequence signature. + +The Signature is stripped of the first byte, which is the encoding flag. + + +```solidity +function recover(bytes32 _subdigest, bytes calldata _signature) + internal + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, uint256 checkpoint); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_subdigest`|`bytes32`|The digest of the signature.| +|`_signature`|`bytes`|The Sequence signature.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`threshold`|`uint256`|The threshold weight required to validate the signature.| +|`weight`|`uint256`|The weight of the signature.| +|`imageHash`|`bytes32`|The hash of the recovered configuration.| +|`checkpoint`|`uint256`|The checkpoint of the configuration.| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol/library.SequenceNoChainIdSig.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol/library.SequenceNoChainIdSig.md new file mode 100644 index 000000000..b0cc788ea --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol/library.SequenceNoChainIdSig.md @@ -0,0 +1,28 @@ +# SequenceNoChainIdSig +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol) + + +## Functions +### subdigest + +Computes a subdigest for a Sequence signature that works on all chains. + +The subdigest is computed by removing the chain ID from the digest (using 0 instead). + + +```solidity +function subdigest(bytes32 _digest) internal view returns (bytes32); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_digest`|`bytes32`|The digest of the chain of signatures.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`bytes32`|bytes32 The subdigest with no chain ID.| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/nonce/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/nonce/README.md new file mode 100644 index 000000000..fe84b67ce --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/nonce/README.md @@ -0,0 +1,4 @@ + + +# Contents +- [SubModuleNonce](SubModuleNonce.sol/library.SubModuleNonce.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol/library.SubModuleNonce.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol/library.SubModuleNonce.md new file mode 100644 index 000000000..0f65c75a9 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol/library.SubModuleNonce.md @@ -0,0 +1,51 @@ +# SubModuleNonce +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/commons/submodules/nonce/SubModuleNonce.sol) + + +## State Variables +### NONCE_BITS + +```solidity +uint256 internal constant NONCE_BITS = 96 +``` + + +### NONCE_MASK + +```solidity +bytes32 internal constant NONCE_MASK = bytes32(uint256(type(uint96).max)) +``` + + +## Functions +### decodeNonce + +Decodes a raw nonce + +Schema: space[160]:type[96] + + +```solidity +function decodeNonce(uint256 _rawNonce) internal pure returns (uint256 _space, uint256 _nonce); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_rawNonce`|`uint256`|Nonce to be decoded| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`_space`|`uint256`|The nonce space of the raw nonce| +|`_nonce`|`uint256`|The nonce of the raw nonce| + + +### encodeNonce + + +```solidity +function encodeNonce(uint256 _space, uint256 _nonce) internal pure returns (uint256); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/GasEstimator.sol/contract.GasEstimator.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/GasEstimator.sol/contract.GasEstimator.md new file mode 100644 index 000000000..6e07e6de1 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/GasEstimator.sol/contract.GasEstimator.md @@ -0,0 +1,14 @@ +# GasEstimator +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/utils/GasEstimator.sol) + + +## Functions +### estimate + + +```solidity +function estimate(address _to, bytes calldata _data) + external + returns (bool success, bytes memory result, uint256 gas); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/MultiCallUtils.sol/contract.MultiCallUtils.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/MultiCallUtils.sol/contract.MultiCallUtils.md new file mode 100644 index 000000000..7dcf5e935 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/MultiCallUtils.sol/contract.MultiCallUtils.md @@ -0,0 +1,133 @@ +# MultiCallUtils +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/utils/MultiCallUtils.sol) + + +## Functions +### multiCall + + +```solidity +function multiCall(IModuleCalls.Transaction[] memory _txs) + public + payable + returns (bool[] memory _successes, bytes[] memory _results); +``` + +### callBlockhash + + +```solidity +function callBlockhash(uint256 _i) external view returns (bytes32); +``` + +### callCoinbase + + +```solidity +function callCoinbase() external view returns (address); +``` + +### callDifficulty + + +```solidity +function callDifficulty() external view returns (uint256); +``` + +### callPrevrandao + + +```solidity +function callPrevrandao() external view returns (uint256); +``` + +### callGasLimit + + +```solidity +function callGasLimit() external view returns (uint256); +``` + +### callBlockNumber + + +```solidity +function callBlockNumber() external view returns (uint256); +``` + +### callTimestamp + + +```solidity +function callTimestamp() external view returns (uint256); +``` + +### callGasLeft + + +```solidity +function callGasLeft() external view returns (uint256); +``` + +### callGasPrice + + +```solidity +function callGasPrice() external view returns (uint256); +``` + +### callOrigin + + +```solidity +function callOrigin() external view returns (address); +``` + +### callBalanceOf + + +```solidity +function callBalanceOf(address _addr) external view returns (uint256); +``` + +### callCodeSize + + +```solidity +function callCodeSize(address _addr) external view returns (uint256 size); +``` + +### callCode + + +```solidity +function callCode(address _addr) external view returns (bytes memory code); +``` + +### callCodeHash + + +```solidity +function callCodeHash(address _addr) external view returns (bytes32 codeHash); +``` + +### callChainId + + +```solidity +function callChainId() external view returns (uint256 id); +``` + +## Errors +### DelegateCallNotAllowed + +```solidity +error DelegateCallNotAllowed(uint256 _index); +``` + +### CallReverted + +```solidity +error CallReverted(uint256 _index, bytes _result); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/README.md new file mode 100644 index 000000000..2e46e3c6a --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/README.md @@ -0,0 +1,7 @@ + + +# Contents +- [GasEstimator](GasEstimator.sol/contract.GasEstimator.md) +- [MultiCallUtils](MultiCallUtils.sol/contract.MultiCallUtils.md) +- [RequireUtils](RequireUtils.sol/contract.RequireUtils.md) +- [SequenceUtils](SequenceUtils.sol/contract.SequenceUtils.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/RequireUtils.sol/contract.RequireUtils.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/RequireUtils.sol/contract.RequireUtils.md new file mode 100644 index 000000000..fb8ff96cb --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/RequireUtils.sol/contract.RequireUtils.md @@ -0,0 +1,149 @@ +# RequireUtils +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/utils/RequireUtils.sol) + + +## Functions +### requireNonExpired + +Validates that a given expiration hasn't expired + +Used as an optional transaction on a Sequence batch, to create expirable transactions. + + +```solidity +function requireNonExpired(uint256 _expiration) external view; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_expiration`|`uint256`| Expiration to check| + + +### requireMinNonce + +Validates that a given wallet has reached a given nonce + +Used as an optional transaction on a Sequence batch, to define transaction execution order + + +```solidity +function requireMinNonce(address _wallet, uint256 _nonce) external view; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_wallet`|`address`|Sequence wallet| +|`_nonce`|`uint256`| Required nonce| + + +### requireMinERC20Balance + +Validates that a wallet has a minimum ERC20 token balance + + +```solidity +function requireMinERC20Balance(address _token, address _wallet, uint256 _minBalance) external view; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_token`|`address`|ERC20 token address| +|`_wallet`|`address`|Sequence wallet| +|`_minBalance`|`uint256`|Minimum required balance| + + +### requireMinERC20Allowance + +Validates that a wallet has a minimum ERC20 allowance for a spender + + +```solidity +function requireMinERC20Allowance(address _token, address _owner, address _spender, uint256 _minAllowance) + external + view; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_token`|`address`|ERC20 token address| +|`_owner`|`address`|Sequence wallet| +|`_spender`|`address`|Address allowed to spend the tokens| +|`_minAllowance`|`uint256`|Minimum required allowance| + + +### requireERC721Ownership + +Validates that a wallet owns a specific ERC721 token + + +```solidity +function requireERC721Ownership(address _token, address _wallet, uint256 _tokenId) external view; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_token`|`address`|ERC721 token address| +|`_wallet`|`address`|Sequence wallet| +|`_tokenId`|`uint256`|Token ID to check for ownership| + + +### requireERC721Approval + +Validates that an ERC721 token is approved for a specific spender + + +```solidity +function requireERC721Approval(address _token, address _owner, address _spender, uint256 _tokenId) external view; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_token`|`address`|ERC721 token address| +|`_owner`|`address`|Sequence wallet| +|`_spender`|`address`|Address that should have approval| +|`_tokenId`|`uint256`|Token ID to check for approval| + + +### requireMinERC1155Balance + +Validates that a wallet has a minimum balance of an ERC1155 token + + +```solidity +function requireMinERC1155Balance(address _token, address _wallet, uint256 _tokenId, uint256 _minBalance) + external + view; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_token`|`address`|ERC1155 token address| +|`_wallet`|`address`|Sequence wallet| +|`_tokenId`|`uint256`|Token ID to check| +|`_minBalance`|`uint256`|Minimum required balance| + + +### requireERC1155Approval + +Validates that an ERC1155 token is approved for a specific operator + + +```solidity +function requireERC1155Approval(address _token, address _owner, address _operator) external view; +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_token`|`address`|ERC1155 token address| +|`_owner`|`address`|Sequence wallet| +|`_operator`|`address`|Address that should have operator approval| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/SequenceUtils.sol/contract.SequenceUtils.md b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/SequenceUtils.sol/contract.SequenceUtils.md new file mode 100644 index 000000000..f91b8e21c --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/modules/utils/SequenceUtils.sol/contract.SequenceUtils.md @@ -0,0 +1,7 @@ +# SequenceUtils +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/modules/utils/SequenceUtils.sol) + +**Inherits:** +[MultiCallUtils](/home/dargon789/wallet-contracts/docs/src/contracts/modules/utils/MultiCallUtils.sol/contract.MultiCallUtils.md), [RequireUtils](/home/dargon789/wallet-contracts/docs/src/contracts/modules/utils/RequireUtils.sol/contract.RequireUtils.md) + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/trust/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/trust/README.md new file mode 100644 index 000000000..4252abd93 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/trust/README.md @@ -0,0 +1,6 @@ + + +# Contents +- [Trust](Trust.sol/contract.Trust.md) +- [absDiff](Trust.sol/function.absDiff.md) +- [TrustFactory](TrustFactory.sol/contract.TrustFactory.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/trust/Trust.sol/contract.Trust.md b/packages/wallet/wallet-contracts/docs/src/contracts/trust/Trust.sol/contract.Trust.md new file mode 100644 index 000000000..ed6d43c6f --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/trust/Trust.sol/contract.Trust.md @@ -0,0 +1,186 @@ +# Trust +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/trust/Trust.sol) + +**Inherits:** +[IERC1271Wallet](/home/dargon789/wallet-contracts/docs/src/contracts/interfaces/IERC1271Wallet.sol/interface.IERC1271Wallet.md) + + +## State Variables +### owner + +```solidity +address public immutable owner +``` + + +### beneficiary + +```solidity +address public immutable beneficiary +``` + + +### duration + +```solidity +uint256 public immutable duration +``` + + +### unlocksAt + +```solidity +uint256 public unlocksAt = type(uint256).max +``` + + +### SELECTOR_ERC1271_BYTES_BYTES + +```solidity +bytes4 internal constant SELECTOR_ERC1271_BYTES_BYTES = 0x20c13b0b +``` + + +### SELECTOR_ERC1271_BYTES32_BYTES + +```solidity +bytes4 internal constant SELECTOR_ERC1271_BYTES32_BYTES = 0x1626ba7e +``` + + +## Functions +### constructor + + +```solidity +constructor(address _owner, address _beneficiary, uint256 _duration) ; +``` + +### onlyAllowed + + +```solidity +modifier onlyAllowed() ; +``` + +### onlyMember + + +```solidity +modifier onlyMember() ; +``` + +### isLocked + + +```solidity +function isLocked() public view returns (bool); +``` + +### setUnlocksAt + + +```solidity +function setUnlocksAt(uint256 _unlocksAt) external onlyMember; +``` + +### sendTransaction + + +```solidity +function sendTransaction(address payable _to, uint256 _value, bytes calldata _data) + external + onlyAllowed + returns (bytes memory); +``` + +### isValidSignature + + +```solidity +function isValidSignature(bytes calldata _data, bytes calldata _signature) external view returns (bytes4); +``` + +### isValidSignature + + +```solidity +function isValidSignature(bytes32 _hash, bytes calldata _signature) external view returns (bytes4); +``` + +### receive + + +```solidity +receive() external payable; +``` + +### fallback + + +```solidity +fallback() external payable; +``` + +## Events +### SetUnlocksAt + +```solidity +event SetUnlocksAt(uint256 _unlocksAt); +``` + +### SentTransaction + +```solidity +event SentTransaction(address payable _to, uint256 _value, bytes _data, bytes _result); +``` + +## Errors +### UnlockInThePast + +```solidity +error UnlockInThePast(uint256 _unlocksAt, uint256 _elapsed); +``` + +### UnlockTooEarly + +```solidity +error UnlockTooEarly(uint256 _unlocksAt, uint256 _diff); +``` + +### NotOwner + +```solidity +error NotOwner(address _sender); +``` + +### NotUnlocked + +```solidity +error NotUnlocked(uint256 _unlocksAt); +``` + +### FailedTransaction + +```solidity +error FailedTransaction(address payable _to, uint256 _value, bytes _data, bytes _result); +``` + +### EmptySignature + +```solidity +error EmptySignature(); +``` + +### InvalidSignatureFlag + +```solidity +error InvalidSignatureFlag(bytes _signature, bytes1 _flag); +``` + +### InvalidSignature + +```solidity +error InvalidSignature(bytes32 _hash, bytes32 _rehash, address _signer, bytes _signature); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/trust/Trust.sol/function.absDiff.md b/packages/wallet/wallet-contracts/docs/src/contracts/trust/Trust.sol/function.absDiff.md new file mode 100644 index 000000000..97adf7e8f --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/trust/Trust.sol/function.absDiff.md @@ -0,0 +1,8 @@ +# absDiff +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/trust/Trust.sol) + + +```solidity +function absDiff(uint256 a, uint256 b) pure returns (bool, uint256); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/trust/TrustFactory.sol/contract.TrustFactory.md b/packages/wallet/wallet-contracts/docs/src/contracts/trust/TrustFactory.sol/contract.TrustFactory.md new file mode 100644 index 000000000..8f92c5125 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/trust/TrustFactory.sol/contract.TrustFactory.md @@ -0,0 +1,26 @@ +# TrustFactory +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/trust/TrustFactory.sol) + + +## Functions +### trustCreationCode + + +```solidity +function trustCreationCode() external pure returns (bytes memory); +``` + +### addressOf + + +```solidity +function addressOf(address _owner, address _beneficiary, uint256 _duration) external view returns (address); +``` + +### deploy + + +```solidity +function deploy(address _owner, address _beneficiary, uint256 _duration) external returns (Trust); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibAddress.sol/library.LibAddress.md b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibAddress.sol/library.LibAddress.md new file mode 100644 index 000000000..f39aeb899 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibAddress.sol/library.LibAddress.md @@ -0,0 +1,23 @@ +# LibAddress +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/utils/LibAddress.sol) + + +## Functions +### isContract + +Will return true if provided address is a contract + +This contract will return false if called within the constructor of +a contract's deployment, as the code is not yet stored on-chain. + + +```solidity +function isContract(address account) internal view returns (bool); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`account`|`address`|Address to verify if contract or not| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibBytes.sol/library.LibBytes.md b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibBytes.sol/library.LibBytes.md new file mode 100644 index 000000000..4daa0b35a --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibBytes.sol/library.LibBytes.md @@ -0,0 +1,114 @@ +# LibBytes +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/utils/LibBytes.sol) + +**Author:** +Agustin Aguilar (aa@horizon.io) + +This library contains functions for reading data from bytes arrays. + +These functions do not check if the input index is within the bounds of the data array. +Reading out of bounds may return dirty values. + + +## Functions +### readBytes32 + +Returns the bytes32 value at the given index in the input data. + + +```solidity +function readBytes32(bytes calldata data, uint256 index) internal pure returns (bytes32 a); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`data`|`bytes`|The input data.| +|`index`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`bytes32`|The bytes32 value at the given index.| + + +### readUint8 + +Returns the uint8 value at the given index in the input data. + + +```solidity +function readUint8(bytes calldata data, uint256 index) internal pure returns (uint8 a); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`data`|`bytes`|The input data.| +|`index`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint8`|The uint8 value at the given index.| + + +### readFirstUint16 + +Returns the first uint16 value in the input data. + + +```solidity +function readFirstUint16(bytes calldata data) internal pure returns (uint16 a); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`data`|`bytes`|The input data.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint16`|The first uint16 value in the input data.| + + +### readUint32 + +Returns the uint32 value at the given index in the input data. + + +```solidity +function readUint32(bytes calldata data, uint256 index) internal pure returns (uint32 a); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`data`|`bytes`|The input data.| +|`index`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint32`|The uint32 value at the given index.| + + +### readMBytes4 + + +```solidity +function readMBytes4(bytes memory data, uint256 index) internal pure returns (bytes4 a); +``` + +### readMBytes32 + + +```solidity +function readMBytes32(bytes memory data, uint256 index) internal pure returns (bytes32 a); +``` + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibBytesPointer.sol/library.LibBytesPointer.md b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibBytesPointer.sol/library.LibBytesPointer.md new file mode 100644 index 000000000..3ba4bd7a0 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibBytesPointer.sol/library.LibBytesPointer.md @@ -0,0 +1,201 @@ +# LibBytesPointer +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/utils/LibBytesPointer.sol) + +**Author:** +Agustin Aguilar (aa@horizon.io) + +This library contains functions for reading data from bytes arrays with a pointer. + +These functions do not check if the input index is within the bounds of the data array. +Reading out of bounds may return dirty values. + + +## Functions +### readFirstUint16 + +Returns the first uint16 value in the input data and updates the pointer. + + +```solidity +function readFirstUint16(bytes calldata _data) internal pure returns (uint16 a, uint256 newPointer); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`|The input data.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint16`|The first uint16 value.| +|`newPointer`|`uint256`|The new pointer.| + + +### readUint8 + +Returns the uint8 value at the given index in the input data and updates the pointer. + + +```solidity +function readUint8(bytes calldata _data, uint256 _index) internal pure returns (uint8 a, uint256 newPointer); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`|The input data.| +|`_index`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint8`|The uint8 value at the given index.| +|`newPointer`|`uint256`|The new pointer.| + + +### readAddress + + +```solidity +function readAddress(bytes calldata _data, uint256 _index) internal pure returns (address a, uint256 newPointer); +``` + +### readUint8Address + +Returns the uint8 value and the address at the given index in the input data and updates the pointer. + + +```solidity +function readUint8Address(bytes calldata _data, uint256 _index) + internal + pure + returns (uint8 a, address b, uint256 newPointer); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`|The input data.| +|`_index`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint8`|The uint8 value at the given index.| +|`b`|`address`|The following address value.| +|`newPointer`|`uint256`|The new pointer.| + + +### readUint16 + +Returns the uint16 value at the given index in the input data and updates the pointer. + + +```solidity +function readUint16(bytes calldata _data, uint256 _index) internal pure returns (uint16 a, uint256 newPointer); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`|The input data.| +|`_index`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint16`|The uint16 value at the given index.| +|`newPointer`|`uint256`|The new pointer.| + + +### readUintX + + +```solidity +function readUintX(bytes calldata _data, uint256 _bytes, uint256 _index) + internal + pure + returns (uint256 a, uint256 newPointer); +``` + +### readUint24 + +Returns the uint24 value at the given index in the input data and updates the pointer. + + +```solidity +function readUint24(bytes calldata _data, uint256 _index) internal pure returns (uint24 a, uint256 newPointer); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`|The input data.| +|`_index`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint24`|The uint24 value at the given index.| +|`newPointer`|`uint256`|The new pointer.| + + +### readUint64 + +Returns the uint64 value at the given index in the input data and updates the pointer. + + +```solidity +function readUint64(bytes calldata _data, uint256 _index) internal pure returns (uint64 a, uint256 newPointer); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`|The input data.| +|`_index`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`uint64`|The uint64 value at the given index.| +|`newPointer`|`uint256`|The new pointer.| + + +### readBytes4 + + +```solidity +function readBytes4(bytes calldata _data, uint256 _pointer) internal pure returns (bytes4 a, uint256 newPointer); +``` + +### readBytes32 + +Returns the bytes32 value at the given index in the input data and updates the pointer. + + +```solidity +function readBytes32(bytes calldata _data, uint256 _pointer) internal pure returns (bytes32 a, uint256 newPointer); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_data`|`bytes`|The input data.| +|`_pointer`|`uint256`|The index of the value to retrieve.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`a`|`bytes32`|The bytes32 value at the given index.| +|`newPointer`|`uint256`|The new pointer.| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibOptim.sol/library.LibOptim.md b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibOptim.sol/library.LibOptim.md new file mode 100644 index 000000000..3c5aa6bba --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibOptim.sol/library.LibOptim.md @@ -0,0 +1,100 @@ +# LibOptim +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/utils/LibOptim.sol) + +**Author:** +Agustin Aguilar (aa@horizon.io) + +This library contains functions for optimizing certain EVM operations. + + +## Functions +### fkeccak256 + +Computes the keccak256 hash of two 32-byte inputs. + +It uses only scratch memory space. + + +```solidity +function fkeccak256(bytes32 _a, bytes32 _b) internal pure returns (bytes32 c); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_a`|`bytes32`|The first 32 bytes of the hash.| +|`_b`|`bytes32`|The second 32 bytes of the hash.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`c`|`bytes32`|The keccak256 hash of the two 32-byte inputs.| + + +### returnData + +Returns the return data from the last call. + + +```solidity +function returnData() internal pure returns (bytes memory r); +``` +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`r`|`bytes`|The return data from the last call.| + + +### call + +Calls another contract with the given parameters. + +This method doesn't increase the memory pointer. + + +```solidity +function call(address _to, uint256 _val, uint256 _gas, bytes calldata _data) internal returns (bool r); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_to`|`address`|The address of the contract to call.| +|`_val`|`uint256`|The value to send to the contract.| +|`_gas`|`uint256`|The amount of gas to provide for the call.| +|`_data`|`bytes`|The data to send to the contract.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`r`|`bool`|The success status of the call.| + + +### delegatecall + +Calls another contract with the given parameters, using delegatecall. + +This method doesn't increase the memory pointer. + + +```solidity +function delegatecall(address _to, uint256 _gas, bytes calldata _data) internal returns (bool r); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_to`|`address`|The address of the contract to call.| +|`_gas`|`uint256`|The amount of gas to provide for the call.| +|`_data`|`bytes`|The data to send to the contract.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|`r`|`bool`|The success status of the call.| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibString.sol/library.LibString.md b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibString.sol/library.LibString.md new file mode 100644 index 000000000..9dfccb637 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/utils/LibString.sol/library.LibString.md @@ -0,0 +1,106 @@ +# LibString +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/utils/LibString.sol) + +This library contains functions for manipulating strings in Solidity. + + +## State Variables +### ALPHABET_HEX_16 + +```solidity +bytes private constant ALPHABET_HEX_16 = "0123456789abcdef" +``` + + +### ALPHABET_32 + +```solidity +bytes private constant ALPHABET_32 = "abcdefghijklmnopqrstuvwxyz234567" +``` + + +## Functions +### prefixHexadecimal + +Prefixes a hexadecimal string with "0x". + + +```solidity +function prefixHexadecimal(string memory _hex) internal pure returns (string memory); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_hex`|`string`|The hexadecimal string to prefix.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`string`|The prefixed hexadecimal string.| + + +### prefixBase32 + +Prefixes a base32 string with "b". + + +```solidity +function prefixBase32(string memory _base32) internal pure returns (string memory); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_base32`|`string`|The base32 string to prefix.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`string`|The prefixed base32 string.| + + +### bytesToHexadecimal + +Converts a byte array to a hexadecimal string. + + +```solidity +function bytesToHexadecimal(bytes memory _bytes) internal pure returns (string memory); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_bytes`|`bytes`|The byte array to convert.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`string`|The resulting hexadecimal string.| + + +### bytesToBase32 + +Converts a byte array to a base32 string. + + +```solidity +function bytesToBase32(bytes memory _bytes) internal pure returns (string memory); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_bytes`|`bytes`|The byte array to convert.| + +**Returns** + +|Name|Type|Description| +|----|----|-----------| +|``|`string`|The resulting base32 string.| + + diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/utils/README.md b/packages/wallet/wallet-contracts/docs/src/contracts/utils/README.md new file mode 100644 index 000000000..43a6ef477 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/utils/README.md @@ -0,0 +1,9 @@ + + +# Contents +- [LibAddress](LibAddress.sol/library.LibAddress.md) +- [LibBytes](LibBytes.sol/library.LibBytes.md) +- [LibBytesPointer](LibBytesPointer.sol/library.LibBytesPointer.md) +- [LibOptim](LibOptim.sol/library.LibOptim.md) +- [LibString](LibString.sol/library.LibString.md) +- [SignatureValidator](SignatureValidator.sol/library.SignatureValidator.md) diff --git a/packages/wallet/wallet-contracts/docs/src/contracts/utils/SignatureValidator.sol/library.SignatureValidator.md b/packages/wallet/wallet-contracts/docs/src/contracts/utils/SignatureValidator.sol/library.SignatureValidator.md new file mode 100644 index 000000000..42767e446 --- /dev/null +++ b/packages/wallet/wallet-contracts/docs/src/contracts/utils/SignatureValidator.sol/library.SignatureValidator.md @@ -0,0 +1,130 @@ +# SignatureValidator +[Git Source](https://github.com/0xsequence/wallet-contracts/blob/09c54e74c2803b55df32c0470f8b0e0ebe86f4c9/contracts/utils/SignatureValidator.sol) + +Contains logic for signature validation. +Signatures from wallet contracts assume ERC-1271 support (https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1271.md) +Notes: Methods are strongly inspired by contracts in https://github.com/0xProject/0x-monorepo/blob/development/ + + +## State Variables +### ERC1271_MAGICVALUE +| +| Variables | +|__________________________________ + + +```solidity +bytes4 internal constant ERC1271_MAGICVALUE = 0x20c13b0b +``` + + +### ERC1271_MAGICVALUE_BYTES32 + +```solidity +bytes4 internal constant ERC1271_MAGICVALUE_BYTES32 = 0x1626ba7e +``` + + +### SIG_TYPE_EIP712 + +```solidity +uint256 private constant SIG_TYPE_EIP712 = 1 +``` + + +### SIG_TYPE_ETH_SIGN + +```solidity +uint256 private constant SIG_TYPE_ETH_SIGN = 2 +``` + + +### SIG_TYPE_WALLET_BYTES32 + +```solidity +uint256 private constant SIG_TYPE_WALLET_BYTES32 = 3 +``` + + +## Functions +### recoverSigner + +| +| Signature Functions | +|__________________________________ + +Recover the signer of hash, assuming it's an EOA account + +Only for SignatureType.EIP712 and SignatureType.EthSign signatures + + +```solidity +function recoverSigner(bytes32 _hash, bytes calldata _signature) internal pure returns (address signer); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_hash`|`bytes32`| Hash that was signed encoded as (bytes32 r, bytes32 s, uint8 v, ... , SignatureType sigType)| +|`_signature`|`bytes`|| + + +### isValidSignature + +Returns true if the provided signature is valid for the given signer. + +Supports SignatureType.EIP712, SignatureType.EthSign, and ERC1271 signatures + + +```solidity +function isValidSignature(bytes32 _hash, address _signer, bytes calldata _signature) + internal + view + returns (bool valid); +``` +**Parameters** + +|Name|Type|Description| +|----|----|-----------| +|`_hash`|`bytes32`| Hash that was signed| +|`_signer`|`address`| Address of the signer candidate| +|`_signature`|`bytes`|Signature byte array| + + +## Errors +### InvalidSignatureLength + +```solidity +error InvalidSignatureLength(bytes _signature); +``` + +### EmptySignature + +```solidity +error EmptySignature(); +``` + +### InvalidSValue + +```solidity +error InvalidSValue(bytes _signature, bytes32 _s); +``` + +### InvalidVValue + +```solidity +error InvalidVValue(bytes _signature, uint256 _v); +``` + +### UnsupportedSignatureType + +```solidity +error UnsupportedSignatureType(bytes _signature, uint256 _type, bool _recoverMode); +``` + +### SignerIsAddress0 + +```solidity +error SignerIsAddress0(bytes _signature); +``` + diff --git a/packages/wallet/wallet-contracts/foundry.lock b/packages/wallet/wallet-contracts/foundry.lock new file mode 100644 index 000000000..bca6a6d8c --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry.lock @@ -0,0 +1,8 @@ +{ + "lib/forge-std": { + "rev": "73d44ec7d124e3831bc5f832267889ffb6f9bc3f" + }, + "lib/foundry-huff": { + "rev": "7648faf3990cc4561d52b71af03282fad3a803d8" + } +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/foundry.toml b/packages/wallet/wallet-contracts/foundry.toml new file mode 100644 index 000000000..d26fe591f --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry.toml @@ -0,0 +1,11 @@ +[profile.default] +src = 'contracts' +out = 'foundry_artifacts' +libs = ["node_modules", "lib", "dependencies"] +test = 'foundry_test' + +ffi = true +max_test_rejects = 2048000 + +[dependencies] +forge-std = "1.11.0" diff --git a/packages/wallet/wallet-contracts/foundry_test/base/AdvTest.sol b/packages/wallet/wallet-contracts/foundry_test/base/AdvTest.sol new file mode 100644 index 000000000..b79268c40 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/base/AdvTest.sol @@ -0,0 +1,205 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "forge-std/Test.sol"; + +contract AdvTest is Test { + function signAndPack(uint256 _pk, bytes32 _hash) internal pure returns (bytes memory) { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_pk, _hash); + return abi.encodePacked(r, s, v); + } + + function signAndPack(uint256 _pk, bytes32 _hash, uint8 _sufix) internal pure returns (bytes memory) { + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_pk, _hash); + return abi.encodePacked(r, s, v, _sufix); + } + + function mayBoundArr(uint256 _size) internal view returns (uint256) { + try vm.envUint("MAX_ARRAY_LEN") returns (uint256 b) { + return b == 0 ? _size : bound(_size, 0, b); + } catch { + return _size; + } + } + + function boundNoSys(address _a) internal view returns (address) { + address c2 = address(0x007109709ecfa91a80626ff3989d68f67f5b1dd12d); + address vm = address(0x004e59b44847b379578588920ca78fbf26c0b4956c); + address c3 = address(0x00000000000000000000636f6e736f6c652e6c6f67); + + boundNoPrecompile(_a); + boundDiff(_a, c2, vm, c3, address(this)); + + return _a; + } + + function boundNoPrecompile(address _a) internal pure returns (address) { + vm.assume(uint160(_a) > 10); + return _a; + } + + function boundDiff(address _a, address _b) internal pure returns (address) { + vm.assume(_a != _b); + return _a; + } + + function boundDiff(address _a, address _b, address _c) internal pure returns (address) { + address[] memory arr = new address[](2); + arr[0] = _b; + arr[1] = _c; + return boundDiff(_a, arr); + } + + function boundDiff(address _a, address _b, address _c, address _d) internal pure returns (address) { + address[] memory _arr = new address[](3); + _arr[0] = _b; + _arr[1] = _c; + _arr[2] = _d; + return boundDiff(_a, _arr); + } + + function boundDiff(address _a, address _b, address _c, address _d, address _e) internal pure returns (address) { + address[] memory _arr = new address[](4); + _arr[0] = _b; + _arr[1] = _c; + _arr[2] = _d; + _arr[3] = _e; + return boundDiff(_a, _arr); + } + + function boundDiff(address _a, address[] memory _b) internal pure returns (address) { + vm.assume(!inSet(_a, _b)); + return _a; + } + + function boundPk(uint256 _a) internal view returns (uint256) { + _a = bound(_a, 1, 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364139); + return _a; + } + + function boundDiff(uint256 _a, uint256 _b) internal pure returns (uint256) { + vm.assume(_a != _b); + return _a; + } + + function boundDiff(uint256 _a, uint256 _b, uint256 _c) internal pure returns (uint256) { + uint256[] memory arr = new uint256[](2); + arr[0] = _b; + arr[1] = _c; + return boundDiff(_a, arr); + } + + function boundDiff(uint256 _a, uint256 _b, uint256 _c, uint256 _d) internal pure returns (uint256) { + uint256[] memory _arr = new uint256[](3); + _arr[0] = _b; + _arr[1] = _c; + _arr[2] = _d; + return boundDiff(_a, _arr); + } + + function boundDiff(uint256 _a, uint256 _b, uint256 _c, uint256 _d, uint256 _e) internal pure returns (uint256) { + uint256[] memory _arr = new uint256[](4); + _arr[0] = _b; + _arr[1] = _c; + _arr[2] = _d; + _arr[3] = _e; + return boundDiff(_a, _arr); + } + + function boundDiff(uint256 _a, uint256 _b, uint256 _c, uint256 _d, uint256 _e, uint256 _f) + internal + pure + returns (uint256) + { + uint256[] memory _arr = new uint256[](5); + _arr[0] = _b; + _arr[1] = _c; + _arr[2] = _d; + _arr[3] = _e; + _arr[4] = _f; + return boundDiff(_a, _arr); + } + + function boundDiff(uint256 _a, uint256 _b, uint256 _c, uint256 _d, uint256 _e, uint256 _f, uint256 _g) + internal + pure + returns (uint256) + { + uint256[] memory _arr = new uint256[](6); + _arr[0] = _b; + _arr[1] = _c; + _arr[2] = _d; + _arr[3] = _e; + _arr[4] = _f; + _arr[5] = _g; + return boundDiff(_a, _arr); + } + + function boundDiff(uint256 _a, uint256 _b, uint256 _c, uint256 _d, uint256 _e, uint256 _f, uint256 _g, uint256 _h) + internal + pure + returns (uint256) + { + uint256[] memory _arr = new uint256[](7); + _arr[0] = _b; + _arr[1] = _c; + _arr[2] = _d; + _arr[3] = _e; + _arr[4] = _f; + _arr[5] = _g; + _arr[6] = _h; + return boundDiff(_a, _arr); + } + + function boundDiff(uint256 _a, uint256[] memory _b) internal pure returns (uint256) { + vm.assume(!inSet(_a, _b)); + return _a; + } + + function inSet(uint256 _a, uint256[] memory _b) internal pure returns (bool) { + unchecked { + for (uint256 i = 0; i < _b.length; i++) { + if (_a == _b[i]) { + return true; + } + } + + return false; + } + } + + function inSet(address _a, address[] memory _b) internal pure returns (bool) { + unchecked { + for (uint256 i = 0; i < _b.length; i++) { + if (_a == _b[i]) { + return true; + } + } + + return false; + } + } + + function boundNoContract(address _a) internal view returns (address) { + vm.assume(_a.code.length == 0); + return _a; + } + + function boundNoBalance(address _a) internal view returns (address) { + vm.assume(_a.balance == 0); + return _a; + } + + function replicate(bytes memory _data) internal { + (bool suc, bytes memory res) = address(this).call(_data); + if (!suc) { + assembly { + revert(add(res, 32), mload(res)) + } + } + } + + function addrToBytes32(address _addr) internal pure returns (bytes32) { + return bytes32(uint256(uint160(_addr))); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/hooks/WalletProxyHook.t.sol b/packages/wallet/wallet-contracts/foundry_test/hooks/WalletProxyHook.t.sol new file mode 100644 index 000000000..04ebf54cf --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/hooks/WalletProxyHook.t.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/hooks/WalletProxyHook.sol"; +import "contracts/hooks/interfaces/IWalletProxy.sol"; +import "contracts/modules/commons/ModuleHooks.sol"; +import "contracts/Factory.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract WalletProxyHookTest is AdvTest { + ModuleHooks private template; + ModuleHooks private walletMod; + WalletProxyHook private wallet; + + function setUp() external { + Factory factory = new Factory(); + template = new ModuleHooks(); + walletMod = ModuleHooks(payable(factory.deploy(address(template), bytes32(0)))); + WalletProxyHook hook = new WalletProxyHook(); + + // Add hook + vm.prank(address(walletMod)); + walletMod.addHook(IWalletProxy.PROXY_getImplementation.selector, address(hook)); + + wallet = WalletProxyHook(address(walletMod)); + vm.label(address(wallet), "wallet"); + } + + // + // Get Implementation + // + + function test_PROXY_getImplementation() external { + assertEq(wallet.PROXY_getImplementation(), address(template)); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/Implementation.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/Implementation.t.sol new file mode 100644 index 000000000..f97488280 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/Implementation.t.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/Implementation.sol"; +import "contracts/Factory.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract ImplementationImp is Implementation { + function setImplementation(address _imp) external { + _setImplementation(_imp); + } + + function getImplementation() external view returns (address) { + return _getImplementation(); + } + + function stub() external pure virtual returns (uint256) { + return 1; + } +} + +contract NextImplementation is ImplementationImp { + function stub() external pure override returns (uint256) { + return 2; + } +} + +contract ImplementationTest is AdvTest { + function test_setImplementation(address _imp, address _next) external { + boundNoContract(boundNoSys(_imp)); + + vm.etch(_imp, address(new ImplementationImp()).code); + + assertEq(ImplementationImp(_imp).getImplementation(), address(0)); + + ImplementationImp(_imp).setImplementation(_next); + + assertEq(ImplementationImp(_imp).getImplementation(), _next); + assertEq(vm.load(_imp, addrToBytes32(_imp)), addrToBytes32(_next)); + } + + function test_setImplementation_matchWallet(bytes32 _salt, address _imp, address _imp2) external { + Factory factory = new Factory(); + + ImplementationImp imp = new ImplementationImp(); + ImplementationImp imp2 = new NextImplementation(); + + boundNoContract(boundDiff(boundNoSys(_imp), address(factory))); + boundNoContract(boundDiff(boundNoSys(_imp2), address(factory))); + + vm.etch(_imp, address(imp).code); + address wallet = factory.deploy(_imp, _salt); + + assertEq(ImplementationImp(wallet).getImplementation(), _imp); + assertEq(ImplementationImp(wallet).stub(), 1); + + vm.etch(_imp2, address(imp2).code); + + ImplementationImp(wallet).setImplementation(_imp2); + + assertEq(ImplementationImp(wallet).getImplementation(), _imp2); + assertEq(vm.load(wallet, addrToBytes32(wallet)), addrToBytes32(_imp2)); + assertEq(ImplementationImp(wallet).stub(), 2); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleCalls.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleCalls.t.sol new file mode 100644 index 000000000..493974bbe --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleCalls.t.sol @@ -0,0 +1,351 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/ModuleCalls.sol"; +import "contracts/Factory.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract ImmutableBytes { + bytes public b; + + constructor(bytes memory _b) { + b = _b; + } + + fallback() external payable {} + receive() external payable {} +} + +contract WillRevert { + ImmutableBytes private immutable ib; + + constructor(bytes memory _err) { + ib = new ImmutableBytes(_err); + } + + fallback() external payable { + _revert(); + } + + receive() external payable { + _revert(); + } + + function _revert() internal view { + bytes memory e = ib.b(); + assembly { + revert(add(e, 32), mload(e)) + } + } +} + +contract WillDelegateTo { + address private immutable expectSelf; + bytes32 private immutable expectData; + address private immutable delegate; + + constructor(address _expectSelf, bytes memory _expectData) { + expectSelf = _expectSelf; + expectData = keccak256(_expectData); + delegate = address(this); + } + + fallback() external payable { + _check(); + } + + receive() external payable { + _check(); + } + + function _check() internal { + bytes32 dataHash = keccak256(msg.data); + require(dataHash == expectData && address(this) == expectSelf); + + bytes32 key = keccak256(abi.encode(delegate)); + assembly { sstore(key, add(sload(key), 1)) } + } +} + +contract ModuleCallsImp is ModuleCalls { + function validateNonce(uint256 _rawNonce) external { + _validateNonce(_rawNonce); + } + + function writeNonce(uint256 _space, uint256 _nonce) external { + _writeNonce(_space, _nonce); + } + + // Module Auth imp + mapping(bytes32 => mapping(bytes => bytes32)) public sigToSubdigest; + mapping(bytes32 => mapping(bytes => bool)) public sigToIsValid; + + function _signatureValidation(bytes32 _digest, bytes calldata _signature) + internal + view + override + returns (bool isValid, bytes32 subdigest) + { + subdigest = sigToSubdigest[_digest][_signature]; + isValid = sigToIsValid[_digest][_signature]; + } + + function mockSignature(bytes32 _digest, bytes calldata _signature, bytes32 _subdigest, bool _isValid) external { + sigToSubdigest[_digest][_signature] = _subdigest; + sigToIsValid[_digest][_signature] = _isValid; + } + + function signatureRecovery(bytes32, bytes calldata) + public + view + override + returns (uint256, uint256, bytes32, bytes32, uint256) + {} + + function _isValidImage(bytes32) internal view override returns (bool) {} + + function updateImageHash(bytes32) external override {} + + function _updateImageHash(bytes32) internal override {} +} + +contract ModuleCallsTest is AdvTest { + ModuleCallsImp private template; + ModuleCallsImp private imp; + Factory private factory; + + function setUp() external { + template = new ModuleCallsImp(); + factory = new Factory(); + imp = ModuleCallsImp(factory.deploy(address(template), bytes32(0))); + } + + struct ToValAndData { + address target; + uint256 value; + bytes data; + } + + event TxExecuted(bytes32 _tx) anonymous; + event NonceChange(uint256 _space, uint256 _newNonce); + event TxFailed(bytes32 _tx, bytes _reason); + event GapNonceChange(uint256 _space, uint256 _oldNonce, uint256 _newNonce); + event NoNonceUsed(); + + function test_execute(ToValAndData[] memory _rtxs, bytes memory _sig, bytes32 _subdigest) external { + uint256 size = mayBoundArr(_rtxs.length); + IModuleCalls.Transaction[] memory txs = new IModuleCalls.Transaction[](size); + uint256 total; + + for (uint256 i = 0; i < size; i++) { + txs[i].data = _rtxs[i].data; + txs[i].target = boundNoBalance( + boundNoContract( + boundDiff(boundNoSys(_rtxs[i].target), address(template), address(imp), address(factory)) + ) + ); + txs[i].value = bound(_rtxs[i].value, 0, type(uint256).max - total); + + total += txs[i].value; + } + + vm.deal(address(imp), total); + bytes32 digest = keccak256(abi.encode(0, txs)); + imp.mockSignature(digest, _sig, _subdigest, false); + + vm.expectRevert(abi.encodeWithSignature("InvalidSignature(bytes32,bytes)", _subdigest, _sig)); + imp.execute(txs, 0, _sig); + + vm.expectRevert(abi.encodeWithSignature("BadNonce(uint256,uint256,uint256)", 0, 1, 0)); + imp.execute(txs, 1, _sig); + + imp.mockSignature(digest, _sig, _subdigest, true); + + vm.expectEmit(true, true, true, true, address(imp)); + emit NonceChange(0, 1); + + for (uint256 i = 0; i < size; i++) { + vm.expectCall(txs[i].target, txs[i].data); + } + + imp.execute(txs, 0, _sig); + + assertEq(imp.nonce(), 1); + + for (uint256 i = 0; i < size; i++) { + assertTrue(txs[i].target.balance >= txs[i].value); + } + } + + function test_execute_reverts( + ToValAndData[] memory _rtxs, + uint256 _reverti, + bool _revertsOnErr, + bool _delegateCall, + bytes memory _err, + bytes memory _sig, + bytes32 _subdigest + ) external { + uint256 size = mayBoundArr(_rtxs.length); + vm.assume(size != 0); + + IModuleCalls.Transaction[] memory txs = new IModuleCalls.Transaction[](size); + uint256 total; + + _reverti = bound(_reverti, 0, size - 1); + + address willRevert = address(new WillRevert(_err)); + + for (uint256 i = 0; i < size; i++) { + if (_reverti == i) { + txs[i].target = willRevert; + txs[i].revertOnError = _revertsOnErr; + txs[i].delegateCall = _delegateCall; + } else { + txs[i].target = boundNoBalance( + boundNoContract( + boundDiff(boundNoSys(_rtxs[i].target), address(template), address(imp), address(factory)) + ) + ); + } + + txs[i].data = _rtxs[i].data; + txs[i].value = bound(_rtxs[i].value, 0, type(uint256).max - total); + + total += txs[i].value; + } + + vm.deal(address(imp), total); + + bytes32 digest = keccak256(abi.encode(0, txs)); + imp.mockSignature(digest, _sig, _subdigest, true); + + if (_revertsOnErr) { + vm.expectRevert(_err); + } + + imp.execute(txs, 0, _sig); + + for (uint256 i = 0; i < size; i++) { + if (_revertsOnErr || txs[i].target == willRevert) { + assertEq(txs[i].target.balance, 0); + } else { + assertTrue(txs[i].target.balance >= txs[i].value); + } + } + } + + function test_execute_delegateCall(ToValAndData[] memory _rtxs, bytes memory _sig, bytes32 _subdigest) external { + uint256 size = mayBoundArr(_rtxs.length); + IModuleCalls.Transaction[] memory txs = new IModuleCalls.Transaction[](size); + + for (uint256 i = 0; i < size; i++) { + txs[i].data = _rtxs[i].data; + txs[i].target = address(new WillDelegateTo(address(imp), _rtxs[i].data)); + txs[i].value = _rtxs[i].value; + txs[i].delegateCall = true; + } + + bytes32 digest = keccak256(abi.encode(0, txs)); + imp.mockSignature(digest, _sig, _subdigest, true); + + imp.execute(txs, 0, _sig); + assertEq(imp.nonce(), 1); + + for (uint256 i = 0; i < size; i++) { + bytes32 key = keccak256(abi.encode(txs[i].target)); + assertTrue(uint256(vm.load(address(imp), key)) != 0); + } + } + + function test_selfExecute(ToValAndData[] memory _rtxs) external { + uint256 size = mayBoundArr(_rtxs.length); + IModuleCalls.Transaction[] memory txs = new IModuleCalls.Transaction[](size); + uint256 total; + + for (uint256 i = 0; i < size; i++) { + txs[i].data = _rtxs[i].data; + txs[i].target = boundNoBalance( + boundNoContract( + boundDiff(boundNoSys(_rtxs[i].target), address(template), address(imp), address(factory)) + ) + ); + txs[i].value = bound(_rtxs[i].value, 0, type(uint256).max - total); + + total += txs[i].value; + } + + vm.deal(address(imp), total); + + for (uint256 i = 0; i < size; i++) { + vm.expectCall(txs[i].target, txs[i].data); + } + + vm.prank(address(imp)); + imp.selfExecute(txs); + + for (uint256 i = 0; i < size; i++) { + assertTrue(txs[i].target.balance >= txs[i].value); + } + } + + function test_fail_selfExecute_NotSelf(ToValAndData[] memory _rtxs, address _notself) external { + _notself = boundDiff(_notself, address(imp)); + + uint256 size = mayBoundArr(_rtxs.length); + IModuleCalls.Transaction[] memory txs = new IModuleCalls.Transaction[](size); + + for (uint256 i = 0; i < size; i++) { + txs[i].data = _rtxs[i].data; + txs[i].target = _rtxs[i].target; + txs[i].value = _rtxs[i].value; + } + + vm.prank(_notself); + vm.expectRevert(abi.encodeWithSignature("OnlySelfAuth(address,address)", _notself, address(imp))); + imp.selfExecute(txs); + } + + function test_validateNonce_Normal(uint160 _space, uint88 _nonce) external { + uint256 encoded = uint256(abi.decode(abi.encodePacked(_space, uint8(0), _nonce), (bytes32))); + + imp.writeNonce(_space, _nonce); + + vm.expectEmit(true, true, true, true, address(imp)); + emit NonceChange(_space, uint256(_nonce) + 1); + imp.validateNonce(encoded); + + assertEq(imp.readNonce(_space), uint256(_nonce) + 1); + assertEq(imp.nonce(), _space == 0 ? uint256(_nonce) + 1 : 0); + } + + function test_fail_validateNonce_Normal_Bad(uint160 _space, uint88 _nonce, uint88 _badprev) external { + _badprev = uint88(boundDiff(_badprev, _nonce)); + + uint256 encoded = uint256(abi.decode(abi.encodePacked(_space, uint8(0), _nonce), (bytes32))); + + imp.writeNonce(_space, _badprev); + + vm.expectRevert(abi.encodeWithSignature("BadNonce(uint256,uint256,uint256)", _space, _nonce, _badprev)); + imp.validateNonce(encoded); + } + + function test_fail_noDelegatecall(ToValAndData[] memory _rtxs, bytes memory _sig, uint256 _nonce) external { + uint256 size = mayBoundArr(_rtxs.length); + IModuleCalls.Transaction[] memory txs = new IModuleCalls.Transaction[](size); + uint256 total; + + for (uint256 i = 0; i < size; i++) { + txs[i].data = _rtxs[i].data; + txs[i].target = boundNoSys(_rtxs[i].target); + txs[i].value = bound(_rtxs[i].value, 0, type(uint256).max - total); + + total += txs[i].value; + } + + vm.deal(address(imp), total); + vm.expectRevert(abi.encodeWithSignature("OnlyDelegatecall()")); + template.execute(txs, _nonce, _sig); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleERC5719.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleERC5719.t.sol new file mode 100644 index 000000000..49fe4c1a0 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleERC5719.t.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/ModuleERC5719.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract ModuleERC5719Test is AdvTest { + ModuleERC5719 private module; + + function setUp() public { + module = new ModuleERC5719(); + } + + function test_getAlternativeSignature() external { + // 0xba5a3cbb592813d90eae65a3aac33e9b6dfc7be50623aa25e151fe3da06c8443 + // == + // ipfs://bafybeif2li6lwwjicpmq5ltfuovmgpu3nx6hxzigeovclykr7y62a3eeim + + // 0xb6f77d000c8791676d96aedac165dd1bb2da4a5baf78198b9f391fc76b893f46 + // == + // ipfs://bafybeifw656qadehsftw3fvo3lawlxi3wlneuw5ppamyxhzzd7dwxcj7iy + + vm.startPrank(address(module)); + + bytes32 root = 0xba5a3cbb592813d90eae65a3aac33e9b6dfc7be50623aa25e151fe3da06c8443; + module.updateIPFSRoot(root); + + assertEq( + module.getAlternativeSignature(0x64f16a2f2c80ab7f3b0e0edc67c0bf1399402dc389cfb4271ba58abe3f61ea16), + "ipfs://bafybeif2li6lwwjicpmq5ltfuovmgpu3nx6hxzigeovclykr7y62a3eeim/ERC5719/0x64f16a2f2c80ab7f3b0e0edc67c0bf1399402dc389cfb4271ba58abe3f61ea16" + ); + + root = 0xb6f77d000c8791676d96aedac165dd1bb2da4a5baf78198b9f391fc76b893f46; + module.updateIPFSRoot(root); + + assertEq( + module.getAlternativeSignature(0x11b858b3b52eb84e900639ebb082aeacb10bd9d239f58ae3f7092885cc3593b6), + "ipfs://bafybeifw656qadehsftw3fvo3lawlxi3wlneuw5ppamyxhzzd7dwxcj7iy/ERC5719/0x11b858b3b52eb84e900639ebb082aeacb10bd9d239f58ae3f7092885cc3593b6" + ); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleExtraAuth.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleExtraAuth.t.sol new file mode 100644 index 000000000..3733500a4 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleExtraAuth.t.sol @@ -0,0 +1,175 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/ModuleExtraAuth.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract ExtStore { + mapping(bytes32 => bool) private imageHashToIsValid; + + function setValidImageHash(bytes32 _imageHash, bool _isValid) external { + imageHashToIsValid[_imageHash] = _isValid; + } + + function isValidImage(bytes32 _imageHash) external view returns (bool) { + return imageHashToIsValid[_imageHash]; + } +} + +abstract contract ModuleAuthImp is IModuleAuth { + ExtStore private immutable EXT_STORE; + + constructor() { + EXT_STORE = new ExtStore(); + } + + function setValidImageHash(bytes32 _imageHash, bool _isValid) external { + EXT_STORE.setValidImageHash(_imageHash, _isValid); + } + + function _isValidImage(bytes32 _imageHash) internal view virtual override returns (bool) { + return EXT_STORE.isValidImage(_imageHash); + } +} + +contract ModuleExtraAuthImp2 is ModuleAuthImp, ModuleExtraAuth { + function _isValidImage(bytes32 _imageHash) internal view override(ModuleAuthImp, ModuleExtraAuth) returns (bool) { + return super._isValidImage(_imageHash); + } + + function isValidImage(bytes32 _imageHash) external view returns (bool) { + return _isValidImage(_imageHash); + } + + function _updateImageHash(bytes32) internal virtual override { + revert("not implemented"); + } +} + +contract ModuleExtraAuthTest is AdvTest { + ModuleExtraAuthImp2 private imp; + + function setUp() public { + imp = new ModuleExtraAuthImp2(); + } + + event SetExtraImageHash(bytes32 indexed _imageHash, uint256 _expiration); + + function test_shouldAcceptExtraImageHashes( + bytes32 _imageHashb, + bytes32 _imageHash1, + bytes32 _imageHash2, + uint256 _expiration1, + uint256 _expiration2 + ) external { + _expiration1 = bound(_expiration1, block.timestamp + 1, type(uint256).max); + _expiration2 = bound(_expiration2, block.timestamp + 1, type(uint256).max); + + assertFalse(imp.isValidImage(_imageHashb)); + assertFalse(imp.isValidImage(_imageHash1)); + assertFalse(imp.isValidImage(_imageHash2)); + + imp.setValidImageHash(_imageHashb, true); + assertTrue(imp.isValidImage(_imageHashb)); + assertEq(imp.isValidImage(_imageHash1), _imageHash1 == _imageHashb); + assertEq(imp.isValidImage(_imageHash2), _imageHash2 == _imageHashb); + + vm.prank(address(imp)); + vm.expectEmit(true, true, true, true, address(imp)); + emit SetExtraImageHash(_imageHash1, _expiration1); + imp.setExtraImageHash(_imageHash1, _expiration1); + + assertTrue(imp.isValidImage(_imageHash1)); + assertEq(imp.isValidImage(_imageHash2), _imageHash1 == _imageHash2 || _imageHashb == _imageHash2); + assertTrue(imp.isValidImage(_imageHashb)); + + vm.prank(address(imp)); + vm.expectEmit(true, true, true, true, address(imp)); + emit SetExtraImageHash(_imageHash2, _expiration2); + imp.setExtraImageHash(_imageHash2, _expiration2); + + assertTrue(imp.isValidImage(_imageHashb)); + assertTrue(imp.isValidImage(_imageHash1)); + assertTrue(imp.isValidImage(_imageHash2)); + } + + function test_shouldRejectExpiredImageHash( + bytes32 _imageHashb, + bytes32 _imageHash1, + bytes32 _imageHash2, + uint256 _expiration1, + uint256 _expiration2 + ) external { + _expiration1 = bound(_expiration1, block.timestamp + 1, type(uint256).max); + _expiration2 = bound(_expiration2, 0, block.timestamp); + + imp.setValidImageHash(_imageHashb, true); + + vm.prank(address(imp)); + vm.expectEmit(true, true, true, true, address(imp)); + emit SetExtraImageHash(_imageHash1, _expiration1); + imp.setExtraImageHash(_imageHash1, _expiration1); + + vm.prank(address(imp)); + vm.expectEmit(true, true, true, true, address(imp)); + emit SetExtraImageHash(_imageHash2, _expiration2); + imp.setExtraImageHash(_imageHash2, _expiration2); + + assertTrue(imp.isValidImage(_imageHashb)); + assertEq(imp.isValidImage(_imageHash1), _imageHash1 != _imageHash2 || _imageHash1 == _imageHashb); + assertEq(imp.isValidImage(_imageHash2), _imageHash2 == _imageHashb); + } + + struct SetIh { + bytes32 imageHash; + uint256 expiration; + } + + mapping(bytes32 => bool) private wasCleared; + + function test_shouldClearExtraImageHashes(bytes32 _base, SetIh[] calldata _set, bytes32[] calldata _clear) + external + { + uint256 sizeSet = mayBoundArr(_set.length); + uint256 sizeClear = mayBoundArr(_clear.length); + + imp.setValidImageHash(_base, true); + + vm.startPrank(address(imp)); + for (uint256 i = 0; i < sizeSet; i++) { + uint256 expiration = bound(_set[i].expiration, block.timestamp + 1, type(uint256).max); + imp.setExtraImageHash(_set[i].imageHash, expiration); + } + + bytes32[] memory toClear = new bytes32[](sizeClear); + for (uint256 i = 0; i < sizeClear; i++) { + toClear[i] = _clear[i]; + } + + imp.clearExtraImageHashes(toClear); + + for (uint256 i = 0; i < sizeClear; i++) { + assertEq(imp.isValidImage(_clear[i]), _clear[i] == _base); + wasCleared[_clear[i]] = true; + } + + for (uint256 i = 0; i < sizeSet; i++) { + assertEq(imp.isValidImage(_set[i].imageHash), _set[i].imageHash == _base || !wasCleared[_set[i].imageHash]); + } + } + + function test_fail_setExtraImageHash_notSelf(address _caller, bytes32 _imageHash, uint256 _expiration) external { + boundDiff(_caller, address(imp)); + vm.expectRevert(abi.encodeWithSignature("OnlySelfAuth(address,address)", _caller, address(imp))); + vm.prank(_caller); + imp.setExtraImageHash(_imageHash, _expiration); + } + + function test_fail_clearExtraImageHash_notSelf(address _caller, bytes32[] calldata _clear) external { + boundDiff(_caller, address(imp)); + vm.expectRevert(abi.encodeWithSignature("OnlySelfAuth(address,address)", _caller, address(imp))); + vm.prank(_caller); + imp.clearExtraImageHashes(_clear); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleIPFS.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleIPFS.t.sol new file mode 100644 index 000000000..1210a5c2a --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleIPFS.t.sol @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/ModuleIPFS.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract ModuleIPFSTest is AdvTest { + ModuleIPFS private module; + + function setUp() public { + module = new ModuleIPFS(); + } + + function test_exposeRoot() external { + // 0xba5a3cbb592813d90eae65a3aac33e9b6dfc7be50623aa25e151fe3da06c8443 + // == + // ipfs://bafybeif2li6lwwjicpmq5ltfuovmgpu3nx6hxzigeovclykr7y62a3eeim + + // 0xb6f77d000c8791676d96aedac165dd1bb2da4a5baf78198b9f391fc76b893f46 + // == + // ipfs://bafybeifw656qadehsftw3fvo3lawlxi3wlneuw5ppamyxhzzd7dwxcj7iy + + vm.startPrank(address(module)); + + bytes32 root = 0xba5a3cbb592813d90eae65a3aac33e9b6dfc7be50623aa25e151fe3da06c8443; + module.updateIPFSRoot(root); + + assertEq(module.ipfsRootBytes32(), root); + assertEq(module.ipfsRoot(), "ipfs://bafybeif2li6lwwjicpmq5ltfuovmgpu3nx6hxzigeovclykr7y62a3eeim"); + + root = 0xb6f77d000c8791676d96aedac165dd1bb2da4a5baf78198b9f391fc76b893f46; + module.updateIPFSRoot(root); + + assertEq(module.ipfsRootBytes32(), root); + assertEq(module.ipfsRoot(), "ipfs://bafybeifw656qadehsftw3fvo3lawlxi3wlneuw5ppamyxhzzd7dwxcj7iy"); + } + + function test_fail_updateIPFSRoot_notSelf(address _notSelf) external { + boundDiff(_notSelf, address(module)); + + vm.prank(address(_notSelf)); + vm.expectRevert(abi.encodeWithSignature("OnlySelfAuth(address,address)", _notSelf, address(module))); + module.updateIPFSRoot(0x0); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleStorage.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleStorage.t.sol new file mode 100644 index 000000000..4242ceaa9 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/ModuleStorage.t.sol @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/ModuleStorage.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract ModuleStorageImp { + function writeBytes32(bytes32 _key, bytes32 _val) external { + ModuleStorage.writeBytes32(_key, _val); + } + + function readBytes32(bytes32 _key) external view returns (bytes32) { + return ModuleStorage.readBytes32(_key); + } + + function writeBytes32Map(bytes32 _key, bytes32 _subKey, bytes32 _val) external { + ModuleStorage.writeBytes32Map(_key, _subKey, _val); + } + + function readBytes32Map(bytes32 _key, bytes32 _subKey) external view returns (bytes32) { + return ModuleStorage.readBytes32Map(_key, _subKey); + } +} + +contract ModuleStorageTest is AdvTest { + ModuleStorageImp private imp; + + function setUp() external { + imp = new ModuleStorageImp(); + } + + function test_writeBytes32(bytes32 _key1, bytes32 _key2, bytes32 _val1, bytes32 _val2) external { + assertEq(imp.readBytes32(_key1), bytes32(0)); + assertEq(imp.readBytes32(_key2), bytes32(0)); + + bool equal = _key1 == _key2; + + imp.writeBytes32(_key1, _val1); + + bytes32 res1 = imp.readBytes32(_key1); + assertEq(res1, _val1); + assertEq(vm.load(address(imp), _key1), res1); + + imp.writeBytes32(_key2, _val2); + + bytes32 res2 = imp.readBytes32(_key2); + res1 = imp.readBytes32(_key1); + + assertEq(res1, equal ? _val2 : _val1); + assertEq(res2, _val2); + assertEq(vm.load(address(imp), _key1), res1); + assertEq(vm.load(address(imp), _key2), res2); + } + + function test_writeBytes32Map( + bytes32 _key1, + bytes32 _subkey1, + bytes32 _val1, + bytes32 _key2, + bytes32 _subkey2, + bytes32 _val2 + ) external { + bool equal = _key1 == _key2 && _subkey1 == _subkey2; + bytes32 slot1 = keccak256(abi.encode(_key1, _subkey1)); + bytes32 slot2 = keccak256(abi.encode(_key2, _subkey2)); + assertEq(slot1 == slot2, equal); + + imp.writeBytes32Map(_key1, _subkey1, _val1); + bytes32 res1 = imp.readBytes32Map(_key1, _subkey1); + assertEq(res1, _val1); + assertEq(vm.load(address(imp), slot1), res1); + + imp.writeBytes32Map(_key2, _subkey2, _val2); + + bytes32 res2 = imp.readBytes32Map(_key2, _subkey2); + res1 = imp.readBytes32Map(_key1, _subkey1); + + assertEq(res1, equal ? _val2 : _val1); + assertEq(res2, _val2); + assertEq(vm.load(address(imp), slot1), res1); + assertEq(vm.load(address(imp), slot2), res2); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceBaseSig.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceBaseSig.t.sol new file mode 100644 index 000000000..aa163bd3a --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceBaseSig.t.sol @@ -0,0 +1,325 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/submodules/auth/SequenceBaseSig.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract SequenceBaseSigImp { + function subdigest(bytes32 _digest) external view returns (bytes32) { + return SequenceBaseSig.subdigest(_digest); + } + + function leafForAddressAndWeight(address _addr, uint96 _weight) external pure returns (bytes32) { + return SequenceBaseSig._leafForAddressAndWeight(_addr, _weight); + } + + function recoverBranch(bytes32 _digest, bytes calldata _signature) + external + view + returns (uint256 weight, bytes32 root) + { + return SequenceBaseSig.recoverBranch(_digest, _signature); + } + + function recover(bytes32 _subdigest, bytes calldata _signature) + external + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, uint256 checkpoint) + { + return SequenceBaseSig.recover(_subdigest, _signature); + } +} + +contract SequenceBaseSigTest is AdvTest { + SequenceBaseSigImp private lib; + + uint8 private constant FLAG_SIGNATURE = 0; + uint8 private constant FLAG_ADDRESS = 1; + uint8 private constant FLAG_DYNAMIC_SIGNATURE = 2; + uint8 private constant FLAG_NODE = 3; + uint8 private constant FLAG_BRANCH = 4; + uint8 private constant FLAG_SUBDIGEST = 5; + uint8 private constant FLAG_NESTED = 6; + + function setUp() public { + lib = new SequenceBaseSigImp(); + } + + function test_subdigest(bytes32 _digest, uint256 _chainId) external { + _chainId = bound(_chainId, 0, type(uint64).max); + + bytes32 expected = keccak256(abi.encodePacked("\x19\x01", _chainId, address(lib), _digest)); + + vm.chainId(_chainId); + bytes32 actual = lib.subdigest(_digest); + assertEq(actual, expected); + } + + function test_subdigest_Fuzz_ChainId(bytes32 _digest, uint256 _chainId1, uint256 _chainId2) external { + _chainId1 = bound(_chainId1, 0, type(uint64).max); + _chainId2 = bound(_chainId2, 0, type(uint64).max); + + vm.chainId(_chainId1); + bytes32 subdigest1 = lib.subdigest(_digest); + + vm.chainId(_chainId2); + bytes32 subdigest2 = lib.subdigest(_digest); + + assertTrue(subdigest1 != subdigest2 || _chainId1 == _chainId2); + } + + function test_subdigest_Fuzz_Digest(bytes32 _digest1, bytes32 _digest2) external { + bytes32 subdigest1 = lib.subdigest(_digest1); + bytes32 subdigest2 = lib.subdigest(_digest2); + + assertTrue(subdigest1 != subdigest2 || _digest1 == _digest2); + } + + function test_subdigest_Fuzz_Address(bytes32 _digest, address _addr1, address _addr2) external { + boundNoSys(_addr1); + boundNoSys(_addr2); + + vm.etch(_addr1, address(lib).code); + vm.etch(_addr2, address(lib).code); + + bytes32 subdigest1 = SequenceBaseSigImp(_addr1).subdigest(_digest); + bytes32 subdigest2 = SequenceBaseSigImp(_addr2).subdigest(_digest); + + assertTrue(subdigest1 != subdigest2 || _addr1 == _addr2); + } + + function test_leafForAddressAndWeight(address _addr, uint96 _weight) external { + bytes32 expected = abi.decode(abi.encodePacked(_weight, _addr), (bytes32)); + bytes32 actual = lib.leafForAddressAndWeight(_addr, _weight); + assertEq(expected, actual); + } + + function test_leafForAddressAndWeight_fuzz(address _addr1, uint96 _weight1, address _addr2, uint96 _weight2) + external + { + bytes32 encoded1 = lib.leafForAddressAndWeight(_addr1, _weight1); + bytes32 encoded2 = lib.leafForAddressAndWeight(_addr2, _weight2); + assertEq(encoded1 == encoded2, _addr1 == _addr2 && _weight1 == _weight2); + } + + function test_leafForHardcodedSubdigest_fuzz(bytes32 _subdigest1, bytes32 _subdigest2) external { + bytes32 encoded1 = SequenceBaseSig._leafForHardcodedSubdigest(_subdigest1); + bytes32 encoded2 = SequenceBaseSig._leafForHardcodedSubdigest(_subdigest2); + assertEq(encoded1 == encoded2, _subdigest1 == _subdigest2); + } + + function test_leafForHardcodedSubdigest_fuzz_addr(address _addr, uint96 _weight, bytes32 _subdigest) external { + bytes32 encoded1 = SequenceBaseSig._leafForHardcodedSubdigest(_subdigest); + bytes32 encoded2 = SequenceBaseSig._leafForAddressAndWeight(_addr, _weight); + assertTrue(encoded1 != encoded2); + } + + function test_leafForNested_fuzz( + bytes32 _node1, + uint256 _threshold1, + uint256 _weight1, + bytes32 _node2, + uint256 _threshold2, + uint256 _weight2 + ) external { + bytes32 encoded1 = SequenceBaseSig._leafForNested(_node1, _threshold1, _weight1); + bytes32 encoded2 = SequenceBaseSig._leafForNested(_node2, _threshold2, _weight2); + assertEq(encoded1 == encoded2, _node1 == _node2 && _threshold1 == _threshold2 && _weight1 == _weight2); + } + + function test_leafForNested_fuzz_addr( + address _addr, + uint96 _weight, + bytes32 _node, + uint256 _threshold, + uint256 _nodeWeight + ) external { + bytes32 encoded1 = SequenceBaseSig._leafForNested(_node, _threshold, _nodeWeight); + bytes32 encoded2 = SequenceBaseSig._leafForAddressAndWeight(_addr, _weight); + assertTrue(encoded1 != encoded2); + } + + function test_leafForNested_fuzz_subdigest(bytes32 _subdigest, bytes32 _node, uint256 _threshold, uint256 _weight) + external + { + bytes32 encoded1 = SequenceBaseSig._leafForNested(_node, _threshold, _weight); + bytes32 encoded2 = SequenceBaseSig._leafForHardcodedSubdigest(_subdigest); + assertTrue(encoded1 != encoded2); + } + + function test_recoverBranch_Addresses(bytes32 _subdigest, bytes32 _seed, address[] calldata _addresses) external { + bytes memory signature; + bytes32 root; + + uint256 size = mayBoundArr(_addresses.length); + for (uint256 i = 0; i < size; i++) { + uint8 randomWeight = + uint8(bound(uint256(keccak256(abi.encode(_addresses[i], i, _seed))), 0, type(uint8).max)); + + signature = abi.encodePacked(signature, FLAG_ADDRESS, randomWeight, _addresses[i]); + bytes32 node = lib.leafForAddressAndWeight(_addresses[i], randomWeight); + root = root != bytes32(0) ? keccak256(abi.encodePacked(root, node)) : node; + } + + (uint256 recoveredWeight, bytes32 recoveredRoot) = lib.recoverBranch(_subdigest, signature); + assertEq(recoveredRoot, root); + assertEq(recoveredWeight, 0); + } + + function test_recoverBranch_Nodes(bytes32 _subdigest, bytes32[] calldata _nodes) external { + bytes memory signature; + bytes32 root; + + uint256 size = mayBoundArr(_nodes.length); + for (uint256 i = 0; i < size; i++) { + signature = abi.encodePacked(signature, FLAG_NODE, _nodes[i]); + root = root != bytes32(0) ? keccak256(abi.encodePacked(root, _nodes[i])) : _nodes[i]; + } + + (uint256 recoveredWeight, bytes32 recoveredRoot) = lib.recoverBranch(_subdigest, signature); + assertEq(recoveredRoot, root); + assertEq(recoveredWeight, 0); + } + + function test_recoverBranch_Signatures(bytes32 _subdigest, bytes32 _seed, uint256[] memory _pks) external { + bytes memory signature; + bytes32 root; + uint256 total; + + uint256 size = mayBoundArr(_pks.length); + for (uint256 i = 0; i < size; i++) { + _pks[i] = boundPk(_pks[i]); + + uint8 randomWeight = uint8(bound(uint256(keccak256(abi.encode(_pks[i], i, _seed))), 0, type(uint8).max)); + address addr = vm.addr(_pks[i]); + + // Determine if the pk will sign, dynamic sign or just sit as addr + uint256 op = bound(uint256(keccak256(abi.encode(_pks[i], i, _seed, 2))), 0, 2); + + if (op == 0) { + signature = abi.encodePacked(signature, FLAG_ADDRESS, randomWeight, addr); + } else { + bytes memory sigpart = signAndPack(_pks[i], _subdigest, 1); + + total += randomWeight; + + if (op == 1) { + signature = abi.encodePacked(signature, FLAG_SIGNATURE, randomWeight, sigpart); + } else { + signature = abi.encodePacked( + signature, FLAG_DYNAMIC_SIGNATURE, randomWeight, addr, uint24(sigpart.length), sigpart + ); + } + } + + bytes32 node = lib.leafForAddressAndWeight(addr, randomWeight); + root = root != bytes32(0) ? keccak256(abi.encodePacked(root, node)) : node; + } + + (uint256 recoveredWeight, bytes32 recoveredRoot) = lib.recoverBranch(_subdigest, signature); + assertEq(recoveredRoot, root); + assertEq(recoveredWeight, total); + } + + function test_recoverBranch_Branches(bytes32 _subdigest, bytes32 _seed, uint256[] memory _pks) external { + bytes memory signature; + bytes32 root; + uint256 total; + + // NOTICE: too much branching will lead to stack overflow + uint256 size = bound(_pks.length, 0, 32); + + for (uint256 i = 0; i < size; i++) { + if (i != 0) { + signature = abi.encodePacked(FLAG_BRANCH, uint24(signature.length), signature); + } + + _pks[i] = boundPk(_pks[i]); + + uint8 randomWeight = uint8(bound(uint256(keccak256(abi.encode(_pks[i], i, _seed))), 0, type(uint8).max)); + address addr = vm.addr(_pks[i]); + + // Determine if the pk will sign, dynamic sign or just sit as addr + uint256 op = bound(uint256(keccak256(abi.encode(_pks[i], i, _seed, 2))), 0, 2); + + if (op == 0) { + signature = abi.encodePacked(FLAG_ADDRESS, randomWeight, addr, signature); + } else { + bytes memory sigpart = signAndPack(_pks[i], _subdigest, 1); + + total += randomWeight; + + if (op == 1) { + signature = abi.encodePacked(FLAG_SIGNATURE, randomWeight, sigpart, signature); + } else { + signature = abi.encodePacked( + FLAG_DYNAMIC_SIGNATURE, randomWeight, addr, uint24(sigpart.length), sigpart, signature + ); + } + } + + bytes32 node = lib.leafForAddressAndWeight(addr, randomWeight); + // Hash in reverse order requires branching, root/node -> node/root + root = root != bytes32(0) ? keccak256(abi.encodePacked(node, root)) : node; + } + + (uint256 recoveredWeight, bytes32 recoveredRoot) = lib.recoverBranch(_subdigest, signature); + assertEq(recoveredRoot, root); + assertEq(recoveredWeight, total); + } + + function test_recoverBranch_Empty(bytes32 _hash) external { + (uint256 weight1, bytes32 root1) = lib.recoverBranch(_hash, abi.encodePacked(FLAG_NODE, bytes32(0))); + (uint256 weight2, bytes32 root2) = lib.recoverBranch(_hash, bytes("")); + + assertEq(weight2, 0); + assertEq(root2, bytes32(0)); + assertEq(weight1, weight2); + assertEq(root1, root2); + } + + function test_recoverBranch_Fail_InvalidFlag(uint8 _flag, bytes23 _hash, bytes calldata _sufix) external { + uint8( + boundDiff( + _flag, + FLAG_SIGNATURE, + FLAG_ADDRESS, + FLAG_DYNAMIC_SIGNATURE, + FLAG_NODE, + FLAG_BRANCH, + FLAG_SUBDIGEST, + FLAG_NESTED + ) + ); + + vm.expectRevert(abi.encodeWithSignature("InvalidSignatureFlag(uint256)", _flag)); + lib.recoverBranch(_hash, abi.encodePacked(_flag, _sufix)); + } + + function test_recover(bytes32 _subdigest, uint256 _pk, uint32 _checkpoint, uint16 _threshold, uint8 _weight) + external + { + _pk = boundPk(_pk); + + bytes memory signature = signAndPack(_pk, _subdigest, 1); + address addr = vm.addr(_pk); + + bytes32 expectImageHash = abi.decode(abi.encodePacked(uint96(_weight), addr), (bytes32)); + expectImageHash = keccak256(abi.encodePacked(expectImageHash, uint256(_threshold))); + expectImageHash = keccak256(abi.encodePacked(expectImageHash, uint256(_checkpoint))); + + bytes memory encoded = abi.encodePacked(_threshold, _checkpoint, FLAG_SIGNATURE, _weight, signature); + (uint256 threshold, uint256 weight, bytes32 imageHash, uint256 checkpoint) = lib.recover(_subdigest, encoded); + + assertEq(weight, _weight); + assertEq(threshold, _threshold); + assertEq(imageHash, expectImageHash); + assertEq(checkpoint, _checkpoint); + } + + function test_recover_Fail_EmptySignature(bytes32 _subdigest) external { + vm.expectRevert(); + lib.recover(_subdigest, bytes("")); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceChainedSig.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceChainedSig.t.sol new file mode 100644 index 000000000..85ef23f14 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceChainedSig.t.sol @@ -0,0 +1,276 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/submodules/auth/SequenceChainedSig.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract SequenceChainedSigImp is SequenceChainedSig { + function pchainedRecover(bytes32 _digest, bytes calldata _signature) + external + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 checkpoint) + { + return chainedRecover(_digest, _signature); + } + + struct MockedSignature { + bool exists; + uint256 threshold; + uint256 weight; + bytes32 imageHash; + bytes32 subdigest; + uint256 checkpoint; + } + + mapping(bytes32 => mapping(bytes => MockedSignature)) public mockedSignatures; + + function isMocked(bytes32 _digest, bytes calldata _signature) external view returns (bool) { + return mockedSignatures[_digest][_signature].exists; + } + + function mockSignature( + bytes32 _digest, + bytes calldata _signature, + uint256 _threshold, + uint256 _weight, + bytes32 _imageHash, + bytes32 _subdigest, + uint256 _checkpoint + ) external { + MockedSignature memory sig; + + sig.exists = true; + sig.threshold = _threshold; + sig.weight = _weight; + sig.imageHash = _imageHash; + sig.subdigest = _subdigest; + sig.checkpoint = _checkpoint; + + mockedSignatures[_digest][_signature] = sig; + } + + function signatureRecovery(bytes32 _digest, bytes calldata _signature) + public + view + override + returns (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 checkpoint) + { + if (mockedSignatures[_digest][_signature].exists) { + return ( + mockedSignatures[_digest][_signature].threshold, + mockedSignatures[_digest][_signature].weight, + mockedSignatures[_digest][_signature].imageHash, + mockedSignatures[_digest][_signature].subdigest, + mockedSignatures[_digest][_signature].checkpoint + ); + } else { + revert("invalid mocked signature"); + } + } + + function hashSetImageHashStruct(bytes32 _imageHash) external pure returns (bytes32) { + return _hashSetImageHashStruct(_imageHash); + } + + function _signatureValidation(bytes32, bytes calldata) internal pure override returns (bool, bytes32) { + revert("not implemented"); + } + + function _isValidImage(bytes32) internal pure override returns (bool) { + revert("not implemented"); + } + + function updateImageHash(bytes32) external pure override { + revert("not implemented"); + } + + function _updateImageHash(bytes32) internal pure override { + revert("not implemented"); + } +} + +contract SequenceChainedSigTest is AdvTest { + SequenceChainedSigImp private lib; + + function setUp() public { + lib = new SequenceChainedSigImp(); + } + + struct HashAndSignature { + bytes32 imageHash; + uint256 threshold; + uint256 weight; + uint56 checkpointDelta; + bytes signature; + } + + function test_chainedRecover(uint8 _prefix, bytes32 _digest, HashAndSignature[] memory _steps) external { + vm.assume(_steps.length > 0); + + bytes memory signature = abi.encodePacked(_prefix); + + uint256 size = boundDiff(mayBoundArr(_steps.length), 0); + + bytes32 nextDigest = _digest; + uint32 checkpoint = type(uint32).max; + + for (uint256 i = 0; i < size; i++) { + _steps[i].weight = bound(_steps[i].weight, _steps[i].threshold, type(uint256).max); + + if (i != 0) { + checkpoint -= uint32(bound(_steps[i].checkpointDelta, 1, type(uint24).max)); + } + + if (lib.isMocked(nextDigest, _steps[i].signature)) { + _steps[i].signature = abi.encodePacked(_steps[i].signature, _steps[i].imageHash); + } + + lib.mockSignature( + nextDigest, + _steps[i].signature, + _steps[i].threshold, + _steps[i].weight, + _steps[i].imageHash, + i == 0 ? _digest : nextDigest, + checkpoint + ); + + nextDigest = lib.hashSetImageHashStruct(_steps[i].imageHash); + signature = abi.encodePacked(signature, uint24(_steps[i].signature.length), _steps[i].signature); + } + + (uint256 threshold, uint256 weight, bytes32 imageHash, bytes32 subdigest, uint256 rcheckpoint) = + lib.pchainedRecover(_digest, signature); + + assertEq(imageHash, _steps[size - 1].imageHash); + assertEq(threshold, _steps[size - 1].threshold); + assertEq(weight, _steps[size - 1].weight); + assertEq(subdigest, _digest); + assertEq(rcheckpoint, checkpoint); + } + + function test_chainedRecover_Fail_LowWeight( + uint8 _prefix, + uint256 _badi, + bytes32 _digest, + HashAndSignature[] memory _steps + ) external { + vm.assume(_steps.length > 0); + + bytes memory signature = abi.encodePacked(_prefix); + + uint256 size = boundDiff(mayBoundArr(_steps.length), 0); + _badi = bound(_badi, 0, size - 1); + + bytes32 nextDigest = _digest; + uint64 checkpoint = type(uint64).max; + + for (uint256 i = 0; i < size; i++) { + if (i == _badi) { + _steps[i].threshold = bound(_steps[i].threshold, 1, type(uint256).max); + _steps[i].weight = bound(_steps[i].weight, 0, _steps[i].threshold - 1); + } else { + _steps[i].weight = bound(_steps[i].weight, _steps[i].threshold, type(uint256).max); + } + + if (i != 0) { + checkpoint -= uint64(bound(_steps[i].checkpointDelta, 1, type(uint56).max)); + } + + if (lib.isMocked(nextDigest, _steps[i].signature)) { + _steps[i].signature = abi.encodePacked(_steps[i].signature, _steps[i].imageHash); + } + + lib.mockSignature( + nextDigest, + _steps[i].signature, + _steps[i].threshold, + _steps[i].weight, + _steps[i].imageHash, + i == 0 ? _digest : nextDigest, + checkpoint + ); + + nextDigest = lib.hashSetImageHashStruct(_steps[i].imageHash); + signature = abi.encodePacked(signature, uint24(_steps[i].signature.length), _steps[i].signature); + } + + vm.expectRevert( + abi.encodeWithSignature( + "LowWeightChainedSignature(bytes,uint256,uint256)", + _steps[_badi].signature, + _steps[_badi].threshold, + _steps[_badi].weight + ) + ); + lib.pchainedRecover(_digest, signature); + } + + function test_chainedRecover_Fail_Checkpoint( + uint8 _prefix, + uint256 _badi, + bytes32 _digest, + HashAndSignature[] memory _steps + ) external { + vm.assume(_steps.length >= 1); + + bytes memory signature = abi.encodePacked(_prefix); + + uint256 size = boundDiff(mayBoundArr(_steps.length), 0); + _badi = bound(_badi, 0, size - 1); + + bytes32 nextDigest = _digest; + uint64 checkpoint = type(uint64).max; + + uint64 badCheckpoint; + uint64 prevToBadCheckpoint; + + for (uint256 i = 0; i < size; i++) { + _steps[i].weight = bound(_steps[i].weight, _steps[i].threshold, type(uint256).max); + + if (i != 0) { + if (_badi == i) { + prevToBadCheckpoint = checkpoint; + checkpoint = + uint64(bound(uint256(checkpoint) + _steps[i].checkpointDelta, checkpoint, type(uint64).max)); + badCheckpoint = checkpoint; + } else { + checkpoint -= uint64(bound(_steps[i].checkpointDelta, 1, type(uint56).max)); + } + } + + if (lib.isMocked(nextDigest, _steps[i].signature)) { + _steps[i].signature = abi.encodePacked(_steps[i].signature, _steps[i].imageHash); + } + + lib.mockSignature( + nextDigest, + _steps[i].signature, + _steps[i].threshold, + _steps[i].weight, + _steps[i].imageHash, + i == 0 ? _digest : nextDigest, + checkpoint + ); + + nextDigest = lib.hashSetImageHashStruct(_steps[i].imageHash); + signature = abi.encodePacked(signature, uint24(_steps[i].signature.length), _steps[i].signature); + } + + if (_badi != 0) { + vm.expectRevert( + abi.encodeWithSignature( + "WrongChainedCheckpointOrder(uint256,uint256)", badCheckpoint, prevToBadCheckpoint + ) + ); + } + + lib.pchainedRecover(_digest, signature); + } + + function test_chainedRecover_Fail_EmptySignature(bytes32 _digest) external { + vm.expectRevert(); + lib.pchainedRecover(_digest, bytes("")); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceDynamicSig.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceDynamicSig.t.sol new file mode 100644 index 000000000..9651f4eb6 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceDynamicSig.t.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/submodules/auth/SequenceBaseSig.sol"; +import "contracts/modules/commons/submodules/auth/SequenceDynamicSig.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract SequenceDynamicSigImp { + function recover(bytes32 _subdigest, bytes calldata _signature) + external + view + returns (uint256, uint256, bytes32, uint256) + { + return SequenceDynamicSig.recover(_subdigest, _signature); + } + + function recoverBase(bytes32 _subdigest, bytes calldata _signature) + external + view + returns (uint256 threshold, uint256 weight, bytes32 imageHash, uint256) + { + return SequenceBaseSig.recover(_subdigest, _signature); + } +} + +contract SequenceDynamicSigTest is AdvTest { + SequenceDynamicSigImp private lib; + + function setUp() public { + lib = new SequenceDynamicSigImp(); + } + + function test_recover_ignoreFirstByte( + uint8 _first, + bytes32 _subdigest, + uint256 _pk, + uint16 _threshold, + uint32 _checkpoint, + uint8 _weight + ) external { + _pk = boundPk(_pk); + + bytes memory encoded = + abi.encodePacked(_threshold, _checkpoint, uint8(0), _weight, signAndPack(_pk, _subdigest, 1)); + + (uint256 threshold1, uint256 weight1, bytes32 imageHash1, uint256 checkpoint1) = + lib.recover(_subdigest, abi.encodePacked(_first, encoded)); + (uint256 threshold2, uint256 weight2, bytes32 imageHash2, uint256 checkpoint2) = + lib.recoverBase(_subdigest, encoded); + + assertEq(threshold1, threshold2); + assertEq(weight1, weight2); + assertEq(imageHash1, imageHash2); + assertEq(checkpoint1, checkpoint2); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceNoChainIdSig.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceNoChainIdSig.t.sol new file mode 100644 index 000000000..34534385a --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/auth/SequenceNoChainIdSig.t.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/submodules/auth/SequenceNoChainIdSig.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract SequenceNoChainIdSigImp { + function subdigest(bytes32 _digest) external view returns (bytes32) { + return SequenceNoChainIdSig.subdigest(_digest); + } +} + +contract SequenceNoChainIdSigTest is AdvTest { + SequenceNoChainIdSigImp private lib; + + function setUp() public { + lib = new SequenceNoChainIdSigImp(); + } + + function test_subdigest_DiffDigest(bytes32 _digest1, bytes32 _digest2) external { + bytes32 res1 = lib.subdigest(_digest1); + bytes32 res2 = lib.subdigest(_digest2); + assertTrue(res1 != res2 || _digest1 == _digest2); + } + + function test_subdigest_DiffAddress(bytes32 _digest, address _addr1, address _addr2) external { + boundNoContract(boundNoSys(_addr1)); + boundNoContract(boundNoSys(_addr2)); + + vm.etch(_addr1, address(lib).code); + vm.etch(_addr2, address(lib).code); + + bytes32 res1 = SequenceNoChainIdSigImp(_addr1).subdigest(_digest); + bytes32 res2 = SequenceNoChainIdSigImp(_addr2).subdigest(_digest); + + assertTrue(res1 != res2 || _addr1 == _addr2); + } + + function test_subdigest_DiffChainId(bytes32 _digest, uint256 _chainId1, uint256 _chainId2) external { + _chainId1 = bound(_chainId1, 0, type(uint64).max); + _chainId2 = bound(_chainId2, 0, type(uint64).max); + + vm.chainId(_chainId1); + bytes32 res1 = lib.subdigest(_digest); + vm.chainId(_chainId2); + bytes32 res2 = lib.subdigest(_digest); + + assertTrue(res1 == res2); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/nonce/SubModuleNonce.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/nonce/SubModuleNonce.t.sol new file mode 100644 index 000000000..4bc6a900f --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/commons/submodules/nonce/SubModuleNonce.t.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/modules/commons/submodules/nonce/SubModuleNonce.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract SubModuleNonceTest is AdvTest { + function test_decodeNonce(uint160 _space, uint96 _nonce) external { + uint256 encoded = abi.decode(abi.encodePacked(_space, _nonce), (uint256)); + (uint256 space2, uint256 nonce2) = SubModuleNonce.decodeNonce(encoded); + + assertEq(space2, _space); + assertEq(nonce2, _nonce); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorEncoder.sol b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorEncoder.sol new file mode 100644 index 000000000..bc94e84b6 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorEncoder.sol @@ -0,0 +1,393 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +function requiredBytesFor(bytes32 value) pure returns (uint8) { + return requiredBytesFor(uint256(value)); +} + +function requiredBytesFor(uint256 value) pure returns (uint8) { + if (value <= type(uint8).max) { + return 1; + } else if (value <= type(uint16).max) { + return 2; + } else if (value <= type(uint24).max) { + return 3; + } else if (value <= type(uint32).max) { + return 4; + } else if (value <= type(uint40).max) { + return 5; + } else if (value <= type(uint48).max) { + return 6; + } else if (value <= type(uint56).max) { + return 7; + } else if (value <= type(uint64).max) { + return 8; + } else if (value <= type(uint72).max) { + return 9; + } else if (value <= type(uint80).max) { + return 10; + } else if (value <= type(uint88).max) { + return 11; + } else if (value <= type(uint96).max) { + return 12; + } else if (value <= type(uint104).max) { + return 13; + } else if (value <= type(uint112).max) { + return 14; + } else if (value <= type(uint120).max) { + return 15; + } else if (value <= type(uint128).max) { + return 16; + } else if (value <= type(uint136).max) { + return 17; + } else if (value <= type(uint144).max) { + return 18; + } else if (value <= type(uint152).max) { + return 19; + } else if (value <= type(uint160).max) { + return 20; + } else if (value <= type(uint168).max) { + return 21; + } else if (value <= type(uint176).max) { + return 22; + } else if (value <= type(uint184).max) { + return 23; + } else if (value <= type(uint192).max) { + return 24; + } else if (value <= type(uint200).max) { + return 25; + } else if (value <= type(uint208).max) { + return 26; + } else if (value <= type(uint216).max) { + return 27; + } else if (value <= type(uint224).max) { + return 28; + } else if (value <= type(uint232).max) { + return 29; + } else if (value <= type(uint240).max) { + return 30; + } else if (value <= type(uint248).max) { + return 31; + } + + return 32; +} + +function packToBytes(bytes32 value, uint256 b) pure returns (bytes memory) { + return packToBytes(uint256(value), b); +} + +function packToBytes(uint256 value, uint256 b) pure returns (bytes memory) { + if (b == 1) { + return abi.encodePacked(uint8(value)); + } else if (b == 2) { + return abi.encodePacked(uint16(value)); + } else if (b == 3) { + return abi.encodePacked(uint24(value)); + } else if (b == 4) { + return abi.encodePacked(uint32(value)); + } else if (b == 5) { + return abi.encodePacked(uint40(value)); + } else if (b == 6) { + return abi.encodePacked(uint48(value)); + } else if (b == 7) { + return abi.encodePacked(uint56(value)); + } else if (b == 8) { + return abi.encodePacked(uint64(value)); + } else if (b == 9) { + return abi.encodePacked(uint72(value)); + } else if (b == 10) { + return abi.encodePacked(uint80(value)); + } else if (b == 11) { + return abi.encodePacked(uint88(value)); + } else if (b == 12) { + return abi.encodePacked(uint96(value)); + } else if (b == 13) { + return abi.encodePacked(uint104(value)); + } else if (b == 14) { + return abi.encodePacked(uint112(value)); + } else if (b == 15) { + return abi.encodePacked(uint120(value)); + } else if (b == 16) { + return abi.encodePacked(uint128(value)); + } else if (b == 17) { + return abi.encodePacked(uint136(value)); + } else if (b == 18) { + return abi.encodePacked(uint144(value)); + } else if (b == 19) { + return abi.encodePacked(uint152(value)); + } else if (b == 20) { + return abi.encodePacked(uint160(value)); + } else if (b == 21) { + return abi.encodePacked(uint168(value)); + } else if (b == 22) { + return abi.encodePacked(uint176(value)); + } else if (b == 23) { + return abi.encodePacked(uint184(value)); + } else if (b == 24) { + return abi.encodePacked(uint192(value)); + } else if (b == 25) { + return abi.encodePacked(uint200(value)); + } else if (b == 26) { + return abi.encodePacked(uint208(value)); + } else if (b == 27) { + return abi.encodePacked(uint216(value)); + } else if (b == 28) { + return abi.encodePacked(uint224(value)); + } else if (b == 29) { + return abi.encodePacked(uint232(value)); + } else if (b == 30) { + return abi.encodePacked(uint240(value)); + } else if (b == 31) { + return abi.encodePacked(uint248(value)); + } else if (b == 32) { + return abi.encodePacked(uint256(value)); + } else { + revert("Invalid number of bytes"); + } +} + +function encodeWord(bytes32 _value) pure returns (bytes memory) { + return encodeWord(uint256(_value)); +} + +function encodeWord(uint256 _value) pure returns (bytes memory) { + uint256 highestFlag = 0x4f; + + if (_value < type(uint8).max - highestFlag) { + return abi.encodePacked(uint8(_value + highestFlag + 1)); + } + + uint8 b = requiredBytesFor(_value); + return abi.encodePacked(b, packToBytes(_value, b)); +} + +function build_flag(bool _delegateCall, bool _revertOnError, bool _hasGasLimit, bool _hasValue, bool _hasData) + pure + returns (uint8) +{ + uint8 res = 0; + + if (_delegateCall) { + res |= 128; + } + + if (_revertOnError) { + res |= 64; + } + + if (_hasGasLimit) { + res |= 32; + } + + if (_hasValue) { + res |= 16; + } + + // Hasdata uses first bit + if (_hasData) { + res |= 1; + } + + return res; +} + +function encode_raw_address(address _addr) pure returns (bytes memory) { + return encodeWord(uint256(uint160(_addr))); +} + +function encode_bytes_n(bytes memory _data) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x2b), encodeWord(_data.length), _data); +} + +function encode_abi_call(bytes4 _selector) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x2d), uint8(0x00), _selector); +} + +function encode_abi_call(bytes4 _selector, bytes32 _v1) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x2e), uint8(0x00), _selector, encodeWord(_v1)); +} + +function encode_abi_call(bytes4 _selector, bytes32 _v1, bytes32 _v2) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x2f), uint8(0x00), _selector, encodeWord(_v1), encodeWord(_v2)); +} + +function encode_abi_call(bytes4 _selector, bytes32 _v1, bytes32 _v2, bytes32 _v3) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x30), uint8(0x00), _selector, encodeWord(_v1), encodeWord(_v2), encodeWord(_v3)); +} + +function encode_abi_call(bytes4 _selector, bytes32 _v1, bytes32 _v2, bytes32 _v3, bytes32 _v4) + pure + returns (bytes memory) +{ + return abi.encodePacked( + uint8(0x31), uint8(0x00), _selector, encodeWord(_v1), encodeWord(_v2), encodeWord(_v3), encodeWord(_v4) + ); +} + +function encode_abi_call(bytes4 _selector, bytes32 _v1, bytes32 _v2, bytes32 _v3, bytes32 _v4, bytes32 _v5) + pure + returns (bytes memory) +{ + return abi.encodePacked( + uint8(0x32), + uint8(0x00), + _selector, + encodeWord(_v1), + encodeWord(_v2), + encodeWord(_v3), + encodeWord(_v4), + encodeWord(_v5) + ); +} + +function encode_abi_call( + bytes4 _selector, + bytes32 _v1, + bytes32 _v2, + bytes32 _v3, + bytes32 _v4, + bytes32 _v5, + bytes32 _v6 +) pure returns (bytes memory) { + return abi.encodePacked( + uint8(0x33), + uint8(0x00), + _selector, + encodeWord(_v1), + encodeWord(_v2), + encodeWord(_v3), + encodeWord(_v4), + encodeWord(_v5), + encodeWord(_v6) + ); +} + +function encode_nested(bytes memory _a, bytes memory _b) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x34), uint8(2), _a, _b); +} + +function encode_nested(bytes memory _a, bytes memory _b, bytes memory _c) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x34), uint8(3), _a, _b, _c); +} + +function encode_nested(bytes[] memory _bs) pure returns (bytes memory) { + bytes memory res = abi.encodePacked(uint8(0x35), uint16(_bs.length)); + for (uint256 i = 0; i < _bs.length; i++) { + res = abi.encodePacked(res, _bs[i]); + } + return res; +} + +function encode_eoa_signature(uint8 _weight, bytes memory _sig) pure returns (bytes memory) { + if (_sig.length != 66) { + revert("Invalid signature length"); + } + + if (_weight != 0 && _weight <= 4) { + return abi.encodePacked(uint8(0x36 + _weight), _sig); + } + + return abi.encodePacked(uint8(0x36), uint8(_weight), _sig); +} + +function encode_address(uint8 _weight, address _addr) pure returns (bytes memory) { + if (_weight != 0 && _weight <= 4) { + return abi.encodePacked(uint8(0x3b + _weight), encodeWord(uint256(uint160(_addr)))); + } + + return abi.encodePacked(uint8(0x3b), uint8(_weight), encodeWord(uint256(uint160(_addr)))); +} + +function encode_node(bytes32 _node) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x40), encodeWord(_node)); +} + +function encode_branch(bytes memory _nested) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x41), encode_bytes_n(_nested)); +} + +function encode_subdigest(bytes32 _subdigest) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x42), encodeWord(_subdigest)); +} + +function encode_nested(uint8 _weight, uint8 _threshold, bytes memory _nested) pure returns (bytes memory) { + return abi.encodePacked(uint8(0x43), uint8(_weight), uint8(_threshold), encode_bytes_n(_nested)); +} + +function encode_dynamic_signature(uint8 _weight, address _signer, bytes memory _signature) pure returns (bytes memory) { + return + abi.encodePacked(uint8(0x44), uint8(_weight), encodeWord(uint256(uint160(_signer))), encode_bytes_n(_signature)); +} + +function encode_sequence_signature(bool _noChainId, uint256 _threshold, uint32 _checkpoint, bytes memory _tree) + pure + returns (bytes memory) +{ + uint8 flag; + + bytes memory t; + + if (_noChainId) { + if (_threshold <= type(uint8).max) { + flag = 0x45; + t = abi.encodePacked(uint8(_threshold)); + } else { + flag = 0x47; + t = abi.encodePacked(uint16(_threshold)); + } + } else { + if (_threshold <= type(uint8).max) { + flag = 0x46; + t = abi.encodePacked(uint8(_threshold)); + } else { + flag = 0x48; + t = abi.encodePacked(uint16(_threshold)); + } + } + + return abi.encodePacked(flag, t, encodeWord(_checkpoint), encode_bytes_n(_tree)); +} + +function encode_sequence_chained_signatures(bytes[] memory _payloads) pure returns (bytes memory) { + bytes memory encoded; + + if (_payloads.length > type(uint8).max) { + encoded = abi.encodePacked(uint8(0x4a), uint16(_payloads.length)); + } else { + encoded = abi.encodePacked(uint8(0x49), uint8(_payloads.length)); + } + + for (uint256 i = 0; i < _payloads.length; i++) { + encoded = abi.encodePacked(encoded, encode_bytes_n(_payloads[i])); + } + + return encoded; +} + +function encode_abi_dynamic(bytes4 _selector, bool[] memory _isDynamic, bytes[] memory _values) + pure + returns (bytes memory) +{ + bytes memory encoded = abi.encodePacked(uint8(0x4b), uint8(0x00), _selector, uint8(_isDynamic.length)); + uint8 isDynamicBitmap = 0; + + // The first 8 values can be dynamic, this is marked using a bitmap + for (uint256 i = 0; i < 8 && i < _isDynamic.length; i++) { + if (_isDynamic[i]) { + isDynamicBitmap |= uint8(1 << i); + } + } + + encoded = abi.encodePacked(encoded, isDynamicBitmap); + + for (uint256 i = 0; i < _values.length; i++) { + if (_isDynamic[i]) { + encoded = abi.encodePacked(encoded, encode_bytes_n(_values[i])); + } else { + encoded = abi.encodePacked(encoded, encodeWord(abi.decode(_values[i], (uint256)))); + } + } + + return encoded; +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuff.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuff.t.sol new file mode 100644 index 000000000..0aef14817 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuff.t.sol @@ -0,0 +1,284 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "foundry_test/base/AdvTest.sol"; + +import "forge-std/console.sol"; +import "forge-std/console2.sol"; + +import {HuffConfig} from "foundry-huff/HuffConfig.sol"; +import {HuffDeployer} from "foundry-huff/HuffDeployer.sol"; + +import "contracts/modules/commons/interfaces/IModuleCalls.sol"; + +import "./L2CompressorEncoder.sol"; + +contract L2CompressorHuffTest is AdvTest { + address public imp; + + function setUp() public { + imp = address(HuffDeployer.config().with_evm_version("paris").deploy("L2Compressor")); + } + + function test_execute( + IModuleCalls.Transaction[] calldata _txs, + uint160 _space, + uint96 _nonce, + bytes calldata _signature + ) external { + vm.assume(_txs.length != 0 && _txs.length <= type(uint8).max); + + bytes32 packedNonce = abi.decode(abi.encodePacked(_space, _nonce), (bytes32)); + + bytes memory encoded = abi.encodePacked(hex"00", encodeWord(_space), encodeWord(_nonce), uint8(_txs.length)); + + for (uint256 i = 0; i < _txs.length; i++) { + IModuleCalls.Transaction memory t = _txs[i]; + + encoded = abi.encodePacked( + encoded, + build_flag(t.delegateCall, t.revertOnError, t.gasLimit != 0, t.value != 0, t.data.length != 0), + t.gasLimit != 0 ? encodeWord(t.gasLimit) : bytes(""), + encode_raw_address(t.target), + t.value != 0 ? encodeWord(t.value) : bytes(""), + t.data.length != 0 ? encode_bytes_n(t.data) : bytes("") + ); + } + + encoded = abi.encodePacked( + encoded, + encode_bytes_n(_signature), + encodeWord(uint256(uint160(address(0xEbD3186Ab4524330A866BE6866bE7bB55A173a23)))) + ); + + vm.expectCall( + address(0xEbD3186Ab4524330A866BE6866bE7bB55A173a23), + 0, + abi.encodeWithSelector(IModuleCalls.execute.selector, _txs, packedNonce, _signature) + ); + + (bool s, bytes memory r) = imp.call(encoded); + assertTrue(s); + assertEq(r, bytes("")); + } + + struct BatchMember { + IModuleCalls.Transaction[] txs; + uint160 space; + uint96 nonce; + bytes signature; + } + + function test_execute_many_2(BatchMember memory _batch1, BatchMember memory _batch2) external { + BatchMember[] memory batch = new BatchMember[](2); + batch[0] = _batch1; + batch[1] = _batch2; + test_execute_many(batch); + } + + function test_execute_many(BatchMember[] memory _batch) internal { + vm.assume(_batch.length != 0 && _batch.length <= type(uint8).max); + + uint256 size = mayBoundArr(_batch.length); + size = size == 0 ? 1 : size; + + bytes memory encoded = abi.encodePacked(hex"01", uint8(size)); + + for (uint256 i = 0; i < size; i++) { + vm.assume(_batch[i].txs.length <= type(uint8).max); + + if (_batch[i].txs.length == 0) { + _batch[i].txs = new IModuleCalls.Transaction[](1); + } + + bytes32 packedNonce = abi.decode(abi.encodePacked(_batch[i].space, _batch[i].nonce), (bytes32)); + + encoded = abi.encodePacked( + encoded, encodeWord(_batch[i].space), encodeWord(_batch[i].nonce), uint8(_batch[i].txs.length) + ); + + for (uint256 x = 0; x < _batch[i].txs.length; x++) { + IModuleCalls.Transaction memory t = _batch[i].txs[x]; + + encoded = abi.encodePacked( + encoded, + build_flag(t.delegateCall, t.revertOnError, t.gasLimit != 0, t.value != 0, t.data.length != 0), + t.gasLimit != 0 ? encodeWord(t.gasLimit) : bytes(""), + encode_raw_address(t.target), + t.value != 0 ? encodeWord(t.value) : bytes(""), + t.data.length != 0 ? encode_bytes_n(t.data) : bytes("") + ); + } + + // Derive a random address from i + address addr = address(uint160(uint256(keccak256(abi.encode(i))))); + + encoded = abi.encodePacked(encoded, encode_bytes_n(_batch[i].signature), encodeWord(uint256(uint160(addr)))); + + vm.expectCall( + addr, + 0, + abi.encodeWithSelector(IModuleCalls.execute.selector, _batch[i].txs, packedNonce, _batch[i].signature) + ); + } + + (bool s,) = imp.call{gas: type(uint64).max}(encoded); + assertTrue(s); + } + + function test_read_addresses() external { + vm.store(imp, bytes32(uint256(1)), bytes32(uint256(1000))); + vm.store(imp, bytes32(uint256(2)), bytes32(uint256(2000))); + + (bool s, bytes memory r) = imp.call(abi.encodePacked(hex"02", uint256(0))); + assertTrue(s); + + assertEq(r, abi.encode(bytes32(uint256(1000)))); + + (s, r) = imp.call(abi.encodePacked(hex"02", uint256(1))); + assertTrue(s); + + assertEq(r, abi.encode(bytes32(uint256(2000)))); + } + + function test_read_bytes32() external { + vm.store(imp, bytes32(uint256(0)) << 128, bytes32(uint256(1000))); + vm.store(imp, bytes32(uint256(1)) << 128, bytes32(uint256(2000))); + + (bool s, bytes memory r) = imp.call(abi.encodePacked(hex"03", uint256(0))); + assertTrue(s); + + assertEq(r, abi.encode(bytes32(uint256(1000)))); + + (s, r) = imp.call(abi.encodePacked(hex"03", uint256(1))); + assertTrue(s); + + assertEq(r, abi.encode(bytes32(uint256(2000)))); + } + + function test_read_storage_slots() external { + vm.store(imp, bytes32(uint256(0)) << 128, bytes32(uint256(1000))); + vm.store(imp, bytes32(uint256(1)) << 128, bytes32(uint256(2000))); + vm.store(imp, bytes32(uint256(1)), bytes32(uint256(4000))); + vm.store(imp, bytes32(uint256(2)), bytes32(uint256(5000))); + + (bool s, bytes memory r) = + imp.call(abi.encodePacked(hex"05", uint256(0) << 128, uint256(1), uint256(1) << 128, uint256(2))); + + assertTrue(s); + + assertEq(r, abi.encode(uint256(1000), uint256(4000), uint256(2000), uint256(5000))); + } + + function test_read_size() external { + bytes32 word = keccak256(abi.encode(uint256(0))); + vm.store(imp, bytes32(0), word); + + (bool s, bytes memory r) = imp.call(abi.encodePacked(hex"04")); + + assertTrue(s); + assertEq(r, abi.encode(word)); + } + + function test_decode_execute( + IModuleCalls.Transaction[] calldata _txs, + uint160 _space, + uint96 _nonce, + bytes calldata _signature + ) external { + vm.assume(_txs.length != 0 && _txs.length <= type(uint8).max); + + bytes32 packedNonce = abi.decode(abi.encodePacked(_space, _nonce), (bytes32)); + + bytes memory encoded = abi.encodePacked(hex"06", encodeWord(_space), encodeWord(_nonce), uint8(_txs.length)); + + for (uint256 i = 0; i < _txs.length; i++) { + IModuleCalls.Transaction memory t = _txs[i]; + + encoded = abi.encodePacked( + encoded, + build_flag(t.delegateCall, t.revertOnError, t.gasLimit != 0, t.value != 0, t.data.length != 0), + t.gasLimit != 0 ? encodeWord(t.gasLimit) : bytes(""), + encode_raw_address(t.target), + t.value != 0 ? encodeWord(t.value) : bytes(""), + t.data.length != 0 ? encode_bytes_n(t.data) : bytes("") + ); + } + + encoded = abi.encodePacked( + encoded, + encode_bytes_n(_signature), + encodeWord(uint256(uint160(address(0xEbD3186Ab4524330A866BE6866bE7bB55A173a23)))) + ); + + (bool s, bytes memory r) = imp.call(encoded); + assertTrue(s); + assertEq( + r, + abi.encodePacked( + abi.encodeWithSelector(IModuleCalls.execute.selector, _txs, packedNonce, _signature), + uint256(uint160(address(0xEbD3186Ab4524330A866BE6866bE7bB55A173a23))) + ) + ); + } + + function test_decode_execute_many_2(BatchMember memory _batch1, BatchMember memory _batch2) external { + BatchMember[] memory batch = new BatchMember[](2); + batch[0] = _batch1; + batch[1] = _batch2; + test_decode_execute_many(batch); + } + + function test_decode_execute_many(BatchMember[] memory _batch) internal { + vm.assume(_batch.length != 0 && _batch.length <= type(uint8).max); + + uint256 size = mayBoundArr(_batch.length); + size = size == 0 ? 1 : size; + + bytes memory encoded = abi.encodePacked(hex"07", uint8(size)); + + bytes memory expected; + + for (uint256 i = 0; i < size; i++) { + vm.assume(_batch[i].txs.length <= type(uint8).max); + + if (_batch[i].txs.length == 0) { + _batch[i].txs = new IModuleCalls.Transaction[](1); + } + + bytes32 packedNonce = abi.decode(abi.encodePacked(_batch[i].space, _batch[i].nonce), (bytes32)); + + encoded = abi.encodePacked( + encoded, encodeWord(_batch[i].space), encodeWord(_batch[i].nonce), uint8(_batch[i].txs.length) + ); + + for (uint256 x = 0; x < _batch[i].txs.length; x++) { + IModuleCalls.Transaction memory t = _batch[i].txs[x]; + + encoded = abi.encodePacked( + encoded, + build_flag(t.delegateCall, t.revertOnError, t.gasLimit != 0, t.value != 0, t.data.length != 0), + t.gasLimit != 0 ? encodeWord(t.gasLimit) : bytes(""), + encode_raw_address(t.target), + t.value != 0 ? encodeWord(t.value) : bytes(""), + t.data.length != 0 ? encode_bytes_n(t.data) : bytes("") + ); + } + + // Derive a random address from i + address addr = address(uint160(uint256(keccak256(abi.encode(i))))); + + encoded = abi.encodePacked(encoded, encode_bytes_n(_batch[i].signature), encodeWord(uint256(uint160(addr)))); + + expected = abi.encodePacked( + expected, + abi.encodeWithSelector(IModuleCalls.execute.selector, _batch[i].txs, packedNonce, _batch[i].signature), + uint256(uint160(addr)) + ); + } + + (bool s, bytes memory r) = imp.call{gas: type(uint64).max}(encoded); + assertTrue(s); + assertEq(r, expected); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadExecute.sol b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadExecute.sol new file mode 100644 index 000000000..d7c1f71d8 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadExecute.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "foundry_test/base/AdvTest.sol"; + +import "forge-std/console.sol"; +import "forge-std/console2.sol"; + +import {HuffConfig} from "foundry-huff/HuffConfig.sol"; +import {HuffDeployer} from "foundry-huff/HuffDeployer.sol"; + +import "contracts/modules/commons/interfaces/IModuleCalls.sol"; + +import "./L2CompressorEncoder.sol"; + +uint256 constant FMS = 0xa0; + +contract L2CompressorHuffReadExecuteTest is AdvTest { + address public imp; + + function setUp() public { + imp = address(HuffDeployer.config().with_evm_version("paris").deploy("imps/L2CompressorReadExecute")); + } + + function test_read_simple_execute( + IModuleCalls.Transaction[] calldata _txs, + uint160 _space, + uint96 _nonce, + bytes calldata _signature + ) external { + vm.assume(_txs.length != 0 && _txs.length <= type(uint8).max); + + bytes32 packedNonce = abi.decode(abi.encodePacked(_space, _nonce), (bytes32)); + + bytes memory encoded = abi.encodePacked(encodeWord(_space), encodeWord(_nonce), uint8(_txs.length)); + + for (uint256 i = 0; i < _txs.length; i++) { + IModuleCalls.Transaction memory t = _txs[i]; + + encoded = abi.encodePacked( + encoded, + build_flag(t.delegateCall, t.revertOnError, t.gasLimit != 0, t.value != 0, t.data.length != 0), + t.gasLimit != 0 ? encodeWord(t.gasLimit) : bytes(""), + encode_raw_address(t.target), + t.value != 0 ? encodeWord(t.value) : bytes(""), + t.data.length != 0 ? encode_bytes_n(t.data) : bytes("") + ); + } + + encoded = abi.encodePacked(encoded, encode_bytes_n(_signature)); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + // Encode using solidity + bytes memory solidityEncoded = + abi.encodeWithSelector(IModuleCalls.execute.selector, _txs, packedNonce, _signature); + assertEq(solidityEncoded, res); + } + + function test_read_nested_execute( + address _wallet, + IModuleCalls.Transaction[] calldata _txs, + uint160 _space, + uint96 _nonce, + bytes calldata _signature + ) external { + vm.assume(_txs.length != 0 && _txs.length <= type(uint8).max); + bytes32 packedNonce = abi.decode(abi.encodePacked(_space, _nonce), (bytes32)); + + IModuleCalls.Transaction[] memory outerTx = new IModuleCalls.Transaction[](1); + outerTx[0] = IModuleCalls.Transaction({ + delegateCall: false, + revertOnError: false, + gasLimit: 0, + target: _wallet, + value: 0, + data: abi.encodeWithSelector(IModuleCalls.execute.selector, _txs, packedNonce, _signature) + }); + + bytes memory outerSignature = hex"112233"; + bytes32 outerNonce = bytes32(0); + + bytes memory encoded = abi.encodePacked( + encodeWord(bytes32(0)), + encodeWord(bytes32(0)), + uint8(1), // One transaction + build_flag( + outerTx[0].delegateCall, + outerTx[0].revertOnError, + outerTx[0].gasLimit != 0, + outerTx[0].value != 0, + outerTx[0].data.length != 0 + ), + bytes(""), + encode_raw_address(outerTx[0].target), + bytes("") + ); + + // Encode the inner transaction + encoded = abi.encodePacked( + encoded, + uint8(0x26), // Read EXECUTE flag + encodeWord(_space), + encodeWord(_nonce), + uint8(_txs.length) + ); + + for (uint256 i = 0; i < _txs.length; i++) { + IModuleCalls.Transaction memory t = _txs[i]; + + encoded = abi.encodePacked( + encoded, + build_flag(t.delegateCall, t.revertOnError, t.gasLimit != 0, t.value != 0, t.data.length != 0), + t.gasLimit != 0 ? encodeWord(t.gasLimit) : bytes(""), + encode_raw_address(t.target), + t.value != 0 ? encodeWord(t.value) : bytes(""), + t.data.length != 0 ? encode_bytes_n(t.data) : bytes("") + ); + } + + encoded = abi.encodePacked(encoded, encode_bytes_n(_signature)); + + // Encode the outer signature + encoded = abi.encodePacked(encoded, encode_bytes_n(outerSignature)); + + (bool s, bytes memory r) = imp.staticcall(encoded); + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + // Encode using solidity + bytes memory solidityEncoded = + abi.encodeWithSelector(IModuleCalls.execute.selector, outerTx, outerNonce, outerSignature); + assertEq(solidityEncoded, res); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadFlag.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadFlag.t.sol new file mode 100644 index 000000000..49e59668b --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadFlag.t.sol @@ -0,0 +1,1018 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "foundry_test/base/AdvTest.sol"; + +import "forge-std/console.sol"; +import "forge-std/console2.sol"; + +import {HuffConfig} from "foundry-huff/HuffConfig.sol"; +import {HuffDeployer} from "foundry-huff/HuffDeployer.sol"; + +import "contracts/modules/commons/interfaces/IModuleCalls.sol"; + +import "./L2CompressorEncoder.sol"; + +uint256 constant FMS = 0xa0; + +contract L2CompressorHuffReadFlagTests is AdvTest { + address public imp; + + function setUp() public { + imp = address(HuffDeployer.config().with_evm_version("paris").deploy("imps/L2CompressorReadFlag")); + } + + function test_read_flag_bytes32_one(uint8 _val) external { + (bool s, bytes memory r) = imp.staticcall(abi.encodePacked(hex"01", _val)); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 2); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(uint256(_val)), res); + } + + function test_read_flag_bytes32_two(uint16 _val) external { + (bool s, bytes memory r) = imp.staticcall(abi.encodePacked(hex"02", _val)); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 3); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(uint256(_val)), res); + } + + function test_read_flag_bytes32_x(uint256 _size, bytes memory _content) public { + _size = bound(_size, 1, 32); + + (bool s, bytes memory r) = imp.staticcall(abi.encodePacked(uint8(_size), _content)); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 1 + _size); + assertEq(windex, FMS + 32); + + _content = abi.encodePacked(_content, bytes32(0)); + uint256 expected; + assembly { + expected := mload(add(_content, 0x20)) + expected := shr(sub(256, mul(_size, 8)), expected) + } + + assertEq(abi.encode(uint256(expected)), res); + } + + function test_read_flag_save_and_read_address(address _addr2) external { + address _addr = address(this); + (bool s, bytes memory r) = imp.call(abi.encodePacked(hex"21", _addr)); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, 1 + 20); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_addr), res); + + // Read the address at index 1 + (s, r) = imp.staticcall(abi.encodePacked(hex"23", uint16(1))); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 3); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_addr), res); + + // Save a second address + (s, r) = imp.call(abi.encodePacked(hex"21", _addr2)); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, 1 + 20); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_addr2), res); + + // Read second address using 3 bytes, 4 bytes and 5 bytes + (s, r) = imp.staticcall(abi.encodePacked(hex"24", uint24(2))); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 4); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_addr2), res); + + (s, r) = imp.staticcall(abi.encodePacked(hex"25", uint32(2))); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 5); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_addr2), res); + + (s, r) = imp.staticcall(abi.encodePacked(hex"25", uint32(2))); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 5); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_addr2), res); + } + + function test_read_flag_save_and_read_bytes32(bytes32 _b1, bytes32 _b2) external { + (bool s, bytes memory r) = imp.call(abi.encodePacked(hex"22", _b1)); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, 1 + 32); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_b1), res); + + // Read the address at index 1 + (s, r) = imp.staticcall(abi.encodePacked(hex"27", uint16(1))); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 3); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_b1), res); + + // Save a second address + (s, r) = imp.call(abi.encodePacked(hex"22", _b2)); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, 1 + 32); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_b2), res); + + // Read second address using 3 bytes, 4 bytes and 5 bytes + (s, r) = imp.staticcall(abi.encodePacked(hex"28", uint24(2))); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 4); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_b2), res); + + (s, r) = imp.staticcall(abi.encodePacked(hex"29", uint32(2))); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 5); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_b2), res); + + (s, r) = imp.staticcall(abi.encodePacked(hex"29", uint32(2))); + + assertTrue(s); + (rindex, windex, res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 5); + assertEq(windex, FMS + 32); + + assertEq(abi.encode(_b2), res); + } + + function test_read_flag_bytes_n(bytes calldata _data, bytes calldata _extra) external { + (bool s, bytes memory r) = + imp.staticcall(abi.encodePacked(hex"2b", hex"04", uint32(_data.length), _data, _extra)); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, _data.length + 1 + 1 + 4); + assertEq(windex, FMS + _data.length); + assertEq(res, _data); + } + + function test_read_flag_abi_encode_0(bytes4 _selector) external { + bytes memory encoded = encode_abi_call(_selector); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(_selector), res); + } + + function test_read_flag_abi_encode_1(bytes4 _selector, bytes32 _v1) external { + bytes memory encoded = encode_abi_call(_selector, _v1); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(_selector, _v1), res); + } + + function test_read_flag_abi_encode_2(bytes4 _selector, bytes32 _v1, bytes32 _v2) external { + bytes memory encoded = encode_abi_call(_selector, _v1, _v2); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(_selector, _v1, _v2), res); + } + + function test_read_flag_abi_encode_3(bytes4 _selector, bytes32 _v1, bytes32 _v2, bytes32 _v3) external { + bytes memory encoded = encode_abi_call(_selector, _v1, _v2, _v3); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(_selector, _v1, _v2, _v3), res); + } + + function test_read_flag_abi_encode_4(bytes4 _selector, bytes32 _v1, bytes32 _v2, bytes32 _v3, bytes32 _v4) + external + { + bytes memory encoded = encode_abi_call(_selector, _v1, _v2, _v3, _v4); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(_selector, _v1, _v2, _v3, _v4), res); + } + + function test_read_flag_abi_encode_5( + bytes4 _selector, + bytes32 _v1, + bytes32 _v2, + bytes32 _v3, + bytes32 _v4, + bytes32 _v5 + ) external { + bytes memory encoded = encode_abi_call(_selector, _v1, _v2, _v3, _v4, _v5); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(_selector, _v1, _v2, _v3, _v4, _v5), res); + } + + function test_read_flag_abi_encode_5( + bytes4 _selector, + bytes32 _v1, + bytes32 _v2, + bytes32 _v3, + bytes32 _v4, + bytes32 _v5, + bytes32 _v6 + ) external { + bytes memory encoded = encode_abi_call(_selector, _v1, _v2, _v3, _v4, _v5, _v6); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(_selector, _v1, _v2, _v3, _v4, _v5, _v6), res); + } + + function test_read_nested(bytes memory _dynamic, uint256 _val1, uint256 _val2) external { + bytes memory encoded = + encode_nested(encode_bytes_n(_dynamic), encode_nested(encodeWord(_val1), encodeWord(_val2))); + + (bool s, bytes memory r) = imp.staticcall(encoded); + assertEq(s, true); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(_dynamic, _val1, _val2), res); + } + + function test_read_encode_nested_long() external { + bytes[] memory vals = new bytes[](2000); + + for (uint256 i = 0; i < vals.length; i++) { + vals[i] = encodeWord(i * 2); + } + + bytes memory encoded = encode_nested(vals); + + (bool s, bytes memory r) = imp.staticcall(encoded); + assertEq(s, true); + + bytes memory expected; + for (uint256 i = 0; i < vals.length; i++) { + expected = abi.encodePacked(expected, uint256(i * 2)); + } + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(expected, res); + } + + function test_read_signature(uint8 _weight, bytes1[66] memory _sig) external { + bytes memory _sig2 = new bytes(66); + + for (uint256 i = 0; i < _sig.length; i++) { + _sig2[i] = _sig[i]; + } + + bytes memory encoded = encode_eoa_signature(_weight, _sig2); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + + assertEq(res, abi.encodePacked(uint8(0), _weight, _sig2)); + } + + function test_read_address(uint8 _weight, address _addr) external { + bytes memory encoded = encode_address(_weight, _addr); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + + assertEq(res, abi.encodePacked(uint8(1), _weight, _addr)); + } + + function test_read_node(bytes32 _node) external { + bytes memory encoded = encode_node(_node); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + + assertEq(res, abi.encodePacked(uint8(3), _node)); + } + + function test_read_subdigest(bytes32 _subdigest) external { + bytes memory encoded = encode_subdigest(_subdigest); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + + assertEq(res, abi.encodePacked(uint8(5), _subdigest)); + } + + function test_read_branch(bytes memory _data) external { + vm.assume(_data.length <= type(uint24).max); + + bytes memory encoded = encode_branch(_data); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + + assertEq(res, abi.encodePacked(uint8(4), uint24(_data.length), _data)); + } + + function test_read_nested(uint8 _weight, uint8 _threshold, bytes memory _data) external { + vm.assume(_data.length <= type(uint24).max); + + bytes memory encoded = encode_nested(_weight, _threshold, _data); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + + assertEq(res, abi.encodePacked(uint8(6), uint8(_weight), uint16(_threshold), uint24(_data.length), _data)); + } + + function test_read_dynamic_signature(uint8 _weight, address _signer, bytes memory _signature) external { + vm.assume(_signature.length <= type(uint24).max - 1); + + bytes memory encoded = encode_dynamic_signature(_weight, _signer, _signature); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + + assertEq( + res, + abi.encodePacked(uint8(2), uint8(_weight), _signer, uint24(_signature.length + 1), _signature, uint8(3)) + ); + } + + function test_read_sequence_signature(bool _noChainId, uint16 _threshold, uint32 _checkpoint, bytes memory _tree) + external + { + bytes memory encoded = encode_sequence_signature(_noChainId, _threshold, _checkpoint, _tree); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + + assertEq(res, abi.encodePacked(uint8(_noChainId ? 0x02 : 0x01), uint16(_threshold), uint32(_checkpoint), _tree)); + } + + function test_read_sequence_chained_signatures(bytes[] memory _signatures) external { + vm.assume(_signatures.length != 0); + for (uint256 i = 0; i < _signatures.length; i++) { + vm.assume(_signatures[i].length <= type(uint24).max); + } + + bytes memory encoded = encode_sequence_chained_signatures(_signatures); + + (bool s, bytes memory r) = imp.staticcall(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + + bytes memory expected = abi.encodePacked(uint8(0x03)); + + for (uint256 i = 0; i < _signatures.length; i++) { + expected = abi.encodePacked(expected, uint24(_signatures[i].length), _signatures[i]); + } + + assertEq(res, expected); + } + + function test_read_abi_dynamic_no_dynamic(bytes4 _selector, bytes32[] calldata _values) external { + vm.assume(_values.length <= type(uint8).max && _values.length != 0); + bool[] memory isDynamic = new bool[](_values.length); + bytes[] memory values = new bytes[](_values.length); + for (uint256 i = 0; i < _values.length; i++) { + values[i] = abi.encodePacked(_values[i]); + } + + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, values); + + (bool s, bytes memory r) = imp.staticcall(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + + assertEq(res, abi.encodePacked(_selector, _values)); + } + + function test_read_abi_dynamic_only_1(bytes4 _selector, bytes memory _data1) external { + bool[] memory isDynamic = new bool[](1); + bytes[] memory _values = new bytes[](1); + + isDynamic[0] = true; + + _values[0] = _data1; + + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, _values); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + + assertEq(res, abi.encodeWithSelector(_selector, _values[0])); + } + + function test_read_abi_dynamic_only_2(bytes4 _selector, bytes memory _data1, bytes memory _data2) external { + bool[] memory isDynamic = new bool[](2); + bytes[] memory _values = new bytes[](2); + + isDynamic[0] = true; + isDynamic[1] = true; + + _values[0] = _data1; + _values[1] = _data2; + + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, _values); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + + assertEq(res, abi.encodeWithSelector(_selector, _values[0], _values[1])); + } + + function test_read_abi_dynamic_only_3( + bytes4 _selector, + bytes memory _data1, + bytes memory _data2, + bytes memory _data3 + ) external { + bool[] memory isDynamic = new bool[](3); + bytes[] memory _values = new bytes[](3); + + isDynamic[0] = true; + isDynamic[1] = true; + isDynamic[2] = true; + + _values[0] = _data1; + _values[1] = _data2; + _values[2] = _data3; + + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, _values); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + + assertEq(res, abi.encodeWithSelector(_selector, _values[0], _values[1], _values[2])); + } + + function test_read_abi_dynamic_only_8( + bytes4 _selector, + bytes memory _data1, + bytes memory _data2, + bytes memory _data3, + bytes memory _data4, + bytes memory _data5, + bytes memory _data6, + bytes memory _data7, + bytes memory _data8 + ) external { + bytes memory r; + uint256 el; + + { + bool[] memory isDynamic = new bool[](8); + bytes[] memory _values = new bytes[](8); + + isDynamic[0] = true; + isDynamic[1] = true; + isDynamic[2] = true; + isDynamic[3] = true; + isDynamic[4] = true; + isDynamic[5] = true; + isDynamic[6] = true; + isDynamic[7] = true; + + _values[0] = _data1; + _values[1] = _data2; + _values[2] = _data3; + _values[3] = _data4; + _values[4] = _data5; + _values[5] = _data6; + _values[6] = _data7; + _values[7] = _data8; + + bool s; + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, _values); + + (s, r) = imp.staticcall(encoded); + el = encoded.length; + assertTrue(s); + } + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, el); + + assertEq(res, abi.encodeWithSelector(_selector, _data1, _data2, _data3, _data4, _data5, _data6, _data7, _data8)); + } + + function test_read_mixed_2(bytes4 _selector, bytes32 _data1, bytes memory _data2) external { + bool[] memory isDynamic = new bool[](2); + bytes[] memory _values = new bytes[](2); + + isDynamic[0] = false; + isDynamic[1] = true; + + _values[0] = abi.encodePacked(_data1); + _values[1] = _data2; + + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, _values); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + bytes memory expected = abi.encodeWithSelector(_selector, _data1, _data2); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + + assertEq(res, expected); + } + + function test_read_mixed_2b(bytes4 _selector, bytes memory _data1, bytes32 _data2) external { + bool[] memory isDynamic = new bool[](2); + bytes[] memory _values = new bytes[](2); + + isDynamic[0] = true; + isDynamic[1] = false; + + _values[0] = _data1; + _values[1] = abi.encodePacked(_data2); + + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, _values); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + bytes memory expected = abi.encodeWithSelector(_selector, _data1, _data2); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + + assertEq(res, expected); + } + + function test_read_abi_mixed_8b( + bytes4 _selector, + bytes32 _data1, + bytes memory _data2, + bytes32 _data3, + bytes memory _data4, + bytes memory _data5, + bytes memory _data6, + bytes32 _data7, + bytes32 _data8 + ) external { + bytes memory r; + uint256 el; + + { + bool[] memory isDynamic = new bool[](8); + bytes[] memory _values = new bytes[](8); + + isDynamic[0] = false; + isDynamic[1] = true; + isDynamic[2] = false; + isDynamic[3] = true; + isDynamic[4] = true; + isDynamic[5] = true; + isDynamic[6] = false; + isDynamic[7] = false; + + _values[0] = abi.encodePacked(_data1); + _values[1] = _data2; + _values[2] = abi.encodePacked(_data3); + _values[3] = _data4; + _values[4] = _data5; + _values[5] = _data6; + _values[6] = abi.encodePacked(_data7); + _values[7] = abi.encodePacked(_data8); + + bool s; + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, _values); + + (s, r) = imp.staticcall(encoded); + el = encoded.length; + assertTrue(s); + } + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, el); + + assertEq(res, abi.encodeWithSelector(_selector, _data1, _data2, _data3, _data4, _data5, _data6, _data7, _data8)); + } + + function test_read_abi_mixed_8b( + bytes4 _selector, + bytes memory _data1, + bytes32 _data2, + bytes32 _data3, + bytes memory _data4, + bytes memory _data5, + bytes32 _data6, + bytes memory _data7, + bytes memory _data8 + ) external { + bytes memory r; + uint256 el; + + { + bool[] memory isDynamic = new bool[](8); + bytes[] memory _values = new bytes[](8); + + isDynamic[0] = true; + isDynamic[1] = false; + isDynamic[2] = false; + isDynamic[3] = true; + isDynamic[4] = true; + isDynamic[5] = false; + isDynamic[6] = true; + isDynamic[7] = true; + + _values[0] = _data1; + _values[1] = abi.encodePacked(_data2); + _values[2] = abi.encodePacked(_data3); + _values[3] = _data4; + _values[4] = _data5; + _values[5] = abi.encodePacked(_data6); + _values[6] = _data7; + _values[7] = _data8; + + bool s; + bytes memory encoded = encode_abi_dynamic(_selector, isDynamic, _values); + + (s, r) = imp.staticcall(encoded); + el = encoded.length; + assertTrue(s); + } + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, el); + + assertEq(res, abi.encodeWithSelector(_selector, _data1, _data2, _data3, _data4, _data5, _data6, _data7, _data8)); + } + + function test_read_no_op() external { + bytes memory encoded = abi.encodePacked(uint8(0x4c)); + + (bool s, bytes memory r) = imp.staticcall(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, 1); + assertEq(windex, FMS + res.length); + assertEq(res.length, 0); + } + + function test_mirror_flag() external { + bytes memory encoded = abi.encodePacked( + encode_nested(encodeWord(type(uint256).max - 1), abi.encodePacked(uint8(0x4d), uint16(0x02))) + ); + + (bool s, bytes memory r) = imp.staticcall(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + assertEq(res, abi.encodePacked(type(uint256).max - 1, type(uint256).max - 1)); + } + + function test_copy_calldata() external { + bytes memory encoded = abi.encodePacked( + encode_nested(encodeWord(type(uint256).max - 1), abi.encodePacked(uint8(0x4e), uint16(0x03), uint8(0x21))) + ); + + (bool s, bytes memory r) = imp.staticcall(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + assertEq(res, abi.encodePacked(type(uint256).max - 1, type(uint256).max - 1, uint8(0x4e))); + } + + function test_read_storage_flag_addr(address _addr) external { + _addr = address(this); + bytes memory encoded = abi.encodePacked( + encode_nested(abi.encodePacked(uint8(0x21), _addr), abi.encodePacked(uint8(0x4f), uint16(0x02))) + ); + + (bool s, bytes memory r) = imp.call(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + assertEq(res, abi.encode(_addr, _addr)); + } + + function test_read_literal(uint256 _val) external { + bytes memory encoded = encodeWord(_val); + + (bool s, bytes memory r) = imp.call(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + assertEq(res, abi.encode(_val)); + } + + function test_read_pow_10(uint256 _exp) external { + _exp = bound(_exp, 0, 77); + + // First bit means we aren't going to multiply it after + bytes memory encoded = abi.encodePacked(uint8(0x00), uint8(_exp) | uint8(0x80)); + + (bool s, bytes memory r) = imp.call(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + assertEq(res, abi.encode(uint256(10 ** _exp))); + } + + function test_read_pow_10_and_mul(uint256 _exp, uint8 _mantissa) external { + _exp = bound(_exp, 1, 77); + + // First bit means we aren't going to multiply it after + bytes memory encoded = abi.encodePacked(uint8(0x00), uint8(_exp), uint8(_mantissa)); + + (bool s, bytes memory r) = imp.call(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + unchecked { + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + assertEq(res, abi.encode(uint256(10 ** _exp) * uint256(_mantissa))); + } + } + + function test_read_pow_10_and_mul_l(uint256 _exp, uint256 _mantissa) external { + _exp = bound(_exp, 0, 63); + _mantissa = bound(_mantissa, 0, 0x3ffff); + + // Encode the 3 byte word, the first 3 bits are the exponent, the rest is the mantissa + bytes3 word = bytes3(uint24(_exp) << 18 | uint24(_mantissa)); + + // First bit means we aren't going to multiply it after + bytes memory encoded = abi.encodePacked(uint8(0x2a), word); + + (bool s, bytes memory r) = imp.call(encoded); + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + uint256 expected; + unchecked { + expected = uint256(10 ** _exp) * uint256(_mantissa); + } + + unchecked { + assertEq(windex, FMS + res.length); + assertEq(rindex, encoded.length); + assertEq(res, abi.encode(expected)); + } + } + + function test_read_self_execute() external { + // vm.assume(_txs.length != 0 && _txs.length <= type(uint8).max); + + IModuleCalls.Transaction[] memory _txs = new IModuleCalls.Transaction[](1); + + bytes memory encoded = abi.encodePacked(uint8(0x00), uint8(0x00), uint8(_txs.length)); + + for (uint256 i = 0; i < _txs.length; i++) { + IModuleCalls.Transaction memory t = _txs[i]; + + encoded = abi.encodePacked( + encoded, + build_flag(t.delegateCall, t.revertOnError, t.gasLimit != 0, t.value != 0, t.data.length != 0), + t.gasLimit != 0 ? encodeWord(t.gasLimit) : bytes(""), + encode_raw_address(t.target), + t.value != 0 ? encodeWord(t.value) : bytes(""), + t.data.length != 0 ? encode_bytes_n(t.data) : bytes("") + ); + } + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + bytes memory solidityEncoded = abi.encodeWithSelector(IModuleCalls.selfExecute.selector, _txs); + assertEq(solidityEncoded, res); + } + + function test_read_flag_abi_encode_by_index() external { + bytes memory encoded = abi.encodePacked(uint8(0x2d), uint8(0x01)); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(hex"a9059cbb", res); + } + + function test_read_flag_abi_encode_by_index_2() external { + bytes memory encoded = abi.encodePacked(uint8(0x2d), uint8(0x02)); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(hex"095ea7b3", res); + } + + function test_read_flag_abi_encode_by_index_2_args(bytes32 _arg) external { + bytes memory encoded = abi.encodePacked(uint8(0x2e), uint8(0x01), encodeWord(_arg)); + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, FMS + res.length); + assertEq(abi.encodePacked(hex"a9059cbb", _arg), res); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadNonce.sol b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadNonce.sol new file mode 100644 index 000000000..ad1045685 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadNonce.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "foundry_test/base/AdvTest.sol"; + +import "forge-std/console.sol"; +import "forge-std/console2.sol"; + +import {HuffConfig} from "foundry-huff/HuffConfig.sol"; +import {HuffDeployer} from "foundry-huff/HuffDeployer.sol"; + +import "contracts/modules/commons/interfaces/IModuleCalls.sol"; + +uint256 constant FMS = 0xa0; + +import "./L2CompressorEncoder.sol"; + +contract L2CompressorHuffReadNonceTest is AdvTest { + address public imp; + + function setUp() public { + imp = address(HuffDeployer.config().with_evm_version("paris").deploy("imps/L2CompressorReadNonce")); + } + + function test_read_simple_nonce() external { + uint256 space = 76518466025766696338879503773554426820412884125; + uint256 nonce = 29095922913147819529123945996; + + bytes32 compact = 0x0d6734e95e00251b768924d47d52db3270fcc49d5e039555a5312d84eb305e0c; + + bytes memory encoded = abi.encodePacked(encodeWord(space), encodeWord(nonce)); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + assertEq(compact, abi.decode(res, (bytes32))); + } + + function test_read_nonce(uint160 _space, uint96 _nonce) external { + bytes memory encoded = abi.encodePacked(encodeWord(_space), encodeWord(_nonce)); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + assertEq(abi.encodePacked(_space, _nonce), res); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadTx.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadTx.t.sol new file mode 100644 index 000000000..a8682f1da --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadTx.t.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "foundry_test/base/AdvTest.sol"; + +import "forge-std/console.sol"; +import "forge-std/console2.sol"; + +import {HuffConfig} from "foundry-huff/HuffConfig.sol"; +import {HuffDeployer} from "foundry-huff/HuffDeployer.sol"; + +import "contracts/modules/commons/interfaces/IModuleCalls.sol"; + +import "./L2CompressorEncoder.sol"; + +uint256 constant FMS = 0xa0; + +contract L2CompressorHuffReadTxTests is AdvTest { + address public imp; + + function setUp() public { + imp = address(HuffDeployer.config().with_evm_version("paris").deploy("imps/L2CompressorReadTx")); + } + + function test_read_simple_transaction(address _addr) external { + bytes memory encoded = abi.encodePacked(build_flag(true, true, false, false, false), encode_raw_address(_addr)); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + IModuleCalls.Transaction memory t; + t.delegateCall = true; + t.revertOnError = true; + t.target = _addr; + + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + // Abi encode prefixes with the point on which the data starts + // we don't do it on the compressor, so we need to append 32 + assertEq(abi.encodePacked(abi.encode(32), res), abi.encode(t)); + } + + function test_read_simple_transaction_with_data(address _addr, bytes memory _data) external { + bytes memory encoded = abi.encodePacked( + build_flag(true, true, false, false, true), encode_raw_address(_addr), encode_bytes_n(_data) + ); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + IModuleCalls.Transaction memory t; + t.delegateCall = true; + t.revertOnError = true; + t.target = _addr; + t.data = _data; + + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + // Abi encode prefixes with the point on which the data starts + // we don't do it on the compressor, so we need to append 32 + assertEq(abi.encodePacked(abi.encode(32), res), abi.encode(t)); + } + + function test_read_transaction(IModuleCalls.Transaction memory _tx) external { + bytes memory encoded = abi.encodePacked( + build_flag(_tx.delegateCall, _tx.revertOnError, _tx.gasLimit != 0, _tx.value != 0, _tx.data.length != 0), + _tx.gasLimit != 0 ? encodeWord(_tx.gasLimit) : bytes(""), + encode_raw_address(_tx.target), + _tx.value != 0 ? encodeWord(_tx.value) : bytes(""), + _tx.data.length != 0 ? encode_bytes_n(_tx.data) : bytes("") + ); + + console.logBytes(encoded); + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + // Abi encode prefixes with the point on which the data starts + // we don't do it on the compressor, so we need to append 32 + assertEq(abi.encodePacked(abi.encode(32), res), abi.encode(_tx)); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadTxs.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadTxs.t.sol new file mode 100644 index 000000000..499a2c26f --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/utils/L2CompressorHuffReadTxs.t.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "foundry_test/base/AdvTest.sol"; + +import "forge-std/console.sol"; +import "forge-std/console2.sol"; + +import {HuffConfig} from "foundry-huff/HuffConfig.sol"; +import {HuffDeployer} from "foundry-huff/HuffDeployer.sol"; + +import "contracts/modules/commons/interfaces/IModuleCalls.sol"; + +uint256 constant FMS = 0xa0; + +import "./L2CompressorEncoder.sol"; + +contract L2CompressorHuffReadTxTests is AdvTest { + address public imp; + + function setUp() public { + imp = address(HuffDeployer.config().with_evm_version("paris").deploy("imps/L2CompressorReadTxs")); + } + + function test_read_simple_2_transactions() external { + address _addr = address(0x1234567890123456789012345678901234567890); + address _addr2 = address(this); + bytes memory encoded = abi.encodePacked( + uint8(0x02), + build_flag(false, true, false, false, false), + encode_raw_address(_addr), + build_flag(true, true, false, false, false), + encode_raw_address(_addr2) + ); + + (bool s, bytes memory r) = imp.staticcall{gas: 10000}(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + IModuleCalls.Transaction[] memory t = new IModuleCalls.Transaction[](2); + t[0].delegateCall = false; + t[0].revertOnError = true; + t[0].target = _addr; + t[1].delegateCall = true; + t[1].revertOnError = true; + t[1].target = _addr2; + + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + // Abi encode prefixes with the point on which the data starts + // we don't do it on the compressor, so we need to append 32 + assertEq(abi.encodePacked(abi.encode(32), res), abi.encode(t)); + } + + function test_read_simple_2_transactions_asymetric() external { + address _addr = address(0x1234567890123456789012345678901234567890); + address _addr2 = address(this); + bytes memory _data = hex"123456789012345678901234567890123456789012345678901234567890123456789011222211"; + + bytes memory encoded = abi.encodePacked( + uint8(0x02), + build_flag(false, true, false, false, true), + encode_raw_address(_addr), + encode_bytes_n(_data), + build_flag(true, true, false, false, false), + encode_raw_address(_addr2) + ); + + (bool s, bytes memory r) = imp.staticcall{gas: 10000}(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + IModuleCalls.Transaction[] memory t = new IModuleCalls.Transaction[](2); + t[0].delegateCall = false; + t[0].revertOnError = true; + t[0].target = _addr; + t[0].data = _data; + t[1].delegateCall = true; + t[1].revertOnError = true; + t[1].target = _addr2; + + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + // Abi encode prefixes with the point on which the data starts + // we don't do it on the compressor, so we need to append 32 + assertEq(abi.encodePacked(abi.encode(32), res), abi.encode(t)); + } + + function test_read_transactions(IModuleCalls.Transaction[] memory _txs) external { + vm.assume(_txs.length != 0 && _txs.length <= type(uint8).max); + + bytes memory encoded = abi.encodePacked(uint8(_txs.length)); + + for (uint256 i = 0; i < _txs.length; i++) { + IModuleCalls.Transaction memory t = _txs[i]; + + encoded = abi.encodePacked( + encoded, + build_flag(t.delegateCall, t.revertOnError, t.gasLimit != 0, t.value != 0, t.data.length != 0), + t.gasLimit != 0 ? encodeWord(t.gasLimit) : bytes(""), + encode_raw_address(t.target), + t.value != 0 ? encodeWord(t.value) : bytes(""), + t.data.length != 0 ? encode_bytes_n(t.data) : bytes("") + ); + } + + (bool s, bytes memory r) = imp.staticcall(encoded); + + assertTrue(s); + (uint256 rindex, uint256 windex, bytes memory res) = abi.decode(r, (uint256, uint256, bytes)); + + assertEq(rindex, encoded.length); + assertEq(windex, res.length + FMS); + + // Abi encode prefixes with the point on which the data starts + // we don't do it on the compressor, so we need to append 32 + assertEq(abi.encodePacked(abi.encode(32), res), abi.encode(_txs)); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/modules/utils/RequireUtils.t.sol b/packages/wallet/wallet-contracts/foundry_test/modules/utils/RequireUtils.t.sol new file mode 100644 index 000000000..370c53726 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/modules/utils/RequireUtils.t.sol @@ -0,0 +1,158 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/Factory.sol"; +import "contracts/modules/commons/ModuleCalls.sol"; +import "contracts/modules/utils/RequireUtils.sol"; + +import "contracts/mocks/ERC20Mock.sol"; +import "contracts/mocks/ERC721Mock.sol"; +import "contracts/mocks/ERC1155Mock.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract ModuleCallsImp is ModuleCalls { + function writeNonce(uint256 _space, uint256 _nonce) external { + _writeNonce(_space, _nonce); + } + + // Module Auth imp + mapping(bytes32 => mapping(bytes => bytes32)) public sigToSubdigest; + mapping(bytes32 => mapping(bytes => bool)) public sigToIsValid; + + function _signatureValidation(bytes32 _digest, bytes calldata _signature) + internal + view + override + returns (bool, bytes32) + {} + + function signatureRecovery(bytes32, bytes calldata) + public + view + override + returns (uint256, uint256, bytes32, bytes32, uint256) + {} + + function _isValidImage(bytes32) internal view override returns (bool) {} + + function updateImageHash(bytes32) external override {} + + function _updateImageHash(bytes32) internal override {} +} + +contract RequireUtilsTest is AdvTest { + ModuleCallsImp private imp; + RequireUtils private requireUtils; + ERC20Mock private erc20; + ERC721Mock private erc721; + ERC1155Mock private erc1155; + + function setUp() external { + requireUtils = new RequireUtils(); + ModuleCallsImp template = new ModuleCallsImp(); + Factory factory = new Factory(); + imp = ModuleCallsImp(factory.deploy(address(template), bytes32(0))); + erc20 = new ERC20Mock(1000 * 10 ** 18); + erc721 = new ERC721Mock(); + erc1155 = new ERC1155Mock(); + } + + function test_requireNonExpired(uint256 _expiration) external { + if (block.timestamp >= _expiration) { + vm.expectRevert(bytes("RequireUtils#requireNonExpired: EXPIRED")); + } + requireUtils.requireNonExpired(_expiration); + } + + function test_requireMinNonce(uint160 _space, uint96 _nonce, uint96 _nonceToCheck) external { + imp.writeNonce(_space, _nonce); + uint256 encoded = abi.decode(abi.encodePacked(_space, _nonceToCheck), (uint256)); + if (_nonce < _nonceToCheck) { + vm.expectRevert(bytes("RequireUtils#requireMinNonce: NONCE_BELOW_REQUIRED")); + } + requireUtils.requireMinNonce(address(imp), encoded); + } + + function test_requireMinNonceWithExactNonce(uint160 _space, uint96 _nonce) external { + imp.writeNonce(_space, _nonce); + uint256 encoded = abi.decode(abi.encodePacked(_space, _nonce), (uint256)); + requireUtils.requireMinNonce(address(imp), encoded); + } + + function test_requireMinERC20Balance(uint256 _minBalance) external { + uint256 balance = erc20.balanceOf(address(this)); + + if (balance < _minBalance) { + vm.expectRevert(bytes("RequireUtils#requireMinERC20Balance: BALANCE_TOO_LOW")); + } + requireUtils.requireMinERC20Balance(address(erc20), address(this), _minBalance); + } + + function test_requireMinERC20Allowance(uint256 _minAllowance) external { + erc20.approve(address(imp), 100 * 10 ** 18); + + uint256 allowance = erc20.allowance(address(this), address(imp)); + + if (allowance < _minAllowance) { + vm.expectRevert(bytes("RequireUtils#requireMinERC20Allowance: ALLOWANCE_TOO_LOW")); + } + requireUtils.requireMinERC20Allowance(address(erc20), address(this), address(imp), _minAllowance); + } + + function test_requireERC721Ownership(uint256 _tokenId) external { + if (_tokenId % 2 == 0) { + erc721.mint(address(imp), _tokenId); + } else { + erc721.mint(address(this), _tokenId); + } + + if (erc721.ownerOf(_tokenId) != address(this)) { + vm.expectRevert(bytes("RequireUtils#requireERC721Ownership: NOT_OWNER")); + } + requireUtils.requireERC721Ownership(address(erc721), address(this), _tokenId); + } + + function test_requireERC721Approval(uint256 _tokenId) external { + erc721.mint(address(this), _tokenId); + + if (_tokenId % 2 == 0) { + erc721.approve(address(imp), _tokenId); + } + + if (_tokenId % 5 == 0) { + erc721.setApprovalForAll(address(imp), true); + } + + address approved = erc721.getApproved(_tokenId); + + if (approved != address(imp) && !erc721.isApprovedForAll(address(this), address(imp))) { + vm.expectRevert(bytes("RequireUtils#requireERC721Approval: NOT_APPROVED")); + } + requireUtils.requireERC721Approval(address(erc721), address(this), address(imp), _tokenId); + } + + function test_requireMinERC1155Balance(uint256 _tokenId, uint256 _minBalance) external { + if (_tokenId % 2 == 0) { + erc1155.mint(address(this), _tokenId, _minBalance); + } + + uint256 balance = erc1155.balanceOf(address(this), _tokenId); + + if (balance < _minBalance) { + vm.expectRevert(bytes("RequireUtils#requireMinERC1155Balance: BALANCE_TOO_LOW")); + } + requireUtils.requireMinERC1155Balance(address(erc1155), address(this), _tokenId, _minBalance); + } + + function test_requireERC1155Approval(uint256 _tokenId) external { + if (_tokenId % 2 == 0) { + erc1155.setApprovalForAll(address(imp), true); + } + + if (!erc1155.isApprovedForAll(address(this), address(imp))) { + vm.expectRevert(bytes("RequireUtils#requireERC1155Approval: NOT_APPROVED")); + } + requireUtils.requireERC1155Approval(address(erc1155), address(this), address(imp)); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/trust/Trust.t.sol b/packages/wallet/wallet-contracts/foundry_test/trust/Trust.t.sol new file mode 100644 index 000000000..3563991e8 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/trust/Trust.t.sol @@ -0,0 +1,867 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/trust/Trust.sol"; +import "contracts/interfaces/IERC1271Wallet.sol"; + +import "foundry_test/base/AdvTest.sol"; + +function min(uint256 a, uint256 b) pure returns (uint256) { + return a < b ? a : b; +} + +contract MockFail { + bytes revertData; + + constructor(bytes memory _revertData) { + revertData = _revertData; + } + + fallback() external payable { + bytes memory rd = revertData; + assembly { + revert(add(rd, 0x20), mload(rd)) + } + } +} + +contract MockContractSigner { + mapping(bytes32 => mapping(bytes => bytes4)) public staticSignatures; + bytes public staticRevertErr; + bool public staticReverts; + + function isValidSignature(bytes32 _hash, bytes calldata _signature) external view returns (bytes4 magicValue) { + if (staticReverts) { + bytes memory rd = staticRevertErr; + assembly { + revert(add(rd, 0x20), mload(rd)) + } + } + + return staticSignatures[_hash][_signature]; + } + + function setSignature(bytes32 _hash, bytes calldata _signature, bytes4 _magicValue) external { + staticSignatures[_hash][_signature] = _magicValue; + } + + function setRevertErr(bool _reverts, bytes calldata _revertErr) external { + staticRevertErr = _revertErr; + staticReverts = _reverts; + } +} + +contract TrustTest is AdvTest { + Trust private trust; + + function test_define_initial_parameters(uint256 _ownerPk, uint256 _beneficiaryPk, uint256 _duration) external { + trust = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + assertEq(trust.owner(), vm.addr(boundPk(_ownerPk))); + assertEq(trust.beneficiary(), vm.addr(boundPk(_beneficiaryPk))); + assertEq(trust.duration(), _duration); + } + + function test_start_locked(uint256 _ownerPk, uint256 _beneficiaryPk, uint256 _duration) external { + trust = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + assertEq(trust.isLocked(), true); + } + + function test_fail_schedule_unlock_too_early( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _schedule + ) external { + vm.assume(_duration != 0); + + _schedule = bound(_schedule, 0, _duration - 1); + trust = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_ownerPk))); + vm.expectRevert( + abi.encodeWithSignature("UnlockTooEarly(uint256,uint256)", block.timestamp + _schedule, _schedule) + ); + trust.setUnlocksAt(block.timestamp + _schedule); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + vm.expectRevert( + abi.encodeWithSignature("UnlockTooEarly(uint256,uint256)", block.timestamp + _schedule, _schedule) + ); + trust.setUnlocksAt(block.timestamp + _schedule); + } + + function test_fail_schedule_in_the_past( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _schedule + ) external { + _schedule = bound(_schedule, 1, block.timestamp); + trust = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_ownerPk))); + vm.expectRevert( + abi.encodeWithSignature("UnlockInThePast(uint256,uint256)", block.timestamp - _schedule, _schedule) + ); + trust.setUnlocksAt(block.timestamp - _schedule); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + vm.expectRevert( + abi.encodeWithSignature("UnlockInThePast(uint256,uint256)", block.timestamp - _schedule, _schedule) + ); + trust.setUnlocksAt(block.timestamp - _schedule); + } + + function test_fail_schedule_non_allowed( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _badActorpk, + uint256 _duration, + uint256 _unlockAt + ) external { + _badActorpk = boundDiff(boundPk(_badActorpk), boundPk(_ownerPk), boundPk(_beneficiaryPk)); + + trust = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_badActorpk))); + vm.expectRevert(abi.encodeWithSignature("NotOwner(address)", vm.addr(boundPk(_badActorpk)))); + trust.setUnlocksAt(_unlockAt); + } + + event SetUnlocksAt(uint256 _unlocksAt); + + function test_schedule_unlock( + uint256 _ownerPk, + uint256 _beneficiaryPk, + bool _asOwner, + uint256 _duration, + uint256 _unlockAt + ) external { + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + + trust = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_asOwner ? _ownerPk : _beneficiaryPk))); + + vm.expectEmit(true, true, true, true, address(trust)); + emit SetUnlocksAt(_unlockAt); + + trust.setUnlocksAt(_unlockAt); + assertEq(trust.unlocksAt(), _unlockAt); + } + + function test_wait_for_unlock( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra + ) external { + vm.assume(block.timestamp != type(uint256).max); + + _duration = bound(_duration, 0, (type(uint256).max - 1) - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max - 1); + _extra = bound(_extra, 0, type(uint256).max - _unlockAt); + + trust = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + trust.setUnlocksAt(_unlockAt); + + if (_duration > 0) { + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + assertEq(trust.isLocked(), true); + } + + vm.warp(_unlockAt + _extra); + assertEq(trust.isLocked(), false); + } + + function gen_and_unlock( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra + ) internal returns (Trust) { + _duration = bound(_duration, 0, (type(uint256).max - 1) - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max - 1); + _extra = bound(_extra, 0, type(uint256).max - _unlockAt); + + trust = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + trust.setUnlocksAt(_unlockAt); + + vm.warp(_unlockAt + _extra); + + return trust; + } + + event SentTransaction(address _to, uint256 _value, bytes _data, bytes _result); + + function test_send_transaction_after_unlock( + uint256 _ownerPk, + uint256 _beneficiaryPk, + bool _ownerSender, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + uint256 _toPk, + uint256 _value, + bytes calldata _data + ) external { + Trust t = gen_and_unlock(_ownerPk, _beneficiaryPk, _duration, _unlockAt, _extra); + + vm.deal(address(this), _value); + payable(address((t))).transfer(_value); + + vm.prank(vm.addr(boundPk(_ownerSender ? _ownerPk : _beneficiaryPk))); + vm.expectCall(vm.addr(boundPk(_toPk)), _value, _data); + + vm.expectEmit(true, true, true, true, address(t)); + emit SentTransaction(vm.addr(boundPk(_toPk)), _value, _data, new bytes(0)); + + t.sendTransaction(payable(vm.addr(boundPk(_toPk))), _value, _data); + + assertEq(vm.addr(boundPk(_toPk)).balance, _value); + } + + function test_send_transaction_pre_unlock_as_owner( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _toPk, + uint256 _value, + bytes calldata _data + ) external { + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + + Trust t = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.deal(address(this), _value); + payable(address((t))).transfer(_value); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + t.setUnlocksAt(_unlockAt); + + vm.prank(vm.addr(boundPk(_ownerPk))); + vm.expectCall(vm.addr(boundPk(_toPk)), _value, _data); + t.sendTransaction(payable(vm.addr(boundPk(_toPk))), _value, _data); + } + + function test_fail_send_transaction_pre_unlock_as_beneficiary( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _toPk, + uint256 _value, + uint256 _elapsed, + bytes calldata _data + ) external { + _duration = bound(_duration, 1, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + _elapsed = bound(_elapsed, 0, (_unlockAt - block.timestamp) - 1); + + vm.assume(vm.addr(boundPk(_ownerPk)) != vm.addr(boundPk(_beneficiaryPk))); + + Trust t = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.deal(address(this), _value); + payable(address((t))).transfer(_value); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + t.setUnlocksAt(_unlockAt); + + vm.warp(block.timestamp + _elapsed); + + assertEq(t.isLocked(), true); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + vm.expectRevert(abi.encodeWithSignature("NotUnlocked(uint256)", _unlockAt)); + t.sendTransaction(payable(vm.addr(boundPk(_toPk))), _value, _data); + } + + function test_fail_send_transaction_non_allowed( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _badActorPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _elapsed, + uint256 _toPk, + uint256 _value, + bytes calldata _data + ) external { + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + _elapsed = bound(_elapsed, 0, type(uint256).max - block.timestamp); + + _badActorPk = boundDiff(boundPk(_badActorPk), boundPk(_ownerPk), boundPk(_beneficiaryPk)); + + Trust t = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.deal(address(this), _value); + payable(address((t))).transfer(_value); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + t.setUnlocksAt(_unlockAt); + + vm.warp(block.timestamp + _elapsed); + + vm.prank(vm.addr(boundPk(_badActorPk))); + vm.expectRevert(abi.encodeWithSignature("NotOwner(address)", vm.addr(boundPk(_badActorPk)))); + t.sendTransaction(payable(vm.addr(boundPk(_toPk))), _value, _data); + } + + function test_fail_bubble_up_fail( + uint256 _ownerPk, + uint256 _beneficiaryPk, + bool _ownerSender, + uint256 _duration, + uint256 _unlockAt, + uint256 _value, + uint256 _extra, + bytes calldata _data, + bytes calldata _revertData + ) external { + address sender = vm.addr(boundPk(_ownerSender ? _ownerPk : _beneficiaryPk)); + + Trust t = gen_and_unlock(_ownerPk, _beneficiaryPk, _duration, _unlockAt, _extra); + + vm.deal(address(this), _value); + payable(address((t))).transfer(_value); + + MockFail mf = new MockFail(_revertData); + + vm.prank(sender); + + vm.expectRevert( + abi.encodeWithSignature( + "FailedTransaction(address,uint256,bytes,bytes)", address(mf), _value, _data, _revertData + ) + ); + + t.sendTransaction(payable(address(mf)), _value, _data); + } + + function test_isValidSignature( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + bool _signedByOwner, + bytes calldata _message + ) external { + uint256 signerPk = boundPk(_signedByOwner ? _ownerPk : _beneficiaryPk); + + Trust t = gen_and_unlock(_ownerPk, _beneficiaryPk, _duration, _unlockAt, _extra); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(t), rawHash, block.chainid)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, finalHash); + + bytes memory sig = abi.encodePacked(r, s, v, uint8(1), _signedByOwner ? bytes1(0x00) : bytes1(0x01)); + + assertEq(t.isValidSignature(rawHash, sig), bytes4(0x1626ba7e)); + assertEq(t.isValidSignature(_message, sig), bytes4(0x20c13b0b)); + } + + function test_isValidSignature_anyNetwork( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + uint64 _useChainId, + bool _signedByOwner, + bytes calldata _message + ) external { + uint256 signerPk = boundPk(_signedByOwner ? _ownerPk : _beneficiaryPk); + + Trust t = gen_and_unlock(_ownerPk, _beneficiaryPk, _duration, _unlockAt, _extra); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(t), rawHash, 0)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, finalHash); + + bytes memory sig = abi.encodePacked(r, s, v, uint8(1), _signedByOwner ? bytes1(0x02) : bytes1(0x03)); + + vm.chainId(_useChainId); + assertEq(t.isValidSignature(rawHash, sig), bytes4(0x1626ba7e)); + assertEq(t.isValidSignature(_message, sig), bytes4(0x20c13b0b)); + } + + function test_fail_isValidSignature_anyNetwork_wrongEncode( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + uint64 _useChainId, + bool _signedByOwner, + bytes calldata _message + ) external { + vm.assume(_useChainId != 0); + + uint256 signerPk = boundPk(_signedByOwner ? _ownerPk : _beneficiaryPk); + + Trust t = gen_and_unlock(_ownerPk, _beneficiaryPk, _duration, _unlockAt, _extra); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(t), rawHash, 0)); + bytes32 realHash = keccak256(abi.encode(address(t), rawHash, _useChainId)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, finalHash); + + bytes memory sig = abi.encodePacked(r, s, v, uint8(1), _signedByOwner ? bytes1(0x00) : bytes1(0x01)); + + vm.chainId(_useChainId); + + bytes memory revertErr = abi.encodeWithSignature( + "InvalidSignature(bytes32,bytes32,address,bytes)", + rawHash, + realHash, + vm.addr(signerPk), + abi.encodePacked(r, s, v, uint8(1)) + ); + + vm.expectRevert(revertErr); + t.isValidSignature(rawHash, sig); + + vm.expectRevert(revertErr); + t.isValidSignature(_message, sig); + } + + function test_fail_isValidSignature_anyNetwork_onlyEncode( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + uint64 _useChainId, + bool _signedByOwner, + bytes calldata _message + ) external { + vm.assume(_useChainId != 0); + + uint256 signerPk = boundPk(_signedByOwner ? _ownerPk : _beneficiaryPk); + + Trust t = gen_and_unlock(_ownerPk, _beneficiaryPk, _duration, _unlockAt, _extra); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(t), rawHash, _useChainId)); + bytes32 realHash = keccak256(abi.encode(address(t), rawHash, 0)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(signerPk, finalHash); + + bytes memory sig = abi.encodePacked(r, s, v, uint8(1), _signedByOwner ? bytes1(0x02) : bytes1(0x03)); + + vm.chainId(_useChainId); + + bytes memory revertErr = abi.encodeWithSignature( + "InvalidSignature(bytes32,bytes32,address,bytes)", + rawHash, + realHash, + vm.addr(signerPk), + abi.encodePacked(r, s, v, uint8(1)) + ); + + vm.expectRevert(revertErr); + t.isValidSignature(rawHash, sig); + + vm.expectRevert(revertErr); + t.isValidSignature(_message, sig); + } + + function test_isValidSignature_pre_unlock_as_owner( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + bytes calldata _message + ) external { + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + + Trust t = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + t.setUnlocksAt(_unlockAt); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(t), rawHash, block.chainid)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(boundPk(_ownerPk), finalHash); + + bytes memory sig = abi.encodePacked(r, s, v, uint8(1), bytes1(0x00)); + + assertEq(t.isValidSignature(rawHash, sig), bytes4(0x1626ba7e)); + assertEq(t.isValidSignature(_message, sig), bytes4(0x20c13b0b)); + } + + function test_fail_isValidSignature_emptySignature( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + bytes calldata _message + ) external { + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + + Trust t = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + t.setUnlocksAt(_unlockAt); + + bytes memory sig = new bytes(0); + + vm.expectRevert(abi.encodeWithSignature("EmptySignature()")); + t.isValidSignature(_message, sig); + + vm.expectRevert(abi.encodeWithSignature("EmptySignature()")); + t.isValidSignature(keccak256(_message), sig); + } + + function test_fail_isValidSignature_wrongSignatureFlag( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + uint8 _signerFlag, + bytes calldata _signature, + bytes calldata _message + ) external { + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + _signerFlag = uint8(bound(_signerFlag, 4, type(uint8).max)); + + Trust t = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + t.setUnlocksAt(_unlockAt); + + bytes memory sig = abi.encodePacked(_signature, _signerFlag); + + vm.expectRevert(abi.encodeWithSignature("InvalidSignatureFlag(bytes,bytes1)", sig, bytes1(_signerFlag))); + t.isValidSignature(_message, sig); + + vm.expectRevert(abi.encodeWithSignature("InvalidSignatureFlag(bytes,bytes1)", sig, bytes1(_signerFlag))); + t.isValidSignature(keccak256(_message), sig); + } + + function test_fail_isValidSignature_pre_unlock_as_beneficiary( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _duration, + uint256 _unlockAt, + bytes calldata _message + ) external { + _duration = bound(_duration, 1, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + + vm.assume(boundPk(_ownerPk) != boundPk(_beneficiaryPk)); + Trust t = new Trust(vm.addr(boundPk(_ownerPk)), vm.addr(boundPk(_beneficiaryPk)), _duration); + + vm.prank(vm.addr(boundPk(_beneficiaryPk))); + t.setUnlocksAt(_unlockAt); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(t), rawHash, block.chainid)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(boundPk(_beneficiaryPk), finalHash); + + bytes memory sig = abi.encodePacked(r, s, v, uint8(1), bytes1(0x01)); + + vm.expectRevert(abi.encodeWithSignature("NotUnlocked(uint256)", _unlockAt)); + t.isValidSignature(rawHash, sig); + + vm.expectRevert(abi.encodeWithSignature("NotUnlocked(uint256)", _unlockAt)); + t.isValidSignature(_message, sig); + } + + struct MemoryStruct1 { + bytes32 rawHash; + bytes32 finalHash; + uint8 v; + bytes32 r; + bytes32 s; + } + + function test_fail_isValidSignature_invalid_signature( + uint256 _ownerPk, + uint256 _beneficiaryPk, + uint256 _badSignerPk, + bool _signsOwner, + uint256 _duration, + uint256 _unlockAt, + bytes calldata _message + ) external { + _ownerPk = boundPk(_ownerPk); + _beneficiaryPk = boundPk(_beneficiaryPk); + _badSignerPk = boundPk(_badSignerPk); + + address expectedSigner = _signsOwner ? vm.addr(_ownerPk) : vm.addr(_beneficiaryPk); + + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + + trust = new Trust(vm.addr(_ownerPk), vm.addr(_beneficiaryPk), _duration); + + vm.prank(vm.addr(_beneficiaryPk)); + trust.setUnlocksAt(_unlockAt); + + if (_signsOwner) { + vm.assume(_ownerPk != _badSignerPk); + } else { + vm.assume(_beneficiaryPk != _badSignerPk); + // Advance clock to unlock + vm.warp(_unlockAt); + } + + MemoryStruct1 memory m; + { + // Stack too deep manual workaround + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(trust), rawHash, block.chainid)); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_badSignerPk, finalHash); + m.rawHash = rawHash; + m.finalHash = finalHash; + m.v = v; + m.r = r; + m.s = s; + } + + bytes memory sig = abi.encodePacked(m.r, m.s, m.v, uint8(1), _signsOwner ? bytes1(0x00) : bytes1(0x01)); + + bytes memory revertErr = abi.encodeWithSignature( + "InvalidSignature(bytes32,bytes32,address,bytes)", + m.rawHash, + m.finalHash, + expectedSigner, + abi.encodePacked(m.r, m.s, m.v, uint8(1)) + ); + + vm.expectRevert(revertErr); + trust.isValidSignature(m.rawHash, sig); + + vm.expectRevert(revertErr); + trust.isValidSignature(_message, sig); + } + + function test_accept_contract_signature_for_owner( + address _beneficiaryAddress, + uint256 _duration, + uint256 _unlockAt, + uint256 _elapsed, + bytes calldata _signature, + bytes calldata _message + ) external { + MockContractSigner mcs = new MockContractSigner(); + + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + _elapsed = bound(_elapsed, 0, type(uint256).max - block.timestamp); + + trust = new Trust(address(mcs), _beneficiaryAddress, _duration); + + vm.prank(_beneficiaryAddress); + trust.setUnlocksAt(_unlockAt); + + vm.warp(block.timestamp + _elapsed); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(trust), rawHash, block.chainid)); + mcs.setSignature(finalHash, _signature, bytes4(0x1626ba7e)); + bytes memory sig = abi.encodePacked(_signature, uint8(3), bytes1(0x00)); + + assertEq(trust.isValidSignature(rawHash, sig), bytes4(0x1626ba7e)); + assertEq(trust.isValidSignature(_message, sig), bytes4(0x20c13b0b)); + } + + function test_fail_bad_contract_signature_for_owner( + address _beneficiaryAddress, + uint256 _duration, + uint256 _unlockAt, + uint256 _elapsed, + bytes4 _badReturnBytes, + bytes calldata _badSignature, + bytes calldata _message + ) external { + vm.assume(_badReturnBytes != bytes4(0x1626ba7e)); + + MockContractSigner mcs = new MockContractSigner(); + + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + _elapsed = bound(_elapsed, 0, type(uint256).max - block.timestamp); + + trust = new Trust(address(mcs), _beneficiaryAddress, _duration); + + vm.prank(_beneficiaryAddress); + trust.setUnlocksAt(_unlockAt); + + vm.warp(block.timestamp + _elapsed); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(trust), rawHash, block.chainid)); + mcs.setSignature(finalHash, _badSignature, _badReturnBytes); + bytes memory sig = abi.encodePacked(_badSignature, uint8(3), bytes1(0x00)); + + bytes memory revertErr = abi.encodeWithSignature( + "InvalidSignature(bytes32,bytes32,address,bytes)", + rawHash, + finalHash, + address(mcs), + abi.encodePacked(_badSignature, uint8(3)) + ); + + vm.expectRevert(revertErr); + trust.isValidSignature(rawHash, sig); + + vm.expectRevert(revertErr); + trust.isValidSignature(_message, sig); + } + + function test_accept_contract_signature_for_beneficiary( + address _ownerAddress, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + bytes calldata _signature, + bytes calldata _message + ) external { + MockContractSigner mcs = new MockContractSigner(); + + _duration = bound(_duration, 0, (type(uint256).max - 1) - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max - 1); + _extra = bound(_extra, 0, type(uint256).max - _unlockAt); + + trust = new Trust(_ownerAddress, address(mcs), _duration); + + vm.prank(address(mcs)); + trust.setUnlocksAt(_unlockAt); + + vm.warp(_unlockAt + _extra); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(trust), rawHash, block.chainid)); + mcs.setSignature(finalHash, _signature, bytes4(0x1626ba7e)); + bytes memory sig = abi.encodePacked(_signature, uint8(3), bytes1(0x01)); + + assertEq(trust.isValidSignature(rawHash, sig), bytes4(0x1626ba7e)); + assertEq(trust.isValidSignature(_message, sig), bytes4(0x20c13b0b)); + } + + function test_fail_bad_contract_signature_for_beneficiary( + address _ownerAddress, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + bytes4 _badReturnBytes, + bytes calldata _badSignature, + bytes calldata _message + ) external { + vm.assume(_badReturnBytes != bytes4(0x1626ba7e)); + + MockContractSigner mcs = new MockContractSigner(); + + _duration = bound(_duration, 0, (type(uint256).max - 1) - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max - 1); + _extra = bound(_extra, 0, type(uint256).max - _unlockAt); + + trust = new Trust(_ownerAddress, address(mcs), _duration); + + vm.prank(address(mcs)); + trust.setUnlocksAt(_unlockAt); + + vm.warp(_unlockAt + _extra); + + bytes32 rawHash = keccak256(_message); + bytes32 finalHash = keccak256(abi.encode(address(trust), rawHash, block.chainid)); + mcs.setSignature(finalHash, _badSignature, _badReturnBytes); + bytes memory sig = abi.encodePacked(_badSignature, uint8(3), bytes1(0x01)); + + bytes memory revertErr = abi.encodeWithSignature( + "InvalidSignature(bytes32,bytes32,address,bytes)", + rawHash, + finalHash, + address(mcs), + abi.encodePacked(_badSignature, uint8(3)) + ); + + vm.expectRevert(revertErr); + trust.isValidSignature(rawHash, sig); + + vm.expectRevert(revertErr); + trust.isValidSignature(_message, sig); + } + + function test_fail_revert_contract_signer_owner( + address _beneficiaryAddress, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + bytes calldata _revertErr, + bytes calldata _signature, + bytes calldata _message + ) external { + MockContractSigner mcs = new MockContractSigner(); + + _duration = bound(_duration, 0, type(uint256).max - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max); + _extra = bound(_extra, 0, type(uint256).max - _unlockAt); + + trust = new Trust(address(mcs), _beneficiaryAddress, _duration); + + vm.prank(_beneficiaryAddress); + trust.setUnlocksAt(_unlockAt); + + vm.warp(block.timestamp + _extra); + + bytes32 rawHash = keccak256(_message); + mcs.setRevertErr(true, _revertErr); + bytes memory sig = abi.encodePacked(_signature, uint8(3), bytes1(0x00)); + + vm.expectRevert(_revertErr); + trust.isValidSignature(rawHash, sig); + + vm.expectRevert(_revertErr); + trust.isValidSignature(_message, sig); + } + + function test_fail_revert_contract_signer_beneficiary( + address _ownerAddress, + uint256 _duration, + uint256 _unlockAt, + uint256 _extra, + bytes calldata _revertErr, + bytes calldata _signature, + bytes calldata _message + ) external { + MockContractSigner mcs = new MockContractSigner(); + + _duration = bound(_duration, 0, (type(uint256).max - 1) - block.timestamp); + _unlockAt = bound(_unlockAt, block.timestamp + _duration, type(uint256).max - 1); + _extra = bound(_extra, 0, type(uint256).max - _unlockAt); + + trust = new Trust(_ownerAddress, address(mcs), _duration); + + vm.prank(address(mcs)); + trust.setUnlocksAt(_unlockAt); + + vm.warp(_unlockAt + _extra); + + bytes32 rawHash = keccak256(_message); + mcs.setRevertErr(true, _revertErr); + bytes memory sig = abi.encodePacked(_signature, uint8(3), bytes1(0x01)); + + vm.expectRevert(_revertErr); + trust.isValidSignature(rawHash, sig); + + vm.expectRevert(_revertErr); + trust.isValidSignature(_message, sig); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/trust/TrustFactory.t.sol b/packages/wallet/wallet-contracts/foundry_test/trust/TrustFactory.t.sol new file mode 100644 index 000000000..87e08cec2 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/trust/TrustFactory.t.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/trust/TrustFactory.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract TrustFactoryTest is AdvTest { + TrustFactory private factory; + + function setUp() external { + factory = new TrustFactory(); + } + + function test_create_trust(address _owner, address _beneficiary, uint256 _duration) external { + Trust trust = factory.deploy(_owner, _beneficiary, _duration); + address trustAddress = address(trust); + + assertEq(trust.owner(), _owner); + assertEq(trust.beneficiary(), _beneficiary); + assertEq(trust.duration(), _duration); + + uint256 codeSize; + assembly { codeSize := extcodesize(trustAddress) } + assertGt(codeSize, 0); + } + + function test_predict_address(address _owner, address _beneficiary, uint256 _duration) external { + address expected = factory.addressOf(_owner, _beneficiary, _duration); + address actual = address(factory.deploy(_owner, _beneficiary, _duration)); + assertEq(actual, expected); + } + + function test_fail_deploy_twice(address _owner, address _beneficiary, uint256 _duration) external { + factory.deploy(_owner, _beneficiary, _duration); + vm.expectRevert(); + factory.deploy(_owner, _beneficiary, _duration); + } + + function test_fail_deploy_low_gas(address _owner, address _beneficiary, uint256 _duration, uint256 _gas) external { + _gas = bound(_gas, 21000, block.gaslimit); + try factory.deploy{gas: _gas}(_owner, _beneficiary, _duration) returns (Trust trust) { + address trustAddress = address(trust); + // The address should have code, and never be the zero address + assertNotEq(trustAddress, address(0)); + uint256 codeSize; + assembly { codeSize := extcodesize(trustAddress) } + assertGt(codeSize, 0); + } catch { + // Ignore errors from low gas + } + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/utils/LibAddress.t.sol b/packages/wallet/wallet-contracts/foundry_test/utils/LibAddress.t.sol new file mode 100644 index 000000000..525d6166b --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/utils/LibAddress.t.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/utils/LibAddress.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract LibAddressTest is AdvTest { + function test_isContract(address _addr, bytes calldata _code) external { + boundNoSys(_addr); + + vm.etch(_addr, _code); + assertEq(LibAddress.isContract(_addr), _code.length > 0); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/utils/LibBytes.t.sol b/packages/wallet/wallet-contracts/foundry_test/utils/LibBytes.t.sol new file mode 100644 index 000000000..bfb5debae --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/utils/LibBytes.t.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/utils/LibBytes.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract LibBytesImp { + using LibBytes for bytes; + + function readBytes32(bytes calldata _data, uint256 _index) external pure returns (bytes32) { + return _data.readBytes32(_index); + } + + function readUint8(bytes calldata _data, uint256 _index) external pure returns (uint8) { + return _data.readUint8(_index); + } + + function readFirstUint16(bytes calldata _data) external pure returns (uint16) { + return _data.readFirstUint16(); + } + + function readUint32(bytes calldata _data, uint256 _index) external pure returns (uint32) { + return _data.readUint32(_index); + } +} + +contract LibBytesTest is AdvTest { + LibBytesImp private lib; + + function setUp() external { + lib = new LibBytesImp(); + } + + function test_readBytes32(bytes calldata _prefix, bytes32 _data, bytes calldata _sufix) external { + bytes memory combined = abi.encodePacked(_prefix, _data, _sufix); + bytes32 actual = lib.readBytes32(combined, _prefix.length); + assertEq(actual, _data); + } + + function test_readBytes32_OutOfBounds(bytes calldata _data, uint256 _index) external view { + lib.readBytes32(_data, _index); + } + + function test_readBytes32_Fuzz_AbiDecode(bytes calldata _data, uint256 _index) external { + _index = bound(_index, 0, _data.length > 32 ? _data.length - 32 : 0); + bytes32 expected = abi.decode(abi.encodePacked(_data[_index:], bytes32(0)), (bytes32)); + bytes32 actual = lib.readBytes32(_data, _index); + assertEq(expected, actual); + } + + function test_readUint8(bytes calldata _prefix, uint8 _data, bytes calldata _sufix) external { + bytes memory combined = abi.encodePacked(_prefix, _data, _sufix); + uint8 expected = lib.readUint8(combined, _prefix.length); + assertEq(expected, _data); + } + + function test_readUint8_OutOfBounds(bytes calldata _data, uint256 _index) external view { + lib.readUint8(_data, _index); + } + + function test_readUint8_Fuzz_ReadByte(bytes calldata _data, uint256 _index) external { + vm.assume(_data.length >= 1); + + _index = bound(_index, 0, _data.length - 1); + uint8 expected = uint8(uint256(bytes32(_data[_index])) >> 248); + uint8 actual = lib.readUint8(_data, _index); + + assertEq(expected, actual); + } + + function test_readFirstUint16(uint16 _data, bytes calldata _sufix) external { + bytes memory combined = abi.encodePacked(_data, _sufix); + uint16 expected = lib.readFirstUint16(combined); + assertEq(expected, _data); + } + + function test_readFirstUint16_OutOfBounds(uint8 _data) external { + bytes memory encoded = abi.encodePacked(_data); + + uint16 actual = lib.readFirstUint16(bytes("")); + assertEq(actual, uint16(0)); + + actual = lib.readFirstUint16(encoded); + assertEq(actual, uint256(_data) << 8); + } + + function test_readFirstUint16_Fuzz_AbiDecode(bytes calldata _data) external { + uint256 expected = abi.decode(abi.encodePacked(_data, bytes32(0)), (uint256)); + uint16 actual = lib.readFirstUint16(_data); + + assertEq(expected >> 240, actual); + } + + function test_readUint32(bytes calldata _prefix, uint32 _data, bytes calldata _sufix) external { + bytes memory combined = abi.encodePacked(_prefix, _data, _sufix); + uint32 expected = lib.readUint32(combined, _prefix.length); + assertEq(expected, _data); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/utils/LibBytesPointer.t.sol b/packages/wallet/wallet-contracts/foundry_test/utils/LibBytesPointer.t.sol new file mode 100644 index 000000000..c8459d187 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/utils/LibBytesPointer.t.sol @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/utils/LibBytes.sol"; +import "contracts/utils/LibBytesPointer.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract LibBytesPointerImp { + using LibBytesPointer for bytes; + + function readFirstUint16(bytes calldata _data) external pure returns (uint16, uint256) { + return _data.readFirstUint16(); + } + + function readUint8(bytes calldata _data, uint256 _index) external pure returns (uint8, uint256) { + return _data.readUint8(_index); + } + + function readUint8Address(bytes calldata _data, uint256 _index) external pure returns (uint8, address, uint256) { + return _data.readUint8Address(_index); + } + + function readUint16(bytes calldata _data, uint256 _index) external pure returns (uint16, uint256) { + return _data.readUint16(_index); + } + + function readUint24(bytes calldata _data, uint256 _index) external pure returns (uint24, uint256) { + return _data.readUint24(_index); + } + + function readUint64(bytes calldata _data, uint256 _index) external pure returns (uint64, uint256) { + return _data.readUint64(_index); + } + + function readBytes32(bytes calldata _data, uint256 _index) external pure returns (bytes32, uint256) { + return _data.readBytes32(_index); + } +} + +contract LibBytesPointerTest is AdvTest { + using LibBytes for bytes; + + LibBytesPointerImp private lib; + + function setUp() public { + lib = new LibBytesPointerImp(); + } + + function test_readFirstUint16_Fuzz_LibBytes(bytes calldata _data) external { + uint16 expected = _data.readFirstUint16(); + (uint16 actual, uint256 index) = lib.readFirstUint16(_data); + assertEq(actual, expected); + assertEq(index, 2); + } + + function test_readUint8_Fuzz_LibBytes(bytes calldata _data, uint256 _pointer) external { + uint8 expected = _data.readUint8(_pointer); + (uint8 actual, uint256 newPointer) = lib.readUint8(_data, _pointer); + assertEq(actual, expected); + unchecked { + assertEq(newPointer, _pointer + 1); + } + } + + function test_readUint8Address(bytes calldata _prefix, uint8 _data1, address _data2, bytes calldata _sufix) + external + { + bytes memory combined = abi.encodePacked(_prefix, _data1, _data2, _sufix); + (uint8 actual1, address actual2, uint256 newPointer) = lib.readUint8Address(combined, _prefix.length); + assertEq(actual1, _data1); + assertEq(actual2, _data2); + assertEq(newPointer, _prefix.length + 21); + } + + function test_readUint8Address_OutOfBounds(bytes calldata _data, uint256 _pointer) external { + (,, uint256 newPointer) = lib.readUint8Address(_data, _pointer); + unchecked { + assertEq(newPointer, _pointer + 21); + } + } + + function test_readUint16_Fuzz_ReadFirstUint16(bytes calldata _data, uint256 _pointer) external { + vm.assume(_data.length >= 16); + + _pointer = bound(_pointer, 0, _data.length - 16); + (uint16 expected,) = lib.readFirstUint16(_data[_pointer:]); + (uint16 actual, uint256 newPointer) = lib.readUint16(_data, _pointer); + assertEq(actual, expected); + unchecked { + assertEq(newPointer, _pointer + 2); + } + } + + function test_readUint16_OutOfBounds(bytes calldata _data, uint256 _pointer) external { + (, uint256 newPointer) = lib.readUint16(_data, _pointer); + unchecked { + assertEq(newPointer, _pointer + 2); + } + } + + function test_readUint24(bytes calldata _prefix, uint24 _data, bytes calldata _sufix) external { + bytes memory combined = abi.encodePacked(_prefix, _data, _sufix); + (uint256 actual, uint256 newPointer) = lib.readUint24(combined, _prefix.length); + assertEq(actual, _data); + assertEq(newPointer, _prefix.length + 3); + } + + function test_readUint24_OutOfBounds(bytes calldata _data, uint256 _pointer) external { + (, uint256 newPointer) = lib.readUint24(_data, _pointer); + unchecked { + assertEq(newPointer, _pointer + 3); + } + } + + function test_readUint64(bytes calldata _prefix, uint64 _data, bytes calldata _sufix) external { + bytes memory combined = abi.encodePacked(_prefix, _data, _sufix); + (uint64 actual, uint256 newPointer) = lib.readUint64(combined, _prefix.length); + assertEq(actual, _data); + assertEq(newPointer, _prefix.length + 8); + } + + function test_readUint64_OutOfBounds(bytes calldata _data, uint256 _pointer) external { + (, uint256 newPointer) = lib.readUint64(_data, _pointer); + unchecked { + assertEq(newPointer, _pointer + 8); + } + } + + function test_readBytes32(bytes calldata _prefix, bytes32 _data, bytes calldata _sufix) external { + bytes memory combined = abi.encodePacked(_prefix, _data, _sufix); + (bytes32 actual, uint256 newPointer) = lib.readBytes32(combined, _prefix.length); + assertEq(actual, _data); + assertEq(newPointer, _prefix.length + 32); + } + + function test_readBytes32_OutOfBounds(bytes calldata _data, uint256 _pointer) external { + (, uint256 newPointer) = lib.readBytes32(_data, _pointer); + unchecked { + assertEq(newPointer, _pointer + 32); + } + } + + function test_readBytes32_Fuzz_LibBytes(bytes calldata _data, uint256 _index) external { + bytes32 expected = _data.readBytes32(_index); + (bytes32 actual, uint256 index) = lib.readBytes32(_data, _index); + assertEq(actual, expected); + unchecked { + assertEq(index, _index + 32); + } + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/utils/LibOptim.t.sol b/packages/wallet/wallet-contracts/foundry_test/utils/LibOptim.t.sol new file mode 100644 index 000000000..ef80dbf90 --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/utils/LibOptim.t.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/utils/LibOptim.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract WillReturn { + bytes private r; + + constructor(bytes memory _r) { + r = _r; + } + + fallback() external { + bytes memory res = r; + assembly { + return(add(res, 32), mload(res)) + } + } +} + +contract LibOptimTest is AdvTest { + function test_fkeccak256_Bytes32_Bytes32_Fuzz(bytes32 _a, bytes32 _b) external { + bytes32 expected = keccak256(abi.encodePacked(_a, _b)); + bytes32 actual = LibOptim.fkeccak256(_a, _b); + assertEq(expected, actual); + } + + function test_returnData_Fuzz(bytes memory _data) external { + WillReturn r = new WillReturn(_data); + + (bool suc, bytes memory res1) = address(r).call(bytes("")); + assertEq(suc, true); + assertEq(res1, _data); + + uint256 pointer1; + assembly { pointer1 := mload(0x40) } + assertTrue(pointer1 != 0); + + bytes memory optres = LibOptim.returnData(); + assertEq(res1, optres); + + uint256 pointer2; + assembly { pointer2 := mload(0x40) } + assertEq(pointer2 - pointer1, res1.length + 32); + + uint256 positionArr; + assembly { positionArr := optres } + assertEq(positionArr, pointer1); + } + + function test_call(address _to, uint256 _val, bytes calldata _data) external { + _to = boundNoSys(_to); + _to = boundDiff(_to, address(0x004e59b44847b379578588920ca78fbf26c0b4956c)); + + vm.expectCall(_to, _data); + vm.deal(_to, 0); + vm.deal(address(this), _val); + LibOptim.call(_to, _val, gasleft(), _data); + assertEq(_to.balance, _val); + } +} diff --git a/packages/wallet/wallet-contracts/foundry_test/utils/SignatureValidator.t.sol b/packages/wallet/wallet-contracts/foundry_test/utils/SignatureValidator.t.sol new file mode 100644 index 000000000..6ce92787e --- /dev/null +++ b/packages/wallet/wallet-contracts/foundry_test/utils/SignatureValidator.t.sol @@ -0,0 +1,199 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.18; + +import "contracts/utils/SignatureValidator.sol"; + +import "foundry_test/base/AdvTest.sol"; + +contract SignatureValidatorImp { + function recoverSigner(bytes32 _hash, bytes calldata _signature) external pure returns (address) { + return SignatureValidator.recoverSigner(_hash, _signature); + } + + function isValidSignature(bytes32 _hash, address _signer, bytes calldata _signature) external view returns (bool) { + return SignatureValidator.isValidSignature(_hash, _signer, _signature); + } +} + +contract SignatureValidatorTest is AdvTest { + SignatureValidatorImp private lib; + + uint8 private constant SIG_TYPE_EIP712 = 1; + uint8 private constant SIG_TYPE_ETH_SIGN = 2; + uint8 private constant SIG_TYPE_WALLET_BYTES32 = 3; + + function setUp() public { + lib = new SignatureValidatorImp(); + } + + function test_recoverSigner_EIP712(uint256 _pk, bytes32 _hash) external { + _pk = boundPk(_pk); + + address signer = vm.addr(_pk); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_pk, _hash); + + address recovered = lib.recoverSigner(_hash, abi.encodePacked(r, s, v, SIG_TYPE_EIP712)); + assertEq(signer, recovered); + } + + function test_recoverSigner_ETHSIGN(uint256 _pk, bytes32 _hash) external { + _pk = boundPk(_pk); + + address signer = vm.addr(_pk); + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(_pk, keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash))); + + address recovered = lib.recoverSigner(_hash, abi.encodePacked(r, s, v, SIG_TYPE_ETH_SIGN)); + assertEq(signer, recovered); + } + + function test_recoverSigner_fail_InvalidSValue(bytes32 _hash, bytes32 _r, uint256 _s, uint8 _v, uint8 _type) + external + { + _s = bound(_s, 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1, type(uint256).max); + + bytes memory signature = abi.encodePacked(_r, _s, _v, _type); + vm.expectRevert(abi.encodeWithSignature("InvalidSValue(bytes,bytes32)", signature, _s)); + lib.recoverSigner(_hash, signature); + } + + function test_recoverSigner_fail_InvalidVValue(bytes32 _hash, bytes32 _r, uint256 _s, uint8 _v, uint8 _type) + external + { + _v = uint8(boundDiff(_v, 27, 28)); + + _s = bound(_s, 0, 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0); + bytes memory signature = abi.encodePacked(_r, _s, _v, _type); + vm.expectRevert(abi.encodeWithSignature("InvalidVValue(bytes,uint256)", signature, _v)); + lib.recoverSigner(_hash, signature); + } + + function test_recoverSigner_fail_InvalidLength(bytes32 _hash, bytes calldata _signature) external { + vm.assume(_signature.length != 66); + + vm.expectRevert(abi.encodeWithSignature("InvalidSignatureLength(bytes)", _signature)); + lib.recoverSigner(_hash, _signature); + } + + function test_recoverSigner_fail_UnsupportedSignatureType( + bytes32 _hash, + bytes32 _r, + uint256 _s, + uint8 _v, + uint8 _type + ) external { + _type = uint8(boundDiff(_type, SIG_TYPE_EIP712, SIG_TYPE_ETH_SIGN)); + + _s = bound(_s, 0, 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0); + _v = uint8(bound(_v, 27, 28)); + + bytes memory signature = abi.encodePacked(_r, _s, _v, _type); + vm.expectRevert(abi.encodeWithSignature("UnsupportedSignatureType(bytes,uint256,bool)", signature, _type, true)); + lib.recoverSigner(_hash, signature); + } + + function test_recoverSigner_fail_RecoverAddressZero(bytes32 _hash, bytes32 _r, uint256 _s, uint8 _v, uint8 _type) + external + { + _s = bound(_s, 0, 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0); + _v = uint8(bound(_v, 27, 28)); + _type = uint8(bound(_type, SIG_TYPE_EIP712, SIG_TYPE_ETH_SIGN)); + + bytes memory signature = abi.encodePacked(_r, _s, _v, _type); + + try lib.recoverSigner(_hash, signature) returns (address res) { + assertTrue(res != address(0)); + } catch {} + } + + function test_isValidSignature_EIP712(uint256 _pk, bytes32 _hash) external { + _pk = boundPk(_pk); + + address signer = vm.addr(_pk); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_pk, _hash); + + assertTrue(lib.isValidSignature(_hash, signer, abi.encodePacked(r, s, v, SIG_TYPE_EIP712))); + } + + function test_isValidSignature_ETHSIGN(uint256 _pk, bytes32 _hash) external { + _pk = boundPk(_pk); + + address signer = vm.addr(_pk); + (uint8 v, bytes32 r, bytes32 s) = + vm.sign(_pk, keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash))); + + assertTrue(lib.isValidSignature(_hash, signer, abi.encodePacked(r, s, v, SIG_TYPE_ETH_SIGN))); + } + + function test_isValidSignature_WALLET_BYTES32(address _wallet, bytes32 _hash, bytes calldata _signature) external { + _wallet = boundNoSys(_wallet); + + bytes memory encodedSignature = abi.encodePacked(_signature, SIG_TYPE_WALLET_BYTES32); + + bytes memory expectCall = abi.encodeWithSignature("isValidSignature(bytes32,bytes)", _hash, _signature); + bytes memory expectResult = abi.encode(bytes4(keccak256("isValidSignature(bytes32,bytes)"))); + + vm.mockCall(_wallet, 0, expectCall, expectResult); + assertTrue(lib.isValidSignature(_hash, _wallet, encodedSignature)); + } + + function test_isValidSignature_Fail_WALLET_BYTES32_BadBytes4( + address _wallet, + bytes32 _hash, + bytes calldata _signature, + bytes4 _return + ) external { + vm.assume(bytes4(keccak256("isValidSignature(bytes32,bytes)")) != _return); + + _wallet = boundNoSys(_wallet); + + bytes memory encodedSignature = abi.encodePacked(_signature, SIG_TYPE_WALLET_BYTES32); + bytes memory expectCall = abi.encodeWithSignature("isValidSignature(bytes32,bytes)", _hash, _signature); + + vm.mockCall(_wallet, 0, expectCall, abi.encode(_return)); + assertFalse(lib.isValidSignature(_hash, _wallet, encodedSignature)); + } + + function test_isValidSignature_Fail_WALLET_BYTES32_BadReturn( + address _wallet, + bytes32 _hash, + bytes calldata _signature, + bytes calldata _return + ) external { + bytes memory goodReturn = abi.encode(bytes4(keccak256("isValidSignature(bytes32,bytes)"))); + vm.assume(keccak256(goodReturn) != keccak256(_return)); + + bytes memory encodedSignature = abi.encodePacked(_signature, SIG_TYPE_WALLET_BYTES32); + bytes memory expectCall = abi.encodeWithSignature("isValidSignature(bytes32,bytes)", _hash, _signature); + + bool retunedNotValid; + vm.mockCall(_wallet, 0, expectCall, abi.encode(_return)); + try lib.isValidSignature(_hash, _wallet, encodedSignature) returns (bool isValid) { + retunedNotValid = !isValid; + } catch { + retunedNotValid = true; + } + + assertTrue(retunedNotValid); + } + + function test_isValidSignature_Fail_EmptySignature(bytes32 _hash, address _signer) external { + vm.expectRevert(abi.encodeWithSignature("EmptySignature()")); + lib.isValidSignature(_hash, _signer, bytes("")); + } + + function test_isValidSignature_Fail_UnsupportedSignatureType( + bytes32 _hash, + address _signer, + bytes calldata _signature, + uint8 _type + ) external { + _type = uint8(boundDiff(_type, SIG_TYPE_EIP712, SIG_TYPE_ETH_SIGN, SIG_TYPE_WALLET_BYTES32)); + + bytes memory encodedSignature = abi.encodePacked(_signature, _type); + vm.expectRevert( + abi.encodeWithSignature("UnsupportedSignatureType(bytes,uint256,bool)", encodedSignature, _type, false) + ); + lib.isValidSignature(_hash, _signer, encodedSignature); + } +} diff --git a/packages/wallet/wallet-contracts/funding.json b/packages/wallet/wallet-contracts/funding.json new file mode 100644 index 000000000..47313a81a --- /dev/null +++ b/packages/wallet/wallet-contracts/funding.json @@ -0,0 +1,5 @@ +{ + "opRetro": { + "projectId": "0x62408999652f3bfa1be746d256bf5a4eb4719b993d40f07d2d60aaebee015018" + } +} diff --git a/packages/wallet/wallet-contracts/hardhat.config.ts b/packages/wallet/wallet-contracts/hardhat.config.ts new file mode 100644 index 000000000..15254e772 --- /dev/null +++ b/packages/wallet/wallet-contracts/hardhat.config.ts @@ -0,0 +1,72 @@ +import { HardhatUserConfig, task } from 'hardhat/config' +import { networkConfig } from './utils/config-loader' + +import '@nomicfoundation/hardhat-ethers' +import '@nomicfoundation/hardhat-verify' +import '@nomiclabs/hardhat-truffle5' +import '@nomiclabs/hardhat-web3' +import '@tenderly/hardhat-tenderly' + +import 'hardhat-gas-reporter' +import 'solidity-coverage' + +import './utils/benchmarker' + +const ganacheNetwork = { + url: 'http://127.0.0.1:8545', + blockGasLimit: 6000000000 +} + +const config: HardhatUserConfig = { + solidity: { + version: '0.8.18', + settings: { + optimizer: { + enabled: true, + runs: 500000 + } + } + }, + networks: { + mainnet: networkConfig('mainnet'), + ropsten: networkConfig('ropsten'), + kovan: networkConfig('kovan'), + goerli: networkConfig('goerli'), + polygon: networkConfig('polygon'), + polygonZkevm: networkConfig('polygon-zkevm'), + mumbai: networkConfig('mumbai'), + arbitrum: networkConfig('arbitrum'), + arbitrumGoerli: networkConfig('arbitrum-goerli'), + arbitrumNova: networkConfig('arbitrum-nova'), + optimism: networkConfig('optimism'), + bnb: networkConfig('bnb'), + bnbTestnet: networkConfig('bnb-testnet'), + gnosis: networkConfig('gnosis'), + avalanche: networkConfig('avalanche'), + avalancheFuji: networkConfig('avalanche-fuji'), + ganache: ganacheNetwork, + hardhat: { + blockGasLimit: 60000000 + } + }, + etherscan: { + // Your API key for Etherscan + // Obtain one at https://etherscan.io/ + apiKey: networkConfig('mainnet').etherscan + }, + mocha: { + timeout: process.env.COVERAGE ? 15 * 60 * 1000 : 30 * 1000 + }, + gasReporter: { + enabled: !!process.env.REPORT_GAS === true, + currency: 'USD', + gasPrice: 21, + showTimeSpent: true + }, + tenderly: { + project: 'horizon/sequence-dev-1', + username: 'Agusx1211-horizon' + } +} + +export default config diff --git a/packages/wallet/wallet-contracts/lib/forge-std/.github/workflows/ci.yml b/packages/wallet/wallet-contracts/lib/forge-std/.github/workflows/ci.yml new file mode 100644 index 000000000..96b23365e --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/.github/workflows/ci.yml @@ -0,0 +1,92 @@ +name: CI + +on: + workflow_dispatch: + pull_request: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install Foundry + uses: onbjerg/foundry-toolchain@v1 + with: + version: nightly + + - name: Print forge version + run: forge --version + + # Backwards compatibility checks. + - name: Check compatibility with 0.8.0 + if: always() + run: forge build --skip test --use solc:0.8.0 + + - name: Check compatibility with 0.7.6 + if: always() + run: forge build --skip test --use solc:0.7.6 + + - name: Check compatibility with 0.7.0 + if: always() + run: forge build --skip test --use solc:0.7.0 + + - name: Check compatibility with 0.6.12 + if: always() + run: forge build --skip test --use solc:0.6.12 + + - name: Check compatibility with 0.6.2 + if: always() + run: forge build --skip test --use solc:0.6.2 + + # via-ir compilation time checks. + - name: Measure compilation time of Test with 0.8.17 --via-ir + if: always() + run: forge build --skip test --contracts test/compilation/CompilationTest.sol --use solc:0.8.17 --via-ir + + - name: Measure compilation time of TestBase with 0.8.17 --via-ir + if: always() + run: forge build --skip test --contracts test/compilation/CompilationTestBase.sol --use solc:0.8.17 --via-ir + + - name: Measure compilation time of Script with 0.8.17 --via-ir + if: always() + run: forge build --skip test --contracts test/compilation/CompilationScript.sol --use solc:0.8.17 --via-ir + + - name: Measure compilation time of ScriptBase with 0.8.17 --via-ir + if: always() + run: forge build --skip test --contracts test/compilation/CompilationScriptBase.sol --use solc:0.8.17 --via-ir + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install Foundry + uses: onbjerg/foundry-toolchain@v1 + with: + version: nightly + + - name: Print forge version + run: forge --version + + - name: Run tests + run: forge test -vvv + + fmt: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install Foundry + uses: onbjerg/foundry-toolchain@v1 + with: + version: nightly + + - name: Print forge version + run: forge --version + + - name: Check formatting + run: forge fmt --check diff --git a/packages/wallet/wallet-contracts/lib/forge-std/.github/workflows/sync.yml b/packages/wallet/wallet-contracts/lib/forge-std/.github/workflows/sync.yml new file mode 100644 index 000000000..5a9e9d591 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/.github/workflows/sync.yml @@ -0,0 +1,29 @@ +name: Sync Release Branch + +on: + release: + types: + - created + +jobs: + sync-release-branch: + runs-on: ubuntu-latest + if: startsWith(github.event.release.tag_name, 'v1') + steps: + - name: Check out the repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: v1 + + - name: Configure Git + run: | + git config user.name github-actions[bot] + git config user.email 41898282+github-actions[bot]@users.noreply.github.com + + - name: Sync Release Branch + run: | + git fetch --tags + git checkout v1 + git reset --hard ${GITHUB_REF} + git push --force diff --git a/packages/wallet/wallet-contracts/lib/forge-std/.gitmodules b/packages/wallet/wallet-contracts/lib/forge-std/.gitmodules new file mode 100644 index 000000000..e12471968 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/ds-test"] + path = lib/ds-test + url = https://github.com/dapphub/ds-test diff --git a/packages/wallet/wallet-contracts/lib/forge-std/LICENSE-APACHE b/packages/wallet/wallet-contracts/lib/forge-std/LICENSE-APACHE new file mode 100644 index 000000000..cf01a499f --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/LICENSE-APACHE @@ -0,0 +1,203 @@ +Copyright Contributors to Forge Standard Library + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/wallet/wallet-contracts/lib/forge-std/LICENSE-MIT b/packages/wallet/wallet-contracts/lib/forge-std/LICENSE-MIT new file mode 100644 index 000000000..28f98304a --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright Contributors to Forge Standard Library + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE O THE USE OR OTHER +DEALINGS IN THE SOFTWARE.R diff --git a/packages/wallet/wallet-contracts/lib/forge-std/README.md b/packages/wallet/wallet-contracts/lib/forge-std/README.md new file mode 100644 index 000000000..8494a7dd5 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/README.md @@ -0,0 +1,250 @@ +# Forge Standard Library • [![CI status](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml/badge.svg)](https://github.com/foundry-rs/forge-std/actions/workflows/ci.yml) + +Forge Standard Library is a collection of helpful contracts and libraries for use with [Forge and Foundry](https://github.com/foundry-rs/foundry). It leverages Forge's cheatcodes to make writing tests easier and faster, while improving the UX of cheatcodes. + +**Learn how to use Forge-Std with the [📖 Foundry Book (Forge-Std Guide)](https://book.getfoundry.sh/forge/forge-std.html).** + +## Install + +```bash +forge install foundry-rs/forge-std +``` + +## Contracts +### stdError + +This is a helper contract for errors and reverts. In Forge, this contract is particularly helpful for the `expectRevert` cheatcode, as it provides all compiler builtin errors. + +See the contract itself for all error codes. + +#### Example usage + +```solidity + +import "forge-std/Test.sol"; + +contract TestContract is Test { + ErrorsTest test; + + function setUp() public { + test = new ErrorsTest(); + } + + function testExpectArithmetic() public { + vm.expectRevert(stdError.arithmeticError); + test.arithmeticError(10); + } +} + +contract ErrorsTest { + function arithmeticError(uint256 a) public { + uint256 a = a - 100; + } +} +``` + +### stdStorage + +This is a rather large contract due to all of the overloading to make the UX decent. Primarily, it is a wrapper around the `record` and `accesses` cheatcodes. It can *always* find and write the storage slot(s) associated with a particular variable without knowing the storage layout. The one _major_ caveat to this is while a slot can be found for packed storage variables, we can't write to that variable safely. If a user tries to write to a packed slot, the execution throws an error, unless it is uninitialized (`bytes32(0)`). + +This works by recording all `SLOAD`s and `SSTORE`s during a function call. If there is a single slot read or written to, it immediately returns the slot. Otherwise, behind the scenes, we iterate through and check each one (assuming the user passed in a `depth` parameter). If the variable is a struct, you can pass in a `depth` parameter which is basically the field depth. + +I.e.: +```solidity +struct T { + // depth 0 + uint256 a; + // depth 1 + uint256 b; +} +``` + +#### Example usage + +```solidity +import "forge-std/Test.sol"; + +contract TestContract is Test { + using stdStorage for StdStorage; + + Storage test; + + function setUp() public { + test = new Storage(); + } + + function testFindExists() public { + // Lets say we want to find the slot for the public + // variable `exists`. We just pass in the function selector + // to the `find` command + uint256 slot = stdstore.target(address(test)).sig("exists()").find(); + assertEq(slot, 0); + } + + function testWriteExists() public { + // Lets say we want to write to the slot for the public + // variable `exists`. We just pass in the function selector + // to the `checked_write` command + stdstore.target(address(test)).sig("exists()").checked_write(100); + assertEq(test.exists(), 100); + } + + // It supports arbitrary storage layouts, like assembly based storage locations + function testFindHidden() public { + // `hidden` is a random hash of a bytes, iteration through slots would + // not find it. Our mechanism does + // Also, you can use the selector instead of a string + uint256 slot = stdstore.target(address(test)).sig(test.hidden.selector).find(); + assertEq(slot, uint256(keccak256("my.random.var"))); + } + + // If targeting a mapping, you have to pass in the keys necessary to perform the find + // i.e.: + function testFindMapping() public { + uint256 slot = stdstore + .target(address(test)) + .sig(test.map_addr.selector) + .with_key(address(this)) + .find(); + // in the `Storage` constructor, we wrote that this address' value was 1 in the map + // so when we load the slot, we expect it to be 1 + assertEq(uint(vm.load(address(test), bytes32(slot))), 1); + } + + // If the target is a struct, you can specify the field depth: + function testFindStruct() public { + // NOTE: see the depth parameter - 0 means 0th field, 1 means 1st field, etc. + uint256 slot_for_a_field = stdstore + .target(address(test)) + .sig(test.basicStruct.selector) + .depth(0) + .find(); + + uint256 slot_for_b_field = stdstore + .target(address(test)) + .sig(test.basicStruct.selector) + .depth(1) + .find(); + + assertEq(uint(vm.load(address(test), bytes32(slot_for_a_field))), 1); + assertEq(uint(vm.load(address(test), bytes32(slot_for_b_field))), 2); + } +} + +// A complex storage contract +contract Storage { + struct UnpackedStruct { + uint256 a; + uint256 b; + } + + constructor() { + map_addr[msg.sender] = 1; + } + + uint256 public exists = 1; + mapping(address => uint256) public map_addr; + // mapping(address => Packed) public map_packed; + mapping(address => UnpackedStruct) public map_struct; + mapping(address => mapping(address => uint256)) public deep_map; + mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; + UnpackedStruct public basicStruct = UnpackedStruct({ + a: 1, + b: 2 + }); + + function hidden() public view returns (bytes32 t) { + // an extremely hidden storage slot + bytes32 slot = keccak256("my.random.var"); + assembly { + t := sload(slot) + } + } +} +``` + +### stdCheats + +This is a wrapper over miscellaneous cheatcodes that need wrappers to be more dev friendly. Currently there are only functions related to `prank`. In general, users may expect ETH to be put into an address on `prank`, but this is not the case for safety reasons. Explicitly this `hoax` function should only be used for address that have expected balances as it will get overwritten. If an address already has ETH, you should just use `prank`. If you want to change that balance explicitly, just use `deal`. If you want to do both, `hoax` is also right for you. + + +#### Example usage: +```solidity + +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "forge-std/Test.sol"; + +// Inherit the stdCheats +contract StdCheatsTest is Test { + Bar test; + function setUp() public { + test = new Bar(); + } + + function testHoax() public { + // we call `hoax`, which gives the target address + // eth and then calls `prank` + hoax(address(1337)); + test.bar{value: 100}(address(1337)); + + // overloaded to allow you to specify how much eth to + // initialize the address with + hoax(address(1337), 1); + test.bar{value: 1}(address(1337)); + } + + function testStartHoax() public { + // we call `startHoax`, which gives the target address + // eth and then calls `startPrank` + // + // it is also overloaded so that you can specify an eth amount + startHoax(address(1337)); + test.bar{value: 100}(address(1337)); + test.bar{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } +} + +contract Bar { + function bar(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + } +} +``` + +### Std Assertions + +Expand upon the assertion functions from the `DSTest` library. + +### `console.log` + +Usage follows the same format as [Hardhat](https://hardhat.org/hardhat-network/reference/#console-log). +It's recommended to use `console2.sol` as shown below, as this will show the decoded logs in Forge traces. + +```solidity +// import it indirectly via Test.sol +import "forge-std/Test.sol"; +// or directly import it +import "forge-std/console2.sol"; +... +console2.log(someValue); +``` + +If you need compatibility with Hardhat, you must use the standard `console.sol` instead. +Due to a bug in `console.sol`, logs that use `uint256` or `int256` types will not be properly decoded in Forge traces. + +```solidity +// import it indirectly via Test.sol +import "forge-std/Test.sol"; +// or directly import it +import "forge-std/console.sol"; +... +console.log(someValue); +``` + +## License + +Forge Standard Library is offered under either [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) license. diff --git a/packages/wallet/wallet-contracts/lib/forge-std/foundry.toml b/packages/wallet/wallet-contracts/lib/forge-std/foundry.toml new file mode 100644 index 000000000..f9679ee61 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/foundry.toml @@ -0,0 +1,21 @@ +[profile.default] +fs_permissions = [{ access = "read-write", path = "./"}] + +[rpc_endpoints] +# The RPC URLs are modified versions of the default for testing initialization. +mainnet = "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3" # Different API key. +optimism_goerli = "https://goerli.optimism.io/" # Adds a trailing slash. +arbitrum_one_goerli = "https://goerli-rollup.arbitrum.io/rpc/" # Adds a trailing slash. +needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}" + +[fmt] +# These are all the `forge fmt` defaults. +line_length = 120 +tab_width = 4 +bracket_spacing = false +int_types = 'long' +multiline_func_header = 'attributes_first' +quote_style = 'double' +number_underscore = 'preserve' +single_line_statement_blocks = 'preserve' +ignore = ["src/console.sol", "src/console2.sol"] \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/.github/workflows/build.yml b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/.github/workflows/build.yml new file mode 100644 index 000000000..d2ff97db7 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/.github/workflows/build.yml @@ -0,0 +1,41 @@ +name: "Build" +on: + pull_request: + push: +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: cachix/install-nix-action@v20 + with: + nix_path: nixpkgs=channel:nixos-unstable + extra_nix_config: | + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + + - name: setup dapp binary cache + uses: cachix/cachix-action@v12 + with: + name: dapp + + - name: install dapptools + run: nix profile install github:dapphub/dapptools#dapp --accept-flake-config + + - name: install foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: test with solc-0.5.17 + run: dapp --use solc-0.5.17 test -v + + - name: test with solc-0.6.11 + run: dapp --use solc-0.6.11 test -v + + - name: test with solc-0.7.6 + run: dapp --use solc-0.7.6 test -v + + - name: test with solc-0.8.18 + run: dapp --use solc-0.8.18 test -v + + - name: Run tests with foundry + run: forge test -vvv + diff --git a/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/LICENSE b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/LICENSE new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/Makefile b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/Makefile new file mode 100644 index 000000000..661dac486 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/Makefile @@ -0,0 +1,14 @@ +all:; dapp build + +test: + -dapp --use solc:0.4.23 build + -dapp --use solc:0.4.26 build + -dapp --use solc:0.5.17 build + -dapp --use solc:0.6.12 build + -dapp --use solc:0.7.5 build + +demo: + DAPP_SRC=demo dapp --use solc:0.7.5 build + -hevm dapp-test --verbose 3 + +.PHONY: test demo diff --git a/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/default.nix b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/default.nix new file mode 100644 index 000000000..cf65419ab --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/default.nix @@ -0,0 +1,4 @@ +{ solidityPackage, dappsys }: solidityPackage { + name = "ds-test"; + src = ./src; +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/demo/demo.sol b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/demo/demo.sol new file mode 100644 index 000000000..f3bb48e70 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/demo/demo.sol @@ -0,0 +1,222 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity >=0.5.0; + +import "../src/test.sol"; + +contract DemoTest is DSTest { + function test_this() public pure { + require(true); + } + function test_logs() public { + emit log("-- log(string)"); + emit log("a string"); + + emit log("-- log_named_uint(string, uint)"); + emit log_named_uint("uint", 512); + + emit log("-- log_named_int(string, int)"); + emit log_named_int("int", -512); + + emit log("-- log_named_address(string, address)"); + emit log_named_address("address", address(this)); + + emit log("-- log_named_bytes32(string, bytes32)"); + emit log_named_bytes32("bytes32", "a string"); + + emit log("-- log_named_bytes(string, bytes)"); + emit log_named_bytes("bytes", hex"cafefe"); + + emit log("-- log_named_string(string, string)"); + emit log_named_string("string", "a string"); + + emit log("-- log_named_decimal_uint(string, uint, uint)"); + emit log_named_decimal_uint("decimal uint", 1.0e18, 18); + + emit log("-- log_named_decimal_int(string, int, uint)"); + emit log_named_decimal_int("decimal int", -1.0e18, 18); + } + event log_old_named_uint(bytes32,uint); + function test_old_logs() public { + emit log_old_named_uint("key", 500); + emit log_named_bytes32("bkey", "val"); + } + function test_trace() public view { + this.echo("string 1", "string 2"); + } + function test_multiline() public { + emit log("a multiline\\nstring"); + emit log("a multiline string"); + emit log_bytes("a string"); + emit log_bytes("a multiline\nstring"); + emit log_bytes("a multiline\\nstring"); + emit logs(hex"0000"); + emit log_named_bytes("0x0000", hex"0000"); + emit logs(hex"ff"); + } + function echo(string memory s1, string memory s2) public pure + returns (string memory, string memory) + { + return (s1, s2); + } + + function prove_this(uint x) public { + emit log_named_uint("sym x", x); + assertGt(x + 1, 0); + } + + function test_logn() public { + assembly { + log0(0x01, 0x02) + log1(0x01, 0x02, 0x03) + log2(0x01, 0x02, 0x03, 0x04) + log3(0x01, 0x02, 0x03, 0x04, 0x05) + } + } + + event MyEvent(uint, uint indexed, uint, uint indexed); + function test_events() public { + emit MyEvent(1, 2, 3, 4); + } + + function test_asserts() public { + string memory err = "this test has failed!"; + emit log("## assertTrue(bool)\n"); + assertTrue(false); + emit log("\n"); + assertTrue(false, err); + + emit log("\n## assertEq(address,address)\n"); + assertEq(address(this), msg.sender); + emit log("\n"); + assertEq(address(this), msg.sender, err); + + emit log("\n## assertEq32(bytes32,bytes32)\n"); + assertEq32("bytes 1", "bytes 2"); + emit log("\n"); + assertEq32("bytes 1", "bytes 2", err); + + emit log("\n## assertEq(bytes32,bytes32)\n"); + assertEq32("bytes 1", "bytes 2"); + emit log("\n"); + assertEq32("bytes 1", "bytes 2", err); + + emit log("\n## assertEq(uint,uint)\n"); + assertEq(uint(0), 1); + emit log("\n"); + assertEq(uint(0), 1, err); + + emit log("\n## assertEq(int,int)\n"); + assertEq(-1, -2); + emit log("\n"); + assertEq(-1, -2, err); + + emit log("\n## assertEqDecimal(int,int,uint)\n"); + assertEqDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertEqDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertEqDecimal(uint,uint,uint)\n"); + assertEqDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertEqDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertGt(uint,uint)\n"); + assertGt(uint(0), 0); + emit log("\n"); + assertGt(uint(0), 0, err); + + emit log("\n## assertGt(int,int)\n"); + assertGt(-1, -1); + emit log("\n"); + assertGt(-1, -1, err); + + emit log("\n## assertGtDecimal(int,int,uint)\n"); + assertGtDecimal(-2.0e18, -1.1e18, 18); + emit log("\n"); + assertGtDecimal(-2.0e18, -1.1e18, 18, err); + + emit log("\n## assertGtDecimal(uint,uint,uint)\n"); + assertGtDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertGtDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertGe(uint,uint)\n"); + assertGe(uint(0), 1); + emit log("\n"); + assertGe(uint(0), 1, err); + + emit log("\n## assertGe(int,int)\n"); + assertGe(-1, 0); + emit log("\n"); + assertGe(-1, 0, err); + + emit log("\n## assertGeDecimal(int,int,uint)\n"); + assertGeDecimal(-2.0e18, -1.1e18, 18); + emit log("\n"); + assertGeDecimal(-2.0e18, -1.1e18, 18, err); + + emit log("\n## assertGeDecimal(uint,uint,uint)\n"); + assertGeDecimal(uint(1.0e18), 1.1e18, 18); + emit log("\n"); + assertGeDecimal(uint(1.0e18), 1.1e18, 18, err); + + emit log("\n## assertLt(uint,uint)\n"); + assertLt(uint(0), 0); + emit log("\n"); + assertLt(uint(0), 0, err); + + emit log("\n## assertLt(int,int)\n"); + assertLt(-1, -1); + emit log("\n"); + assertLt(-1, -1, err); + + emit log("\n## assertLtDecimal(int,int,uint)\n"); + assertLtDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertLtDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertLtDecimal(uint,uint,uint)\n"); + assertLtDecimal(uint(2.0e18), 1.1e18, 18); + emit log("\n"); + assertLtDecimal(uint(2.0e18), 1.1e18, 18, err); + + emit log("\n## assertLe(uint,uint)\n"); + assertLe(uint(1), 0); + emit log("\n"); + assertLe(uint(1), 0, err); + + emit log("\n## assertLe(int,int)\n"); + assertLe(0, -1); + emit log("\n"); + assertLe(0, -1, err); + + emit log("\n## assertLeDecimal(int,int,uint)\n"); + assertLeDecimal(-1.0e18, -1.1e18, 18); + emit log("\n"); + assertLeDecimal(-1.0e18, -1.1e18, 18, err); + + emit log("\n## assertLeDecimal(uint,uint,uint)\n"); + assertLeDecimal(uint(2.0e18), 1.1e18, 18); + emit log("\n"); + assertLeDecimal(uint(2.0e18), 1.1e18, 18, err); + + emit log("\n## assertEq(string,string)\n"); + string memory s1 = "string 1"; + string memory s2 = "string 2"; + assertEq(s1, s2); + emit log("\n"); + assertEq(s1, s2, err); + + emit log("\n## assertEq0(bytes,bytes)\n"); + assertEq0(hex"abcdef01", hex"abcdef02"); + emit log("\n"); + assertEq0(hex"abcdef01", hex"abcdef02", err); + } +} + +contract DemoTestWithSetUp { + function setUp() public { + } + function test_pass() public pure { + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/package.json b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/package.json new file mode 100644 index 000000000..4802adaa3 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/package.json @@ -0,0 +1,15 @@ +{ + "name": "ds-test", + "version": "1.0.0", + "description": "Assertions, equality checks and other test helpers ", + "bugs": "https://github.com/dapphub/ds-test/issues", + "license": "GPL-3.0", + "author": "Contributors to ds-test", + "files": [ + "src/*" + ], + "repository": { + "type": "git", + "url": "https://github.com/dapphub/ds-test.git" + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/src/test.sol b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/src/test.sol new file mode 100644 index 000000000..2bf337567 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/src/test.sol @@ -0,0 +1,592 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity >=0.5.0; + +contract DSTest { + event log (string); + event logs (bytes); + + event log_address (address); + event log_bytes32 (bytes32); + event log_int (int); + event log_uint (uint); + event log_bytes (bytes); + event log_string (string); + + event log_named_address (string key, address val); + event log_named_bytes32 (string key, bytes32 val); + event log_named_decimal_int (string key, int val, uint decimals); + event log_named_decimal_uint (string key, uint val, uint decimals); + event log_named_int (string key, int val); + event log_named_uint (string key, uint val); + event log_named_bytes (string key, bytes val); + event log_named_string (string key, string val); + + bool public IS_TEST = true; + bool private _failed; + + address constant HEVM_ADDRESS = + address(bytes20(uint160(uint256(keccak256('hevm cheat code'))))); + + modifier mayRevert() { _; } + modifier testopts(string memory) { _; } + + function failed() public returns (bool) { + if (_failed) { + return _failed; + } else { + bool globalFailed = false; + if (hasHEVMContext()) { + (, bytes memory retdata) = HEVM_ADDRESS.call( + abi.encodePacked( + bytes4(keccak256("load(address,bytes32)")), + abi.encode(HEVM_ADDRESS, bytes32("failed")) + ) + ); + globalFailed = abi.decode(retdata, (bool)); + } + return globalFailed; + } + } + + function fail() internal virtual { + if (hasHEVMContext()) { + (bool status, ) = HEVM_ADDRESS.call( + abi.encodePacked( + bytes4(keccak256("store(address,bytes32,bytes32)")), + abi.encode(HEVM_ADDRESS, bytes32("failed"), bytes32(uint256(0x01))) + ) + ); + status; // Silence compiler warnings + } + _failed = true; + } + + function hasHEVMContext() internal view returns (bool) { + uint256 hevmCodeSize = 0; + assembly { + hevmCodeSize := extcodesize(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D) + } + return hevmCodeSize > 0; + } + + modifier logs_gas() { + uint startGas = gasleft(); + _; + uint endGas = gasleft(); + emit log_named_uint("gas", startGas - endGas); + } + + function assertTrue(bool condition) internal { + if (!condition) { + emit log("Error: Assertion Failed"); + fail(); + } + } + + function assertTrue(bool condition, string memory err) internal { + if (!condition) { + emit log_named_string("Error", err); + assertTrue(condition); + } + } + + function assertEq(address a, address b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [address]"); + emit log_named_address(" Left", a); + emit log_named_address(" Right", b); + fail(); + } + } + function assertEq(address a, address b, string memory err) internal { + if (a != b) { + emit log_named_string ("Error", err); + assertEq(a, b); + } + } + + function assertEq(bytes32 a, bytes32 b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [bytes32]"); + emit log_named_bytes32(" Left", a); + emit log_named_bytes32(" Right", b); + fail(); + } + } + function assertEq(bytes32 a, bytes32 b, string memory err) internal { + if (a != b) { + emit log_named_string ("Error", err); + assertEq(a, b); + } + } + function assertEq32(bytes32 a, bytes32 b) internal { + assertEq(a, b); + } + function assertEq32(bytes32 a, bytes32 b, string memory err) internal { + assertEq(a, b, err); + } + + function assertEq(int a, int b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [int]"); + emit log_named_int(" Left", a); + emit log_named_int(" Right", b); + fail(); + } + } + function assertEq(int a, int b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + function assertEq(uint a, uint b) internal { + if (a != b) { + emit log("Error: a == b not satisfied [uint]"); + emit log_named_uint(" Left", a); + emit log_named_uint(" Right", b); + fail(); + } + } + function assertEq(uint a, uint b, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + function assertEqDecimal(int a, int b, uint decimals) internal { + if (a != b) { + emit log("Error: a == b not satisfied [decimal int]"); + emit log_named_decimal_int(" Left", a, decimals); + emit log_named_decimal_int(" Right", b, decimals); + fail(); + } + } + function assertEqDecimal(int a, int b, uint decimals, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEqDecimal(a, b, decimals); + } + } + function assertEqDecimal(uint a, uint b, uint decimals) internal { + if (a != b) { + emit log("Error: a == b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Left", a, decimals); + emit log_named_decimal_uint(" Right", b, decimals); + fail(); + } + } + function assertEqDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a != b) { + emit log_named_string("Error", err); + assertEqDecimal(a, b, decimals); + } + } + + function assertNotEq(address a, address b) internal { + if (a == b) { + emit log("Error: a != b not satisfied [address]"); + emit log_named_address(" Left", a); + emit log_named_address(" Right", b); + fail(); + } + } + function assertNotEq(address a, address b, string memory err) internal { + if (a == b) { + emit log_named_string ("Error", err); + assertNotEq(a, b); + } + } + + function assertNotEq(bytes32 a, bytes32 b) internal { + if (a == b) { + emit log("Error: a != b not satisfied [bytes32]"); + emit log_named_bytes32(" Left", a); + emit log_named_bytes32(" Right", b); + fail(); + } + } + function assertNotEq(bytes32 a, bytes32 b, string memory err) internal { + if (a == b) { + emit log_named_string ("Error", err); + assertNotEq(a, b); + } + } + function assertNotEq32(bytes32 a, bytes32 b) internal { + assertNotEq(a, b); + } + function assertNotEq32(bytes32 a, bytes32 b, string memory err) internal { + assertNotEq(a, b, err); + } + + function assertNotEq(int a, int b) internal { + if (a == b) { + emit log("Error: a != b not satisfied [int]"); + emit log_named_int(" Left", a); + emit log_named_int(" Right", b); + fail(); + } + } + function assertNotEq(int a, int b, string memory err) internal { + if (a == b) { + emit log_named_string("Error", err); + assertNotEq(a, b); + } + } + function assertNotEq(uint a, uint b) internal { + if (a == b) { + emit log("Error: a != b not satisfied [uint]"); + emit log_named_uint(" Left", a); + emit log_named_uint(" Right", b); + fail(); + } + } + function assertNotEq(uint a, uint b, string memory err) internal { + if (a == b) { + emit log_named_string("Error", err); + assertNotEq(a, b); + } + } + function assertNotEqDecimal(int a, int b, uint decimals) internal { + if (a == b) { + emit log("Error: a != b not satisfied [decimal int]"); + emit log_named_decimal_int(" Left", a, decimals); + emit log_named_decimal_int(" Right", b, decimals); + fail(); + } + } + function assertNotEqDecimal(int a, int b, uint decimals, string memory err) internal { + if (a == b) { + emit log_named_string("Error", err); + assertNotEqDecimal(a, b, decimals); + } + } + function assertNotEqDecimal(uint a, uint b, uint decimals) internal { + if (a == b) { + emit log("Error: a != b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Left", a, decimals); + emit log_named_decimal_uint(" Right", b, decimals); + fail(); + } + } + function assertNotEqDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a == b) { + emit log_named_string("Error", err); + assertNotEqDecimal(a, b, decimals); + } + } + + function assertGt(uint a, uint b) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertGt(uint a, uint b, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGt(a, b); + } + } + function assertGt(int a, int b) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertGt(int a, int b, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGt(a, b); + } + } + function assertGtDecimal(int a, int b, uint decimals) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertGtDecimal(int a, int b, uint decimals, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGtDecimal(a, b, decimals); + } + } + function assertGtDecimal(uint a, uint b, uint decimals) internal { + if (a <= b) { + emit log("Error: a > b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertGtDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a <= b) { + emit log_named_string("Error", err); + assertGtDecimal(a, b, decimals); + } + } + + function assertGe(uint a, uint b) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertGe(uint a, uint b, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGe(a, b); + } + } + function assertGe(int a, int b) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertGe(int a, int b, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGe(a, b); + } + } + function assertGeDecimal(int a, int b, uint decimals) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertGeDecimal(int a, int b, uint decimals, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + function assertGeDecimal(uint a, uint b, uint decimals) internal { + if (a < b) { + emit log("Error: a >= b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertGeDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a < b) { + emit log_named_string("Error", err); + assertGeDecimal(a, b, decimals); + } + } + + function assertLt(uint a, uint b) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertLt(uint a, uint b, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLt(a, b); + } + } + function assertLt(int a, int b) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertLt(int a, int b, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLt(a, b); + } + } + function assertLtDecimal(int a, int b, uint decimals) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertLtDecimal(int a, int b, uint decimals, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLtDecimal(a, b, decimals); + } + } + function assertLtDecimal(uint a, uint b, uint decimals) internal { + if (a >= b) { + emit log("Error: a < b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertLtDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a >= b) { + emit log_named_string("Error", err); + assertLtDecimal(a, b, decimals); + } + } + + function assertLe(uint a, uint b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [uint]"); + emit log_named_uint(" Value a", a); + emit log_named_uint(" Value b", b); + fail(); + } + } + function assertLe(uint a, uint b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLe(a, b); + } + } + function assertLe(int a, int b) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [int]"); + emit log_named_int(" Value a", a); + emit log_named_int(" Value b", b); + fail(); + } + } + function assertLe(int a, int b, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLe(a, b); + } + } + function assertLeDecimal(int a, int b, uint decimals) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [decimal int]"); + emit log_named_decimal_int(" Value a", a, decimals); + emit log_named_decimal_int(" Value b", b, decimals); + fail(); + } + } + function assertLeDecimal(int a, int b, uint decimals, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLeDecimal(a, b, decimals); + } + } + function assertLeDecimal(uint a, uint b, uint decimals) internal { + if (a > b) { + emit log("Error: a <= b not satisfied [decimal uint]"); + emit log_named_decimal_uint(" Value a", a, decimals); + emit log_named_decimal_uint(" Value b", b, decimals); + fail(); + } + } + function assertLeDecimal(uint a, uint b, uint decimals, string memory err) internal { + if (a > b) { + emit log_named_string("Error", err); + assertLeDecimal(a, b, decimals); + } + } + + function assertEq(string memory a, string memory b) internal { + if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { + emit log("Error: a == b not satisfied [string]"); + emit log_named_string(" Left", a); + emit log_named_string(" Right", b); + fail(); + } + } + function assertEq(string memory a, string memory b, string memory err) internal { + if (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertNotEq(string memory a, string memory b) internal { + if (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))) { + emit log("Error: a != b not satisfied [string]"); + emit log_named_string(" Left", a); + emit log_named_string(" Right", b); + fail(); + } + } + function assertNotEq(string memory a, string memory b, string memory err) internal { + if (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))) { + emit log_named_string("Error", err); + assertNotEq(a, b); + } + } + + function checkEq0(bytes memory a, bytes memory b) internal pure returns (bool ok) { + ok = true; + if (a.length == b.length) { + for (uint i = 0; i < a.length; i++) { + if (a[i] != b[i]) { + ok = false; + } + } + } else { + ok = false; + } + } + function assertEq0(bytes memory a, bytes memory b) internal { + if (!checkEq0(a, b)) { + emit log("Error: a == b not satisfied [bytes]"); + emit log_named_bytes(" Left", a); + emit log_named_bytes(" Right", b); + fail(); + } + } + function assertEq0(bytes memory a, bytes memory b, string memory err) internal { + if (!checkEq0(a, b)) { + emit log_named_string("Error", err); + assertEq0(a, b); + } + } + + function assertNotEq0(bytes memory a, bytes memory b) internal { + if (checkEq0(a, b)) { + emit log("Error: a != b not satisfied [bytes]"); + emit log_named_bytes(" Left", a); + emit log_named_bytes(" Right", b); + fail(); + } + } + function assertNotEq0(bytes memory a, bytes memory b, string memory err) internal { + if (checkEq0(a, b)) { + emit log_named_string("Error", err); + assertNotEq0(a, b); + } + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/src/test.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/src/test.t.sol new file mode 100644 index 000000000..d277a3094 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/lib/ds-test/src/test.t.sol @@ -0,0 +1,417 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity >=0.5.0; + +import {DSTest} from "./test.sol"; + +contract DemoTest is DSTest { + + // --- assertTrue --- + + function testAssertTrue() public { + assertTrue(true, "msg"); + assertTrue(true); + } + function testFailAssertTrue() public { + assertTrue(false); + } + function testFailAssertTrueWithMsg() public { + assertTrue(false, "msg"); + } + + // --- assertEq (Addr) --- + + function testAssertEqAddr() public { + assertEq(address(0x0), address(0x0), "msg"); + assertEq(address(0x0), address(0x0)); + } + function testFailAssertEqAddr() public { + assertEq(address(0x0), address(0x1)); + } + function testFailAssertEqAddrWithMsg() public { + assertEq(address(0x0), address(0x1), "msg"); + } + + // --- assertEq (Bytes32) --- + + function testAssertEqBytes32() public { + assertEq(bytes32("hi"), bytes32("hi"), "msg"); + assertEq(bytes32("hi"), bytes32("hi")); + } + function testFailAssertEqBytes32() public { + assertEq(bytes32("hi"), bytes32("ho")); + } + function testFailAssertEqBytes32WithMsg() public { + assertEq(bytes32("hi"), bytes32("ho"), "msg"); + } + + // --- assertEq (Int) --- + + function testAssertEqInt() public { + assertEq(-1, -1, "msg"); + assertEq(-1, -1); + } + function testFailAssertEqInt() public { + assertEq(-1, -2); + } + function testFailAssertEqIntWithMsg() public { + assertEq(-1, -2, "msg"); + } + + // --- assertEq (UInt) --- + + function testAssertEqUInt() public { + assertEq(uint(1), uint(1), "msg"); + assertEq(uint(1), uint(1)); + } + function testFailAssertEqUInt() public { + assertEq(uint(1), uint(2)); + } + function testFailAssertEqUIntWithMsg() public { + assertEq(uint(1), uint(2), "msg"); + } + + // --- assertEqDecimal (Int) --- + + function testAssertEqDecimalInt() public { + assertEqDecimal(-1, -1, 18, "msg"); + assertEqDecimal(-1, -1, 18); + } + function testFailAssertEqDecimalInt() public { + assertEqDecimal(-1, -2, 18); + } + function testFailAssertEqDecimalIntWithMsg() public { + assertEqDecimal(-1, -2, 18, "msg"); + } + + // --- assertEqDecimal (UInt) --- + + function testAssertEqDecimalUInt() public { + assertEqDecimal(uint(1), uint(1), 18, "msg"); + assertEqDecimal(uint(1), uint(1), 18); + } + function testFailAssertEqDecimalUInt() public { + assertEqDecimal(uint(1), uint(2), 18); + } + function testFailAssertEqDecimalUIntWithMsg() public { + assertEqDecimal(uint(1), uint(2), 18, "msg"); + } + + // --- assertNotEq (Addr) --- + + function testAssertNotEqAddr() public { + assertNotEq(address(0x0), address(0x1), "msg"); + assertNotEq(address(0x0), address(0x1)); + } + function testFailAssertNotEqAddr() public { + assertNotEq(address(0x0), address(0x0)); + } + function testFailAssertNotEqAddrWithMsg() public { + assertNotEq(address(0x0), address(0x0), "msg"); + } + + // --- assertNotEq (Bytes32) --- + + function testAssertNotEqBytes32() public { + assertNotEq(bytes32("hi"), bytes32("ho"), "msg"); + assertNotEq(bytes32("hi"), bytes32("ho")); + } + function testFailAssertNotEqBytes32() public { + assertNotEq(bytes32("hi"), bytes32("hi")); + } + function testFailAssertNotEqBytes32WithMsg() public { + assertNotEq(bytes32("hi"), bytes32("hi"), "msg"); + } + + // --- assertNotEq (Int) --- + + function testAssertNotEqInt() public { + assertNotEq(-1, -2, "msg"); + assertNotEq(-1, -2); + } + function testFailAssertNotEqInt() public { + assertNotEq(-1, -1); + } + function testFailAssertNotEqIntWithMsg() public { + assertNotEq(-1, -1, "msg"); + } + + // --- assertNotEq (UInt) --- + + function testAssertNotEqUInt() public { + assertNotEq(uint(1), uint(2), "msg"); + assertNotEq(uint(1), uint(2)); + } + function testFailAssertNotEqUInt() public { + assertNotEq(uint(1), uint(1)); + } + function testFailAssertNotEqUIntWithMsg() public { + assertNotEq(uint(1), uint(1), "msg"); + } + + // --- assertNotEqDecimal (Int) --- + + function testAssertNotEqDecimalInt() public { + assertNotEqDecimal(-1, -2, 18, "msg"); + assertNotEqDecimal(-1, -2, 18); + } + function testFailAssertNotEqDecimalInt() public { + assertNotEqDecimal(-1, -1, 18); + } + function testFailAssertNotEqDecimalIntWithMsg() public { + assertNotEqDecimal(-1, -1, 18, "msg"); + } + + // --- assertNotEqDecimal (UInt) --- + + function testAssertNotEqDecimalUInt() public { + assertNotEqDecimal(uint(1), uint(2), 18, "msg"); + assertNotEqDecimal(uint(1), uint(2), 18); + } + function testFailAssertNotEqDecimalUInt() public { + assertNotEqDecimal(uint(1), uint(1), 18); + } + function testFailAssertNotEqDecimalUIntWithMsg() public { + assertNotEqDecimal(uint(1), uint(1), 18, "msg"); + } + + // --- assertGt (UInt) --- + + function testAssertGtUInt() public { + assertGt(uint(2), uint(1), "msg"); + assertGt(uint(3), uint(2)); + } + function testFailAssertGtUInt() public { + assertGt(uint(1), uint(2)); + } + function testFailAssertGtUIntWithMsg() public { + assertGt(uint(1), uint(2), "msg"); + } + + // --- assertGt (Int) --- + + function testAssertGtInt() public { + assertGt(-1, -2, "msg"); + assertGt(-1, -3); + } + function testFailAssertGtInt() public { + assertGt(-2, -1); + } + function testFailAssertGtIntWithMsg() public { + assertGt(-2, -1, "msg"); + } + + // --- assertGtDecimal (UInt) --- + + function testAssertGtDecimalUInt() public { + assertGtDecimal(uint(2), uint(1), 18, "msg"); + assertGtDecimal(uint(3), uint(2), 18); + } + function testFailAssertGtDecimalUInt() public { + assertGtDecimal(uint(1), uint(2), 18); + } + function testFailAssertGtDecimalUIntWithMsg() public { + assertGtDecimal(uint(1), uint(2), 18, "msg"); + } + + // --- assertGtDecimal (Int) --- + + function testAssertGtDecimalInt() public { + assertGtDecimal(-1, -2, 18, "msg"); + assertGtDecimal(-1, -3, 18); + } + function testFailAssertGtDecimalInt() public { + assertGtDecimal(-2, -1, 18); + } + function testFailAssertGtDecimalIntWithMsg() public { + assertGtDecimal(-2, -1, 18, "msg"); + } + + // --- assertGe (UInt) --- + + function testAssertGeUInt() public { + assertGe(uint(2), uint(1), "msg"); + assertGe(uint(2), uint(2)); + } + function testFailAssertGeUInt() public { + assertGe(uint(1), uint(2)); + } + function testFailAssertGeUIntWithMsg() public { + assertGe(uint(1), uint(2), "msg"); + } + + // --- assertGe (Int) --- + + function testAssertGeInt() public { + assertGe(-1, -2, "msg"); + assertGe(-1, -1); + } + function testFailAssertGeInt() public { + assertGe(-2, -1); + } + function testFailAssertGeIntWithMsg() public { + assertGe(-2, -1, "msg"); + } + + // --- assertGeDecimal (UInt) --- + + function testAssertGeDecimalUInt() public { + assertGeDecimal(uint(2), uint(1), 18, "msg"); + assertGeDecimal(uint(2), uint(2), 18); + } + function testFailAssertGeDecimalUInt() public { + assertGeDecimal(uint(1), uint(2), 18); + } + function testFailAssertGeDecimalUIntWithMsg() public { + assertGeDecimal(uint(1), uint(2), 18, "msg"); + } + + // --- assertGeDecimal (Int) --- + + function testAssertGeDecimalInt() public { + assertGeDecimal(-1, -2, 18, "msg"); + assertGeDecimal(-1, -2, 18); + } + function testFailAssertGeDecimalInt() public { + assertGeDecimal(-2, -1, 18); + } + function testFailAssertGeDecimalIntWithMsg() public { + assertGeDecimal(-2, -1, 18, "msg"); + } + + // --- assertLt (UInt) --- + + function testAssertLtUInt() public { + assertLt(uint(1), uint(2), "msg"); + assertLt(uint(1), uint(3)); + } + function testFailAssertLtUInt() public { + assertLt(uint(2), uint(2)); + } + function testFailAssertLtUIntWithMsg() public { + assertLt(uint(3), uint(2), "msg"); + } + + // --- assertLt (Int) --- + + function testAssertLtInt() public { + assertLt(-2, -1, "msg"); + assertLt(-1, 0); + } + function testFailAssertLtInt() public { + assertLt(-1, -2); + } + function testFailAssertLtIntWithMsg() public { + assertLt(-1, -1, "msg"); + } + + // --- assertLtDecimal (UInt) --- + + function testAssertLtDecimalUInt() public { + assertLtDecimal(uint(1), uint(2), 18, "msg"); + assertLtDecimal(uint(2), uint(3), 18); + } + function testFailAssertLtDecimalUInt() public { + assertLtDecimal(uint(1), uint(1), 18); + } + function testFailAssertLtDecimalUIntWithMsg() public { + assertLtDecimal(uint(2), uint(1), 18, "msg"); + } + + // --- assertLtDecimal (Int) --- + + function testAssertLtDecimalInt() public { + assertLtDecimal(-2, -1, 18, "msg"); + assertLtDecimal(-2, -1, 18); + } + function testFailAssertLtDecimalInt() public { + assertLtDecimal(-2, -2, 18); + } + function testFailAssertLtDecimalIntWithMsg() public { + assertLtDecimal(-1, -2, 18, "msg"); + } + + // --- assertLe (UInt) --- + + function testAssertLeUInt() public { + assertLe(uint(1), uint(2), "msg"); + assertLe(uint(1), uint(1)); + } + function testFailAssertLeUInt() public { + assertLe(uint(4), uint(2)); + } + function testFailAssertLeUIntWithMsg() public { + assertLe(uint(3), uint(2), "msg"); + } + + // --- assertLe (Int) --- + + function testAssertLeInt() public { + assertLe(-2, -1, "msg"); + assertLe(-1, -1); + } + function testFailAssertLeInt() public { + assertLe(-1, -2); + } + function testFailAssertLeIntWithMsg() public { + assertLe(-1, -3, "msg"); + } + + // --- assertLeDecimal (UInt) --- + + function testAssertLeDecimalUInt() public { + assertLeDecimal(uint(1), uint(2), 18, "msg"); + assertLeDecimal(uint(2), uint(2), 18); + } + function testFailAssertLeDecimalUInt() public { + assertLeDecimal(uint(1), uint(0), 18); + } + function testFailAssertLeDecimalUIntWithMsg() public { + assertLeDecimal(uint(1), uint(0), 18, "msg"); + } + + // --- assertLeDecimal (Int) --- + + function testAssertLeDecimalInt() public { + assertLeDecimal(-2, -1, 18, "msg"); + assertLeDecimal(-2, -2, 18); + } + function testFailAssertLeDecimalInt() public { + assertLeDecimal(-2, -3, 18); + } + function testFailAssertLeDecimalIntWithMsg() public { + assertLeDecimal(-1, -2, 18, "msg"); + } + + // --- assertNotEq (String) --- + + function testAssertNotEqString() public { + assertNotEq(new string(1), new string(2), "msg"); + assertNotEq(new string(1), new string(2)); + } + function testFailAssertNotEqString() public { + assertNotEq(new string(1), new string(1)); + } + function testFailAssertNotEqStringWithMsg() public { + assertNotEq(new string(1), new string(1), "msg"); + } + + // --- assertNotEq0 (Bytes) --- + + function testAssertNotEq0Bytes() public { + assertNotEq0(bytes("hi"), bytes("ho"), "msg"); + assertNotEq0(bytes("hi"), bytes("ho")); + } + function testFailAssertNotEq0Bytes() public { + assertNotEq0(bytes("hi"), bytes("hi")); + } + function testFailAssertNotEq0BytesWithMsg() public { + assertNotEq0(bytes("hi"), bytes("hi"), "msg"); + } + + // --- fail override --- + + // ensure that fail can be overridden + function fail() internal override { + super.fail(); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/package.json b/packages/wallet/wallet-contracts/lib/forge-std/package.json new file mode 100644 index 000000000..c98539d2d --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/package.json @@ -0,0 +1,16 @@ +{ + "name": "forge-std", + "version": "1.5.5", + "description": "Forge Standard Library is a collection of helpful contracts and libraries for use with Forge and Foundry.", + "homepage": "https://book.getfoundry.sh/forge/forge-std", + "bugs": "https://github.com/foundry-rs/forge-std/issues", + "license": "(Apache-2.0 OR MIT)", + "author": "Contributors to Forge Standard Library", + "files": [ + "src/**/*" + ], + "repository": { + "type": "git", + "url": "https://github.com/foundry-rs/forge-std.git" + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/Base.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/Base.sol new file mode 100644 index 000000000..83c5c1cfc --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/Base.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {StdStorage} from "./StdStorage.sol"; +import {Vm, VmSafe} from "./Vm.sol"; + +abstract contract CommonBase { + // Cheat code address, 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D. + address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); + // console.sol and console2.sol work by executing a staticcall to this address. + address internal constant CONSOLE = 0x000000000000000000636F6e736F6c652e6c6f67; + // Default address for tx.origin and msg.sender, 0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38. + address internal constant DEFAULT_SENDER = address(uint160(uint256(keccak256("foundry default caller")))); + // Address of the test contract, deployed by the DEFAULT_SENDER. + address internal constant DEFAULT_TEST_CONTRACT = 0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f; + // Deterministic deployment address of the Multicall3 contract. + address internal constant MULTICALL3_ADDRESS = 0xcA11bde05977b3631167028862bE2a173976CA11; + + uint256 internal constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + Vm internal constant vm = Vm(VM_ADDRESS); + StdStorage internal stdstore; +} + +abstract contract TestBase is CommonBase {} + +abstract contract ScriptBase is CommonBase { + // Used when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. + address internal constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + + VmSafe internal constant vmSafe = VmSafe(VM_ADDRESS); +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/Script.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/Script.sol new file mode 100644 index 000000000..bffccadbe --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/Script.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +// 💬 ABOUT +// Standard Library's default Script. + +// 🧩 MODULES +import {ScriptBase} from "./Base.sol"; +import {console} from "./console.sol"; +import {console2} from "./console2.sol"; +import {StdChains} from "./StdChains.sol"; +import {StdCheatsSafe} from "./StdCheats.sol"; +import {stdJson} from "./StdJson.sol"; +import {stdMath} from "./StdMath.sol"; +import {StdStorage, stdStorageSafe} from "./StdStorage.sol"; +import {StdUtils} from "./StdUtils.sol"; +import {VmSafe} from "./Vm.sol"; + +// 📦 BOILERPLATE +import {ScriptBase} from "./Base.sol"; + +// ⭐️ SCRIPT +abstract contract Script is StdChains, StdCheatsSafe, StdUtils, ScriptBase { + // Note: IS_SCRIPT() must return true. + bool public IS_SCRIPT = true; +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdAssertions.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdAssertions.sol new file mode 100644 index 000000000..2778b3a0e --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdAssertions.sol @@ -0,0 +1,376 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {DSTest} from "ds-test/test.sol"; +import {stdMath} from "./StdMath.sol"; + +abstract contract StdAssertions is DSTest { + event log_array(uint256[] val); + event log_array(int256[] val); + event log_array(address[] val); + event log_named_array(string key, uint256[] val); + event log_named_array(string key, int256[] val); + event log_named_array(string key, address[] val); + + function fail(string memory err) internal virtual { + emit log_named_string("Error", err); + fail(); + } + + function assertFalse(bool data) internal virtual { + assertTrue(!data); + } + + function assertFalse(bool data, string memory err) internal virtual { + assertTrue(!data, err); + } + + function assertEq(bool a, bool b) internal virtual { + if (a != b) { + emit log("Error: a == b not satisfied [bool]"); + emit log_named_string(" Left", a ? "true" : "false"); + emit log_named_string(" Right", b ? "true" : "false"); + fail(); + } + } + + function assertEq(bool a, bool b, string memory err) internal virtual { + if (a != b) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(bytes memory a, bytes memory b) internal virtual { + assertEq0(a, b); + } + + function assertEq(bytes memory a, bytes memory b, string memory err) internal virtual { + assertEq0(a, b, err); + } + + function assertEq(uint256[] memory a, uint256[] memory b) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log("Error: a == b not satisfied [uint[]]"); + emit log_named_array(" Left", a); + emit log_named_array(" Right", b); + fail(); + } + } + + function assertEq(int256[] memory a, int256[] memory b) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log("Error: a == b not satisfied [int[]]"); + emit log_named_array(" Left", a); + emit log_named_array(" Right", b); + fail(); + } + } + + function assertEq(address[] memory a, address[] memory b) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log("Error: a == b not satisfied [address[]]"); + emit log_named_array(" Left", a); + emit log_named_array(" Right", b); + fail(); + } + } + + function assertEq(uint256[] memory a, uint256[] memory b, string memory err) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(int256[] memory a, int256[] memory b, string memory err) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + function assertEq(address[] memory a, address[] memory b, string memory err) internal virtual { + if (keccak256(abi.encode(a)) != keccak256(abi.encode(b))) { + emit log_named_string("Error", err); + assertEq(a, b); + } + } + + // Legacy helper + function assertEqUint(uint256 a, uint256 b) internal virtual { + assertEq(uint256(a), uint256(b)); + } + + function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log("Error: a ~= b not satisfied [uint]"); + emit log_named_uint(" Left", a); + emit log_named_uint(" Right", b); + emit log_named_uint(" Max Delta", maxDelta); + emit log_named_uint(" Delta", delta); + fail(); + } + } + + function assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log_named_string("Error", err); + assertApproxEqAbs(a, b, maxDelta); + } + } + + function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log("Error: a ~= b not satisfied [uint]"); + emit log_named_decimal_uint(" Left", a, decimals); + emit log_named_decimal_uint(" Right", b, decimals); + emit log_named_decimal_uint(" Max Delta", maxDelta, decimals); + emit log_named_decimal_uint(" Delta", delta, decimals); + fail(); + } + } + + function assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, string memory err) + internal + virtual + { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log_named_string("Error", err); + assertApproxEqAbsDecimal(a, b, maxDelta, decimals); + } + } + + function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log("Error: a ~= b not satisfied [int]"); + emit log_named_int(" Left", a); + emit log_named_int(" Right", b); + emit log_named_uint(" Max Delta", maxDelta); + emit log_named_uint(" Delta", delta); + fail(); + } + } + + function assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log_named_string("Error", err); + assertApproxEqAbs(a, b, maxDelta); + } + } + + function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals) internal virtual { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log("Error: a ~= b not satisfied [int]"); + emit log_named_decimal_int(" Left", a, decimals); + emit log_named_decimal_int(" Right", b, decimals); + emit log_named_decimal_uint(" Max Delta", maxDelta, decimals); + emit log_named_decimal_uint(" Delta", delta, decimals); + fail(); + } + } + + function assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, string memory err) + internal + virtual + { + uint256 delta = stdMath.delta(a, b); + + if (delta > maxDelta) { + emit log_named_string("Error", err); + assertApproxEqAbsDecimal(a, b, maxDelta, decimals); + } + } + + function assertApproxEqRel( + uint256 a, + uint256 b, + uint256 maxPercentDelta // An 18 decimal fixed point number, where 1e18 == 100% + ) internal virtual { + if (b == 0) return assertEq(a, b); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log("Error: a ~= b not satisfied [uint]"); + emit log_named_uint(" Left", a); + emit log_named_uint(" Right", b); + emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18); + emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18); + fail(); + } + } + + function assertApproxEqRel( + uint256 a, + uint256 b, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + string memory err + ) internal virtual { + if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log_named_string("Error", err); + assertApproxEqRel(a, b, maxPercentDelta); + } + } + + function assertApproxEqRelDecimal( + uint256 a, + uint256 b, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals + ) internal virtual { + if (b == 0) return assertEq(a, b); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log("Error: a ~= b not satisfied [uint]"); + emit log_named_decimal_uint(" Left", a, decimals); + emit log_named_decimal_uint(" Right", b, decimals); + emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18); + emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18); + fail(); + } + } + + function assertApproxEqRelDecimal( + uint256 a, + uint256 b, + uint256 maxPercentDelta, // An 18 decimal fixed point number, where 1e18 == 100% + uint256 decimals, + string memory err + ) internal virtual { + if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log_named_string("Error", err); + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); + } + } + + function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta) internal virtual { + if (b == 0) return assertEq(a, b); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log("Error: a ~= b not satisfied [int]"); + emit log_named_int(" Left", a); + emit log_named_int(" Right", b); + emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18); + emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18); + fail(); + } + } + + function assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err) internal virtual { + if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log_named_string("Error", err); + assertApproxEqRel(a, b, maxPercentDelta); + } + } + + function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals) internal virtual { + if (b == 0) return assertEq(a, b); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log("Error: a ~= b not satisfied [int]"); + emit log_named_decimal_int(" Left", a, decimals); + emit log_named_decimal_int(" Right", b, decimals); + emit log_named_decimal_uint(" Max % Delta", maxPercentDelta * 100, 18); + emit log_named_decimal_uint(" % Delta", percentDelta * 100, 18); + fail(); + } + } + + function assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, string memory err) + internal + virtual + { + if (b == 0) return assertEq(a, b, err); // If the left is 0, right must be too. + + uint256 percentDelta = stdMath.percentDelta(a, b); + + if (percentDelta > maxPercentDelta) { + emit log_named_string("Error", err); + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); + } + } + + function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB) internal virtual { + assertEqCall(target, callDataA, target, callDataB, true); + } + + function assertEqCall(address targetA, bytes memory callDataA, address targetB, bytes memory callDataB) + internal + virtual + { + assertEqCall(targetA, callDataA, targetB, callDataB, true); + } + + function assertEqCall(address target, bytes memory callDataA, bytes memory callDataB, bool strictRevertData) + internal + virtual + { + assertEqCall(target, callDataA, target, callDataB, strictRevertData); + } + + function assertEqCall( + address targetA, + bytes memory callDataA, + address targetB, + bytes memory callDataB, + bool strictRevertData + ) internal virtual { + (bool successA, bytes memory returnDataA) = address(targetA).call(callDataA); + (bool successB, bytes memory returnDataB) = address(targetB).call(callDataB); + + if (successA && successB) { + assertEq(returnDataA, returnDataB, "Call return data does not match"); + } + + if (!successA && !successB && strictRevertData) { + assertEq(returnDataA, returnDataB, "Call revert data does not match"); + } + + if (!successA && successB) { + emit log("Error: Calls were not equal"); + emit log_named_bytes(" Left call revert data", returnDataA); + emit log_named_bytes(" Right call return data", returnDataB); + fail(); + } + + if (successA && !successB) { + emit log("Error: Calls were not equal"); + emit log_named_bytes(" Left call return data", returnDataA); + emit log_named_bytes(" Right call revert data", returnDataB); + fail(); + } + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdChains.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdChains.sol new file mode 100644 index 000000000..f97637fc4 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdChains.sol @@ -0,0 +1,231 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {VmSafe} from "./Vm.sol"; + +/** + * StdChains provides information about EVM compatible chains that can be used in scripts/tests. + * For each chain, the chain's name, chain ID, and a default RPC URL are provided. Chains are + * identified by their alias, which is the same as the alias in the `[rpc_endpoints]` section of + * the `foundry.toml` file. For best UX, ensure the alias in the `foundry.toml` file match the + * alias used in this contract, which can be found as the first argument to the + * `setChainWithDefaultRpcUrl` call in the `initializeStdChains` function. + * + * There are two main ways to use this contract: + * 1. Set a chain with `setChain(string memory chainAlias, ChainData memory chain)` or + * `setChain(string memory chainAlias, Chain memory chain)` + * 2. Get a chain with `getChain(string memory chainAlias)` or `getChain(uint256 chainId)`. + * + * The first time either of those are used, chains are initialized with the default set of RPC URLs. + * This is done in `initializeStdChains`, which uses `setChainWithDefaultRpcUrl`. Defaults are recorded in + * `defaultRpcUrls`. + * + * The `setChain` function is straightforward, and it simply saves off the given chain data. + * + * The `getChain` methods use `getChainWithUpdatedRpcUrl` to return a chain. For example, let's say + * we want to retrieve the RPC URL for `mainnet`: + * - If you have specified data with `setChain`, it will return that. + * - If you have configured a mainnet RPC URL in `foundry.toml`, it will return the URL, provided it + * is valid (e.g. a URL is specified, or an environment variable is given and exists). + * - If neither of the above conditions is met, the default data is returned. + * + * Summarizing the above, the prioritization hierarchy is `setChain` -> `foundry.toml` -> environment variable -> defaults. + */ +abstract contract StdChains { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + bool private stdChainsInitialized; + + struct ChainData { + string name; + uint256 chainId; + string rpcUrl; + } + + struct Chain { + // The chain name. + string name; + // The chain's Chain ID. + uint256 chainId; + // The chain's alias. (i.e. what gets specified in `foundry.toml`). + string chainAlias; + // A default RPC endpoint for this chain. + // NOTE: This default RPC URL is included for convenience to facilitate quick tests and + // experimentation. Do not use this RPC URL for production test suites, CI, or other heavy + // usage as you will be throttled and this is a disservice to others who need this endpoint. + string rpcUrl; + } + + // Maps from the chain's alias (matching the alias in the `foundry.toml` file) to chain data. + mapping(string => Chain) private chains; + // Maps from the chain's alias to it's default RPC URL. + mapping(string => string) private defaultRpcUrls; + // Maps from a chain ID to it's alias. + mapping(uint256 => string) private idToAlias; + + bool private fallbackToDefaultRpcUrls = true; + + // The RPC URL will be fetched from config or defaultRpcUrls if possible. + function getChain(string memory chainAlias) internal virtual returns (Chain memory chain) { + require(bytes(chainAlias).length != 0, "StdChains getChain(string): Chain alias cannot be the empty string."); + + initializeStdChains(); + chain = chains[chainAlias]; + require( + chain.chainId != 0, + string(abi.encodePacked("StdChains getChain(string): Chain with alias \"", chainAlias, "\" not found.")) + ); + + chain = getChainWithUpdatedRpcUrl(chainAlias, chain); + } + + function getChain(uint256 chainId) internal virtual returns (Chain memory chain) { + require(chainId != 0, "StdChains getChain(uint256): Chain ID cannot be 0."); + initializeStdChains(); + string memory chainAlias = idToAlias[chainId]; + + chain = chains[chainAlias]; + + require( + chain.chainId != 0, + string(abi.encodePacked("StdChains getChain(uint256): Chain with ID ", vm.toString(chainId), " not found.")) + ); + + chain = getChainWithUpdatedRpcUrl(chainAlias, chain); + } + + // set chain info, with priority to argument's rpcUrl field. + function setChain(string memory chainAlias, ChainData memory chain) internal virtual { + require( + bytes(chainAlias).length != 0, + "StdChains setChain(string,ChainData): Chain alias cannot be the empty string." + ); + + require(chain.chainId != 0, "StdChains setChain(string,ChainData): Chain ID cannot be 0."); + + initializeStdChains(); + string memory foundAlias = idToAlias[chain.chainId]; + + require( + bytes(foundAlias).length == 0 || keccak256(bytes(foundAlias)) == keccak256(bytes(chainAlias)), + string( + abi.encodePacked( + "StdChains setChain(string,ChainData): Chain ID ", + vm.toString(chain.chainId), + " already used by \"", + foundAlias, + "\"." + ) + ) + ); + + uint256 oldChainId = chains[chainAlias].chainId; + delete idToAlias[oldChainId]; + + chains[chainAlias] = + Chain({name: chain.name, chainId: chain.chainId, chainAlias: chainAlias, rpcUrl: chain.rpcUrl}); + idToAlias[chain.chainId] = chainAlias; + } + + // set chain info, with priority to argument's rpcUrl field. + function setChain(string memory chainAlias, Chain memory chain) internal virtual { + setChain(chainAlias, ChainData({name: chain.name, chainId: chain.chainId, rpcUrl: chain.rpcUrl})); + } + + function _toUpper(string memory str) private pure returns (string memory) { + bytes memory strb = bytes(str); + bytes memory copy = new bytes(strb.length); + for (uint256 i = 0; i < strb.length; i++) { + bytes1 b = strb[i]; + if (b >= 0x61 && b <= 0x7A) { + copy[i] = bytes1(uint8(b) - 32); + } else { + copy[i] = b; + } + } + return string(copy); + } + + // lookup rpcUrl, in descending order of priority: + // current -> config (foundry.toml) -> environment variable -> default + function getChainWithUpdatedRpcUrl(string memory chainAlias, Chain memory chain) private returns (Chain memory) { + if (bytes(chain.rpcUrl).length == 0) { + try vm.rpcUrl(chainAlias) returns (string memory configRpcUrl) { + chain.rpcUrl = configRpcUrl; + } catch (bytes memory err) { + string memory envName = string(abi.encodePacked(_toUpper(chainAlias), "_RPC_URL")); + if (fallbackToDefaultRpcUrls) { + chain.rpcUrl = vm.envOr(envName, defaultRpcUrls[chainAlias]); + } else { + chain.rpcUrl = vm.envString(envName); + } + // distinguish 'not found' from 'cannot read' + bytes memory notFoundError = + abi.encodeWithSignature("CheatCodeError", string(abi.encodePacked("invalid rpc url ", chainAlias))); + if (keccak256(notFoundError) != keccak256(err) || bytes(chain.rpcUrl).length == 0) { + /// @solidity memory-safe-assembly + assembly { + revert(add(32, err), mload(err)) + } + } + } + } + return chain; + } + + function setFallbackToDefaultRpcUrls(bool useDefault) internal { + fallbackToDefaultRpcUrls = useDefault; + } + + function initializeStdChains() private { + if (stdChainsInitialized) return; + + stdChainsInitialized = true; + + // If adding an RPC here, make sure to test the default RPC URL in `testRpcs` + setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545")); + setChainWithDefaultRpcUrl( + "mainnet", ChainData("Mainnet", 1, "https://mainnet.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") + ); + setChainWithDefaultRpcUrl( + "goerli", ChainData("Goerli", 5, "https://goerli.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") + ); + setChainWithDefaultRpcUrl( + "sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001") + ); + setChainWithDefaultRpcUrl("optimism", ChainData("Optimism", 10, "https://mainnet.optimism.io")); + setChainWithDefaultRpcUrl("optimism_goerli", ChainData("Optimism Goerli", 420, "https://goerli.optimism.io")); + setChainWithDefaultRpcUrl("arbitrum_one", ChainData("Arbitrum One", 42161, "https://arb1.arbitrum.io/rpc")); + setChainWithDefaultRpcUrl( + "arbitrum_one_goerli", ChainData("Arbitrum One Goerli", 421613, "https://goerli-rollup.arbitrum.io/rpc") + ); + setChainWithDefaultRpcUrl("arbitrum_nova", ChainData("Arbitrum Nova", 42170, "https://nova.arbitrum.io/rpc")); + setChainWithDefaultRpcUrl("polygon", ChainData("Polygon", 137, "https://polygon-rpc.com")); + setChainWithDefaultRpcUrl( + "polygon_mumbai", ChainData("Polygon Mumbai", 80001, "https://rpc-mumbai.maticvigil.com") + ); + setChainWithDefaultRpcUrl("avalanche", ChainData("Avalanche", 43114, "https://api.avax.network/ext/bc/C/rpc")); + setChainWithDefaultRpcUrl( + "avalanche_fuji", ChainData("Avalanche Fuji", 43113, "https://api.avax-test.network/ext/bc/C/rpc") + ); + setChainWithDefaultRpcUrl( + "bnb_smart_chain", ChainData("BNB Smart Chain", 56, "https://bsc-dataseed1.binance.org") + ); + setChainWithDefaultRpcUrl( + "bnb_smart_chain_testnet", + ChainData("BNB Smart Chain Testnet", 97, "https://rpc.ankr.com/bsc_testnet_chapel") + ); + setChainWithDefaultRpcUrl("gnosis_chain", ChainData("Gnosis Chain", 100, "https://rpc.gnosischain.com")); + } + + // set chain info, with priority to chainAlias' rpc url in foundry.toml + function setChainWithDefaultRpcUrl(string memory chainAlias, ChainData memory chain) private { + string memory rpcUrl = chain.rpcUrl; + defaultRpcUrls[chainAlias] = rpcUrl; + chain.rpcUrl = ""; + setChain(chainAlias, chain); + chain.rpcUrl = rpcUrl; // restore argument + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdCheats.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdCheats.sol new file mode 100644 index 000000000..d4d56701f --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdCheats.sol @@ -0,0 +1,639 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {StdStorage, stdStorage} from "./StdStorage.sol"; +import {Vm} from "./Vm.sol"; + +abstract contract StdCheatsSafe { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + bool private gasMeteringOff; + + // Data structures to parse Transaction objects from the broadcast artifact + // that conform to EIP1559. The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct RawTx1559 { + string[] arguments; + address contractAddress; + string contractName; + // json value name = function + string functionSig; + bytes32 hash; + // json value name = tx + RawTx1559Detail txDetail; + // json value name = type + string opcode; + } + + struct RawTx1559Detail { + AccessList[] accessList; + bytes data; + address from; + bytes gas; + bytes nonce; + address to; + bytes txType; + bytes value; + } + + struct Tx1559 { + string[] arguments; + address contractAddress; + string contractName; + string functionSig; + bytes32 hash; + Tx1559Detail txDetail; + string opcode; + } + + struct Tx1559Detail { + AccessList[] accessList; + bytes data; + address from; + uint256 gas; + uint256 nonce; + address to; + uint256 txType; + uint256 value; + } + + // Data structures to parse Transaction objects from the broadcast artifact + // that DO NOT conform to EIP1559. The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct TxLegacy { + string[] arguments; + address contractAddress; + string contractName; + string functionSig; + string hash; + string opcode; + TxDetailLegacy transaction; + } + + struct TxDetailLegacy { + AccessList[] accessList; + uint256 chainId; + bytes data; + address from; + uint256 gas; + uint256 gasPrice; + bytes32 hash; + uint256 nonce; + bytes1 opcode; + bytes32 r; + bytes32 s; + uint256 txType; + address to; + uint8 v; + uint256 value; + } + + struct AccessList { + address accessAddress; + bytes32[] storageKeys; + } + + // Data structures to parse Receipt objects from the broadcast artifact. + // The Raw structs is what is parsed from the JSON + // and then converted to the one that is used by the user for better UX. + + struct RawReceipt { + bytes32 blockHash; + bytes blockNumber; + address contractAddress; + bytes cumulativeGasUsed; + bytes effectiveGasPrice; + address from; + bytes gasUsed; + RawReceiptLog[] logs; + bytes logsBloom; + bytes status; + address to; + bytes32 transactionHash; + bytes transactionIndex; + } + + struct Receipt { + bytes32 blockHash; + uint256 blockNumber; + address contractAddress; + uint256 cumulativeGasUsed; + uint256 effectiveGasPrice; + address from; + uint256 gasUsed; + ReceiptLog[] logs; + bytes logsBloom; + uint256 status; + address to; + bytes32 transactionHash; + uint256 transactionIndex; + } + + // Data structures to parse the entire broadcast artifact, assuming the + // transactions conform to EIP1559. + + struct EIP1559ScriptArtifact { + string[] libraries; + string path; + string[] pending; + Receipt[] receipts; + uint256 timestamp; + Tx1559[] transactions; + TxReturn[] txReturns; + } + + struct RawEIP1559ScriptArtifact { + string[] libraries; + string path; + string[] pending; + RawReceipt[] receipts; + TxReturn[] txReturns; + uint256 timestamp; + RawTx1559[] transactions; + } + + struct RawReceiptLog { + // json value = address + address logAddress; + bytes32 blockHash; + bytes blockNumber; + bytes data; + bytes logIndex; + bool removed; + bytes32[] topics; + bytes32 transactionHash; + bytes transactionIndex; + bytes transactionLogIndex; + } + + struct ReceiptLog { + // json value = address + address logAddress; + bytes32 blockHash; + uint256 blockNumber; + bytes data; + uint256 logIndex; + bytes32[] topics; + uint256 transactionIndex; + uint256 transactionLogIndex; + bool removed; + } + + struct TxReturn { + string internalType; + string value; + } + + struct Account { + address addr; + uint256 key; + } + + function assumeNoPrecompiles(address addr) internal virtual { + // Assembly required since `block.chainid` was introduced in 0.8.0. + uint256 chainId; + assembly { + chainId := chainid() + } + assumeNoPrecompiles(addr, chainId); + } + + function assumeNoPrecompiles(address addr, uint256 chainId) internal pure virtual { + // Note: For some chains like Optimism these are technically predeploys (i.e. bytecode placed at a specific + // address), but the same rationale for excluding them applies so we include those too. + + // These should be present on all EVM-compatible chains. + vm.assume(addr < address(0x1) || addr > address(0x9)); + + // forgefmt: disable-start + if (chainId == 10 || chainId == 420) { + // https://github.com/ethereum-optimism/optimism/blob/eaa371a0184b56b7ca6d9eb9cb0a2b78b2ccd864/op-bindings/predeploys/addresses.go#L6-L21 + vm.assume(addr < address(0x4200000000000000000000000000000000000000) || addr > address(0x4200000000000000000000000000000000000800)); + } else if (chainId == 42161 || chainId == 421613) { + // https://developer.arbitrum.io/useful-addresses#arbitrum-precompiles-l2-same-on-all-arb-chains + vm.assume(addr < address(0x0000000000000000000000000000000000000064) || addr > address(0x0000000000000000000000000000000000000068)); + } else if (chainId == 43114 || chainId == 43113) { + // https://github.com/ava-labs/subnet-evm/blob/47c03fd007ecaa6de2c52ea081596e0a88401f58/precompile/params.go#L18-L59 + vm.assume(addr < address(0x0100000000000000000000000000000000000000) || addr > address(0x01000000000000000000000000000000000000ff)); + vm.assume(addr < address(0x0200000000000000000000000000000000000000) || addr > address(0x02000000000000000000000000000000000000FF)); + vm.assume(addr < address(0x0300000000000000000000000000000000000000) || addr > address(0x03000000000000000000000000000000000000Ff)); + } + // forgefmt: disable-end + } + + function readEIP1559ScriptArtifact(string memory path) + internal + view + virtual + returns (EIP1559ScriptArtifact memory) + { + string memory data = vm.readFile(path); + bytes memory parsedData = vm.parseJson(data); + RawEIP1559ScriptArtifact memory rawArtifact = abi.decode(parsedData, (RawEIP1559ScriptArtifact)); + EIP1559ScriptArtifact memory artifact; + artifact.libraries = rawArtifact.libraries; + artifact.path = rawArtifact.path; + artifact.timestamp = rawArtifact.timestamp; + artifact.pending = rawArtifact.pending; + artifact.txReturns = rawArtifact.txReturns; + artifact.receipts = rawToConvertedReceipts(rawArtifact.receipts); + artifact.transactions = rawToConvertedEIPTx1559s(rawArtifact.transactions); + return artifact; + } + + function rawToConvertedEIPTx1559s(RawTx1559[] memory rawTxs) internal pure virtual returns (Tx1559[] memory) { + Tx1559[] memory txs = new Tx1559[](rawTxs.length); + for (uint256 i; i < rawTxs.length; i++) { + txs[i] = rawToConvertedEIPTx1559(rawTxs[i]); + } + return txs; + } + + function rawToConvertedEIPTx1559(RawTx1559 memory rawTx) internal pure virtual returns (Tx1559 memory) { + Tx1559 memory transaction; + transaction.arguments = rawTx.arguments; + transaction.contractName = rawTx.contractName; + transaction.functionSig = rawTx.functionSig; + transaction.hash = rawTx.hash; + transaction.txDetail = rawToConvertedEIP1559Detail(rawTx.txDetail); + transaction.opcode = rawTx.opcode; + return transaction; + } + + function rawToConvertedEIP1559Detail(RawTx1559Detail memory rawDetail) + internal + pure + virtual + returns (Tx1559Detail memory) + { + Tx1559Detail memory txDetail; + txDetail.data = rawDetail.data; + txDetail.from = rawDetail.from; + txDetail.to = rawDetail.to; + txDetail.nonce = _bytesToUint(rawDetail.nonce); + txDetail.txType = _bytesToUint(rawDetail.txType); + txDetail.value = _bytesToUint(rawDetail.value); + txDetail.gas = _bytesToUint(rawDetail.gas); + txDetail.accessList = rawDetail.accessList; + return txDetail; + } + + function readTx1559s(string memory path) internal view virtual returns (Tx1559[] memory) { + string memory deployData = vm.readFile(path); + bytes memory parsedDeployData = vm.parseJson(deployData, ".transactions"); + RawTx1559[] memory rawTxs = abi.decode(parsedDeployData, (RawTx1559[])); + return rawToConvertedEIPTx1559s(rawTxs); + } + + function readTx1559(string memory path, uint256 index) internal view virtual returns (Tx1559 memory) { + string memory deployData = vm.readFile(path); + string memory key = string(abi.encodePacked(".transactions[", vm.toString(index), "]")); + bytes memory parsedDeployData = vm.parseJson(deployData, key); + RawTx1559 memory rawTx = abi.decode(parsedDeployData, (RawTx1559)); + return rawToConvertedEIPTx1559(rawTx); + } + + // Analogous to readTransactions, but for receipts. + function readReceipts(string memory path) internal view virtual returns (Receipt[] memory) { + string memory deployData = vm.readFile(path); + bytes memory parsedDeployData = vm.parseJson(deployData, ".receipts"); + RawReceipt[] memory rawReceipts = abi.decode(parsedDeployData, (RawReceipt[])); + return rawToConvertedReceipts(rawReceipts); + } + + function readReceipt(string memory path, uint256 index) internal view virtual returns (Receipt memory) { + string memory deployData = vm.readFile(path); + string memory key = string(abi.encodePacked(".receipts[", vm.toString(index), "]")); + bytes memory parsedDeployData = vm.parseJson(deployData, key); + RawReceipt memory rawReceipt = abi.decode(parsedDeployData, (RawReceipt)); + return rawToConvertedReceipt(rawReceipt); + } + + function rawToConvertedReceipts(RawReceipt[] memory rawReceipts) internal pure virtual returns (Receipt[] memory) { + Receipt[] memory receipts = new Receipt[](rawReceipts.length); + for (uint256 i; i < rawReceipts.length; i++) { + receipts[i] = rawToConvertedReceipt(rawReceipts[i]); + } + return receipts; + } + + function rawToConvertedReceipt(RawReceipt memory rawReceipt) internal pure virtual returns (Receipt memory) { + Receipt memory receipt; + receipt.blockHash = rawReceipt.blockHash; + receipt.to = rawReceipt.to; + receipt.from = rawReceipt.from; + receipt.contractAddress = rawReceipt.contractAddress; + receipt.effectiveGasPrice = _bytesToUint(rawReceipt.effectiveGasPrice); + receipt.cumulativeGasUsed = _bytesToUint(rawReceipt.cumulativeGasUsed); + receipt.gasUsed = _bytesToUint(rawReceipt.gasUsed); + receipt.status = _bytesToUint(rawReceipt.status); + receipt.transactionIndex = _bytesToUint(rawReceipt.transactionIndex); + receipt.blockNumber = _bytesToUint(rawReceipt.blockNumber); + receipt.logs = rawToConvertedReceiptLogs(rawReceipt.logs); + receipt.logsBloom = rawReceipt.logsBloom; + receipt.transactionHash = rawReceipt.transactionHash; + return receipt; + } + + function rawToConvertedReceiptLogs(RawReceiptLog[] memory rawLogs) + internal + pure + virtual + returns (ReceiptLog[] memory) + { + ReceiptLog[] memory logs = new ReceiptLog[](rawLogs.length); + for (uint256 i; i < rawLogs.length; i++) { + logs[i].logAddress = rawLogs[i].logAddress; + logs[i].blockHash = rawLogs[i].blockHash; + logs[i].blockNumber = _bytesToUint(rawLogs[i].blockNumber); + logs[i].data = rawLogs[i].data; + logs[i].logIndex = _bytesToUint(rawLogs[i].logIndex); + logs[i].topics = rawLogs[i].topics; + logs[i].transactionIndex = _bytesToUint(rawLogs[i].transactionIndex); + logs[i].transactionLogIndex = _bytesToUint(rawLogs[i].transactionLogIndex); + logs[i].removed = rawLogs[i].removed; + } + return logs; + } + + // Deploy a contract by fetching the contract bytecode from + // the artifacts directory + // e.g. `deployCode(code, abi.encode(arg1,arg2,arg3))` + function deployCode(string memory what, bytes memory args) internal virtual returns (address addr) { + bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); + /// @solidity memory-safe-assembly + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,bytes): Deployment failed."); + } + + function deployCode(string memory what) internal virtual returns (address addr) { + bytes memory bytecode = vm.getCode(what); + /// @solidity memory-safe-assembly + assembly { + addr := create(0, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string): Deployment failed."); + } + + /// @dev deploy contract with value on construction + function deployCode(string memory what, bytes memory args, uint256 val) internal virtual returns (address addr) { + bytes memory bytecode = abi.encodePacked(vm.getCode(what), args); + /// @solidity memory-safe-assembly + assembly { + addr := create(val, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,bytes,uint256): Deployment failed."); + } + + function deployCode(string memory what, uint256 val) internal virtual returns (address addr) { + bytes memory bytecode = vm.getCode(what); + /// @solidity memory-safe-assembly + assembly { + addr := create(val, add(bytecode, 0x20), mload(bytecode)) + } + + require(addr != address(0), "StdCheats deployCode(string,uint256): Deployment failed."); + } + + // creates a labeled address and the corresponding private key + function makeAddrAndKey(string memory name) internal virtual returns (address addr, uint256 privateKey) { + privateKey = uint256(keccak256(abi.encodePacked(name))); + addr = vm.addr(privateKey); + vm.label(addr, name); + } + + // creates a labeled address + function makeAddr(string memory name) internal virtual returns (address addr) { + (addr,) = makeAddrAndKey(name); + } + + // creates a struct containing both a labeled address and the corresponding private key + function makeAccount(string memory name) internal virtual returns (Account memory account) { + (account.addr, account.key) = makeAddrAndKey(name); + } + + function deriveRememberKey(string memory mnemonic, uint32 index) + internal + virtual + returns (address who, uint256 privateKey) + { + privateKey = vm.deriveKey(mnemonic, index); + who = vm.rememberKey(privateKey); + } + + function _bytesToUint(bytes memory b) private pure returns (uint256) { + require(b.length <= 32, "StdCheats _bytesToUint(bytes): Bytes length exceeds 32."); + return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); + } + + function isFork() internal view virtual returns (bool status) { + try vm.activeFork() { + status = true; + } catch (bytes memory) {} + } + + modifier skipWhenForking() { + if (!isFork()) { + _; + } + } + + modifier skipWhenNotForking() { + if (isFork()) { + _; + } + } + + modifier noGasMetering() { + vm.pauseGasMetering(); + // To prevent turning gas monitoring back on with nested functions that use this modifier, + // we check if gasMetering started in the off position. If it did, we don't want to turn + // it back on until we exit the top level function that used the modifier + // + // i.e. funcA() noGasMetering { funcB() }, where funcB has noGasMetering as well. + // funcA will have `gasStartedOff` as false, funcB will have it as true, + // so we only turn metering back on at the end of the funcA + bool gasStartedOff = gasMeteringOff; + gasMeteringOff = true; + + _; + + // if gas metering was on when this modifier was called, turn it back on at the end + if (!gasStartedOff) { + gasMeteringOff = false; + vm.resumeGasMetering(); + } + } + + // a cheat for fuzzing addresses that are payable only + // see https://github.com/foundry-rs/foundry/issues/3631 + function assumePayable(address addr) internal virtual { + (bool success,) = payable(addr).call{value: 0}(""); + vm.assume(success); + } +} + +// Wrappers around cheatcodes to avoid footguns +abstract contract StdCheats is StdCheatsSafe { + using stdStorage for StdStorage; + + StdStorage private stdstore; + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + // Skip forward or rewind time by the specified number of seconds + function skip(uint256 time) internal virtual { + vm.warp(block.timestamp + time); + } + + function rewind(uint256 time) internal virtual { + vm.warp(block.timestamp - time); + } + + // Setup a prank from an address that has some ether + function hoax(address msgSender) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.prank(msgSender); + } + + function hoax(address msgSender, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.prank(msgSender); + } + + function hoax(address msgSender, address origin) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.prank(msgSender, origin); + } + + function hoax(address msgSender, address origin, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.prank(msgSender, origin); + } + + // Start perpetual prank from an address that has some ether + function startHoax(address msgSender) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.startPrank(msgSender); + } + + function startHoax(address msgSender, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.startPrank(msgSender); + } + + // Start perpetual prank from an address that has some ether + // tx.origin is set to the origin parameter + function startHoax(address msgSender, address origin) internal virtual { + vm.deal(msgSender, 1 << 128); + vm.startPrank(msgSender, origin); + } + + function startHoax(address msgSender, address origin, uint256 give) internal virtual { + vm.deal(msgSender, give); + vm.startPrank(msgSender, origin); + } + + function changePrank(address msgSender) internal virtual { + vm.stopPrank(); + vm.startPrank(msgSender); + } + + function changePrank(address msgSender, address txOrigin) internal virtual { + vm.stopPrank(); + vm.startPrank(msgSender, txOrigin); + } + + // The same as Vm's `deal` + // Use the alternative signature for ERC20 tokens + function deal(address to, uint256 give) internal virtual { + vm.deal(to, give); + } + + // Set the balance of an account for any ERC20 token + // Use the alternative signature to update `totalSupply` + function deal(address token, address to, uint256 give) internal virtual { + deal(token, to, give, false); + } + + // Set the balance of an account for any ERC1155 token + // Use the alternative signature to update `totalSupply` + function dealERC1155(address token, address to, uint256 id, uint256 give) internal virtual { + dealERC1155(token, to, id, give, false); + } + + function deal(address token, address to, uint256 give, bool adjust) internal virtual { + // get current balance + (, bytes memory balData) = token.call(abi.encodeWithSelector(0x70a08231, to)); + uint256 prevBal = abi.decode(balData, (uint256)); + + // update balance + stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(give); + + // update total supply + if (adjust) { + (, bytes memory totSupData) = token.call(abi.encodeWithSelector(0x18160ddd)); + uint256 totSup = abi.decode(totSupData, (uint256)); + if (give < prevBal) { + totSup -= (prevBal - give); + } else { + totSup += (give - prevBal); + } + stdstore.target(token).sig(0x18160ddd).checked_write(totSup); + } + } + + function dealERC1155(address token, address to, uint256 id, uint256 give, bool adjust) internal virtual { + // get current balance + (, bytes memory balData) = token.call(abi.encodeWithSelector(0x00fdd58e, to, id)); + uint256 prevBal = abi.decode(balData, (uint256)); + + // update balance + stdstore.target(token).sig(0x00fdd58e).with_key(to).with_key(id).checked_write(give); + + // update total supply + if (adjust) { + (, bytes memory totSupData) = token.call(abi.encodeWithSelector(0xbd85b039, id)); + require( + totSupData.length != 0, + "StdCheats deal(address,address,uint,uint,bool): target contract is not ERC1155Supply." + ); + uint256 totSup = abi.decode(totSupData, (uint256)); + if (give < prevBal) { + totSup -= (prevBal - give); + } else { + totSup += (give - prevBal); + } + stdstore.target(token).sig(0xbd85b039).with_key(id).checked_write(totSup); + } + } + + function dealERC721(address token, address to, uint256 id) internal virtual { + // check if token id is already minted and the actual owner. + (bool successMinted, bytes memory ownerData) = token.staticcall(abi.encodeWithSelector(0x6352211e, id)); + require(successMinted, "StdCheats deal(address,address,uint,bool): id not minted."); + + // get owner current balance + (, bytes memory fromBalData) = token.call(abi.encodeWithSelector(0x70a08231, abi.decode(ownerData, (address)))); + uint256 fromPrevBal = abi.decode(fromBalData, (uint256)); + + // get new user current balance + (, bytes memory toBalData) = token.call(abi.encodeWithSelector(0x70a08231, to)); + uint256 toPrevBal = abi.decode(toBalData, (uint256)); + + // update balances + stdstore.target(token).sig(0x70a08231).with_key(abi.decode(ownerData, (address))).checked_write(--fromPrevBal); + stdstore.target(token).sig(0x70a08231).with_key(to).checked_write(++toPrevBal); + + // update owner + stdstore.target(token).sig(0x6352211e).with_key(id).checked_write(to); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdError.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdError.sol new file mode 100644 index 000000000..a302191fa --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdError.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +// Panics work for versions >=0.8.0, but we lowered the pragma to make this compatible with Test +pragma solidity >=0.6.2 <0.9.0; + +library stdError { + bytes public constant assertionError = abi.encodeWithSignature("Panic(uint256)", 0x01); + bytes public constant arithmeticError = abi.encodeWithSignature("Panic(uint256)", 0x11); + bytes public constant divisionError = abi.encodeWithSignature("Panic(uint256)", 0x12); + bytes public constant enumConversionError = abi.encodeWithSignature("Panic(uint256)", 0x21); + bytes public constant encodeStorageError = abi.encodeWithSignature("Panic(uint256)", 0x22); + bytes public constant popError = abi.encodeWithSignature("Panic(uint256)", 0x31); + bytes public constant indexOOBError = abi.encodeWithSignature("Panic(uint256)", 0x32); + bytes public constant memOverflowError = abi.encodeWithSignature("Panic(uint256)", 0x41); + bytes public constant zeroVarError = abi.encodeWithSignature("Panic(uint256)", 0x51); +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdInvariant.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdInvariant.sol new file mode 100644 index 000000000..efa1129ef --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdInvariant.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +contract StdInvariant { + struct FuzzSelector { + address addr; + bytes4[] selectors; + } + + address[] private _excludedContracts; + address[] private _excludedSenders; + address[] private _targetedContracts; + address[] private _targetedSenders; + + string[] private _excludedArtifacts; + string[] private _targetedArtifacts; + + FuzzSelector[] private _targetedArtifactSelectors; + FuzzSelector[] private _targetedSelectors; + + // Functions for users: + // These are intended to be called in tests. + + function excludeContract(address newExcludedContract_) internal { + _excludedContracts.push(newExcludedContract_); + } + + function excludeSender(address newExcludedSender_) internal { + _excludedSenders.push(newExcludedSender_); + } + + function excludeArtifact(string memory newExcludedArtifact_) internal { + _excludedArtifacts.push(newExcludedArtifact_); + } + + function targetArtifact(string memory newTargetedArtifact_) internal { + _targetedArtifacts.push(newTargetedArtifact_); + } + + function targetArtifactSelector(FuzzSelector memory newTargetedArtifactSelector_) internal { + _targetedArtifactSelectors.push(newTargetedArtifactSelector_); + } + + function targetContract(address newTargetedContract_) internal { + _targetedContracts.push(newTargetedContract_); + } + + function targetSelector(FuzzSelector memory newTargetedSelector_) internal { + _targetedSelectors.push(newTargetedSelector_); + } + + function targetSender(address newTargetedSender_) internal { + _targetedSenders.push(newTargetedSender_); + } + + // Functions for forge: + // These are called by forge to run invariant tests and don't need to be called in tests. + + function excludeArtifacts() public view returns (string[] memory excludedArtifacts_) { + excludedArtifacts_ = _excludedArtifacts; + } + + function excludeContracts() public view returns (address[] memory excludedContracts_) { + excludedContracts_ = _excludedContracts; + } + + function excludeSenders() public view returns (address[] memory excludedSenders_) { + excludedSenders_ = _excludedSenders; + } + + function targetArtifacts() public view returns (string[] memory targetedArtifacts_) { + targetedArtifacts_ = _targetedArtifacts; + } + + function targetArtifactSelectors() public view returns (FuzzSelector[] memory targetedArtifactSelectors_) { + targetedArtifactSelectors_ = _targetedArtifactSelectors; + } + + function targetContracts() public view returns (address[] memory targetedContracts_) { + targetedContracts_ = _targetedContracts; + } + + function targetSelectors() public view returns (FuzzSelector[] memory targetedSelectors_) { + targetedSelectors_ = _targetedSelectors; + } + + function targetSenders() public view returns (address[] memory targetedSenders_) { + targetedSenders_ = _targetedSenders; + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdJson.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdJson.sol new file mode 100644 index 000000000..014e6b15e --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdJson.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {VmSafe} from "./Vm.sol"; + +// Helpers for parsing and writing JSON files +// To parse: +// ``` +// using stdJson for string; +// string memory json = vm.readFile("some_peth"); +// json.parseUint(""); +// ``` +// To write: +// ``` +// using stdJson for string; +// string memory json = "deploymentArtifact"; +// Contract contract = new Contract(); +// json.serialize("contractAddress", address(contract)); +// json = json.serialize("deploymentTimes", uint(1)); +// // store the stringified JSON to the 'json' variable we have been using as a key +// // as we won't need it any longer +// string memory json2 = "finalArtifact"; +// string memory final = json2.serialize("depArtifact", json); +// final.write(""); +// ``` + +library stdJson { + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function parseRaw(string memory json, string memory key) internal pure returns (bytes memory) { + return vm.parseJson(json, key); + } + + function readUint(string memory json, string memory key) internal returns (uint256) { + return vm.parseJsonUint(json, key); + } + + function readUintArray(string memory json, string memory key) internal returns (uint256[] memory) { + return vm.parseJsonUintArray(json, key); + } + + function readInt(string memory json, string memory key) internal returns (int256) { + return vm.parseJsonInt(json, key); + } + + function readIntArray(string memory json, string memory key) internal returns (int256[] memory) { + return vm.parseJsonIntArray(json, key); + } + + function readBytes32(string memory json, string memory key) internal returns (bytes32) { + return vm.parseJsonBytes32(json, key); + } + + function readBytes32Array(string memory json, string memory key) internal returns (bytes32[] memory) { + return vm.parseJsonBytes32Array(json, key); + } + + function readString(string memory json, string memory key) internal returns (string memory) { + return vm.parseJsonString(json, key); + } + + function readStringArray(string memory json, string memory key) internal returns (string[] memory) { + return vm.parseJsonStringArray(json, key); + } + + function readAddress(string memory json, string memory key) internal returns (address) { + return vm.parseJsonAddress(json, key); + } + + function readAddressArray(string memory json, string memory key) internal returns (address[] memory) { + return vm.parseJsonAddressArray(json, key); + } + + function readBool(string memory json, string memory key) internal returns (bool) { + return vm.parseJsonBool(json, key); + } + + function readBoolArray(string memory json, string memory key) internal returns (bool[] memory) { + return vm.parseJsonBoolArray(json, key); + } + + function readBytes(string memory json, string memory key) internal returns (bytes memory) { + return vm.parseJsonBytes(json, key); + } + + function readBytesArray(string memory json, string memory key) internal returns (bytes[] memory) { + return vm.parseJsonBytesArray(json, key); + } + + function serialize(string memory jsonKey, string memory key, bool value) internal returns (string memory) { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bool[] memory value) + internal + returns (string memory) + { + return vm.serializeBool(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256 value) internal returns (string memory) { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, uint256[] memory value) + internal + returns (string memory) + { + return vm.serializeUint(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256 value) internal returns (string memory) { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, int256[] memory value) + internal + returns (string memory) + { + return vm.serializeInt(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address value) internal returns (string memory) { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, address[] memory value) + internal + returns (string memory) + { + return vm.serializeAddress(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32 value) internal returns (string memory) { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes32[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes32(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes memory value) internal returns (string memory) { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, bytes[] memory value) + internal + returns (string memory) + { + return vm.serializeBytes(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function serialize(string memory jsonKey, string memory key, string[] memory value) + internal + returns (string memory) + { + return vm.serializeString(jsonKey, key, value); + } + + function write(string memory jsonKey, string memory path) internal { + vm.writeJson(jsonKey, path); + } + + function write(string memory jsonKey, string memory path, string memory valueKey) internal { + vm.writeJson(jsonKey, path, valueKey); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdMath.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdMath.sol new file mode 100644 index 000000000..459523bda --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdMath.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +library stdMath { + int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968; + + function abs(int256 a) internal pure returns (uint256) { + // Required or it will fail when `a = type(int256).min` + if (a == INT256_MIN) { + return 57896044618658097711785492504343953926634992332820282019728792003956564819968; + } + + return uint256(a > 0 ? a : -a); + } + + function delta(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a - b : b - a; + } + + function delta(int256 a, int256 b) internal pure returns (uint256) { + // a and b are of the same sign + // this works thanks to two's complement, the left-most bit is the sign bit + if ((a ^ b) > -1) { + return delta(abs(a), abs(b)); + } + + // a and b are of opposite signs + return abs(a) + abs(b); + } + + function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 absDelta = delta(a, b); + + return absDelta * 1e18 / b; + } + + function percentDelta(int256 a, int256 b) internal pure returns (uint256) { + uint256 absDelta = delta(a, b); + uint256 absB = abs(b); + + return absDelta * 1e18 / absB; + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdStorage.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdStorage.sol new file mode 100644 index 000000000..73a5ceb96 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdStorage.sol @@ -0,0 +1,327 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +import {Vm} from "./Vm.sol"; + +struct StdStorage { + mapping(address => mapping(bytes4 => mapping(bytes32 => uint256))) slots; + mapping(address => mapping(bytes4 => mapping(bytes32 => bool))) finds; + bytes32[] _keys; + bytes4 _sig; + uint256 _depth; + address _target; + bytes32 _set; +} + +library stdStorageSafe { + event SlotFound(address who, bytes4 fsig, bytes32 keysHash, uint256 slot); + event WARNING_UninitedSlot(address who, uint256 slot); + + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function sigs(string memory sigStr) internal pure returns (bytes4) { + return bytes4(keccak256(bytes(sigStr))); + } + + /// @notice find an arbitrary storage slot given a function sig, input data, address of the contract and a value to check against + // slot complexity: + // if flat, will be bytes32(uint256(uint)); + // if map, will be keccak256(abi.encode(key, uint(slot))); + // if deep map, will be keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot))))); + // if map struct, will be bytes32(uint256(keccak256(abi.encode(key1, keccak256(abi.encode(key0, uint(slot)))))) + structFieldDepth); + function find(StdStorage storage self) internal returns (uint256) { + address who = self._target; + bytes4 fsig = self._sig; + uint256 field_depth = self._depth; + bytes32[] memory ins = self._keys; + + // calldata to test against + if (self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]) { + return self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]; + } + bytes memory cald = abi.encodePacked(fsig, flatten(ins)); + vm.record(); + bytes32 fdat; + { + (, bytes memory rdat) = who.staticcall(cald); + fdat = bytesToBytes32(rdat, 32 * field_depth); + } + + (bytes32[] memory reads,) = vm.accesses(address(who)); + if (reads.length == 1) { + bytes32 curr = vm.load(who, reads[0]); + if (curr == bytes32(0)) { + emit WARNING_UninitedSlot(who, uint256(reads[0])); + } + if (fdat != curr) { + require( + false, + "stdStorage find(StdStorage): Packed slot. This would cause dangerous overwriting and currently isn't supported." + ); + } + emit SlotFound(who, fsig, keccak256(abi.encodePacked(ins, field_depth)), uint256(reads[0])); + self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = uint256(reads[0]); + self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = true; + } else if (reads.length > 1) { + for (uint256 i = 0; i < reads.length; i++) { + bytes32 prev = vm.load(who, reads[i]); + if (prev == bytes32(0)) { + emit WARNING_UninitedSlot(who, uint256(reads[i])); + } + // store + vm.store(who, reads[i], bytes32(hex"1337")); + bool success; + bytes memory rdat; + { + (success, rdat) = who.staticcall(cald); + fdat = bytesToBytes32(rdat, 32 * field_depth); + } + + if (success && fdat == bytes32(hex"1337")) { + // we found which of the slots is the actual one + emit SlotFound(who, fsig, keccak256(abi.encodePacked(ins, field_depth)), uint256(reads[i])); + self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = uint256(reads[i]); + self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))] = true; + vm.store(who, reads[i], prev); + break; + } + vm.store(who, reads[i], prev); + } + } else { + revert("stdStorage find(StdStorage): No storage use detected for target."); + } + + require( + self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))], + "stdStorage find(StdStorage): Slot(s) not found." + ); + + delete self._target; + delete self._sig; + delete self._keys; + delete self._depth; + + return self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]; + } + + function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { + self._target = _target; + return self; + } + + function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { + self._sig = _sig; + return self; + } + + function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { + self._sig = sigs(_sig); + return self; + } + + function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { + self._keys.push(bytes32(uint256(uint160(who)))); + return self; + } + + function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { + self._keys.push(bytes32(amt)); + return self; + } + + function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { + self._keys.push(key); + return self; + } + + function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { + self._depth = _depth; + return self; + } + + function read(StdStorage storage self) private returns (bytes memory) { + address t = self._target; + uint256 s = find(self); + return abi.encode(vm.load(t, bytes32(s))); + } + + function read_bytes32(StdStorage storage self) internal returns (bytes32) { + return abi.decode(read(self), (bytes32)); + } + + function read_bool(StdStorage storage self) internal returns (bool) { + int256 v = read_int(self); + if (v == 0) return false; + if (v == 1) return true; + revert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); + } + + function read_address(StdStorage storage self) internal returns (address) { + return abi.decode(read(self), (address)); + } + + function read_uint(StdStorage storage self) internal returns (uint256) { + return abi.decode(read(self), (uint256)); + } + + function read_int(StdStorage storage self) internal returns (int256) { + return abi.decode(read(self), (int256)); + } + + function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { + bytes32 out; + + uint256 max = b.length > 32 ? 32 : b.length; + for (uint256 i = 0; i < max; i++) { + out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); + } + return out; + } + + function flatten(bytes32[] memory b) private pure returns (bytes memory) { + bytes memory result = new bytes(b.length * 32); + for (uint256 i = 0; i < b.length; i++) { + bytes32 k = b[i]; + /// @solidity memory-safe-assembly + assembly { + mstore(add(result, add(32, mul(32, i))), k) + } + } + + return result; + } +} + +library stdStorage { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function sigs(string memory sigStr) internal pure returns (bytes4) { + return stdStorageSafe.sigs(sigStr); + } + + function find(StdStorage storage self) internal returns (uint256) { + return stdStorageSafe.find(self); + } + + function target(StdStorage storage self, address _target) internal returns (StdStorage storage) { + return stdStorageSafe.target(self, _target); + } + + function sig(StdStorage storage self, bytes4 _sig) internal returns (StdStorage storage) { + return stdStorageSafe.sig(self, _sig); + } + + function sig(StdStorage storage self, string memory _sig) internal returns (StdStorage storage) { + return stdStorageSafe.sig(self, _sig); + } + + function with_key(StdStorage storage self, address who) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, who); + } + + function with_key(StdStorage storage self, uint256 amt) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, amt); + } + + function with_key(StdStorage storage self, bytes32 key) internal returns (StdStorage storage) { + return stdStorageSafe.with_key(self, key); + } + + function depth(StdStorage storage self, uint256 _depth) internal returns (StdStorage storage) { + return stdStorageSafe.depth(self, _depth); + } + + function checked_write(StdStorage storage self, address who) internal { + checked_write(self, bytes32(uint256(uint160(who)))); + } + + function checked_write(StdStorage storage self, uint256 amt) internal { + checked_write(self, bytes32(amt)); + } + + function checked_write(StdStorage storage self, bool write) internal { + bytes32 t; + /// @solidity memory-safe-assembly + assembly { + t := write + } + checked_write(self, t); + } + + function checked_write(StdStorage storage self, bytes32 set) internal { + address who = self._target; + bytes4 fsig = self._sig; + uint256 field_depth = self._depth; + bytes32[] memory ins = self._keys; + + bytes memory cald = abi.encodePacked(fsig, flatten(ins)); + if (!self.finds[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]) { + find(self); + } + bytes32 slot = bytes32(self.slots[who][fsig][keccak256(abi.encodePacked(ins, field_depth))]); + + bytes32 fdat; + { + (, bytes memory rdat) = who.staticcall(cald); + fdat = bytesToBytes32(rdat, 32 * field_depth); + } + bytes32 curr = vm.load(who, slot); + + if (fdat != curr) { + require( + false, + "stdStorage find(StdStorage): Packed slot. This would cause dangerous overwriting and currently isn't supported." + ); + } + vm.store(who, slot, set); + delete self._target; + delete self._sig; + delete self._keys; + delete self._depth; + } + + function read_bytes32(StdStorage storage self) internal returns (bytes32) { + return stdStorageSafe.read_bytes32(self); + } + + function read_bool(StdStorage storage self) internal returns (bool) { + return stdStorageSafe.read_bool(self); + } + + function read_address(StdStorage storage self) internal returns (address) { + return stdStorageSafe.read_address(self); + } + + function read_uint(StdStorage storage self) internal returns (uint256) { + return stdStorageSafe.read_uint(self); + } + + function read_int(StdStorage storage self) internal returns (int256) { + return stdStorageSafe.read_int(self); + } + + // Private function so needs to be copied over + function bytesToBytes32(bytes memory b, uint256 offset) private pure returns (bytes32) { + bytes32 out; + + uint256 max = b.length > 32 ? 32 : b.length; + for (uint256 i = 0; i < max; i++) { + out |= bytes32(b[offset + i] & 0xFF) >> (i * 8); + } + return out; + } + + // Private function so needs to be copied over + function flatten(bytes32[] memory b) private pure returns (bytes memory) { + bytes memory result = new bytes(b.length * 32); + for (uint256 i = 0; i < b.length; i++) { + bytes32 k = b[i]; + /// @solidity memory-safe-assembly + assembly { + mstore(add(result, add(32, mul(32, i))), k) + } + } + + return result; + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdStyle.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdStyle.sol new file mode 100644 index 000000000..46f4e81cb --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdStyle.sol @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +import {Vm} from "./Vm.sol"; + +library StdStyle { + Vm private constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + string constant RED = "\u001b[91m"; + string constant GREEN = "\u001b[92m"; + string constant YELLOW = "\u001b[93m"; + string constant BLUE = "\u001b[94m"; + string constant MAGENTA = "\u001b[95m"; + string constant CYAN = "\u001b[96m"; + string constant BOLD = "\u001b[1m"; + string constant DIM = "\u001b[2m"; + string constant ITALIC = "\u001b[3m"; + string constant UNDERLINE = "\u001b[4m"; + string constant INVERSE = "\u001b[7m"; + string constant RESET = "\u001b[0m"; + + function styleConcat(string memory style, string memory self) private pure returns (string memory) { + return string(abi.encodePacked(style, self, RESET)); + } + + function red(string memory self) internal pure returns (string memory) { + return styleConcat(RED, self); + } + + function red(uint256 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(int256 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(address self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function red(bool self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function redBytes(bytes memory self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function redBytes32(bytes32 self) internal pure returns (string memory) { + return red(vm.toString(self)); + } + + function green(string memory self) internal pure returns (string memory) { + return styleConcat(GREEN, self); + } + + function green(uint256 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(int256 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(address self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function green(bool self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function greenBytes(bytes memory self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function greenBytes32(bytes32 self) internal pure returns (string memory) { + return green(vm.toString(self)); + } + + function yellow(string memory self) internal pure returns (string memory) { + return styleConcat(YELLOW, self); + } + + function yellow(uint256 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(int256 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(address self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellow(bool self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellowBytes(bytes memory self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function yellowBytes32(bytes32 self) internal pure returns (string memory) { + return yellow(vm.toString(self)); + } + + function blue(string memory self) internal pure returns (string memory) { + return styleConcat(BLUE, self); + } + + function blue(uint256 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(int256 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(address self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blue(bool self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blueBytes(bytes memory self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function blueBytes32(bytes32 self) internal pure returns (string memory) { + return blue(vm.toString(self)); + } + + function magenta(string memory self) internal pure returns (string memory) { + return styleConcat(MAGENTA, self); + } + + function magenta(uint256 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(int256 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(address self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magenta(bool self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magentaBytes(bytes memory self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function magentaBytes32(bytes32 self) internal pure returns (string memory) { + return magenta(vm.toString(self)); + } + + function cyan(string memory self) internal pure returns (string memory) { + return styleConcat(CYAN, self); + } + + function cyan(uint256 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(int256 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(address self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyan(bool self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyanBytes(bytes memory self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function cyanBytes32(bytes32 self) internal pure returns (string memory) { + return cyan(vm.toString(self)); + } + + function bold(string memory self) internal pure returns (string memory) { + return styleConcat(BOLD, self); + } + + function bold(uint256 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(int256 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(address self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function bold(bool self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function boldBytes(bytes memory self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function boldBytes32(bytes32 self) internal pure returns (string memory) { + return bold(vm.toString(self)); + } + + function dim(string memory self) internal pure returns (string memory) { + return styleConcat(DIM, self); + } + + function dim(uint256 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(int256 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(address self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dim(bool self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dimBytes(bytes memory self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function dimBytes32(bytes32 self) internal pure returns (string memory) { + return dim(vm.toString(self)); + } + + function italic(string memory self) internal pure returns (string memory) { + return styleConcat(ITALIC, self); + } + + function italic(uint256 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(int256 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(address self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italic(bool self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italicBytes(bytes memory self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function italicBytes32(bytes32 self) internal pure returns (string memory) { + return italic(vm.toString(self)); + } + + function underline(string memory self) internal pure returns (string memory) { + return styleConcat(UNDERLINE, self); + } + + function underline(uint256 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(int256 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(address self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underline(bool self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underlineBytes(bytes memory self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function underlineBytes32(bytes32 self) internal pure returns (string memory) { + return underline(vm.toString(self)); + } + + function inverse(string memory self) internal pure returns (string memory) { + return styleConcat(INVERSE, self); + } + + function inverse(uint256 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(int256 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(address self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverse(bool self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverseBytes(bytes memory self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } + + function inverseBytes32(bytes32 self) internal pure returns (string memory) { + return inverse(vm.toString(self)); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/StdUtils.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/StdUtils.sol new file mode 100644 index 000000000..e55b4b90c --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/StdUtils.sol @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import {IMulticall3} from "./interfaces/IMulticall3.sol"; +import {VmSafe} from "./Vm.sol"; + +abstract contract StdUtils { + /*////////////////////////////////////////////////////////////////////////// + CONSTANTS + //////////////////////////////////////////////////////////////////////////*/ + + IMulticall3 private constant multicall = IMulticall3(0xcA11bde05977b3631167028862bE2a173976CA11); + VmSafe private constant vm = VmSafe(address(uint160(uint256(keccak256("hevm cheat code"))))); + address private constant CONSOLE2_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; + uint256 private constant INT256_MIN_ABS = + 57896044618658097711785492504343953926634992332820282019728792003956564819968; + uint256 private constant UINT256_MAX = + 115792089237316195423570985008687907853269984665640564039457584007913129639935; + + // Used by default when deploying with create2, https://github.com/Arachnid/deterministic-deployment-proxy. + address private constant CREATE2_FACTORY = 0x4e59b44847b379578588920cA78FbF26c0B4956C; + + /*////////////////////////////////////////////////////////////////////////// + INTERNAL FUNCTIONS + //////////////////////////////////////////////////////////////////////////*/ + + function _bound(uint256 x, uint256 min, uint256 max) internal pure virtual returns (uint256 result) { + require(min <= max, "StdUtils bound(uint256,uint256,uint256): Max is less than min."); + // If x is between min and max, return x directly. This is to ensure that dictionary values + // do not get shifted if the min is nonzero. More info: https://github.com/foundry-rs/forge-std/issues/188 + if (x >= min && x <= max) return x; + + uint256 size = max - min + 1; + + // If the value is 0, 1, 2, 3, wrap that to min, min+1, min+2, min+3. Similarly for the UINT256_MAX side. + // This helps ensure coverage of the min/max values. + if (x <= 3 && size > x) return min + x; + if (x >= UINT256_MAX - 3 && size > UINT256_MAX - x) return max - (UINT256_MAX - x); + + // Otherwise, wrap x into the range [min, max], i.e. the range is inclusive. + if (x > max) { + uint256 diff = x - max; + uint256 rem = diff % size; + if (rem == 0) return max; + result = min + rem - 1; + } else if (x < min) { + uint256 diff = min - x; + uint256 rem = diff % size; + if (rem == 0) return min; + result = max - rem + 1; + } + } + + function bound(uint256 x, uint256 min, uint256 max) internal view virtual returns (uint256 result) { + result = _bound(x, min, max); + console2_log("Bound Result", result); + } + + function _bound(int256 x, int256 min, int256 max) internal pure virtual returns (int256 result) { + require(min <= max, "StdUtils bound(int256,int256,int256): Max is less than min."); + + // Shifting all int256 values to uint256 to use _bound function. The range of two types are: + // int256 : -(2**255) ~ (2**255 - 1) + // uint256: 0 ~ (2**256 - 1) + // So, add 2**255, INT256_MIN_ABS to the integer values. + // + // If the given integer value is -2**255, we cannot use `-uint256(-x)` because of the overflow. + // So, use `~uint256(x) + 1` instead. + uint256 _x = x < 0 ? (INT256_MIN_ABS - ~uint256(x) - 1) : (uint256(x) + INT256_MIN_ABS); + uint256 _min = min < 0 ? (INT256_MIN_ABS - ~uint256(min) - 1) : (uint256(min) + INT256_MIN_ABS); + uint256 _max = max < 0 ? (INT256_MIN_ABS - ~uint256(max) - 1) : (uint256(max) + INT256_MIN_ABS); + + uint256 y = _bound(_x, _min, _max); + + // To move it back to int256 value, subtract INT256_MIN_ABS at here. + result = y < INT256_MIN_ABS ? int256(~(INT256_MIN_ABS - y) + 1) : int256(y - INT256_MIN_ABS); + } + + function bound(int256 x, int256 min, int256 max) internal view virtual returns (int256 result) { + result = _bound(x, min, max); + console2_log("Bound result", vm.toString(result)); + } + + function bytesToUint(bytes memory b) internal pure virtual returns (uint256) { + require(b.length <= 32, "StdUtils bytesToUint(bytes): Bytes length exceeds 32."); + return abi.decode(abi.encodePacked(new bytes(32 - b.length), b), (uint256)); + } + + /// @dev Compute the address a contract will be deployed at for a given deployer address and nonce + /// @notice adapted from Solmate implementation (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibRLP.sol) + function computeCreateAddress(address deployer, uint256 nonce) internal pure virtual returns (address) { + // forgefmt: disable-start + // The integer zero is treated as an empty byte string, and as a result it only has a length prefix, 0x80, computed via 0x80 + 0. + // A one byte integer uses its own value as its length prefix, there is no additional "0x80 + length" prefix that comes before it. + if (nonce == 0x00) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, bytes1(0x80)))); + if (nonce <= 0x7f) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), deployer, uint8(nonce)))); + + // Nonces greater than 1 byte all follow a consistent encoding scheme, where each value is preceded by a prefix of 0x80 + length. + if (nonce <= 2**8 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd7), bytes1(0x94), deployer, bytes1(0x81), uint8(nonce)))); + if (nonce <= 2**16 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd8), bytes1(0x94), deployer, bytes1(0x82), uint16(nonce)))); + if (nonce <= 2**24 - 1) return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xd9), bytes1(0x94), deployer, bytes1(0x83), uint24(nonce)))); + // forgefmt: disable-end + + // More details about RLP encoding can be found here: https://eth.wiki/fundamentals/rlp + // 0xda = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x84 ++ nonce) + // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex) + // 0x84 = 0x80 + 0x04 (0x04 = the bytes length of the nonce, 4 bytes, in hex) + // We assume nobody can have a nonce large enough to require more than 32 bytes. + return addressFromLast20Bytes( + keccak256(abi.encodePacked(bytes1(0xda), bytes1(0x94), deployer, bytes1(0x84), uint32(nonce))) + ); + } + + function computeCreate2Address(bytes32 salt, bytes32 initcodeHash, address deployer) + internal + pure + virtual + returns (address) + { + return addressFromLast20Bytes(keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, initcodeHash))); + } + + /// @dev returns the address of a contract created with CREATE2 using the default CREATE2 deployer + function computeCreate2Address(bytes32 salt, bytes32 initCodeHash) internal pure returns (address) { + return computeCreate2Address(salt, initCodeHash, CREATE2_FACTORY); + } + + /// @dev returns the hash of the init code (creation code + no args) used in CREATE2 with no constructor arguments + /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode + function hashInitCode(bytes memory creationCode) internal pure returns (bytes32) { + return hashInitCode(creationCode, ""); + } + + /// @dev returns the hash of the init code (creation code + ABI-encoded args) used in CREATE2 + /// @param creationCode the creation code of a contract C, as returned by type(C).creationCode + /// @param args the ABI-encoded arguments to the constructor of C + function hashInitCode(bytes memory creationCode, bytes memory args) internal pure returns (bytes32) { + return keccak256(abi.encodePacked(creationCode, args)); + } + + // Performs a single call with Multicall3 to query the ERC-20 token balances of the given addresses. + function getTokenBalances(address token, address[] memory addresses) + internal + virtual + returns (uint256[] memory balances) + { + uint256 tokenCodeSize; + assembly { + tokenCodeSize := extcodesize(token) + } + require(tokenCodeSize > 0, "StdUtils getTokenBalances(address,address[]): Token address is not a contract."); + + // ABI encode the aggregate call to Multicall3. + uint256 length = addresses.length; + IMulticall3.Call[] memory calls = new IMulticall3.Call[](length); + for (uint256 i = 0; i < length; ++i) { + // 0x70a08231 = bytes4("balanceOf(address)")) + calls[i] = IMulticall3.Call({target: token, callData: abi.encodeWithSelector(0x70a08231, (addresses[i]))}); + } + + // Make the aggregate call. + (, bytes[] memory returnData) = multicall.aggregate(calls); + + // ABI decode the return data and return the balances. + balances = new uint256[](length); + for (uint256 i = 0; i < length; ++i) { + balances[i] = abi.decode(returnData[i], (uint256)); + } + } + + /*////////////////////////////////////////////////////////////////////////// + PRIVATE FUNCTIONS + //////////////////////////////////////////////////////////////////////////*/ + + function addressFromLast20Bytes(bytes32 bytesValue) private pure returns (address) { + return address(uint160(uint256(bytesValue))); + } + + // Used to prevent the compilation of console, which shortens the compilation time when console is not used elsewhere. + + function console2_log(string memory p0, uint256 p1) private view { + (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string,uint256)", p0, p1)); + status; + } + + function console2_log(string memory p0, string memory p1) private view { + (bool status,) = address(CONSOLE2_ADDRESS).staticcall(abi.encodeWithSignature("log(string,string)", p0, p1)); + status; + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/Test.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/Test.sol new file mode 100644 index 000000000..9ff5cb8db --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/Test.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +// 💬 ABOUT +// Standard Library's default Test + +// 🧩 MODULES +import {console} from "./console.sol"; +import {console2} from "./console2.sol"; +import {StdAssertions} from "./StdAssertions.sol"; +import {StdChains} from "./StdChains.sol"; +import {StdCheats} from "./StdCheats.sol"; +import {stdError} from "./StdError.sol"; +import {StdInvariant} from "./StdInvariant.sol"; +import {stdJson} from "./StdJson.sol"; +import {stdMath} from "./StdMath.sol"; +import {StdStorage, stdStorage} from "./StdStorage.sol"; +import {StdUtils} from "./StdUtils.sol"; +import {Vm} from "./Vm.sol"; +import {StdStyle} from "./StdStyle.sol"; + +// 📦 BOILERPLATE +import {TestBase} from "./Base.sol"; +import {DSTest} from "ds-test/test.sol"; + +// ⭐️ TEST +abstract contract Test is DSTest, StdAssertions, StdChains, StdCheats, StdInvariant, StdUtils, TestBase { +// Note: IS_TEST() must return true. +// Note: Must have failure system, https://github.com/dapphub/ds-test/blob/cd98eff28324bfac652e63a239a60632a761790b/src/test.sol#L39-L76. +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/Vm.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/Vm.sol new file mode 100644 index 000000000..e48ebaa53 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/Vm.sol @@ -0,0 +1,490 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +// Cheatcodes are marked as view/pure/none using the following rules: +// 0. A call's observable behaviour includes its return value, logs, reverts and state writes, +// 1. If you can influence a later call's observable behaviour, you're neither `view` nor `pure (you are modifying some state be it the EVM, interpreter, filesystem, etc), +// 2. Otherwise if you can be influenced by an earlier call, or if reading some state, you're `view`, +// 3. Otherwise you're `pure`. + +interface VmSafe { + struct Log { + bytes32[] topics; + bytes data; + address emitter; + } + + struct Rpc { + string key; + string url; + } + + struct DirEntry { + string errorMessage; + string path; + uint64 depth; + bool isDir; + bool isSymlink; + } + + struct FsMetadata { + bool isDir; + bool isSymlink; + uint256 length; + bool readOnly; + uint256 modified; + uint256 accessed; + uint256 created; + } + + // Loads a storage slot from an address + function load(address target, bytes32 slot) external view returns (bytes32 data); + // Signs data + function sign(uint256 privateKey, bytes32 digest) external pure returns (uint8 v, bytes32 r, bytes32 s); + // Gets the address for a given private key + function addr(uint256 privateKey) external pure returns (address keyAddr); + // Gets the nonce of an account + function getNonce(address account) external view returns (uint64 nonce); + // Performs a foreign function call via the terminal + function ffi(string[] calldata commandInput) external returns (bytes memory result); + // Sets environment variables + function setEnv(string calldata name, string calldata value) external; + // Reads environment variables, (name) => (value) + function envBool(string calldata name) external view returns (bool value); + function envUint(string calldata name) external view returns (uint256 value); + function envInt(string calldata name) external view returns (int256 value); + function envAddress(string calldata name) external view returns (address value); + function envBytes32(string calldata name) external view returns (bytes32 value); + function envString(string calldata name) external view returns (string memory value); + function envBytes(string calldata name) external view returns (bytes memory value); + // Reads environment variables as arrays + function envBool(string calldata name, string calldata delim) external view returns (bool[] memory value); + function envUint(string calldata name, string calldata delim) external view returns (uint256[] memory value); + function envInt(string calldata name, string calldata delim) external view returns (int256[] memory value); + function envAddress(string calldata name, string calldata delim) external view returns (address[] memory value); + function envBytes32(string calldata name, string calldata delim) external view returns (bytes32[] memory value); + function envString(string calldata name, string calldata delim) external view returns (string[] memory value); + function envBytes(string calldata name, string calldata delim) external view returns (bytes[] memory value); + // Read environment variables with default value + function envOr(string calldata name, bool defaultValue) external returns (bool value); + function envOr(string calldata name, uint256 defaultValue) external returns (uint256 value); + function envOr(string calldata name, int256 defaultValue) external returns (int256 value); + function envOr(string calldata name, address defaultValue) external returns (address value); + function envOr(string calldata name, bytes32 defaultValue) external returns (bytes32 value); + function envOr(string calldata name, string calldata defaultValue) external returns (string memory value); + function envOr(string calldata name, bytes calldata defaultValue) external returns (bytes memory value); + // Read environment variables as arrays with default value + function envOr(string calldata name, string calldata delim, bool[] calldata defaultValue) + external + returns (bool[] memory value); + function envOr(string calldata name, string calldata delim, uint256[] calldata defaultValue) + external + returns (uint256[] memory value); + function envOr(string calldata name, string calldata delim, int256[] calldata defaultValue) + external + returns (int256[] memory value); + function envOr(string calldata name, string calldata delim, address[] calldata defaultValue) + external + returns (address[] memory value); + function envOr(string calldata name, string calldata delim, bytes32[] calldata defaultValue) + external + returns (bytes32[] memory value); + function envOr(string calldata name, string calldata delim, string[] calldata defaultValue) + external + returns (string[] memory value); + function envOr(string calldata name, string calldata delim, bytes[] calldata defaultValue) + external + returns (bytes[] memory value); + // Records all storage reads and writes + function record() external; + // Gets all accessed reads and write slot from a recording session, for a given address + function accesses(address target) external returns (bytes32[] memory readSlots, bytes32[] memory writeSlots); + // Gets the _creation_ bytecode from an artifact file. Takes in the relative path to the json file + function getCode(string calldata artifactPath) external view returns (bytes memory creationBytecode); + // Gets the _deployed_ bytecode from an artifact file. Takes in the relative path to the json file + function getDeployedCode(string calldata artifactPath) external view returns (bytes memory runtimeBytecode); + // Labels an address in call traces + function label(address account, string calldata newLabel) external; + // Using the address that calls the test contract, has the next call (at this call depth only) create a transaction that can later be signed and sent onchain + function broadcast() external; + // Has the next call (at this call depth only) create a transaction with the address provided as the sender that can later be signed and sent onchain + function broadcast(address signer) external; + // Has the next call (at this call depth only) create a transaction with the private key provided as the sender that can later be signed and sent onchain + function broadcast(uint256 privateKey) external; + // Using the address that calls the test contract, has all subsequent calls (at this call depth only) create transactions that can later be signed and sent onchain + function startBroadcast() external; + // Has all subsequent calls (at this call depth only) create transactions with the address provided that can later be signed and sent onchain + function startBroadcast(address signer) external; + // Has all subsequent calls (at this call depth only) create transactions with the private key provided that can later be signed and sent onchain + function startBroadcast(uint256 privateKey) external; + // Stops collecting onchain transactions + function stopBroadcast() external; + + // Get the path of the current project root. + function projectRoot() external view returns (string memory path); + // Reads the entire content of file to string. `path` is relative to the project root. + function readFile(string calldata path) external view returns (string memory data); + // Reads the entire content of file as binary. `path` is relative to the project root. + function readFileBinary(string calldata path) external view returns (bytes memory data); + // Reads next line of file to string. + function readLine(string calldata path) external view returns (string memory line); + // Writes data to file, creating a file if it does not exist, and entirely replacing its contents if it does. + // `path` is relative to the project root. + function writeFile(string calldata path, string calldata data) external; + // Writes binary data to a file, creating a file if it does not exist, and entirely replacing its contents if it does. + // `path` is relative to the project root. + function writeFileBinary(string calldata path, bytes calldata data) external; + // Writes line to file, creating a file if it does not exist. + // `path` is relative to the project root. + function writeLine(string calldata path, string calldata data) external; + // Closes file for reading, resetting the offset and allowing to read it from beginning with readLine. + // `path` is relative to the project root. + function closeFile(string calldata path) external; + // Removes a file from the filesystem. + // This cheatcode will revert in the following situations, but is not limited to just these cases: + // - `path` points to a directory. + // - The file doesn't exist. + // - The user lacks permissions to remove the file. + // `path` is relative to the project root. + function removeFile(string calldata path) external; + // Creates a new, empty directory at the provided path. + // This cheatcode will revert in the following situations, but is not limited to just these cases: + // - User lacks permissions to modify `path`. + // - A parent of the given path doesn't exist and `recursive` is false. + // - `path` already exists and `recursive` is false. + // `path` is relative to the project root. + function createDir(string calldata path, bool recursive) external; + // Removes a directory at the provided path. + // This cheatcode will revert in the following situations, but is not limited to just these cases: + // - `path` doesn't exist. + // - `path` isn't a directory. + // - User lacks permissions to modify `path`. + // - The directory is not empty and `recursive` is false. + // `path` is relative to the project root. + function removeDir(string calldata path, bool recursive) external; + // Reads the directory at the given path recursively, up to `max_depth`. + // `max_depth` defaults to 1, meaning only the direct children of the given directory will be returned. + // Follows symbolic links if `follow_links` is true. + function readDir(string calldata path) external view returns (DirEntry[] memory entries); + function readDir(string calldata path, uint64 maxDepth) external view returns (DirEntry[] memory entries); + function readDir(string calldata path, uint64 maxDepth, bool followLinks) + external + view + returns (DirEntry[] memory entries); + // Reads a symbolic link, returning the path that the link points to. + // This cheatcode will revert in the following situations, but is not limited to just these cases: + // - `path` is not a symbolic link. + // - `path` does not exist. + function readLink(string calldata linkPath) external view returns (string memory targetPath); + // Given a path, query the file system to get information about a file, directory, etc. + function fsMetadata(string calldata path) external view returns (FsMetadata memory metadata); + + // Convert values to a string + function toString(address value) external pure returns (string memory stringifiedValue); + function toString(bytes calldata value) external pure returns (string memory stringifiedValue); + function toString(bytes32 value) external pure returns (string memory stringifiedValue); + function toString(bool value) external pure returns (string memory stringifiedValue); + function toString(uint256 value) external pure returns (string memory stringifiedValue); + function toString(int256 value) external pure returns (string memory stringifiedValue); + // Convert values from a string + function parseBytes(string calldata stringifiedValue) external pure returns (bytes memory parsedValue); + function parseAddress(string calldata stringifiedValue) external pure returns (address parsedValue); + function parseUint(string calldata stringifiedValue) external pure returns (uint256 parsedValue); + function parseInt(string calldata stringifiedValue) external pure returns (int256 parsedValue); + function parseBytes32(string calldata stringifiedValue) external pure returns (bytes32 parsedValue); + function parseBool(string calldata stringifiedValue) external pure returns (bool parsedValue); + // Record all the transaction logs + function recordLogs() external; + // Gets all the recorded logs + function getRecordedLogs() external returns (Log[] memory logs); + // Derive a private key from a provided mnenomic string (or mnenomic file path) at the derivation path m/44'/60'/0'/0/{index} + function deriveKey(string calldata mnemonic, uint32 index) external pure returns (uint256 privateKey); + // Derive a private key from a provided mnenomic string (or mnenomic file path) at {derivationPath}{index} + function deriveKey(string calldata mnemonic, string calldata derivationPath, uint32 index) + external + pure + returns (uint256 privateKey); + // Adds a private key to the local forge wallet and returns the address + function rememberKey(uint256 privateKey) external returns (address keyAddr); + // + // parseJson + // + // ---- + // In case the returned value is a JSON object, it's encoded as a ABI-encoded tuple. As JSON objects + // don't have the notion of ordered, but tuples do, they JSON object is encoded with it's fields ordered in + // ALPHABETICAL order. That means that in order to successfully decode the tuple, we need to define a tuple that + // encodes the fields in the same order, which is alphabetical. In the case of Solidity structs, they are encoded + // as tuples, with the attributes in the order in which they are defined. + // For example: json = { 'a': 1, 'b': 0xa4tb......3xs} + // a: uint256 + // b: address + // To decode that json, we need to define a struct or a tuple as follows: + // struct json = { uint256 a; address b; } + // If we defined a json struct with the opposite order, meaning placing the address b first, it would try to + // decode the tuple in that order, and thus fail. + // ---- + // Given a string of JSON, return it as ABI-encoded + function parseJson(string calldata json, string calldata key) external pure returns (bytes memory abiEncodedData); + function parseJson(string calldata json) external pure returns (bytes memory abiEncodedData); + + // The following parseJson cheatcodes will do type coercion, for the type that they indicate. + // For example, parseJsonUint will coerce all values to a uint256. That includes stringified numbers '12' + // and hex numbers '0xEF'. + // Type coercion works ONLY for discrete values or arrays. That means that the key must return a value or array, not + // a JSON object. + function parseJsonUint(string calldata, string calldata) external returns (uint256); + function parseJsonUintArray(string calldata, string calldata) external returns (uint256[] memory); + function parseJsonInt(string calldata, string calldata) external returns (int256); + function parseJsonIntArray(string calldata, string calldata) external returns (int256[] memory); + function parseJsonBool(string calldata, string calldata) external returns (bool); + function parseJsonBoolArray(string calldata, string calldata) external returns (bool[] memory); + function parseJsonAddress(string calldata, string calldata) external returns (address); + function parseJsonAddressArray(string calldata, string calldata) external returns (address[] memory); + function parseJsonString(string calldata, string calldata) external returns (string memory); + function parseJsonStringArray(string calldata, string calldata) external returns (string[] memory); + function parseJsonBytes(string calldata, string calldata) external returns (bytes memory); + function parseJsonBytesArray(string calldata, string calldata) external returns (bytes[] memory); + function parseJsonBytes32(string calldata, string calldata) external returns (bytes32); + function parseJsonBytes32Array(string calldata, string calldata) external returns (bytes32[] memory); + + // Serialize a key and value to a JSON object stored in-memory that can be later written to a file + // It returns the stringified version of the specific JSON file up to that moment. + function serializeBool(string calldata objectKey, string calldata valueKey, bool value) + external + returns (string memory json); + function serializeUint(string calldata objectKey, string calldata valueKey, uint256 value) + external + returns (string memory json); + function serializeInt(string calldata objectKey, string calldata valueKey, int256 value) + external + returns (string memory json); + function serializeAddress(string calldata objectKey, string calldata valueKey, address value) + external + returns (string memory json); + function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32 value) + external + returns (string memory json); + function serializeString(string calldata objectKey, string calldata valueKey, string calldata value) + external + returns (string memory json); + function serializeBytes(string calldata objectKey, string calldata valueKey, bytes calldata value) + external + returns (string memory json); + + function serializeBool(string calldata objectKey, string calldata valueKey, bool[] calldata values) + external + returns (string memory json); + function serializeUint(string calldata objectKey, string calldata valueKey, uint256[] calldata values) + external + returns (string memory json); + function serializeInt(string calldata objectKey, string calldata valueKey, int256[] calldata values) + external + returns (string memory json); + function serializeAddress(string calldata objectKey, string calldata valueKey, address[] calldata values) + external + returns (string memory json); + function serializeBytes32(string calldata objectKey, string calldata valueKey, bytes32[] calldata values) + external + returns (string memory json); + function serializeString(string calldata objectKey, string calldata valueKey, string[] calldata values) + external + returns (string memory json); + function serializeBytes(string calldata objectKey, string calldata valueKey, bytes[] calldata values) + external + returns (string memory json); + + // + // writeJson + // + // ---- + // Write a serialized JSON object to a file. If the file exists, it will be overwritten. + // Let's assume we want to write the following JSON to a file: + // + // { "boolean": true, "number": 342, "object": { "title": "finally json serialization" } } + // + // ``` + // string memory json1 = "some key"; + // vm.serializeBool(json1, "boolean", true); + // vm.serializeBool(json1, "number", uint256(342)); + // json2 = "some other key"; + // string memory output = vm.serializeString(json2, "title", "finally json serialization"); + // string memory finalJson = vm.serialize(json1, "object", output); + // vm.writeJson(finalJson, "./output/example.json"); + // ``` + // The critical insight is that every invocation of serialization will return the stringified version of the JSON + // up to that point. That means we can construct arbitrary JSON objects and then use the return stringified version + // to serialize them as values to another JSON object. + // + // json1 and json2 are simply keys used by the backend to keep track of the objects. So vm.serializeJson(json1,..) + // will find the object in-memory that is keyed by "some key". + function writeJson(string calldata json, string calldata path) external; + // Write a serialized JSON object to an **existing** JSON file, replacing a value with key = + // This is useful to replace a specific value of a JSON file, without having to parse the entire thing + function writeJson(string calldata json, string calldata path, string calldata valueKey) external; + // Returns the RPC url for the given alias + function rpcUrl(string calldata rpcAlias) external view returns (string memory json); + // Returns all rpc urls and their aliases `[alias, url][]` + function rpcUrls() external view returns (string[2][] memory urls); + // Returns all rpc urls and their aliases as structs. + function rpcUrlStructs() external view returns (Rpc[] memory urls); + // If the condition is false, discard this run's fuzz inputs and generate new ones. + function assume(bool condition) external pure; + // Pauses gas metering (i.e. gas usage is not counted). Noop if already paused. + function pauseGasMetering() external; + // Resumes gas metering (i.e. gas usage is counted again). Noop if already on. + function resumeGasMetering() external; + // Writes a breakpoint to jump to in the debugger + function breakpoint(string calldata char) external; + // Writes a conditional breakpoint to jump to in the debugger + function breakpoint(string calldata char, bool value) external; +} + +interface Vm is VmSafe { + // Sets block.timestamp + function warp(uint256 newTimestamp) external; + // Sets block.height + function roll(uint256 newHeight) external; + // Sets block.basefee + function fee(uint256 newBasefee) external; + // Sets block.difficulty + function difficulty(uint256 newDifficulty) external; + // Sets block.chainid + function chainId(uint256 newChainId) external; + // Sets tx.gasprice + function txGasPrice(uint256 newGasPrice) external; + // Stores a value to an address' storage slot. + function store(address target, bytes32 slot, bytes32 value) external; + // Sets the nonce of an account; must be higher than the current nonce of the account + function setNonce(address account, uint64 newNonce) external; + // Sets the *next* call's msg.sender to be the input address + function prank(address msgSender) external; + // Sets all subsequent calls' msg.sender to be the input address until `stopPrank` is called + function startPrank(address msgSender) external; + // Sets the *next* call's msg.sender to be the input address, and the tx.origin to be the second input + function prank(address msgSender, address txOrigin) external; + // Sets all subsequent calls' msg.sender to be the input address until `stopPrank` is called, and the tx.origin to be the second input + function startPrank(address msgSender, address txOrigin) external; + // Resets subsequent calls' msg.sender to be `address(this)` + function stopPrank() external; + // Sets an address' balance + function deal(address account, uint256 newBalance) external; + // Sets an address' code + function etch(address target, bytes calldata newRuntimeBytecode) external; + // Expects an error on next call + function expectRevert(bytes calldata revertData) external; + function expectRevert(bytes4 revertData) external; + function expectRevert() external; + + // Prepare an expected log with all four checks enabled. + // Call this function, then emit an event, then call a function. Internally after the call, we check if + // logs were emitted in the expected order with the expected topics and data. + // Second form also checks supplied address against emitting contract. + function expectEmit() external; + function expectEmit(address emitter) external; + + // Prepare an expected log with (bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData). + // Call this function, then emit an event, then call a function. Internally after the call, we check if + // logs were emitted in the expected order with the expected topics and data (as specified by the booleans). + // Second form also checks supplied address against emitting contract. + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; + function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData, address emitter) + external; + + // Mocks a call to an address, returning specified data. + // Calldata can either be strict or a partial match, e.g. if you only + // pass a Solidity selector to the expected calldata, then the entire Solidity + // function will be mocked. + function mockCall(address callee, bytes calldata data, bytes calldata returnData) external; + // Mocks a call to an address with a specific msg.value, returning specified data. + // Calldata match takes precedence over msg.value in case of ambiguity. + function mockCall(address callee, uint256 msgValue, bytes calldata data, bytes calldata returnData) external; + // Reverts a call to an address with specified revert data. + function mockCallRevert(address callee, bytes calldata data, bytes calldata revertData) external; + // Reverts a call to an address with a specific msg.value, with specified revert data. + function mockCallRevert(address callee, uint256 msgValue, bytes calldata data, bytes calldata revertData) + external; + // Clears all mocked calls + function clearMockedCalls() external; + // Expects a call to an address with the specified calldata. + // Calldata can either be a strict or a partial match + function expectCall(address callee, bytes calldata data) external; + // Expects given number of calls to an address with the specified calldata. + function expectCall(address callee, bytes calldata data, uint64 count) external; + // Expects a call to an address with the specified msg.value and calldata + function expectCall(address callee, uint256 msgValue, bytes calldata data) external; + // Expects given number of calls to an address with the specified msg.value and calldata + function expectCall(address callee, uint256 msgValue, bytes calldata data, uint64 count) external; + // Expect a call to an address with the specified msg.value, gas, and calldata. + function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data) external; + // Expects given number of calls to an address with the specified msg.value, gas, and calldata. + function expectCall(address callee, uint256 msgValue, uint64 gas, bytes calldata data, uint64 count) external; + // Expect a call to an address with the specified msg.value and calldata, and a *minimum* amount of gas. + function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data) external; + // Expect given number of calls to an address with the specified msg.value and calldata, and a *minimum* amount of gas. + function expectCallMinGas(address callee, uint256 msgValue, uint64 minGas, bytes calldata data, uint64 count) + external; + // Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the current subcontext. If any other + // memory is written to, the test will fail. Can be called multiple times to add more ranges to the set. + function expectSafeMemory(uint64 min, uint64 max) external; + // Only allows memory writes to offsets [0x00, 0x60) ∪ [min, max) in the next created subcontext. + // If any other memory is written to, the test will fail. Can be called multiple times to add more ranges + // to the set. + function expectSafeMemoryCall(uint64 min, uint64 max) external; + // Sets block.coinbase + function coinbase(address newCoinbase) external; + // Snapshot the current state of the evm. + // Returns the id of the snapshot that was created. + // To revert a snapshot use `revertTo` + function snapshot() external returns (uint256 snapshotId); + // Revert the state of the EVM to a previous snapshot + // Takes the snapshot id to revert to. + // This deletes the snapshot and all snapshots taken after the given snapshot id. + function revertTo(uint256 snapshotId) external returns (bool success); + // Creates a new fork with the given endpoint and block and returns the identifier of the fork + function createFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); + // Creates a new fork with the given endpoint and the _latest_ block and returns the identifier of the fork + function createFork(string calldata urlOrAlias) external returns (uint256 forkId); + // Creates a new fork with the given endpoint and at the block the given transaction was mined in, replays all transaction mined in the block before the transaction, + // and returns the identifier of the fork + function createFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); + // Creates _and_ also selects a new fork with the given endpoint and block and returns the identifier of the fork + function createSelectFork(string calldata urlOrAlias, uint256 blockNumber) external returns (uint256 forkId); + // Creates _and_ also selects new fork with the given endpoint and at the block the given transaction was mined in, replays all transaction mined in the block before + // the transaction, returns the identifier of the fork + function createSelectFork(string calldata urlOrAlias, bytes32 txHash) external returns (uint256 forkId); + // Creates _and_ also selects a new fork with the given endpoint and the latest block and returns the identifier of the fork + function createSelectFork(string calldata urlOrAlias) external returns (uint256 forkId); + // Takes a fork identifier created by `createFork` and sets the corresponding forked state as active. + function selectFork(uint256 forkId) external; + /// Returns the identifier of the currently active fork. Reverts if no fork is currently active. + function activeFork() external view returns (uint256 forkId); + // Updates the currently active fork to given block number + // This is similar to `roll` but for the currently active fork + function rollFork(uint256 blockNumber) external; + // Updates the currently active fork to given transaction + // this will `rollFork` with the number of the block the transaction was mined in and replays all transaction mined before it in the block + function rollFork(bytes32 txHash) external; + // Updates the given fork to given block number + function rollFork(uint256 forkId, uint256 blockNumber) external; + // Updates the given fork to block number of the given transaction and replays all transaction mined before it in the block + function rollFork(uint256 forkId, bytes32 txHash) external; + // Marks that the account(s) should use persistent storage across fork swaps in a multifork setup + // Meaning, changes made to the state of this account will be kept when switching forks + function makePersistent(address account) external; + function makePersistent(address account0, address account1) external; + function makePersistent(address account0, address account1, address account2) external; + function makePersistent(address[] calldata accounts) external; + // Revokes persistent status from the address, previously added via `makePersistent` + function revokePersistent(address account) external; + function revokePersistent(address[] calldata accounts) external; + // Returns true if the account is marked as persistent + function isPersistent(address account) external view returns (bool persistent); + // In forking mode, explicitly grant the given address cheatcode access + function allowCheatcodes(address account) external; + // Fetches the given transaction from the active fork and executes it on the current state + function transact(bytes32 txHash) external; + // Fetches the given transaction from the given fork and executes it on the current state + function transact(uint256 forkId, bytes32 txHash) external; +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/console.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/console.sol new file mode 100644 index 000000000..ad57e5368 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/console.sol @@ -0,0 +1,1533 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +library console { + address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); + + function _sendLogPayload(bytes memory payload) private view { + uint256 payloadLength = payload.length; + address consoleAddress = CONSOLE_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + let payloadStart := add(payload, 32) + let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) + } + } + + function log() internal view { + _sendLogPayload(abi.encodeWithSignature("log()")); + } + + function logInt(int p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); + } + + function logUint(uint p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); + } + + function logString(string memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function logBool(bool p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function logAddress(address p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function logBytes(bytes memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); + } + + function logBytes1(bytes1 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); + } + + function logBytes2(bytes2 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); + } + + function logBytes3(bytes3 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); + } + + function logBytes4(bytes4 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); + } + + function logBytes5(bytes5 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); + } + + function logBytes6(bytes6 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); + } + + function logBytes7(bytes7 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); + } + + function logBytes8(bytes8 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); + } + + function logBytes9(bytes9 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); + } + + function logBytes10(bytes10 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); + } + + function logBytes11(bytes11 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); + } + + function logBytes12(bytes12 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); + } + + function logBytes13(bytes13 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); + } + + function logBytes14(bytes14 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); + } + + function logBytes15(bytes15 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); + } + + function logBytes16(bytes16 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); + } + + function logBytes17(bytes17 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); + } + + function logBytes18(bytes18 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); + } + + function logBytes19(bytes19 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); + } + + function logBytes20(bytes20 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); + } + + function logBytes21(bytes21 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); + } + + function logBytes22(bytes22 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); + } + + function logBytes23(bytes23 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); + } + + function logBytes24(bytes24 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); + } + + function logBytes25(bytes25 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); + } + + function logBytes26(bytes26 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); + } + + function logBytes27(bytes27 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); + } + + function logBytes28(bytes28 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); + } + + function logBytes29(bytes29 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); + } + + function logBytes30(bytes30 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); + } + + function logBytes31(bytes31 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); + } + + function logBytes32(bytes32 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); + } + + function log(uint p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); + } + + function log(string memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function log(bool p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function log(address p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function log(uint p0, uint p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); + } + + function log(uint p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); + } + + function log(uint p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); + } + + function log(uint p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); + } + + function log(string memory p0, uint p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); + } + + function log(string memory p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); + } + + function log(string memory p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); + } + + function log(string memory p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); + } + + function log(bool p0, uint p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); + } + + function log(bool p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); + } + + function log(bool p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); + } + + function log(bool p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); + } + + function log(address p0, uint p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); + } + + function log(address p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); + } + + function log(address p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); + } + + function log(address p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); + } + + function log(uint p0, uint p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); + } + + function log(uint p0, uint p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); + } + + function log(uint p0, uint p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); + } + + function log(uint p0, uint p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); + } + + function log(uint p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); + } + + function log(uint p0, bool p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); + } + + function log(uint p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); + } + + function log(uint p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); + } + + function log(uint p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); + } + + function log(uint p0, address p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); + } + + function log(uint p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); + } + + function log(uint p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); + } + + function log(uint p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); + } + + function log(string memory p0, uint p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); + } + + function log(string memory p0, address p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); + } + + function log(string memory p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); + } + + function log(string memory p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); + } + + function log(string memory p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); + } + + function log(bool p0, uint p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); + } + + function log(bool p0, uint p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); + } + + function log(bool p0, uint p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); + } + + function log(bool p0, uint p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); + } + + function log(bool p0, bool p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); + } + + function log(bool p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); + } + + function log(bool p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); + } + + function log(bool p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); + } + + function log(bool p0, address p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); + } + + function log(bool p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); + } + + function log(bool p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); + } + + function log(bool p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); + } + + function log(address p0, uint p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); + } + + function log(address p0, uint p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); + } + + function log(address p0, uint p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); + } + + function log(address p0, uint p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); + } + + function log(address p0, string memory p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); + } + + function log(address p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); + } + + function log(address p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); + } + + function log(address p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); + } + + function log(address p0, bool p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); + } + + function log(address p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); + } + + function log(address p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); + } + + function log(address p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); + } + + function log(address p0, address p1, uint p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); + } + + function log(address p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); + } + + function log(address p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); + } + + function log(address p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); + } + + function log(uint p0, uint p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, uint p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); + } + + function log(uint p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, uint p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); + } + +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/console2.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/console2.sol new file mode 100644 index 000000000..8596233d3 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/console2.sol @@ -0,0 +1,1546 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.4.22 <0.9.0; + +/// @dev The original console.sol uses `int` and `uint` for computing function selectors, but it should +/// use `int256` and `uint256`. This modified version fixes that. This version is recommended +/// over `console.sol` if you don't need compatibility with Hardhat as the logs will show up in +/// forge stack traces. If you do need compatibility with Hardhat, you must use `console.sol`. +/// Reference: https://github.com/NomicFoundation/hardhat/issues/2178 +library console2 { + address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); + + function _sendLogPayload(bytes memory payload) private view { + uint256 payloadLength = payload.length; + address consoleAddress = CONSOLE_ADDRESS; + /// @solidity memory-safe-assembly + assembly { + let payloadStart := add(payload, 32) + let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) + } + } + + function log() internal view { + _sendLogPayload(abi.encodeWithSignature("log()")); + } + + function logInt(int256 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); + } + + function logUint(uint256 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); + } + + function logString(string memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function logBool(bool p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function logAddress(address p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function logBytes(bytes memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); + } + + function logBytes1(bytes1 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); + } + + function logBytes2(bytes2 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); + } + + function logBytes3(bytes3 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); + } + + function logBytes4(bytes4 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); + } + + function logBytes5(bytes5 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); + } + + function logBytes6(bytes6 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); + } + + function logBytes7(bytes7 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); + } + + function logBytes8(bytes8 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); + } + + function logBytes9(bytes9 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); + } + + function logBytes10(bytes10 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); + } + + function logBytes11(bytes11 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); + } + + function logBytes12(bytes12 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); + } + + function logBytes13(bytes13 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); + } + + function logBytes14(bytes14 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); + } + + function logBytes15(bytes15 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); + } + + function logBytes16(bytes16 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); + } + + function logBytes17(bytes17 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); + } + + function logBytes18(bytes18 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); + } + + function logBytes19(bytes19 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); + } + + function logBytes20(bytes20 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); + } + + function logBytes21(bytes21 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); + } + + function logBytes22(bytes22 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); + } + + function logBytes23(bytes23 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); + } + + function logBytes24(bytes24 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); + } + + function logBytes25(bytes25 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); + } + + function logBytes26(bytes26 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); + } + + function logBytes27(bytes27 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); + } + + function logBytes28(bytes28 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); + } + + function logBytes29(bytes29 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); + } + + function logBytes30(bytes30 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); + } + + function logBytes31(bytes31 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); + } + + function logBytes32(bytes32 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); + } + + function log(uint256 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); + } + + function log(int256 p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); + } + + function log(string memory p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); + } + + function log(bool p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); + } + + function log(address p0) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); + } + + function log(uint256 p0, uint256 p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); + } + + function log(uint256 p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); + } + + function log(uint256 p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); + } + + function log(uint256 p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); + } + + function log(string memory p0, uint256 p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); + } + + function log(string memory p0, int256 p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,int256)", p0, p1)); + } + + function log(string memory p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); + } + + function log(string memory p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); + } + + function log(string memory p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); + } + + function log(bool p0, uint256 p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); + } + + function log(bool p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); + } + + function log(bool p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); + } + + function log(bool p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); + } + + function log(address p0, uint256 p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); + } + + function log(address p0, string memory p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); + } + + function log(address p0, bool p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); + } + + function log(address p0, address p1) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); + } + + function log(uint256 p0, uint256 p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); + } + + function log(uint256 p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); + } + + function log(uint256 p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); + } + + function log(uint256 p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); + } + + function log(string memory p0, uint256 p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); + } + + function log(string memory p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); + } + + function log(string memory p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); + } + + function log(string memory p0, address p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); + } + + function log(string memory p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); + } + + function log(string memory p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); + } + + function log(string memory p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); + } + + function log(bool p0, uint256 p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); + } + + function log(bool p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); + } + + function log(bool p0, bool p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); + } + + function log(bool p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); + } + + function log(bool p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); + } + + function log(bool p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); + } + + function log(bool p0, address p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); + } + + function log(bool p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); + } + + function log(bool p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); + } + + function log(bool p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); + } + + function log(address p0, uint256 p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); + } + + function log(address p0, string memory p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); + } + + function log(address p0, string memory p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); + } + + function log(address p0, string memory p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); + } + + function log(address p0, string memory p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); + } + + function log(address p0, bool p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); + } + + function log(address p0, bool p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); + } + + function log(address p0, bool p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); + } + + function log(address p0, bool p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); + } + + function log(address p0, address p1, uint256 p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); + } + + function log(address p0, address p1, string memory p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); + } + + function log(address p0, address p1, bool p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); + } + + function log(address p0, address p1, address p2) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, uint256 p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); + } + + function log(uint256 p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, uint256 p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); + } + + function log(string memory p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, uint256 p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); + } + + function log(bool p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, uint256 p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, string memory p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, bool p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, uint256 p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, string memory p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, bool p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, uint256 p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, string memory p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, bool p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); + } + + function log(address p0, address p1, address p2, address p3) internal view { + _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); + } + +} \ No newline at end of file diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC1155.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC1155.sol new file mode 100644 index 000000000..f7dd2b410 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC1155.sol @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC165.sol"; + +/// @title ERC-1155 Multi Token Standard +/// @dev See https://eips.ethereum.org/EIPS/eip-1155 +/// Note: The ERC-165 identifier for this interface is 0xd9b67a26. +interface IERC1155 is IERC165 { + /// @dev + /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). + /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). + /// - The `_from` argument MUST be the address of the holder whose balance is decreased. + /// - The `_to` argument MUST be the address of the recipient whose balance is increased. + /// - The `_id` argument MUST be the token type being transferred. + /// - The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by. + /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). + /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). + event TransferSingle( + address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value + ); + + /// @dev + /// - Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard). + /// - The `_operator` argument MUST be the address of an account/contract that is approved to make the transfer (SHOULD be msg.sender). + /// - The `_from` argument MUST be the address of the holder whose balance is decreased. + /// - The `_to` argument MUST be the address of the recipient whose balance is increased. + /// - The `_ids` argument MUST be the list of tokens being transferred. + /// - The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by. + /// - When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address). + /// - When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address). + event TransferBatch( + address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values + ); + + /// @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absence of an event assumes disabled). + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + /// @dev MUST emit when the URI is updated for a token ID. URIs are defined in RFC 3986. + /// The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema". + event URI(string _value, uint256 indexed _id); + + /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). + /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). + /// - MUST revert if `_to` is the zero address. + /// - MUST revert if balance of holder for token `_id` is lower than the `_value` sent. + /// - MUST revert on any other error. + /// - MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). + /// - After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). + /// @param _from Source address + /// @param _to Target address + /// @param _id ID of the token type + /// @param _value Transfer amount + /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` + function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external; + + /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). + /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). + /// - MUST revert if `_to` is the zero address. + /// - MUST revert if length of `_ids` is not the same as length of `_values`. + /// - MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. + /// - MUST revert on any other error. + /// - MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). + /// - Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). + /// - After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). + /// @param _from Source address + /// @param _to Target address + /// @param _ids IDs of each token type (order and length must match _values array) + /// @param _values Transfer amounts per token type (order and length must match _ids array) + /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` + function safeBatchTransferFrom( + address _from, + address _to, + uint256[] calldata _ids, + uint256[] calldata _values, + bytes calldata _data + ) external; + + /// @notice Get the balance of an account's tokens. + /// @param _owner The address of the token holder + /// @param _id ID of the token + /// @return The _owner's balance of the token type requested + function balanceOf(address _owner, uint256 _id) external view returns (uint256); + + /// @notice Get the balance of multiple account/token pairs + /// @param _owners The addresses of the token holders + /// @param _ids ID of the tokens + /// @return The _owner's balance of the token types requested (i.e. balance for each (owner, id) pair) + function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) + external + view + returns (uint256[] memory); + + /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. + /// @dev MUST emit the ApprovalForAll event on success. + /// @param _operator Address to add to the set of authorized operators + /// @param _approved True if the operator is approved, false to revoke approval + function setApprovalForAll(address _operator, bool _approved) external; + + /// @notice Queries the approval status of an operator for a given owner. + /// @param _owner The owner of the tokens + /// @param _operator Address of authorized operator + /// @return True if the operator is approved, false if not + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC165.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC165.sol new file mode 100644 index 000000000..9af4bf800 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC165.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +interface IERC165 { + /// @notice Query if a contract implements an interface + /// @param interfaceID The interface identifier, as specified in ERC-165 + /// @dev Interface identification is specified in ERC-165. This function + /// uses less than 30,000 gas. + /// @return `true` if the contract implements `interfaceID` and + /// `interfaceID` is not 0xffffffff, `false` otherwise + function supportsInterface(bytes4 interfaceID) external view returns (bool); +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC20.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC20.sol new file mode 100644 index 000000000..ba40806c3 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC20.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +/// @dev Interface of the ERC20 standard as defined in the EIP. +/// @dev This includes the optional name, symbol, and decimals metadata. +interface IERC20 { + /// @dev Emitted when `value` tokens are moved from one account (`from`) to another (`to`). + event Transfer(address indexed from, address indexed to, uint256 value); + + /// @dev Emitted when the allowance of a `spender` for an `owner` is set, where `value` + /// is the new allowance. + event Approval(address indexed owner, address indexed spender, uint256 value); + + /// @notice Returns the amount of tokens in existence. + function totalSupply() external view returns (uint256); + + /// @notice Returns the amount of tokens owned by `account`. + function balanceOf(address account) external view returns (uint256); + + /// @notice Moves `amount` tokens from the caller's account to `to`. + function transfer(address to, uint256 amount) external returns (bool); + + /// @notice Returns the remaining number of tokens that `spender` is allowed + /// to spend on behalf of `owner` + function allowance(address owner, address spender) external view returns (uint256); + + /// @notice Sets `amount` as the allowance of `spender` over the caller's tokens. + /// @dev Be aware of front-running risks: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + function approve(address spender, uint256 amount) external returns (bool); + + /// @notice Moves `amount` tokens from `from` to `to` using the allowance mechanism. + /// `amount` is then deducted from the caller's allowance. + function transferFrom(address from, address to, uint256 amount) external returns (bool); + + /// @notice Returns the name of the token. + function name() external view returns (string memory); + + /// @notice Returns the symbol of the token. + function symbol() external view returns (string memory); + + /// @notice Returns the decimals places of the token. + function decimals() external view returns (uint8); +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC4626.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC4626.sol new file mode 100644 index 000000000..bfe3a1155 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC4626.sol @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC20.sol"; + +/// @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in +/// https://eips.ethereum.org/EIPS/eip-4626 +interface IERC4626 is IERC20 { + event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); + + event Withdraw( + address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares + ); + + /// @notice Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. + /// @dev + /// - MUST be an ERC-20 token contract. + /// - MUST NOT revert. + function asset() external view returns (address assetTokenAddress); + + /// @notice Returns the total amount of the underlying asset that is “managed” by Vault. + /// @dev + /// - SHOULD include any compounding that occurs from yield. + /// - MUST be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT revert. + function totalAssets() external view returns (uint256 totalManagedAssets); + + /// @notice Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal + /// scenario where all the conditions are met. + /// @dev + /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT show any variations depending on the caller. + /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + /// - MUST NOT revert. + /// + /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the + /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and + /// from. + function convertToShares(uint256 assets) external view returns (uint256 shares); + + /// @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal + /// scenario where all the conditions are met. + /// @dev + /// - MUST NOT be inclusive of any fees that are charged against assets in the Vault. + /// - MUST NOT show any variations depending on the caller. + /// - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. + /// - MUST NOT revert. + /// + /// NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the + /// “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and + /// from. + function convertToAssets(uint256 shares) external view returns (uint256 assets); + + /// @notice Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, + /// through a deposit call. + /// @dev + /// - MUST return a limited value if receiver is subject to some deposit limit. + /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. + /// - MUST NOT revert. + function maxDeposit(address receiver) external view returns (uint256 maxAssets); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given + /// current on-chain conditions. + /// @dev + /// - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit + /// call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called + /// in the same transaction. + /// - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the + /// deposit would be accepted, regardless if the user has enough tokens approved, etc. + /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by depositing. + function previewDeposit(uint256 assets) external view returns (uint256 shares); + + /// @notice Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. + /// @dev + /// - MUST emit the Deposit event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// deposit execution, and are accounted for during deposit. + /// - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not + /// approving enough underlying tokens to the Vault contract, etc). + /// + /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + function deposit(uint256 assets, address receiver) external returns (uint256 shares); + + /// @notice Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. + /// @dev + /// - MUST return a limited value if receiver is subject to some mint limit. + /// - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. + /// - MUST NOT revert. + function maxMint(address receiver) external view returns (uint256 maxShares); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given + /// current on-chain conditions. + /// @dev + /// - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call + /// in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the + /// same transaction. + /// - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint + /// would be accepted, regardless if the user has enough tokens approved, etc. + /// - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by minting. + function previewMint(uint256 shares) external view returns (uint256 assets); + + /// @notice Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. + /// @dev + /// - MUST emit the Deposit event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint + /// execution, and are accounted for during mint. + /// - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not + /// approving enough underlying tokens to the Vault contract, etc). + /// + /// NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. + function mint(uint256 shares, address receiver) external returns (uint256 assets); + + /// @notice Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the + /// Vault, through a withdraw call. + /// @dev + /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + /// - MUST NOT revert. + function maxWithdraw(address owner) external view returns (uint256 maxAssets); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, + /// given current on-chain conditions. + /// @dev + /// - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw + /// call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if + /// called + /// in the same transaction. + /// - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though + /// the withdrawal would be accepted, regardless if the user has enough shares, etc. + /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by depositing. + function previewWithdraw(uint256 assets) external view returns (uint256 shares); + + /// @notice Burns shares from owner and sends exactly assets of underlying tokens to receiver. + /// @dev + /// - MUST emit the Withdraw event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// withdraw execution, and are accounted for during withdraw. + /// - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner + /// not having enough shares, etc). + /// + /// Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + /// Those methods should be performed separately. + function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); + + /// @notice Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, + /// through a redeem call. + /// @dev + /// - MUST return a limited value if owner is subject to some withdrawal limit or timelock. + /// - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. + /// - MUST NOT revert. + function maxRedeem(address owner) external view returns (uint256 maxShares); + + /// @notice Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, + /// given current on-chain conditions. + /// @dev + /// - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call + /// in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the + /// same transaction. + /// - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the + /// redemption would be accepted, regardless if the user has enough shares, etc. + /// - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. + /// - MUST NOT revert. + /// + /// NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in + /// share price or some other type of condition, meaning the depositor will lose assets by redeeming. + function previewRedeem(uint256 shares) external view returns (uint256 assets); + + /// @notice Burns exactly shares from owner and sends assets of underlying tokens to receiver. + /// @dev + /// - MUST emit the Withdraw event. + /// - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the + /// redeem execution, and are accounted for during redeem. + /// - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner + /// not having enough shares, etc). + /// + /// NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. + /// Those methods should be performed separately. + function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC721.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC721.sol new file mode 100644 index 000000000..0a16f45cc --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IERC721.sol @@ -0,0 +1,164 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2; + +import "./IERC165.sol"; + +/// @title ERC-721 Non-Fungible Token Standard +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x80ac58cd. +interface IERC721 is IERC165 { + /// @dev This emits when ownership of any NFT changes by any mechanism. + /// This event emits when NFTs are created (`from` == 0) and destroyed + /// (`to` == 0). Exception: during contract creation, any number of NFTs + /// may be created and assigned without emitting Transfer. At the time of + /// any transfer, the approved address for that NFT (if any) is reset to none. + event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); + + /// @dev This emits when the approved address for an NFT is changed or + /// reaffirmed. The zero address indicates there is no approved address. + /// When a Transfer event emits, this also indicates that the approved + /// address for that NFT (if any) is reset to none. + event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); + + /// @dev This emits when an operator is enabled or disabled for an owner. + /// The operator can manage all NFTs of the owner. + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); + + /// @notice Count all NFTs assigned to an owner + /// @dev NFTs assigned to the zero address are considered invalid, and this + /// function throws for queries about the zero address. + /// @param _owner An address for whom to query the balance + /// @return The number of NFTs owned by `_owner`, possibly zero + function balanceOf(address _owner) external view returns (uint256); + + /// @notice Find the owner of an NFT + /// @dev NFTs assigned to zero address are considered invalid, and queries + /// about them do throw. + /// @param _tokenId The identifier for an NFT + /// @return The address of the owner of the NFT + function ownerOf(uint256 _tokenId) external view returns (address); + + /// @notice Transfers the ownership of an NFT from one address to another address + /// @dev Throws unless `msg.sender` is the current owner, an authorized + /// operator, or the approved address for this NFT. Throws if `_from` is + /// not the current owner. Throws if `_to` is the zero address. Throws if + /// `_tokenId` is not a valid NFT. When transfer is complete, this function + /// checks if `_to` is a smart contract (code size > 0). If so, it calls + /// `onERC721Received` on `_to` and throws if the return value is not + /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + /// @param data Additional data with no specified format, sent in call to `_to` + function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable; + + /// @notice Transfers the ownership of an NFT from one address to another address + /// @dev This works identically to the other function with an extra data parameter, + /// except this function just sets data to "". + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; + + /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE + /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE + /// THEY MAY BE PERMANENTLY LOST + /// @dev Throws unless `msg.sender` is the current owner, an authorized + /// operator, or the approved address for this NFT. Throws if `_from` is + /// not the current owner. Throws if `_to` is the zero address. Throws if + /// `_tokenId` is not a valid NFT. + /// @param _from The current owner of the NFT + /// @param _to The new owner + /// @param _tokenId The NFT to transfer + function transferFrom(address _from, address _to, uint256 _tokenId) external payable; + + /// @notice Change or reaffirm the approved address for an NFT + /// @dev The zero address indicates there is no approved address. + /// Throws unless `msg.sender` is the current NFT owner, or an authorized + /// operator of the current owner. + /// @param _approved The new approved NFT controller + /// @param _tokenId The NFT to approve + function approve(address _approved, uint256 _tokenId) external payable; + + /// @notice Enable or disable approval for a third party ("operator") to manage + /// all of `msg.sender`'s assets + /// @dev Emits the ApprovalForAll event. The contract MUST allow + /// multiple operators per owner. + /// @param _operator Address to add to the set of authorized operators + /// @param _approved True if the operator is approved, false to revoke approval + function setApprovalForAll(address _operator, bool _approved) external; + + /// @notice Get the approved address for a single NFT + /// @dev Throws if `_tokenId` is not a valid NFT. + /// @param _tokenId The NFT to find the approved address for + /// @return The approved address for this NFT, or the zero address if there is none + function getApproved(uint256 _tokenId) external view returns (address); + + /// @notice Query if an address is an authorized operator for another address + /// @param _owner The address that owns the NFTs + /// @param _operator The address that acts on behalf of the owner + /// @return True if `_operator` is an approved operator for `_owner`, false otherwise + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +} + +/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. +interface IERC721TokenReceiver { + /// @notice Handle the receipt of an NFT + /// @dev The ERC721 smart contract calls this function on the recipient + /// after a `transfer`. This function MAY throw to revert and reject the + /// transfer. Return of other than the magic value MUST result in the + /// transaction being reverted. + /// Note: the contract address is always the message sender. + /// @param _operator The address which called `safeTransferFrom` function + /// @param _from The address which previously owned the token + /// @param _tokenId The NFT identifier which is being transferred + /// @param _data Additional data with no specified format + /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` + /// unless throwing + function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) + external + returns (bytes4); +} + +/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x5b5e139f. +interface IERC721Metadata is IERC721 { + /// @notice A descriptive name for a collection of NFTs in this contract + function name() external view returns (string memory _name); + + /// @notice An abbreviated name for NFTs in this contract + function symbol() external view returns (string memory _symbol); + + /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. + /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC + /// 3986. The URI may point to a JSON file that conforms to the "ERC721 + /// Metadata JSON Schema". + function tokenURI(uint256 _tokenId) external view returns (string memory); +} + +/// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension +/// @dev See https://eips.ethereum.org/EIPS/eip-721 +/// Note: the ERC-165 identifier for this interface is 0x780e9d63. +interface IERC721Enumerable is IERC721 { + /// @notice Count NFTs tracked by this contract + /// @return A count of valid NFTs tracked by this contract, where each one of + /// them has an assigned and queryable owner not equal to the zero address + function totalSupply() external view returns (uint256); + + /// @notice Enumerate valid NFTs + /// @dev Throws if `_index` >= `totalSupply()`. + /// @param _index A counter less than `totalSupply()` + /// @return The token identifier for the `_index`th NFT, + /// (sort order not specified) + function tokenByIndex(uint256 _index) external view returns (uint256); + + /// @notice Enumerate NFTs assigned to an owner + /// @dev Throws if `_index` >= `balanceOf(_owner)` or if + /// `_owner` is the zero address, representing invalid NFTs. + /// @param _owner An address where we are interested in NFTs owned by them + /// @param _index A counter less than `balanceOf(_owner)` + /// @return The token identifier for the `_index`th NFT assigned to `_owner`, + /// (sort order not specified) + function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IMulticall3.sol b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IMulticall3.sol new file mode 100644 index 000000000..0d031b71d --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/src/interfaces/IMulticall3.sol @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +interface IMulticall3 { + struct Call { + address target; + bytes callData; + } + + struct Call3 { + address target; + bool allowFailure; + bytes callData; + } + + struct Call3Value { + address target; + bool allowFailure; + uint256 value; + bytes callData; + } + + struct Result { + bool success; + bytes returnData; + } + + function aggregate(Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes[] memory returnData); + + function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData); + + function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData); + + function blockAndAggregate(Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); + + function getBasefee() external view returns (uint256 basefee); + + function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash); + + function getBlockNumber() external view returns (uint256 blockNumber); + + function getChainId() external view returns (uint256 chainid); + + function getCurrentBlockCoinbase() external view returns (address coinbase); + + function getCurrentBlockDifficulty() external view returns (uint256 difficulty); + + function getCurrentBlockGasLimit() external view returns (uint256 gaslimit); + + function getCurrentBlockTimestamp() external view returns (uint256 timestamp); + + function getEthBalance(address addr) external view returns (uint256 balance); + + function getLastBlockHash() external view returns (bytes32 blockHash); + + function tryAggregate(bool requireSuccess, Call[] calldata calls) + external + payable + returns (Result[] memory returnData); + + function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) + external + payable + returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData); +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/StdAssertions.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/StdAssertions.t.sol new file mode 100644 index 000000000..fcc346be6 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/StdAssertions.t.sol @@ -0,0 +1,999 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdAssertionsTest is Test { + string constant CUSTOM_ERROR = "guh!"; + + bool constant EXPECT_PASS = false; + bool constant EXPECT_FAIL = true; + + bool constant SHOULD_REVERT = true; + bool constant SHOULD_RETURN = false; + + bool constant STRICT_REVERT_DATA = true; + bool constant NON_STRICT_REVERT_DATA = false; + + TestTest t = new TestTest(); + + /*////////////////////////////////////////////////////////////////////////// + FAIL(STRING) + //////////////////////////////////////////////////////////////////////////*/ + + function testShouldFail() external { + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._fail(CUSTOM_ERROR); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_FALSE + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertFalse_Pass() external { + t._assertFalse(false, EXPECT_PASS); + } + + function testAssertFalse_Fail() external { + vm.expectEmit(false, false, false, true); + emit log("Error: Assertion Failed"); + t._assertFalse(true, EXPECT_FAIL); + } + + function testAssertFalse_Err_Pass() external { + t._assertFalse(false, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertFalse_Err_Fail() external { + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertFalse(true, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ(BOOL) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEq_Bool_Pass(bool a) external { + t._assertEq(a, a, EXPECT_PASS); + } + + function testAssertEq_Bool_Fail(bool a, bool b) external { + vm.assume(a != b); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [bool]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_BoolErr_Pass(bool a) external { + t._assertEq(a, a, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertEq_BoolErr_Fail(bool a, bool b) external { + vm.assume(a != b); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ(BYTES) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEq_Bytes_Pass(bytes calldata a) external { + t._assertEq(a, a, EXPECT_PASS); + } + + function testAssertEq_Bytes_Fail(bytes calldata a, bytes calldata b) external { + vm.assume(keccak256(a) != keccak256(b)); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [bytes]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_BytesErr_Pass(bytes calldata a) external { + t._assertEq(a, a, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertEq_BytesErr_Fail(bytes calldata a, bytes calldata b) external { + vm.assume(keccak256(a) != keccak256(b)); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ(ARRAY) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEq_UintArr_Pass(uint256 e0, uint256 e1, uint256 e2) public { + uint256[] memory a = new uint256[](3); + a[0] = e0; + a[1] = e1; + a[2] = e2; + uint256[] memory b = new uint256[](3); + b[0] = e0; + b[1] = e1; + b[2] = e2; + + t._assertEq(a, b, EXPECT_PASS); + } + + function testAssertEq_IntArr_Pass(int256 e0, int256 e1, int256 e2) public { + int256[] memory a = new int256[](3); + a[0] = e0; + a[1] = e1; + a[2] = e2; + int256[] memory b = new int256[](3); + b[0] = e0; + b[1] = e1; + b[2] = e2; + + t._assertEq(a, b, EXPECT_PASS); + } + + function testAssertEq_AddressArr_Pass(address e0, address e1, address e2) public { + address[] memory a = new address[](3); + a[0] = e0; + a[1] = e1; + a[2] = e2; + address[] memory b = new address[](3); + b[0] = e0; + b[1] = e1; + b[2] = e2; + + t._assertEq(a, b, EXPECT_PASS); + } + + function testAssertEq_UintArr_FailEl(uint256 e1) public { + vm.assume(e1 != 0); + uint256[] memory a = new uint256[](3); + uint256[] memory b = new uint256[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [uint[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_IntArr_FailEl(int256 e1) public { + vm.assume(e1 != 0); + int256[] memory a = new int256[](3); + int256[] memory b = new int256[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [int[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_AddressArr_FailEl(address e1) public { + vm.assume(e1 != address(0)); + address[] memory a = new address[](3); + address[] memory b = new address[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [address[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_UintArrErr_FailEl(uint256 e1) public { + vm.assume(e1 != 0); + uint256[] memory a = new uint256[](3); + uint256[] memory b = new uint256[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [uint[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_IntArrErr_FailEl(int256 e1) public { + vm.assume(e1 != 0); + int256[] memory a = new int256[](3); + int256[] memory b = new int256[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [int[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_AddressArrErr_FailEl(address e1) public { + vm.assume(e1 != address(0)); + address[] memory a = new address[](3); + address[] memory b = new address[](3); + b[1] = e1; + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [address[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_UintArr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + uint256[] memory a = new uint256[](lenA); + uint256[] memory b = new uint256[](lenB); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [uint[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_IntArr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + int256[] memory a = new int256[](lenA); + int256[] memory b = new int256[](lenB); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [int[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_AddressArr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + address[] memory a = new address[](lenA); + address[] memory b = new address[](lenB); + + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [address[]]"); + t._assertEq(a, b, EXPECT_FAIL); + } + + function testAssertEq_UintArrErr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + uint256[] memory a = new uint256[](lenA); + uint256[] memory b = new uint256[](lenB); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [uint[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_IntArrErr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + int256[] memory a = new int256[](lenA); + int256[] memory b = new int256[](lenB); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [int[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + function testAssertEq_AddressArrErr_FailLen(uint256 lenA, uint256 lenB) public { + vm.assume(lenA != lenB); + vm.assume(lenA <= 10000); + vm.assume(lenB <= 10000); + address[] memory a = new address[](lenA); + address[] memory b = new address[](lenB); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + vm.expectEmit(false, false, false, true); + emit log("Error: a == b not satisfied [address[]]"); + t._assertEq(a, b, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEqUint() public { + assertEqUint(uint8(1), uint128(1)); + assertEqUint(uint64(2), uint64(2)); + } + + function testFailAssertEqUint() public { + assertEqUint(uint64(1), uint96(2)); + assertEqUint(uint160(3), uint160(4)); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_ABS(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqAbs_Uint_Pass(uint256 a, uint256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbs(a, b, maxDelta, EXPECT_PASS); + } + + function testAssertApproxEqAbs_Uint_Fail(uint256 a, uint256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [uint]"); + t._assertApproxEqAbs(a, b, maxDelta, EXPECT_FAIL); + } + + function testAssertApproxEqAbs_UintErr_Pass(uint256 a, uint256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqAbs_UintErr_Fail(uint256 a, uint256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_ABS_DECIMAL(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqAbsDecimal_Uint_Pass(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_PASS); + } + + function testAssertApproxEqAbsDecimal_Uint_Fail(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [uint]"); + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_FAIL); + } + + function testAssertApproxEqAbsDecimal_UintErr_Pass(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqAbsDecimal_UintErr_Fail(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_ABS(INT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqAbs_Int_Pass(int256 a, int256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbs(a, b, maxDelta, EXPECT_PASS); + } + + function testAssertApproxEqAbs_Int_Fail(int256 a, int256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [int]"); + t._assertApproxEqAbs(a, b, maxDelta, EXPECT_FAIL); + } + + function testAssertApproxEqAbs_IntErr_Pass(int256 a, int256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqAbs_IntErr_Fail(int256 a, int256 b, uint256 maxDelta) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqAbs(a, b, maxDelta, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_ABS_DECIMAL(INT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqAbsDecimal_Int_Pass(int256 a, int256 b, uint256 maxDelta, uint256 decimals) external { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_PASS); + } + + function testAssertApproxEqAbsDecimal_Int_Fail(int256 a, int256 b, uint256 maxDelta, uint256 decimals) external { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [int]"); + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, EXPECT_FAIL); + } + + function testAssertApproxEqAbsDecimal_IntErr_Pass(int256 a, int256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) <= maxDelta); + + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqAbsDecimal_IntErr_Fail(int256 a, int256 b, uint256 maxDelta, uint256 decimals) + external + { + vm.assume(stdMath.delta(a, b) > maxDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqAbsDecimal(a, b, maxDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_REL(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqRel_Uint_Pass(uint256 a, uint256 b, uint256 maxPercentDelta) external { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_PASS); + } + + function testAssertApproxEqRel_Uint_Fail(uint256 a, uint256 b, uint256 maxPercentDelta) external { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [uint]"); + t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_FAIL); + } + + function testAssertApproxEqRel_UintErr_Pass(uint256 a, uint256 b, uint256 maxPercentDelta) external { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqRel_UintErr_Fail(uint256 a, uint256 b, uint256 maxPercentDelta) external { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_REL_DECIMAL(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqRelDecimal_Uint_Pass(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) + external + { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_PASS); + } + + function testAssertApproxEqRelDecimal_Uint_Fail(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) + external + { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [uint]"); + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_FAIL); + } + + function testAssertApproxEqRelDecimal_UintErr_Pass(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) + external + { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqRelDecimal_UintErr_Fail(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals) + external + { + vm.assume(a < type(uint128).max && b < type(uint128).max && b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_REL(INT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqRel_Int_Pass(int128 a, int128 b, uint128 maxPercentDelta) external { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_PASS); + } + + function testAssertApproxEqRel_Int_Fail(int128 a, int128 b, uint128 maxPercentDelta) external { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [int]"); + t._assertApproxEqRel(a, b, maxPercentDelta, EXPECT_FAIL); + } + + function testAssertApproxEqRel_IntErr_Pass(int128 a, int128 b, uint128 maxPercentDelta) external { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqRel_IntErr_Fail(int128 a, int128 b, uint128 maxPercentDelta) external { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqRel(a, b, maxPercentDelta, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + APPROX_EQ_REL_DECIMAL(INT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertApproxEqRelDecimal_Int_Pass(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) + external + { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_PASS); + } + + function testAssertApproxEqRelDecimal_Int_Fail(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) + external + { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log("Error: a ~= b not satisfied [int]"); + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, EXPECT_FAIL); + } + + function testAssertApproxEqRelDecimal_IntErr_Pass(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) + external + { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) <= maxPercentDelta); + + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAssertApproxEqRelDecimal_IntErr_Fail(int128 a, int128 b, uint128 maxPercentDelta, uint128 decimals) + external + { + vm.assume(b != 0); + vm.assume(stdMath.percentDelta(a, b) > maxPercentDelta); + + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_EQ_CALL + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertEqCall_Return_Pass( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnData, + bool strictRevertData + ) external { + address targetA = address(new TestMockCall(returnData, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnData, SHOULD_RETURN)); + + t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_PASS); + } + + function testAssertEqCall_Return_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnDataA, + bytes memory returnDataB, + bool strictRevertData + ) external { + vm.assume(keccak256(returnDataA) != keccak256(returnDataB)); + + address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnDataB, SHOULD_RETURN)); + + vm.expectEmit(true, true, true, true); + emit log_named_string("Error", "Call return data does not match"); + t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_FAIL); + } + + function testAssertEqCall_Revert_Pass( + bytes memory callDataA, + bytes memory callDataB, + bytes memory revertDataA, + bytes memory revertDataB + ) external { + address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); + address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); + + t._assertEqCall(targetA, callDataA, targetB, callDataB, NON_STRICT_REVERT_DATA, EXPECT_PASS); + } + + function testAssertEqCall_Revert_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory revertDataA, + bytes memory revertDataB + ) external { + vm.assume(keccak256(revertDataA) != keccak256(revertDataB)); + + address targetA = address(new TestMockCall(revertDataA, SHOULD_REVERT)); + address targetB = address(new TestMockCall(revertDataB, SHOULD_REVERT)); + + vm.expectEmit(true, true, true, true); + emit log_named_string("Error", "Call revert data does not match"); + t._assertEqCall(targetA, callDataA, targetB, callDataB, STRICT_REVERT_DATA, EXPECT_FAIL); + } + + function testAssertEqCall_Fail( + bytes memory callDataA, + bytes memory callDataB, + bytes memory returnDataA, + bytes memory returnDataB, + bool strictRevertData + ) external { + address targetA = address(new TestMockCall(returnDataA, SHOULD_RETURN)); + address targetB = address(new TestMockCall(returnDataB, SHOULD_REVERT)); + + vm.expectEmit(true, true, true, true); + emit log_named_bytes(" Left call return data", returnDataA); + vm.expectEmit(true, true, true, true); + emit log_named_bytes(" Right call revert data", returnDataB); + t._assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData, EXPECT_FAIL); + + vm.expectEmit(true, true, true, true); + emit log_named_bytes(" Left call revert data", returnDataB); + vm.expectEmit(true, true, true, true); + emit log_named_bytes(" Right call return data", returnDataA); + t._assertEqCall(targetB, callDataB, targetA, callDataA, strictRevertData, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_NOT_EQ(BYTES) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertNotEq_Bytes_Pass(bytes32 a, bytes32 b) external { + vm.assume(a != b); + t._assertNotEq(a, b, EXPECT_PASS); + } + + function testAssertNotEq_Bytes_Fail(bytes32 a) external { + vm.expectEmit(false, false, false, true); + emit log("Error: a != b not satisfied [bytes32]"); + t._assertNotEq(a, a, EXPECT_FAIL); + } + + function testAssertNotEq_BytesErr_Pass(bytes32 a, bytes32 b) external { + vm.assume(a != b); + t._assertNotEq(a, b, CUSTOM_ERROR, EXPECT_PASS); + } + + function testAsserNottEq_BytesErr_Fail(bytes32 a) external { + vm.expectEmit(false, false, false, true); + emit log_named_string("Error", CUSTOM_ERROR); + t._assertNotEq(a, a, CUSTOM_ERROR, EXPECT_FAIL); + } + + /*////////////////////////////////////////////////////////////////////////// + ASSERT_NOT_EQ(UINT) + //////////////////////////////////////////////////////////////////////////*/ + + function testAssertNotEqUint() public { + assertNotEq(uint8(1), uint128(2)); + assertNotEq(uint64(3), uint64(4)); + } + + function testFailAssertNotEqUint() public { + assertNotEq(uint64(1), uint96(1)); + assertNotEq(uint160(2), uint160(2)); + } +} + +contract TestTest is Test { + modifier expectFailure(bool expectFail) { + bool preState = vm.load(HEVM_ADDRESS, bytes32("failed")) != bytes32(0x00); + _; + bool postState = vm.load(HEVM_ADDRESS, bytes32("failed")) != bytes32(0x00); + + if (preState == true) { + return; + } + + if (expectFail) { + require(postState == true, "expected failure not triggered"); + + // unwind the expected failure + vm.store(HEVM_ADDRESS, bytes32("failed"), bytes32(uint256(0x00))); + } else { + require(postState == false, "unexpected failure was triggered"); + } + } + + function _fail(string memory err) external expectFailure(true) { + fail(err); + } + + function _assertFalse(bool data, bool expectFail) external expectFailure(expectFail) { + assertFalse(data); + } + + function _assertFalse(bool data, string memory err, bool expectFail) external expectFailure(expectFail) { + assertFalse(data, err); + } + + function _assertEq(bool a, bool b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(bool a, bool b, string memory err, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b, err); + } + + function _assertEq(bytes memory a, bytes memory b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(bytes memory a, bytes memory b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertEq(a, b, err); + } + + function _assertEq(uint256[] memory a, uint256[] memory b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(int256[] memory a, int256[] memory b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(address[] memory a, address[] memory b, bool expectFail) external expectFailure(expectFail) { + assertEq(a, b); + } + + function _assertEq(uint256[] memory a, uint256[] memory b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertEq(a, b, err); + } + + function _assertEq(int256[] memory a, int256[] memory b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertEq(a, b, err); + } + + function _assertEq(address[] memory a, address[] memory b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertEq(a, b, err); + } + + function _assertNotEq(bytes32 a, bytes32 b, bool expectFail) external expectFailure(expectFail) { + assertNotEq32(a, b); + } + + function _assertNotEq(bytes32 a, bytes32 b, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertNotEq32(a, b, err); + } + + function _assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbs(a, b, maxDelta); + } + + function _assertApproxEqAbs(uint256 a, uint256 b, uint256 maxDelta, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbs(a, b, maxDelta, err); + } + + function _assertApproxEqAbsDecimal(uint256 a, uint256 b, uint256 maxDelta, uint256 decimals, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbsDecimal(a, b, maxDelta, decimals); + } + + function _assertApproxEqAbsDecimal( + uint256 a, + uint256 b, + uint256 maxDelta, + uint256 decimals, + string memory err, + bool expectFail + ) external expectFailure(expectFail) { + assertApproxEqAbsDecimal(a, b, maxDelta, decimals, err); + } + + function _assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbs(a, b, maxDelta); + } + + function _assertApproxEqAbs(int256 a, int256 b, uint256 maxDelta, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbs(a, b, maxDelta, err); + } + + function _assertApproxEqAbsDecimal(int256 a, int256 b, uint256 maxDelta, uint256 decimals, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqAbsDecimal(a, b, maxDelta, decimals); + } + + function _assertApproxEqAbsDecimal( + int256 a, + int256 b, + uint256 maxDelta, + uint256 decimals, + string memory err, + bool expectFail + ) external expectFailure(expectFail) { + assertApproxEqAbsDecimal(a, b, maxDelta, decimals, err); + } + + function _assertApproxEqRel(uint256 a, uint256 b, uint256 maxPercentDelta, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRel(a, b, maxPercentDelta); + } + + function _assertApproxEqRel(uint256 a, uint256 b, uint256 maxPercentDelta, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRel(a, b, maxPercentDelta, err); + } + + function _assertApproxEqRelDecimal(uint256 a, uint256 b, uint256 maxPercentDelta, uint256 decimals, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); + } + + function _assertApproxEqRelDecimal( + uint256 a, + uint256 b, + uint256 maxPercentDelta, + uint256 decimals, + string memory err, + bool expectFail + ) external expectFailure(expectFail) { + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, err); + } + + function _assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRel(a, b, maxPercentDelta); + } + + function _assertApproxEqRel(int256 a, int256 b, uint256 maxPercentDelta, string memory err, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRel(a, b, maxPercentDelta, err); + } + + function _assertApproxEqRelDecimal(int256 a, int256 b, uint256 maxPercentDelta, uint256 decimals, bool expectFail) + external + expectFailure(expectFail) + { + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals); + } + + function _assertApproxEqRelDecimal( + int256 a, + int256 b, + uint256 maxPercentDelta, + uint256 decimals, + string memory err, + bool expectFail + ) external expectFailure(expectFail) { + assertApproxEqRelDecimal(a, b, maxPercentDelta, decimals, err); + } + + function _assertEqCall( + address targetA, + bytes memory callDataA, + address targetB, + bytes memory callDataB, + bool strictRevertData, + bool expectFail + ) external expectFailure(expectFail) { + assertEqCall(targetA, callDataA, targetB, callDataB, strictRevertData); + } +} + +contract TestMockCall { + bytes returnData; + bool shouldRevert; + + constructor(bytes memory returnData_, bool shouldRevert_) { + returnData = returnData_; + shouldRevert = shouldRevert_; + } + + fallback() external payable { + bytes memory returnData_ = returnData; + + if (shouldRevert) { + assembly { + revert(add(returnData_, 0x20), mload(returnData_)) + } + } else { + assembly { + return(add(returnData_, 0x20), mload(returnData_)) + } + } + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/StdChains.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/StdChains.t.sol new file mode 100644 index 000000000..f0ede99c8 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/StdChains.t.sol @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdChainsTest is Test { + function testChainRpcInitialization() public { + // RPCs specified in `foundry.toml` should be updated. + assertEq(getChain(1).rpcUrl, "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3"); + assertEq(getChain("optimism_goerli").rpcUrl, "https://goerli.optimism.io/"); + assertEq(getChain("arbitrum_one_goerli").rpcUrl, "https://goerli-rollup.arbitrum.io/rpc/"); + + // Environment variables should be the next fallback + assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc"); + vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride"); + assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride"); + vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc"); + + // Cannot override RPCs defined in `foundry.toml` + vm.setEnv("MAINNET_RPC_URL", "myoverride2"); + assertEq(getChain("mainnet").rpcUrl, "https://mainnet.infura.io/v3/b1d3925804e74152b316ca7da97060d3"); + + // Other RPCs should remain unchanged. + assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545"); + assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001"); + } + + function testRpc(string memory rpcAlias) internal { + string memory rpcUrl = getChain(rpcAlias).rpcUrl; + vm.createSelectFork(rpcUrl); + } + + // Ensure we can connect to the default RPC URL for each chain. + // function testRpcs() public { + // testRpc("mainnet"); + // testRpc("goerli"); + // testRpc("sepolia"); + // testRpc("optimism"); + // testRpc("optimism_goerli"); + // testRpc("arbitrum_one"); + // testRpc("arbitrum_one_goerli"); + // testRpc("arbitrum_nova"); + // testRpc("polygon"); + // testRpc("polygon_mumbai"); + // testRpc("avalanche"); + // testRpc("avalanche_fuji"); + // testRpc("bnb_smart_chain"); + // testRpc("bnb_smart_chain_testnet"); + // testRpc("gnosis_chain"); + // } + + function testChainNoDefault() public { + vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found."); + getChain("does_not_exist"); + } + + function testSetChainFirstFails() public { + vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\"."); + setChain("anvil2", ChainData("Anvil", 31337, "URL")); + } + + function testChainBubbleUp() public { + setChain("needs_undefined_env_var", ChainData("", 123456789, "")); + vm.expectRevert( + "Failed to resolve env var `UNDEFINED_RPC_URL_PLACEHOLDER` in `${UNDEFINED_RPC_URL_PLACEHOLDER}`: environment variable not found" + ); + getChain("needs_undefined_env_var"); + } + + function testCannotSetChain_ChainIdExists() public { + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + + vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".'); + + setChain("another_custom_chain", ChainData("", 123456789, "")); + } + + function testSetChain() public { + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + Chain memory customChain = getChain("custom_chain"); + assertEq(customChain.name, "Custom Chain"); + assertEq(customChain.chainId, 123456789); + assertEq(customChain.chainAlias, "custom_chain"); + assertEq(customChain.rpcUrl, "https://custom.chain/"); + Chain memory chainById = getChain(123456789); + assertEq(chainById.name, customChain.name); + assertEq(chainById.chainId, customChain.chainId); + assertEq(chainById.chainAlias, customChain.chainAlias); + assertEq(chainById.rpcUrl, customChain.rpcUrl); + customChain.name = "Another Custom Chain"; + customChain.chainId = 987654321; + setChain("another_custom_chain", customChain); + Chain memory anotherCustomChain = getChain("another_custom_chain"); + assertEq(anotherCustomChain.name, "Another Custom Chain"); + assertEq(anotherCustomChain.chainId, 987654321); + assertEq(anotherCustomChain.chainAlias, "another_custom_chain"); + assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/"); + // Verify the first chain data was not overwritten + chainById = getChain(123456789); + assertEq(chainById.name, "Custom Chain"); + assertEq(chainById.chainId, 123456789); + } + + function testSetNoEmptyAlias() public { + vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string."); + setChain("", ChainData("", 123456789, "")); + } + + function testSetNoChainId0() public { + vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0."); + setChain("alias", ChainData("", 0, "")); + } + + function testGetNoChainId0() public { + vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0."); + getChain(0); + } + + function testGetNoEmptyAlias() public { + vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string."); + getChain(""); + } + + function testChainIdNotFound() public { + vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found."); + getChain("no_such_alias"); + } + + function testChainAliasNotFound() public { + vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found."); + getChain(321); + } + + function testSetChain_ExistingOne() public { + setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/")); + assertEq(getChain(123456789).chainId, 123456789); + + setChain("custom_chain", ChainData("Modified Chain", 999999999, "https://modified.chain/")); + vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found."); + getChain(123456789); + + Chain memory modifiedChain = getChain(999999999); + assertEq(modifiedChain.name, "Modified Chain"); + assertEq(modifiedChain.chainId, 999999999); + assertEq(modifiedChain.rpcUrl, "https://modified.chain/"); + } + + function testDontUseDefaultRpcUrl() public { + // Should error if default RPCs flag is set to false. + setFallbackToDefaultRpcUrls(false); + vm.expectRevert( + "Failed to get environment variable `ANVIL_RPC_URL` as type `string`: environment variable not found" + ); + getChain(31337); + vm.expectRevert( + "Failed to get environment variable `SEPOLIA_RPC_URL` as type `string`: environment variable not found" + ); + getChain("sepolia"); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/StdCheats.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/StdCheats.t.sol new file mode 100644 index 000000000..36091efa0 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/StdCheats.t.sol @@ -0,0 +1,418 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/StdCheats.sol"; +import "../src/Test.sol"; +import "../src/StdJson.sol"; + +contract StdCheatsTest is Test { + Bar test; + + using stdJson for string; + + function setUp() public { + test = new Bar(); + } + + function testSkip() public { + vm.warp(100); + skip(25); + assertEq(block.timestamp, 125); + } + + function testRewind() public { + vm.warp(100); + rewind(25); + assertEq(block.timestamp, 75); + } + + function testHoax() public { + hoax(address(1337)); + test.bar{value: 100}(address(1337)); + } + + function testHoaxOrigin() public { + hoax(address(1337), address(1337)); + test.origin{value: 100}(address(1337)); + } + + function testHoaxDifferentAddresses() public { + hoax(address(1337), address(7331)); + test.origin{value: 100}(address(1337), address(7331)); + } + + function testStartHoax() public { + startHoax(address(1337)); + test.bar{value: 100}(address(1337)); + test.bar{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } + + function testStartHoaxOrigin() public { + startHoax(address(1337), address(1337)); + test.origin{value: 100}(address(1337)); + test.origin{value: 100}(address(1337)); + vm.stopPrank(); + test.bar(address(this)); + } + + function testChangePrankMsgSender() public { + vm.startPrank(address(1337)); + test.bar(address(1337)); + changePrank(address(0xdead)); + test.bar(address(0xdead)); + changePrank(address(1337)); + test.bar(address(1337)); + vm.stopPrank(); + } + + function testChangePrankMsgSenderAndTxOrigin() public { + vm.startPrank(address(1337), address(1338)); + test.origin(address(1337), address(1338)); + changePrank(address(0xdead), address(0xbeef)); + test.origin(address(0xdead), address(0xbeef)); + changePrank(address(1337), address(1338)); + test.origin(address(1337), address(1338)); + vm.stopPrank(); + } + + function testMakeAccountEquivalence() public { + Account memory account = makeAccount("1337"); + (address addr, uint256 key) = makeAddrAndKey("1337"); + assertEq(account.addr, addr); + assertEq(account.key, key); + } + + function testMakeAddrEquivalence() public { + (address addr,) = makeAddrAndKey("1337"); + assertEq(makeAddr("1337"), addr); + } + + function testMakeAddrSigning() public { + (address addr, uint256 key) = makeAddrAndKey("1337"); + bytes32 hash = keccak256("some_message"); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(key, hash); + assertEq(ecrecover(hash, v, r, s), addr); + } + + function testDeal() public { + deal(address(this), 1 ether); + assertEq(address(this).balance, 1 ether); + } + + function testDealToken() public { + Bar barToken = new Bar(); + address bar = address(barToken); + deal(bar, address(this), 10000e18); + assertEq(barToken.balanceOf(address(this)), 10000e18); + } + + function testDealTokenAdjustTotalSupply() public { + Bar barToken = new Bar(); + address bar = address(barToken); + deal(bar, address(this), 10000e18, true); + assertEq(barToken.balanceOf(address(this)), 10000e18); + assertEq(barToken.totalSupply(), 20000e18); + deal(bar, address(this), 0, true); + assertEq(barToken.balanceOf(address(this)), 0); + assertEq(barToken.totalSupply(), 10000e18); + } + + function testDealERC1155Token() public { + BarERC1155 barToken = new BarERC1155(); + address bar = address(barToken); + dealERC1155(bar, address(this), 0, 10000e18, false); + assertEq(barToken.balanceOf(address(this), 0), 10000e18); + } + + function testDealERC1155TokenAdjustTotalSupply() public { + BarERC1155 barToken = new BarERC1155(); + address bar = address(barToken); + dealERC1155(bar, address(this), 0, 10000e18, true); + assertEq(barToken.balanceOf(address(this), 0), 10000e18); + assertEq(barToken.totalSupply(0), 20000e18); + dealERC1155(bar, address(this), 0, 0, true); + assertEq(barToken.balanceOf(address(this), 0), 0); + assertEq(barToken.totalSupply(0), 10000e18); + } + + function testDealERC721Token() public { + BarERC721 barToken = new BarERC721(); + address bar = address(barToken); + dealERC721(bar, address(2), 1); + assertEq(barToken.balanceOf(address(2)), 1); + assertEq(barToken.balanceOf(address(1)), 0); + dealERC721(bar, address(1), 2); + assertEq(barToken.balanceOf(address(1)), 1); + assertEq(barToken.balanceOf(bar), 1); + } + + function testDeployCode() public { + address deployed = deployCode("StdCheats.t.sol:Bar", bytes("")); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + } + + function testDeployCodeNoArgs() public { + address deployed = deployCode("StdCheats.t.sol:Bar"); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + } + + function testDeployCodeVal() public { + address deployed = deployCode("StdCheats.t.sol:Bar", bytes(""), 1 ether); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + assertEq(deployed.balance, 1 ether); + } + + function testDeployCodeValNoArgs() public { + address deployed = deployCode("StdCheats.t.sol:Bar", 1 ether); + assertEq(string(getCode(deployed)), string(getCode(address(test)))); + assertEq(deployed.balance, 1 ether); + } + + // We need this so we can call "this.deployCode" rather than "deployCode" directly + function deployCodeHelper(string memory what) external { + deployCode(what); + } + + function testDeployCodeFail() public { + vm.expectRevert(bytes("StdCheats deployCode(string): Deployment failed.")); + this.deployCodeHelper("StdCheats.t.sol:RevertingContract"); + } + + function getCode(address who) internal view returns (bytes memory o_code) { + /// @solidity memory-safe-assembly + assembly { + // retrieve the size of the code, this needs assembly + let size := extcodesize(who) + // allocate output byte array - this could also be done without assembly + // by using o_code = new bytes(size) + o_code := mload(0x40) + // new "memory end" including padding + mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) + // store length in memory + mstore(o_code, size) + // actually retrieve the code, this needs assembly + extcodecopy(who, add(o_code, 0x20), 0, size) + } + } + + function testDeriveRememberKey() public { + string memory mnemonic = "test test test test test test test test test test test junk"; + + (address deployer, uint256 privateKey) = deriveRememberKey(mnemonic, 0); + assertEq(deployer, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + assertEq(privateKey, 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80); + } + + function testBytesToUint() public { + assertEq(3, bytesToUint_test(hex"03")); + assertEq(2, bytesToUint_test(hex"02")); + assertEq(255, bytesToUint_test(hex"ff")); + assertEq(29625, bytesToUint_test(hex"73b9")); + } + + function testParseJsonTxDetail() public { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + string memory json = vm.readFile(path); + bytes memory transactionDetails = json.parseRaw(".transactions[0].tx"); + RawTx1559Detail memory rawTxDetail = abi.decode(transactionDetails, (RawTx1559Detail)); + Tx1559Detail memory txDetail = rawToConvertedEIP1559Detail(rawTxDetail); + assertEq(txDetail.from, 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + assertEq(txDetail.to, 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512); + assertEq( + txDetail.data, + hex"23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004" + ); + assertEq(txDetail.nonce, 3); + assertEq(txDetail.txType, 2); + assertEq(txDetail.gas, 29625); + assertEq(txDetail.value, 0); + } + + function testReadEIP1559Transaction() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + uint256 index = 0; + Tx1559 memory transaction = readTx1559(path, index); + transaction; + } + + function testReadEIP1559Transactions() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + Tx1559[] memory transactions = readTx1559s(path); + transactions; + } + + function testReadReceipt() public { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + uint256 index = 5; + Receipt memory receipt = readReceipt(path, index); + assertEq( + receipt.logsBloom, + hex"00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100" + ); + } + + function testReadReceipts() public view { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/test/fixtures/broadcast.log.json"); + Receipt[] memory receipts = readReceipts(path); + receipts; + } + + function testGasMeteringModifier() public { + uint256 gas_start_normal = gasleft(); + addInLoop(); + uint256 gas_used_normal = gas_start_normal - gasleft(); + + uint256 gas_start_single = gasleft(); + addInLoopNoGas(); + uint256 gas_used_single = gas_start_single - gasleft(); + + uint256 gas_start_double = gasleft(); + addInLoopNoGasNoGas(); + uint256 gas_used_double = gas_start_double - gasleft(); + + emit log_named_uint("Normal gas", gas_used_normal); + emit log_named_uint("Single modifier gas", gas_used_single); + emit log_named_uint("Double modifier gas", gas_used_double); + assertTrue(gas_used_double + gas_used_single < gas_used_normal); + } + + function addInLoop() internal pure returns (uint256) { + uint256 b; + for (uint256 i; i < 10000; i++) { + b += i; + } + return b; + } + + function addInLoopNoGas() internal noGasMetering returns (uint256) { + return addInLoop(); + } + + function addInLoopNoGasNoGas() internal noGasMetering returns (uint256) { + return addInLoopNoGas(); + } + + function bytesToUint_test(bytes memory b) private pure returns (uint256) { + uint256 number; + for (uint256 i = 0; i < b.length; i++) { + number = number + uint256(uint8(b[i])) * (2 ** (8 * (b.length - (i + 1)))); + } + return number; + } + + function testAssumeNoPrecompiles(address addr) external { + assumeNoPrecompiles(addr, getChain("optimism_goerli").chainId); + assertTrue( + addr < address(1) || (addr > address(9) && addr < address(0x4200000000000000000000000000000000000000)) + || addr > address(0x4200000000000000000000000000000000000800) + ); + } + + function testAssumePayable() external { + // all should revert since these addresses are not payable + + // VM address + vm.expectRevert(); + assumePayable(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D); + + // Console address + vm.expectRevert(); + assumePayable(0x000000000000000000636F6e736F6c652e6c6f67); + + // Create2Deployer + vm.expectRevert(); + assumePayable(0x4e59b44847b379578588920cA78FbF26c0B4956C); + } + + function testAssumePayable(address addr) external { + assumePayable(addr); + assertTrue( + addr != 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D && addr != 0x000000000000000000636F6e736F6c652e6c6f67 + && addr != 0x4e59b44847b379578588920cA78FbF26c0B4956C + ); + } +} + +contract Bar { + constructor() payable { + /// `DEAL` STDCHEAT + totalSupply = 10000e18; + balanceOf[address(this)] = totalSupply; + } + + /// `HOAX` and `CHANGEPRANK` STDCHEATS + function bar(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + } + + function origin(address expectedSender) public payable { + require(msg.sender == expectedSender, "!prank"); + require(tx.origin == expectedSender, "!prank"); + } + + function origin(address expectedSender, address expectedOrigin) public payable { + require(msg.sender == expectedSender, "!prank"); + require(tx.origin == expectedOrigin, "!prank"); + } + + /// `DEAL` STDCHEAT + mapping(address => uint256) public balanceOf; + uint256 public totalSupply; +} + +contract BarERC1155 { + constructor() payable { + /// `DEALERC1155` STDCHEAT + _totalSupply[0] = 10000e18; + _balances[0][address(this)] = _totalSupply[0]; + } + + function balanceOf(address account, uint256 id) public view virtual returns (uint256) { + return _balances[id][account]; + } + + function totalSupply(uint256 id) public view virtual returns (uint256) { + return _totalSupply[id]; + } + + /// `DEALERC1155` STDCHEAT + mapping(uint256 => mapping(address => uint256)) private _balances; + mapping(uint256 => uint256) private _totalSupply; +} + +contract BarERC721 { + constructor() payable { + /// `DEALERC721` STDCHEAT + _owners[1] = address(1); + _balances[address(1)] = 1; + _owners[2] = address(this); + _owners[3] = address(this); + _balances[address(this)] = 2; + } + + function balanceOf(address owner) public view virtual returns (uint256) { + return _balances[owner]; + } + + function ownerOf(uint256 tokenId) public view virtual returns (address) { + address owner = _owners[tokenId]; + return owner; + } + + mapping(uint256 => address) private _owners; + mapping(address => uint256) private _balances; +} + +contract RevertingContract { + constructor() { + revert(); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/StdError.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/StdError.t.sol new file mode 100644 index 000000000..ccd3eface --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/StdError.t.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import "../src/StdError.sol"; +import "../src/Test.sol"; + +contract StdErrorsTest is Test { + ErrorsTest test; + + function setUp() public { + test = new ErrorsTest(); + } + + function testExpectAssertion() public { + vm.expectRevert(stdError.assertionError); + test.assertionError(); + } + + function testExpectArithmetic() public { + vm.expectRevert(stdError.arithmeticError); + test.arithmeticError(10); + } + + function testExpectDiv() public { + vm.expectRevert(stdError.divisionError); + test.divError(0); + } + + function testExpectMod() public { + vm.expectRevert(stdError.divisionError); + test.modError(0); + } + + function testExpectEnum() public { + vm.expectRevert(stdError.enumConversionError); + test.enumConversion(1); + } + + function testExpectEncodeStg() public { + vm.expectRevert(stdError.encodeStorageError); + test.encodeStgError(); + } + + function testExpectPop() public { + vm.expectRevert(stdError.popError); + test.pop(); + } + + function testExpectOOB() public { + vm.expectRevert(stdError.indexOOBError); + test.indexOOBError(1); + } + + function testExpectMem() public { + vm.expectRevert(stdError.memOverflowError); + test.mem(); + } + + function testExpectIntern() public { + vm.expectRevert(stdError.zeroVarError); + test.intern(); + } +} + +contract ErrorsTest { + enum T {T1} + + uint256[] public someArr; + bytes someBytes; + + function assertionError() public pure { + assert(false); + } + + function arithmeticError(uint256 a) public pure { + a -= 100; + } + + function divError(uint256 a) public pure { + 100 / a; + } + + function modError(uint256 a) public pure { + 100 % a; + } + + function enumConversion(uint256 a) public pure { + T(a); + } + + function encodeStgError() public { + /// @solidity memory-safe-assembly + assembly { + sstore(someBytes.slot, 1) + } + keccak256(someBytes); + } + + function pop() public { + someArr.pop(); + } + + function indexOOBError(uint256 a) public pure { + uint256[] memory t = new uint256[](0); + t[a]; + } + + function mem() public pure { + uint256 l = 2 ** 256 / 32; + new uint256[](l); + } + + function intern() public returns (uint256) { + function(uint256) internal returns (uint256) x; + x(2); + return 7; + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/StdMath.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/StdMath.t.sol new file mode 100644 index 000000000..95037ea5d --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/StdMath.t.sol @@ -0,0 +1,197 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0 <0.9.0; + +import "../src/StdMath.sol"; +import "../src/Test.sol"; + +contract StdMathTest is Test { + function testGetAbs() external { + assertEq(stdMath.abs(-50), 50); + assertEq(stdMath.abs(50), 50); + assertEq(stdMath.abs(-1337), 1337); + assertEq(stdMath.abs(0), 0); + + assertEq(stdMath.abs(type(int256).min), (type(uint256).max >> 1) + 1); + assertEq(stdMath.abs(type(int256).max), (type(uint256).max >> 1)); + } + + function testGetAbs_Fuzz(int256 a) external { + uint256 manualAbs = getAbs(a); + + uint256 abs = stdMath.abs(a); + + assertEq(abs, manualAbs); + } + + function testGetDelta_Uint() external { + assertEq(stdMath.delta(uint256(0), uint256(0)), 0); + assertEq(stdMath.delta(uint256(0), uint256(1337)), 1337); + assertEq(stdMath.delta(uint256(0), type(uint64).max), type(uint64).max); + assertEq(stdMath.delta(uint256(0), type(uint128).max), type(uint128).max); + assertEq(stdMath.delta(uint256(0), type(uint256).max), type(uint256).max); + + assertEq(stdMath.delta(0, uint256(0)), 0); + assertEq(stdMath.delta(1337, uint256(0)), 1337); + assertEq(stdMath.delta(type(uint64).max, uint256(0)), type(uint64).max); + assertEq(stdMath.delta(type(uint128).max, uint256(0)), type(uint128).max); + assertEq(stdMath.delta(type(uint256).max, uint256(0)), type(uint256).max); + + assertEq(stdMath.delta(1337, uint256(1337)), 0); + assertEq(stdMath.delta(type(uint256).max, type(uint256).max), 0); + assertEq(stdMath.delta(5000, uint256(1250)), 3750); + } + + function testGetDelta_Uint_Fuzz(uint256 a, uint256 b) external { + uint256 manualDelta; + if (a > b) { + manualDelta = a - b; + } else { + manualDelta = b - a; + } + + uint256 delta = stdMath.delta(a, b); + + assertEq(delta, manualDelta); + } + + function testGetDelta_Int() external { + assertEq(stdMath.delta(int256(0), int256(0)), 0); + assertEq(stdMath.delta(int256(0), int256(1337)), 1337); + assertEq(stdMath.delta(int256(0), type(int64).max), type(uint64).max >> 1); + assertEq(stdMath.delta(int256(0), type(int128).max), type(uint128).max >> 1); + assertEq(stdMath.delta(int256(0), type(int256).max), type(uint256).max >> 1); + + assertEq(stdMath.delta(0, int256(0)), 0); + assertEq(stdMath.delta(1337, int256(0)), 1337); + assertEq(stdMath.delta(type(int64).max, int256(0)), type(uint64).max >> 1); + assertEq(stdMath.delta(type(int128).max, int256(0)), type(uint128).max >> 1); + assertEq(stdMath.delta(type(int256).max, int256(0)), type(uint256).max >> 1); + + assertEq(stdMath.delta(-0, int256(0)), 0); + assertEq(stdMath.delta(-1337, int256(0)), 1337); + assertEq(stdMath.delta(type(int64).min, int256(0)), (type(uint64).max >> 1) + 1); + assertEq(stdMath.delta(type(int128).min, int256(0)), (type(uint128).max >> 1) + 1); + assertEq(stdMath.delta(type(int256).min, int256(0)), (type(uint256).max >> 1) + 1); + + assertEq(stdMath.delta(int256(0), -0), 0); + assertEq(stdMath.delta(int256(0), -1337), 1337); + assertEq(stdMath.delta(int256(0), type(int64).min), (type(uint64).max >> 1) + 1); + assertEq(stdMath.delta(int256(0), type(int128).min), (type(uint128).max >> 1) + 1); + assertEq(stdMath.delta(int256(0), type(int256).min), (type(uint256).max >> 1) + 1); + + assertEq(stdMath.delta(1337, int256(1337)), 0); + assertEq(stdMath.delta(type(int256).max, type(int256).max), 0); + assertEq(stdMath.delta(type(int256).min, type(int256).min), 0); + assertEq(stdMath.delta(type(int256).min, type(int256).max), type(uint256).max); + assertEq(stdMath.delta(5000, int256(1250)), 3750); + } + + function testGetDelta_Int_Fuzz(int256 a, int256 b) external { + uint256 absA = getAbs(a); + uint256 absB = getAbs(b); + uint256 absDelta = absA > absB ? absA - absB : absB - absA; + + uint256 manualDelta; + if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { + manualDelta = absDelta; + } + // (a < 0 && b >= 0) || (a >= 0 && b < 0) + else { + manualDelta = absA + absB; + } + + uint256 delta = stdMath.delta(a, b); + + assertEq(delta, manualDelta); + } + + function testGetPercentDelta_Uint() external { + assertEq(stdMath.percentDelta(uint256(0), uint256(1337)), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint64).max), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint128).max), 1e18); + assertEq(stdMath.percentDelta(uint256(0), type(uint192).max), 1e18); + + assertEq(stdMath.percentDelta(1337, uint256(1337)), 0); + assertEq(stdMath.percentDelta(type(uint192).max, type(uint192).max), 0); + assertEq(stdMath.percentDelta(0, uint256(2500)), 1e18); + assertEq(stdMath.percentDelta(2500, uint256(2500)), 0); + assertEq(stdMath.percentDelta(5000, uint256(2500)), 1e18); + assertEq(stdMath.percentDelta(7500, uint256(2500)), 2e18); + + vm.expectRevert(stdError.divisionError); + stdMath.percentDelta(uint256(1), 0); + } + + function testGetPercentDelta_Uint_Fuzz(uint192 a, uint192 b) external { + vm.assume(b != 0); + uint256 manualDelta; + if (a > b) { + manualDelta = a - b; + } else { + manualDelta = b - a; + } + + uint256 manualPercentDelta = manualDelta * 1e18 / b; + uint256 percentDelta = stdMath.percentDelta(a, b); + + assertEq(percentDelta, manualPercentDelta); + } + + function testGetPercentDelta_Int() external { + assertEq(stdMath.percentDelta(int256(0), int256(1337)), 1e18); + assertEq(stdMath.percentDelta(int256(0), -1337), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int64).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int128).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int192).min), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int64).max), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int128).max), 1e18); + assertEq(stdMath.percentDelta(int256(0), type(int192).max), 1e18); + + assertEq(stdMath.percentDelta(1337, int256(1337)), 0); + assertEq(stdMath.percentDelta(type(int192).max, type(int192).max), 0); + assertEq(stdMath.percentDelta(type(int192).min, type(int192).min), 0); + + assertEq(stdMath.percentDelta(type(int192).min, type(int192).max), 2e18); // rounds the 1 wei diff down + assertEq(stdMath.percentDelta(type(int192).max, type(int192).min), 2e18 - 1); // rounds the 1 wei diff down + assertEq(stdMath.percentDelta(0, int256(2500)), 1e18); + assertEq(stdMath.percentDelta(2500, int256(2500)), 0); + assertEq(stdMath.percentDelta(5000, int256(2500)), 1e18); + assertEq(stdMath.percentDelta(7500, int256(2500)), 2e18); + + vm.expectRevert(stdError.divisionError); + stdMath.percentDelta(int256(1), 0); + } + + function testGetPercentDelta_Int_Fuzz(int192 a, int192 b) external { + vm.assume(b != 0); + uint256 absA = getAbs(a); + uint256 absB = getAbs(b); + uint256 absDelta = absA > absB ? absA - absB : absB - absA; + + uint256 manualDelta; + if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) { + manualDelta = absDelta; + } + // (a < 0 && b >= 0) || (a >= 0 && b < 0) + else { + manualDelta = absA + absB; + } + + uint256 manualPercentDelta = manualDelta * 1e18 / absB; + uint256 percentDelta = stdMath.percentDelta(a, b); + + assertEq(percentDelta, manualPercentDelta); + } + + /*////////////////////////////////////////////////////////////////////////// + HELPERS + //////////////////////////////////////////////////////////////////////////*/ + + function getAbs(int256 a) private pure returns (uint256) { + if (a < 0) { + return a == type(int256).min ? uint256(type(int256).max) + 1 : uint256(-a); + } + + return uint256(a); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/StdStorage.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/StdStorage.t.sol new file mode 100644 index 000000000..d4c563a04 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/StdStorage.t.sol @@ -0,0 +1,283 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/StdStorage.sol"; +import "../src/Test.sol"; + +contract StdStorageTest is Test { + using stdStorage for StdStorage; + + StorageTest internal test; + + function setUp() public { + test = new StorageTest(); + } + + function testStorageHidden() public { + assertEq(uint256(keccak256("my.random.var")), stdstore.target(address(test)).sig("hidden()").find()); + } + + function testStorageObvious() public { + assertEq(uint256(0), stdstore.target(address(test)).sig("exists()").find()); + } + + function testStorageCheckedWriteHidden() public { + stdstore.target(address(test)).sig(test.hidden.selector).checked_write(100); + assertEq(uint256(test.hidden()), 100); + } + + function testStorageCheckedWriteObvious() public { + stdstore.target(address(test)).sig(test.exists.selector).checked_write(100); + assertEq(test.exists(), 100); + } + + function testStorageMapStructA() public { + uint256 slot = + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).find(); + assertEq(uint256(keccak256(abi.encode(address(this), 4))), slot); + } + + function testStorageMapStructB() public { + uint256 slot = + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).find(); + assertEq(uint256(keccak256(abi.encode(address(this), 4))) + 1, slot); + } + + function testStorageDeepMap() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key( + address(this) + ).find(); + assertEq(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(5)))))), slot); + } + + function testStorageCheckedWriteDeepMap() public { + stdstore.target(address(test)).sig(test.deep_map.selector).with_key(address(this)).with_key(address(this)) + .checked_write(100); + assertEq(100, test.deep_map(address(this), address(this))); + } + + function testStorageDeepMapStructA() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) + .with_key(address(this)).depth(0).find(); + assertEq( + bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 0), + bytes32(slot) + ); + } + + function testStorageDeepMapStructB() public { + uint256 slot = stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)) + .with_key(address(this)).depth(1).find(); + assertEq( + bytes32(uint256(keccak256(abi.encode(address(this), keccak256(abi.encode(address(this), uint256(6)))))) + 1), + bytes32(slot) + ); + } + + function testStorageCheckedWriteDeepMapStructA() public { + stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( + address(this) + ).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); + assertEq(100, a); + assertEq(0, b); + } + + function testStorageCheckedWriteDeepMapStructB() public { + stdstore.target(address(test)).sig(test.deep_map_struct.selector).with_key(address(this)).with_key( + address(this) + ).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.deep_map_struct(address(this), address(this)); + assertEq(0, a); + assertEq(100, b); + } + + function testStorageCheckedWriteMapStructA() public { + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.map_struct(address(this)); + assertEq(a, 100); + assertEq(b, 0); + } + + function testStorageCheckedWriteMapStructB() public { + stdstore.target(address(test)).sig(test.map_struct.selector).with_key(address(this)).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.map_struct(address(this)); + assertEq(a, 0); + assertEq(b, 100); + } + + function testStorageStructA() public { + uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(0).find(); + assertEq(uint256(7), slot); + } + + function testStorageStructB() public { + uint256 slot = stdstore.target(address(test)).sig(test.basic.selector).depth(1).find(); + assertEq(uint256(7) + 1, slot); + } + + function testStorageCheckedWriteStructA() public { + stdstore.target(address(test)).sig(test.basic.selector).depth(0).checked_write(100); + (uint256 a, uint256 b) = test.basic(); + assertEq(a, 100); + assertEq(b, 1337); + } + + function testStorageCheckedWriteStructB() public { + stdstore.target(address(test)).sig(test.basic.selector).depth(1).checked_write(100); + (uint256 a, uint256 b) = test.basic(); + assertEq(a, 1337); + assertEq(b, 100); + } + + function testStorageMapAddrFound() public { + uint256 slot = stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).find(); + assertEq(uint256(keccak256(abi.encode(address(this), uint256(1)))), slot); + } + + function testStorageMapUintFound() public { + uint256 slot = stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).find(); + assertEq(uint256(keccak256(abi.encode(100, uint256(2)))), slot); + } + + function testStorageCheckedWriteMapUint() public { + stdstore.target(address(test)).sig(test.map_uint.selector).with_key(100).checked_write(100); + assertEq(100, test.map_uint(100)); + } + + function testStorageCheckedWriteMapAddr() public { + stdstore.target(address(test)).sig(test.map_addr.selector).with_key(address(this)).checked_write(100); + assertEq(100, test.map_addr(address(this))); + } + + function testStorageCheckedWriteMapBool() public { + stdstore.target(address(test)).sig(test.map_bool.selector).with_key(address(this)).checked_write(true); + assertTrue(test.map_bool(address(this))); + } + + function testFailStorageCheckedWriteMapPacked() public { + // expect PackedSlot error but not external call so cant expectRevert + stdstore.target(address(test)).sig(test.read_struct_lower.selector).with_key(address(uint160(1337))) + .checked_write(100); + } + + function testStorageCheckedWriteMapPackedSuccess() public { + uint256 full = test.map_packed(address(1337)); + // keep upper 128, set lower 128 to 1337 + full = (full & (uint256((1 << 128) - 1) << 128)) | 1337; + stdstore.target(address(test)).sig(test.map_packed.selector).with_key(address(uint160(1337))).checked_write( + full + ); + assertEq(1337, test.read_struct_lower(address(1337))); + } + + function testFailStorageConst() public { + // vm.expectRevert(abi.encodeWithSignature("NotStorage(bytes4)", bytes4(keccak256("const()")))); + stdstore.target(address(test)).sig("const()").find(); + } + + function testFailStorageNativePack() public { + stdstore.target(address(test)).sig(test.tA.selector).find(); + stdstore.target(address(test)).sig(test.tB.selector).find(); + + // these both would fail + stdstore.target(address(test)).sig(test.tC.selector).find(); + stdstore.target(address(test)).sig(test.tD.selector).find(); + } + + function testStorageReadBytes32() public { + bytes32 val = stdstore.target(address(test)).sig(test.tE.selector).read_bytes32(); + assertEq(val, hex"1337"); + } + + function testStorageReadBool_False() public { + bool val = stdstore.target(address(test)).sig(test.tB.selector).read_bool(); + assertEq(val, false); + } + + function testStorageReadBool_True() public { + bool val = stdstore.target(address(test)).sig(test.tH.selector).read_bool(); + assertEq(val, true); + } + + function testStorageReadBool_Revert() public { + vm.expectRevert("stdStorage read_bool(StdStorage): Cannot decode. Make sure you are reading a bool."); + this.readNonBoolValue(); + } + + function readNonBoolValue() public { + stdstore.target(address(test)).sig(test.tE.selector).read_bool(); + } + + function testStorageReadAddress() public { + address val = stdstore.target(address(test)).sig(test.tF.selector).read_address(); + assertEq(val, address(1337)); + } + + function testStorageReadUint() public { + uint256 val = stdstore.target(address(test)).sig(test.exists.selector).read_uint(); + assertEq(val, 1); + } + + function testStorageReadInt() public { + int256 val = stdstore.target(address(test)).sig(test.tG.selector).read_int(); + assertEq(val, type(int256).min); + } +} + +contract StorageTest { + uint256 public exists = 1; + mapping(address => uint256) public map_addr; + mapping(uint256 => uint256) public map_uint; + mapping(address => uint256) public map_packed; + mapping(address => UnpackedStruct) public map_struct; + mapping(address => mapping(address => uint256)) public deep_map; + mapping(address => mapping(address => UnpackedStruct)) public deep_map_struct; + UnpackedStruct public basic; + + uint248 public tA; + bool public tB; + + bool public tC = false; + uint248 public tD = 1; + + struct UnpackedStruct { + uint256 a; + uint256 b; + } + + mapping(address => bool) public map_bool; + + bytes32 public tE = hex"1337"; + address public tF = address(1337); + int256 public tG = type(int256).min; + bool public tH = true; + + constructor() { + basic = UnpackedStruct({a: 1337, b: 1337}); + + uint256 two = (1 << 128) | 1; + map_packed[msg.sender] = two; + map_packed[address(uint160(1337))] = 1 << 128; + } + + function read_struct_upper(address who) public view returns (uint256) { + return map_packed[who] >> 128; + } + + function read_struct_lower(address who) public view returns (uint256) { + return map_packed[who] & ((1 << 128) - 1); + } + + function hidden() public view returns (bytes32 t) { + bytes32 slot = keccak256("my.random.var"); + /// @solidity memory-safe-assembly + assembly { + t := sload(slot) + } + } + + function const() public pure returns (bytes32 t) { + t = bytes32(hex"1337"); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/StdStyle.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/StdStyle.t.sol new file mode 100644 index 000000000..e63ed68e3 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/StdStyle.t.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdStyleTest is Test { + function testStyleColor() public view { + console2.log(StdStyle.red("StdStyle.red String Test")); + console2.log(StdStyle.red(uint256(10e18))); + console2.log(StdStyle.red(int256(-10e18))); + console2.log(StdStyle.red(true)); + console2.log(StdStyle.red(address(0))); + console2.log(StdStyle.redBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.redBytes32("StdStyle.redBytes32")); + console2.log(StdStyle.green("StdStyle.green String Test")); + console2.log(StdStyle.green(uint256(10e18))); + console2.log(StdStyle.green(int256(-10e18))); + console2.log(StdStyle.green(true)); + console2.log(StdStyle.green(address(0))); + console2.log(StdStyle.greenBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.greenBytes32("StdStyle.greenBytes32")); + console2.log(StdStyle.yellow("StdStyle.yellow String Test")); + console2.log(StdStyle.yellow(uint256(10e18))); + console2.log(StdStyle.yellow(int256(-10e18))); + console2.log(StdStyle.yellow(true)); + console2.log(StdStyle.yellow(address(0))); + console2.log(StdStyle.yellowBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.yellowBytes32("StdStyle.yellowBytes32")); + console2.log(StdStyle.blue("StdStyle.blue String Test")); + console2.log(StdStyle.blue(uint256(10e18))); + console2.log(StdStyle.blue(int256(-10e18))); + console2.log(StdStyle.blue(true)); + console2.log(StdStyle.blue(address(0))); + console2.log(StdStyle.blueBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.blueBytes32("StdStyle.blueBytes32")); + console2.log(StdStyle.magenta("StdStyle.magenta String Test")); + console2.log(StdStyle.magenta(uint256(10e18))); + console2.log(StdStyle.magenta(int256(-10e18))); + console2.log(StdStyle.magenta(true)); + console2.log(StdStyle.magenta(address(0))); + console2.log(StdStyle.magentaBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.magentaBytes32("StdStyle.magentaBytes32")); + console2.log(StdStyle.cyan("StdStyle.cyan String Test")); + console2.log(StdStyle.cyan(uint256(10e18))); + console2.log(StdStyle.cyan(int256(-10e18))); + console2.log(StdStyle.cyan(true)); + console2.log(StdStyle.cyan(address(0))); + console2.log(StdStyle.cyanBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.cyanBytes32("StdStyle.cyanBytes32")); + } + + function testStyleFontWeight() public view { + console2.log(StdStyle.bold("StdStyle.bold String Test")); + console2.log(StdStyle.bold(uint256(10e18))); + console2.log(StdStyle.bold(int256(-10e18))); + console2.log(StdStyle.bold(address(0))); + console2.log(StdStyle.bold(true)); + console2.log(StdStyle.boldBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.boldBytes32("StdStyle.boldBytes32")); + console2.log(StdStyle.dim("StdStyle.dim String Test")); + console2.log(StdStyle.dim(uint256(10e18))); + console2.log(StdStyle.dim(int256(-10e18))); + console2.log(StdStyle.dim(address(0))); + console2.log(StdStyle.dim(true)); + console2.log(StdStyle.dimBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.dimBytes32("StdStyle.dimBytes32")); + console2.log(StdStyle.italic("StdStyle.italic String Test")); + console2.log(StdStyle.italic(uint256(10e18))); + console2.log(StdStyle.italic(int256(-10e18))); + console2.log(StdStyle.italic(address(0))); + console2.log(StdStyle.italic(true)); + console2.log(StdStyle.italicBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.italicBytes32("StdStyle.italicBytes32")); + console2.log(StdStyle.underline("StdStyle.underline String Test")); + console2.log(StdStyle.underline(uint256(10e18))); + console2.log(StdStyle.underline(int256(-10e18))); + console2.log(StdStyle.underline(address(0))); + console2.log(StdStyle.underline(true)); + console2.log(StdStyle.underlineBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.underlineBytes32("StdStyle.underlineBytes32")); + console2.log(StdStyle.inverse("StdStyle.inverse String Test")); + console2.log(StdStyle.inverse(uint256(10e18))); + console2.log(StdStyle.inverse(int256(-10e18))); + console2.log(StdStyle.inverse(address(0))); + console2.log(StdStyle.inverse(true)); + console2.log(StdStyle.inverseBytes(hex"7109709ECfa91a80626fF3989D68f67F5b1DD12D")); + console2.log(StdStyle.inverseBytes32("StdStyle.inverseBytes32")); + } + + function testStyleCombined() public view { + console2.log(StdStyle.red(StdStyle.bold("Red Bold String Test"))); + console2.log(StdStyle.green(StdStyle.dim(uint256(10e18)))); + console2.log(StdStyle.yellow(StdStyle.italic(int256(-10e18)))); + console2.log(StdStyle.blue(StdStyle.underline(address(0)))); + console2.log(StdStyle.magenta(StdStyle.inverse(true))); + } + + function testStyleCustom() public view { + console2.log(h1("Custom Style 1")); + console2.log(h2("Custom Style 2")); + } + + function h1(string memory a) private pure returns (string memory) { + return StdStyle.cyan(StdStyle.inverse(StdStyle.bold(a))); + } + + function h2(string memory a) private pure returns (string memory) { + return StdStyle.magenta(StdStyle.bold(StdStyle.underline(a))); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/StdUtils.t.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/StdUtils.t.sol new file mode 100644 index 000000000..a085b19e6 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/StdUtils.t.sol @@ -0,0 +1,297 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +import "../src/Test.sol"; + +contract StdUtilsMock is StdUtils { + // We deploy a mock version so we can properly test expected reverts. + function getTokenBalances_(address token, address[] memory addresses) + external + returns (uint256[] memory balances) + { + return getTokenBalances(token, addresses); + } +} + +contract StdUtilsTest is Test { + /*////////////////////////////////////////////////////////////////////////// + BOUND UINT + //////////////////////////////////////////////////////////////////////////*/ + + function testBound() public { + assertEq(bound(uint256(5), 0, 4), 0); + assertEq(bound(uint256(0), 69, 69), 69); + assertEq(bound(uint256(0), 68, 69), 68); + assertEq(bound(uint256(10), 150, 190), 174); + assertEq(bound(uint256(300), 2800, 3200), 3107); + assertEq(bound(uint256(9999), 1337, 6666), 4669); + } + + function testBound_WithinRange() public { + assertEq(bound(uint256(51), 50, 150), 51); + assertEq(bound(uint256(51), 50, 150), bound(bound(uint256(51), 50, 150), 50, 150)); + assertEq(bound(uint256(149), 50, 150), 149); + assertEq(bound(uint256(149), 50, 150), bound(bound(uint256(149), 50, 150), 50, 150)); + } + + function testBound_EdgeCoverage() public { + assertEq(bound(uint256(0), 50, 150), 50); + assertEq(bound(uint256(1), 50, 150), 51); + assertEq(bound(uint256(2), 50, 150), 52); + assertEq(bound(uint256(3), 50, 150), 53); + assertEq(bound(type(uint256).max, 50, 150), 150); + assertEq(bound(type(uint256).max - 1, 50, 150), 149); + assertEq(bound(type(uint256).max - 2, 50, 150), 148); + assertEq(bound(type(uint256).max - 3, 50, 150), 147); + } + + function testBound_DistributionIsEven(uint256 min, uint256 size) public { + size = size % 100 + 1; + min = bound(min, UINT256_MAX / 2, UINT256_MAX / 2 + size); + uint256 max = min + size - 1; + uint256 result; + + for (uint256 i = 1; i <= size * 4; ++i) { + // x > max + result = bound(max + i, min, max); + assertEq(result, min + (i - 1) % size); + // x < min + result = bound(min - i, min, max); + assertEq(result, max - (i - 1) % size); + } + } + + function testBound(uint256 num, uint256 min, uint256 max) public { + if (min > max) (min, max) = (max, min); + + uint256 result = bound(num, min, max); + + assertGe(result, min); + assertLe(result, max); + assertEq(result, bound(result, min, max)); + if (num >= min && num <= max) assertEq(result, num); + } + + function testBoundUint256Max() public { + assertEq(bound(0, type(uint256).max - 1, type(uint256).max), type(uint256).max - 1); + assertEq(bound(1, type(uint256).max - 1, type(uint256).max), type(uint256).max); + } + + function testCannotBoundMaxLessThanMin() public { + vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); + bound(uint256(5), 100, 10); + } + + function testCannotBoundMaxLessThanMin(uint256 num, uint256 min, uint256 max) public { + vm.assume(min > max); + vm.expectRevert(bytes("StdUtils bound(uint256,uint256,uint256): Max is less than min.")); + bound(num, min, max); + } + + /*////////////////////////////////////////////////////////////////////////// + BOUND INT + //////////////////////////////////////////////////////////////////////////*/ + + function testBoundInt() public { + assertEq(bound(-3, 0, 4), 2); + assertEq(bound(0, -69, -69), -69); + assertEq(bound(0, -69, -68), -68); + assertEq(bound(-10, 150, 190), 154); + assertEq(bound(-300, 2800, 3200), 2908); + assertEq(bound(9999, -1337, 6666), 1995); + } + + function testBoundInt_WithinRange() public { + assertEq(bound(51, -50, 150), 51); + assertEq(bound(51, -50, 150), bound(bound(51, -50, 150), -50, 150)); + assertEq(bound(149, -50, 150), 149); + assertEq(bound(149, -50, 150), bound(bound(149, -50, 150), -50, 150)); + } + + function testBoundInt_EdgeCoverage() public { + assertEq(bound(type(int256).min, -50, 150), -50); + assertEq(bound(type(int256).min + 1, -50, 150), -49); + assertEq(bound(type(int256).min + 2, -50, 150), -48); + assertEq(bound(type(int256).min + 3, -50, 150), -47); + assertEq(bound(type(int256).min, 10, 150), 10); + assertEq(bound(type(int256).min + 1, 10, 150), 11); + assertEq(bound(type(int256).min + 2, 10, 150), 12); + assertEq(bound(type(int256).min + 3, 10, 150), 13); + + assertEq(bound(type(int256).max, -50, 150), 150); + assertEq(bound(type(int256).max - 1, -50, 150), 149); + assertEq(bound(type(int256).max - 2, -50, 150), 148); + assertEq(bound(type(int256).max - 3, -50, 150), 147); + assertEq(bound(type(int256).max, -50, -10), -10); + assertEq(bound(type(int256).max - 1, -50, -10), -11); + assertEq(bound(type(int256).max - 2, -50, -10), -12); + assertEq(bound(type(int256).max - 3, -50, -10), -13); + } + + function testBoundInt_DistributionIsEven(int256 min, uint256 size) public { + size = size % 100 + 1; + min = bound(min, -int256(size / 2), int256(size - size / 2)); + int256 max = min + int256(size) - 1; + int256 result; + + for (uint256 i = 1; i <= size * 4; ++i) { + // x > max + result = bound(max + int256(i), min, max); + assertEq(result, min + int256((i - 1) % size)); + // x < min + result = bound(min - int256(i), min, max); + assertEq(result, max - int256((i - 1) % size)); + } + } + + function testBoundInt(int256 num, int256 min, int256 max) public { + if (min > max) (min, max) = (max, min); + + int256 result = bound(num, min, max); + + assertGe(result, min); + assertLe(result, max); + assertEq(result, bound(result, min, max)); + if (num >= min && num <= max) assertEq(result, num); + } + + function testBoundIntInt256Max() public { + assertEq(bound(0, type(int256).max - 1, type(int256).max), type(int256).max - 1); + assertEq(bound(1, type(int256).max - 1, type(int256).max), type(int256).max); + } + + function testBoundIntInt256Min() public { + assertEq(bound(0, type(int256).min, type(int256).min + 1), type(int256).min); + assertEq(bound(1, type(int256).min, type(int256).min + 1), type(int256).min + 1); + } + + function testCannotBoundIntMaxLessThanMin() public { + vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); + bound(-5, 100, 10); + } + + function testCannotBoundIntMaxLessThanMin(int256 num, int256 min, int256 max) public { + vm.assume(min > max); + vm.expectRevert(bytes("StdUtils bound(int256,int256,int256): Max is less than min.")); + bound(num, min, max); + } + + /*////////////////////////////////////////////////////////////////////////// + BYTES TO UINT + //////////////////////////////////////////////////////////////////////////*/ + + function testBytesToUint() external { + bytes memory maxUint = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + bytes memory two = hex"02"; + bytes memory millionEther = hex"d3c21bcecceda1000000"; + + assertEq(bytesToUint(maxUint), type(uint256).max); + assertEq(bytesToUint(two), 2); + assertEq(bytesToUint(millionEther), 1_000_000 ether); + } + + function testCannotConvertGT32Bytes() external { + bytes memory thirty3Bytes = hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; + vm.expectRevert("StdUtils bytesToUint(bytes): Bytes length exceeds 32."); + bytesToUint(thirty3Bytes); + } + + /*////////////////////////////////////////////////////////////////////////// + COMPUTE CREATE ADDRESS + //////////////////////////////////////////////////////////////////////////*/ + + function testComputeCreateAddress() external { + address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; + uint256 nonce = 14; + address createAddress = computeCreateAddress(deployer, nonce); + assertEq(createAddress, 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45); + } + + /*////////////////////////////////////////////////////////////////////////// + COMPUTE CREATE2 ADDRESS + //////////////////////////////////////////////////////////////////////////*/ + + function testComputeCreate2Address() external { + bytes32 salt = bytes32(uint256(31415)); + bytes32 initcodeHash = keccak256(abi.encode(0x6080)); + address deployer = 0x6C9FC64A53c1b71FB3f9Af64d1ae3A4931A5f4E9; + address create2Address = computeCreate2Address(salt, initcodeHash, deployer); + assertEq(create2Address, 0xB147a5d25748fda14b463EB04B111027C290f4d3); + } + + function testComputeCreate2AddressWithDefaultDeployer() external { + bytes32 salt = 0xc290c670fde54e5ef686f9132cbc8711e76a98f0333a438a92daa442c71403c0; + bytes32 initcodeHash = hashInitCode(hex"6080", ""); + assertEq(initcodeHash, 0x1a578b7a4b0b5755db6d121b4118d4bc68fe170dca840c59bc922f14175a76b0); + address create2Address = computeCreate2Address(salt, initcodeHash); + assertEq(create2Address, 0xc0ffEe2198a06235aAbFffe5Db0CacF1717f5Ac6); + } +} + +contract StdUtilsForkTest is Test { + /*////////////////////////////////////////////////////////////////////////// + GET TOKEN BALANCES + //////////////////////////////////////////////////////////////////////////*/ + + address internal SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE; + address internal SHIB_HOLDER_0 = 0x855F5981e831D83e6A4b4EBFCAdAa68D92333170; + address internal SHIB_HOLDER_1 = 0x8F509A90c2e47779cA408Fe00d7A72e359229AdA; + address internal SHIB_HOLDER_2 = 0x0e3bbc0D04fF62211F71f3e4C45d82ad76224385; + + address internal USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; + address internal USDC_HOLDER_0 = 0xDa9CE944a37d218c3302F6B82a094844C6ECEb17; + address internal USDC_HOLDER_1 = 0x3e67F4721E6d1c41a015f645eFa37BEd854fcf52; + + function setUp() public { + // All tests of the `getTokenBalances` method are fork tests using live contracts. + vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900}); + } + + function testCannotGetTokenBalances_NonTokenContract() external { + // We deploy a mock version so we can properly test the revert. + StdUtilsMock stdUtils = new StdUtilsMock(); + + // The UniswapV2Factory contract has neither a `balanceOf` function nor a fallback function, + // so the `balanceOf` call should revert. + address token = address(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f); + address[] memory addresses = new address[](1); + addresses[0] = USDC_HOLDER_0; + + vm.expectRevert("Multicall3: call failed"); + stdUtils.getTokenBalances_(token, addresses); + } + + function testCannotGetTokenBalances_EOA() external { + address eoa = vm.addr({privateKey: 1}); + address[] memory addresses = new address[](1); + addresses[0] = USDC_HOLDER_0; + vm.expectRevert("StdUtils getTokenBalances(address,address[]): Token address is not a contract."); + getTokenBalances(eoa, addresses); + } + + function testGetTokenBalances_Empty() external { + address[] memory addresses = new address[](0); + uint256[] memory balances = getTokenBalances(USDC, addresses); + assertEq(balances.length, 0); + } + + function testGetTokenBalances_USDC() external { + address[] memory addresses = new address[](2); + addresses[0] = USDC_HOLDER_0; + addresses[1] = USDC_HOLDER_1; + uint256[] memory balances = getTokenBalances(USDC, addresses); + assertEq(balances[0], 159_000_000_000_000); + assertEq(balances[1], 131_350_000_000_000); + } + + function testGetTokenBalances_SHIB() external { + address[] memory addresses = new address[](3); + addresses[0] = SHIB_HOLDER_0; + addresses[1] = SHIB_HOLDER_1; + addresses[2] = SHIB_HOLDER_2; + uint256[] memory balances = getTokenBalances(SHIB, addresses); + assertEq(balances[0], 3_323_256_285_484.42e18); + assertEq(balances[1], 1_271_702_771_149.99999928e18); + assertEq(balances[2], 606_357_106_247e18); + } +} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationScript.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationScript.sol new file mode 100644 index 000000000..e205cfff3 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationScript.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Script.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationScript is Script {} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol new file mode 100644 index 000000000..ce8e0e954 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Script.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationScriptBase is ScriptBase {} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationTest.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationTest.sol new file mode 100644 index 000000000..9beeafeb7 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationTest.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Test.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationTest is Test {} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol b/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol new file mode 100644 index 000000000..e993535bc --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/compilation/CompilationTestBase.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.2 <0.9.0; + +pragma experimental ABIEncoderV2; + +import "../../src/Test.sol"; + +// The purpose of this contract is to benchmark compilation time to avoid accidentally introducing +// a change that results in very long compilation times with via-ir. See https://github.com/foundry-rs/forge-std/issues/207 +contract CompilationTestBase is TestBase {} diff --git a/packages/wallet/wallet-contracts/lib/forge-std/test/fixtures/broadcast.log.json b/packages/wallet/wallet-contracts/lib/forge-std/test/fixtures/broadcast.log.json new file mode 100644 index 000000000..0a0200bca --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/forge-std/test/fixtures/broadcast.log.json @@ -0,0 +1,187 @@ +{ + "transactions": [ + { + "hash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "function": "multiple_arguments(uint256,address,uint256[]):(uint256)", + "arguments": ["1", "0000000000000000000000000000000000001337", "[3,4]"], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "gas": "0x73b9", + "value": "0x0", + "data": "0x23e99187000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000013370000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004", + "nonce": "0x3", + "accessList": [] + } + }, + { + "hash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "function": "inc():(uint256)", + "arguments": [], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "gas": "0xdcb2", + "value": "0x0", + "data": "0x371303c0", + "nonce": "0x4", + "accessList": [] + } + }, + { + "hash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "type": "CALL", + "contractName": "Test", + "contractAddress": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "function": "t(uint256):(uint256)", + "arguments": ["1"], + "tx": { + "type": "0x02", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "gas": "0x8599", + "value": "0x0", + "data": "0xafe29f710000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x5", + "accessList": [] + } + } + ], + "receipts": [ + { + "transactionHash": "0x481dc86e40bba90403c76f8e144aa9ff04c1da2164299d0298573835f0991181", + "transactionIndex": "0x0", + "blockHash": "0xef0730448490304e5403be0fa8f8ce64f118e9adcca60c07a2ae1ab921d748af", + "blockNumber": "0x1", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "cumulativeGasUsed": "0x13f3a", + "gasUsed": "0x13f3a", + "contractAddress": "0x5fbdb2315678afecb367f032d93f642f64180aa3", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x6a187183545b8a9e7f1790e847139379bf5622baff2cb43acf3f5c79470af782", + "transactionIndex": "0x0", + "blockHash": "0xf3acb96a90071640c2a8c067ae4e16aad87e634ea8d8bbbb5b352fba86ba0148", + "blockNumber": "0x2", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "cumulativeGasUsed": "0x45d80", + "gasUsed": "0x45d80", + "contractAddress": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x064ad173b4867bdef2fb60060bbdaf01735fbf10414541ea857772974e74ea9d", + "transactionIndex": "0x0", + "blockHash": "0x8373d02109d3ee06a0225f23da4c161c656ccc48fe0fcee931d325508ae73e58", + "blockNumber": "0x3", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "cumulativeGasUsed": "0x45feb", + "gasUsed": "0x45feb", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xc6006863c267735a11476b7f15b15bc718e117e2da114a2be815dd651e1a509f", + "transactionIndex": "0x0", + "blockHash": "0x16712fae5c0e18f75045f84363fb6b4d9a9fe25e660c4ce286833a533c97f629", + "blockNumber": "0x4", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "cumulativeGasUsed": "0x5905", + "gasUsed": "0x5905", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xedf2b38d8d896519a947a1acf720f859bb35c0c5ecb8dd7511995b67b9853298", + "transactionIndex": "0x0", + "blockHash": "0x156b88c3eb9a1244ba00a1834f3f70de735b39e3e59006dd03af4fe7d5480c11", + "blockNumber": "0x5", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", + "cumulativeGasUsed": "0xa9c4", + "gasUsed": "0xa9c4", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "transactionIndex": "0x0", + "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", + "blockNumber": "0x6", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "cumulativeGasUsed": "0x66c5", + "gasUsed": "0x66c5", + "contractAddress": null, + "logs": [ + { + "address": "0x7c6b4bbe207d642d98d5c537142d85209e585087", + "topics": [ + "0x0b2e13ff20ac7b474198655583edf70dedd2c1dc980e329c4fbb2fc0748b796b" + ], + "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046865726500000000000000000000000000000000000000000000000000000000", + "blockHash": "0xcf61faca67dbb2c28952b0b8a379e53b1505ae0821e84779679390cb8571cadb", + "blockNumber": "0x6", + "transactionHash": "0xa57e8e3981a6c861442e46c9471bd19cb3e21f9a8a6c63a72e7b5c47c6675a7c", + "transactionIndex": "0x1", + "logIndex": "0x0", + "transactionLogIndex": "0x0", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000800000000000000000010000000000000000000000000000180000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100", + "effectiveGasPrice": "0xee6b2800" + }, + { + "transactionHash": "0x11fbb10230c168ca1e36a7e5c69a6dbcd04fd9e64ede39d10a83e36ee8065c16", + "transactionIndex": "0x0", + "blockHash": "0xf1e0ed2eda4e923626ec74621006ed50b3fc27580dc7b4cf68a07ca77420e29c", + "blockNumber": "0x7", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x0000000000000000000000000000000000001337", + "cumulativeGasUsed": "0x5208", + "gasUsed": "0x5208", + "contractAddress": null, + "logs": [], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "effectiveGasPrice": "0xee6b2800" + } + ], + "libraries": [ + "src/Broadcast.t.sol:F:0x5fbdb2315678afecb367f032d93f642f64180aa3" + ], + "pending": [], + "path": "broadcast/Broadcast.t.sol/31337/run-latest.json", + "returns": {}, + "timestamp": 1655140035 +} diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/.git-blame-ignore-revs b/packages/wallet/wallet-contracts/lib/foundry-huff/.git-blame-ignore-revs new file mode 100644 index 000000000..18678bfe4 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# run forge fmt +a41faeb366790c4bda74fef8b70ecda3c285641d diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/.github/workflows/tests.yaml b/packages/wallet/wallet-contracts/lib/foundry-huff/.github/workflows/tests.yaml new file mode 100644 index 000000000..f92f50825 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/.github/workflows/tests.yaml @@ -0,0 +1,31 @@ +name: Tests + +on: [push] + +jobs: + tests: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Install Huff + uses: huff-language/huff-toolchain@v2 + with: + version: nightly + + - name: Print the Bytecode for fun + run: huffc -b src/test/contracts/Number.huff + + - name: Print the Scripts + run: ls -lsa lib/foundry-huff/scripts/ + + - name: Run Tests + run: forge test -vvv diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/.gitmodules b/packages/wallet/wallet-contracts/lib/foundry-huff/.gitmodules new file mode 100644 index 000000000..7d10038b4 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/.gitmodules @@ -0,0 +1,6 @@ +[submodule "lib/solidity-stringutils"] + path = lib/solidity-stringutils + url = https://github.com/Arachnid/solidity-stringutils +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/LICENSE b/packages/wallet/wallet-contracts/lib/foundry-huff/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/README.md b/packages/wallet/wallet-contracts/lib/foundry-huff/README.md new file mode 100644 index 000000000..7a461b911 --- /dev/null +++ b/packages/wallet/wallet-contracts/lib/foundry-huff/README.md @@ -0,0 +1,167 @@ + + + +# Foundry x Huff + +[![ci](https://github.com/huff-language/huff-rs/actions/workflows/ci.yaml/badge.svg)](https://github.com/huff-language/huff-rs/actions/workflows/ci.yaml) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) ![Discord](https://img.shields.io/discord/980519274600882306) + +A [foundry](https://github.com/foundry-rs/foundry) library for working with [huff](https://github.com/huff-language/huff-rs) contracts. Take a look at our [project template](https://github.com/huff-language/huff-project-template) to see an example project that uses this library. + + +## Installing + +First, install the [huff compiler](https://github.com/huff-language/huff-rs) by running: +``` +curl -L get.huff.sh | bash +``` + +Then, install this library with [forge](https://github.com/foundry-rs/foundry): +``` +forge install huff-language/foundry-huff +``` + + +## Usage + +The HuffDeployer is a Solidity library that takes a filename and deploys the corresponding Huff contract, returning the address that the bytecode was deployed to. To use it, simply import it into your file by doing: + +```js +import {HuffDeployer} from "foundry-huff/HuffDeployer.sol"; +``` + +To compile contracts, you can use `HuffDeployer.deploy(string fileName)`, which takes in a single string representing the filename's path relative to the `src` directory. Note that the file ending, i.e. `.huff`, must be omitted. +Here is an example deployment (where the contract is located in [`src/test/contracts/Number.huff`](./src/test/contracts/Number.huff)): + +```solidity +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +import {HuffDeployer} from "foundry-huff/HuffDeployer"; + +interface Number { + function setNumber(uint256) external; + function getNumber() external returns (uint256); +} + +contract HuffDeployerExample { + function deploy() public { + // Deploy a new instance of src/test/contracts/Number.huff + address addr = HuffDeployer.deploy("test/contracts/Number"); + + // To call a function on the deployed contract, create an interface and wrap the address like so + Number number = Number(addr); + } +} +``` + +To deploy a Huff contract with constructor arguments, you can _chain_ commands onto the HuffDeployer. + +For example, to deploy the contract [`src/test/contracts/Constructor.huff`](src/test/contracts/Constructor.huff) with arguments `(uint256(0x420), uint256(0x420))`, you are encouraged to follow the logic defined in the `deploy` function of the `HuffDeployerArguments` contract below. + +```solidity +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +import {HuffDeployer} from "foundry-huff/HuffDeployer"; + +interface Constructor { + function getArgOne() external returns (address); + function getArgTwo() external returns (uint256); +} + +contract HuffDeployerArguments { + function deploy() public { + // Deploy the contract with arguments + address addr = HuffDeployer + .config() + .with_args(bytes.concat(abi.encode(uint256(0x420)), abi.encode(uint256(0x420)))) + .deploy("test/contracts/Constructor"); + + // To call a function on the deployed contract, create an interface and wrap the address + Constructor construct = Constructor(addr); + + // Validate we deployed the Constructor with the correct arguments + assert(construct.getArgOne() == address(0x420)); + assert(construct.getArgTwo() == uint256(0x420)); + } + + function depreciated_deploy() public { + address addr = HuffDeployer.deploy_with_args( + "test/contracts/Constructor", + bytes.concat(abi.encode(uint256(0x420)), abi.encode(uint256(0x420))) + ); + + // ... + } +} +``` + +HuffDeployer also enables you to instantiate contracts, from the test file, even if they have _no constructor macro_! + +This is possible by using [Foundry](https://github.com/foundry-rs/foundry)'s [ffi](https://book.getfoundry.sh/cheatcodes/ffi.html) cheatcode. + +_NOTE: It is highly recommended that you read the foundry book, or at least familiarize yourself with foundry, before using this library to avoid easily susceptible footguns._ + +Let's use the huff contract [`src/test/contracts/NoConstructor.huff`](./src/test/contracts/NoConstructor.huff), which has no defined constructor macro. The inline-instantiation defined in the `deploy` function of the `HuffDeployerCode` contract below is recommended. + +```solidity +// SPDX-License-Identifier: Apache-2.0 +pragma solidity >=0.7.0 <0.9.0; + +import {HuffDeployer} from "foundry-huff/HuffDeployer"; + +interface Constructor { + function getArgOne() external returns (address); + function getArgTwo() external returns (uint256); +} + +contract HuffDeployerCode { + + function deploy() public { + // Define a new constructor macro as a string + string memory constructor_macro = "#define macro CONSTRUCTOR() = takes(0) returns (0) {" + " // Copy the first argument into memory \n" + " 0x20 // [size] - byte size to copy \n" + " 0x40 codesize sub // [offset, size] - offset in the code to copy from\n " + " 0x00 // [mem, offset, size] - offset in memory to copy to \n" + " codecopy // [] \n" + " // Store the first argument in storage\n" + " 0x00 mload // [arg] \n" + " [CONSTRUCTOR_ARG_ONE] // [CONSTRUCTOR_ARG_ONE, arg] \n" + " sstore // [] \n" + " // Copy the second argument into memory \n" + " 0x20 // [size] - byte size to copy \n" + " 0x20 codesize sub // [offset, size] - offset in the code to copy from \n" + " 0x00 // [mem, offset, size] - offset in memory to copy to \n" + " codecopy // [] \n" + " // Store the second argument in storage \n" + " 0x00 mload // [arg] \n" + " [CONSTRUCTOR_ARG_TWO] // [CONSTRUCTOR_ARG_TWO, arg] \n" + " sstore // [] \n" + "}"; + + // Deploy the contract with arguments + address addr = HuffDeployer + .config() + .with_args(bytes.concat(abi.encode(uint256(0x420)), abi.encode(uint256(0x420)))) + .with_code(constructor_macro) + .deploy("test/contracts/NoConstructor"); + + // To call a function on the deployed contract, create an interface and wrap the address + Constructor construct = Constructor(addr); + + // Validate we deployed the Constructor with the correct arguments + assert(construct.getArgOne() == address(0x420)); + assert(construct.getArgTwo() == uint256(0x420)); + } + + function depreciated_deploy_with_code() public { + address addr = HuffDeployer.deploy_with_code( + "test/contracts/Constructor", + constructor_macro + ); + + // ... + } +} +``` diff --git a/packages/wallet/wallet-contracts/lib/foundry-huff/assets/Group 1.png b/packages/wallet/wallet-contracts/lib/foundry-huff/assets/Group 1.png new file mode 100644 index 0000000000000000000000000000000000000000..15a5d9ef6c54d7bd801219c1daa7f613415a0c55 GIT binary patch literal 23776 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

fSb7aY0!eI4xZMQ^02g7~W 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

BAx9J53ML#~owjT|ml(Op0&(arVN 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 z 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ⅆ5xQ;J1Pw)BK@rjw08 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